omniroute 3.1.9 → 3.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/build-manifest.json +2 -2
  3. package/app/.next/prerender-manifest.json +3 -3
  4. package/app/.next/server/app/(dashboard)/dashboard/a2a/page_client-reference-manifest.js +1 -1
  5. package/app/.next/server/app/(dashboard)/dashboard/agents/page_client-reference-manifest.js +1 -1
  6. package/app/.next/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  7. package/app/.next/server/app/(dashboard)/dashboard/api-manager/page_client-reference-manifest.js +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/audit-log/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/auto-combo/page_client-reference-manifest.js +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/costs/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/health/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/limits/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/mcp/page_client-reference-manifest.js +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/media/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/onboarding/page_client-reference-manifest.js +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  26. package/app/.next/server/app/(dashboard)/dashboard/search-tools/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
  28. package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  30. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  31. package/app/.next/server/app/400/page_client-reference-manifest.js +1 -1
  32. package/app/.next/server/app/401/page_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/403/page_client-reference-manifest.js +1 -1
  34. package/app/.next/server/app/408/page_client-reference-manifest.js +1 -1
  35. package/app/.next/server/app/429/page_client-reference-manifest.js +1 -1
  36. package/app/.next/server/app/500/page_client-reference-manifest.js +1 -1
  37. package/app/.next/server/app/502/page_client-reference-manifest.js +1 -1
  38. package/app/.next/server/app/503/page_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/_global-error.html +2 -2
  40. package/app/.next/server/app/_global-error.rsc +1 -1
  41. package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  42. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  43. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  44. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  45. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  46. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  47. package/app/.next/server/app/api/combos/[id]/route.js.nft.json +1 -1
  48. package/app/.next/server/app/api/combos/route.js.nft.json +1 -1
  49. package/app/.next/server/app/api/providers/[id]/test/route.js +1 -1
  50. package/app/.next/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  51. package/app/.next/server/app/api/providers/test-batch/route.js +1 -1
  52. package/app/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  53. package/app/.next/server/app/api/usage/[connectionId]/route.js +1 -1
  54. package/app/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  55. package/app/.next/server/app/api/usage/analytics/route.js +1 -1
  56. package/app/.next/server/app/api/usage/analytics/route.js.nft.json +1 -1
  57. package/app/.next/server/app/api/usage/call-logs/[id]/route.js +1 -1
  58. package/app/.next/server/app/api/usage/call-logs/[id]/route.js.nft.json +1 -1
  59. package/app/.next/server/app/api/usage/call-logs/route.js +1 -1
  60. package/app/.next/server/app/api/usage/call-logs/route.js.nft.json +1 -1
  61. package/app/.next/server/app/api/usage/history/route.js +1 -1
  62. package/app/.next/server/app/api/usage/history/route.js.nft.json +1 -1
  63. package/app/.next/server/app/api/usage/logs/route.js +1 -1
  64. package/app/.next/server/app/api/usage/logs/route.js.nft.json +1 -1
  65. package/app/.next/server/app/api/usage/request-logs/route.js +1 -1
  66. package/app/.next/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  67. package/app/.next/server/app/api/v1/api/chat/route.js +14 -14
  68. package/app/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  69. package/app/.next/server/app/api/v1/chat/completions/route.js +11 -11
  70. package/app/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  71. package/app/.next/server/app/api/v1/completions/route.js +11 -11
  72. package/app/.next/server/app/api/v1/completions/route.js.nft.json +1 -1
  73. package/app/.next/server/app/api/v1/embeddings/route.js +1 -1
  74. package/app/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  75. package/app/.next/server/app/api/v1/images/generations/route.js +1 -1
  76. package/app/.next/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  77. package/app/.next/server/app/api/v1/messages/route.js +14 -14
  78. package/app/.next/server/app/api/v1/messages/route.js.nft.json +1 -1
  79. package/app/.next/server/app/api/v1/music/generations/route.js +1 -1
  80. package/app/.next/server/app/api/v1/music/generations/route.js.nft.json +1 -1
  81. package/app/.next/server/app/api/v1/providers/[provider]/chat/completions/route.js +14 -14
  82. package/app/.next/server/app/api/v1/providers/[provider]/chat/completions/route.js.nft.json +1 -1
  83. package/app/.next/server/app/api/v1/providers/[provider]/embeddings/route.js +1 -1
  84. package/app/.next/server/app/api/v1/providers/[provider]/embeddings/route.js.nft.json +1 -1
  85. package/app/.next/server/app/api/v1/providers/[provider]/images/generations/route.js +1 -1
  86. package/app/.next/server/app/api/v1/providers/[provider]/images/generations/route.js.nft.json +1 -1
  87. package/app/.next/server/app/api/v1/responses/[...path]/route.js +14 -14
  88. package/app/.next/server/app/api/v1/responses/[...path]/route.js.nft.json +1 -1
  89. package/app/.next/server/app/api/v1/responses/route.js +14 -14
  90. package/app/.next/server/app/api/v1/responses/route.js.nft.json +1 -1
  91. package/app/.next/server/app/api/v1/search/route.js +1 -1
  92. package/app/.next/server/app/api/v1/search/route.js.nft.json +1 -1
  93. package/app/.next/server/app/api/v1/videos/generations/route.js +1 -1
  94. package/app/.next/server/app/api/v1/videos/generations/route.js.nft.json +1 -1
  95. package/app/.next/server/app/api/v1beta/models/[...path]/route.js +14 -14
  96. package/app/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  97. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  98. package/app/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  99. package/app/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
  100. package/app/.next/server/app/forgot-password/page_client-reference-manifest.js +1 -1
  101. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  102. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  103. package/app/.next/server/app/maintenance/page_client-reference-manifest.js +1 -1
  104. package/app/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  105. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  106. package/app/.next/server/app/privacy/page_client-reference-manifest.js +1 -1
  107. package/app/.next/server/app/status/page_client-reference-manifest.js +1 -1
  108. package/app/.next/server/app/terms/page_client-reference-manifest.js +1 -1
  109. package/app/.next/server/chunks/[root-of-the-server]__051203a6._.js +2 -2
  110. package/app/.next/server/chunks/[root-of-the-server]__0891af92._.js +1 -1
  111. package/app/.next/server/chunks/[root-of-the-server]__1f27646b._.js +1 -1
  112. package/app/.next/server/chunks/[root-of-the-server]__1f2b0d89._.js +1 -1
  113. package/app/.next/server/chunks/{[root-of-the-server]__32ce41c4._.js → [root-of-the-server]__2941b5e3._.js} +1 -1
  114. package/app/.next/server/chunks/{[root-of-the-server]__96aaa2b3._.js → [root-of-the-server]__2ae75949._.js} +1 -1
  115. package/app/.next/server/chunks/[root-of-the-server]__46e00e59._.js +1 -1
  116. package/app/.next/server/chunks/{[root-of-the-server]__14cb1121._.js → [root-of-the-server]__4de2456d._.js} +1 -1
  117. package/app/.next/server/chunks/[root-of-the-server]__6405e3ef._.js +1 -1
  118. package/app/.next/server/chunks/[root-of-the-server]__6e52619e._.js +1 -1
  119. package/app/.next/server/chunks/[root-of-the-server]__7fa4d14e._.js +1 -1
  120. package/app/.next/server/chunks/{[root-of-the-server]__9b8dfe32._.js → [root-of-the-server]__8106d66f._.js} +1 -1
  121. package/app/.next/server/chunks/[root-of-the-server]__aa49d156._.js +1 -1
  122. package/app/.next/server/chunks/{[root-of-the-server]__da4ad5ed._.js → [root-of-the-server]__b0e5c9ae._.js} +1 -1
  123. package/app/.next/server/chunks/{[root-of-the-server]__7b401f67._.js → [root-of-the-server]__cca6bf86._.js} +1 -1
  124. package/app/.next/server/chunks/{[root-of-the-server]__e6f6e3e7._.js → [root-of-the-server]__e13422e5._.js} +1 -1
  125. package/app/.next/server/chunks/{[root-of-the-server]__dc4d07b1._.js → [root-of-the-server]__ff35dde5._.js} +1 -1
  126. package/app/.next/server/chunks/_05c48915._.js +1 -1
  127. package/app/.next/server/chunks/_06515a8a._.js +1 -1
  128. package/app/.next/server/chunks/_2115d8de._.js +1 -1
  129. package/app/.next/server/chunks/{_ed30bb6e._.js → _3390b46c._.js} +2 -2
  130. package/app/.next/server/chunks/_3ac953eb._.js +1 -1
  131. package/app/.next/server/chunks/_4b8fd853._.js +1 -1
  132. package/app/.next/server/chunks/_68683848._.js +1 -1
  133. package/app/.next/server/chunks/_ee9b677b._.js +1 -1
  134. package/app/.next/server/chunks/_efd5ede2._.js +2 -2
  135. package/app/.next/server/chunks/open-sse_bd7645e5._.js +1 -1
  136. package/app/.next/server/chunks/{src_lib_53ed4368._.js → src_lib_2ef733b9._.js} +2 -2
  137. package/app/.next/server/chunks/ssr/[root-of-the-server]__9ef96d20._.js +1 -1
  138. package/app/.next/server/chunks/ssr/[root-of-the-server]__a6942102._.js +1 -1
  139. package/app/.next/server/pages/500.html +2 -2
  140. package/app/.next/server/server-reference-manifest.js +1 -1
  141. package/app/.next/server/server-reference-manifest.json +1 -1
  142. package/app/.next/static/chunks/218a3d300fdd7431.js +1 -0
  143. package/app/.next/static/chunks/{5eee4790907c4daa.css → 6a6b8a35559e6d15.css} +1 -1
  144. package/app/CHANGELOG.md +15 -6
  145. package/app/docs/openapi.yaml +1 -1
  146. package/app/open-sse/handlers/chatCore.ts +20 -6
  147. package/app/open-sse/translator/response/claude-to-openai.ts +0 -1
  148. package/app/package-lock.json +2 -2
  149. package/app/package.json +1 -1
  150. package/app/src/app/globals.css +1 -1
  151. package/app/src/sse/handlers/chat.ts +0 -14
  152. package/app/tests/unit/model-combo-mappings-db.test.mjs +2 -0
  153. package/package.json +1 -1
  154. package/app/.next/static/chunks/20266ad6555b91f7.js +0 -1
  155. /package/app/.next/static/{hTrDwAfglRHHhrQZsW-A1 → jzcx_xYQec4FcMNBxRHI4}/_buildManifest.js +0 -0
  156. /package/app/.next/static/{hTrDwAfglRHHhrQZsW-A1 → jzcx_xYQec4FcMNBxRHI4}/_clientMiddlewareManifest.json +0 -0
  157. /package/app/.next/static/{hTrDwAfglRHHhrQZsW-A1 → jzcx_xYQec4FcMNBxRHI4}/_ssgManifest.js +0 -0
