{"_id":"ldrouter","_rev":"36-3dbd602cebeef2629e9cec2efa3f4611","name":"ldrouter","dist-tags":{"latest":"1.17.9"},"versions":{"1.5.1":{"name":"ldrouter","version":"1.5.1","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.5.1","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"09be845945ac2e477dd11b5c863d3370c90d7052","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.5.1.tgz","fileCount":64,"integrity":"sha512-0oktCBJKQk63jkCvRYLGcu3rlkKuS1kVZ9fnxrQtzzoXqPNiQoAiS3R/0PsVaJio3fzPnw0DHJuWx7LbWQXoww==","signatures":[{"sig":"MEQCIEf7hLA3yUx78/vBM/wFAW5Wdw8PPW1InPypShcZ3sHcAiAGp8gsWNePQRvE66UrbXiJly3ZCNxe42jDWhMHM2QHGg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":845545},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"696ef7e960f41ca699e96e5001ec95b056384256","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","migrate":"node --import tsx/esm scripts/migrate.ts","prepack":"pnpm run build","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts"},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"_npmVersion":"11.8.0","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"24.13.1","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.5.1_1788029397794_0.4708578595516266","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"ldrouter","version":"1.6.0","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.6.0","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"53aeb08ababcc341d495d0d48126f095f1216b84","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.6.0.tgz","fileCount":6,"integrity":"sha512-2QtPlnpS0l1YAaz/X953I9sKRHsONQzPF0XqBktwlwOvL54yfbhWballjXGeLBNkLRxvuXrmUJz+7ry/9Au3nQ==","signatures":[{"sig":"MEQCICDyrd00Kc8CkH2DRAt0p5Ea2ssRFgxjUOS2QNFCvstaAiBMDpUN6yZrnCq8z2VkhUKEUEd6ORWqTWxN8KaXvnY6lw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEbKFjPWFb2py+/lDlifbxkG5BlhTbrIoFokyonLjjStAiEAms2DilJ/4YWbZaAA/CZeh4v1tsNbV+mLYc/d3U1OuhQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":26230},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"97c92350ee50bee6083ad31330436b54d22316b7","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.6.0_1788051215630_0.31043837625790616","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"ldrouter","version":"1.6.1","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.6.1","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"70eea966a770c68560c58f5e5afbbee0d6d1bd3e","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.6.1.tgz","fileCount":6,"integrity":"sha512-hy8Ba2ICmF+N/smW/4bZBVrcJKaiccWu6uFNnDPL9U6mVFSetZHO55sGNnfrDes8SlXTYR3pmtUBy6osxVDfNA==","signatures":[{"sig":"MEQCIE9JufGAz/O3kgEg3asGsM9H7Szi8oenmpwxoh2f61u9AiA96n0rDeK4JfNUTpcWASPhT/W4hdm3NPXFYh/4H8JFCg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDo3qIAd2ZmuuYZRSOGem1+ErP1r6sZTcW8pHU1O8gJNwIhAIT2dYvMvmmnPy3HhODmeThniUo8tlASVw9BtSY7cPNI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":26654},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"4fb6e47c8a3aff5514e6509264502b376dc5c9a0","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.6.1_1788056701976_0.24820298444738453","host":"s3://npm-registry-packages-npm-production"}},"1.6.2":{"name":"ldrouter","version":"1.6.2","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.6.2","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"f502418ec63e1508b3d853839116b627805e8813","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.6.2.tgz","fileCount":67,"integrity":"sha512-qQGhb0OvylylyT3UF0ZsugMY9A4Xl7zk0iY0PAXA0n3qJshxJx5rJeWw+qaSozk4+BwEcebMjigSi7vOGDcn1A==","signatures":[{"sig":"MEUCIQCcDiFjFSxYx6ST/TNyJOrCrC/wTjFr5b6JssCexWLLsAIgMtelsTP7FzJA7QRACEZb1p4j92DfJ1pNAF1/DGBFsAE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFNn6WXLTjGmgzaRVHh608H4kl2wyg9bBOl4DZ2lfyGrAiEAmiyW974PDVS836mj/1u4DnQmOetyjr1UTJCxs6Nh1oA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.6.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":867764},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"f3154fcec82feca4fcb5445cf18414691e628ef2","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.6.2_1788058766155_0.2932578068538205","host":"s3://npm-registry-packages-npm-production"}},"1.6.3":{"name":"ldrouter","version":"1.6.3","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.6.3","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"c5718002bb20d6928e59cbed15ffb7d6975f207b","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.6.3.tgz","fileCount":67,"integrity":"sha512-JOnzFOOW00OEOZLBFSdYUAPtONqBUX9EfJ4q6RBlxUMj7oKOhZDlhQvLRyEmkdjZW77EsRwW5D3eEevwVIH3SA==","signatures":[{"sig":"MEUCIDUym99l8VXnuevHhFLgkOy6R/IehASUnEBiSwM1hd2qAiEAzWrR/h259ddFjHI1JtlfPoSlesf+GN+JlHQ5dx16Gg0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICYoWOMP/viQY4LN0YkbCoxLW3Muhs/b94yNv3It7aphAiEAyX/Db75Kht87hhD41TYsAp/bpOgGtlD8OXtlt0nfAMA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.6.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":868570},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"d8a60330e1c7d07b706236ec192b69c8dd2d2055","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.6.3_1788059592018_0.7125138042532058","host":"s3://npm-registry-packages-npm-production"}},"1.6.7":{"name":"ldrouter","version":"1.6.7","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.6.7","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"a5eae045cbf4cb8197b9a808a30711361b4ddd4e","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.6.7.tgz","fileCount":67,"integrity":"sha512-gwAxqtX+lv1QrBO0pbOjg6bSSUpSbe7qfqhRIpHj46/QOnpX+MkAhBR7727nMKKhtu1lNh4Lq0pGOxag/1jOAw==","signatures":[{"sig":"MEYCIQCs/Nj3h9fbRmvKViQFck3p7VgH8Zw2wnfUssJZkIqfEQIhAPkdmVQo7zvTUoA+kD8uAFy659bHV1WcC2ocDZrgIusy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD2W+CjhomX7kcL80Q9X8QOU0ir5hbefkqcZXKDP0CpVgIhALK113WH4nbubbumLilLRpzrugnuBUnl7sPbe0TChb+h","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.6.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":873780},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"90a47c01efadb092852b6f93ae76d87da60023d9","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.6.7_1788063388619_0.21346017263384365","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"ldrouter","version":"1.7.0","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.7.0","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"4870b40d2da289face5325ae9f176d553026dd54","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.7.0.tgz","fileCount":69,"integrity":"sha512-LK72e0tCeL9UF7b23XmtTWKeGR0jQuupxPA5U05kHxlVEAXmMo5s+/yPz77hD3y3UxUmVf2OJk/XLLiYSBTJiA==","signatures":[{"sig":"MEYCIQCGy4GsogqNZRPo3Y2ug94uzcdnYoypGOgVu4A2y5dBZgIhALC/IvKavys7hbAA9wWCEZgJhGv12PTrtEbhaqayEBMT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICjAwd1abXxctmxY3xowm8kYTeiwiESEmmxuBBjJno7OAiAyaru6+IdOkn8NO5mtQHphfIFF/E2SSE2j0fGnkf2JtQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":901892},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"4f666cbf5a4cf771a28e03fc77b075b8137c42dc","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.7.0_1788196288377_0.5855557009379433","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"ldrouter","version":"1.10.0","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.10.0","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"955180aeea85994ed27b2d4c0fd595d44dc46b80","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.10.0.tgz","fileCount":70,"integrity":"sha512-nZRzCGGUZb0oc/RyNZdfqF/jHrAkko0C6D1TwinNtLMRjr9LUszwUYmti7zyryjXDdY9v2h14dthWOPJEkAAKw==","signatures":[{"sig":"MEUCIQC2br7kl2uJmlXsrzxWELscgO3+/rFFWZ9tidIys/AIXQIgIg3BsYs3QsyNSeR1X18N+wYagmpLQGbcdcFXzHE7kmc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD3Uv+b8BIZD20JBmCRoCwz2iSgKeE53b+GHrd28m0akwIgGE1uffriY4R0vn+lRCBuUmRedIqSB5vsxKrpYKDdrcY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":954924},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"225c35bb65c380b95b89ab7787088ab8433ce33c","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.10.0_1788230950883_0.4911716917540516","host":"s3://npm-registry-packages-npm-production"}},"1.10.1":{"name":"ldrouter","version":"1.10.1","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.10.1","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"6125b36d50349666846aa8f30062642107a7f16d","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.10.1.tgz","fileCount":70,"integrity":"sha512-N0jCuQ6usPD6hEDVfr9ONxceo0l4If8b/V7rBVr6X6vBxFZOLagMuN3sfxR9xtw42sCqJybZEgOIqpvegmnjNA==","signatures":[{"sig":"MEUCIQDf4QyfgQcIK5Ob1lI2P+PrySwnGJU3Fu3IuyW/lq7c0QIgJLynawARRKX+jGAchvb0L+8JulG9ckN1GMnWFjniRew=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCW7pnGHvfjkJyUqN03SUnbEugDNP4MEMQZFDfYarFw6wIhAP83sWC3ELOzrDtz7g/GhhmxTee6HQWG5rF8z6AYP1wY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.10.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":961509},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"9e2429230efd82ac7f22d45c8d942f928de2bc0a","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.10.1_1788234349091_0.5909991350332764","host":"s3://npm-registry-packages-npm-production"}},"1.10.2":{"name":"ldrouter","version":"1.10.2","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.10.2","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"2ac009eea5218d6959788bbb6eb2a8d9e4784d60","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.10.2.tgz","fileCount":70,"integrity":"sha512-tBFkszf7pu61vqv32cTZHakyXsrhrGaJxi9BHZ21iCtEzVz2Uh7daOCkoucrai/RZrgnNBVhoQqhm0NIJ8R53g==","signatures":[{"sig":"MEUCIFW3+JaqL+q8801UTKj1qXTvyeeGTFJIIWNyncnC2XsgAiEAy1SrNcDArbA4w2CGWnV0V1QCeYnlLKqHnh4h/tDvj2A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDOjlmmkiUi8khgN907/NZkhTxvLb0Sxe9jzvOQnRF09gIhAIhm29+aPsAnwW9eT3yLMTFZU8buU7y9inQz2HsBAQ0X","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.10.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":963095},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"11898baf373627b2edd027b2cd55fddaeaffa6e7","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.10.2_1788236304730_0.8065777918338888","host":"s3://npm-registry-packages-npm-production"}},"1.11.0":{"name":"ldrouter","version":"1.11.0","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.11.0","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"9fa20685378e8a67ffaad276c1c2d25e873eb68c","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.11.0.tgz","fileCount":72,"integrity":"sha512-AqnwFjtCPWe9+skDIkoENave5HBgF7Z8O2q2frhwS4vuDBCcnbwxDxGuZSo5oz6n1TU/lPByM26psUjQQ53+CA==","signatures":[{"sig":"MEQCIHhqMD3y2atKHxdW/fv3rgfM1ajRBKiSkGq4t4BYSSn9AiBXzaVjrZLViw3ZzqaXj7pDz4J2Q07WL3Fxa2Do90RQNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDEjqjn48g9PnZ6nTev/rAdftGbW3kCouFGVkOVcpTSZgIgZI5SVaim3bzd02Q7CKbzY98bpImNuUppkND6rEzVWO8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":978622},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"6128ce63a91cd291d17be615e6ab1bdda7f7e34a","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.11.0_1788269624017_0.04476282540489418","host":"s3://npm-registry-packages-npm-production"}},"1.11.2":{"name":"ldrouter","version":"1.11.2","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.11.2","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"71a70b0be323b66d4bb3701261970616eda2ca3d","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.11.2.tgz","fileCount":72,"integrity":"sha512-a4EDgTHDNNhGGx4rZuMGug+UaPm9RzOb9zNIBUKycDkLuM771raKnn0G49+Llgh5k0E3OPqv7HhBD8x2iMErnA==","signatures":[{"sig":"MEYCIQC/ZCshFCZZMlzKF/pGGJ9DyQkgzKAQQry/8mAhuSpByAIhANHqxUx0ifgaIw9DPjMzg9L0aDBrDlBTvy29u3AYcOYK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDPP2CGoJhe/+S13FiIkKoJulUkhdXAD0ET4vx3CBGTAQIhAKbQH/AHtCRcH/Pd2Bn+AcBWw2ijj2QAp6qx63VDbQqH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.11.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":979205},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"50a6a65c55abd38df344ea7d6f8f91f5edb2b306","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.11.2_1788287191158_0.9032283352444297","host":"s3://npm-registry-packages-npm-production"}},"1.11.3":{"name":"ldrouter","version":"1.11.3","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.11.3","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"10eecd7cc39757401473b30a559412966e58b0bf","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.11.3.tgz","fileCount":72,"integrity":"sha512-iEwLpFk5tWARYI7OJ/PVb3LzklMFGphGqFQxNpzH6qKC+MCwxRucJt3WU6nrFgLNdAas/3ZTHiQ2rxRAtcG6Iw==","signatures":[{"sig":"MEQCIAOgAniSvM7N0JuMjKttIYNqgViV6H7iz58GDVt6CvwXAiBUpu2rfJC8q/SoF77LaX8NjY3/Bshe4MWF/W+S7NVPyQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIB3paGgOXew8coevnGZ/Sj1199AZ5u+i5YhcDFTH26iqAiBG2EJrez7OyFWknivDRejsy1QzypOp9P8kt8nDTk58Sw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.11.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":980020},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"ff5bd2050f17e0dd8d068a3898b004665f5c1138","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.11.3_1788419480014_0.4489433215251437","host":"s3://npm-registry-packages-npm-production"}},"1.11.4":{"name":"ldrouter","version":"1.11.4","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.11.4","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"3cb0fe55bdd17dc3b227a67883de3cd57ca911d8","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.11.4.tgz","fileCount":72,"integrity":"sha512-r8ttfcbiQ2iwe3HOEg+imXpkZlUabZBso/U5ALnlK9ywT2G9iU4jdjZtPqkLi1zC4drZi72zm/MulBYvKvCr2g==","signatures":[{"sig":"MEYCIQC/7TFuf+kLqQF9KgoUD4ru/8x/e8Sfk8i0zTohmJEIVwIhAMHsTwWEzrjfMicSPcqlqby9dmv2pYS2aaTxiR3B0wQy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIG0B9Aju7rKb41qo7bUd4Ke+LqjODvNGr4fh8nmXzR13AiEAre3Dd40JjN+XGEJLHf58Jf/Xa7Zzv0VSSXEwqG3pvzU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.11.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":980030},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"15098cc65e3abe8ffad3697ff7e2d781990f2c77","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.11.4_1788420407784_0.22531585680065236","host":"s3://npm-registry-packages-npm-production"}},"1.11.8":{"name":"ldrouter","version":"1.11.8","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.11.8","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"a1f21253bb4f24904423f28b80f40573e32db8e7","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.11.8.tgz","fileCount":73,"integrity":"sha512-znvd2gkYlh1ZjcPx4DPZ0XeJXmwaL+3M8InLjCjg/LiFa1DJagSEFKGxx0fpgs6MzftAcRjCt86vyBUpUwTrkg==","signatures":[{"sig":"MEQCIFoBx4rLrLuZPtbYwThTyfhCFYhzkBBe2JJaWTyVGgQqAiBf3AcEZgIF4PjSPcrCQjU3wnRvIrwyhhFq+afTjeuo/A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICL0f9yK7I/LEN5fleUvp/s11S6NiAT6/be0xYxK8u+9AiEA/dYIkSyylJlMyAP8ylYcVDy4A5pNoBcrKSm1EatR5/Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.11.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":981205},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"72909f3443ae9983891d1c2b491d5930cd9939b8","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.11.8_1788434856258_0.326827165614735","host":"s3://npm-registry-packages-npm-production"}},"1.11.12":{"name":"ldrouter","version":"1.11.12","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.11.12","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"64b0472280a0f3f0b9c45126a94bfedc68d04fe2","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.11.12.tgz","fileCount":73,"integrity":"sha512-62AFC9Mg+3Wnnzb0u9xvNvyl+prW9QqXFgMOM7ruxmOpu387GOunVaznkXVoVjAMDdsKrWsBhpIWgz1Hg9lCBA==","signatures":[{"sig":"MEUCIQCPV5LQ1xaUhS2QdegkM8tWXhhLJGu7wUxr0/7YDv7cqAIgfd79QYr0ejcLYn5o3oyls9Y3sCZizaQp4fZkZp494Ls=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCruQ20Q6REOYorpT/6MCNyT+Fr3UtMBQh8iEOO4+YIfQIhALY3Wke+gf8L1XN1D1P/pKl4BMdsoElpqU86dJUpacRQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.11.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":981834},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"5feb37c51bd0eb5ad14e8451a841920dc5585031","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.11.12_1788446116319_0.5342926401200412","host":"s3://npm-registry-packages-npm-production"}},"1.11.15":{"name":"ldrouter","version":"1.11.15","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.11.15","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"4222e802d1e1cb4d7175aaab76653b75822f41d2","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.11.15.tgz","fileCount":74,"integrity":"sha512-xcFL2PhTNKtxnXYnltUXgojlO49T2tdEF8EgeYSYtRvVkglJ7JZKoLieTGvpvs86gdiZOCafy7d6NQaT6JTaLg==","signatures":[{"sig":"MEQCIH57d3HehElo4Xseih20IEJQiN+ufmfLXmdVx8msrfpdAiArV3K+Y0yNiXTx8DOPTSut/FTwjjJpVrgluNBwJ+XPNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCdBZ/03S/8H8BNnIvasYNdx6jgvyyzs8EyjMQFkbUYAAIgT/nbhx//SWPqC2YrEs3X0HmySSu5k8kJhWRZ1uxaypg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.11.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":985452},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"f33e9fc7f41986576644d72a3376bbc029f41815","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.11.15_1788483353578_0.26948688413621347","host":"s3://npm-registry-packages-npm-production"}},"1.11.17":{"name":"ldrouter","version":"1.11.17","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.11.17","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"d287d1ea7e8d42b05c45d8f6b8ad57602eb5d09b","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.11.17.tgz","fileCount":74,"integrity":"sha512-VMBptZ3v2kPYbrm0eKfF0+uudiZ8JqZlKhT1unxxWysCQFro95oNyvuSdy9JD/h0RpXfUxn/y7XjBxBNaoN7Zg==","signatures":[{"sig":"MEYCIQCkNEWIQvq6f8en9URfg7Rqn5MeVRQwvYcK4LclsxqTJQIhANqPFTCEBbLnKZ0YZnbon+AOsjPA+9bmHHDLP70OMgec","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEJQ7s76E6jgr758T4YQ/kMnjjtAZXWXi9UOSYknNnZxAiAUih3Zz7c2t+Ll2XPRQEnOVnhT2aysxVt2WlEO2OZPog==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.11.17","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":990335},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"1209ce7155ce1d53cd833cdd2524363d06403f8f","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.11.17_1788531126928_0.07208410969123835","host":"s3://npm-registry-packages-npm-production"}},"1.12.0":{"name":"ldrouter","version":"1.12.0","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.12.0","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"a2ac8edb866255ffc3be2046e88edafffd4a63d0","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.12.0.tgz","fileCount":74,"integrity":"sha512-kBKRjrkeHaDlpyKaoND7AGn3eU+GCTS7SA9tA1ChHGIZJsn8+6q/BPIti47z1Bwzi9bzsaAoSDGG7t21XDnRgQ==","signatures":[{"sig":"MEUCIQC0yKDgdbPdBLEGHGXBg3/Jnbi3RZaSq7yf5Rk1FzmL7gIge18+Uka84FpBm4B222PP/K5coeyWFdil5vlsmiFP+2M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDJGZ6g0kqj9jFkWzD4FH5VSCfABg7GnIpPboaP5p7F9wIhAMEVWdmLHMNs8P6QjnpDU6Qta/WOsCWgPcDEd1S88Ztn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1018259},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"e11ca2fc68ae38ef208755185db57e25453f03bd","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","test:e2e":"playwright test","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@playwright/test":"^1.50.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.12.0_1788577586743_0.22962371473718157","host":"s3://npm-registry-packages-npm-production"}},"1.13.1":{"name":"ldrouter","version":"1.13.1","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.13.1","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"0bef83c4d3bb3d60ada4ae1cb849c0c62c1f41c5","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.13.1.tgz","fileCount":75,"integrity":"sha512-lG2+EXEMjzJGmUf3p0vnkdogyExkDgqfeq3OFEl4fHLl1QZooWmld8uRecofCeAlqc3Nrc+IinNkIVAvBFMWug==","signatures":[{"sig":"MEUCIQDLTsL8ySa7OPtpL3vMhHaqU/RsI+sfdgciC6bKq34ZDAIgeQ1wxLg0gtFdVHL6lvI76KtayAVWpWb0ClAUG0H90mY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDh1XFwbRtQjR9VCQTasYsI1gIOujYF3EOhv6n/Padb5gIgBYC+/k+xN8hdzNaFfX472cr785+jfDwvid9WPoGio+U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.13.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1024853},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"ea42fe004d77e4c8267708d6f0dc4af100394706","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.13.1_1789144860316_0.03780401710854786","host":"s3://npm-registry-packages-npm-production"}},"1.14.0":{"name":"ldrouter","version":"1.14.0","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.14.0","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"9a9d22ba3056cb62e71748358b8721b28515494a","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.14.0.tgz","fileCount":75,"integrity":"sha512-p7f/o9qQet3gYbaM/BD7fDCH3VsBDL9Yk3mw3lH70b38Mew8CEp07tnyytLg7zWjhHrgjZ5w1phEOpq59D+xxw==","signatures":[{"sig":"MEYCIQC3dJOQoeXN7TWlQNU6LNpQfZTDaW08xXbwKs00ei4NWwIhAKgWQ0E5VbxyxtJZ2yqF/ef2rYZg+nFTg1/BBCzNGacv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICMgwkxBMtje7Ov5l3B7dXG4R0eB1moxvPtXy+8gr+ZsAiEA/t0bVCebuYbaSUw4nZ71vPrl+BwHSAxJ+24NRuUAdxo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.14.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1026488},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"5fef93bdb082f24dbeddd84bffef887001c11ff0","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.14.0_1789147074033_0.12441398519185576","host":"s3://npm-registry-packages-npm-production"}},"1.14.1":{"name":"ldrouter","version":"1.14.1","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.14.1","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"d4527fe2d3f55ac9bb3d3b709077faaa077ccf2a","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.14.1.tgz","fileCount":75,"integrity":"sha512-atMpE1p/YpCHOryNKb4PkYsIkVti/j+oebyaTOL1SidW8Onoh7jbAMyb6nWSHKnMHifMw5bThEd990cGfS3/2w==","signatures":[{"sig":"MEYCIQDIEqcFXwpVaQ6JnlxbO8BLTyYuS+E1G0FuUh0RFvWSHQIhAMAqzfwunmKHyUsDARSKqlx3ooJ0CrO2kdhQdboWfwWy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEugR9iDY7rKAOvAmJ7HpGt47NWLMj57hao4RxLe9ul6AiBg+aHVTE2EAeSE71ZLTFYuP/Y4hfzknZ1iVq88gWZsnw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.14.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1026667},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"6a8d6568471b281ad20734ea9e14f1f02ebd3cee","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.14.1_1789189431962_0.6418086390444813","host":"s3://npm-registry-packages-npm-production"}},"1.16.2":{"name":"ldrouter","version":"1.16.2","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.16.2","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js","latedev-router":"dist/cli.js"},"dist":{"shasum":"11a678b7ed527620e8afd72c7fc86a8ba013571d","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.16.2.tgz","fileCount":85,"integrity":"sha512-sleF2Nz0YAT7z7IUCitJaMJd+27jewjUcmhMaA60ovlH+UxbIbvY4LpwWT58aSskeB//Rvb9fFNZ1jvmPHl1gg==","signatures":[{"sig":"MEQCIHDZA6aXUD/cNTEO05remSjuRkPfIuzxBCnIOyFtJ14IAiBktb+MLS39Mq5Ng5IopFiwJNpdTEEpMZQSR6QTc578Mw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCwTaHO387+skxabUgMOKPT5/wHuc0y7X31HRLPFFHr1gIgD5CIMoYAs8lozMjfb4MOv+wXQcfqrk8eQhq9cbn0Yp8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.16.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1211560},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"4cb167d30482cb027de309c7eec801c20d0165d0","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@dnd-kit/core":"^6.3.1","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.16.2_1789368638574_0.6106805964500015","host":"s3://npm-registry-packages-npm-production"}},"1.16.3":{"name":"ldrouter","version":"1.16.3","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.16.3","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js"},"dist":{"shasum":"c27aded28f4e74a57cf6fa16c2fa70efdd1995c9","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.16.3.tgz","fileCount":75,"integrity":"sha512-T8NyKhBzCqZ0IMU/xoCcpHzpJkuFvhIKz1R0rGNIwY3JkBpkz1zgYpud0qXYv40uUT6jMUo3LZZliShj7rr6jw==","signatures":[{"sig":"MEUCIA74paFyFjeJRf0z43x3x/K/goeMeOGahmoT9krqfLo3AiEA/8PP5MSZgX8z0O1s4bmfpMeFU9ge4LLqsuV2V8LOg+g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDSDmBnQJxDq7vAzkH4Lxil1+A02GKX6lZN8LtyS+zmyQIgOwCn+rBC1I2DKtKnsLBQfhiJbG60mtg3+AA3vO93O5w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.16.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1042283},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"bdb15a80fa1f10934aa56c1081ac0e040ee8a0fe","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.16.3_1789374859145_0.313831045989327","host":"s3://npm-registry-packages-npm-production"}},"1.16.4":{"name":"ldrouter","version":"1.16.4","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.16.4","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js","latedev-router":"dist/cli.js"},"dist":{"shasum":"d8c80ce92ce1368ee0a23e21420e2fbc97569ad3","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.16.4.tgz","fileCount":85,"integrity":"sha512-02dMi3yNSddXJox6QtvMmw+H/EAuKP2wRqOiPGxXZPNMH1uETibVOgx3J4jqYgx4cximLBQTyspZInXGyUzmJg==","signatures":[{"sig":"MEUCIHG09zr1/YkdElBEe6VR4M/kXEqwqlakhjZ/vQnnLva1AiEAsE3iUBxrfe8tnR9cKG2BgAbG9ZdrGXfCecM+dci6LoU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIC6L6rc8UA8a2pHqQOdNHYmviHJkQy1r37CMFuHdnJ8uAiBLpyrIZva1+abO4lR6y4CF9wPTyZoX3YPGso9Wk4yQqA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.16.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1228018},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"020e6b12bae4084e2b9d75fe84e49e69e72bc347","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@dnd-kit/core":"^6.3.1","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.16.4_1789476703546_0.023774701756084315","host":"s3://npm-registry-packages-npm-production"}},"1.16.5":{"name":"ldrouter","version":"1.16.5","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.16.5","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js","latedev-router":"dist/cli.js"},"dist":{"shasum":"9ec4e78671057434c350b62fd93b06cb499eddf0","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.16.5.tgz","fileCount":85,"integrity":"sha512-qnIcjVa+gxEh4kI/iPtONfEMMIXjIyn6OZZVk3DYB1T7nBI/u+MMrGtS6YE6JeCkCVDxvSZXxlCL7vEf2edzeA==","signatures":[{"sig":"MEYCIQCgaVFwSXihGOgiMPBkqzKwAVwQcUXmKdaVkcJkF70u1AIhAOkA1NCF1lzItm8rVDYXBKssUSC0RxIcEnF5jyv9oDbK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEYTfVhTwyjdS6eTgQFbNRU3U6PwG08DdeBG7xrp+k6jAiEA97g4rO7h2tAOC+1ToCOhww7tgd0Misv1PEGD3ZGTOG8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.16.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1228405},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"a8fa80fc44901c3cbb9c075da4fb6c13278def1f","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@dnd-kit/core":"^6.3.1","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.16.5_1789480916647_0.7952196748227833","host":"s3://npm-registry-packages-npm-production"}},"1.17.0":{"name":"ldrouter","version":"1.17.0","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.17.0","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js","latedev-router":"dist/cli.js"},"dist":{"shasum":"7c152c34d068f3ba51867b65d891b4570ef5b5e8","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.17.0.tgz","fileCount":99,"integrity":"sha512-5Hg4SgkJgJ3svEkD6bUJNs4gVTyWQnXqzNDAz1vnMfq4jmDHpGefMMD8T4XuFbsMsphgyrDbPTJOjOx1lsr44w==","signatures":[{"sig":"MEUCIQDJ24xabim5EoAVaugDSshxz7iJ3dfrRwBrMF+Jy2LtTAIgUMjjFbLTScoVNvfZj45uqHHh+DXBGLQyJhoH30Ryuys=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCBIUH6Y6VzUZ2PTVkn+gEih/rFRJnrMpub3A9BFNUOYwIhAO13pvukXyBj4soCWXuvwqSZreO7IhRyajh4QYrRdfsp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.17.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1352604},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"e1c59583e32bfbd4ff368de014a3918dad737b5f","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@dnd-kit/core":"^6.3.1","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.17.0_1789580953814_0.552248228768264","host":"s3://npm-registry-packages-npm-production"}},"1.17.1":{"name":"ldrouter","version":"1.17.1","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.17.1","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js","latedev-router":"dist/cli.js"},"dist":{"shasum":"852ba39269f104672cffeb1a754e74e332dc152a","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.17.1.tgz","fileCount":99,"integrity":"sha512-Pe9hkr/L9+1ZuW853CdgR4bTght+wxPJ3ODqHpduMojYwVg7T7r2rp4APjWAK7BzQFallmlDRlN6zI2OOXdRbw==","signatures":[{"sig":"MEQCICf4Z+Xuz3OE+QfzxXLqFQ8XBlZ0EtKFPGcxTlLI+seZAiBVQUe8MyW8cKj4Y6dZal1Wg7jDxfowx22MjQ34MqJgeQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDcOmdPCuyDTbO3V2iD+k3TNf+VSKphIhML/MUGTK4MKAIhANEWl9Fg+iEiZg3l3BSCzPipmDy4JPh+fmFlBsPktuBp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.17.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1354256},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"c098b33f3219d447974e53d40ed36edf743b8d7b","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@dnd-kit/core":"^6.3.1","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.17.1_1789627868149_0.07876186415462039","host":"s3://npm-registry-packages-npm-production"}},"1.17.2":{"name":"ldrouter","version":"1.17.2","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.17.2","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js","latedev-router":"dist/cli.js"},"dist":{"shasum":"a3fc0df4bea0852fc5a57372f12c0d5e011d15d0","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.17.2.tgz","fileCount":99,"integrity":"sha512-xzYVVnPW/mWsUCFYuAF76H4gRqWUqgU1URWRiS2ckya0VgvCJvlUQVTNfeXQrhyGN0c5Gq/x8BBPwxke8nBaeQ==","signatures":[{"sig":"MEUCIHv4FDpzFqtpgFkLkDYnmP/GWGu2Mk5bhLkHCMwHyBc3AiEAt3wALPC1xmWTGbQjWH32NT4RgStdRXlSL6tJXb0pvsw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDnueTMbYX1T7NgeyTxR48FJyaAQDidCHgFO1o4FRShSwIgBQXgdch7kvFnGi/IcXrYyw9MxDXvqG5CpGxr4xqe/E0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.17.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1359185},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"4fb57cb79025725e7fb4c13ca90eeaeb5190c5cf","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@dnd-kit/core":"^6.3.1","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.17.2_1789630741079_0.6870961390247019","host":"s3://npm-registry-packages-npm-production"}},"1.17.3":{"name":"ldrouter","version":"1.17.3","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.17.3","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js","latedev-router":"dist/cli.js"},"dist":{"shasum":"b66ea1d254f4bd88eaa3fb55943b844c7533836f","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.17.3.tgz","fileCount":101,"integrity":"sha512-7KhP+cmvDTwjFq4SAMlgrGhYj/YOjwktMd6Z5spxp0vaHWyX7Y6G4HWS3KHioy0QRdhIL0kZQXGKSo6rZbPICA==","signatures":[{"sig":"MEUCIBLpfeR47Q1iyzHsPNM02Ifp2HvIy6k/gz0CtcDrDOsIAiEA7od+cn75e5r1Fu0XvelrHmGhtKheCJlywj+uDZQrdjg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDvuzx0D06WENevJs9chsU/5FPxTCo08FE74p+OmJbb3AiAHU85vyjySEeSBEPAWlVIgLMgPhv6aBkUz4YNKL2TMfQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.17.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1375197},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"be051b05517d4450c741dbb13a5a814ff1a82bf2","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@dnd-kit/core":"^6.3.1","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.17.3_1789653035827_0.9701690130264506","host":"s3://npm-registry-packages-npm-production"}},"1.17.4":{"name":"ldrouter","version":"1.17.4","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.17.4","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js","latedev-router":"dist/cli.js"},"dist":{"shasum":"7966bcb24e3d3761a7ee285b24f3f156a63a380b","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.17.4.tgz","fileCount":101,"integrity":"sha512-QLAVAH+uiy05J0r8NueVaB+0aqp44Kkhr0850YdC86M6AhmAe08rNWYTR5+shi7Hhi3GcZ70eQOEHOLqH5Yd8Q==","signatures":[{"sig":"MEUCIQCgtlVLl9TGEMR1kg9oKARoVPHn5hwl2u9J0erU5PSKtgIgQuv4Xeo+dR0TpC5hNQ0/bcSqlFi1WVrMUIhOdWkS6TY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBqs4R4HIV7eOuGoMOS9yB1m/WGv+Kn3IyVdp4KgtgMkAiEA5ROouRIY7Bcwk4BI3jB6T0NzhUox3TiQstEqqK1Ci7M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.17.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1388791},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"3793990ef5c1ceffeb07833663ff7715ce5c79d8","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@dnd-kit/core":"^6.3.1","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.17.4_1789713954215_0.2395949451375028","host":"s3://npm-registry-packages-npm-production"}},"1.17.5":{"name":"ldrouter","version":"1.17.5","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.17.5","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js","latedev-router":"dist/cli.js"},"dist":{"shasum":"dd33580b34efdecf700ee5eb2f8ba184f16ef992","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.17.5.tgz","fileCount":101,"integrity":"sha512-sxvsFFJRM8amHk43StbyWxuzFY8JqqawqgQCaw7GMpAN2bWKH4Q4XjvLI/8IZ9UYHOHizudoMFAgg6lcmOhKPQ==","signatures":[{"sig":"MEYCIQCM2h9LROiyaBaINLlInKBup4ZOTTMtnMbN9XDTdIV/fQIhAN1OzaW5wweTnSCuGQtUDukqolP64YAE9zUNST48Dd2Y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIE6Nroekcsss8P2DLYhnYG1VQ6PMPW3A4Q6+W+/9fBHUAiEAj/xYp2IZ9WD6Ia3KRtsjkqhb0T7f0SqXL+9gcPOM3uY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.17.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1393611},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"942f2233846b1f03c2a2e0ba827004ed891b68df","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@dnd-kit/core":"^6.3.1","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.17.5_1789826597202_0.15427966319513087","host":"s3://npm-registry-packages-npm-production"}},"1.17.6":{"name":"ldrouter","version":"1.17.6","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.17.6","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js","latedev-router":"dist/cli.js"},"dist":{"shasum":"b8b0e4a6b3f197b4324bf7ef04d256c5c5f1e378","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.17.6.tgz","fileCount":101,"integrity":"sha512-74wMNbK66d24Xrhwh/jC1sk+U4nDeK+8ZczRVlVoIHeZl8JZZYoZlqTtYZ2uBLJD3ovxC6gIQYXoGQyJBjqqjQ==","signatures":[{"sig":"MEYCIQDn4PGrswBLQpmLbPdonVck4nlsp0Mr5sxtntJoLfN2gQIhALR76SCLWlgh6mTLsdjsEfy+zO8x4lQPzgBHKmh6vB0l","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDDNkZliuqt2orlFKtzN+0ZPb+UZptWzoKzp3XoJFyMWwIhAIhZiKGf+MXSd0lKchlM7KgQGVJy07cEWoyOJ4dz7gq7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.17.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1409500},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"06bcee7849a9cdc1b38335aa2cea73109464e269","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@dnd-kit/core":"^6.3.1","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.17.6_1789919880171_0.4762344075358562","host":"s3://npm-registry-packages-npm-production"}},"1.17.7":{"name":"ldrouter","version":"1.17.7","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.17.7","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js","latedev-router":"dist/cli.js"},"dist":{"shasum":"fe743d0d77e97509e27787343ea751f35b28c350","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.17.7.tgz","fileCount":101,"integrity":"sha512-3NW4Mhvl0EBim5KeQfLMJY0njdr5fvJ/nTZWGmyiV6/xeClvym6sW0Z//k69t7iUq8+0ECSP60FbBF8lOpNO0w==","signatures":[{"sig":"MEUCIQCRPSgG05B5zLeRcy67xc2KJ9Dhkz7lwC5WwqcrSAzRmwIgAxWkkGLUZmkH2W3ueAyqSxYpPzsm/DlNluAS3w/yjh8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCj+sB6suww1I+nGqtvFPfhos9rrqhKerG4N8IoEjfddwIgKU3nCcQkSboBXyT+CVxbeLpB4knnDCokP6tfEblNbLM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.17.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1411171},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"86eebc6f08bd25b44191f7d65917c052f7933289","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@dnd-kit/core":"^6.3.1","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.17.7_1789922650056_0.39251298208023266","host":"s3://npm-registry-packages-npm-production"}},"1.17.8":{"name":"ldrouter","version":"1.17.8","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"license":"MIT","_id":"ldrouter@1.17.8","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"homepage":"https://github.com/lethinh26/ldrouter#readme","bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"bin":{"ldrouter":"dist/cli.js","latedev-router":"dist/cli.js"},"dist":{"shasum":"46ea2341c27a1e2d51b4eab5177b49f61f6158cb","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.17.8.tgz","fileCount":102,"integrity":"sha512-c46nBRBP2mKTpz6XFAivZt5/jfSeAotPFacFG9B94lr3/n49LvBENTdGYxGmwx93rTWq8g6g+oZ067n0DMFY9g==","signatures":[{"sig":"MEQCIFJKUiVRlYPfHqdNaoKL49Y8lHCgSwJvtsHhvNoe7jkMAiAWb+BBGJzcAnhVCXXzGF7Vi4TyOza2CHRPN7hEJim9Rw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDQyCA0OrBETP6lljgQOn7IULGHcaSV/vf7Af3wbwWaDQIhAJVybecrJt6D1rzZVFo/fKOBESRwZcj+2JrbSzdZ1jiT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.17.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1413112},"main":"dist/server/app.js","type":"module","engines":{"node":">=22.0.0"},"gitHead":"213da9eca67546d64b6a824935770d3049eb4581","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@dnd-kit/core":"^6.3.1","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/ldrouter_1.17.8_1789999673262_0.998746306008711","host":"s3://npm-registry-packages-npm-production"}},"1.17.9":{"_id":"ldrouter@1.17.9","bin":{"ldrouter":"dist/cli.js","latedev-router":"dist/cli.js"},"bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"dist":{"shasum":"43e68fd9bf4b25e12485dd9439835b0c2cbbbd8f","tarball":"https://registry.npmjs.org/ldrouter/-/ldrouter-1.17.9.tgz","fileCount":102,"integrity":"sha512-WaDKnt4cS5GiVsHKsHBwDRNd1/iuvMuBqQoipqrsDJlvmKxB92mcvbl08KmRFY5MaHxVJepNv2eax19XbFtJDQ==","signatures":[{"sig":"MEQCICyZwBw5KB6GbQJvoyTsDfRkDePfyngYDZzi7Ln4rDWkAiAXY5mQkenSLZOCJoalcZE7LXKM5eizkeZfvy6+aS913A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDWEpqO2LJMKgefuzLlkp+uC88Y5d21BLK+88xEse8SAgIhAL0d0R8/ugqXt2Tg4M15s+j2go/6xW4HloUb0332QfbF"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ldrouter@1.17.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1416511},"main":"dist/server/app.js","name":"ldrouter","type":"module","engines":{"node":">=22.0.0"},"gitHead":"6943d9779a867da9f04a2acd82ab147616fed3ea","license":"MIT","scripts":{"dev":"node --import tsx/esm scripts/dev.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"pnpm run build:web && pnpm run build:server","start":"node dist/cli.js","verify":"pnpm lint && pnpm typecheck && pnpm test","migrate":"node --import tsx/esm scripts/migrate.ts","build:web":"vite build","typecheck":"tsc -p tsconfig.json --noEmit","db:migrate":"node --import tsx/esm scripts/migrate.ts","test:watch":"vitest","build:server":"tsc -p tsconfig.build.json && node --import tsx/esm scripts/fix-imports.mts","release:major":"pnpm verify && npm version major -m \"release: v%s\"","release:minor":"pnpm verify && npm version minor -m \"release: v%s\"","release:patch":"pnpm verify && npm version patch -m \"release: v%s\""},"version":"1.17.9","_npmUser":{"name":"thinhlp","email":"admin@latedev.com"},"homepage":"https://github.com/lethinh26/ldrouter#readme","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"_npmVersion":"10.9.8","description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","directories":{},"maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","clsx":"^2.1.1","pino":"^9.5.0","execa":"^10.0.1","argon2":"^0.43.0","qrcode":"^1.5.4","semver":"^7.8.5","sonner":"^1.7.1","fastify":"^5.2.1","ipaddr.js":"^2.2.0","speakeasy":"^2.0.0","drizzle-orm":"^0.36.4","pino-pretty":"^13.0.0","lucide-react":"^0.469.0","@dnd-kit/core":"^6.3.1","@fastify/cors":"^10.0.2","better-sqlite3":"^11.7.0","tailwind-merge":"^2.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","@fastify/static":"^8.1.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^9.0.0","@fastify/multipart":"^9.0.3","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.1","@radix-ui/react-tabs":"^1.1.2","@radix-ui/react-label":"^2.1.1","@radix-ui/react-avatar":"^1.1.2","@radix-ui/react-dialog":"^1.1.4","@radix-ui/react-select":"^2.1.4","@radix-ui/react-switch":"^1.1.2","@radix-ui/react-popover":"^1.1.4","@radix-ui/react-tooltip":"^1.1.6","@radix-ui/react-checkbox":"^1.1.3","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.2","@radix-ui/react-separator":"^1.1.1","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"tsx":"^4.19.2","vite":"^6.0.7","pngjs":"^7.0.0","react":"^19.0.0","eslint":"^9.18.0","vitest":"^2.1.8","globals":"^17.11.0","postcss":"^8.5.1","happy-dom":"^16.5.3","react-dom":"^19.0.0","@eslint/js":"^10.0.1","typescript":"^5.7.3","@types/node":"^22.10.5","drizzle-kit":"^0.30.1","tailwindcss":"^3.4.17","@types/pngjs":"^6.0.5","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@types/qrcode":"^1.5.5","@types/semver":"^7.8.0","@types/react-dom":"^19.0.0","@types/speakeasy":"^2.0.10","react-router-dom":"^7.1.1","eslint-plugin-react":"^7.37.4","@vitejs/plugin-react":"^4.3.4","@types/better-sqlite3":"^7.6.12","@typescript-eslint/parser":"^8.20.0","eslint-plugin-react-hooks":"^5.1.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ldrouter_1.17.9_1790064921601_0.2560237015309039"}}},"time":{"created":"2026-08-29T18:49:57.730Z","modified":"2026-09-22T08:15:22.497Z","1.5.1":"2026-08-29T18:49:57.990Z","1.6.0":"2026-08-30T00:53:35.706Z","1.6.1":"2026-08-30T02:25:02.075Z","1.6.2":"2026-08-30T02:59:26.268Z","1.6.3":"2026-08-30T03:13:12.132Z","1.6.7":"2026-08-30T04:16:28.722Z","1.7.0":"2026-08-31T17:11:28.514Z","1.10.0":"2026-09-01T02:49:10.984Z","1.10.1":"2026-09-01T03:45:49.204Z","1.10.2":"2026-09-01T04:18:24.899Z","1.11.0":"2026-09-01T13:33:44.109Z","1.11.2":"2026-09-01T18:26:31.249Z","1.11.3":"2026-09-03T07:11:20.104Z","1.11.4":"2026-09-03T07:26:47.878Z","1.11.8":"2026-09-03T11:27:36.389Z","1.11.12":"2026-09-03T14:35:16.415Z","1.11.15":"2026-09-04T00:55:53.713Z","1.11.17":"2026-09-04T14:12:07.084Z","1.12.0":"2026-09-05T03:06:26.858Z","1.13.1":"2026-09-11T16:41:00.423Z","1.14.0":"2026-09-11T17:17:54.136Z","1.14.1":"2026-09-12T05:03:52.054Z","1.16.2":"2026-09-14T06:50:38.664Z","1.16.3":"2026-09-14T08:34:19.247Z","1.16.4":"2026-09-15T12:51:43.688Z","1.16.5":"2026-09-15T14:01:56.761Z","1.17.0":"2026-09-16T17:49:13.942Z","1.17.1":"2026-09-17T06:51:08.280Z","1.17.2":"2026-09-17T07:39:01.194Z","1.17.3":"2026-09-17T13:50:35.916Z","1.17.4":"2026-09-18T06:45:54.352Z","1.17.5":"2026-09-19T14:03:17.319Z","1.17.6":"2026-09-20T15:58:00.268Z","1.17.7":"2026-09-20T16:44:10.151Z","1.17.8":"2026-09-21T14:07:53.366Z","1.17.9":"2026-09-22T08:15:21.694Z"},"bugs":{"url":"https://github.com/lethinh26/ldrouter/issues"},"license":"MIT","homepage":"https://github.com/lethinh26/ldrouter#readme","keywords":["llm","gateway","router","openai","anthropic","proxy","self-hosted"],"repository":{"url":"git+https://github.com/lethinh26/ldrouter.git","type":"git"},"description":"LateDev Router — lightweight self-hosted LLM gateway with admin UI","maintainers":[{"name":"thinhlp","email":"admin@latedev.com"}],"readme":"# LateDev Router\n\nLightweight self-hosted LLM gateway with a polished admin UI. Presents stable OpenAI-compatible and Anthropic-compatible APIs to clients while routing traffic to one or more upstream providers.\n\n## Features\n\n- OpenAI-compatible and Anthropic-compatible gateways (`/v1/chat/completions`, `/v1/responses`, `/v1/messages`, `/v1/messages/count_tokens`, `/v1/models`)\n- Selective model discovery (Fetch → select → import) with **Select All**\n- Virtual **combos** (fallback or weighted round-robin) and one-hop **aliases**\n- Provider API keys encrypted at rest with AES-256-GCM\n- Per-key `ld-` bearer tokens (SHA-256 digest storage, displayed once)\n- IP allow/deny (IPv4 + IPv6 CIDR), trusted-proxy configuration\n- Rate limits: RPM, TPM, daily/monthly token quotas, concurrency, max output tokens\n- TTL-based gateway response cache (disabled by default) + provider prompt-cache accounting\n- Streaming end-to-end with strict \"no fallback after stream content sent\" rule\n- Request + attempt logs, statistics (Today / 7d / 30d), retention cleanup\n- Admin TOTP 2FA, Argon2id passwords, recovery codes\n- Immutable audit logs\n- Consistent backup / restore (SQLite snapshot + checksum + schema validation)\n- Prometheus `/metrics`, structured logs, graceful shutdown\n- One distributable npm package, multi-stage Dockerfile, Docker Compose\n- Native Codex OAuth account pools with encrypted JSON/JSONL import, refresh/rotation, account-aware routing, and admin management\n- Native Qoder account pools driven by personal access tokens, with encrypted storage, live model-catalog discovery, and account-aware routing\n\n## Quick start\n\n### Using Docker Compose\n\n```bash\ncp .env.example .env\n# Edit LATEDEV_MASTER_KEY (32+ bytes base64). Generate with:\n#   node -e \"console.log(require('crypto').randomBytes(32).toString('base64'))\"\ndocker compose up -d\n```\n\nThen visit `http://localhost:8787/` and complete the first-run admin setup.\n\n### Using npm\n\n```bash\nnpx ldrouter\nlatedev-router --host 0.0.0.0 --port 8787\n```\n\nThe data directory defaults to `~/.latedev-router/` and can be overridden via `LATEDEV_DATA_DIR` or `--data-dir`.\n\n### Codex OAuth setup\n\n1. Set `LATEDEV_MASTER_KEY` before creating or importing credentials. Use a strong random base64 key; it encrypts Codex access, refresh, and ID tokens at rest.\n2. In **Providers**, create a provider with type **Codex**. Codex providers do not use the generic API-key field.\n3. Open the Codex account panel and import a redacted copy of a Codex OAuth `auth.json`, a JSON array, an `{ \"accounts\": [...] }` wrapper, or JSONL with one record per line. Records may contain a `tokens` object with access/refresh/ID tokens. For example:\n\n   `{ \"accountId\": \"acct-…masked\", \"email\": \"admin@example.invalid\", \"tokens\": { \"accessToken\": \"[REDACTED]\", \"refreshToken\": \"[REDACTED]\" } }`\n\n   JSONL stores one similarly redacted object per line; an array uses the same records: `[ { \"accountId\": \"acct-…masked\", \"tokens\": { \"accessToken\": \"[REDACTED]\" } } ]`.\n\n   Alternatively, use **Connect Codex** to authorize a ChatGPT account in the browser. The dialog shows the Codex CLI PKCE authorize URL, waits for the loopback callback, and also accepts a pasted callback URL or bare authorization code. The PKCE verifier and the authorization code stay server-side and never appear in the UI. The Codex CLI callback (`http://localhost:1455/auth/callback`) is captured by `GET /oauth/codex/callback`; because browsers block that cross-origin redirect, paste the address bar URL into step 2 when the auto-capture page fails to load.\n4. Review the preview and import only the records you want. Account/workspace identity is preferred for deduplication; email alone never merges unrelated accounts. Re-importing the same identity updates its encrypted tokens while preserving its enabled state.\n\nRaw tokens are accepted only by the authenticated import pipeline and are never returned in previews, API responses, UI state, audit logs, request logs, errors, or database backups. JWT claims are decoded for metadata only; token signatures are not verified locally. Tokens are refreshed proactively near expiry and once after an upstream 401/403, with rotated values persisted atomically.\n\nThe import endpoint requires the normal admin session and CSRF token (`x-csrf-token`) for mutations, including multipart uploads. Use HTTPS for remote administration and protect the master key like any encryption key. Back up the SQLite data directory consistently; restoring encrypted credentials requires the matching master key, otherwise re-save/re-import credentials after restore.\n\nZIP upload and automatic Codex CLI config-file generation/mutation are not included in this release. LateDev Router does not modify Codex CLI files.\n\nThe account panel shows the 5-hour and weekly quota windows with reset countdowns, per-account and bulk usage refresh, weekly reset credits, an opt-in 5-hour window auto-start, and a **Test** control that probes the upstream account without exposing tokens. Routing order is set by dragging rows; the saved order is the fallback order the router uses. **Delete** is permanent and erases the stored encrypted credentials — past request logs are kept but lose the account reference.\n\n**A quota-exhausted account leaves the pool on its own.** When an account refuses for quota reasons — Codex `429 The usage limit has been reached`, or Qoder `out of credits` — it is marked `down` *and disabled*, so the very next request picks a different account in the pool rather than retrying the spent one. This applies to direct `codex/...` and `qoder/...` models too, not only combos. Re-enable the account in the panel once its window resets. Both Codex usage and Qoder credits are also refreshed in the background after a successful request (throttled, and never on the response path), so the panel figures track real usage without pressing **Refresh**.\n\n### Qoder setup\n\nQoder providers use a personal access token (PAT) instead of an API key. Create one at `https://qoder.com/account/integrations`; it starts with `pt-`.\n\n1. Set `LATEDEV_MASTER_KEY` before adding a token. It encrypts both the PAT and the derived job token at rest.\n2. In **Providers**, click **Add Qoder**. The server creates the provider with its fixed endpoint — there is no base URL or API key to fill in.\n3. In the Qoder account panel, click **Add token** and paste the PAT, or **Import tokens** to paste/upload a list: one token per line, a JSON array of strings, an `{ \"accounts\": [...] }` wrapper, or JSONL of strings/objects (`token`, `pt_token`, `personal_token`, `access_token`; optional `label`/`name`/`email`). Only `pt-` tokens are accepted — a `dt-` device token or a `jt-` job token is rejected with that reason rather than failing later upstream.\n\nAdding a token exchanges it immediately for a short-lived job token and fetches the model list; inference then runs against `api2.qoder.sh` using that job token. The PAT is kept so a new job token can always be minted — the operator never has to touch it again. If the token works but the model list cannot be fetched, the account is still stored (health `unknown`, with the error recorded) so you can retry with **Catalog**.\n\nBecause the gateway serves model discovery from that live catalog, a new account has no routable models until its first successful fetch. Use **Import models** on the provider row to pull the discovered models in.\n\n**Operational caveat:** a revoked or expired PAT is a durable failure. The account is marked `down` with \"personal access token rejected — replace it\" and routing skips it; nothing retries it forever. Re-add the account with a fresh token. Deleting an account is permanent and erases the stored encrypted PAT — past request logs are kept but lose the account reference.\n\nThe panel shows the masked user id, job-token expiry, when the catalog was last fetched, health, and an enabled toggle. Routing order is set by dragging rows, exactly as with Codex.\n\n### Qoder usage, Credits and promotions\n\nQoder does not meter models in tokens: its chat stream carries no usage block at all, so request logs\nshow zero tokens for every Qoder model and the panel's **Credits** column is the account's real\nusage. It is read from Qoder's quota API (`GET /api/v2/quota/usage` on `openapi.qoder.sh`) and shows\nthe plan / add-on / org buckets, the percentage used, and whether the account is exhausted.\n\n**Credits and free models are different things, and the panel shows both.** Qoder keeps promoting a\nmodel — currently `qmodel_38max`, the Qwen3.8-Max route — by marking its catalog entry `is_free`.\nSuch a model spends no Credits, so an account at **zero Credits** still answers on it while every\nother model returns an envelope `403 code 112` with a `pricingUrl`. That pairing is what makes an\n\"out of credits\" account look partly broken: the panel labels the column **No plan credits** next to\n**Free now: qmodel_38max** so the contradiction is visible instead of looking like a router fault.\n\nThere is an upstream edge worth knowing when reading logs: a quota refusal arrives as **HTTP 200**\nwith a `403` envelope inside the streamed body, so it is not an HTTP error at the transport layer.\n\nUse **Refresh credits** to re-read the snapshot for every account. It deliberately reuses the live\n`job token` instead of exchanging the PAT again — a fresh exchange invalidates the token a\nconcurrent request may be using.\n\n**Test** sends one real message, because a catalog probe cannot see a quota refusal. It picks a\npromotion-covered model when the account has one, so testing never spends Credits.\n\n## Environment variables\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `LATEDEV_HOST` | Bind host | `0.0.0.0` |\n| `LATEDEV_PORT` | Bind port | `8787` |\n| `LATEDEV_DATA_DIR` | Persistent data directory | `~/.latedev-router/` |\n| `LATEDEV_MASTER_KEY` | 32-byte base64 key for encrypting provider credentials | _required once providers exist_ |\n| `LATEDEV_TRUST_PROXY` | Number of reverse-proxy hops to trust for X-Forwarded-For | `0` |\n| `LATEDEV_LOG_LEVEL` | trace / debug / info / warn / error / fatal | `info` |\n\n## Public API examples\n\nOpenAI-compatible:\n```bash\ncurl http://localhost:8787/v1/chat/completions \\\n  -H \"Authorization: Bearer ld-...\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"model\":\"provider/gpt-4o-mini\",\"messages\":[{\"role\":\"user\",\"content\":\"hi\"}]}'\n```\n\nAnthropic-compatible:\n```bash\ncurl http://localhost:8787/v1/messages \\\n  -H \"x-api-key: ld-...\" \\\n  -H \"anthropic-version: 2023-06-01\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"model\":\"provider/claude-3-5-sonnet-latest\",\"max_tokens\":256,\"messages\":[{\"role\":\"user\",\"content\":\"hi\"}]}'\n```\n\n## Build & test\n\n```bash\npnpm install --frozen-lockfile\npnpm lint\npnpm typecheck\npnpm test\npnpm build\nnpm pack --dry-run\ndocker build -t latedev-router:test .\ndocker compose config\ndocker compose up -d\n```\n\n## Development\n\n```bash\npnpm install\npnpm dev\n# In another terminal\npnpm --filter . typecheck\npnpm test\n```\n\n## Architecture\n\nSee `AGENTS.md` and the `docs/` directory for the full specification.\n","readmeFilename":"README.md"}