omniroute 3.4.7 → 3.4.8
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.
- package/app/.next/BUILD_ID +1 -1
- package/app/.next/build-manifest.json +3 -3
- package/app/.next/prerender-manifest.json +3 -3
- package/app/.next/server/app/(dashboard)/dashboard/agents/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/api-manager/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/audit/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/auto-combo/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cache/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/costs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/health/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/limits/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/memory/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/onboarding/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/search-tools/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/400/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/401/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/403/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/408/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/429/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/500/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/502/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/503/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_global-error.html +1 -1
- package/app/.next/server/app/_global-error.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/system/version/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/api/chat/route.js +15 -15
- package/app/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/audio/speech/route.js +11 -11
- package/app/.next/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/audio/transcriptions/route.js +5 -5
- package/app/.next/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/chat/completions/route.js +14 -14
- package/app/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/completions/route.js +14 -14
- package/app/.next/server/app/api/v1/completions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/images/generations/route.js +10 -10
- package/app/.next/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/messages/route.js +16 -16
- package/app/.next/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/models/route.js +5 -5
- package/app/.next/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/moderations/route.js +9 -9
- package/app/.next/server/app/api/v1/moderations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/music/generations/route.js +10 -10
- package/app/.next/server/app/api/v1/providers/[provider]/chat/completions/route.js +16 -16
- package/app/.next/server/app/api/v1/providers/[provider]/chat/completions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/providers/[provider]/embeddings/route.js +7 -7
- package/app/.next/server/app/api/v1/providers/[provider]/embeddings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/providers/[provider]/images/generations/route.js +10 -10
- package/app/.next/server/app/api/v1/providers/[provider]/images/generations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/rerank/route.js +9 -9
- package/app/.next/server/app/api/v1/rerank/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/responses/[...path]/route.js +16 -16
- package/app/.next/server/app/api/v1/responses/[...path]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/responses/route.js +16 -16
- package/app/.next/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/route.js +5 -5
- package/app/.next/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/search/analytics/route.js +7 -7
- package/app/.next/server/app/api/v1/search/analytics/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/videos/generations/route.js +10 -10
- package/app/.next/server/app/api/v1beta/models/[...path]/route.js +14 -14
- package/app/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/forgot-password/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/maintenance/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/privacy/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/status/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/terms/page_client-reference-manifest.js +1 -1
- package/app/.next/server/chunks/{[root-of-the-server]__0nxyldc._.js → [root-of-the-server]__0-zca2p._.js} +1 -1
- package/app/.next/server/chunks/{[root-of-the-server]__0urvs3.._.js → [root-of-the-server]__01hbf~_._.js} +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__01ojood._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__030_-af._.js +1 -1
- package/app/.next/server/chunks/{[root-of-the-server]__0j~-yu1._.js → [root-of-the-server]__03l6k3k._.js} +1 -1
- package/app/.next/server/chunks/{[root-of-the-server]__01b8762._.js → [root-of-the-server]__05~jdzu._.js} +1 -1
- package/app/.next/server/chunks/{[root-of-the-server]__07eee_s._.js → [root-of-the-server]__08~6j3q._.js} +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__0a8ozdb._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__0bd4ccn._.js +2 -2
- package/app/.next/server/chunks/{[root-of-the-server]__0_a98vk._.js → [root-of-the-server]__0d6bqbw._.js} +1 -1
- package/app/.next/server/chunks/{[root-of-the-server]__0_c_.ye._.js → [root-of-the-server]__0f2rz58._.js} +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__0jp3yj4._.js +1 -1
- package/app/.next/server/chunks/{[root-of-the-server]__06stuoz._.js → [root-of-the-server]__0jvnjwl._.js} +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__0mj7x5~._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__0n-~kvf._.js +1 -1
- package/app/.next/server/chunks/{[root-of-the-server]__0-y3k-t._.js → [root-of-the-server]__0nzi7ym._.js} +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__0ofxxzh._.js +2 -2
- package/app/.next/server/chunks/{[root-of-the-server]__0uu3t5x._.js → [root-of-the-server]__0pd~24c._.js} +2 -2
- package/app/.next/server/chunks/[root-of-the-server]__0s1dq3.._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__0tsl88m._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__0u5-mph._.js +1 -1
- package/app/.next/server/chunks/{[root-of-the-server]__0vi3.0k._.js → [root-of-the-server]__0uryxsh._.js} +1 -1
- package/app/.next/server/chunks/{[root-of-the-server]__0lwc40h._.js → [root-of-the-server]__0v1kwmx._.js} +1 -1
- package/app/.next/server/chunks/{[root-of-the-server]__04y3b4q._.js → [root-of-the-server]__0vt49c9._.js} +1 -1
- package/app/.next/server/chunks/{[root-of-the-server]__0pylsu2._.js → [root-of-the-server]__0vy97gy._.js} +2 -2
- package/app/.next/server/chunks/{[root-of-the-server]__0~s45~f._.js → [root-of-the-server]__0wd~o5b._.js} +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__0x5yxjy._.js +2 -2
- package/app/.next/server/chunks/{[root-of-the-server]__0vmajf6._.js → [root-of-the-server]__0x_hqjb._.js} +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__0~0hd.s._.js +2 -2
- package/app/.next/server/chunks/{[root-of-the-server]__10~-ypp._.js → [root-of-the-server]__11ptf~3._.js} +1 -1
- package/app/.next/server/chunks/_00.pgsp._.js +1 -1
- package/app/.next/server/chunks/_013gowh._.js +1 -1
- package/app/.next/server/chunks/{_0ucpa5q._.js → _02._8wx._.js} +1 -1
- package/app/.next/server/chunks/_036lxbr._.js +1 -1
- package/app/.next/server/chunks/_05reh6o._.js +1 -1
- package/app/.next/server/chunks/{_0-~thzo._.js → _083_x9z._.js} +2 -2
- package/app/.next/server/chunks/_083a5zg._.js +1 -1
- package/app/.next/server/chunks/{_004r3br._.js → _08cwbl2._.js} +2 -2
- package/app/.next/server/chunks/_0a3.3sc._.js +1 -1
- package/app/.next/server/chunks/_0c.abwr._.js +1 -1
- package/app/.next/server/chunks/_0dfpto1._.js +1 -1
- package/app/.next/server/chunks/_0due8oe._.js +1 -1
- package/app/.next/server/chunks/_0h-j8c2._.js +1 -1
- package/app/.next/server/chunks/_0vx-r0i._.js +2 -2
- package/app/.next/server/chunks/_0w4f3bm._.js +1 -1
- package/app/.next/server/chunks/_10.rw9f._.js +1 -1
- package/app/.next/server/chunks/open-sse_0dawtxk._.js +2 -2
- package/app/.next/server/chunks/open-sse_0p~.88y._.js +1 -1
- package/app/.next/server/chunks/open-sse_0sthby3._.js +1 -1
- package/app/.next/server/chunks/src_0cbm0~g._.js +1 -1
- package/app/.next/server/chunks/src_shared_utils_apiKey_ts_0gzf59_._.js +1 -1
- package/app/.next/server/chunks/src_shared_utils_apiKey_ts_12~h.oz._.js +1 -1
- package/app/.next/server/chunks/ssr/_008ht2n._.js +1 -1
- package/app/.next/server/chunks/ssr/_0oo1f90._.js +1 -1
- package/app/.next/server/chunks/ssr/src_04s-8a5._.js +1 -1
- package/app/.next/server/chunks/ssr/src_0vjsxxr._.js +1 -1
- package/app/.next/server/chunks/ssr/src_shared_utils_apiKey_ts_0l8g1z8._.js +1 -1
- package/app/.next/server/middleware-build-manifest.js +3 -3
- package/app/.next/server/pages/500.html +1 -1
- package/app/.next/server/server-reference-manifest.js +1 -1
- package/app/.next/server/server-reference-manifest.json +1 -1
- package/app/.next/static/chunks/0ipwpwjb2g0uv.js +1 -0
- package/app/.next/static/chunks/0~c--kcvaumm~.js +1 -0
- package/app/.next/static/chunks/{02q7h~xz7j6i3.js → 0~v1trn07bitv.js} +1 -1
- package/app/CHANGELOG.md +12 -0
- package/app/bin/reset-password.mjs +3 -1
- package/app/docs/openapi.yaml +1 -1
- package/app/open-sse/config/registryUtils.ts +1 -0
- package/app/open-sse/config/videoRegistry.ts +1 -3
- package/app/open-sse/executors/antigravity.ts +22 -12
- package/app/open-sse/executors/gemini-cli.ts +3 -1
- package/app/open-sse/executors/qoder.ts +1 -8
- package/app/open-sse/handlers/audioSpeech.ts +1 -0
- package/app/open-sse/handlers/chatCore.ts +2 -1
- package/app/open-sse/handlers/embeddings.ts +1 -0
- package/app/open-sse/handlers/imageGeneration.ts +6 -2
- package/app/open-sse/handlers/musicGeneration.ts +9 -2
- package/app/open-sse/handlers/search.ts +1 -0
- package/app/open-sse/handlers/videoGeneration.ts +11 -3
- package/app/open-sse/mcp-server/index.ts +0 -1
- package/app/open-sse/package.json +1 -1
- package/app/open-sse/services/claudeCodeCompatible.ts +2 -2
- package/app/open-sse/services/modelCapabilities.ts +3 -4
- package/app/open-sse/services/qoderCli.ts +5 -2
- package/app/open-sse/services/tokenRefresh.ts +3 -1
- package/app/open-sse/services/usage.ts +13 -9
- package/app/open-sse/services/workflowFSM.ts +298 -61
- package/app/open-sse/translator/index.ts +5 -1
- package/app/open-sse/translator/response/gemini-to-openai.ts +5 -1
- package/app/open-sse/utils/progressTracker.ts +4 -1
- package/app/open-sse/utils/stream.ts +7 -1
- package/app/open-sse/utils/streamPayloadCollector.ts +5 -1
- package/app/package-lock.json +3 -3
- package/app/package.json +1 -1
- package/app/scripts/check-route-validation.mjs +3 -1
- package/app/scripts/i18n/apply-priority-overrides.mjs +7 -1
- package/app/scripts/prepublish.mjs +2 -2
- package/app/scripts/run-protocol-clients-tests.mjs +7 -1
- package/app/src/app/(dashboard)/dashboard/analytics/components/DiversityScoreCard.tsx +1 -1
- package/app/src/app/(dashboard)/dashboard/auto-combo/page.tsx +0 -1
- package/app/src/app/(dashboard)/dashboard/media/MediaPageClient.tsx +9 -3
- package/app/src/app/(dashboard)/dashboard/providers/[id]/page.tsx +25 -23
- package/app/src/app/(dashboard)/dashboard/search-tools/components/SearchHistory.tsx +3 -1
- package/app/src/app/api/auth/status/route.ts +1 -3
- package/app/src/app/api/mcp/sse/route.ts +2 -2
- package/app/src/app/api/mcp/status/route.ts +1 -2
- package/app/src/app/api/mcp/stream/route.ts +5 -3
- package/app/src/app/api/openapi/spec/route.ts +4 -1
- package/app/src/app/api/openapi/try/route.ts +4 -1
- package/app/src/app/api/providers/[id]/models/route.ts +4 -4
- package/app/src/app/api/providers/[id]/sync-models/route.ts +9 -3
- package/app/src/app/api/settings/auto-disable-accounts/route.ts +6 -1
- package/app/src/app/api/skills/[id]/route.ts +4 -1
- package/app/src/app/api/v1/issues/report/route.ts +9 -1
- package/app/src/app/api/v1beta/models/route.ts +8 -6
- package/app/src/app/api/webhooks/[id]/route.ts +9 -7
- package/app/src/domain/fallbackPolicy.ts +0 -1
- package/app/src/domain/modelAvailability.ts +0 -1
- package/app/src/domain/providerExpiration.ts +2 -6
- package/app/src/lib/db/models.ts +23 -13
- package/app/src/lib/evals/evalRunner.ts +0 -1
- package/app/src/lib/evals/scheduler.ts +2 -6
- package/app/src/lib/oauth/services/antigravity.ts +6 -1
- package/app/src/lib/oauth/services/kiro.ts +12 -2
- package/app/src/lib/oauth/services/oauth.ts +10 -2
- package/app/src/lib/oauth/utils/server.ts +4 -1
- package/app/src/lib/plugins/index.ts +2 -8
- package/app/src/lib/usageAnalytics.ts +5 -1
- package/app/src/mitm/manager.js +1 -1
- package/app/src/mitm/manager.ts +1 -1
- package/app/src/shared/components/Button.tsx +0 -1
- package/app/src/shared/components/Card.tsx +0 -2
- package/app/src/shared/components/FilterBar.tsx +4 -12
- package/app/src/shared/components/Input.tsx +1 -1
- package/app/src/shared/components/Modal.tsx +0 -1
- package/app/src/shared/components/NotificationToast.tsx +1 -3
- package/app/src/shared/components/Select.tsx +1 -1
- package/app/src/shared/components/Sidebar.tsx +3 -3
- package/app/src/shared/components/ThemeToggle.tsx +7 -1
- package/app/src/shared/constants/cliCompatProviders.ts +0 -1
- package/app/src/shared/constants/errorCodes.ts +114 -19
- package/app/src/shared/utils/apiKey.ts +2 -4
- package/app/src/shared/utils/fetchTimeout.ts +0 -1
- package/app/src/shared/utils/inputSanitizer.ts +8 -4
- package/app/src/shared/utils/requestTimeout.ts +5 -1
- package/app/src/sse/handlers/chat.ts +1 -0
- package/app/src/sse/services/auth.ts +8 -3
- package/app/src/sse/services/streamState.ts +5 -1
- package/app/src/store/notificationStore.ts +3 -7
- package/app/tests/unit/t20-t22-provider-headers.test.mjs +3 -1
- package/bin/reset-password.mjs +3 -1
- package/open-sse/mcp-server/__tests__/glmCodingProviderConfig.test.ts +5 -1
- package/open-sse/mcp-server/index.ts +0 -1
- package/package.json +1 -1
- package/app/.next/server/chunks/_0-jnvci._.js +0 -19
- package/app/.next/static/chunks/0l88mho31mflv.js +0 -1
- package/app/.next/static/chunks/0wt-4zl7_gil8.js +0 -1
- /package/app/.next/static/{ri1SkwBU-ygQ2qIDe8jf2 → 1dZBzAZ8QsddVCQRQtqjg}/_buildManifest.js +0 -0
- /package/app/.next/static/{ri1SkwBU-ygQ2qIDe8jf2 → 1dZBzAZ8QsddVCQRQtqjg}/_clientMiddlewareManifest.js +0 -0
- /package/app/.next/static/{ri1SkwBU-ygQ2qIDe8jf2 → 1dZBzAZ8QsddVCQRQtqjg}/_ssgManifest.js +0 -0
|
@@ -13,7 +13,6 @@ interface CardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title">
|
|
|
13
13
|
className?: string;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
17
16
|
export default function Card({
|
|
18
17
|
children,
|
|
19
18
|
title,
|
|
@@ -25,7 +24,6 @@ export default function Card({
|
|
|
25
24
|
className,
|
|
26
25
|
...props
|
|
27
26
|
}: CardProps) {
|
|
28
|
-
|
|
29
27
|
const paddings = {
|
|
30
28
|
none: "",
|
|
31
29
|
xs: "p-3",
|
|
@@ -39,8 +39,7 @@ export default function FilterBar({
|
|
|
39
39
|
setExpandedFilter(null);
|
|
40
40
|
}, [onSearchChange, filters, onFilterChange]);
|
|
41
41
|
|
|
42
|
-
const hasActiveFilters =
|
|
43
|
-
searchValue || Object.values(activeFilters).some((v) => v && v !== "");
|
|
42
|
+
const hasActiveFilters = searchValue || Object.values(activeFilters).some((v) => v && v !== "");
|
|
44
43
|
|
|
45
44
|
return (
|
|
46
45
|
<div
|
|
@@ -89,9 +88,7 @@ export default function FilterBar({
|
|
|
89
88
|
{filters.map((filter) => (
|
|
90
89
|
<div key={filter.key} style={{ position: "relative" }}>
|
|
91
90
|
<button
|
|
92
|
-
onClick={() =>
|
|
93
|
-
setExpandedFilter(expandedFilter === filter.key ? null : filter.key)
|
|
94
|
-
}
|
|
91
|
+
onClick={() => setExpandedFilter(expandedFilter === filter.key ? null : filter.key)}
|
|
95
92
|
style={{
|
|
96
93
|
padding: "6px 12px",
|
|
97
94
|
borderRadius: "6px",
|
|
@@ -99,9 +96,7 @@ export default function FilterBar({
|
|
|
99
96
|
background: activeFilters[filter.key]
|
|
100
97
|
? "rgba(99,102,241,0.15)"
|
|
101
98
|
: "rgba(255,255,255,0.05)",
|
|
102
|
-
color: activeFilters[filter.key]
|
|
103
|
-
? "#818cf8"
|
|
104
|
-
: "var(--text-secondary, #888)",
|
|
99
|
+
color: activeFilters[filter.key] ? "#818cf8" : "var(--text-secondary, #888)",
|
|
105
100
|
fontSize: "12px",
|
|
106
101
|
cursor: "pointer",
|
|
107
102
|
whiteSpace: "nowrap",
|
|
@@ -158,10 +153,7 @@ export default function FilterBar({
|
|
|
158
153
|
width: "100%",
|
|
159
154
|
padding: "6px 12px",
|
|
160
155
|
textAlign: "left",
|
|
161
|
-
background:
|
|
162
|
-
activeFilters[filter.key] === opt
|
|
163
|
-
? "rgba(99,102,241,0.2)"
|
|
164
|
-
: "none",
|
|
156
|
+
background: activeFilters[filter.key] === opt ? "rgba(99,102,241,0.2)" : "none",
|
|
165
157
|
border: "none",
|
|
166
158
|
color:
|
|
167
159
|
activeFilters[filter.key] === opt
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { useId } from "react";
|
|
4
4
|
import { cn } from "@/shared/utils/cn";
|
|
5
5
|
|
|
6
|
-
interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>,
|
|
6
|
+
interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size"> {
|
|
7
7
|
label?: React.ReactNode;
|
|
8
8
|
error?: React.ReactNode;
|
|
9
9
|
hint?: React.ReactNode;
|
|
@@ -68,9 +68,7 @@ function Toast({ notification, onDismiss }) {
|
|
|
68
68
|
boxShadow: "0 8px 32px rgba(0,0,0,0.2)",
|
|
69
69
|
minWidth: "320px",
|
|
70
70
|
maxWidth: "420px",
|
|
71
|
-
animation: isExiting
|
|
72
|
-
? "toastOut 0.2s ease-in forwards"
|
|
73
|
-
: "toastIn 0.3s ease-out forwards",
|
|
71
|
+
animation: isExiting ? "toastOut 0.2s ease-in forwards" : "toastIn 0.3s ease-out forwards",
|
|
74
72
|
transition: "all 0.2s ease",
|
|
75
73
|
}}
|
|
76
74
|
>
|
|
@@ -8,7 +8,7 @@ interface SelectOption {
|
|
|
8
8
|
label: string;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>,
|
|
11
|
+
interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, "size"> {
|
|
12
12
|
label?: React.ReactNode;
|
|
13
13
|
options?: SelectOption[];
|
|
14
14
|
placeholder?: string;
|
|
@@ -67,13 +67,13 @@ export default function Sidebar({
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
if ("instanceName" in detail) {
|
|
70
|
-
setCustomAppName(detail.instanceName as string || null);
|
|
70
|
+
setCustomAppName((detail.instanceName as string) || null);
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
if ("customLogoBase64" in detail) {
|
|
74
|
-
setCustomLogo(detail.customLogoBase64 as string || null);
|
|
74
|
+
setCustomLogo((detail.customLogoBase64 as string) || null);
|
|
75
75
|
} else if ("customLogoUrl" in detail) {
|
|
76
|
-
setCustomLogo(detail.customLogoUrl as string || null);
|
|
76
|
+
setCustomLogo((detail.customLogoUrl as string) || null);
|
|
77
77
|
}
|
|
78
78
|
};
|
|
79
79
|
|
|
@@ -3,7 +3,13 @@
|
|
|
3
3
|
import { useTheme } from "@/shared/hooks/useTheme";
|
|
4
4
|
import { cn } from "@/shared/utils/cn";
|
|
5
5
|
|
|
6
|
-
export default function ThemeToggle({
|
|
6
|
+
export default function ThemeToggle({
|
|
7
|
+
className,
|
|
8
|
+
variant = "default",
|
|
9
|
+
}: {
|
|
10
|
+
className?: any;
|
|
11
|
+
variant?: string;
|
|
12
|
+
}) {
|
|
7
13
|
const { theme, toggleTheme, isDark } = useTheme();
|
|
8
14
|
|
|
9
15
|
const variants = {
|
|
@@ -26,42 +26,137 @@ interface ErrorDetails {
|
|
|
26
26
|
|
|
27
27
|
export const ERROR_CODES: Record<string, ErrorCodeDef> = {
|
|
28
28
|
// ── Auth ──
|
|
29
|
-
AUTH_001: {
|
|
29
|
+
AUTH_001: {
|
|
30
|
+
code: "AUTH_001",
|
|
31
|
+
message: "Authentication required",
|
|
32
|
+
httpStatus: 401,
|
|
33
|
+
category: "AUTH",
|
|
34
|
+
},
|
|
30
35
|
AUTH_002: { code: "AUTH_002", message: "Invalid API key", httpStatus: 401, category: "AUTH" },
|
|
31
36
|
AUTH_003: { code: "AUTH_003", message: "API key expired", httpStatus: 401, category: "AUTH" },
|
|
32
|
-
AUTH_004: {
|
|
37
|
+
AUTH_004: {
|
|
38
|
+
code: "AUTH_004",
|
|
39
|
+
message: "Insufficient permissions",
|
|
40
|
+
httpStatus: 403,
|
|
41
|
+
category: "AUTH",
|
|
42
|
+
},
|
|
33
43
|
AUTH_005: { code: "AUTH_005", message: "Account locked", httpStatus: 423, category: "AUTH" },
|
|
34
|
-
AUTH_006: {
|
|
44
|
+
AUTH_006: {
|
|
45
|
+
code: "AUTH_006",
|
|
46
|
+
message: "No credentials for provider",
|
|
47
|
+
httpStatus: 400,
|
|
48
|
+
category: "AUTH",
|
|
49
|
+
},
|
|
35
50
|
|
|
36
51
|
// ── Proxy ──
|
|
37
|
-
PROXY_001: {
|
|
52
|
+
PROXY_001: {
|
|
53
|
+
code: "PROXY_001",
|
|
54
|
+
message: "Proxy connection failed",
|
|
55
|
+
httpStatus: 502,
|
|
56
|
+
category: "PROXY",
|
|
57
|
+
},
|
|
38
58
|
PROXY_002: { code: "PROXY_002", message: "Proxy timeout", httpStatus: 504, category: "PROXY" },
|
|
39
|
-
PROXY_003: {
|
|
59
|
+
PROXY_003: {
|
|
60
|
+
code: "PROXY_003",
|
|
61
|
+
message: "All proxies exhausted",
|
|
62
|
+
httpStatus: 503,
|
|
63
|
+
category: "PROXY",
|
|
64
|
+
},
|
|
40
65
|
|
|
41
66
|
// ── Rate Limiting ──
|
|
42
|
-
RATE_001: {
|
|
43
|
-
|
|
44
|
-
|
|
67
|
+
RATE_001: {
|
|
68
|
+
code: "RATE_001",
|
|
69
|
+
message: "Rate limit exceeded",
|
|
70
|
+
httpStatus: 429,
|
|
71
|
+
category: "RATE_LIMIT",
|
|
72
|
+
},
|
|
73
|
+
RATE_002: {
|
|
74
|
+
code: "RATE_002",
|
|
75
|
+
message: "Daily budget exceeded",
|
|
76
|
+
httpStatus: 429,
|
|
77
|
+
category: "RATE_LIMIT",
|
|
78
|
+
},
|
|
79
|
+
RATE_003: {
|
|
80
|
+
code: "RATE_003",
|
|
81
|
+
message: "All accounts rate-limited",
|
|
82
|
+
httpStatus: 503,
|
|
83
|
+
category: "RATE_LIMIT",
|
|
84
|
+
},
|
|
45
85
|
|
|
46
86
|
// ── Model / Routing ──
|
|
47
87
|
MODEL_001: { code: "MODEL_001", message: "Model not found", httpStatus: 404, category: "MODEL" },
|
|
48
|
-
MODEL_002: {
|
|
49
|
-
|
|
88
|
+
MODEL_002: {
|
|
89
|
+
code: "MODEL_002",
|
|
90
|
+
message: "Ambiguous model identifier",
|
|
91
|
+
httpStatus: 400,
|
|
92
|
+
category: "MODEL",
|
|
93
|
+
},
|
|
94
|
+
MODEL_003: {
|
|
95
|
+
code: "MODEL_003",
|
|
96
|
+
message: "Model temporarily unavailable",
|
|
97
|
+
httpStatus: 503,
|
|
98
|
+
category: "MODEL",
|
|
99
|
+
},
|
|
50
100
|
|
|
51
101
|
// ── Provider ──
|
|
52
|
-
PROVIDER_001: {
|
|
53
|
-
|
|
54
|
-
|
|
102
|
+
PROVIDER_001: {
|
|
103
|
+
code: "PROVIDER_001",
|
|
104
|
+
message: "Provider error",
|
|
105
|
+
httpStatus: 502,
|
|
106
|
+
category: "PROVIDER",
|
|
107
|
+
},
|
|
108
|
+
PROVIDER_002: {
|
|
109
|
+
code: "PROVIDER_002",
|
|
110
|
+
message: "Provider timeout",
|
|
111
|
+
httpStatus: 504,
|
|
112
|
+
category: "PROVIDER",
|
|
113
|
+
},
|
|
114
|
+
PROVIDER_003: {
|
|
115
|
+
code: "PROVIDER_003",
|
|
116
|
+
message: "Provider not configured",
|
|
117
|
+
httpStatus: 400,
|
|
118
|
+
category: "PROVIDER",
|
|
119
|
+
},
|
|
55
120
|
|
|
56
121
|
// ── Validation ──
|
|
57
|
-
VALID_001: {
|
|
58
|
-
|
|
59
|
-
|
|
122
|
+
VALID_001: {
|
|
123
|
+
code: "VALID_001",
|
|
124
|
+
message: "Invalid request body",
|
|
125
|
+
httpStatus: 400,
|
|
126
|
+
category: "VALIDATION",
|
|
127
|
+
},
|
|
128
|
+
VALID_002: {
|
|
129
|
+
code: "VALID_002",
|
|
130
|
+
message: "Missing required field",
|
|
131
|
+
httpStatus: 400,
|
|
132
|
+
category: "VALIDATION",
|
|
133
|
+
},
|
|
134
|
+
VALID_003: {
|
|
135
|
+
code: "VALID_003",
|
|
136
|
+
message: "Input sanitization blocked",
|
|
137
|
+
httpStatus: 400,
|
|
138
|
+
category: "VALIDATION",
|
|
139
|
+
},
|
|
60
140
|
|
|
61
141
|
// ── Internal ──
|
|
62
|
-
INTERNAL_001: {
|
|
63
|
-
|
|
64
|
-
|
|
142
|
+
INTERNAL_001: {
|
|
143
|
+
code: "INTERNAL_001",
|
|
144
|
+
message: "Internal server error",
|
|
145
|
+
httpStatus: 500,
|
|
146
|
+
category: "INTERNAL",
|
|
147
|
+
},
|
|
148
|
+
INTERNAL_002: {
|
|
149
|
+
code: "INTERNAL_002",
|
|
150
|
+
message: "Database error",
|
|
151
|
+
httpStatus: 500,
|
|
152
|
+
category: "INTERNAL",
|
|
153
|
+
},
|
|
154
|
+
INTERNAL_003: {
|
|
155
|
+
code: "INTERNAL_003",
|
|
156
|
+
message: "Circuit breaker open",
|
|
157
|
+
httpStatus: 503,
|
|
158
|
+
category: "INTERNAL",
|
|
159
|
+
},
|
|
65
160
|
};
|
|
66
161
|
|
|
67
162
|
export function createErrorResponse(code: string, details: ErrorDetails = {}) {
|
|
@@ -19,9 +19,7 @@ function getApiKeySecret(): string {
|
|
|
19
19
|
function generateKeyId(): string {
|
|
20
20
|
const chars = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
21
21
|
let result = "";
|
|
22
|
-
|
|
23
|
-
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
24
|
-
}
|
|
22
|
+
result = crypto.randomBytes(3).toString("hex");
|
|
25
23
|
return result;
|
|
26
24
|
}
|
|
27
25
|
|
|
@@ -31,7 +29,7 @@ function generateKeyId(): string {
|
|
|
31
29
|
function generateCrc(machineId: string, keyId: string): string {
|
|
32
30
|
const secret = getApiKeySecret();
|
|
33
31
|
return crypto
|
|
34
|
-
.createHmac("sha256", secret)
|
|
32
|
+
.createHmac("sha256", secret) /* lgtm [js/insufficient-password-hash] */
|
|
35
33
|
.update(machineId + keyId)
|
|
36
34
|
.digest("hex")
|
|
37
35
|
.slice(0, 8);
|
|
@@ -13,17 +13,20 @@
|
|
|
13
13
|
const INJECTION_PATTERNS = [
|
|
14
14
|
{
|
|
15
15
|
name: "system_override",
|
|
16
|
-
pattern:
|
|
16
|
+
pattern:
|
|
17
|
+
/\b(ignore|disregard|forget)\s+(all\s+)?(previous|prior|above|earlier)\s+(instructions?|prompts?|rules?|context)/i,
|
|
17
18
|
severity: "high",
|
|
18
19
|
},
|
|
19
20
|
{
|
|
20
21
|
name: "role_hijack",
|
|
21
|
-
pattern:
|
|
22
|
+
pattern:
|
|
23
|
+
/\b(you\s+are\s+now|act\s+as\s+if|pretend\s+(to\s+be|you\s+are)|from\s+now\s+on\s+you\s+are)\b/i,
|
|
22
24
|
severity: "medium",
|
|
23
25
|
},
|
|
24
26
|
{
|
|
25
27
|
name: "system_prompt_leak",
|
|
26
|
-
pattern:
|
|
28
|
+
pattern:
|
|
29
|
+
/\b(reveal|show|display|print|output|repeat)\s+(your\s+)?(system\s+prompt|instructions?|initial\s+prompt|hidden\s+prompt)/i,
|
|
27
30
|
severity: "high",
|
|
28
31
|
},
|
|
29
32
|
{
|
|
@@ -38,7 +41,8 @@ const INJECTION_PATTERNS = [
|
|
|
38
41
|
},
|
|
39
42
|
{
|
|
40
43
|
name: "encoding_evasion",
|
|
41
|
-
pattern:
|
|
44
|
+
pattern:
|
|
45
|
+
/\b(base64\s+decode|rot13|hex\s+decode|unicode\s+escape)\b.*\b(instruction|prompt|command)\b/i,
|
|
42
46
|
severity: "medium",
|
|
43
47
|
},
|
|
44
48
|
];
|
|
@@ -57,7 +57,11 @@ export async function fetchWithTimeout(url: string, options: RequestInit & Timeo
|
|
|
57
57
|
* @returns {Promise<T>}
|
|
58
58
|
* @throws {Error} With name 'TimeoutError' if operation times out
|
|
59
59
|
*/
|
|
60
|
-
export async function withTimeout<T>(
|
|
60
|
+
export async function withTimeout<T>(
|
|
61
|
+
fn: () => Promise<T>,
|
|
62
|
+
timeoutMs: number,
|
|
63
|
+
label = "Operation"
|
|
64
|
+
): Promise<T> {
|
|
61
65
|
return new Promise<T>((resolve, reject) => {
|
|
62
66
|
const timeoutId = setTimeout(() => {
|
|
63
67
|
const error: any = new Error(`${label} timed out after ${timeoutMs}ms`);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { randomUUID } from "crypto";
|
|
1
2
|
import {
|
|
2
3
|
getProviderConnections,
|
|
3
4
|
validateApiKey,
|
|
@@ -659,8 +660,11 @@ export async function getProviderCredentials(
|
|
|
659
660
|
if (orderedConnections.length <= 2) {
|
|
660
661
|
connection = orderedConnections[0];
|
|
661
662
|
} else {
|
|
662
|
-
const i =
|
|
663
|
-
|
|
663
|
+
const i =
|
|
664
|
+
parseInt(randomUUID().replace(/-/g, "").substring(0, 8), 16) % orderedConnections.length;
|
|
665
|
+
let j =
|
|
666
|
+
parseInt(randomUUID().replace(/-/g, "").substring(0, 8), 16) %
|
|
667
|
+
(orderedConnections.length - 1);
|
|
664
668
|
if (j >= i) j++;
|
|
665
669
|
const a = orderedConnections[i];
|
|
666
670
|
const b = orderedConnections[j];
|
|
@@ -671,7 +675,8 @@ export async function getProviderCredentials(
|
|
|
671
675
|
}
|
|
672
676
|
} else if (strategy === "random") {
|
|
673
677
|
// Random: Fisher-Yates-inspired random pick
|
|
674
|
-
const idx =
|
|
678
|
+
const idx =
|
|
679
|
+
parseInt(randomUUID().replace(/-/g, "").substring(0, 8), 16) % orderedConnections.length;
|
|
675
680
|
connection = orderedConnections[idx];
|
|
676
681
|
} else if (strategy === "least-used") {
|
|
677
682
|
// Least Used: pick the one with oldest lastUsedAt
|
|
@@ -165,7 +165,11 @@ export class StreamTracker {
|
|
|
165
165
|
* @returns {boolean}
|
|
166
166
|
*/
|
|
167
167
|
isTerminal(): boolean {
|
|
168
|
-
const terminalStates: string[] = [
|
|
168
|
+
const terminalStates: string[] = [
|
|
169
|
+
STREAM_STATES.COMPLETED,
|
|
170
|
+
STREAM_STATES.FAILED,
|
|
171
|
+
STREAM_STATES.CANCELLED,
|
|
172
|
+
];
|
|
169
173
|
return terminalStates.includes(this.state);
|
|
170
174
|
}
|
|
171
175
|
}
|
|
@@ -81,16 +81,12 @@ export const useNotificationStore = create<NotificationStore>((set, get) => ({
|
|
|
81
81
|
|
|
82
82
|
// ─── Convenience Methods ─────────────────
|
|
83
83
|
|
|
84
|
-
success: (message, title) =>
|
|
85
|
-
get().addNotification({ type: "success", message, title }),
|
|
84
|
+
success: (message, title) => get().addNotification({ type: "success", message, title }),
|
|
86
85
|
|
|
87
86
|
error: (message, title) =>
|
|
88
87
|
get().addNotification({ type: "error", message, title, duration: 8000 }),
|
|
89
88
|
|
|
90
|
-
warning: (message, title) =>
|
|
91
|
-
get().addNotification({ type: "warning", message, title }),
|
|
89
|
+
warning: (message, title) => get().addNotification({ type: "warning", message, title }),
|
|
92
90
|
|
|
93
|
-
info: (message, title) =>
|
|
94
|
-
get().addNotification({ type: "info", message, title }),
|
|
91
|
+
info: (message, title) => get().addNotification({ type: "info", message, title }),
|
|
95
92
|
}));
|
|
96
|
-
|
|
@@ -7,7 +7,9 @@ const { REGISTRY } = await import("../../open-sse/config/providerRegistry.ts");
|
|
|
7
7
|
test("T20: antigravity config has updated User-Agent and sandbox fallback URL", () => {
|
|
8
8
|
const antigravity = REGISTRY.antigravity;
|
|
9
9
|
assert.ok(Array.isArray(antigravity.baseUrls));
|
|
10
|
-
assert.ok(
|
|
10
|
+
assert.ok(
|
|
11
|
+
antigravity.baseUrls.some((u) => u === "https://daily-cloudcode-pa.sandbox.googleapis.com")
|
|
12
|
+
);
|
|
11
13
|
assert.match(
|
|
12
14
|
antigravity.headers["User-Agent"],
|
|
13
15
|
new RegExp(`^antigravity/1\\.107\\.0\\s+${platform()}\\/${arch()}$`)
|
package/bin/reset-password.mjs
CHANGED
|
@@ -35,7 +35,9 @@ function ask(question) {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
function hashPassword(password) {
|
|
38
|
-
return createHash("sha256")
|
|
38
|
+
return createHash("sha256")
|
|
39
|
+
.update(password) /* lgtm[js/insufficient-password-hash] */
|
|
40
|
+
.digest("hex");
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
console.log("\n🔑 OmniRoute — Password Reset\n");
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
2
|
|
|
3
3
|
import { getRegistryEntry } from "../../config/providerRegistry.ts";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
PROVIDER_ID_TO_ALIAS,
|
|
6
|
+
getModelsByProviderId,
|
|
7
|
+
getProviderModels,
|
|
8
|
+
} from "../../config/providerModels.ts";
|
|
5
9
|
import { supportsToolCalling } from "../../services/modelCapabilities.ts";
|
|
6
10
|
import { getPricingForModel } from "../../../src/shared/constants/pricing.ts";
|
|
7
11
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omniroute",
|
|
3
|
-
"version": "3.4.
|
|
3
|
+
"version": "3.4.8",
|
|
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": {
|