package/app/CHANGELOG.md CHANGED
@@ -4,6 +4,15 @@
4
4
 
5
5
  ---
6
6
 
7
+ ## [3.1.10] — 2026-03-28
8
+
9
+ ### 🐛 Bug Fixes
10
+
11
+ - **Fix #706** — Fixed icon fallback rendering caused by Tailwind V4 `font-sans` override by applying `!important` to `.material-symbols-outlined`.
12
+ - **Fix #703** — Fixed GitHub Copilot broken streams by enabling `responses` to `openai` format translation for any custom models leveraging `apiFormat: "responses"`.
13
+ - **Fix #702** — Replaced flat-rate usage tracking with accurate DB pricing calculations for both streaming and non-streaming responses.
14
+ - **Fix #716** — Cleaned up Claude tool-call translation state, correctly parsing streaming arguments and preventing OpenAI `tool_calls` chunks from repeating the `id` field.
15
+
7
16
  ## [3.1.9] — 2026-03-28
8
17
 
9
18
  ### ✨ New Features
@@ -31,12 +40,12 @@
31
40
 
32
41
  ### 📁 New Files
33
42
 
34
- | File | Purpose |
35
- |------|---------|
36
- | `open-sse/translator/helpers/schemaCoercion.ts` | Schema coercion and tool description sanitization utilities |
37
- | `tests/unit/schema-coercion.test.mjs` | Unit tests for schema coercion |
38
- | `tests/unit/t40-opencode-cli-tools-integration.test.mjs` | CLI tool integration tests |
39
- | `COVERAGE_PLAN.md` | Test coverage planning document |
43
+ | File | Purpose |
44
+ | -------------------------------------------------------- | ----------------------------------------------------------- |
45
+ | `open-sse/translator/helpers/schemaCoercion.ts` | Schema coercion and tool description sanitization utilities |
46
+ | `tests/unit/schema-coercion.test.mjs` | Unit tests for schema coercion |
47
+ | `tests/unit/t40-opencode-cli-tools-integration.test.mjs` | CLI tool integration tests |
48
+ | `COVERAGE_PLAN.md` | Test coverage planning document |
40
49
 
