zevairouter 1.0.104 → 1.0.106
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/CHANGELOG.md +44 -0
- package/README.md +6 -2
- package/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +11 -11
- package/cli/app/.next-cli-build/build-manifest.json +2 -2
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback.html +1 -1
- package/cli/app/.next-cli-build/server/app/callback.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +7 -7
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/index.html +1 -1
- package/cli/app/.next-cli-build/server/app/index.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/landing/page.js +1 -1
- package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/landing.html +1 -1
- package/cli/app/.next-cli-build/server/app/landing.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/login.html +1 -1
- package/cli/app/.next-cli-build/server/app/login.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app-paths-manifest.json +11 -11
- package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/3407.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/412.js +2 -2
- package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/5469.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
- package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/pages/404.html +1 -1
- package/cli/app/.next-cli-build/server/pages/500.html +1 -1
- package/cli/app/.next-cli-build/static/chunks/{3702-71ea2cb15f471160.js → 3702-5f034d6da865ad7a.js} +1 -1
- package/cli/app/.next-cli-build/static/chunks/5497-cd29d71de5a0d443.js +7 -0
- package/cli/app/.next-cli-build/static/chunks/9126-2efa8985d72b10b7.js +1 -0
- package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/{page-16cab1ed7e707419.js → page-a2d55f0103564e42.js} +1 -1
- package/cli/app/.next-cli-build/static/chunks/app/landing/page-a5bcf36367dce737.js +1 -0
- package/cli/app/.next-cli-build/static/css/b2b993ebf3c2ebd5.css +1 -0
- package/cli/app/CHANGELOG.md +44 -0
- package/cli/app/package.json +7 -2
- package/cli/package.json +1 -1
- package/open-sse/handlers/embeddingProviders/gemini.js +4 -1
- package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +4 -1
- package/open-sse/handlers/imageProviders/blackForestLabs.js +4 -1
- package/open-sse/handlers/imageProviders/cloudflareAi.js +4 -1
- package/open-sse/handlers/imageProviders/codex.js +4 -1
- package/open-sse/handlers/imageProviders/comfyui.js +4 -1
- package/open-sse/handlers/imageProviders/falAi.js +4 -1
- package/open-sse/handlers/imageProviders/gemini.js +4 -1
- package/open-sse/handlers/imageProviders/huggingface.js +4 -1
- package/open-sse/handlers/imageProviders/nanobanana.js +4 -1
- package/open-sse/handlers/imageProviders/runwayml.js +4 -1
- package/open-sse/handlers/imageProviders/sdwebui.js +4 -1
- package/open-sse/handlers/imageProviders/stabilityAi.js +4 -1
- package/open-sse/handlers/ttsProviders/edgeTts.js +4 -1
- package/open-sse/handlers/ttsProviders/elevenlabs.js +4 -1
- package/open-sse/handlers/ttsProviders/gemini.js +4 -1
- package/open-sse/handlers/ttsProviders/googleTts.js +4 -1
- package/open-sse/handlers/ttsProviders/localDevice.js +4 -1
- package/open-sse/handlers/ttsProviders/openai.js +4 -1
- package/open-sse/handlers/ttsProviders/openrouter.js +4 -1
- package/open-sse/utils/cursorChecksum.js +4 -1
- package/open-sse/utils/cursorProtobuf.js +4 -1
- package/package.json +7 -2
- package/src/app/(dashboard)/dashboard/automation/page.js +3 -0
- package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +8 -1
- package/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/BaseUrlSelect.js +2 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/ClineToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/CodexToolCard.js +7 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/CopilotToolCard.js +7 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/CoworkToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/DeepSeekTuiToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/EndpointPresetControl.js +1 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/HermesToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/JcodeToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/KiloToolCard.js +5 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/MitmToolCard.js +2 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/OpenCodeToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/combos/page.js +3 -0
- package/src/app/(dashboard)/dashboard/context/page.js +1 -0
- package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.js +7 -0
- package/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +10 -0
- package/src/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +3 -0
- package/src/app/(dashboard)/dashboard/mitm/MitmPageClient.js +4 -0
- package/src/app/(dashboard)/dashboard/profile/page.js +2 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/AddCustomModelModal.js +1 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/ConnectionRow.js +1 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/EditCompatibleNodeModal.js +1 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/page.js +4 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/page.new.js +8 -6
- package/src/app/(dashboard)/dashboard/providers/components/ConnectionsCard.js +2 -0
- package/src/app/(dashboard)/dashboard/providers/components/ModelAvailabilityBadge.js +1 -0
- package/src/app/(dashboard)/dashboard/providers/components/ModelsCard.js +1 -0
- package/src/app/(dashboard)/dashboard/providers/page.js +9 -1
- package/src/app/(dashboard)/dashboard/proxy-pools/page.js +4 -1
- package/src/app/(dashboard)/dashboard/pxpipe/PxpipeClient.js +1 -0
- package/src/app/(dashboard)/dashboard/terminal/TerminalPageClient.js +1 -0
- package/src/app/(dashboard)/dashboard/token-saver/TokenSaverClient.js +3 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.js +2 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +11 -6
- package/src/app/(dashboard)/dashboard/usage/components/RequestDetailsTab.js +2 -0
- package/src/app/(dashboard)/dashboard/usage/components/UsageChart.js +1 -0
- package/src/app/(dashboard)/dashboard/usage/components/UsageTable.js +1 -0
- package/src/app/api/oauth/cursor/auto-import/route.js +0 -1
- package/src/app/callback/page.js +1 -0
- package/src/app/dashboard/settings/pricing/page.js +1 -0
- package/src/lib/db/migrations/001-initial.js +4 -1
- package/src/shared/components/AddCustomEmbeddingModal.js +1 -0
- package/src/shared/components/BulkAccountAutomationModal.js +3 -1
- package/src/shared/components/ChangelogModal.js +1 -0
- package/src/shared/components/CursorAuthModal.js +1 -0
- package/src/shared/components/EditConnectionModal.js +1 -0
- package/src/shared/components/HeaderLanguage.js +1 -0
- package/src/shared/components/KiroAuthModal.js +1 -0
- package/src/shared/components/KiroOAuthWrapper.js +1 -0
- package/src/shared/components/LanguageSwitcher.js +2 -0
- package/src/shared/components/McpMarketplaceModal.js +1 -1
- package/src/shared/components/ModelSelectModal.js +10 -6
- package/src/shared/components/OAuthModal.js +3 -1
- package/src/shared/components/PricingModal.js +1 -0
- package/src/shared/components/ProviderIcon.js +8 -3
- package/src/shared/components/RequestLogger.js +1 -0
- package/src/shared/components/Sidebar.js +1 -0
- package/cli/app/.next-cli-build/static/chunks/5497-667e14237552c864.js +0 -7
- package/cli/app/.next-cli-build/static/chunks/9126-5dc2ccda07a8c55e.js +0 -1
- package/cli/app/.next-cli-build/static/chunks/app/landing/page-6621ec8b157e77cc.js +0 -1
- package/cli/app/.next-cli-build/static/css/c7077ef89735a356.css +0 -1
- /package/cli/app/.next-cli-build/static/{CsjKSx0C8GBhUjd-ob2F9 → cfUGr8kYmZvImlaBuzL9m}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{CsjKSx0C8GBhUjd-ob2F9 → cfUGr8kYmZvImlaBuzL9m}/_ssgManifest.js +0 -0
|
@@ -10,7 +10,7 @@ function modelToEndpoint(model) {
|
|
|
10
10
|
return "core";
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
const stabilityAi = {
|
|
14
14
|
buildUrl: (model) => `${BASE_URL}/${modelToEndpoint(model)}`,
|
|
15
15
|
buildHeaders: (creds) => {
|
|
16
16
|
const key = creds?.apiKey || creds?.accessToken;
|
|
@@ -32,3 +32,6 @@ export default {
|
|
|
32
32
|
return { created: nowSec(), data: [] };
|
|
33
33
|
},
|
|
34
34
|
};
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
export default stabilityAi;
|
|
@@ -63,7 +63,7 @@ export async function fetchEdgeTtsVoices() {
|
|
|
63
63
|
return voices;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
const edgeTts = {
|
|
67
67
|
noAuth: true,
|
|
68
68
|
async synthesize(text, model) {
|
|
69
69
|
const voiceId = model || "vi-VN-HoaiMyNeural";
|
|
@@ -87,3 +87,6 @@ export default {
|
|
|
87
87
|
return { base64: Buffer.from(buf).toString("base64"), format: "mp3" };
|
|
88
88
|
},
|
|
89
89
|
};
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
export default edgeTts;
|
|
@@ -21,7 +21,7 @@ export async function fetchElevenLabsVoices(apiKey) {
|
|
|
21
21
|
return voices;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
const elevenlabs = {
|
|
25
25
|
async synthesize(text, model, credentials) {
|
|
26
26
|
if (!credentials?.apiKey) throw new Error("ElevenLabs API key required");
|
|
27
27
|
let modelId = "eleven_flash_v2_5";
|
|
@@ -46,3 +46,6 @@ export default {
|
|
|
46
46
|
return { base64: Buffer.from(buf).toString("base64"), format: "mp3" };
|
|
47
47
|
},
|
|
48
48
|
};
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
export default elevenlabs;
|
|
@@ -47,7 +47,7 @@ function buildPrompt(text, language) {
|
|
|
47
47
|
return language ? `Say in ${language}: ${text}` : `Say: ${text}`;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
const gemini = {
|
|
51
51
|
async synthesize(text, model, credentials, _responseFormat, opts = {}) {
|
|
52
52
|
if (!credentials?.apiKey) throw new Error("No Gemini API key configured");
|
|
53
53
|
const { modelId, voiceId } = parseGeminiModelVoice(model);
|
|
@@ -115,3 +115,6 @@ const PREBUILT_VOICES = [
|
|
|
115
115
|
export async function fetchGeminiVoices() {
|
|
116
116
|
return PREBUILT_VOICES.map((v) => ({ voice_id: v.id, name: v.id, labels: { language: v.lang, gender: v.gender } }));
|
|
117
117
|
}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
export default gemini;
|
|
@@ -19,7 +19,7 @@ async function getToken() {
|
|
|
19
19
|
return cache.token;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
const googleTts = {
|
|
23
23
|
noAuth: true,
|
|
24
24
|
async synthesize(text, model) {
|
|
25
25
|
const lang = model || "en";
|
|
@@ -52,3 +52,6 @@ export default {
|
|
|
52
52
|
return { base64, format: "mp3" };
|
|
53
53
|
},
|
|
54
54
|
};
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
export default googleTts;
|
|
@@ -78,10 +78,13 @@ async function synthesizeMacOrWin(text, voiceId) {
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
const localDevice = {
|
|
82
82
|
noAuth: true,
|
|
83
83
|
async synthesize(text, model) {
|
|
84
84
|
const base64 = await synthesizeMacOrWin(text, model);
|
|
85
85
|
return { base64, format: "mp3" };
|
|
86
86
|
},
|
|
87
87
|
};
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
export default localDevice;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// OpenAI TTS — model format: "tts-model/voice"
|
|
2
2
|
import { Buffer } from "node:buffer";
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
const openai = {
|
|
5
5
|
async synthesize(text, model, credentials) {
|
|
6
6
|
if (!credentials?.apiKey) throw new Error("No OpenAI API key configured");
|
|
7
7
|
|
|
@@ -28,3 +28,6 @@ export default {
|
|
|
28
28
|
return { base64: Buffer.from(buf).toString("base64"), format: "mp3" };
|
|
29
29
|
},
|
|
30
30
|
};
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
export default openai;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// OpenRouter TTS — via chat completions + audio modality (SSE stream)
|
|
2
|
-
|
|
2
|
+
const openrouter = {
|
|
3
3
|
async synthesize(text, model, credentials) {
|
|
4
4
|
if (!credentials?.apiKey) throw new Error("No OpenRouter API key configured");
|
|
5
5
|
|
|
@@ -68,3 +68,6 @@ export default {
|
|
|
68
68
|
return { base64: chunks.join(""), format: "wav" };
|
|
69
69
|
},
|
|
70
70
|
};
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
export default openrouter;
|
|
@@ -141,9 +141,12 @@ export function buildCursorHeaders(accessToken, machineId = null, ghostMode = tr
|
|
|
141
141
|
};
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
|
|
144
|
+
const cursorChecksum = {
|
|
145
145
|
generateCursorChecksum,
|
|
146
146
|
buildCursorHeaders,
|
|
147
147
|
generateHashed64Hex,
|
|
148
148
|
generateSessionId
|
|
149
149
|
};
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
export default cursorChecksum;
|
|
@@ -889,7 +889,7 @@ export function extractTextFromResponse(payload) {
|
|
|
889
889
|
|
|
890
890
|
// ==================== EXPORTS ====================
|
|
891
891
|
|
|
892
|
-
|
|
892
|
+
const cursorProtobuf = {
|
|
893
893
|
encodeVarint,
|
|
894
894
|
encodeField,
|
|
895
895
|
encodeMessage,
|
|
@@ -902,3 +902,6 @@ export default {
|
|
|
902
902
|
parseConnectRPCFrame,
|
|
903
903
|
extractTextFromResponse
|
|
904
904
|
};
|
|
905
|
+
|
|
906
|
+
|
|
907
|
+
export default cursorProtobuf;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zevairouter",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.106",
|
|
4
4
|
"description": "Self-hosted AI router: many providers, one OpenAI-compatible /v1 endpoint and dashboard",
|
|
5
5
|
"bin": {
|
|
6
6
|
"zevai": "./cli/cli.js"
|
|
@@ -68,13 +68,18 @@
|
|
|
68
68
|
"zustand": "^5.0.10"
|
|
69
69
|
},
|
|
70
70
|
"comment_optional_runtime": "Heavy packages are NOT optionalDependencies (clean `npm i -g`, no deprecated noise). postinstall warm-ups them into ~/.zevai/runtime so one command still gets full features. ZEVAI_MINIMAL_POSTINSTALL=1 skips browser downloads. Runtime code can still lazy-retry: better-sqlite3, camoufox-js, cloakbrowser, node-pty, playwright.",
|
|
71
|
+
"overrides": {
|
|
72
|
+
"dompurify": "^3.4.12",
|
|
73
|
+
"postcss": "^8.5.10"
|
|
74
|
+
},
|
|
75
|
+
"comment_overrides": "dompurify: monaco-editor@0.55.1 pins vulnerable dompurify@3.2.7 (multiple mXSS advisories, all fixed in 3.4.x). Override forces the patched 3.4.12 until monaco ships a stable release with the fix (currently only in 0.56.0-dev). We don't use dompurify directly; monaco only uses it to sanitize HTML hover/completion output.",
|
|
71
76
|
"devDependencies": {
|
|
72
77
|
"@tailwindcss/postcss": "^4.1.18",
|
|
73
78
|
"better-sqlite3": "^12.6.2",
|
|
74
79
|
"esbuild": "^0.28.1",
|
|
75
80
|
"eslint": "^9",
|
|
76
81
|
"eslint-config-next": "16.2.9",
|
|
77
|
-
"postcss": "^8.5.
|
|
82
|
+
"postcss": "^8.5.10",
|
|
78
83
|
"tailwindcss": "^4"
|
|
79
84
|
},
|
|
80
85
|
"engines": {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
/* eslint-disable @next/next/no-img-element -- dynamic/blob/external image src with onError fallback; next/image requires static dims + domain allowlist */
|
|
2
3
|
|
|
3
4
|
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
4
5
|
import { Badge, Button, BulkAccountAutomationModal, Card, CardSkeleton, CodeBuddyCnPhoneRegisterModal, KiroOAuthWrapper, OAuthModal } from "@/shared/components";
|
|
@@ -777,6 +778,7 @@ export default function AutomationPage() {
|
|
|
777
778
|
}, []);
|
|
778
779
|
|
|
779
780
|
useEffect(() => {
|
|
781
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- mount data fetch; fetchConnections sets state only after await, which the rule flags conservatively
|
|
780
782
|
fetchConnections();
|
|
781
783
|
}, [fetchConnections]);
|
|
782
784
|
|
|
@@ -784,6 +786,7 @@ export default function AutomationPage() {
|
|
|
784
786
|
if (typeof window === "undefined") return;
|
|
785
787
|
const requestedProvider = new URLSearchParams(window.location.search).get("provider");
|
|
786
788
|
if (AUTOMATION_PROVIDERS.some((provider) => provider.id === requestedProvider)) {
|
|
789
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time mount initialization from URL query param (external source, client-only)
|
|
787
790
|
setActiveProviderId(requestedProvider);
|
|
788
791
|
}
|
|
789
792
|
}, []);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
/* eslint-disable @next/next/no-img-element -- dynamic/blob/external image src with onError fallback; next/image requires static dims + domain allowlist */
|
|
2
3
|
|
|
3
4
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
4
5
|
import { marked } from "marked";
|
|
@@ -19,6 +20,10 @@ const STORAGE_KEYS = {
|
|
|
19
20
|
systemPrompt: "basic-chat.systemPrompt",
|
|
20
21
|
};
|
|
21
22
|
|
|
23
|
+
// Stable empty array — avoids creating a new [] every render when there's no
|
|
24
|
+
// active session, which would otherwise churn effects/memos keyed on messages.
|
|
25
|
+
const EMPTY_MESSAGES = [];
|
|
26
|
+
|
|
22
27
|
const SUGGESTIONS = [
|
|
23
28
|
"Explain this project like I'm new",
|
|
24
29
|
"Write a concise PR description",
|
|
@@ -292,6 +297,7 @@ export default function BasicChatPageClient() {
|
|
|
292
297
|
const messagesEndRef = useRef(null);
|
|
293
298
|
|
|
294
299
|
useEffect(() => {
|
|
300
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- hydration gate: flags client mount so lazy localStorage reads (in useState initializers) only persist after hydration
|
|
295
301
|
setIsHydrated(true);
|
|
296
302
|
}, []);
|
|
297
303
|
|
|
@@ -478,7 +484,7 @@ export default function BasicChatPageClient() {
|
|
|
478
484
|
}, [activeModelId, modelIndex, activeProviderGroup, sessions, activeSessionId]);
|
|
479
485
|
|
|
480
486
|
const currentSession = useMemo(() => sessions.find((session) => session.id === activeSessionId) || null, [sessions, activeSessionId]);
|
|
481
|
-
const currentMessages = currentSession?.messages ||
|
|
487
|
+
const currentMessages = currentSession?.messages || EMPTY_MESSAGES;
|
|
482
488
|
const sessionItems = useMemo(() => [...sessions].sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()), [sessions]);
|
|
483
489
|
const canSend = !isSending && !!activeModel && (draft.trim().length > 0 || attachments.length > 0);
|
|
484
490
|
|
|
@@ -509,6 +515,7 @@ export default function BasicChatPageClient() {
|
|
|
509
515
|
? modelIndex.get(session.modelId)
|
|
510
516
|
: savedModel;
|
|
511
517
|
initializedRef.current = true;
|
|
518
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time session/model reconciliation after async data load, guarded by initializedRef
|
|
512
519
|
setActiveSessionId(session.id);
|
|
513
520
|
setActiveProviderId(sessionModel?.providerId || savedProvider.providerId);
|
|
514
521
|
setActiveModelId(sessionModel?.id || savedModel.id);
|
|
@@ -29,24 +29,30 @@ export default function AntigravityToolCard({
|
|
|
29
29
|
|
|
30
30
|
useEffect(() => {
|
|
31
31
|
if (apiKeys?.length > 0 && !selectedApiKey) {
|
|
32
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
|
|
32
33
|
setSelectedApiKey(apiKeys[0].key);
|
|
33
34
|
}
|
|
34
35
|
}, [apiKeys, selectedApiKey]);
|
|
35
36
|
|
|
36
37
|
useEffect(() => {
|
|
38
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but status is also updated independently by fetch/user actions
|
|
37
39
|
if (initialStatus) setStatus(initialStatus);
|
|
38
40
|
}, [initialStatus]);
|
|
39
41
|
|
|
40
42
|
useEffect(() => {
|
|
41
43
|
if (isExpanded && !status) {
|
|
44
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
42
45
|
fetchStatus();
|
|
46
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
43
47
|
loadSavedMappings();
|
|
48
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
44
49
|
fetchModelAliases();
|
|
45
50
|
}
|
|
46
51
|
if (isExpanded) {
|
|
47
52
|
loadSavedMappings();
|
|
48
53
|
fetchModelAliases();
|
|
49
54
|
}
|
|
55
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest status (adding it would re-trigger on every change)
|
|
50
56
|
}, [isExpanded]);
|
|
51
57
|
|
|
52
58
|
const loadSavedMappings = async () => {
|
|
@@ -73,6 +73,7 @@ export default function BaseUrlSelect({
|
|
|
73
73
|
const initializedRef = useRef(false);
|
|
74
74
|
|
|
75
75
|
useEffect(() => {
|
|
76
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time mount initialization from localStorage (external store), intentionally client-only
|
|
76
77
|
setSavedPresets(readSavedPresets());
|
|
77
78
|
}, []);
|
|
78
79
|
|
|
@@ -88,6 +89,7 @@ export default function BaseUrlSelect({
|
|
|
88
89
|
initializedRef.current = true;
|
|
89
90
|
const first = options.find((o) => o.value !== CUSTOM_VALUE);
|
|
90
91
|
if (first) {
|
|
92
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time default selection guarded by initializedRef; options depend on async localStorage presets so it cannot be derived during initial render
|
|
91
93
|
setMode(first.value);
|
|
92
94
|
onChange(first.url);
|
|
93
95
|
} else {
|
|
@@ -53,20 +53,25 @@ export default function ClaudeToolCard({
|
|
|
53
53
|
|
|
54
54
|
useEffect(() => {
|
|
55
55
|
if (apiKeys?.length > 0 && !selectedApiKey) {
|
|
56
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
|
|
56
57
|
setSelectedApiKey(apiKeys[0].key);
|
|
57
58
|
}
|
|
58
59
|
}, [apiKeys, selectedApiKey]);
|
|
59
60
|
|
|
60
61
|
useEffect(() => {
|
|
62
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but claudeStatus is also updated independently by fetch/user actions
|
|
61
63
|
if (initialStatus) setClaudeStatus(initialStatus);
|
|
62
64
|
}, [initialStatus]);
|
|
63
65
|
|
|
64
66
|
useEffect(() => {
|
|
65
67
|
if (isExpanded && !claudeStatus) {
|
|
68
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
66
69
|
checkClaudeStatus();
|
|
70
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
67
71
|
fetchModelAliases();
|
|
68
72
|
}
|
|
69
73
|
if (isExpanded) fetchModelAliases();
|
|
74
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest claudeStatus (adding it would re-trigger on every change)
|
|
70
75
|
}, [isExpanded]);
|
|
71
76
|
|
|
72
77
|
useEffect(() => {
|
|
@@ -112,6 +117,7 @@ export default function ClaudeToolCard({
|
|
|
112
117
|
// Only set selectedApiKey if it exists in apiKeys list
|
|
113
118
|
const tokenFromFile = env.ANTHROPIC_AUTH_TOKEN;
|
|
114
119
|
if (tokenFromFile && apiKeys?.some(k => k.key === tokenFromFile)) {
|
|
120
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time pre-fill from fetched config file, guarded by hasInitializedModels ref
|
|
115
121
|
setSelectedApiKey(tokenFromFile);
|
|
116
122
|
}
|
|
117
123
|
}
|
|
@@ -22,22 +22,28 @@ export default function ClineToolCard({ tool, isExpanded, onToggle, baseUrl, api
|
|
|
22
22
|
const [customBaseUrl, setCustomBaseUrl] = useState("");
|
|
23
23
|
|
|
24
24
|
useEffect(() => {
|
|
25
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
|
|
25
26
|
if (apiKeys?.length > 0 && !selectedApiKey) setSelectedApiKey(apiKeys[0].key);
|
|
26
27
|
}, [apiKeys, selectedApiKey]);
|
|
27
28
|
|
|
28
29
|
useEffect(() => {
|
|
30
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but status is also updated independently by fetch/user actions
|
|
29
31
|
if (initialStatus) setStatus(initialStatus);
|
|
30
32
|
}, [initialStatus]);
|
|
31
33
|
|
|
32
34
|
useEffect(() => {
|
|
33
35
|
if (isExpanded && !status) {
|
|
36
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
34
37
|
checkStatus();
|
|
38
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
35
39
|
fetchModelAliases();
|
|
36
40
|
}
|
|
37
41
|
if (isExpanded) fetchModelAliases();
|
|
42
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest status (adding it would re-trigger on every change)
|
|
38
43
|
}, [isExpanded]);
|
|
39
44
|
|
|
40
45
|
useEffect(() => {
|
|
46
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync from fetched tool config: pre-fills selectedModel, which the user can also change via the model modal
|
|
41
47
|
if (status?.settings?.openAiModelId) setSelectedModel(status.settings.openAiModelId);
|
|
42
48
|
}, [status]);
|
|
43
49
|
|
|
@@ -27,24 +27,30 @@ export default function CodexToolCard({ tool, isExpanded, onToggle, baseUrl, api
|
|
|
27
27
|
|
|
28
28
|
useEffect(() => {
|
|
29
29
|
if (apiKeys?.length > 0 && !selectedApiKey) {
|
|
30
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
|
|
30
31
|
setSelectedApiKey(apiKeys[0].key);
|
|
31
32
|
}
|
|
32
33
|
}, [apiKeys, selectedApiKey]);
|
|
33
34
|
|
|
34
35
|
useEffect(() => {
|
|
36
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but codexStatus is also updated independently by fetch/user actions
|
|
35
37
|
if (initialStatus) setCodexStatus(initialStatus);
|
|
36
38
|
}, [initialStatus]);
|
|
37
39
|
|
|
38
40
|
useEffect(() => {
|
|
39
41
|
if (isExpanded && !codexStatus) {
|
|
42
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
40
43
|
checkCodexStatus();
|
|
44
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
41
45
|
fetchModelAliases();
|
|
46
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
42
47
|
fetchGatewayAccounts();
|
|
43
48
|
}
|
|
44
49
|
if (isExpanded) {
|
|
45
50
|
fetchModelAliases();
|
|
46
51
|
fetchGatewayAccounts();
|
|
47
52
|
}
|
|
53
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest codexStatus (adding it would re-trigger on every change)
|
|
48
54
|
}, [isExpanded]);
|
|
49
55
|
|
|
50
56
|
const fetchModelAliases = async () => {
|
|
@@ -74,6 +80,7 @@ export default function CodexToolCard({ tool, isExpanded, onToggle, baseUrl, api
|
|
|
74
80
|
useEffect(() => {
|
|
75
81
|
if (codexStatus?.config) {
|
|
76
82
|
const modelMatch = codexStatus.config.match(/^model\s*=\s*"([^"]+)"/m);
|
|
83
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync from fetched tool config: pre-fills selectedModel, which the user can also change via the model modal
|
|
77
84
|
if (modelMatch) setSelectedModel(modelMatch[1]);
|
|
78
85
|
|
|
79
86
|
// Parse subagent settings
|
|
@@ -27,20 +27,25 @@ export default function CopilotToolCard({ tool, isExpanded, onToggle, baseUrl, a
|
|
|
27
27
|
|
|
28
28
|
useEffect(() => {
|
|
29
29
|
if (apiKeys?.length > 0 && !selectedApiKey) {
|
|
30
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
|
|
30
31
|
setSelectedApiKey(apiKeys[0].key);
|
|
31
32
|
}
|
|
32
33
|
}, [apiKeys, selectedApiKey]);
|
|
33
34
|
|
|
34
35
|
useEffect(() => {
|
|
36
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but status is also updated independently by fetch/user actions
|
|
35
37
|
if (initialStatus) setStatus(initialStatus);
|
|
36
38
|
}, [initialStatus]);
|
|
37
39
|
|
|
38
40
|
useEffect(() => {
|
|
39
41
|
if (isExpanded && !status) {
|
|
42
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
40
43
|
checkStatus();
|
|
44
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
41
45
|
fetchModelAliases();
|
|
42
46
|
}
|
|
43
47
|
if (isExpanded) fetchModelAliases();
|
|
48
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest status (adding it would re-trigger on every change)
|
|
44
49
|
}, [isExpanded]);
|
|
45
50
|
|
|
46
51
|
// Pre-fill from existing config
|
|
@@ -48,9 +53,11 @@ export default function CopilotToolCard({ tool, isExpanded, onToggle, baseUrl, a
|
|
|
48
53
|
if (status?.config && Array.isArray(status.config) && selectedModels.length === 0) {
|
|
49
54
|
const entry = status.config.find((e) => e.name === "ZevaiRouter");
|
|
50
55
|
if (entry?.models?.length > 0) {
|
|
56
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time pre-fill from fetched tool config (only when user has made no selection), user edits models independently afterwards
|
|
51
57
|
setSelectedModels(entry.models.map((m) => m.id));
|
|
52
58
|
}
|
|
53
59
|
}
|
|
60
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [status]; read latest selectedModels.length (adding it would re-trigger on every change)
|
|
54
61
|
}, [status]);
|
|
55
62
|
|
|
56
63
|
const fetchModelAliases = async () => {
|
|
@@ -52,16 +52,20 @@ export default function CoworkToolCard({
|
|
|
52
52
|
|
|
53
53
|
useEffect(() => {
|
|
54
54
|
if (apiKeys?.length > 0 && !selectedApiKey) {
|
|
55
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
|
|
55
56
|
setSelectedApiKey(apiKeys[0].key);
|
|
56
57
|
}
|
|
57
58
|
}, [apiKeys, selectedApiKey]);
|
|
58
59
|
|
|
59
60
|
useEffect(() => {
|
|
61
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but status is also updated independently by fetch/user actions
|
|
60
62
|
if (initialStatus) setStatus(initialStatus);
|
|
61
63
|
}, [initialStatus]);
|
|
62
64
|
|
|
63
65
|
useEffect(() => {
|
|
66
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
64
67
|
if (isExpanded && !status) checkStatus();
|
|
68
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest status (adding it would re-trigger on every change)
|
|
65
69
|
}, [isExpanded]);
|
|
66
70
|
|
|
67
71
|
useEffect(() => {
|
|
@@ -76,6 +80,7 @@ export default function CoworkToolCard({
|
|
|
76
80
|
|
|
77
81
|
useEffect(() => {
|
|
78
82
|
if (status?.cowork?.models?.length) {
|
|
83
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync from fetched tool config: pre-fills selectedModels, which the user can also edit independently
|
|
79
84
|
setSelectedModels(status.cowork.models);
|
|
80
85
|
}
|
|
81
86
|
if (status?.cowork?.baseUrl && !customBaseUrl) {
|
|
@@ -93,6 +98,7 @@ export default function CoworkToolCard({
|
|
|
93
98
|
if (Array.isArray(status?.cowork?.customPlugins) && status.cowork.customPlugins.length > 0) {
|
|
94
99
|
setCustomPlugins(status.cowork.customPlugins);
|
|
95
100
|
}
|
|
101
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [status]; read latest customBaseUrl (adding it would re-trigger on every change)
|
|
96
102
|
}, [status]);
|
|
97
103
|
|
|
98
104
|
const checkStatus = async () => {
|
|
@@ -49,20 +49,25 @@ export default function DeepSeekTuiToolCard({
|
|
|
49
49
|
|
|
50
50
|
useEffect(() => {
|
|
51
51
|
if (apiKeys?.length > 0 && !selectedApiKey) {
|
|
52
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
|
|
52
53
|
setSelectedApiKey(apiKeys[0].key);
|
|
53
54
|
}
|
|
54
55
|
}, [apiKeys, selectedApiKey]);
|
|
55
56
|
|
|
56
57
|
useEffect(() => {
|
|
58
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but deepseekStatus is also updated independently by fetch/user actions
|
|
57
59
|
if (initialStatus) setDeepseekStatus(initialStatus);
|
|
58
60
|
}, [initialStatus]);
|
|
59
61
|
|
|
60
62
|
useEffect(() => {
|
|
61
63
|
if (isExpanded && !deepseekStatus) {
|
|
64
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
62
65
|
checkStatus();
|
|
66
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
63
67
|
fetchModelAliases();
|
|
64
68
|
}
|
|
65
69
|
if (isExpanded) fetchModelAliases();
|
|
70
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest deepseekStatus (adding it would re-trigger on every change)
|
|
66
71
|
}, [isExpanded]);
|
|
67
72
|
|
|
68
73
|
const fetchModelAliases = async () => {
|
|
@@ -79,6 +84,7 @@ export default function DeepSeekTuiToolCard({
|
|
|
79
84
|
if (deepseekStatus?.installed && !hasInitializedModel.current) {
|
|
80
85
|
hasInitializedModel.current = true;
|
|
81
86
|
const openaiSection = deepseekStatus.settings?.["providers.openai"];
|
|
87
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time pre-fill from fetched tool config, guarded by hasInitializedModel ref
|
|
82
88
|
if (openaiSection?.model) setSelectedModel(openaiSection.model);
|
|
83
89
|
}
|
|
84
90
|
}, [deepseekStatus]);
|
|
@@ -56,20 +56,25 @@ export default function DroidToolCard({
|
|
|
56
56
|
|
|
57
57
|
useEffect(() => {
|
|
58
58
|
if (apiKeys?.length > 0 && !selectedApiKey) {
|
|
59
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
|
|
59
60
|
setSelectedApiKey(apiKeys[0].key);
|
|
60
61
|
}
|
|
61
62
|
}, [apiKeys, selectedApiKey]);
|
|
62
63
|
|
|
63
64
|
useEffect(() => {
|
|
65
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but droidStatus is also updated independently by fetch/user actions
|
|
64
66
|
if (initialStatus) setDroidStatus(initialStatus);
|
|
65
67
|
}, [initialStatus]);
|
|
66
68
|
|
|
67
69
|
useEffect(() => {
|
|
68
70
|
if (isExpanded && !droidStatus) {
|
|
71
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
69
72
|
checkDroidStatus();
|
|
73
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
70
74
|
fetchModelAliases();
|
|
71
75
|
}
|
|
72
76
|
if (isExpanded) fetchModelAliases();
|
|
77
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest droidStatus (adding it would re-trigger on every change)
|
|
73
78
|
}, [isExpanded]);
|
|
74
79
|
|
|
75
80
|
const fetchModelAliases = async () => {
|
|
@@ -91,6 +96,7 @@ export default function DroidToolCard({
|
|
|
91
96
|
.sort((a, b) => (a.index || 0) - (b.index || 0))
|
|
92
97
|
.map(m => m.model);
|
|
93
98
|
if (existingModels.length > 0) {
|
|
99
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time pre-fill from fetched tool config, guarded by hasInitializedModel ref
|
|
94
100
|
setModelList(existingModels);
|
|
95
101
|
} else {
|
|
96
102
|
// Legacy: single model stored as custom:Zevai-0
|
|
@@ -39,6 +39,7 @@ export default function EndpointPresetControl({
|
|
|
39
39
|
const [selectedName, setSelectedName] = useState("");
|
|
40
40
|
|
|
41
41
|
useEffect(() => {
|
|
42
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time mount initialization from localStorage (external store), intentionally client-only
|
|
42
43
|
setPresets(readPresets());
|
|
43
44
|
}, []);
|
|
44
45
|
|
|
@@ -49,20 +49,25 @@ export default function HermesToolCard({
|
|
|
49
49
|
|
|
50
50
|
useEffect(() => {
|
|
51
51
|
if (apiKeys?.length > 0 && !selectedApiKey) {
|
|
52
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
|
|
52
53
|
setSelectedApiKey(apiKeys[0].key);
|
|
53
54
|
}
|
|
54
55
|
}, [apiKeys, selectedApiKey]);
|
|
55
56
|
|
|
56
57
|
useEffect(() => {
|
|
58
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but hermesStatus is also updated independently by fetch/user actions
|
|
57
59
|
if (initialStatus) setHermesStatus(initialStatus);
|
|
58
60
|
}, [initialStatus]);
|
|
59
61
|
|
|
60
62
|
useEffect(() => {
|
|
61
63
|
if (isExpanded && !hermesStatus) {
|
|
64
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
62
65
|
checkStatus();
|
|
66
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
63
67
|
fetchModelAliases();
|
|
64
68
|
}
|
|
65
69
|
if (isExpanded) fetchModelAliases();
|
|
70
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest hermesStatus (adding it would re-trigger on every change)
|
|
66
71
|
}, [isExpanded]);
|
|
67
72
|
|
|
68
73
|
const fetchModelAliases = async () => {
|
|
@@ -79,6 +84,7 @@ export default function HermesToolCard({
|
|
|
79
84
|
if (hermesStatus?.installed && !hasInitializedModel.current) {
|
|
80
85
|
hasInitializedModel.current = true;
|
|
81
86
|
const cfg = hermesStatus.settings?.model;
|
|
87
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time pre-fill from fetched tool config, guarded by hasInitializedModel ref
|
|
82
88
|
if (cfg?.default) setSelectedModel(cfg.default);
|
|
83
89
|
}
|
|
84
90
|
}, [hermesStatus]);
|
|
@@ -47,20 +47,25 @@ export default function JcodeToolCard({
|
|
|
47
47
|
|
|
48
48
|
useEffect(() => {
|
|
49
49
|
if (apiKeys?.length > 0 && !selectedApiKey) {
|
|
50
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
|
|
50
51
|
setSelectedApiKey(apiKeys[0].key);
|
|
51
52
|
}
|
|
52
53
|
}, [apiKeys, selectedApiKey]);
|
|
53
54
|
|
|
54
55
|
useEffect(() => {
|
|
56
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but jcodeStatus is also updated independently by fetch/user actions
|
|
55
57
|
if (initialStatus) setJcodeStatus(initialStatus);
|
|
56
58
|
}, [initialStatus]);
|
|
57
59
|
|
|
58
60
|
useEffect(() => {
|
|
59
61
|
if (isExpanded && !jcodeStatus) {
|
|
62
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
60
63
|
checkJcodeStatus();
|
|
64
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
61
65
|
fetchModelAliases();
|
|
62
66
|
}
|
|
63
67
|
if (isExpanded) fetchModelAliases();
|
|
68
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest jcodeStatus (adding it would re-trigger on every change)
|
|
64
69
|
}, [isExpanded]);
|
|
65
70
|
|
|
66
71
|
const fetchModelAliases = async () => {
|
|
@@ -79,6 +84,7 @@ export default function JcodeToolCard({
|
|
|
79
84
|
const provider = jcodeStatus.config?.providers?.["zevai"];
|
|
80
85
|
if (provider) {
|
|
81
86
|
if (provider.default_model) {
|
|
87
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time pre-fill from fetched tool config, guarded by hasInitializedModel ref
|
|
82
88
|
setSelectedModel(provider.default_model);
|
|
83
89
|
}
|
|
84
90
|
// Try to match API key from env file
|