{"_id":"routiform","_rev":"99-83f8f85c7ea28a172990cbaf54ee82a0","name":"routiform","dist-tags":{"latest":"6.6.0"},"versions":{"3.6.0":{"name":"routiform","version":"3.6.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.6.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"0bb1e0298e5ee817bda7209e2d9be8d3cb31c9af","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.6.0.tgz","fileCount":6361,"integrity":"sha512-RY0Bs2lBb8rtPBkrx8F1R8U7oF5N01s1lhMFeZ5HBxcnYrw4FHNZv6qrGIJJelTZ6ai/6IYDVyGjXdkP/DW4mA==","signatures":[{"sig":"MEQCIA4gtVVD7Scs3eu2PK4JukQqOnJiePwstNXSRxyhtrSxAiALEtP9zdwkZoFY9qA4tkPxvto2AHa0dmm2dHwbA25viw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183595590},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"b2fffede31da1927d655d1b7ff46a4259355493d","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:20128 && cd electron && npm run dev\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.6.0_1775549667461_0.06878080506319018","host":"s3://npm-registry-packages-npm-production"}},"3.6.2":{"name":"routiform","version":"3.6.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.6.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"29520101921b6b5dc44d1fc9803bc7fcbe7f0f2c","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.6.2.tgz","fileCount":6361,"integrity":"sha512-n7XnvSnO8957Q9gG5tKiilK1Z1cnaCtnhH9Du2sdMQTjWh+5QF4qW6OGTBzvIvdTPC+pXd4cPlzq8iKDvhMdaA==","signatures":[{"sig":"MEQCIEDwP6XA3Q601eVZCtoE8urbDgKB1yiAgkZrFwJVdv4MAiAnp8B96ejyrr2WvFQSZS5J8Z+KsFp5uMThE3vJJ/mqow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183595870},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"7b19ac82ef40841c70dadfc5798b4e0eb0560675","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:20128 && cd electron && npm run dev\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.6.2_1775550549959_0.18387994899713922","host":"s3://npm-registry-packages-npm-production"}},"3.6.3":{"name":"routiform","version":"3.6.3","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.6.3","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"65f615febf055ee1255af73721305530014ff402","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.6.3.tgz","fileCount":6361,"integrity":"sha512-Tb6bGNQdWXunRmz/U8Gp8lgS3JGSIThg8tvuwQlosMENuPfV7gXiJvQJVqoIpbtZsVmtZcn2SvPeTJ9UtW1n0g==","signatures":[{"sig":"MEUCIQDHEN3Rjz/4DKIEaRHsL5HeKFG1F/DA0podOxZqlrSHqgIgM981N1Qd4WqpVU7A1KMHrctA+mgyiS1528f8DZ9h98I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183595769},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"fcd4272fab735c1509a0b8d9057e80564f42d7f5","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:20128 && cd electron && npm run dev\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.6.3_1775551663947_0.775949113943216","host":"s3://npm-registry-packages-npm-production"}},"3.6.4":{"name":"routiform","version":"3.6.4","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.6.4","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"4f5174055d38d430915e772ba4609d3bf1def996","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.6.4.tgz","fileCount":6365,"integrity":"sha512-GigMFt8HPH/XpL9hf3TOFdTEbCGKk558K2lBAmjUz+vOauQIEO/1+hx/8YtRltQ00rEfKFlG0i64Q16vsGMTVg==","signatures":[{"sig":"MEUCIFtBkmHRzdeEfEXIcHDHJwyOb0z1U8G4QTTsAhxyVY18AiEAsILWkra4xXvE1i3X5RS0tPCm9KIQcHw4qs2WRCIo1nk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183646911},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"d9fb7c0e9a0ac0a828a2cef2b11094e9c735102d","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:20128 && cd electron && npm run dev\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.6.4_1775564380996_0.19527398223192205","host":"s3://npm-registry-packages-npm-production"}},"3.7.0":{"name":"routiform","version":"3.7.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.7.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"5417ce755ea637b14d36a16b264c188471273565","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.7.0.tgz","fileCount":6369,"integrity":"sha512-FcN6A+oWNArSZzjrK1pnh8I4nZK+597WOXnbNHZwA4Dc5UcsQWttJ42DEdNf409Gr9JVeldN1gMmY/pkygjReg==","signatures":[{"sig":"MEUCIHKkOtDltEOCDx82UKrkGLn9GdVe+0DFNYDCppQYKww3AiEA2OAt3ibH1aC9/ju1WK5qXFgDZP/oXOYOlOO38+9ebFY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183779095},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"1a9d4cae653f3bcde7ecfc3ce6874c6c96ab3f09","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:20128 && cd electron && npm run dev\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.7.0_1775580867013_0.00137945801285011","host":"s3://npm-registry-packages-npm-production"}},"3.7.1":{"name":"routiform","version":"3.7.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.7.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"03e0cc56a956149f8e9a9e7baacd352b79afee33","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.7.1.tgz","fileCount":6369,"integrity":"sha512-VbJaTrFHm6HHmiyy9SkIIv+fTZ49B/ijGFgSGXBPja7Iq0o6wqSGXjxoMwEREqR8Rpp4Y/WOM0+/dJ7phiyWWQ==","signatures":[{"sig":"MEUCIBZFZBkuAbIvSbvuQZS0P06GHOHXGkwB1AG5lAJKhGfjAiEAxsTlDtbs1todZ6BVsQ/oiBVC90hb25QeZHfMeK2GowI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183781157},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"f7d71ceea203994aa520e2b0fc97c89ac1b44bae","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:20128 && cd electron && npm run dev\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.7.1_1775582745774_0.3979478394523648","host":"s3://npm-registry-packages-npm-production"}},"3.7.2":{"name":"routiform","version":"3.7.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.7.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"cedf4d3c4adb904fa02bc376d24917e26718b442","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.7.2.tgz","fileCount":6369,"integrity":"sha512-VbELmt5v4acfJGNp0/1nMnXcXiKe+2RYxy5EScpbZYQryw3JumbmUeDmoa9hgkjwrxo8OLA5Nhzt0DaM1JLKCg==","signatures":[{"sig":"MEYCIQCzKnxdb4YnEYkBAhwhqoWlPWcsJ4F/8JvgsC4UZWOZDAIhAIHIPOwZ2fPqX7pUovg2kwi1Uy6QpJ3dsrx+5BXXxHlG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183781629},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"4ca5e260b0d045cebe9a0004c4c759a3c09738a6","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:20128 && cd electron && npm run dev\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.7.2_1775583742713_0.16320835888914664","host":"s3://npm-registry-packages-npm-production"}},"3.8.0":{"name":"routiform","version":"3.8.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.8.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"32a207bd9d7309f49aeb96fa932d0af08c33f549","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.8.0.tgz","fileCount":6419,"integrity":"sha512-DEwlTFEP/udOGjCo+hrMuDZqSEm7eClN7CVN7TBnGOjxL5GnqNO0OGCrtM1col4rWgVjJ79BcrnG/n8UhWt89Q==","signatures":[{"sig":"MEUCIFt2pHJtMAuCDBYFsTcM8TWLgmiv5BUIq9LVNVQyJvr3AiEAiak+f/NLTHP/ka60TP3cxwrAUbvRUGafkEYVezp4Qlc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":184832162},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"98effa92af1c4ac59814d56a2680e5da34bb162e","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:20128 && cd electron && npm run dev\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.8.0_1775666934885_0.855877499889105","host":"s3://npm-registry-packages-npm-production"}},"3.8.1":{"name":"routiform","version":"3.8.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.8.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"0c8800b40379aa50066e8cf14117054d4e5e14a7","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.8.1.tgz","fileCount":6420,"integrity":"sha512-8FU+kRGXTLjNiMuyabKmnWDpvcW172BGqzlegUlnakcMYyRdvi9mSqWcXfMdK1S1NR/9os+ZRFIxhuo7jyhWdQ==","signatures":[{"sig":"MEYCIQDOieFfB0brFQS8OeWYoSEj2H4m/Y8cdlI8hPOpEF5eOwIhAIpMgJTHI/qGz50yG0p/jpCS/d4TLhn52mLMgWIUdmel","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":184854600},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"10a0909619a5d0be1ebb6e0586d6fddcac1a6426","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:20128 && cd electron && npm run dev\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.8.1_1775668947997_0.3604941327147022","host":"s3://npm-registry-packages-npm-production"}},"3.8.2":{"name":"routiform","version":"3.8.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.8.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"d937a0c63aaa98b679628f777d4fa37ca733aa07","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.8.2.tgz","fileCount":6422,"integrity":"sha512-84fzeChSsCF/lP9XMh+qmVM6hlSxhn5WiHl6yRCtL0oHfHUfvJY3rq9C3DN5EKtANhsWK1NIpV0ncLIPF8NBhg==","signatures":[{"sig":"MEYCIQDdP9buPFhg1Dg5PVzK9jwWsZpzUIUt3tL4/EbVV6nYigIhAOLBV4dokpN3KvLaeRWJn/XftyZnitqZdaEY9EZjbglA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":184897243},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"3efd63cec9e14ea7806d899706221a36aecaf68a","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:20128 && cd electron && npm run dev\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.8.2_1775710981605_0.8595406771037726","host":"s3://npm-registry-packages-npm-production"}},"3.8.3":{"name":"routiform","version":"3.8.3","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.8.3","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"6a289d304b30fed2733267c4868fd0f10b244f15","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.8.3.tgz","fileCount":6424,"integrity":"sha512-A7qKEWC2svyt/OKUvwA437SkYaS090wxk1wfbnhLv9Z8aco6XQOf49u6thYq+qlm8gpIzx9M0NZT8D5xacF4/w==","signatures":[{"sig":"MEUCIDoZ71Kebh8M5Dg8ht29lEaegEsGeLvjneIa+GO9VYXCAiEA8vyX+I8LQkvxyY+a6Bs4Jklua4/YjhSdOJFctiZXgA4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185014045},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"194a224a951e1742581ffa862f627b454a852b84","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:20128 && cd electron && npm run dev\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.8.3_1775717566923_0.782740245347135","host":"s3://npm-registry-packages-npm-production"}},"3.8.4":{"name":"routiform","version":"3.8.4","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.8.4","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"eb1a4235902f63a5b2638937efde5a9a633ebda7","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.8.4.tgz","fileCount":6425,"integrity":"sha512-e+x4QawBZnho/p4vKEAptZ3AMgiSYPAsjJIoiQdDh0Em7gnTTkUcYMA6oj0Z3jXtcwdTJVgkq9JeEMG266wypg==","signatures":[{"sig":"MEYCIQCZ3nTB2Vsh6KefIEWzzi70uLb1rcNlnIylVVuVIyRpBAIhAOnlNEC29tpmyFMPrJzF51rVJ8NG38Hifglla6oVUXbk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":184774925},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"659395614872fecb77a44179242c6491d911a08f","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.8.4_1775740684431_0.18559478539330487","host":"s3://npm-registry-packages-npm-production"}},"3.8.5":{"name":"routiform","version":"3.8.5","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.8.5","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"90a0b15202b351a45fdd864bb2c4021752a4c8bb","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.8.5.tgz","fileCount":6425,"integrity":"sha512-s5uCf3HnYY8yjjU/CmQMS7j4SKwUbiaOwHrtZ3iRyulYiLkPrSmq3x2xWd60WTf6BGj5Dg/Q1zN76QskWfjF+Q==","signatures":[{"sig":"MEUCIQCaH9mp1Cq5dpnpnDkoL352WoZ8xuUppZitudQyktzEcAIgER12lyYxxacitVD8MmwkwrfTxRqskv1NiByxQIWpMK8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":184776250},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"e6ba97a04f36a277eab6c40319a775e7b074f3b6","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.8.5_1775748684221_0.24651017998728197","host":"s3://npm-registry-packages-npm-production"}},"3.8.6":{"name":"routiform","version":"3.8.6","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.8.6","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"359a3d538425edc7b6836e02df5f29c4f83f43b4","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.8.6.tgz","fileCount":6426,"integrity":"sha512-RxUPCZQeS7NtY+grw1RzW5rAG4txmGtYfesE9qAWFYmKC9Imo5Vbq8KLmEpAQPrfj1eBYLfg7HIDwXLWyjULqw==","signatures":[{"sig":"MEUCIQCpKMN0vCUc9rEEu7Xf2ZaezWS/8sLLFmKQwj2jAY7sxgIgUf9bs9H2IPRYvEKk750vueDShOqTmVwwiaab4TlLZbs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":184786876},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"453d5e6b2e29e1580ae206f22088f15ed096aac4","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.8.6_1775749928664_0.788876588273328","host":"s3://npm-registry-packages-npm-production"}},"3.8.7":{"name":"routiform","version":"3.8.7","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.8.7","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"22272063da9aca723b9f6db63ed14b17b9474e0b","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.8.7.tgz","fileCount":6428,"integrity":"sha512-5GhXTKfSiWiuroQaZfmFZo2aF2k1qdc5jpZHahtnGYZSr6hbqq3eczy6hrb638U0E4CAsEug7poleEK9XXVC0w==","signatures":[{"sig":"MEQCIDa4b7AMOLRt8d7o3syMkh4DpZSmZylFRr5s2j2Z98eKAiAe2s/VfjDSu22gsMCfXmRKO2cE8woy0e8FbkVaEuYB2Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186973678},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"5857337471c17b556c6b494add49838d3eded31b","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.6.2","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.13.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.8.7_1775751982198_0.5307582406518243","host":"s3://npm-registry-packages-npm-production"}},"3.8.8":{"name":"routiform","version":"3.8.8","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.8.8","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"6605421e5100084e809fd1b4b0f885e67b08ae68","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.8.8.tgz","fileCount":6431,"integrity":"sha512-z483XZuRxMc+rbWTlsaTH7gCs7SzBAPYMzEjQFEOKhfrfa5A6KNbFu1sJXv5X+k/UdS08K9etT4LM3z+fUCv0g==","signatures":[{"sig":"MEYCIQD0nPoOiayTzBd5qXyUAIORxqp52SFDhsLcY4LENUiWFwIhAMs/M9xUf66AiUdYtGANifKtG9Z54xKRdfq0rTH4e7LJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":184856243},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"2cee2974bddb045f14136b08e0871cf1439d4983","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.8.8_1775810780449_0.9077864104035671","host":"s3://npm-registry-packages-npm-production"}},"3.8.9":{"name":"routiform","version":"3.8.9","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.8.9","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"e4d98d564bae4c8c0db74dfb73a534345617cc1f","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.8.9.tgz","fileCount":6431,"integrity":"sha512-sQsv96oSgq86ITgKE+YzAzKr53xdsuTvldbO81iyFuiAF5hGNq3AXzw3/JPME6bYb/DE0ck4G+z+MzDTn04kQw==","signatures":[{"sig":"MEYCIQCH/yQgM5tHEqtAYj3qtIF5++SPlsLg619zR9A/uGTbpQIhANckowp+RSmjXZgYdeJlj+b+ZPB3gE8/XQ9qrx9wFExP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":184668122},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"476936355ae5be393eb6a7ee1b886a5b2b880a3f","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"husky","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","husky":"^9.1.7","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.8.9_1775815836362_0.8814014866305839","host":"s3://npm-registry-packages-npm-production"}},"3.9.0":{"name":"routiform","version":"3.9.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.9.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"b7148d2645545d477a5a6de6b9edfde92b079c93","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.9.0.tgz","fileCount":6466,"integrity":"sha512-/4Mxj2PIu+wC/s5/+vdWQthytHSZ06hnBF8VgVrEEuyniQZOiry3lz9v0j27EEsP6ODHrLFEBE+Jedu2ozQOhw==","signatures":[{"sig":"MEQCIA5CPm/MOw1YjgIXSt4eJLvDZ7ZSM2aHDLRiJ/jAwI9eAiABybiHkB7G0Xx90r0nOeWBfe2ZjeblnyOYtwRf4+km+g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185219242},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"c94be42981bf867ab124824edbac856d606220f8","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","lint:deadcode":"eslint \"open-sse/**/*.ts\" \"tests/**/*.mjs\" \"tests/**/*.ts\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.9.0_1775956888798_0.004134839516083844","host":"s3://npm-registry-packages-npm-production"}},"3.9.1":{"name":"routiform","version":"3.9.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.9.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"a0140081f656f052978f45fe6a1c15108c51a5ee","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.9.1.tgz","fileCount":6466,"integrity":"sha512-Y7c3nsnH1maG82wWjjl1l1WZVPJRIdr8uZ02vBLKPpUGXrzH4TRCJJVtYtOWhotABHaTvgRttQaf+3jUScPahA==","signatures":[{"sig":"MEUCICVGMCQLn3OIcTvSepXLWzWH8/+gZSeV8hvBgXahC2HaAiEAx/vZA1/wY9YA/O3oeenC+S8TLGwhCAxC3zUQmmdDrlQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185221057},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"2d00f056a7ec320c64811b54d681f502a106955f","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","lint:deadcode":"eslint \"open-sse/**/*.ts\" \"tests/**/*.mjs\" \"tests/**/*.ts\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.9.1_1775963807820_0.9699251980974559","host":"s3://npm-registry-packages-npm-production"}},"3.9.2":{"name":"routiform","version":"3.9.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.9.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"a3a4e1cab3d350a1a5804f314d59f00fbb56d726","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.9.2.tgz","fileCount":6466,"integrity":"sha512-gJG6cvzhA0B0jny9Tkf3Av+AeYAo6OmIv3ur73ip6rBS50gTuN43YdVXljywG882Il0G/96Ia+wK7w1PAUY76A==","signatures":[{"sig":"MEQCIC2R0p9cbICqnm99k1prR/U0hPi3JLs/c2JCvqkRb7X+AiB70qGo2/q2WIJyHCoKs6eKwXOTeJIZS55Dg9tT3iVd2Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185221362},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"04594174c940beaa8ed521d280a639efbc05e4cf","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","lint:deadcode":"eslint \"open-sse/**/*.ts\" \"tests/**/*.mjs\" \"tests/**/*.ts\"","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.9.2_1775964443900_0.2833681169810356","host":"s3://npm-registry-packages-npm-production"}},"3.10.0":{"name":"routiform","version":"3.10.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.10.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"8804f2d69b074c38806f78f3d21315ca3603e3bd","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.10.0.tgz","fileCount":6630,"integrity":"sha512-4T8rU0QvfzJDFFG0K6KvUveSvtEOUh1L0TNUyl7TJlkbPAbvNZUAEqJo1UIztDUdqeWqEJ6hMdG9YC4ccSCyBQ==","signatures":[{"sig":"MEQCIDXZTmC3xRDhS44dsLwXkyBitVhh1mynJdy+J8f8QGrMAiAf1NTWmLPLrddzekWBa3XPFCRK2tjz86MG7/g7yE3pUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188226585},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"0bee73d3e0672ed20f2ebdbf6a9b5220f9ebd492","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.10.0_1776234945169_0.24027897333177006","host":"s3://npm-registry-packages-npm-production"}},"3.11.0":{"name":"routiform","version":"3.11.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.11.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"d4d76e4a9315fae41ce5a2f8d7891b5733842ed2","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.11.0.tgz","fileCount":6639,"integrity":"sha512-cEP902E3bXaC7zJiCVzjnBhQYXLFRrPXtAq6/Fa39zTQ+Dsu/oqqDjRghfQb012X+7BGQ5Y2z2ps/V+4l8uZGg==","signatures":[{"sig":"MEYCIQCMmZccNyx2ktHTW+n75KACEflSu9eOy1QYxPx526U8MAIhAMRzF5ezTG8fewREg2jNTxUpbSVSuOp9oFnEVVmKeWcD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":189864276},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"296d0085181ec5bec85bc411a16eca230b724b34","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.11.0_1776340104575_0.7438408151189357","host":"s3://npm-registry-packages-npm-production"}},"3.11.1":{"name":"routiform","version":"3.11.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.11.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"0fe6be4f0e8eccfc395c662742b82633caad69f5","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.11.1.tgz","fileCount":6641,"integrity":"sha512-6zYfj+jwS4jo9N49xj21paCdLW4OL+3t4WinKXeVP9ft2qYji3srzE0LudeWvh0VXR54Z3+Pp7Mfocwze3K/nQ==","signatures":[{"sig":"MEQCIHP93QYGG1KScLum8Q+h3ozKfHc4/Vh39n5qYZwu4Dg/AiBS/QaIqUW8Ruz+jchXMS1u5Rh5VyYG0PObo6hhxL93kg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":189976996},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"4e01f45bf59c64936c1b17b4cc67a31c37fc54d4","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.11.1_1776383777249_0.3901478235797884","host":"s3://npm-registry-packages-npm-production"}},"3.11.2":{"name":"routiform","version":"3.11.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.11.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"7d897680031b8af2982d59e50a7409675ff2f507","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.11.2.tgz","fileCount":6666,"integrity":"sha512-RGOYFS3SEzUYDKk2+XUMepkzOXHMx4XVO8SQ/idP9nOJyoqTG1jQK/d//Z3I1tps/Lca1q8+tvPYtX1g0Mo/1A==","signatures":[{"sig":"MEUCIQCjl9NMofUjNj0tv2qatitZKljlHGenYY2BEE84XuRfPwIgTB0dL7muWr9+wVe0AKcDGpSixHq1gHgNmwO/FiSbxyc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":190209457},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"a137f718c95d663b0d875494bfeaff539f9479c8","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.11.2_1776494538349_0.046387421143901264","host":"s3://npm-registry-packages-npm-production"}},"3.12.0":{"name":"routiform","version":"3.12.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.12.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"fc27c2208cca0a21c4bbadd1bc413b1554e3de10","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.12.0.tgz","fileCount":6684,"integrity":"sha512-Vr0ZEVHmCPFLnejkJPOXfcffqSEdULSXAJzVs7HAWsw+IsKkh+2Z8kGfV3f0T+8mfpX9u8XFdR7/ApE6VcsDKQ==","signatures":[{"sig":"MEQCIGR3cFonn7U8It25m7XW28WEQNxa5i5ygt8IJxZQqrPTAiA0H9rLh0HgXTWy6V9yf71WT5XDpRUqmXHPQCLP0g7+Ug==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":190325105},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"d9b03bee2bb685ce8db9dc3b77836f8e5221208f","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.12.0_1776606114870_0.5024661362923739","host":"s3://npm-registry-packages-npm-production"}},"3.13.0":{"name":"routiform","version":"3.13.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.13.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"e67bf94c8ddba42f3207d943c75ae3b4c8745c34","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.13.0.tgz","fileCount":6777,"integrity":"sha512-AFiP0vbEgPR3vwdMPznYgxFHaikcyoMTQtlXTmGtwc9tIqaXHO4jPkxapKPoWcoXHXfhVw9yFbHWJp63e6MgZA==","signatures":[{"sig":"MEUCIQDnnqg136VZflNLp9Rilc8TAaeTPJjIec7ipLCQsjLgjwIgRpFv3q20ZLCR4oJmCwpKBGluXEkrnpqHN3hD6MlvIJY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":191856970},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"d2a70bae7086e307760d041bbd44f75d117703c4","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.13.0_1776608675156_0.3986709715533996","host":"s3://npm-registry-packages-npm-production"}},"3.14.0":{"name":"routiform","version":"3.14.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.14.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"782a90973a9db1bd9ffb759007b86839b22c7d16","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.14.0.tgz","fileCount":6783,"integrity":"sha512-K/t9iC8wbtFNXbV+2dKHuc4b6z8rDfS00TEA/18ck1jRFfREn68k69rHTxpUTXfuPpptCarUXA+TNskStqxDWg==","signatures":[{"sig":"MEUCIAU6LoOQn3IkDM8a3X/WnhmS0fb2nsoG05g7QUiDnEdlAiEA3VvF9K/gxV81vr9+TcWHxl3WCsLp33qnyNrHZcK6GQE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192250819},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"33fcbdb59fb222db719eb0e46841144cbf69a4c9","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.14.0_1776684711295_0.7099530208649196","host":"s3://npm-registry-packages-npm-production"}},"3.14.1":{"name":"routiform","version":"3.14.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.14.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"14fe731061b0c2e1a68e61976cb6a1f82b309a24","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.14.1.tgz","fileCount":6789,"integrity":"sha512-QWQVW62SFV2r7dm7mhH1cH/5kiXFRc5UF/GaAPr3xq2H4YmJaoAh1xjEvUyYGKMSUHoTJ5WePdxlvPOp0nSAaA==","signatures":[{"sig":"MEQCICZuCqk/ed1Q7riultLWqELxY2bLbRE/HrcRb2wN6aMcAiBUQad17nh8Lv9nAzAA1BglWUynaIeyRuygMAtbVGXEAg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192505583},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"c32da81af11cdb523bd9b20de555d74bd3acf497","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.14.1_1776740833693_0.6764091547372577","host":"s3://npm-registry-packages-npm-production"}},"3.14.2":{"name":"routiform","version":"3.14.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.14.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"66b227baeae680ba38047572ebdfbb0a19613324","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.14.2.tgz","fileCount":6787,"integrity":"sha512-/NQ3NQFEXK0cDhlDiL/TWy1saHqZWZeWH+TynSLjyaEenta7n+zWZAvKYF1EBqlW2XZ/erLYpN4KYfYdYUL5pQ==","signatures":[{"sig":"MEQCIGz+d9abvQDvhWHV50VtmDAVWo+8+MIg+Hjxy+P6IV1UAiA18w2FtZxxeUwl+AN679L3+lPT2eWpbRrUQeMGRCZ8UA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192369728},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"57234a6556afce02b883be70704ff1bf63b68860","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.14.2_1776749631799_0.015788348032174104","host":"s3://npm-registry-packages-npm-production"}},"3.14.3":{"name":"routiform","version":"3.14.3","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.14.3","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"0e11b47aff41f552180b7b72f691e82443f44f44","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.14.3.tgz","fileCount":6787,"integrity":"sha512-ZSFtWFU7F77LHTV75siRnrOuAMBh1EHIprzgaXR+rzfjSK/j+KAC8/nNNoNHrtmf5Dvex78Zi6U9j7KEQPxfQQ==","signatures":[{"sig":"MEUCIQD0oGLtHlvQYQgNIQbGSmSQUIionoqJ6RJ7Unk6CQFDgAIgQiR0PMTFDGetIWy6SsUtlSjk1LrBcDLmCb3MjFGS6iY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192373721},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"8e155538333b8ff851a5911bbe31d11061cb887d","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.14.3_1776754118386_0.055050112571842114","host":"s3://npm-registry-packages-npm-production"}},"3.14.4":{"name":"routiform","version":"3.14.4","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.14.4","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"e49b16e735ef8a5dd5b8196c1c59dd034d78cc53","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.14.4.tgz","fileCount":6787,"integrity":"sha512-7ZqniVm9fbZfsK0BZ533AGXxJCZvQj2HPx0mnkPpN22W61hDVDkdzZgLgLBOdGZstsJbKLtvKS+FPRu47eo9HA==","signatures":[{"sig":"MEUCIAh5zdGEs4aLIlxJLE9chmCf6D7559Ysd89mPVZbmNtHAiEAgyS2tlzuoez+sOvoOZUwtht80eOGmgGtdJfYDI7LU3c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192376309},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"01e5b01351de504e801358af358334f734e6453a","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.14.4_1776775349975_0.5976643258555254","host":"s3://npm-registry-packages-npm-production"}},"3.15.0":{"name":"routiform","version":"3.15.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.15.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"16a3962043382d9bfb303f838952e34697cd2ea8","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.15.0.tgz","fileCount":6789,"integrity":"sha512-iMitxEMOCN3QTtV9n+k29EmJng1LB1XC77j5apRI0GJCMAmcccbnr4sS3HIZuTMsywAIBs1+ukONUaT4RhrofQ==","signatures":[{"sig":"MEQCICL5lkNLdO7XwaD1yCIuIwh97498If8vHINKTJUKngwZAiBuF1AwGmYqokEG5BTqOMJUbvabE1fKY2CE3bsEgHtmkQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192406287},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"0c9479b2b3fa52db4820b3f3817fe251e617f529","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.15.0_1776838131151_0.9545295301640511","host":"s3://npm-registry-packages-npm-production"}},"3.16.0":{"name":"routiform","version":"3.16.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.16.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"a09c194419b4d24e88280c4b85124f40c97ec453","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.16.0.tgz","fileCount":6788,"integrity":"sha512-On1qxOcRjiaZXkC3W2mKHmAsWoRgkPhYiD+x3p9iOyd+vScTi6OR6xHxyOP6f+A8NntkmdOdxcHCg1y+Xep88g==","signatures":[{"sig":"MEUCIHeGb8YFfuysJPf9MVlerklhcGeaLmPN79Gn59XNGpouAiEApWRJREmiKd2Boeg0rdE6U01XmY3mA9aNbo+S0S4RdjA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192444160},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"b3ce5988e0e19b6c1ac46978bb6a165ed9f0e31c","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.12.1","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.15.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.16.0_1776867040104_0.18707354809570775","host":"s3://npm-registry-packages-npm-production"}},"3.16.1":{"name":"routiform","version":"3.16.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.16.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"6a324e093bff4b944fda0a36e37bcbf63f673f9a","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.16.1.tgz","fileCount":6788,"integrity":"sha512-HIvLomlq7+WqxFIx1YBA9ygqJ0edF6nGJURvnIpfierIGou/Sq08PEuU9Ejps3r+Hvta5QxsPjVLaC2PQCsUGA==","signatures":[{"sig":"MEUCIQC8mZov+1OdT9WVVzkN8yQryEdBDFnx2jg5e75TUWLCLAIgfcoD6uR9/doEFOrPtBppr4ieL3AzviJClNtwUfMel8o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192444227},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"c30663116d9eb9f781a5ef33d5f6d7128f5660fb","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.16.1_1776871202607_0.8289357055242645","host":"s3://npm-registry-packages-npm-production"}},"3.16.2":{"name":"routiform","version":"3.16.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.16.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"82c013739310035d66470875ca095b151b0da0bc","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.16.2.tgz","fileCount":6816,"integrity":"sha512-FYi1AMfZxGuHmZRGZjAKp3asQKH/fkOuj7HhfDw0bAo+d1QGWnZaEu4a4K6YxhaPQ+uh4K8qXE+NcSUzfol0Rg==","signatures":[{"sig":"MEUCIQCkVN4Ws5Ij6+xEmuoqH11N8ReBaA3/wo7VcXDOXgMGlAIgfJD5+JldkSY0s1C7g662aP//vfbsi2CSzqMMiKRjtPY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192986619},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"38af90e766a9590034e511113f0c3d86a6aed015","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.16.2_1776920817403_0.10311377600775606","host":"s3://npm-registry-packages-npm-production"}},"3.17.0":{"name":"routiform","version":"3.17.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.17.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"53f52ba1923cf8ff396b43655757a13376514af9","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.17.0.tgz","fileCount":6821,"integrity":"sha512-rUyQuMf3A7Up1efD572X1ivA9TMSZfGbPvcesDBpYICFeO4Y4yKoiv58UQJNHBm0Lnr5yEa+uWYNgkrdvNWdwg==","signatures":[{"sig":"MEUCICtcpbraByQphqkFGMYGuo2nPSAHRDnoIQPOrw/rZZ4iAiEAg7S7X/ow2sNya3nu3WlkY6rVayy49n8QhLM8SGeEeyQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193160280},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"471efb9702431264a1809309174d4edd0644744c","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.17.0_1776936816307_0.6618825645713411","host":"s3://npm-registry-packages-npm-production"}},"3.17.1":{"name":"routiform","version":"3.17.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.17.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"d38c334dcefc64e14e3cba6ab74f4937f5931a80","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.17.1.tgz","fileCount":6838,"integrity":"sha512-bkIDssghEYWSPKSRnf+uMCwOWfDkgIs8Sevn/exxa+2xpc2N0fFNyDvd1sKU6N/JCZCOgZdbo+N6Mi0T7iOBQQ==","signatures":[{"sig":"MEQCICdO/GPLJNibEVsfhhUU4F6/lz4AuUqPmMSMlnfgick+AiBUSjZ22dEjIFH/4KfiZHlsQU0PSObgGB39e5hzL/lAMA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193439437},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"63c92e522f5b876b7349ed7485059597af60b872","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.12.1","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.15.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.17.1_1776956928661_0.6210107170941412","host":"s3://npm-registry-packages-npm-production"}},"3.17.2":{"name":"routiform","version":"3.17.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.17.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"90fa070267bb02664ed956d25a600b22d7cdf525","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.17.2.tgz","fileCount":6908,"integrity":"sha512-VoFEowwjS0kuem3Ezz7xpxUdNF4iXNUOJwOfgtB+fA4w8tpJzPI11025LZfg71fbeU21ywEwI+6UJMPtR8eLrQ==","signatures":[{"sig":"MEQCIA2+idxZrNjJVyDeSlxAhVcQALBTBs+XaE1sTsHk4WMLAiBS/uPg838TKfdO4m18XWSkSXVBkGg+DY/gIq8mabUpsQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194638031},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"790e8b15340bc7b542d8e7a56c913c633b7ea510","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.17.2_1777007029062_0.218492585876634","host":"s3://npm-registry-packages-npm-production"}},"3.17.3":{"name":"routiform","version":"3.17.3","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.17.3","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"52b266880d8bcef90eccbf1d33a4b3bd9c6910ba","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.17.3.tgz","fileCount":6909,"integrity":"sha512-zuD0FIIATLkhjDK11lD9sL5gNAyY5/UOMI897yn+wruo4oFNp2sOIuJqv2UGuJ+3sWyyygpqJe14bDIEG8FHEA==","signatures":[{"sig":"MEUCIH53Yb1p+hPoIYEA0UhXqjRW+xETbp3LOPMAHUkp10eWAiEAhu5DMUKrkK7j9/p238KTFZW4mEUVOU8BdhBntnuA3l8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194663353},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"de12540e5b4d533d30cfd33aaf4b8ae449ed65b5","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.17.3_1777015711480_0.5258992933624549","host":"s3://npm-registry-packages-npm-production"}},"3.18.0":{"name":"routiform","version":"3.18.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.18.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"5d1f7ecb4367a43eef9298df4dd9a092de0b77f7","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.18.0.tgz","fileCount":6915,"integrity":"sha512-5ciWe4stV01+xPR7cKjJ1pvOzDyUPJ6BJazXBc1dFHh+g9bSJlUMAGuuEjjy4KlrKv2+t8X7NyVi0z8Rseldpw==","signatures":[{"sig":"MEYCIQDPhtkWtOFzI7Nn4UA3seHRxig06QuYiACCVvwIh2WAkgIhAKlzx/Hn2ajvuf2em4Jldwf1DAI7L0z9MjIYlYFUDKun","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194769458},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"f5c8a3e70421fa88095131ef35ccec8c502eb193","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.18.0_1777040601112_0.4325857756410023","host":"s3://npm-registry-packages-npm-production"}},"3.19.0":{"name":"routiform","version":"3.19.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.19.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"6f25df2aa0959c4a555147a440998ddb7a419c50","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.19.0.tgz","fileCount":6919,"integrity":"sha512-YMuxeC7FTgeHQDw+SsyfpF184b6a+fAABh/U5rjq51BpoNmaoRZOezcOtRiLtyuGGSIr6PJLWYp3338kn8CXJA==","signatures":[{"sig":"MEUCICZ38Kg5O+mlVfZG3jHkTpMFsTGm08Y1Dl2J1TY+ESrEAiEAlbRqnjO4diZPZZ2jBOX5Ar7a/0AQ3aU/qaAbwzl1G8w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194957844},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"225350e6bb567f8150676699ec81a7630cd78dc7","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.19.0_1777094636961_0.7669034790648519","host":"s3://npm-registry-packages-npm-production"}},"3.19.1":{"name":"routiform","version":"3.19.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.19.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"378bbfb01610b35364a5f014d73c4f72c2b858f8","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.19.1.tgz","fileCount":6919,"integrity":"sha512-TngA4op6vRFCu19hGpq1bLY4CDRyoDkqRjP1av4GmoTpsmgjAQA6Dl0amg9sez6UwF+SU8RuaXKreJkWYOdpFQ==","signatures":[{"sig":"MEYCIQDyXGuNcYA8Rg+j4RIIALjAQqpjgGa5SZ5JM3IaSTCliAIhAMf7r+D/O7TChcJxseyoWDzR8j99oeSAvxxhT/fsVaXO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194959090},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"8197f3a2fedcdbbc8fcb945fccbbeb1143257e58","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.19.1_1777111438309_0.35659443628132137","host":"s3://npm-registry-packages-npm-production"}},"3.19.2":{"name":"routiform","version":"3.19.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.19.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"2a2753766113a34aed738056b29edc284fbe8ac0","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.19.2.tgz","fileCount":6919,"integrity":"sha512-quRA1q2GgMWizumeS2wm/NcEMs64fHPB+Cu/Ris+iQ/aahG2CYpVk60Qsybs9I5Ev52QepkKxH4KTqvK1IE5cg==","signatures":[{"sig":"MEUCICR5Uyva3kUYK0y2whWYzk7BcdjdwUZt2k2YpG/2QQkzAiEAyVlUUvnk/CSaD0JFydyGfW2UiP8aIEjDfdky6hJhuds=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194962424},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"f6600b79b323e0bdab3d4b7f59f51a06a7dd7925","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.19.2_1777114398669_0.532945845067972","host":"s3://npm-registry-packages-npm-production"}},"3.20.0":{"name":"routiform","version":"3.20.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.20.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"57f49d8c9fd0de1fecbb4d0f18fda986fed832a9","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.20.0.tgz","fileCount":6918,"integrity":"sha512-L9nWv1TZ5773dSP1p3/j0FRMeduXe7Zkxd74GhgXtWfcK73n3NNrimuCuxEO4KhanT135Qw6blglKRB3b+sBmA==","signatures":[{"sig":"MEUCIQCiibCk87dSQGKsbw6EWPWwiikRWGImkyygMwE7ULeCDgIgS6qwl46Ls1xc5BuEfA4cWFPnvvBv0nOtsNdAIF/JyS4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194883178},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"36c32b4beda0570403b5b93364175ebf9817445a","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.20.0_1777138606916_0.2664763833529644","host":"s3://npm-registry-packages-npm-production"}},"3.21.0":{"name":"routiform","version":"3.21.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.21.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"f1e26f2366eedb1dfdf3b3ceb0cbaf550090f16b","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.21.0.tgz","fileCount":6838,"integrity":"sha512-i/7473Avmiv3tmMehIZDYzuinh5Zn1ya8hW9Y5jRwoIawbYZCnKpHvBIXRXhu0i3PZVjTkwV7AKhqLdNVB9Y1Q==","signatures":[{"sig":"MEUCIDmbDGnIFbFPmLjYIbU6+RAglFcuhh6L8cWUyrDHzGt8AiEAp6QFcTtAxISDvP7SCv7B/brfPVfiHpLD5Ww2SzWQwDE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192704589},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"699ebeaa71bdda246adb9a49160589113e62a669","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.21.0_1777274879050_0.4949957347307372","host":"s3://npm-registry-packages-npm-production"}},"3.21.1":{"name":"routiform","version":"3.21.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.21.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"1a8be7dd0e85890f1ad450dd052d7403ef3e68c4","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.21.1.tgz","fileCount":6838,"integrity":"sha512-1pO+e/Y9vy2NQbAjUe9DvzdG4TVlm+GFaqacEHHcFXGf5FD3cR3OdXIw02rNz0PDit4o1i8AtIzQe5rsTTBSbQ==","signatures":[{"sig":"MEUCIQD6H3ihaD6CZxti1CHt2hIvVCpBXRKcmpx44no24Gk5LAIgT5XLQQooZCi70cEX6+ftDSxvrFD3sJCw+onbDC+UNYo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192705910},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"b33d9dafe3cc3c001c2a65d53c63744a30393bf4","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.21.1_1777275784078_0.21827325059679836","host":"s3://npm-registry-packages-npm-production"}},"3.22.0":{"name":"routiform","version":"3.22.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.22.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"c261514ea076d58332bb87678e230ade4a2a9799","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.22.0.tgz","fileCount":6839,"integrity":"sha512-7BEaeSVy0tJiHBZFZOk3shDXtrN/ljrlpHO4IBXxtqlH3udVQNXUVYhdcTdOwepRa0aZxqKvtgIawOadQcJ3QA==","signatures":[{"sig":"MEUCIG7nt/S2DG2IlOhMSPGqnFrasYeOIEUJ31kbxPgM7sZvAiEAwUC4gXJaMwTLd+zwWenRVnhTCZOBuTwbJHfDJT79SeA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192787248},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"266acabea1c90b515dbf4e7357fa5ce925e6f154","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.22.0_1777278424475_0.4961109526035359","host":"s3://npm-registry-packages-npm-production"}},"3.22.1":{"name":"routiform","version":"3.22.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.22.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"bb2dc3a8e8a041d5ceeb7e093505de7f964e8ce7","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.22.1.tgz","fileCount":6839,"integrity":"sha512-OVkKM4RrubJflCWGpHiX+Xxfr3Xw6oCFfornKwMDv8toPXXHGSB3IRG9t5R06laOZor9rmm1R6+3MBISqkGz8Q==","signatures":[{"sig":"MEQCICwBQ4gJQ75n/EGWEo93FcmZr2mbnr0uDKcZ4mb1vGCPAiBXbjhoTYytHnXpSJYys+d0hqSB1UBnU2mKA6w3lEmYFg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192788751},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"87ca2d2d36b1805e7ad312b0d19d6e915b7f95a6","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.22.1_1777279022548_0.20091849807415385","host":"s3://npm-registry-packages-npm-production"}},"3.23.0":{"name":"routiform","version":"3.23.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.23.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"3b7067df55c584bba937925af422a0f72bfc5a6a","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.23.0.tgz","fileCount":6851,"integrity":"sha512-K6utskZP1gbaK+fqZ5exliL8LdpA7G9+3WUAo78qrCMhhvaI8PIBqE5C1xKnq3tsjzy0NLlWhcx/wC9UjthJHg==","signatures":[{"sig":"MEUCICNEDM8ljuzbPkkBLOu7lfklQsaXw/lMVZ9iSZuLrywJAiEAnmWSUNoLgsEEmA/bLtwZ3oxwBlHXbn67m4vhCPCluOw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193012735},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"e7a33bd86cf5450c98fc857548f15fe6ecf78390","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.23.0_1777302937115_0.6037889990799277","host":"s3://npm-registry-packages-npm-production"}},"3.23.1":{"name":"routiform","version":"3.23.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.23.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"aaccca959ee940d2f4a25f200b17a1e229cc66cd","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.23.1.tgz","fileCount":6851,"integrity":"sha512-dDhylqZKM67N+vAdq9yJVv4x6/g2yjrv4HVe7Sr+BbMof39468e1waHmbSZZ32jkj9SGe/LehzEKWilz7KzrQg==","signatures":[{"sig":"MEYCIQDoyRZU7Gs+vWKqDrb+qAh4Ql/rUx9LMkaulmzQEMRKRgIhAJIiMBELpH2kq3AFjcXv8PIXxSQ5yYe7fmoEAzyEB9fP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193015456},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"0096cdc6227f3091bc82ddce2b14ebcfb222e310","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.23.1_1777361299286_0.5193343900487128","host":"s3://npm-registry-packages-npm-production"}},"3.23.2":{"name":"routiform","version":"3.23.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.23.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"5be5345a4e582573bd2b0d042b5b7a07607bccc3","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.23.2.tgz","fileCount":6851,"integrity":"sha512-d9GamzvltN+ran7jOoINHzIr511fMoXSnQamBk1F3Qinln0ASDEki7U3a4jtHkZd/osuLx8dTS7zclYCrf4eEA==","signatures":[{"sig":"MEQCIH7Ym3Zw9H6IkJAfeqaDt8MmiqWmP9RJbJOkI4VBgViVAiAede/UoQh9LC7Tz4xB27g+xSAxJ8HdRqEnCzYxT8hnug==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193016408},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"d3cf9e64a2d3ba3ae3e92874cd58ee68a09e8886","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.12.1","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.15.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.23.2_1777368983039_0.9696145972519166","host":"s3://npm-registry-packages-npm-production"}},"3.23.3":{"name":"routiform","version":"3.23.3","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.23.3","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"b3b93b3a228bde845d47bb1b517c882ae7acbb58","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.23.3.tgz","fileCount":6851,"integrity":"sha512-vcsUmY86VC0+ySG7pelituku9V6hR6IC4i5GdvPdbh/DiwJUPUGnNlJ+kdgZPuyjbHONr5Qzvue6iu/u0Z4DDQ==","signatures":[{"sig":"MEUCIQC216QZ+RilR4ViMBBlST/JYTWc//tYkGDD1fgmA6+0+wIgTgN0KPXP+D5Uz9semfs/jY/UYs3gnv9dbJaHAYEGW4Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193016711},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"eb666f40ed2ed41cd15d4d88c43f6895af6e4e5b","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.23.3_1777372506013_0.10849870073972423","host":"s3://npm-registry-packages-npm-production"}},"3.23.4":{"name":"routiform","version":"3.23.4","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.23.4","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"f9f5d1e81a7bf9f7e365ff5294b8e62a41a5f449","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.23.4.tgz","fileCount":6870,"integrity":"sha512-Sxp3R2co8axnVbGoGnO6iudlTY3HhrQVGv1npkJPqx0mxxOBXqfEE4OqG7dIWdT3Y4mLiivfXul9IC/EpCMsEw==","signatures":[{"sig":"MEYCIQD7aSnTw3PWxgRvvIa5K6yH+RUvkJllf3zwa25J15162wIhAPOb5SRrMse1ppkevdIjYE3jh6Q4KkywCjl/FtJ8AagK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193387664},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"a35b04041abf69525f4654b5000b7ce9aafcc940","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.23.4_1777381431077_0.5028624585113448","host":"s3://npm-registry-packages-npm-production"}},"3.24.0":{"name":"routiform","version":"3.24.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.24.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"b881a645c33acc7bf0eb3a57829cf915242cec77","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.24.0.tgz","fileCount":6875,"integrity":"sha512-gSpoTMOHW4DTH1ciZEXcz0v2nbXLk/Cg0OQMtCMVmz0NIW0sKk04u/Iuvlr+rRbEkGgKYRvO9V59mvMIM3j0Ig==","signatures":[{"sig":"MEYCIQDh0VEZg5HoYbDrSYh70FsiYVIxNRcgzs/V91Mjr5P5LQIhAP0MIZFLnNLT3aUu2RJkPKAxcqk1QtdjlerZFL4ixKHw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193495123},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"c10c01c99e643d1ec509ea2040edc1c55ea90b76","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.24.0_1777445872796_0.40136265477417843","host":"s3://npm-registry-packages-npm-production"}},"3.24.1":{"name":"routiform","version":"3.24.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.24.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"7c0ed7774964bc134c20c29ad1c46a62d6aba9a4","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.24.1.tgz","fileCount":6935,"integrity":"sha512-jzE6L7D2+RJfilMomcaON6W7Npt+/CMbg+WgSVb8iPf7ygWj4dYe4e5AJ/7HCq+rmSLwHlOZG1csdPAj0mhsoQ==","signatures":[{"sig":"MEYCIQDyjghHFdBBEVvsbEO8mVP5+Mz8hDgmKHW7n7eDiR59rwIhAJv2JGz5dYl8xh2APILla7z1STKtO/PmubJ3NCvLDGAx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194370671},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"35f955bee7678ec89626a155667e32b74d6ec3a3","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.24.1_1777522648903_0.0008094435775116704","host":"s3://npm-registry-packages-npm-production"}},"3.24.2":{"name":"routiform","version":"3.24.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.24.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"0698a0bbd572ef71483680d49a00416883cd526c","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.24.2.tgz","fileCount":6944,"integrity":"sha512-ZnNoJ0u+X+C320GoHz5tqtfv24lS7rvFJ7ebWqk57VkJmCJ3gRziWgK7k1N31TnrDbw1jp67um6jTEx4q8uImg==","signatures":[{"sig":"MEQCIFSoEclkMIl0otdlwV+qKFlEJQBz+H52UhMg2BNpoplqAiASqIn9Ra8gOZbvXKqctujiNA83kKeOOYmKTddTXHB7Kg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194771419},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"3cda58392f3d364a705a999a88d07d8780e1e36d","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.24.2_1777736098889_0.9542834189219855","host":"s3://npm-registry-packages-npm-production"}},"3.24.3":{"name":"routiform","version":"3.24.3","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.24.3","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"59722efe056d533baac25f50c6aeec868433b9b8","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.24.3.tgz","fileCount":6945,"integrity":"sha512-fj6biV/yIFLBm0cg96t0rsSQe1L9c+RMX7XIbDKLXmxR6Fz2S8uFyI6nMqnxenIq0ooG1uKn+4mVxpgzGLYgGw==","signatures":[{"sig":"MEQCIC0wEQZlJVHHl58ZEdwMTsgw+iUCUFrSwt/qJcTq8V3eAiAhAw/l/M3dfSAHTrYa8VTOH4XeAQMD606jc/LvtKt3UA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194787800},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"fd913170786e88cb1fd1fe3ac1a416602d975377","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.24.3_1777868020426_0.3847884875924712","host":"s3://npm-registry-packages-npm-production"}},"3.25.0":{"name":"routiform","version":"3.25.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.25.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"13969dc948d0c4c314468c513262c926155c6feb","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.25.0.tgz","fileCount":6980,"integrity":"sha512-DWjJZXDk6QbY2kbJgsVvsFPW2YTy+iAtEM68n0zsjVPtPU2pFQ/+zWi/NAHJGXGm9a/xpOecuw/Tdnep4suJrA==","signatures":[{"sig":"MEQCIAE1TsV1bEiKrAQlA4DtFd5RC5gzeFG1FxXHexDG8sKSAiBh5z7gu4GA/ObmLyCJZmsjjwScqQaZOs4J0F8A6mKRjg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195585936},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"63f4f5e6f614eeb36bc4fbe79e0b20e7da047332","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.25.0_1778048742251_0.07268920830166681","host":"s3://npm-registry-packages-npm-production"}},"3.25.1":{"name":"routiform","version":"3.25.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.25.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"df025dc802a1cb4102877a40859cae07bd49c272","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.25.1.tgz","fileCount":6980,"integrity":"sha512-VvK+5oOPK8aufyEl1vAe3roWBdBv3Md+k/bZfM3fvljQ7pqBenawWLUR84ikWIn/sQAwheXdnAH8RkjExbl61A==","signatures":[{"sig":"MEUCIHHoniAjUIEITcKiY4EIn9JK6VXeyTTE02MyaQ19fDtMAiEA6BnxK8TptDhN2ZSDY0fQX+J7eBIOL2RL2sF/fBss7OA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195586369},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"4dc374e7564d963b5937a1085675b7c0589367cd","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.25.1_1778050098261_0.6707744462817435","host":"s3://npm-registry-packages-npm-production"}},"3.25.2":{"name":"routiform","version":"3.25.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.25.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"18451547934070ab80f826bd22632b5ceba9fcd9","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.25.2.tgz","fileCount":6980,"integrity":"sha512-HjG6P7IEEKjDtkoc3GmbgkldJUzPrwqBJjpxv//OEVQxmutU+KlUdMKANq3vGf/qFzp4FkP1DV9K15ocJfzFSA==","signatures":[{"sig":"MEQCIDBTEtyusnpv6hWTFLjJzDrDDmAwd6wU569/0vauxoixAiB9wrKR4J6sJbKsNgIUD5LA/55zT01+/ZGhNW160rpq0g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195587541},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"37646ebc68d9703afaae0a1f24ad009fd6f95ba2","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.25.2_1778061114779_0.21753899660635034","host":"s3://npm-registry-packages-npm-production"}},"3.25.3":{"name":"routiform","version":"3.25.3","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.25.3","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"a18979d137b41bbd8937a5524f40c7e95f673955","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.25.3.tgz","fileCount":6981,"integrity":"sha512-bzK2zvj0oG9LPisZ45fB2dnNo42KQfa91KiRRus6Y589J91TFzrjKWjQmLJmgvfa60UkdpC4fCy/LnhATdoRpQ==","signatures":[{"sig":"MEUCIQDIaqHJe1Jz4aPtsxFpLyBRRw3HmMVRxXA3wqdgv3j9wAIgJ8hztChT7bh4syf9lGponiXzqdLn7lwET/oH+dI5ciA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195589879},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"34ffc83c27ecf6a7625461a5254b489034984510","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.25.3_1778729674774_0.6141197456593495","host":"s3://npm-registry-packages-npm-production"}},"3.26.0":{"name":"routiform","version":"3.26.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.26.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"f39060ecde38be55da5852897aaded003819dd04","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.26.0.tgz","fileCount":6981,"integrity":"sha512-G//hi6zjB2atc/wxcVNHMOB8a48PbdkIKmqispmYJQyMW21IsROpe3+Wl172Tm4U0XiJWwEvZuS4wPUAIZIt4Q==","signatures":[{"sig":"MEUCIEJJhZpiuHt0Ldoid7QN0o7XW0WpnKE21X62NS0YYDTyAiEAt0iI2alOjbVvw3z5vsrquB2kTBnoTy70k2QE9uZyMuk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195592896},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"30f713a22de8668cccf91ab0f1f4ec3e5fb9d2f9","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.26.0_1778735264208_0.6593033335675076","host":"s3://npm-registry-packages-npm-production"}},"3.27.0":{"name":"routiform","version":"3.27.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.27.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"258205fc000a6b263d16ad6e4105952cca354f8a","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.27.0.tgz","fileCount":6986,"integrity":"sha512-ERQqrrq5VJqygD57qmxuPYK2NBQyG6KEIs8Au+EsJVcsg1mPE8XSDRbAu9RFO3FoO3t6lJnZ9sJtnbdxoUq3UA==","signatures":[{"sig":"MEYCIQCktOd/XrBqtD0OWX8B17TOeMyEH5IWWF/p0a6W4PVlcQIhAL7AeTXxzaSWvpQDsL2NeYOUWpF38e3963EHbeSyL/Fj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195721283},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"c539db0691c0226b0847c1524acc3420485dc420","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.27.0_1778846769014_0.811380516855547","host":"s3://npm-registry-packages-npm-production"}},"3.27.1":{"name":"routiform","version":"3.27.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.27.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"8496a41d96a4cc8ff172e6629d7203b524813303","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.27.1.tgz","fileCount":6986,"integrity":"sha512-2dRgeQ4Fz7Gq7PIEeGGMADshrG6uXkHL/DuOrgY54dK37zcmdS017rr6inHsy8EntcIEIsD55PpSmyn094WxJQ==","signatures":[{"sig":"MEUCIQDEO5xerjayEDPGmgZzYnPOnmWQ00kDbx4BfHXX2Fx2yQIgKphV8nYF6EEsq4hYAttSjg041QT8Z3cOy02t1+OtWIM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195731231},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"9ca4301536ca8417ec41c0f36f080ec6dd284178","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.11.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.14.1","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.27.1_1778851668030_0.9106715224452488","host":"s3://npm-registry-packages-npm-production"}},"3.27.2":{"name":"routiform","version":"3.27.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.27.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"82b2a503d755acd64de6492802b4712545efd698","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.27.2.tgz","fileCount":6986,"integrity":"sha512-giMiB173CJLxseTbeJV0tw3iwD2dBLUx9N6nXmoSBXZB8bcCAX4H6ow+6FJo0k+GZBVPKLH7VVeClLZgkUCHag==","signatures":[{"sig":"MEQCIDoi6fOP96cY1C8PSK7SmD1u0t1tBAe7l9RvC2qM04F5AiB8jeBDogI3twE2+eiURKtcm6N23wPEuycxUNWLtXRBTw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195740484},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"91d2ff0ed8fb183c8c4f6878eaed617b8d94118d","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.12.1","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.15.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.27.2_1778853763488_0.6056256951255399","host":"s3://npm-registry-packages-npm-production"}},"3.28.0":{"name":"routiform","version":"3.28.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.28.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"9c3059e5baa208648e1994e9e15693f5c3139559","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.28.0.tgz","fileCount":7021,"integrity":"sha512-TYC0V8WH9fTQUfqW8yflbopPSntOMldsQC/96akI5HVQhwPFcw8uy6tYnxBCO3Mw+QD8AGHAZ+VI/pzy5b1U1g==","signatures":[{"sig":"MEQCIBLph2GNDs6eCLTvPF4lCAuqEBHr85e9uKhYoYqS7WknAiAiBj7cV0qBJf2foedwtYCmhLQJetXARmj5aA4u/NT/vA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196524963},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"83dc5965d3526bcdc419c0a3a71e42cf8b2739c3","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.12.1","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.15.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.28.0_1779251295234_0.11058379994720324","host":"s3://npm-registry-packages-npm-production"}},"3.29.0":{"name":"routiform","version":"3.29.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.29.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"75d76afaedaaf6b9ae45d9efa2c2f63236c5a047","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.29.0.tgz","fileCount":7021,"integrity":"sha512-nRXZ1nHyTKl7Zn/vUa1UJLfowd+FaV+x7MPZMoq4bm0NlVGzu7uhRSRtjnVC7+vfwly+s7ExRR9XkZklnyGdDA==","signatures":[{"sig":"MEUCIHAbnz0ET4Tto79+6xCI+vu3BdGczjyQ2wc5+eYS240aAiEA+WFb978ptcconrrMK59zZan7opJKr5FYO5eSIsRMa28=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196526633},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"1627dcb8b3cf0cd9ccfb3aece1197723424b25b8","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.12.1","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.15.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.29.0_1779253139568_0.8569990871427033","host":"s3://npm-registry-packages-npm-production"}},"3.29.1":{"name":"routiform","version":"3.29.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.29.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"c8ac10514a2c6c3419a8168bc5328c43f031f6a7","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.29.1.tgz","fileCount":7025,"integrity":"sha512-J3IHvp8nbHYZVMkJpiEbjrX5QLrHCVoFqijN0DWwbYvmI56lX8OY6TsqedHd4AX2d/BKiS48EmTkKd46r4M+XQ==","signatures":[{"sig":"MEYCIQCP73CVZ8NrKxEkeCa7XhC7M00L09l/gfsTXUQbjloA6gIhAJBVDAv/ooEdFce7UjCLizWOoTeL42MOpL3aF2+60IgV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196585774},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"8099255cd919ebd3d1d2c4d1fe6af53d30da16a9","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.12.1","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.15.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.29.1_1779261932589_0.652116455180547","host":"s3://npm-registry-packages-npm-production"}},"3.29.2":{"name":"routiform","version":"3.29.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.29.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"147e7a678209f663ff2dd468d6121b5b1ddd4a68","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.29.2.tgz","fileCount":7025,"integrity":"sha512-8tikchzQdvmH+4mqihj01t6tDBs9if3Wnqy3VqeX+w87XmHs00LqQMErTr+I4JoLiol6QwXqsnxnc1eDHpZr0w==","signatures":[{"sig":"MEUCIG2QlXfz61SGPnsfGwuLAAuje5G4zzg0cnsblt3t8/paAiEA7dcLjCWK1WqLxFD0Jxaxvk1WXdGzf3GhJYsxTZNheQ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196586392},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"9d0bfb17358be63c2e2b4cf394ad7011edac6130","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.12.1","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.15.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.29.2_1779456242322_0.545516056328653","host":"s3://npm-registry-packages-npm-production"}},"3.30.0":{"name":"routiform","version":"3.30.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.30.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"433447e51de7b6fb5e319ab77fdeb095e80bc97e","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.30.0.tgz","fileCount":7031,"integrity":"sha512-etyOVDVUT70yFl7BrROh/DN0I7CyYBcio7bTPC8QYaDrr6ycnbwGzxW5lOYN1nNn8m3hcw9AnHnnX79pW4ybYg==","signatures":[{"sig":"MEUCIQDX6FLFaGoub55THwbnI8cuNJBFA8mv0gX7rg0dBecGVAIgZMkk4wh4E7hzkL7cy9wfvFQjeeEAS/26YyaEuesaq+4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197004039},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"3f41a3fbab5bfdfe1d1ea7fb9cc6b900b5706662","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.12.1","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.15.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.30.0_1779599838351_0.19512329873684253","host":"s3://npm-registry-packages-npm-production"}},"3.30.1":{"name":"routiform","version":"3.30.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.30.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"dc051dc5fc6e4e2bede1d833a115d2f5c38629d1","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.30.1.tgz","fileCount":7034,"integrity":"sha512-uY+kalqDfJRfbL/zXO7BZqIfuKDsYodz8qKM6FNr57cXlWbXY5N/nAYneJOCREx91HFrrGv+VL26aodQhV0zlQ==","signatures":[{"sig":"MEYCIQC4jvneOyY9kEAWokXywFgWcXuvzaZ/RbRZPn63OeuO5gIhAPQL25QHugZ1XCnrvQZGWINUuTqcXDd+Nwm28MmmP5oC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197053420},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"0c40037b8bf86cc40947dcd45ae0b0903c6244e8","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.12.1","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.15.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.30.1_1779605955242_0.17657809587331097","host":"s3://npm-registry-packages-npm-production"}},"3.30.2":{"name":"routiform","version":"3.30.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.30.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"a3676e04ee027a12ee894d67fd0f722936ef500b","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.30.2.tgz","fileCount":7038,"integrity":"sha512-JS9vBmW8w3Xc8AerRx7qqnM9eWiqOUIzGE8QXl5xq5KIJVRGmWFACZjQbH4nSGc0lELot4o3rNrE6vMvNA8Esw==","signatures":[{"sig":"MEQCIB5oqoVCXaMt/KbR8q8rUH1ZDQkMwCA5miAQohdOvbliAiBAkQgzEV7dqq/eVKy2GzPRxuGaZrOGH0LoXrSleUHX9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197273398},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"8301ce149cbd276b12b3455d1e6a98d1d4758b50","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.12.1","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.15.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.30.2_1779616508587_0.3218838643512878","host":"s3://npm-registry-packages-npm-production"}},"3.30.3":{"name":"routiform","version":"3.30.3","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.30.3","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"93a9d528142a8391055d91f4f1914b84ea4461ad","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.30.3.tgz","fileCount":7038,"integrity":"sha512-zDrA7bgaq01Rbj+0tU/fA9Kr8HZoZis0rw+LgYKFzhfCD/maEsk1qpmyv4wRYOPukwxi7DwTVZJfaOEq0iQOZw==","signatures":[{"sig":"MEUCIChT9z/zuhVqCtXyejJajrIhsz5QzpgU5bo9LgVhlDTLAiEAgeoAXgSvj+tb+wTzv70/drMZMW7Ha1YyQ79I0j8a57U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197288448},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"5f93bc9af62649ac7db72e01fa74e27ace8a85ed","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.12.1","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.15.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.30.3_1779724167674_0.19174263126693436","host":"s3://npm-registry-packages-npm-production"}},"3.30.4":{"name":"routiform","version":"3.30.4","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.30.4","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"99379fa2e151848b8fae8ea0abab9a62af891c5a","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.30.4.tgz","fileCount":7044,"integrity":"sha512-CTYbECF/GWS7E5aCgBtC/gpXxcJLMXj02ZeQpyrEvUmDX/c4VTNzp5EDY3Pjct6+aeWsHA3Ioxr/3MpYABZddw==","signatures":[{"sig":"MEQCIGSwsq5lRtgM9pqVMI0HoMY/W5xHJlI5G3C0N6aZHGtsAiA9XFqknRt0cxKL1qRSG1tqnC2rVwbuIBEqABgV054AqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197414245},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"0120cbdd1d4e3635cc2a1e4600163bd8f0aadf0f","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.12.1","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.15.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.30.4_1779936804194_0.38893727338138184","host":"s3://npm-registry-packages-npm-production"}},"3.31.0":{"name":"routiform","version":"3.31.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.31.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"c633dc9e53664f90f3cae6bc1259cdbd4e95ef2a","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.31.0.tgz","fileCount":7056,"integrity":"sha512-m3IOxzpy3qpfIPoBwLPduanu12JwHiroDq9utmHAmwjH3TAjh94PmADVQ49EUytnetyHKzbmhwTVGzOANxBWkA==","signatures":[{"sig":"MEYCIQCkaqL0Dal2yxCRdlEzAGy+vKLC0G0YX3cIrD3/CjlRRgIhAPbvUSWUPw8UfOyu36/jTwj7pbQ3/oxh3TeSawD/yfEZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198035009},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"f33fccb131c839ef6e767710b19f94f7f2ce8eab","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.31.0_1780026535028_0.5745246728931246","host":"s3://npm-registry-packages-npm-production"}},"3.31.1":{"name":"routiform","version":"3.31.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.31.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"f80da5e1fa61b88ecbb7509240e06d6e8b34e77c","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.31.1.tgz","fileCount":7056,"integrity":"sha512-26xZnLxGRzaGEqUnyGijXhuvRc7rR0obBFE52ICZhTwd5Jgh4WKNJXlBGE7DMgUb3HfUiVA9i/IUiTPeUItAlw==","signatures":[{"sig":"MEUCIQDi6ujLyvgVf074AdDZQf8gsBENPLw/Osx/iUsnBFgljAIgEYrdLITZeeBVe0mmurw5bRzf7tVZUod5CAZmB6snRjk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198208775},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"9c47ea71c82b1f9fe55f7bce3b6b34b3919957c3","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.31.1_1780032724062_0.8973607325894242","host":"s3://npm-registry-packages-npm-production"}},"3.31.2":{"name":"routiform","version":"3.31.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.31.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"b620b6a08218794ba2a4b9e2b353064ec79df35c","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.31.2.tgz","fileCount":7055,"integrity":"sha512-o7BB7n4wfys3ZLOwD30XvJEe4pv2di/fh2hB96L990zHWJ5M6c3DU3wI7U3IrNi3mvH+E9fg8zrTB5nkMKatZQ==","signatures":[{"sig":"MEUCIQCyV5Dt1jgOebCxDdLxRm2nYbX6EfdOecui8jYz6uW4AQIgXi3bogQqSuM0RnliQxmHKqEbaGQz6hy2II7bbVX8/HY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198143740},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"78acb6c7418bec2998f680942d3ee412a7ed71cd","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.31.2_1780035252352_0.6453517626385274","host":"s3://npm-registry-packages-npm-production"}},"3.32.0":{"name":"routiform","version":"3.32.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.32.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"fb664abba20ea7f5797102286514284f13fe0ca9","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.32.0.tgz","fileCount":7056,"integrity":"sha512-wP3aEn0q0oMIr8kSpfLJHlB7WbEe1EFwrYoh8UsbUiD3Re0IKl0cOlmpGfDATvCpPKl38JTPc0AoJlgtkcNPpg==","signatures":[{"sig":"MEUCIHoeOKztjjeaUZa2Doa6R75dGAmI2CoSo7QI3dsN8EyCAiEAmw/V+GskS0o+EaOQyQ5tZ9R6d4owgS96Vk2mrBlvq1U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198171045},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"1c02436f55fe8f0dec58b7c2e07b4ac8aa91b737","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.32.0_1780160357686_0.8201331676402772","host":"s3://npm-registry-packages-npm-production"}},"3.33.0":{"name":"routiform","version":"3.33.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.33.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"6ac8313417b42af37b22635e2201f0a11c62c9d3","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.33.0.tgz","fileCount":7074,"integrity":"sha512-oTqn86GkVa11rfW43k9/1QXIDnlmT0oZV54WxbJU809RYh+zUtHHw8bwa/V2GvbNkMFrkv/RkvlNPSZY3foghw==","signatures":[{"sig":"MEUCIFtISGv3Ce6Hmb9q/0cg6px+WpUCDhYpxqHgtZwJHBcgAiEAtD5RD6/gOHikt+e97Va3y1f3qV3ZYtM0xz8mITiPd8A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198502597},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"d1bdfb4ec12df85fcf418aa7d2bf7c9185711c2f","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.33.0_1780225384004_0.9290437971880317","host":"s3://npm-registry-packages-npm-production"}},"3.34.0":{"name":"routiform","version":"3.34.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.34.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"a01cf3a1da52b3e4eb5d6c84f56c7804b41ec219","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.34.0.tgz","fileCount":7075,"integrity":"sha512-nREbTsszWgo4MopBsx+hfU5aanB67/Fnn09m7SoUFgSRvZKyPscxtXt4amL8f+U6T2BF7n+Y6YeyBPFOqWUCBw==","signatures":[{"sig":"MEUCIQCfE+pTgn3z2i3X1HiALn3786Wo7/9YH8ydQsoWeEPzxgIgXriKxYBsUQs7pac3DYBJmCbGTnbAB/hLG3HO5RfkqWM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198533022},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"2e6e08d8af549a0c46a7b0aee07e0291c5f84d3c","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.34.0_1780300022017_0.22311398050654097","host":"s3://npm-registry-packages-npm-production"}},"3.35.0":{"name":"routiform","version":"3.35.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.35.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"da90eedc4fb9ca1c969c95a5da693631a8963bdf","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.35.0.tgz","fileCount":7112,"integrity":"sha512-eKMUgNfvPJMdEt5KUXB42SjfKcoJ84umCsno2v49mxInXxvfsWiDVdh2EKIlxMOTLzteTUATdqbiv/UgP8g3FA==","signatures":[{"sig":"MEQCIFFkyK741KxAQHMBbU30SnWhijcK9wVxpKPCnYUR1WM9AiBR3prMkB33uBNdVpgBGamsp5rZDc7PLZG15jwKuaWT2A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199082007},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"e33ef0b00b5e920c4f71a6a16468d0b4c4e75a00","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.35.0_1781876486907_0.05183179577385477","host":"s3://npm-registry-packages-npm-production"}},"3.35.1":{"name":"routiform","version":"3.35.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.35.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"1d0c99d41ca2400f30eeb7468259d32368b41b2e","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.35.1.tgz","fileCount":7112,"integrity":"sha512-zyhJOfm48N2XVvGQfOf9luZhRZ69MQujG2D05fibFa+Ll8rXeXYjOa9VjrqaprpdUm9Ua6jWTGUv5BmeDf+fjQ==","signatures":[{"sig":"MEUCIEvMofGD4/RsPYJ9UVI7qMr3934c+jT0+RBCfQI+FqU5AiEArDafF8JPlxosKAWWjAUegpLsSrEqaiS2Q8THdmkS8yI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199086214},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"2edaa450af536c59f5e0c0a70b835b8462e9aca7","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.35.1_1781880775461_0.08595726090428069","host":"s3://npm-registry-packages-npm-production"}},"3.35.2":{"name":"routiform","version":"3.35.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.35.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"32c43a5b9ecbcd3b365ef0a2017bc0a99871766c","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.35.2.tgz","fileCount":7112,"integrity":"sha512-qBbUU1hw8yaux4RW1TMg3WlQLq+0xGxMzMnf9oRlqxq4Le7OHQnCPqF4zsyt2hYGXKiLA4YdnEESkDHJ2AvXSg==","signatures":[{"sig":"MEUCIBAZrJEkRh54mXVLK9Umdg4EyNeWITvTv9hG8IvATn/fAiEAi3cr8UrcL8Q+kjLEecSI4K0w5iu3rKvamHl2qduZy+8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199086761},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"9820dffd5bfd65074e9f508768edd7a065b8d247","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.35.2_1781921638834_0.20925037837319782","host":"s3://npm-registry-packages-npm-production"}},"3.36.0":{"name":"routiform","version":"3.36.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.36.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"0eac721611598f5737f829415a78139bfba57926","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.36.0.tgz","fileCount":7137,"integrity":"sha512-bDvI2v5b4i8fxAg4qcT2Q0OCZAVNmdffVT86mLB+U/CNgFmAVVwNbr4zpoNIVGOnI7OAFJ5Ja78lTcDcrYLrcg==","signatures":[{"sig":"MEUCIQDl2FMCcWEvAba2TJAPoaw1SM0LRxOTREbpddOWKKIdigIgSXzyB0ln71hSEMzZfkTTiryLhq6C/NmXpTci7pDVF/c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199333031},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"aad81804323d0e2a90cb578b0cc989f3b4b8004f","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.36.0_1782043472528_0.6917842914741168","host":"s3://npm-registry-packages-npm-production"}},"3.36.1":{"name":"routiform","version":"3.36.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.36.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"b699588d97ac441b0720ff1acbaa4518f9ed2116","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.36.1.tgz","fileCount":7141,"integrity":"sha512-kMpoCqEtSyx2udTRg+xjU6ZF7R+S7pSsdERPrdWEAJS34a9eNIqCRkr/2gXt5RFVZynkvm9edcbHFrWIXr0Lrg==","signatures":[{"sig":"MEQCID6BJwmLDJXXPxm2+JTi7q5zmlKH58w6HP6TI7NtDfOBAiBr+Kh9AzuK/C4tAsWBzJ/dc4x5DvlVpxbeUEV+2A2KdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199381297},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"c32772a1f4f4531671f8c4c1aefe442d5ec08869","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.36.1_1782048760320_0.45946997262549294","host":"s3://npm-registry-packages-npm-production"}},"3.36.2":{"name":"routiform","version":"3.36.2","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.36.2","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"cfa50aa9ebe507bc2891eb66cdeb18abd1dd4c3d","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.36.2.tgz","fileCount":7141,"integrity":"sha512-6KPMy/AndBkAPWzRAiLR9EhKyaQ+Kp1QccddTU03aPk+yd6EZzyD2h4/yGZc0C6FSIEpxzzM5t4L3TTMzs9XvQ==","signatures":[{"sig":"MEUCIQDiCrCLvhqpM+1k83SsYX2xSPMX0/gJVjfbtp3BnDvhmAIgKeiWOre9iLDUSGVK3F4Xgpw2W7Ak3TzKFY2wTHxhoAM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199381925},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"f62e74c1deb1ad836197c14b974a9afae8b91d92","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.36.2_1782094045251_0.8866636400931587","host":"s3://npm-registry-packages-npm-production"}},"3.36.4":{"name":"routiform","version":"3.36.4","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.36.4","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"54ced9d849a29d5a90b4824dead85b8e964a60cd","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.36.4.tgz","fileCount":7141,"integrity":"sha512-g4Ol7HYgvNkDpcMAbed68ryxzc/v7v5AEC0Os5Zv33Kh3y8s6I7OBxM2sYJTc8cKCqcWTBS3llVaie9Np5Dibg==","signatures":[{"sig":"MEQCIFxXEBSHT71MhO9ogs2CU/GgW7Qk9XePyyb4MtwGvU/mAiAGP+CEa7ktS73RX7kRo0vSOHs2V8Rm6/43rkTWMWO0SQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199382775},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"5958ae40d5e1c25b6916ea8c9e9db6186f449c93","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.36.4_1782095490238_0.09015142384527364","host":"s3://npm-registry-packages-npm-production"}},"3.36.5":{"name":"routiform","version":"3.36.5","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.36.5","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"bb6f7392db81a73eaede2bc4f3c08733ace3b8bc","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.36.5.tgz","fileCount":7141,"integrity":"sha512-/xSxzhM5yamS89Rv+w0Ot+kgIaXKcFcRDEcB1QbN2MKoXayhX9eyD7MkxlXgtCGV/SSr7V7kOqPcz/6xaXR07w==","signatures":[{"sig":"MEYCIQDwDNwCUpR3uVzqJ25vxj6iYN5dvkhV7TaSw+kwY0NSBgIhAIGESs/7hUB5YppFjCsmiryWko8YLwiEqo3dw3OkZ1Ps","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199383117},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=18.0.0 <25.0.0"},"gitHead":"b87296dcafc65755846fa62fb8af4a09202c8551","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.13.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.16.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.19.2","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.36.5_1782098335048_0.1800664719195153","host":"s3://npm-registry-packages-npm-production"}},"3.37.0":{"name":"routiform","version":"3.37.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@3.37.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"5058d2f5a3e10e6d61728686890b48b391d846f9","tarball":"https://registry.npmjs.org/routiform/-/routiform-3.37.0.tgz","fileCount":7214,"integrity":"sha512-5PJyuoeTv3NLQfHi5PWcSohmnFgjoISizvrl4YYrXodBncdvTnPDs5MXh9rcfeZ9sXLHAGLY6MbC4PYGJl9xSg==","signatures":[{"sig":"MEUCICcbTtQHcYBXu7DIVNUOe+WRnZgoGScW23CFEIFR0lULAiEAltrFEDgcyuYreg1lQuimWb7y70CRIGwTxopp7PiSTN4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201300142},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=22.0.0 <23 || >=24.0.0 <27"},"gitHead":"196c515f76d3b5c7fe03354ea5a56ae7face1ffe","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.16.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.18.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.28.0","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_3.37.0_1783944219429_0.2279735131228784","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"routiform","version":"4.0.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@4.0.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"366a1aed4b8cb9d85d4f0896a457070c059b44ba","tarball":"https://registry.npmjs.org/routiform/-/routiform-4.0.0.tgz","fileCount":12431,"integrity":"sha512-ONkYbfMrqgvHPvqzmc1imI8QnfwPuFlPi+y5ZCkcUIEXSfnEY4QFcMSu9qhF1MHR+megKENfCBXUASSuCURLAA==","signatures":[{"sig":"MEYCIQDoE2RviObe27UJCnIWbJxvD0m8g6D7Xy86u/Q8UgaS7QIhAMxe/PAkQxBtjYAvxQCuHFCtd+cl0nR5QzF475IH2POO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":345299905},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=22.0.0 <23 || >=24.0.0 <27"},"gitHead":"b1c82df3d0af0e685864702559dce3ab656e0615","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","owui:build":"bash scripts/build-owui.sh","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.16.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.18.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.0.10","open":"^11.0.0","pino":"^10.3.1","uuid":"^13.0.0","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.4","undici":"^7.28.0","express":"^5.2.1","js-yaml":"^4.1.0","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.4","socket.io":"^4.8.3","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.19","monaco-editor":"^0.55.1","@lobehub/icons":"^5.0.1","better-sqlite3":"^12.6.2","node-machine-id":"^1.1.12","https-proxy-agent":"^8.0.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^3.0.5","@ai-sdk/openai-compatible":"^3.0.7","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","jsdom":"^29.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^1.7.15","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^9.2.1","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.0.10","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^6.9.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_4.0.0_1784038086932_0.37353428053406934","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"routiform","version":"5.0.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@5.0.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"c789bcd4e20eb19b158ca91c94c88035da89a0db","tarball":"https://registry.npmjs.org/routiform/-/routiform-5.0.0.tgz","fileCount":12367,"integrity":"sha512-cNL1DN7hiioImM1qbhofmczApwAmaTF0KunmURXCgiBVReC6cYiaSYQtYsUc3u+5g6KTh/gTb2mMUEtrOSvAIQ==","signatures":[{"sig":"MEUCIBTYJGH1Zvb+hfwwwoJv+Pbv1O6iP+t78KlbAIAwTIBKAiEAjCwa7iR+YzU4P+H9cBiDrAJ9Bu02WJv0xB95a5Nef3g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":343610561},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=22.0.0 <23 || >=24.0.0 <27"},"gitHead":"0e32e9e60a918f725ea78e30c75c9772233bb613","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","owui:build":"bash scripts/build-owui.sh","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","check:audit":"node scripts/check-audit.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","check:middleware-matcher":"node scripts/check-middleware-matcher.mjs","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.16.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.18.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.2.12","open":"^11.0.0","pino":"^10.3.1","uuid":"^14.0.1","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.8","undici":"^8.9.0","express":"^5.2.1","js-yaml":"^5.2.3","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.8","socket.io":"^4.8.3","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.23","monaco-editor":"^0.56.0","@lobehub/icons":"^5.0.1","better-sqlite3":"^13.0.2","node-machine-id":"^1.1.12","https-proxy-agent":"^9.1.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.2.0","@ai-sdk/openai-compatible":"^3.0.7","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","jsdom":"^30.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^2.1.10","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^26.1.2","lint-staged":"^17.3.0","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^10.0.4","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.2.12","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^7.0.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_5.0.0_1785922819210_0.9533138226551514","host":"s3://npm-registry-packages-npm-production"}},"6.0.0":{"name":"routiform","version":"6.0.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@6.0.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"1e9fcc23fe40fe058ee4948dd37422cbde7ad0e0","tarball":"https://registry.npmjs.org/routiform/-/routiform-6.0.0.tgz","fileCount":12405,"integrity":"sha512-3u80bTT/4nZFgoEBfyZtr9HD+lq9g3rTc1+2AARXax5wOYcOFx7E9C+P9U3uXQzNBlYEr3VpB5oSimyC+5GcIQ==","signatures":[{"sig":"MEUCIQC//msKxX2PLk9nB3EY3BMNJ7G6SHKsGlVkC1J2leLMuwIgPoAALxErAqAoN12ZaFWGzUQKf244D45xduKnSwV+f8w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":344972700},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=22.0.0 <23 || >=24.0.0 <27"},"gitHead":"62487c6f856a3b08f63a455d43afae9377dae3d9","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","owui:build":"bash scripts/build-owui.sh","test:fixes":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","check:audit":"node scripts/check-audit.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","check:middleware-matcher":"node scripts/check-middleware-matcher.mjs","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.16.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.18.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.2.12","open":"^11.0.0","pino":"^10.3.1","uuid":"^14.0.1","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.8","undici":"^7.29.0","express":"^5.2.1","js-yaml":"^5.2.3","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.8","socket.io":"^4.8.3","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.23","monaco-editor":"^0.56.0","@lobehub/icons":"^5.0.1","better-sqlite3":"^13.0.2","node-machine-id":"^1.1.12","https-proxy-agent":"^9.1.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.2.0","@ai-sdk/openai-compatible":"^3.0.7","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","jsdom":"^30.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^2.1.10","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^26.1.2","lint-staged":"^17.3.0","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^10.0.4","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.2.12","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^7.0.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_6.0.0_1786178356737_0.3054675134035214","host":"s3://npm-registry-packages-npm-production"}},"6.0.1":{"name":"routiform","version":"6.0.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@6.0.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"354a8a3cef5bdd80af8b935a2c14cf381e211422","tarball":"https://registry.npmjs.org/routiform/-/routiform-6.0.1.tgz","fileCount":12406,"integrity":"sha512-nSdGgBDy3r2Nv1Uxvw6dQ/RFQmITCoHATmqNdTEVC55VEZ62ukeK/zYMZkCDvk2S52YdyC0Z/C+y7UJtb5Pxnw==","signatures":[{"sig":"MEQCIHMADxLC4Igi6Pib1oEfSvVpmmGUvCDvnY+SDy7/S6fdAiB2ZCRwcOyDL2s/etM3lSkzTXH4om1yhZ9tXaq+oR3w3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":345011670},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=22.0.0 <23 || >=24.0.0 <27"},"gitHead":"bd30c754a07963dd8010423df6918ff915b7fc9f","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","owui:build":"bash scripts/build-owui.sh","test:fixes":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","check:audit":"node scripts/check-audit.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","check:middleware-matcher":"node scripts/check-middleware-matcher.mjs","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.16.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.18.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.2.12","open":"^11.0.0","pino":"^10.3.1","uuid":"^14.0.1","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.8","undici":"^7.29.0","express":"^5.2.1","js-yaml":"^5.2.3","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.8","socket.io":"^4.8.3","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.23","monaco-editor":"^0.56.0","@lobehub/icons":"^5.0.1","better-sqlite3":"^13.0.2","node-machine-id":"^1.1.12","https-proxy-agent":"^9.1.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.2.0","@ai-sdk/openai-compatible":"^3.0.7","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","jsdom":"^30.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^2.1.10","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^26.1.2","lint-staged":"^17.3.0","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^10.0.4","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.2.12","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^7.0.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_6.0.1_1786434936515_0.43742532804546275","host":"s3://npm-registry-packages-npm-production"}},"6.1.0":{"name":"routiform","version":"6.1.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@6.1.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"1687c6a62fa350049f0c8530f572f49f4f260dae","tarball":"https://registry.npmjs.org/routiform/-/routiform-6.1.0.tgz","fileCount":12424,"integrity":"sha512-35b0n+57NV2GiLCsHC+O0+abxK29b9FpA/vWND9Oht6nbGhjXBXJ+sY6i+cQrtetHX/+FxUOEMRRDec8bwNKyA==","signatures":[{"sig":"MEQCIDGhnpmRYKw0SSYnIXHpx7/Xn9CLIloiOcMMfIfWlpVhAiBokQnGgbWKGPcK63YaClPZSl+d63TI2PNi3waqLgQmiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":345483669},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=22.0.0 <23 || >=24.0.0 <27"},"gitHead":"3afd8f0666169e1a689758d09f02fe3dbd9bef17","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","owui:build":"bash scripts/build-owui.sh","test:combo":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/combo-*.test.mjs","test:fixes":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","check:audit":"node scripts/check-audit.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","check:middleware-matcher":"node scripts/check-middleware-matcher.mjs","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.16.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.18.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.2.12","open":"^11.0.0","pino":"^10.3.1","uuid":"^14.0.1","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.8","undici":"^7.29.0","express":"^5.2.1","js-yaml":"^5.2.3","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.8","socket.io":"^4.8.3","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.23","monaco-editor":"^0.56.0","@lobehub/icons":"^5.0.1","better-sqlite3":"^13.0.2","node-machine-id":"^1.1.12","https-proxy-agent":"^9.1.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.2.0","@ai-sdk/openai-compatible":"^3.0.7","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","jsdom":"^30.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^2.1.10","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^26.1.2","lint-staged":"^17.3.0","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^10.0.4","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.2.12","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^7.0.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_6.1.0_1786698999379_0.35215491164475266","host":"s3://npm-registry-packages-npm-production"}},"6.2.1":{"name":"routiform","version":"6.2.1","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@6.2.1","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"b4a323ac94c407ee805fcff20f589e3a72f1f2f6","tarball":"https://registry.npmjs.org/routiform/-/routiform-6.2.1.tgz","fileCount":12442,"integrity":"sha512-WY6YBcKGQ2RGbWGq7ohsqpEsV/MjIW9rxw/ixY0fBYqke3PxnxXdxDK60uloJvb8NoLqeAk3rct00QsSQaGa0A==","signatures":[{"sig":"MEUCIARZwdt3kNJiT51mZwyMbngL7nlOq0zeoieB5GBxMGBwAiEArMvNbF4p4sc+h/i/LDKhuDaHYs9pJUNVMk62frimnDk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":345519559},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=22.0.0 <23 || >=24.0.0 <27"},"gitHead":"6a3af16f146f70120653fd697a65a226650b409d","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","owui:build":"bash scripts/build-owui.sh","test:combo":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/combo-*.test.mjs","test:fixes":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","check:audit":"node scripts/check-audit.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","check:middleware-matcher":"node scripts/check-middleware-matcher.mjs","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.17.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.19.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.2.12","open":"^11.0.0","pino":"^10.3.1","uuid":"^14.0.1","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.8","undici":"^7.29.0","express":"^5.2.1","js-yaml":"^5.2.3","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.8","socket.io":"^4.8.3","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.23","monaco-editor":"^0.56.0","@lobehub/icons":"^5.0.1","better-sqlite3":"^13.0.2","node-machine-id":"^1.1.12","https-proxy-agent":"^9.1.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.2.0","@ai-sdk/openai-compatible":"^3.0.7","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","jsdom":"^30.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^2.1.10","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^26.1.2","lint-staged":"^17.3.0","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^10.0.4","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.2.12","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^7.0.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_6.2.1_1787727022361_0.40048205364053047","host":"s3://npm-registry-packages-npm-production"}},"6.3.0":{"name":"routiform","version":"6.3.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@6.3.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"2eb6e0f2d6b632f75910fa9b76572accb1ea1c34","tarball":"https://registry.npmjs.org/routiform/-/routiform-6.3.0.tgz","fileCount":12576,"integrity":"sha512-3caKzpK8/tbesGnkITbByilxmueG92dgLD4MJzE83wkrpJef/6a7gOy0tGaaVgB11n/n7cbNom7vnDrkM9Q0DA==","signatures":[{"sig":"MEUCIQDneMw1SvSei1qymBKFLq91TsvWr2oeZ5gZaqokIx5r3wIgMNy0CraawxfrUbxQATb2TLj5HXOOKk6E2YhecuG/l3A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":348157771},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=22.0.0 <23 || >=24.0.0 <27"},"gitHead":"19f4c00f53ca4ebd9ba0e3919f46ca6641e6b200","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","owui:build":"bash scripts/build-owui.sh","test:combo":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/combo-*.test.mjs","test:fixes":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","check:audit":"node scripts/check-audit.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","check:middleware-matcher":"node scripts/check-middleware-matcher.mjs","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.17.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.19.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.2.12","open":"^11.0.0","pino":"^10.3.1","uuid":"^14.0.1","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.8","undici":"^7.29.0","express":"^5.2.1","js-yaml":"^5.2.3","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.8","socket.io":"^4.8.3","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.23","monaco-editor":"^0.56.0","@lobehub/icons":"^5.0.1","better-sqlite3":"^13.0.2","node-machine-id":"^1.1.12","https-proxy-agent":"^9.1.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.2.0","@ai-sdk/openai-compatible":"^3.0.7","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","jsdom":"^30.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^2.1.10","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^26.1.2","lint-staged":"^17.3.0","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^10.0.4","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.2.12","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^7.0.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_6.3.0_1787823893087_0.4714931355740566","host":"s3://npm-registry-packages-npm-production"}},"6.4.0":{"name":"routiform","version":"6.4.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@6.4.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"6c70fa944aeb06d151afcd1786ef6fedd19d3da0","tarball":"https://registry.npmjs.org/routiform/-/routiform-6.4.0.tgz","fileCount":12586,"integrity":"sha512-vlAuuuJo8mW0to1Iv2pATnJ/0bbSlccLeA7csA4oiVehO2JRsnFeMR3fpv6p0B2Z4UuVWnib0pulxtmX6DIqFg==","signatures":[{"sig":"MEUCIArLu/EwiOPbKpGgWRbkOryF6tY40aV6D/u5f8fvbDlyAiEA6x+RWTu+6eC6Qh3PYXrhnokgEfdLXz81BrLIx6hJnP4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":348379094},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=22.0.0 <23 || >=24.0.0 <27"},"gitHead":"aa67ed643eecc65234f68f07eb7ed7e8cf1a5772","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","owui:build":"bash scripts/build-owui.sh","test:combo":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/combo-*.test.mjs","test:fixes":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","check:audit":"node scripts/check-audit.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","check:middleware-matcher":"node scripts/check-middleware-matcher.mjs","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.17.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.19.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.2.12","open":"^11.0.0","pino":"^10.3.1","uuid":"^14.0.1","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.8","undici":"^7.29.0","express":"^5.2.1","js-yaml":"^5.2.3","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.8","socket.io":"^4.8.3","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.23","monaco-editor":"^0.56.0","@lobehub/icons":"^5.0.1","better-sqlite3":"^13.0.2","node-machine-id":"^1.1.12","https-proxy-agent":"^9.1.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.2.0","@ai-sdk/openai-compatible":"^3.0.7","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","jsdom":"^30.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^2.1.10","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^26.1.2","lint-staged":"^17.3.0","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^10.0.4","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.2.12","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^7.0.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_6.4.0_1787908401908_0.1955498139923626","host":"s3://npm-registry-packages-npm-production"}},"6.5.0":{"name":"routiform","version":"6.5.0","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"name":"linhnguyen-gt"},"license":"MIT","_id":"routiform@6.5.0","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"homepage":"https://github.com/linhnguyen-gt/Routiform","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"5e13b872f2511bd3e555f9686e21c3c2143c8f3d","tarball":"https://registry.npmjs.org/routiform/-/routiform-6.5.0.tgz","fileCount":12591,"integrity":"sha512-QqdGs1GfTvw4cD6lFFY9qAUfeiU0Mb96Owog2FwlPaj0uG/Nwv5RrJMGlSE4iP40HqtCi/z5yWj9Ih9FEfAVaA==","signatures":[{"sig":"MEYCIQDp+kr7NdW++I4+MXkDVWd0AVQwx9yflt+nuappEEGoJwIhAI8dxlUfaGQG2JW8ZRNGaRaFAzL0R2rMGs3kt67s6+9R","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":348559700},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"type":"module","engines":{"node":">=22.0.0 <23 || >=24.0.0 <27"},"gitHead":"db7576a559c36eef958c28c0910535406ac08dfd","scripts":{"dev":"node scripts/run-next.mjs dev","lint":"eslint .","test":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","build":"node scripts/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/run-next.mjs start","prepare":"lefthook install","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node scripts/prepublish.mjs","test:unit":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","dev:unlock":"node scripts/clear-next-dev-lock.mjs","owui:build":"bash scripts/build-owui.sh","test:combo":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/combo-*.test.mjs","test:fixes":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:plan3":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","check:audit":"node scripts/check-audit.mjs","postinstall":"node scripts/postinstall.mjs","system-info":"node scripts/system-info.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","check:cycles":"node scripts/check-cycles.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:security":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","prepublishOnly":"npm run build:cli","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","check:docs-sync":"node scripts/check-docs-sync.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","check:middleware-matcher":"node scripts/check-middleware-matcher.mjs","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:route-validation:t06":"node scripts/check-route-validation.mjs"},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"overrides":{"react":"$react","dompurify":"^3.3.2","lodash-es":"^4.18.1","react-dom":"$react-dom","path-to-regexp":"^8.4.0"},"repository":{"url":"git+https://github.com/linhnguyen-gt/Routiform.git","type":"git"},"workspaces":["open-sse"],"_npmVersion":"11.17.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.19.0","dependencies":{"ora":"^9.1.0","tsx":"^4.21.0","zod":"^4.3.6","jose":"^6.1.3","next":"16.2.12","open":"^11.0.0","pino":"^10.3.1","uuid":"^14.0.1","yazl":"^3.3.1","json5":"^2.2.3","lowdb":"^7.0.1","react":"19.2.8","undici":"^7.29.0","express":"^5.2.1","js-yaml":"^5.2.3","wreq-js":"^2.0.1","zustand":"^5.0.10","bcryptjs":"^3.0.3","recharts":"^3.7.0","dompurify":"^3.3.2","next-intl":"^4.8.3","react-dom":"19.2.8","socket.io":"^4.8.3","bottleneck":"^2.19.5","node-forge":"^1.4.0","selfsigned":"^5.5.0","fetch-socks":"^1.3.2","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@swc/helpers":"0.5.23","monaco-editor":"^0.56.0","@lobehub/icons":"^5.0.1","better-sqlite3":"^13.0.2","node-machine-id":"^1.1.12","https-proxy-agent":"^9.1.0","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.2.0","@ai-sdk/openai-compatible":"^3.0.7","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","jsdom":"^30.0.1","eslint":"^9.39.2","vitest":"^4.1.2","wait-on":"^9.0.4","lefthook":"^2.1.10","prettier":"^3.8.1","cross-env":"^10.1.0","prop-types":"^15.8.1","typescript":"^5.9.3","@types/node":"^26.1.2","lint-staged":"^17.3.0","tailwindcss":"^4","@types/react":"^19.2.14","concurrently":"^10.0.4","@types/keytar":"^4.4.0","@types/bcryptjs":"^3.0.0","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.0","eslint-config-next":"16.2.12","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","baseline-browser-mapping":"^2.10.20","@testing-library/jest-dom":"^7.0.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/routiform_6.5.0_1787980944025_0.9326841229719289","host":"s3://npm-registry-packages-npm-production"}},"6.6.0":{"name":"routiform","version":"6.6.0","description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","type":"module","bin":{"routiform":"bin/routiform.mjs","routiform-reset-password":"bin/reset-password.mjs"},"workspaces":["open-sse"],"engines":{"node":">=22.0.0 <23 || >=24.0.0 <27"},"keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"license":"MIT","author":{"name":"linhnguyen-gt"},"repository":{"type":"git","url":"git+https://github.com/linhnguyen-gt/Routiform.git"},"homepage":"https://github.com/linhnguyen-gt/Routiform","scripts":{"dev":"node scripts/run-next.mjs dev","owui:build":"bash scripts/build-owui.sh","dev:unlock":"node scripts/clear-next-dev-lock.mjs","build":"node scripts/build-next-isolated.mjs","build:cli":"node scripts/prepublish.mjs","start":"node scripts/run-next.mjs start","lint":"eslint .","test":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","test:unit":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/*.test.mjs","test:combo":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/combo-*.test.mjs","test:plan3":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","test:fixes":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:security":"cross-env DATA_DIR=.test-data DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test tests/unit/security-fase01.test.mjs","check:cycles":"node scripts/check-cycles.mjs","check:route-validation:t06":"node scripts/check-route-validation.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","check:audit":"node scripts/check-audit.mjs","check:middleware-matcher":"node scripts/check-middleware-matcher.mjs","check:docs-sync":"node scripts/check-docs-sync.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","test:vitest":"vitest run --config vitest.mcp.config.ts","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e","check":"npm run lint && npm run test","prepublishOnly":"npm run build:cli","postinstall":"node scripts/postinstall.mjs","prepare":"lefthook install","system-info":"node scripts/system-info.mjs"},"dependencies":{"@ai-sdk/openai-compatible":"^3.0.7","@lobehub/icons":"^5.0.1","@modelcontextprotocol/sdk":"^1.27.1","@monaco-editor/react":"^4.7.0","@swc/helpers":"0.5.23","bcryptjs":"^3.0.3","better-sqlite3":"^13.0.2","bottleneck":"^2.19.5","dompurify":"^3.3.2","express":"^5.2.1","fetch-socks":"^1.3.2","http-proxy-middleware":"^4.2.0","https-proxy-agent":"^9.1.0","jose":"^6.1.3","js-yaml":"^5.2.3","json5":"^2.2.3","lowdb":"^7.0.1","monaco-editor":"^0.56.0","next":"16.2.12","next-intl":"^4.8.3","node-forge":"^1.4.0","node-machine-id":"^1.1.12","open":"^11.0.0","ora":"^9.1.0","pino":"^10.3.1","pino-pretty":"^13.1.3","react":"19.2.8","react-dom":"19.2.8","recharts":"^3.7.0","selfsigned":"^5.5.0","socket.io":"^4.8.3","tsx":"^4.21.0","undici":"^7.29.0","uuid":"^14.0.1","wreq-js":"^2.0.1","xxhash-wasm":"^1.1.0","yazl":"^3.3.1","zod":"^4.3.6","zustand":"^5.0.10"},"optionalDependencies":{"keytar":"^7.9.0"},"devDependencies":{"@playwright/test":"^1.58.2","@tailwindcss/postcss":"^4.1.18","@testing-library/jest-dom":"^7.0.0","@testing-library/react":"^16.3.2","@types/bcryptjs":"^3.0.0","@types/better-sqlite3":"^7.6.13","@types/keytar":"^4.4.0","@types/node":"^26.1.2","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1","baseline-browser-mapping":"^2.10.20","c8":"^12.0.0","concurrently":"^10.0.4","cross-env":"^10.1.0","eslint":"^9.39.2","eslint-config-next":"16.2.12","jsdom":"^30.0.1","lefthook":"^2.1.10","lint-staged":"^17.3.0","prettier":"^3.8.1","prop-types":"^15.8.1","tailwindcss":"^4","typescript":"^5.9.3","typescript-eslint":"^8.56.0","vitest":"^4.1.2","wait-on":"^9.0.4"},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","routiform","sharp"]},"overrides":{"lodash-es":"^4.18.1","dompurify":"^3.3.2","path-to-regexp":"^8.4.0","react":"$react","react-dom":"$react-dom"},"gitHead":"bd24db0d02129e0c0fa99219ef7085f1b53a2cd8","_id":"routiform@6.6.0","bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-a/TMwO5oCtoxJJtaY0EXfJn+yQYmdj5RDT/DZuAhFD0obZddePe43zJioBZdR2c7szhF5SUIaNHBUP+QGErxsQ==","shasum":"f22d214324b724b70508aef4853ee66ea8266061","tarball":"https://registry.npmjs.org/routiform/-/routiform-6.6.0.tgz","fileCount":12672,"unpackedSize":352335782,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDGP+BssOkIxuNqusSx0FvMU34Aco3CGxKXu3jhLqwVDgIgHWRoLSDL/bpVTTjTmcpzsdI7jInBB/aJvpUabD3DLTw="}]},"_npmUser":{"name":"linhnguyen96114","email":"linhgaster@gmail.com"},"directories":{},"maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/routiform_6.6.0_1788098491504_0.13797856285089316"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-07T08:14:27.364Z","modified":"2026-08-30T14:01:32.831Z","3.6.0":"2026-04-07T08:14:28.987Z","3.6.2":"2026-04-07T08:29:11.430Z","3.6.3":"2026-04-07T08:47:45.492Z","3.6.4":"2026-04-07T12:19:42.422Z","3.7.0":"2026-04-07T16:54:28.606Z","3.7.1":"2026-04-07T17:25:47.342Z","3.7.2":"2026-04-07T17:42:24.174Z","3.8.0":"2026-04-08T16:48:56.487Z","3.8.1":"2026-04-08T17:22:29.587Z","3.8.2":"2026-04-09T05:03:03.053Z","3.8.3":"2026-04-09T06:52:48.531Z","3.8.4":"2026-04-09T13:18:05.902Z","3.8.5":"2026-04-09T15:31:25.689Z","3.8.6":"2026-04-09T15:52:10.241Z","3.8.7":"2026-04-09T16:26:23.696Z","3.8.8":"2026-04-10T08:46:21.877Z","3.8.9":"2026-04-10T10:10:43.050Z","3.9.0":"2026-04-12T01:21:30.302Z","3.9.1":"2026-04-12T03:16:49.269Z","3.9.2":"2026-04-12T03:27:25.478Z","3.10.0":"2026-04-15T06:35:46.664Z","3.11.0":"2026-04-16T11:48:26.110Z","3.11.1":"2026-04-16T23:56:18.761Z","3.11.2":"2026-04-18T06:42:19.847Z","3.12.0":"2026-04-19T13:41:56.378Z","3.13.0":"2026-04-19T14:24:36.999Z","3.14.0":"2026-04-20T11:31:52.807Z","3.14.1":"2026-04-21T03:07:15.221Z","3.14.2":"2026-04-21T05:33:53.483Z","3.14.3":"2026-04-21T06:48:39.916Z","3.14.4":"2026-04-21T12:42:32.200Z","3.15.0":"2026-04-22T06:08:52.681Z","3.16.0":"2026-04-22T14:10:41.792Z","3.16.1":"2026-04-22T15:20:04.109Z","3.16.2":"2026-04-23T05:06:58.998Z","3.17.0":"2026-04-23T09:33:38.173Z","3.17.1":"2026-04-23T15:08:50.400Z","3.17.2":"2026-04-24T05:03:50.652Z","3.17.3":"2026-04-24T07:28:33.030Z","3.18.0":"2026-04-24T14:23:22.826Z","3.19.0":"2026-04-25T05:23:58.485Z","3.19.1":"2026-04-25T10:03:59.833Z","3.19.2":"2026-04-25T10:53:20.240Z","3.20.0":"2026-04-25T17:36:48.830Z","3.21.0":"2026-04-27T07:28:00.550Z","3.21.1":"2026-04-27T07:43:05.517Z","3.22.0":"2026-04-27T08:27:05.907Z","3.22.1":"2026-04-27T08:37:04.020Z","3.23.0":"2026-04-27T15:15:39.363Z","3.23.1":"2026-04-28T07:28:20.772Z","3.23.2":"2026-04-28T09:36:24.558Z","3.23.3":"2026-04-28T10:35:07.501Z","3.23.4":"2026-04-28T13:03:52.533Z","3.24.0":"2026-04-29T06:57:54.280Z","3.24.1":"2026-04-30T04:17:30.800Z","3.24.2":"2026-05-02T15:35:00.754Z","3.24.3":"2026-05-04T04:13:41.965Z","3.25.0":"2026-05-06T06:25:43.903Z","3.25.1":"2026-05-06T06:48:19.815Z","3.25.2":"2026-05-06T09:51:56.346Z","3.25.3":"2026-05-14T03:34:36.331Z","3.26.0":"2026-05-14T05:07:45.940Z","3.27.0":"2026-05-15T12:06:10.721Z","3.27.1":"2026-05-15T13:27:49.569Z","3.27.2":"2026-05-15T14:02:44.967Z","3.28.0":"2026-05-20T04:28:16.146Z","3.29.0":"2026-05-20T04:59:00.431Z","3.29.1":"2026-05-20T07:25:35.347Z","3.29.2":"2026-05-22T13:24:03.171Z","3.30.0":"2026-05-24T05:17:19.293Z","3.30.1":"2026-05-24T06:59:16.269Z","3.30.2":"2026-05-24T09:55:09.426Z","3.30.3":"2026-05-25T15:49:28.501Z","3.30.4":"2026-05-28T02:53:25.052Z","3.31.0":"2026-05-29T03:48:55.925Z","3.31.1":"2026-05-29T05:32:04.963Z","3.31.2":"2026-05-29T06:14:13.251Z","3.32.0":"2026-05-30T16:59:18.601Z","3.33.0":"2026-05-31T11:03:04.889Z","3.34.0":"2026-06-01T07:47:02.895Z","3.35.0":"2026-06-19T13:41:27.930Z","3.35.1":"2026-06-19T14:52:56.392Z","3.35.2":"2026-06-20T02:13:59.843Z","3.36.0":"2026-06-21T12:04:33.809Z","3.36.1":"2026-06-21T13:32:41.197Z","3.36.2":"2026-06-22T02:07:26.147Z","3.36.4":"2026-06-22T02:31:31.332Z","3.36.5":"2026-06-22T03:18:55.874Z","3.37.0":"2026-07-13T12:03:40.263Z","4.0.0":"2026-07-14T14:08:08.012Z","5.0.0":"2026-08-05T09:40:20.289Z","6.0.0":"2026-08-08T08:39:17.823Z","6.0.1":"2026-08-11T07:55:37.624Z","6.1.0":"2026-08-14T09:16:40.552Z","6.2.1":"2026-08-26T06:50:23.450Z","6.3.0":"2026-08-27T09:44:54.230Z","6.4.0":"2026-08-28T09:13:23.091Z","6.5.0":"2026-08-29T05:22:25.109Z","6.6.0":"2026-08-30T14:01:32.674Z"},"bugs":{"url":"https://github.com/linhnguyen-gt/Routiform/issues"},"author":{"name":"linhnguyen-gt"},"license":"MIT","homepage":"https://github.com/linhnguyen-gt/Routiform","keywords":["routiform","ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"repository":{"type":"git","url":"git+https://github.com/linhnguyen-gt/Routiform.git"},"description":"Routiform — Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.","maintainers":[{"name":"linhnguyen96114","email":"linhgaster@gmail.com"}],"readme":"# Routiform\n\n🌐 **Languages:** 🇺🇸 English · 🇪🇸 [es](docs/i18n/es/README.md) · 🇫🇷 [fr](docs/i18n/fr/README.md) · 🇩🇪 [de](docs/i18n/de/README.md) · 🇮🇹 [it](docs/i18n/it/README.md) · 🇷🇺 [ru](docs/i18n/ru/README.md) · 🇨🇳 [zh-CN](docs/i18n/zh-CN/README.md) · 🇯🇵 [ja](docs/i18n/ja/README.md) · 🇰🇷 [ko](docs/i18n/ko/README.md) · 🇸🇦 [ar](docs/i18n/ar/README.md) · 🇮🇳 [hi](docs/i18n/hi/README.md) · 🇮🇳 [in](docs/i18n/in/README.md) · 🇹🇭 [th](docs/i18n/th/README.md) · 🇻🇳 [vi](docs/i18n/vi/README.md) · 🇮🇩 [id](docs/i18n/id/README.md) · 🇲🇾 [ms](docs/i18n/ms/README.md) · 🇳🇱 [nl](docs/i18n/nl/README.md) · 🇵🇱 [pl](docs/i18n/pl/README.md) · 🇸🇪 [sv](docs/i18n/sv/README.md) · 🇳🇴 [no](docs/i18n/no/README.md) · 🇩🇰 [da](docs/i18n/da/README.md) · 🇫🇮 [fi](docs/i18n/fi/README.md) · 🇵🇹 [pt](docs/i18n/pt/README.md) · 🇷🇴 [ro](docs/i18n/ro/README.md) · 🇭🇺 [hu](docs/i18n/hu/README.md) · 🇧🇬 [bg](docs/i18n/bg/README.md) · 🇸🇰 [sk](docs/i18n/sk/README.md) · 🇺🇦 [uk-UA](docs/i18n/uk-UA/README.md) · 🇮🇱 [he](docs/i18n/he/README.md) · 🇵🇭 [phi](docs/i18n/phi/README.md) · 🇧🇷 [pt-BR](docs/i18n/pt-BR/README.md) · 🇨🇿 [cs](docs/i18n/cs/README.md) · 🇹🇷 [tr](docs/i18n/tr/README.md)\n\n**Your agent stops mid-task because one provider rate-limited you.** One outage takes the workflow\ndown, every new provider is another client rewrite and another key to store, and nothing tells you\nwhat the whole thing cost.\n\n**Routiform is a self-hosted gateway that puts all of it behind one OpenAI-compatible `/v1/*`\nendpoint.** Point Cursor, Codex, Claude Code, Cline, an MCP client, or your own app at one base URL:\nit translates the request, picks an account, retries, falls back when a model or a provider dies,\nand logs what that cost.\n\n**59 providers ship in the registry today**, configurable without writing an adapter.[^count]\n\n## Why teams choose Routiform\n\n- **One API surface**: OpenAI-compatible routes for chat, embeddings, images, audio, video, rerank, search, and more\n- **Resilience by default**: retries, multi-account failover, model-family fallback, and emergency fallback\n- **Cost-aware routing**: weighted/priority/P2C strategies, budget controls, and quota-aware decisions\n- **Built for agents**: MCP server (25 tools), A2A v0.3 support, memory, and skills\n- **Operational control**: dashboard for providers, combos, keys, usage, logs, and endpoint health\n\n<div align=\"center\">\n\n[![npm version](https://img.shields.io/npm/v/routiform?color=cb3837&logo=npm)](https://www.npmjs.com/package/routiform)\n[![Docker Hub](https://img.shields.io/docker/v/linhnguyen0944/routiform?label=Docker%20Hub&logo=docker&color=2496ED)](https://hub.docker.com/r/linhnguyen0944/routiform)\n[![npm downloads](https://img.shields.io/npm/dm/routiform?label=npm%20downloads&color=red)](https://www.npmjs.com/package/routiform)\n[![Docker pulls](https://img.shields.io/docker/pulls/linhnguyen0944/routiform)](https://hub.docker.com/r/linhnguyen0944/routiform)\n[![GitHub stars](https://custom-icon-badges.demolab.com/github/stars/linhnguyen-gt/Routiform?logo=star&style=flat)](https://github.com/linhnguyen-gt/Routiform/stargazers)\n[![MIT License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n\n</div>\n\n## Product demo\n\n![Routiform dashboard overview](docs/screenshots/MainRoutiform.png)\n\n### Feature demos\n\n| Endpoint workspace                                      | Combo routing builder                               |\n| ------------------------------------------------------- | --------------------------------------------------- |\n| ![Endpoint dashboard](docs/screenshots/09-endpoint.png) | ![Combos dashboard](docs/screenshots/02-combos.png) |\n\n| Settings and operational controls                       |\n| ------------------------------------------------------- |\n| ![Settings dashboard](docs/screenshots/06-settings.png) |\n\nThese screens show the day-to-day workflow: manage unified endpoints, configure routing combos with fallback policies, and control operational settings from one dashboard.\n\n## Core capabilities\n\n### Unified API gateway\n\n- OpenAI-compatible API surface for chat, embeddings, images, audio, video, rerank, search, and more\n- Request and response translation across OpenAI, Anthropic, Gemini, Devin, and provider-specific formats\n- Native CLI-backed bridges for providers like Devin, including subprocess execution and streaming normalization back to OpenAI-compatible responses\n- Works with local apps, server deployments, CLI tools, browser clients, and agent frameworks\n\n### 59 providers in the registry\n\nRoutiform supports a broad provider mix, including:\n\n- OpenAI\n- Anthropic\n- Devin\n- DeepSeek\n- Groq\n- xAI\n- Mistral\n- Fireworks\n- Cohere\n- NVIDIA\n- Cerebras\n- OpenRouter\n- Hugging Face\n- Cloudflare AI\n- Ollama Cloud\n- Together\n- Perplexity\n- Tavily\n- Brave\n- Exa\n- and many more\n\nProvider types include:\n\n- free providers\n- OAuth-backed providers\n- API-key providers\n- custom OpenAI-compatible providers\n- custom Anthropic-compatible providers\n\n### Routing and resilience\n\n- combo-based routing across multiple models/accounts/providers\n- weighted, priority, round-robin, P2C, and cost-aware strategies\n- model-family fallback and emergency fallback\n- multi-account failover inside the same provider\n- retry handling and resilience profiles\n- rate-limit aware behavior and quota checks\n- circuit-breaker style protections for unstable upstreams\n\n### Cost and quota controls\n\n- budget-aware routing controls\n- quota snapshots and health checks\n- cost reporting endpoints and dashboard views\n- low-cost and free-tier friendly setups\n- policy-driven model selection for operational or cost goals\n\n### Built-in protocols for agent workflows\n\n- MCP server with 25 tools and multiple transports\n- A2A v0.3 support with task lifecycle handling\n- memory tools for search/add/clear\n- skills system for extensible agent behaviors\n\n### Dashboard and operations\n\n- provider connection management\n- model catalog and per-provider model sync\n- combo editor and routing strategies\n- request logs and detailed logs\n- API key manager and scoped access controls\n- endpoint health and metrics\n- webhook and automation surfaces\n\n## Supported API surfaces\n\nRoutiform exposes a unified API under `/v1/*`.\n\nMain routes include:\n\n- `/v1/chat/completions`\n- `/v1/responses`\n- `/v1/embeddings`\n- `/v1/images/generations`\n- `/v1/audio/speech`\n- `/v1/audio/transcriptions`\n- `/v1/moderations`\n- `/v1/rerank`\n- `/v1/search`\n- `/v1/videos/generations`\n- `/v1/music/generations`\n- `/v1/models`\n\nSee [`docs/API_REFERENCE.md`](docs/API_REFERENCE.md) for route details.\n\n## MCP server\n\nRoutiform ships with an MCP server for operational and routing workflows.\n\nIncluded tool groups:\n\n- health and provider status\n- combo listing and switching\n- routing simulation and explanation\n- budget and resilience controls\n- memory operations\n- skill operations\n\nSupported transports:\n\n- stdio\n- SSE\n- streamable HTTP\n\nSee [`docs/MCP-SERVER.md`](docs/MCP-SERVER.md).\n\n## A2A support\n\nRoutiform includes an A2A server with:\n\n- JSON-RPC 2.0 task handling\n- SSE streaming\n- task lifecycle management\n- skill exposure for smart routing and quota workflows\n- agent discovery via `/.well-known/agent.json`\n\nSee [`docs/A2A-SERVER.md`](docs/A2A-SERVER.md).\n\n## Why teams use it instead of wiring providers directly\n\n- one client integration instead of many SDK branches\n- self-hosted control over credentials and routing policy\n- easier experimentation with new providers and cheaper models\n- fewer production incidents from single-provider dependency\n- operational visibility without building a custom gateway first\n- ready-made agent protocol support instead of stitching MCP/A2A yourself\n\n## Quick start\n\n### Option 1: npm\n\nRequirements:\n\n- Node.js `>=22` (skip Node 23; Node 24–26 supported; see `engines` in package.json)\n\n```bash\nnpm install -g routiform\nroutiform\n```\n\nOpen the dashboard:\n\n```text\nhttp://localhost:20128/dashboard\n```\n\nDefault API base:\n\n```text\nhttp://localhost:20128/v1\n```\n\n### Option 2: npx\n\n```bash\nnpx routiform\n```\n\n### Option 3: Docker\n\n```bash\ndocker pull linhnguyen0944/routiform:cli\n\ndocker run -d \\\n  --name routiform \\\n  --restart unless-stopped \\\n  -p 20128:20128 \\\n  -p 20129:20129 \\\n  -e DATA_DIR=/app/data \\\n  -e INITIAL_PASSWORD=\"change_your_password\" \\\n  -v routiform-data:/app/data \\\n  linhnguyen0944/routiform:cli\n```\n\nIf you want the dashboard and `/dashboard/cli-tools` to detect your host CLI configs\nwithout cloning this repo, use the published full-mode compose file instead:\n\n```bash\ncurl -L -o docker-compose.full.yml \\\n  https://raw.githubusercontent.com/linhnguyen-gt/Routiform/main/docker-compose.full.yml\n\nINITIAL_PASSWORD=\"change_your_password\" \\\ndocker compose -f docker-compose.full.yml up -d\n```\n\nThat full-mode compose mounts common host config directories for Claude, Codex,\nOpenCode, Continue, Cursor, Cline, Kilo, OpenClaw, Qwen, Hermes, Qoder, Devin,\nand AWS so the dashboard can detect them more accurately inside Docker.\n\n> **MITM support in Docker:** The MITM proxy (Antigravity, Kiro etc.) can run inside Docker but requires **manual host setup** since the container cannot modify your host's `/etc/hosts` or system keychain. After starting the MITM from the dashboard, run these on your host:\n\n```bash\n# 1. Add DNS redirect (run once)\necho '127.0.0.1 daily-cloudcode-pa.googleapis.com' | sudo tee -a /etc/hosts\n\n# 2. Install MITM cert (copy cert from container to host, then install)\ndocker cp routiform:/app/data/mitm/server.crt /tmp/routiform-mitm.crt\nsudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /tmp/routiform-mitm.crt\n```\n\nIf you use `npm install -g routiform` instead, MITM works out of the box — it runs directly on your host with full DNS and keychain access.\n\nIf you want to use Devin in plain `docker run` mode, mount only `credentials.toml`\nfrom the host so the Linux CLI inside the container can reuse your existing\ncredentials without overwriting the bundled Linux install:\n\n```bash\n-e DEVIN_BIN=/root/.local/bin/devin \\\n-v \"$HOME/.local/share/devin/credentials.toml:/root/.local/share/devin/credentials.toml:ro\"\n```\n\nDo not mount `~/.local/bin` or the entire `~/.local/share/devin` directory from\nmacOS into the container. That can overwrite the Linux Devin binary with macOS\nsymlinks and cause `spawn devin ENOENT` or binary format errors.\n\n### Option 4: source\n\nDevelopment mode:\n\n```bash\ngit clone https://github.com/linhnguyen-gt/Routiform.git\ncd Routiform\nnpm install\nnpm run dev\n```\n\nProduction build from source:\n\n```bash\ngit clone https://github.com/linhnguyen-gt/Routiform.git\ncd Routiform\nnpm install\nnpm run owui:build  # Build the Open WebUI SPA into public/owui (required before Next build)\nnpm run build       # Build the Next.js application\nnpm start           # Start the server\n```\n\nThe `npm run owui:build` step is required — it compiles the vendored Open WebUI (`open-webui/`)\ninto `public/owui/`, which is then embedded by Next's `output: standalone`.\nWithout it, `/owui` returns 404 and `/dashboard/chat` redirects to a missing chat interface.\n\n### Built-in Chat\n\nThe sidebar has a **Chat** entry: a full-featured chat at `/owui` (redirected from `/dashboard/chat`).\nIt is a vendored Open WebUI SvelteKit SPA with a native Next.js backend that talks to Routiform in-process.\nNothing to install and nothing to launch — it works anywhere Routiform runs, on every install option.\n\n**Features:**\n\n- Streaming completions via socket.io\n- Conversation history with search and tagging\n- File attachments (images, code, documents)\n- Model switching per conversation\n- Shared conversation links\n- Automatic cost tracking (each message logs its request ID for billing)\n\nConversations, messages, and attachments are stored in Routiform's own SQLite database (no external service needed).\nImages are only offered on models whose request format can actually carry one; the composer indicates unsupported models.\n\n> Earlier versions embedded [Open WebUI](https://github.com/open-webui/open-webui)\n> as a separate application, which required Python 3.11 + `uv` on host installs or\n> a multi-GB Docker image. The native chat removes that dependency entirely.\n> If you ran it before, your old Open WebUI Docker volume (`routiform-open-webui-data`)\n> still holds those conversations; it is no longer used and can be removed with\n> `docker volume rm routiform-open-webui-data`.\n\n## Management CLI\n\nRoutiform includes terminal subcommands for day-to-day management without opening the dashboard.\n\n### Quick examples\n\n```bash\nroutiform status                              # server up?, version, URLs\nroutiform provider list                       # list providers\nroutiform provider add --type openai --key sk-xxx --name \"OpenAI\"\nroutiform key create my-key                    # create API key (shown once)\nroutiform combo list                           # list combos\nroutiform model list                           # list synced models\nroutiform settings get                         # show settings\nroutiform settings set requireLogin true       # set a safe-to-CLI setting\nroutiform usage                                # usage summary (30d)\nroutiform logs --tail 20                       # recent server logs\n```\n\nAll commands support `--json` for raw JSON output (scripting), `--port <n>` to override the port, `--api-key <k>` for auth, and `--yes` to skip confirmation prompts.\n\n### Usage by install option\n\n**npm / npx:**\n\n```bash\n# Terminal 1: start server\nroutiform\n\n# Terminal 2: run CLI subcommands\nroutiform provider list\n```\n\n**Docker (server running in container):**\n\n```bash\ndocker exec routiform provider list\ndocker exec routiform status\n```\n\n**Host CLI → Docker server (npm on host, server in Docker with ports mapped):**\n\n```bash\nROUTIFORM_API_KEY=<key> routiform provider list --port 20128\n```\n\n### Auth\n\nWhen login is enabled, the CLI automatically reads an API key from the local SQLite DB (`~/.routiform/storage.sqlite` or `DATA_DIR`). If no key exists, it instructs you to set `ROUTIFORM_API_KEY` or create one in the dashboard.\n\n### Available commands\n\n| Command                                                     | Description                                |\n| ----------------------------------------------------------- | ------------------------------------------ |\n| `routiform status`                                          | Server status, version, URLs               |\n| `routiform provider list\\|show\\|add\\|rm\\|test\\|sync-models` | Provider management                        |\n| `routiform key list\\|create\\|reveal\\|rm`                    | API key management                         |\n| `routiform combo list\\|show\\|create\\|rm\\|test`              | Combo management                           |\n| `routiform model list [--provider <id>]`                    | Synced available models                    |\n| `routiform settings get\\|set`                               | Settings (set uses whitelist of safe keys) |\n| `routiform usage`                                           | Usage summary (30d)                        |\n| `routiform logs [--tail N]`                                 | Recent server logs                         |\n\nOAuth provider login and visual analytics stay in the web dashboard.\n\n## First-run flow\n\n1. Open `/dashboard`\n2. Add one or more provider connections\n3. Pick models or sync available models from providers that support live model listing\n4. Create a combo if you want fallback or multi-provider routing\n5. Point your client to Routiform instead of the upstream provider directly\n\nFor Devin connections, authenticate the local CLI first with `devin auth login`, then\nimport or auto-detect the credentials from the provider setup flow and sync the\navailable Devin model catalog.\n\n## Example client configuration\n\n### OpenAI SDK compatible clients\n\n```bash\nexport OPENAI_BASE_URL=\"http://localhost:20128/v1\"\nexport OPENAI_API_KEY=\"your-routiform-api-key\"\n```\n\n### cURL\n\n```bash\ncurl http://localhost:20128/v1/chat/completions \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer your-routiform-api-key\" \\\n  -d '{\n    \"model\": \"openai/gpt-4o-mini\",\n    \"messages\": [\n      {\"role\": \"user\", \"content\": \"Hello from Routiform\"}\n    ]\n  }'\n```\n\n## Provider categories\n\n### Free\n\nExamples include built-in support for free-access workflows such as Qoder AI, Qwen Code, Kiro AI, and similar sources where available.\n\n### OAuth\n\nExamples include Claude Code, Devin, Codex, GitHub Copilot, Cursor, Cline, Kimi Coding, and other account-backed integrations.\n\n### API key\n\nMost commercial providers fit here, including OpenAI, Anthropic, Groq, xAI, Mistral, DeepSeek, Fireworks, Cohere, NVIDIA, and more.\n\n### Custom compatible providers\n\nYou can register OpenAI-compatible or Anthropic-compatible upstreams using custom base URLs.\n\n## Model routing concepts\n\n### Connections\n\nA connection is one authenticated provider account or endpoint.\n\n### Models\n\nModels can come from:\n\n- built-in provider registries\n- synced provider model lists\n- custom user-defined model entries\n\n### Combos\n\nA combo is a routing group that tells Routiform which models/providers to try and in what order or policy.\n\n### Policies\n\nPolicies influence fallback, degradation, lockout behavior, quota handling, and other runtime decisions.\n\n## Storage and backup\n\nRoutiform stores state in SQLite under `DATA_DIR` using `better-sqlite3`.\n\nDefault data directory:\n\n```text\n~/.routiform/\n```\n\nImportant backup note:\n\n- back up the entire `DATA_DIR`\n- do not copy only `storage.sqlite`\n- `server.env` in the same directory contains `STORAGE_ENCRYPTION_KEY`, which is required to restore encrypted provider secrets correctly\n\nSee [`docs/BACKUP_AND_RESTORE.md`](docs/BACKUP_AND_RESTORE.md).\n\n## Important environment variables\n\nCommon variables:\n\n| Variable                 | Default                       | Purpose                          |\n| ------------------------ | ----------------------------- | -------------------------------- |\n| `PORT`                   | `20128`                       | HTTP port                        |\n| `HOST`                   | `0.0.0.0`                     | Bind address                     |\n| `DATA_DIR`               | `~/.routiform`                | State directory                  |\n| `REQUEST_TIMEOUT_MS`     | `600000`                      | Shared upstream timeout baseline |\n| `STREAM_IDLE_TIMEOUT_MS` | inherits `REQUEST_TIMEOUT_MS` | Max gap between SSE chunks       |\n\nAdvanced timeout overrides still exist, including:\n\n- `FETCH_TIMEOUT_MS`\n- `FETCH_HEADERS_TIMEOUT_MS`\n- `FETCH_BODY_TIMEOUT_MS`\n- `API_BRIDGE_PROXY_TIMEOUT_MS`\n\n## Security notes\n\n- do not commit provider keys or session secrets\n- use the dashboard API manager for scoped access where possible\n- protect exposed deployments with proper auth and network controls\n- never log encryption keys\n- validate and sanitize user-facing content when building on top of Routiform\n\n## Project structure\n\nTop-level areas:\n\n- `src/` — Next.js app, dashboard, API routes, DB modules, domain logic\n- `open-sse/` — request pipeline, executors, translators, handlers, MCP server\n- `docs/` — user guides, architecture, API, deployment, troubleshooting\n- `tests/` — unit, integration, ecosystem, and protocol coverage\n\nSee [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) for the deeper layout.\n\n## Development\n\nInstall dependencies:\n\n```bash\nnpm install\n```\n\nRun locally:\n\n```bash\nnpm run dev\n```\n\nBuild production assets:\n\n```bash\nnpm run build\nnpm run start\n```\n\nUseful scripts:\n\n```bash\nnpm run lint\nnpm run typecheck:core\nnpm run check\nnpm run test:all\nnpm run test:vitest\nnpm run test:e2e\nnpm run test:protocols:e2e\nnpm run test:ecosystem\n```\n\n## Docs map\n\n- [User Guide](docs/USER_GUIDE.md)\n- [API Reference](docs/API_REFERENCE.md)\n- [Architecture](docs/ARCHITECTURE.md)\n- [MCP Server](docs/MCP-SERVER.md)\n- [A2A Server](docs/A2A-SERVER.md)\n- [Auto Combo](docs/AUTO-COMBO.md)\n- [CLI Tools](docs/CLI-TOOLS.md)\n- [Backup and Restore](docs/BACKUP_AND_RESTORE.md)\n- [Troubleshooting](docs/TROUBLESHOOTING.md)\n- [Features](docs/FEATURES.md)\n- [OpenAPI spec](docs/openapi.yaml)\n\n## Compatibility\n\nRoutiform is useful with:\n\n- OpenAI-compatible SDKs\n- Cursor\n- Devin\n- Cline\n- Claude Desktop\n- Codex clients\n- custom MCP clients\n- internal tools and gateways that want one normalized AI interface\n\n## License\n\nMIT\n\n## Acknowledgments 🤝\n\nRoutiform wouldn't exist without the foundations laid by:\n\n- [9router](https://github.com/decolua/9router) by @decolua — The original inspiration\n- [OmniRoute](https://github.com/diegosouzapw/OmniRoute) by @diegosouzapw — Expanded the vision\n- [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) — The original Go implementation that inspired this JavaScript port\n\n## Links\n\n- Repository: <https://github.com/linhnguyen-gt/Routiform>\n- npm: <https://www.npmjs.com/package/routiform>\n- Docker: <https://hub.docker.com/r/linhnguyen0944/routiform>\n\n[^count]: Counted from the shipped registry — `open-sse/config/registry-providers-{apikey,oauth,free,local}.ts`: 42 API-key, 8 OAuth, 8 free-tier, 1 local (Ollama). `tests/unit/readme-provider-count.test.mjs` fails if this number and the registry ever disagree, so it cannot quietly drift.\n","readmeFilename":"README.md"}