41
50
  ## [3.1.8] - 2026-03-27
42
51
 
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OmniRoute API
4
- version: 3.1.9
4
+ version: 3.1.10
5
5
  description: |
6
6
  OmniRoute is a local-first AI API proxy router. It provides an OpenAI-compatible
7
7
  endpoint that routes requests to multiple AI providers with load balancing,
@@ -27,6 +27,8 @@ import {
27
27
  saveCallLog,
28
28
  } from "@/lib/usageDb";
29
29
  import { getLoggedInputTokens, getLoggedOutputTokens } from "@/lib/usage/tokenAccounting";
30
+ import { recordCost } from "@/domain/costRules";
31
+ import { calculateCost } from "@/lib/usage/costCalculator";
30
32
  import { CLAUDE_OAUTH_TOOL_PREFIX } from "../translator/request/openai-to-claude.ts";
31
33
  import {
32
34
  getModelNormalizeToolCallId,
@@ -1315,6 +1317,11 @@ export async function handleChatCore({
1315
1317
  });
1316
1318
  }
1317
1319
 
1320
+ if (apiKeyInfo?.id && usage) {
1321
+ const estimatedCost = await calculateCost(provider, model, usage);
1322
+ if (estimatedCost > 0) recordCost(apiKeyInfo.id, estimatedCost);
1323
+ }
1324
+
1318
1325
  // Translate response to client's expected format (usually OpenAI)
