mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-31 04:12:10 +03:00
The dashboard loaded the Material Symbols icon font only from the Google Fonts CDN (fonts.googleapis.com). On networks where that CDN is blocked (e.g. mainland China) the ligature font never loaded, so every icon rendered as its literal text name and the layout broke. Bundle the font locally via the material-symbols package so icons render without a runtime CDN dependency. Closes #3695
302 lines
15 KiB
JSON
302 lines
15 KiB
JSON
{
|
|
"name": "omniroute",
|
|
"version": "3.8.24",
|
|
"description": "Unified AI router with 160+ providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs.",
|
|
"type": "module",
|
|
"bin": {
|
|
"omniroute": "bin/omniroute.mjs",
|
|
"omniroute-reset-password": "bin/reset-password.mjs"
|
|
},
|
|
"files": [
|
|
"bin/",
|
|
"dist/",
|
|
"@omniroute/",
|
|
"open-sse/",
|
|
"src/domain/",
|
|
"src/lib/",
|
|
"src/mitm/",
|
|
"src/server/",
|
|
"src/shared/",
|
|
"src/sse/",
|
|
"src/types/",
|
|
".env.example",
|
|
"scripts/build/postinstall.mjs",
|
|
"bin/cli/runtime/",
|
|
"scripts/postinstall.mjs",
|
|
"scripts/build/postinstallSupport.mjs",
|
|
"scripts/build/sync-env.mjs",
|
|
"scripts/dev/responses-ws-proxy.mjs",
|
|
"scripts/check/check-supported-node-runtime.ts",
|
|
"scripts/dev/sync-env.mjs",
|
|
"scripts/build/native-binary-compat.mjs",
|
|
"scripts/build/build-next-isolated.mjs",
|
|
"README.md",
|
|
"LICENSE",
|
|
"!**/__tests__/**",
|
|
"!**/*.test.ts",
|
|
"!**/*.test.tsx",
|
|
"!**/*.test.js",
|
|
"!**/*.test.mjs",
|
|
"!**/*.spec.ts",
|
|
"!**/*.spec.tsx"
|
|
],
|
|
"workspaces": [
|
|
"open-sse"
|
|
],
|
|
"engines": {
|
|
"node": ">=22.0.0 <23 || >=24.0.0 <27"
|
|
},
|
|
"keywords": [
|
|
"ai",
|
|
"router",
|
|
"proxy",
|
|
"openai",
|
|
"claude",
|
|
"anthropic",
|
|
"gemini",
|
|
"fallback",
|
|
"cursor",
|
|
"cline",
|
|
"codex",
|
|
"llm",
|
|
"auto-fallback"
|
|
],
|
|
"license": "MIT",
|
|
"author": "diegosouzapw",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "https://github.com/diegosouzapw/OmniRoute"
|
|
},
|
|
"homepage": "https://omniroute.online",
|
|
"scripts": {
|
|
"dev": "node scripts/dev/run-next.mjs dev",
|
|
"prebuild:docs": "node scripts/docs/gen-openapi-module.mjs",
|
|
"gen:provider-reference": "node --import tsx scripts/docs/gen-provider-reference.ts",
|
|
"build": "node scripts/build/build-next-isolated.mjs",
|
|
"build:secure": "OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs",
|
|
"build:cli": "node --import tsx scripts/build/prepublish.ts",
|
|
"build:release": "rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs",
|
|
"start": "node scripts/dev/run-next.mjs start",
|
|
"lint": "eslint .",
|
|
"electron:dev": "concurrently \"npm run dev\" \"wait-on http://localhost:20128 && cd electron && npm run dev\"",
|
|
"electron:build": "npm run build && cd electron && npm run build",
|
|
"electron:build:win": "npm run build && cd electron && npm run build:win",
|
|
"electron:build:mac": "npm run build && cd electron && npm run build:mac",
|
|
"electron:build:linux": "npm run build && cd electron && npm run build:linux",
|
|
"electron:smoke:packaged": "node scripts/dev/smoke-electron-packaged.mjs",
|
|
"test": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --test --test-concurrency=20 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,compression,cors,dashboard,db,db-adapters,docs,gamification,guardrails,lib,mcp,runtime,security,services,settings,shared,ui}/**/*.test.ts\"",
|
|
"test:unit": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --test --test-force-exit --test-concurrency=20 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,compression,cors,dashboard,db,db-adapters,docs,gamification,guardrails,lib,mcp,runtime,security,services,settings,shared,ui}/**/*.test.ts\"",
|
|
"test:unit:fast": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,compression,cors,dashboard,db,db-adapters,docs,gamification,guardrails,lib,mcp,runtime,security,services,settings,shared,ui}/**/*.test.ts\"",
|
|
"test:unit:shard": "concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"",
|
|
"test:unit:shard:1": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,compression,cors,dashboard,db,db-adapters,docs,gamification,guardrails,lib,mcp,runtime,security,services,settings,shared,ui}/**/*.test.ts\"",
|
|
"test:unit:shard:2": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,compression,cors,dashboard,db,db-adapters,docs,gamification,guardrails,lib,mcp,runtime,security,services,settings,shared,ui}/**/*.test.ts\"",
|
|
"test:plan3": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx --import ./open-sse/utils/setupPolyfill.ts --test tests/unit/plan3-p0.test.ts",
|
|
"test:fixes": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx --import ./open-sse/utils/setupPolyfill.ts --test tests/unit/fixes-p1.test.ts",
|
|
"test:security": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx --import ./open-sse/utils/setupPolyfill.ts --test tests/unit/security-fase01.test.ts",
|
|
"check:cycles": "node scripts/check/check-cycles.mjs",
|
|
"check:route-validation:t06": "node scripts/check/check-route-validation.mjs",
|
|
"check:any-budget:t11": "node scripts/check/check-t11-any-budget.mjs",
|
|
"check:docs-sync": "node scripts/check/check-docs-sync.mjs",
|
|
"check:env-doc-sync": "node scripts/check/check-env-doc-sync.mjs",
|
|
"check:docs-counts": "node scripts/check/check-docs-counts-sync.mjs",
|
|
"check:deprecated-versions": "node scripts/check/check-deprecated-versions.mjs",
|
|
"check:doc-links": "node scripts/check/check-doc-links.mjs",
|
|
"check:fabricated-docs": "node scripts/check/check-fabricated-docs.mjs",
|
|
"check:docs-all": "npm run check:docs-sync && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs",
|
|
"docs:render-diagrams": "node scripts/docs/render-diagrams.mjs",
|
|
"i18n:run": "node scripts/i18n/run-translation.mjs",
|
|
"i18n:run:dry": "node scripts/i18n/run-translation.mjs --dry-run",
|
|
"i18n:check": "node scripts/i18n/check-translation-drift.mjs",
|
|
"i18n:sync-ui": "node scripts/i18n/sync-ui-keys.mjs",
|
|
"i18n:sync-ui:dry": "node scripts/i18n/sync-ui-keys.mjs --dry-run",
|
|
"i18n:check-ui-coverage": "node scripts/i18n/check-ui-keys-coverage.mjs",
|
|
"check:node-runtime": "node --import tsx scripts/check/check-supported-node-runtime.ts",
|
|
"check:pack-artifact": "node --import tsx scripts/build/validate-pack-artifact.ts",
|
|
"check:cli-i18n": "node scripts/check/check-cli-i18n.mjs",
|
|
"check:openapi-coverage": "node scripts/check/check-openapi-coverage.mjs",
|
|
"check:openapi-security-tiers": "node scripts/check/check-openapi-security-tiers.mjs",
|
|
"check:provider-consistency": "node --import tsx scripts/check/check-provider-consistency.ts",
|
|
"check:fetch-targets": "node scripts/check/check-fetch-targets.mjs",
|
|
"check:openapi-routes": "node scripts/check/check-openapi-routes.mjs",
|
|
"check:deps": "node scripts/check/check-deps.mjs",
|
|
"check:file-size": "node scripts/check/check-file-size.mjs",
|
|
"check:duplication": "node scripts/check/check-duplication.mjs",
|
|
"check:test-masking": "node scripts/check/check-test-masking.mjs",
|
|
"check:error-helper": "node scripts/check/check-error-helper.mjs",
|
|
"check:migration-numbering": "node scripts/check/check-migration-numbering.mjs",
|
|
"check:public-creds": "node scripts/check/check-public-creds.mjs",
|
|
"check:db-rules": "node scripts/check/check-db-rules.mjs",
|
|
"check:docs-symbols": "node scripts/check/check-docs-symbols.mjs",
|
|
"check:known-symbols": "node --import tsx scripts/check/check-known-symbols.ts",
|
|
"check:route-guard-membership": "node --import tsx scripts/check/check-route-guard-membership.ts",
|
|
"check:test-discovery": "node scripts/check/check-test-discovery.mjs",
|
|
"check:complexity": "node scripts/check/check-complexity.mjs",
|
|
"quality:collect": "node scripts/quality/collect-metrics.mjs",
|
|
"quality:ratchet": "node scripts/quality/check-quality-ratchet.mjs",
|
|
"quality:gate": "npm run quality:collect && npm run quality:ratchet -- --allow-missing",
|
|
"audit:deps": "npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron",
|
|
"audit:electron": "npm --prefix electron audit --audit-level=moderate",
|
|
"typecheck:core": "tsc --pretty false -p tsconfig.typecheck-core.json",
|
|
"typecheck:noimplicit:core": "tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json",
|
|
"backfill-aggregation": "node --import tsx src/scripts/backfillAggregation.ts",
|
|
"env:sync": "node scripts/dev/sync-env.mjs",
|
|
"test:integration": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx --import ./open-sse/utils/setupPolyfill.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts",
|
|
"test:e2e": "node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts",
|
|
"test:protocols:e2e": "node scripts/dev/run-protocol-clients-tests.mjs",
|
|
"test:vitest": "vitest run --config vitest.mcp.config.ts",
|
|
"test:vitest:ui": "vitest run --config vitest.config.ts tests/unit/ui",
|
|
"test:ecosystem": "node scripts/dev/run-ecosystem-tests.mjs",
|
|
"test:system": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx --import ./open-sse/utils/setupPolyfill.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts",
|
|
"test:coverage": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true c8 --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,compression,cors,dashboard,db,db-adapters,docs,gamification,guardrails,lib,mcp,runtime,security,services,settings,shared,ui}/**/*.test.ts\"",
|
|
"test:coverage:legacy": "c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx --test tests/unit/*.test.ts",
|
|
"coverage:report": "c8 report --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov",
|
|
"coverage:summary": "node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md",
|
|
"check:pr-test-policy": "node scripts/check/check-pr-test-policy.mjs",
|
|
"coverage:report:legacy": "c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary",
|
|
"test:all": "npm run test:unit && npm run test:vitest && npm run test:vitest:ui && npm run test:ecosystem && npm run test:e2e",
|
|
"check": "npm run lint && npm run test",
|
|
"prepublishOnly": "npm run build:cli-api && npm run build:cli && npm run check:pack-artifact",
|
|
"postinstall": "node scripts/build/postinstall.mjs",
|
|
"uninstall": "node scripts/build/uninstall.mjs",
|
|
"uninstall:full": "node scripts/build/uninstall.mjs --full",
|
|
"prepare": "husky",
|
|
"system-info": "node scripts/dev/system-info.mjs",
|
|
"build:cli-api": "node --import tsx/esm scripts/cli/generate-api-commands.mjs"
|
|
},
|
|
"dependencies": {
|
|
"@aws-sdk/client-bedrock-runtime": "^3.1045.0",
|
|
"@dnd-kit/core": "^6.3.1",
|
|
"@dnd-kit/sortable": "^10.0.0",
|
|
"@dnd-kit/utilities": "^3.2.2",
|
|
"@huggingface/transformers": "^4.2.0",
|
|
"@lobehub/icons": "^5.8.0",
|
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
"@monaco-editor/react": "^4.7.0",
|
|
"@ngrok/ngrok": "^1.7.0",
|
|
"@swc/helpers": "0.5.23",
|
|
"@types/mdx": "^2.0.13",
|
|
"@xyflow/react": "^12.10.2",
|
|
"axios": "^1.16.1",
|
|
"bcryptjs": "^3.0.3",
|
|
"bottleneck": "^2.19.5",
|
|
"commander": "^15.0.0",
|
|
"csv-stringify": "^6.7.0",
|
|
"express": "^5.2.1",
|
|
"fetch-socks": "^1.3.3",
|
|
"fflate": "^0.8.3",
|
|
"fumadocs-core": "^16.9.0",
|
|
"fumadocs-mdx": "^15.0.7",
|
|
"fumadocs-ui": "^16.9.0",
|
|
"gray-matter": "^4.0.3",
|
|
"http-proxy-middleware": "^4.0.0",
|
|
"https-proxy-agent": "^9.0.0",
|
|
"ink": "^7.0.3",
|
|
"ink-spinner": "^5.0.0",
|
|
"ink-text-input": "^6.0.0",
|
|
"ioredis": "^5.10.1",
|
|
"jose": "^6.2.3",
|
|
"js-yaml": "^4.1.1",
|
|
"jsonc-parser": "^3.3.1",
|
|
"lowdb": "^7.0.1",
|
|
"lucide-react": "^1.16.0",
|
|
"marked": "^18.0.4",
|
|
"marked-terminal": "^7.3.0",
|
|
"material-symbols": "^0.45.1",
|
|
"mermaid": "^11.15.0",
|
|
"monaco-editor": "^0.55.1",
|
|
"next": "^16.2.6",
|
|
"next-intl": "^4.12.0",
|
|
"next-themes": "^0.4.6",
|
|
"node-machine-id": "^1.1.12",
|
|
"open": "^11.0.0",
|
|
"ora": "^9.4.0",
|
|
"parse5": "^8.0.1",
|
|
"pino": "^10.3.1",
|
|
"pino-abstract-transport": "^3.0.0",
|
|
"pino-pretty": "^13.1.3",
|
|
"playwright": "1.60.0",
|
|
"react": "19.2.7",
|
|
"react-dom": "19.2.7",
|
|
"react-is": "^19.2.6",
|
|
"react-markdown": "^10.1.0",
|
|
"react-reconciler": "^0.33.0",
|
|
"recharts": "^3.8.1",
|
|
"selfsigned": "^5.5.0",
|
|
"sql.js": "^1.14.1",
|
|
"sqlite-vec": "^0.1.9",
|
|
"tsx": "^4.22.3",
|
|
"undici": "^8.3.0",
|
|
"update-notifier": "^7.3.1",
|
|
"uuid": "^14.0.0",
|
|
"ws": "^8.18.0",
|
|
"xxhash-wasm": "^1.1.0",
|
|
"yazl": "^3.3.1",
|
|
"zod": "^4.4.3",
|
|
"zustand": "^5.0.13"
|
|
},
|
|
"optionalDependencies": {
|
|
"better-sqlite3": "^12.10.0",
|
|
"keytar": "^7.9.0",
|
|
"tls-client-node": "^0.2.0",
|
|
"wreq-js": "^2.3.1"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.60.0",
|
|
"@tailwindcss/postcss": "^4.3.0",
|
|
"@testing-library/jest-dom": "^6.9.1",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@types/bcryptjs": "^3.0.0",
|
|
"@types/better-sqlite3": "^7.6.13",
|
|
"@types/bun": "latest",
|
|
"@types/keytar": "^4.4.2",
|
|
"@types/node": "^25.9.1",
|
|
"@types/react": "^19.2.15",
|
|
"@types/react-dom": "^19.2.3",
|
|
"@types/ws": "^8.18.0",
|
|
"@vitejs/plugin-react": "^6.0.2",
|
|
"c8": "^11.0.0",
|
|
"concurrently": "^10.0.3",
|
|
"cross-env": "^10.1.0",
|
|
"eslint": "^9.39.4",
|
|
"eslint-config-next": "16.2.7",
|
|
"glob": "^13.0.6",
|
|
"husky": "^9.1.7",
|
|
"jsdom": "^29.1.1",
|
|
"lint-staged": "^17.0.5",
|
|
"node-loader": "^2.1.0",
|
|
"prettier": "^3.8.3",
|
|
"tailwindcss": "^4.3.0",
|
|
"typescript": "^6.0.3",
|
|
"typescript-eslint": "^8.59.4",
|
|
"vitest": "^4.1.7",
|
|
"wait-on": "^9.0.10",
|
|
"wtfnode": "^0.10.1"
|
|
},
|
|
"lint-staged": {
|
|
"*.{js,jsx,ts,tsx,mjs}": [
|
|
"prettier --write",
|
|
"eslint --fix --no-error-on-unmatched-pattern"
|
|
],
|
|
"*.{json,md,yml,yaml,css}": [
|
|
"prettier --write"
|
|
]
|
|
},
|
|
"pnpm": {
|
|
"onlyBuiltDependencies": [
|
|
"@parcel/watcher",
|
|
"@swc/core",
|
|
"better-sqlite3",
|
|
"esbuild",
|
|
"omniroute",
|
|
"sharp"
|
|
]
|
|
},
|
|
"overrides": {
|
|
"dompurify": "^3.4.3",
|
|
"postcss": "^8.5.14",
|
|
"ip-address": "10.2.0",
|
|
"qs": "^6.15.2",
|
|
"uuid": "^14.0.0"
|
|
}
|
|
}
|