{"_id":"@datawisehouse.com/hunw","_rev":"5-c71f087616d18d1c6b3a11ae60a3de48","name":"@datawisehouse.com/hunw","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@datawisehouse.com/hunw","version":"0.1.0","keywords":["cors-proxy","llm-proxy","anthropic","openai","streaming"],"author":{"name":"ray062"},"license":"MIT","_id":"@datawisehouse.com/hunw@0.1.0","maintainers":[{"name":"datawisehouse.com","email":"noreply@datawisehouse.com"}],"bin":{"hunw":"dist/index.js"},"dist":{"shasum":"182494776701db9fc375a0a9dd4724991f39d2f8","tarball":"https://registry.npmjs.org/@datawisehouse.com/hunw/-/hunw-0.1.0.tgz","fileCount":56,"integrity":"sha512-7F4BHkfmNkvKgOSV7/dEY5OXkoSmh+0pnpvKu4h91r9/Ic9Jtp+8AiVT97kj8ONkbJ07A2aiPZVWU4d3YaLW6Q==","signatures":[{"sig":"MEYCIQDLouj8FbSyo4KJoyMw7uXpk5czIGU4t0v4MFR8yddYqgIhAOmcVavFFGwX+B2C13W975ff+MMJH7Hz0I7hhG8W5g/r","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114069},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"add43531383793bf27250e8d67096154d04ee889","scripts":{"dev":"tsc && node dist/index.js start","init":"node dist/index.js init","test":"vitest --run","build":"tsc","start":"node dist/index.js start","test:clean":"pkill -f vitest || true","test:watch":"vitest --watch","test:coverage":"vitest --coverage --run"},"_npmUser":{"name":"datawisehouse.com","email":"noreply@datawisehouse.com"},"_npmVersion":"10.9.7","description":"CORS proxy server for Mergus - proxies LLM API requests with streaming support","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^4.1.2","express":"^4.18.2","winston":"^3.11.0","chokidar":"^3.5.3","commander":"^11.1.0","node-fetch":"^2.7.0","body-parser":"^1.20.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.1.0","supertest":"^7.2.2","typescript":"^5.3.3","@types/node":"^20.10.0","@types/express":"^4.17.21","@types/winston":"^2.4.4","@types/supertest":"^7.2.0","@types/node-fetch":"^2.6.4","@types/body-parser":"^1.19.5","@vitest/coverage-v8":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hunw_0.1.0_1775226990409_0.5651828662701988","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@datawisehouse.com/hunw","version":"0.1.1","keywords":["cors-proxy","llm-proxy","anthropic","openai","streaming"],"author":{"name":"ray062"},"license":"MIT","_id":"@datawisehouse.com/hunw@0.1.1","maintainers":[{"name":"datawisehouse.com","email":"noreply@datawisehouse.com"}],"bin":{"hunw":"dist/index.js"},"dist":{"shasum":"946cfe735ceea20c685a5b53f53c00876b6bcb71","tarball":"https://registry.npmjs.org/@datawisehouse.com/hunw/-/hunw-0.1.1.tgz","fileCount":56,"integrity":"sha512-GxFT/NWn9h5swC3s0O3H0Eto+ASLlzHZULjCkiWZallja+neEfU4T0vI1yn4uA1Sb1sEU2BAOggkBp11vjDXkQ==","signatures":[{"sig":"MEQCIHSudu+TW8bzmVqGekSPcC+AdAY4Jsy1u/oU6cicOlMWAiBRx1WHyr1Sf9pfH20Q5wMNYqzivvzluzO0KjuhMyuB+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116953},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"ae11d3647cea628d48566a8c72a056a2d64ce08e","scripts":{"dev":"tsc && node dist/index.js start","init":"node dist/index.js init","test":"vitest --run","build":"tsc","start":"node dist/index.js start","test:clean":"pkill -f vitest || true","test:watch":"vitest --watch","test:coverage":"vitest --coverage --run"},"_npmUser":{"name":"datawisehouse.com","email":"noreply@datawisehouse.com"},"_npmVersion":"10.9.7","description":"CORS proxy server for Mergus - proxies LLM API requests with streaming support","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^4.1.2","express":"^4.18.2","winston":"^3.11.0","chokidar":"^3.5.3","commander":"^11.1.0","node-fetch":"^2.7.0","body-parser":"^1.20.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.1.0","supertest":"^7.2.2","typescript":"^5.3.3","@types/node":"^20.10.0","@types/express":"^4.17.21","@types/winston":"^2.4.4","@types/supertest":"^7.2.0","@types/node-fetch":"^2.6.4","@types/body-parser":"^1.19.5","@vitest/coverage-v8":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hunw_0.1.1_1775252097273_0.794977605030319","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@datawisehouse.com/hunw","version":"0.1.2","keywords":["cors-proxy","llm-proxy","anthropic","openai","streaming"],"author":{"name":"ray062"},"license":"MIT","_id":"@datawisehouse.com/hunw@0.1.2","maintainers":[{"name":"datawisehouse.com","email":"noreply@datawisehouse.com"}],"bin":{"hunw":"dist/index.js"},"dist":{"shasum":"a4950c00685d8b60fdb2580fff09c444bc018ee4","tarball":"https://registry.npmjs.org/@datawisehouse.com/hunw/-/hunw-0.1.2.tgz","fileCount":60,"integrity":"sha512-WkUYFkQk5wqfJLpE0eHLokeJFXPpe9lBp6+ImXe6o117ygP9mBCcJx25L+2DiVF47XNe7VxUszZcHVbfij06uw==","signatures":[{"sig":"MEUCIQCazJ2xPV/q4EoGWXrM4Ih2/3Ad/J4t2nqewAtLuYuNzAIgcfA0FEzKZwxGPQJkhYC6NggGGPEZdBio1PWnsAHQLZI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119286},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"c4aaec218449af284f40909babaa6a930ae2e31c","scripts":{"dev":"tsc && node dist/index.js start","init":"node dist/index.js init","test":"vitest --run","build":"tsc","start":"node dist/index.js start","version":"npm run update-version && git add .","test:clean":"pkill -f vitest || true","test:watch":"vitest --watch","test:coverage":"vitest --coverage --run","update-version":"node scripts/update-version.js"},"_npmUser":{"name":"datawisehouse.com","email":"noreply@datawisehouse.com"},"_npmVersion":"10.9.7","description":"CORS proxy server for Mergus - proxies LLM API requests with streaming support","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^4.1.2","express":"^4.18.2","winston":"^3.11.0","chokidar":"^3.5.3","commander":"^11.1.0","node-fetch":"^2.7.0","body-parser":"^1.20.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.1.0","supertest":"^7.2.2","typescript":"^5.3.3","@types/node":"^20.10.0","@types/express":"^4.17.21","@types/winston":"^2.4.4","@types/supertest":"^7.2.0","@types/node-fetch":"^2.6.4","@types/body-parser":"^1.19.5","@vitest/coverage-v8":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hunw_0.1.2_1775253780355_0.5985808972394289","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@datawisehouse.com/hunw","version":"0.1.3","keywords":["cors-proxy","llm-proxy","anthropic","openai","streaming"],"author":{"name":"ray062"},"license":"MIT","_id":"@datawisehouse.com/hunw@0.1.3","maintainers":[{"name":"datawisehouse.com","email":"noreply@datawisehouse.com"}],"bin":{"hunw":"dist/index.js"},"dist":{"shasum":"e9ef031994c4dc960ca9851b84ad495757407989","tarball":"https://registry.npmjs.org/@datawisehouse.com/hunw/-/hunw-0.1.3.tgz","fileCount":61,"integrity":"sha512-VwAhviKA/Ut6P+77uIn/PW2xXhs6+tpF1XzizqJ9tYxRmO+3k+DZDrHqqx0IkrGcAJl5bpdn3gHcaahhpSRhYg==","signatures":[{"sig":"MEUCIQD/ezy+/l2TC4xnB8PhkKOuipOld1CY9HDLWQFZ9K4ngQIgZNgWxPHHx5BjW5ymm7XhQHlLgnaKRYRvvXdzoXzIOi4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136742},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"8dc20ea973693626e32b8700980b6412f40f4125","scripts":{"dev":"tsc && node dist/index.js start","init":"node dist/index.js init","test":"vitest --run","build":"tsc","start":"node dist/index.js start","version":"npm run update-version && git add .","test:clean":"pkill -f vitest || true","test:watch":"vitest --watch","test:coverage":"vitest --coverage --run","update-version":"node scripts/update-version.js"},"_npmUser":{"name":"datawisehouse.com","email":"noreply@datawisehouse.com"},"_npmVersion":"11.7.0","description":"CORS proxy server for Mergus - proxies LLM API requests with streaming support","directories":{},"_nodeVersion":"22.14.0","dependencies":{"chalk":"^4.1.2","express":"^4.18.2","winston":"^3.11.0","chokidar":"^3.5.3","commander":"^11.1.0","node-fetch":"^2.7.0","body-parser":"^1.20.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.1.0","supertest":"^7.2.2","typescript":"^5.3.3","@types/node":"^20.10.0","@types/express":"^4.17.21","@types/winston":"^2.4.4","@types/supertest":"^7.2.0","@types/node-fetch":"^2.6.4","@types/body-parser":"^1.19.5","@vitest/coverage-v8":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hunw_0.1.3_1775342947101_0.4890799897095637","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@datawisehouse.com/hunw","version":"0.1.4","description":"CORS proxy server for Mergus - proxies LLM API requests with streaming support","main":"dist/index.js","bin":{"hunw":"dist/index.js"},"scripts":{"build":"tsc","start":"node dist/index.js start","init":"node dist/index.js init","dev":"tsc && node dist/index.js start","test":"vitest --run","test:coverage":"vitest --coverage --run","test:watch":"vitest --watch","test:clean":"pkill -f vitest || true","update-version":"node scripts/update-version.js","version":"npm run update-version && git add ."},"keywords":["cors-proxy","llm-proxy","anthropic","openai","streaming"],"author":{"name":"ray062"},"license":"MIT","dependencies":{"body-parser":"^1.20.2","chalk":"^4.1.2","chokidar":"^3.5.3","commander":"^11.1.0","express":"^4.18.2","node-fetch":"^2.7.0","winston":"^3.11.0"},"devDependencies":{"@types/body-parser":"^1.19.5","@types/express":"^4.17.21","@types/node":"^20.10.0","@types/node-fetch":"^2.6.4","@types/supertest":"^7.2.0","@types/winston":"^2.4.4","@vitest/coverage-v8":"^1.1.0","supertest":"^7.2.2","typescript":"^5.3.3","vitest":"^1.1.0"},"gitHead":"55a3390eb3dbf49be927c2753a90c8d37cefda9d","types":"./dist/index.d.ts","_id":"@datawisehouse.com/hunw@0.1.4","_nodeVersion":"22.14.0","_npmVersion":"11.7.0","dist":{"integrity":"sha512-M8glPpiqZzx5ejRU5B+QoqthOh3yn5RisXuF1i81Kwvghqbg1bZunXm0BsXMrXj6To7FppQXTQv7aPrw5xm0Kw==","shasum":"0b29af6639a8c9e9cc6e334aac0fe48ca6b1cc5a","tarball":"https://registry.npmjs.org/@datawisehouse.com/hunw/-/hunw-0.1.4.tgz","fileCount":61,"unpackedSize":138953,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCheQ4LsGokYMBMPpHDrngeF8oU1P/O+Llm9ilk6KgMPwIhANG5LsuX9I2W092vf8bybq3Fg71oCEFohyrQdKgp+6aP"}]},"_npmUser":{"name":"datawisehouse.com","email":"noreply@datawisehouse.com"},"directories":{},"maintainers":[{"name":"datawisehouse.com","email":"noreply@datawisehouse.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/hunw_0.1.4_1775554509876_0.6891507970077644"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-03T14:36:30.321Z","modified":"2026-04-07T09:35:10.164Z","0.1.0":"2026-04-03T14:36:30.561Z","0.1.1":"2026-04-03T21:34:57.425Z","0.1.2":"2026-04-03T22:03:00.527Z","0.1.3":"2026-04-04T22:49:07.238Z","0.1.4":"2026-04-07T09:35:10.042Z"},"author":{"name":"ray062"},"license":"MIT","keywords":["cors-proxy","llm-proxy","anthropic","openai","streaming"],"description":"CORS proxy server for Mergus - proxies LLM API requests with streaming support","maintainers":[{"name":"datawisehouse.com","email":"noreply@datawisehouse.com"}],"readme":"# Hunw - Transparent CORS Proxy\n\nA transparent CORS proxy server that enables browser-based applications to make any HTTP/HTTPS requests without CORS restrictions, with full streaming support.\n\n## Features\n\n- **Transparent Proxy**: Proxy any HTTP/HTTPS request unchanged\n- **CORS Support**: Handle CORS headers for browser clients\n- **SSE Streaming**: Full support for Server-Sent Events streaming\n- **Web Fetching**: Fetch web content with proper headers\n- **API Key Management**: Secure encrypted storage for API keys (deprecated)\n- **Configuration Management**: JSON-based config with hot-reload\n- **Logging**: Console output and file logging (JSON Lines format)\n- **Usage Statistics**: Track requests, errors, and uptime\n- **CLI Interface**: Easy command-line management\n- **Web API**: RESTful API for integration\n\n## Installation\n\n### From Source\n\n```bash\ncd /home/claw100/repo/hunw\nnpm install\nnpm run build\n```\n\n### Global Installation\n\n```bash\nnpm install -g @datawisehouse.com/hunw\nhunw init\nhunw start\n```\n\n## Quick Start\n\n```bash\n# 1. Initialize configuration\nnpm run build\nnode dist/index.js init\n\n# 2. Start server\nnode dist/index.js start\n```\n\nServer will start on `http://localhost:7749`\n\n## CLI Commands\n\n### Initialization\n\n```bash\nhunw init                    # Initialize configuration\n```\n\n### Server Management\n\n```bash\nhunw start                    # Start server\nhunw status                   # Show server status\nhunw stats                    # Show usage statistics\n```\n\n### Configuration Management\n\n```bash\nhunw config set <key> <value>        # Set configuration value\nhunw config get <key>                # Get configuration value\nhunw config list                     # List all configuration\n\n# Examples:\nhunw config set server.port 8080\nhunw config get logging.level\nhunw config set webFetching.enabled true\n```\n\n### API Key Management (Deprecated)\n\n```bash\nhunw config add-key <provider> <apiKey>    # Add API key\nhunw config remove-key <provider>          # Remove API key\nhunw config list-keys                     # List all API keys\n\n# Examples:\nhunw config add-key anthropic sk-ant-your-key-here\nhunw config list-keys\n```\n\n**Note:** API key management is deprecated. Use transparent proxying and send API keys directly in request headers.\n\n## Web API\n\n### Transparent Proxy\n\nProxy any HTTP/HTTPS request with CORS support.\n\n**Endpoint:** `GET|POST|PUT|DELETE|PATCH /api/proxy`\n\n**GET Request:**\n```bash\ncurl \"http://localhost:7749/api/proxy?url=https://api.example.com/data\"\n```\n\n**POST Request:**\n```bash\ncurl -X POST http://localhost:7749/api/proxy \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"url\": \"https://api.example.com/data\",\n    \"method\": \"POST\",\n    \"headers\": {\n      \"Authorization\": \"Bearer token123\"\n    },\n    \"body\": {\n      \"key\": \"value\"\n    }\n  }'\n```\n\n**Response:** Transparent (forwarded from upstream)\n- Status code: Upstream status\n- Headers: Upstream headers + CORS headers\n- Body: Upstream body (no transformation)\n\n**Streaming:** SSE streams are piped through transparently\n\n### Web Fetching\n\nFetch web content with CORS support (transparent response).\n\n**Endpoint:** `POST /api/fetch`\n\n**Request:**\n```bash\ncurl -X POST http://localhost:7749/api/fetch \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"url\": \"https://example.com\",\n    \"method\": \"GET\",\n    \"headers\": {\n      \"Accept\": \"text/html\"\n    }\n  }'\n```\n\n**Response:** Transparent (forwarded from upstream)\n- Status code: Upstream status\n- Headers: Upstream headers\n- Body: Upstream body (string, no JSON parsing)\n\n### Configuration Management\n\n**Get Configuration:** `GET /api/config`\n\n**Update Configuration:** `PATCH /api/config`\n\n**Request:**\n```json\n{\n  \"server\": {\n    \"port\": 8080\n  },\n  \"logging\": {\n    \"level\": \"debug\"\n  }\n}\n```\n\n### Server Status & Statistics\n\n**Server Status:** `GET /api/status`\n\n**Response:**\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"status\": \"running\",\n    \"server\": {\n      \"port\": 7749,\n      \"host\": \"localhost\"\n    },\n    \"uptime\": 123.45\n  }\n}\n```\n\n**Statistics:** `GET /api/stats`\n\n**Response:**\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"requests\": {\n      \"total\": 42,\n      \"byProvider\": {\n        \"web\": 42\n      }\n    },\n    \"errors\": {\n      \"total\": 1,\n      \"byType\": {\n        \"INVALID_URL\": 1\n      }\n    },\n    \"uptime\": 123456\n  }\n}\n```\n\n## Configuration\n\nConfiguration is stored in `~/.hunw/config.json`\n\n**Default Configuration:**\n```json\n{\n  \"server\": {\n    \"port\": 7749,\n    \"host\": \"localhost\"\n  },\n  \"logging\": {\n    \"level\": \"info\",\n    \"fileEnabled\": true,\n    \"fileDir\": \"~/.hunw/logs\"\n  },\n  \"webFetching\": {\n    \"enabled\": true,\n    \"timeout\": 30000\n  }\n}\n```\n\n### Environment Variables\n\n- `HUNW_PORT`: Server port (default: 7749)\n- `HUNW_HOST`: Server host (default: localhost)\n- `HUNW_LOG_LEVEL`: Log level (debug, info, warn, error)\n\n## API Key Storage (Deprecated)\n\nAPI keys are encrypted using AES-256-GCM and stored in `~/.hunw/api-keys.enc`\n\nEncryption uses:\n- Algorithm: AES-256-GCM\n- Key derivation: PBKDF2 with 100,000 iterations\n- Random salt and IV for each encryption\n\n**Note:** This feature is deprecated. Use transparent proxying and send API keys directly in request headers.\n\n## Logging\n\nLogs are written to `~/.hunw/logs/hunw.log.jsonl` in JSON Lines format:\n\n```json\n{\"timestamp\":\"2026-04-01T16:00:00.000Z\",\"level\":\"info\",\"message\":\"Server started\"}\n{\"timestamp\":\"2026-04-01T16:00:01.000Z\",\"level\":\"info\",\"message\":\"Proxying GET request to https://example.com\",\"meta\":{\"path\":\"/api/proxy\"}}\n```\n\n**Log Rotation:**\n- Size-based: 100MB max file size\n- Retention: Last 7 log files\n\n## Testing\n\nThe project uses Vitest with v8 coverage provider for comprehensive test coverage (75%+).\n\n```bash\n# Run all tests (exits after completion)\nnpm test\n\n# Run tests with coverage report\nnpm run test:coverage\n\n# Run tests in watch mode (for development)\nnpm run test:watch\n\n# Clean up any stuck vitest processes\nnpm run test:clean\n```\n\n### Test Configuration\n\n- Single-threaded execution (`singleFork: true`) prevents concurrency issues\n- Watch mode disabled by default to prevent hanging processes\n- 10-second timeout per test prevents infinite loops\n- Coverage provider: v8 with text, JSON, and HTML reports\n\n### Preventing CPU Issues\n\nThe test configuration is optimized to prevent vitest processes from consuming excessive CPU:\n\n- `--run` flag ensures tests exit after completion\n- Watch mode is explicitly disabled\n- Single fork execution prevents process multiplication\n- Coverage reports are cleaned on rerun\n\n## Architecture\n\n```\n┌─────────────────────────────────────────┐\n│         Hunw Server (Express)         │\n├─────────────────────────────────────────┤\n│  Web API (/api/*)                  │\n│  ├─ Transparent Proxy                │\n│  ├─ Web Fetching                   │\n│  ├─ Config Management               │\n│  ├─ API Key Management (deprecated)   │\n│  └─ Status & Statistics             │\n├─────────────────────────────────────────┤\n│  Services                          │\n│  ├─ Proxy Service                  │\n│  ├─ Fetch Service                  │\n│  └─ Stats Service                  │\n├─────────────────────────────────────────┤\n│  Persistence                       │\n│  ├─ ~/.hunw/config.json          │\n│  ├─ ~/.hunw/api-keys.enc         │\n│  └─ ~/.hunw/logs/*.jsonl         │\n└─────────────────────────────────────────┘\n```\n\n## Usage Examples\n\n### Example 1: Simple GET Request\n\n```javascript\nconst response = await fetch('http://localhost:7749/api/proxy?url=https://api.example.com/data');\n\nconsole.log('Status:', response.status);\nconst data = await response.json();\nconsole.log('Data:', data);\n```\n\n### Example 2: POST Request with Headers\n\n```javascript\nconst response = await fetch('http://localhost:7749/api/proxy', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({\n    url: 'https://api.example.com/data',\n    method: 'POST',\n    headers: {\n      'Authorization': 'Bearer token123'\n    },\n    body: {\n      key: 'value'\n    }\n  })\n});\n\nconst data = await response.json();\nconsole.log('Response:', data);\n```\n\n### Example 3: Streaming Response\n\n```javascript\nconst response = await fetch('http://localhost:7749/api/proxy', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({\n    url: 'https://api.example.com/stream',\n    method: 'GET',\n    headers: {\n      'Accept': 'text/event-stream'\n    }\n  })\n});\n\nconst reader = response.body.getReader();\nconst decoder = new TextDecoder();\n\nwhile (true) {\n  const { done, value } = await reader.read();\n  if (done) break;\n\n  const chunk = decoder.decode(value);\n  console.log('Stream chunk:', chunk);\n}\n```\n\n### Example 4: Web Fetching\n\n```javascript\nconst response = await fetch('http://localhost:7749/api/fetch', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({\n    url: 'https://example.com',\n    method: 'GET'\n  })\n});\n\nconsole.log('Status:', response.status);\nconsole.log('Content:', await response.text());\n```\n\n## Limitations (MVP/POC)\n\n- No rate limiting\n- No authentication\n- Basic error handling\n- Stats in-memory only (no persistence)\n- API key management deprecated\n\n## Future Enhancements\n\n- Rate limiting per client/domain\n- Enhanced error handling\n- Stats persistence\n- Metrics export (Prometheus)\n- Authentication support\n\n## Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Build TypeScript\nnpm run build\n\n# Run in development\nnpm run dev\n\n# Run tests\nnpm test\n\n# Run tests with coverage\nnpm run test:coverage\n```\n\n## Security\n\n- API keys encrypted at rest (AES-256-GCM) (deprecated feature)\n- Config files restricted permissions (0600)\n- Keys file read-only (0400)\n- No API key logging (redacted in outputs)\n- Basic URL validation\n\n## License\n\nMIT\n\n## Author\n\nRay <ray062>\n\n## Status\n\n🚧 POC/MVP - Work in progress\n","readmeFilename":"README.md"}