1319
1326
  // Pass toolNameMap so Claude OAuth proxy_ prefix is stripped in tool_use blocks (#605)
1320
1327
  let translatedResponse = needsTranslation(targetFormat, sourceFormat)
@@ -1447,22 +1454,29 @@ export async function handleChatCore({
1447
1454
  apiKeyName: apiKeyInfo?.name || null,
1448
1455
  noLog: apiKeyInfo?.noLog === true,
1449
1456
  }).catch(() => {});
1457
+
1458
+ if (apiKeyInfo?.id && streamUsage) {
1459
+ calculateCost(provider, model, streamUsage)
1460
+ .then((estimatedCost) => {
1461
+ if (estimatedCost > 0) recordCost(apiKeyInfo.id, estimatedCost);
1462
+ })
1463
+ .catch(() => {});
1464
+ }
1450
1465
  };
1451
1466
 
1452
- // For Codex provider, translate response from openai-responses to openai (Chat Completions) format
1467
+ // For providers using Responses API format, translate stream back to openai (Chat Completions) format
1453
1468
  // UNLESS client is Droid CLI which expects openai-responses format back
1454
1469
  const isDroidCLI =
1455
1470
  userAgent?.toLowerCase().includes("droid") || userAgent?.toLowerCase().includes("codex-cli");
1456
- const needsCodexTranslation =
1457
- provider === "codex" &&
1471
+ const needsResponsesTranslation =
1458
1472
  targetFormat === FORMATS.OPENAI_RESPONSES &&
1459
1473
  sourceFormat === FORMATS.OPENAI &&
1460
1474
  !isResponsesEndpoint &&
1461
1475
  !isDroidCLI;
1462
1476
 
1463
- if (needsCodexTranslation) {
1464
- // Codex returns openai-responses, translate to openai (Chat Completions) that clients expect
1465
- log?.debug?.("STREAM", `Codex translation mode: openai-responses → openai`);
1477
+ if (needsResponsesTranslation) {
1478
+ // Provider returns openai-responses, translate to openai (Chat Completions) that clients expect
1479
+ log?.debug?.("STREAM", `Responses translation mode: openai-responses → openai`);
1466
1480
  transformStream = createSSETransformStreamWithLogger(
1467
1481
  "openai-responses",
1468
1482
  "openai",
@@ -90,7 +90,6 @@ export function claudeToOpenAIResponse(chunk, state) {
90
90
  tool_calls: [
91
91
  {
92
92
  index: toolCall.index,
93
- id: toolCall.id,
94
93
  function: { arguments: delta.partial_json },
95
94
  },
96
95
  ],
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "3.1.9",
3
+ "version": "3.1.10",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omniroute",
9
- "version": "3.1.9",
9
+ "version": "3.1.10",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "workspaces": [
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "3.1.9",
3
+ "version": "3.1.10",
4
4
  "description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -219,7 +219,7 @@ body {
219
219
 
220
220
  /* Material Symbols */
221
221
  .material-symbols-outlined {
222
- font-family: "Material Symbols Outlined", sans-serif;
222
+ font-family: "Material Symbols Outlined", sans-serif !important;
223
223
  font-weight: normal;
224
224
  font-style: normal;
225
225
  font-size: 24px;
@@ -42,7 +42,6 @@ import {
42
42
  import { markAccountExhaustedFrom429 } from "../../domain/quotaCache";
43
43
  import { RequestTelemetry, recordTelemetry } from "../../shared/utils/requestTelemetry";
44
44
  import { generateRequestId } from "../../shared/utils/requestId";
45
- import { recordCost } from "../../domain/costRules";
46
45
  import { logAuditEvent } from "../../lib/compliance/index";
47
46
  import { enforceApiKeyPolicy } from "../../shared/utils/apiKeyPolicy";
48
47
  import {
@@ -421,7 +420,6 @@ async function handleSingleModelChat(
421
420
 
422
421
  if (result.success) {
423
422
  clearModelUnavailability(provider, model);
424
- recordCostIfNeeded(apiKeyInfo, result);
425
423
  if (telemetry) telemetry.startPhase("finalize");
426
424
  if (telemetry) telemetry.endPhase();
427
425
  return result.response;
@@ -670,18 +668,6 @@ async function executeChatWithBreaker({
670
668
  }
671
669
  }
672
670
 
673
- /**
674
- * Record cost if API key has budget tracking enabled.
675
- */
676
- function recordCostIfNeeded(apiKeyInfo: any, result: any) {
677
- if (!apiKeyInfo?.id) return;
678
- try {
679
- const usage = result.usage || {};
680
- const estimatedCost = ((usage.prompt_tokens || 0) + (usage.completion_tokens || 0)) * 0.000001;
681
- if (estimatedCost > 0) recordCost(apiKeyInfo.id, estimatedCost);
682
- } catch {}
683
- }
684
-
685
671
  // ──── Extracted helpers (T-28) ────
686
672
 
687
673
  function handleNoCredentials(
@@ -79,6 +79,8 @@ test("updateModelComboMapping merges fields and returns the refreshed mapping",
79
79
  priority: 1,
80
80
  });
81
81
 
82
+ await new Promise((r) => setTimeout(r, 10));
83
+
82
84
  const updated = await mappingsDb.updateModelComboMapping(created.id, {
83
85
  pattern: "claude-*",
84
86
  comboId: comboB.id,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "3.1.9",
3
+ "version": "3.1.10",
4
4
  "description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,804730,e=>{e.v({name:"omniroute",version:"3.1.9",description:"Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",type:"module",bin:{omniroute:"bin/omniroute.mjs","omniroute-reset-password":"bin/reset-password.mjs"},files:["bin/","app/","open-sse/mcp-server/","src/shared/contracts/","scripts/postinstall.mjs","scripts/native-binary-compat.mjs","README.md","LICENSE"],workspaces:["open-sse"],engines:{node:">=18.0.0 <24.0.0"},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/run-next.mjs dev",build:"node scripts/build-next-isolated.mjs","build:cli":"node scripts/prepublish.mjs",start:"node scripts/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",test:"node --import tsx/esm --test tests/unit/*.test.mjs","test:unit":"node --import tsx/esm --test tests/unit/*.test.mjs","test:plan3":"node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","test:fixes":"node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:security":"node --import tsx/esm --test tests/unit/security-fase01.test.mjs","check:cycles":"node scripts/check-cycles.mjs","check:route-validation:t06":"node scripts/check-route-validation.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","check:docs-sync":"node scripts/check-docs-sync.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","test:vitest":"vitest run open-sse/mcp-server/__tests__/*.test.ts open-sse/services/autoCombo/__tests__/*.test.ts","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e",check:"npm run lint && npm run test",prepublishOnly:"npm run build:cli",postinstall:"node scripts/postinstall.mjs",prepare:"husky","system-info":"node scripts/system-info.mjs"},dependencies:{"@lobehub/icons":"^5.0.1","@modelcontextprotocol/sdk":"^1.27.1","@monaco-editor/react":"^4.7.0","@swc/helpers":"0.5.19",bcryptjs:"^3.0.3","better-sqlite3":"^12.6.2",bottleneck:"^2.19.5",dompurify:"^3.3.2",express:"^5.2.1","fetch-socks":"^1.3.2","http-proxy-middleware":"^3.0.5","https-proxy-agent":"^8.0.0",jose:"^6.1.3",keytar:"^7.9.0",lowdb:"^7.0.1","monaco-editor":"^0.55.1",next:"^16.0.10","next-intl":"^4.8.3","node-machine-id":"^1.1.12",open:"^11.0.0",ora:"^9.1.0",pino:"^10.3.1","pino-pretty":"^13.1.3",react:"19.2.4","react-dom":"19.2.4",recharts:"^3.7.0",selfsigned:"^5.5.0",tsx:"^4.21.0",undici:"^7.19.2",uuid:"^13.0.0","wreq-js":"^2.0.1",zod:"^4.3.6",zustand:"^5.0.10"},devDependencies:{"@playwright/test":"^1.58.2","@tailwindcss/postcss":"^4.1.18","@types/bcryptjs":"^3.0.0","@types/better-sqlite3":"^7.6.13","@types/keytar":"^4.4.0","@types/node":"^25.2.3","@types/react":"^19.2.14","@types/react-dom":"^19.2.3",c8:"^11.0.0",concurrently:"^9.2.1","cross-env":"^10.1.0",eslint:"^9.39.2","eslint-config-next":"^16.0.10",husky:"^9.1.7","lint-staged":"^16.2.7",prettier:"^3.8.1",tailwindcss:"^4",typescript:"^5.9.3","typescript-eslint":"^8.56.0",vitest:"^4.0.18","wait-on":"^9.0.4"},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},pnpm:{onlyBuiltDependencies:["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},overrides:{dompurify:"^3.3.2"}})},175696,e=>{"use strict";var t=e.i(861745),s=e.i(843476);function r({locale:e,...r}){if(!e)throw Error(void 0);return(0,s.jsx)(t.IntlProvider,{locale:e,...r})}e.s(["default",()=>r])}]);