n9router 0.4.55 → 0.4.57
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/app-path-routes-manifest.json +16 -16
- package/app/.next/build-manifest.json +2 -2
- package/app/.next/prerender-manifest.json +3 -3
- package/app/.next/required-server-files.json +1 -3
- package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +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.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/console-log/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/mitm/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/profile/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +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.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +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.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/pxpipe/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/pxpipe/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/quota/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/skills/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/token-saver/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/translator/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/usage/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_global-error/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/_full.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_global-error.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.js +1 -1
- package/app/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_not-found.html +1 -1
- package/app/.next/server/app/_not-found.rsc +3 -3
- package/app/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/api/antigravity-tools/import/route.js +1 -1
- package/app/.next/server/app/api/antigravity-tools/import/route.js.nft.json +1 -1
- package/app/.next/server/app/api/antigravity-tools/import-refresh-tokens/route.js +1 -1
- package/app/.next/server/app/api/antigravity-tools/import-refresh-tokens/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/all-statuses/route.js +5 -5
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/claude-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/cline-settings/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/codex-settings/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/copilot-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/cowork-mcp-registry/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/cowork-mcp-tools/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/cowork-settings/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/deepseek-tui-settings/route.js +3 -3
- package/app/.next/server/app/api/cli-tools/devin-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/droid-settings/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/grok-build-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/hermes-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/jcode-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/kilo-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/opencode-settings/route.js +1 -1
- package/app/.next/server/app/api/internal/request-detail/route.js +1 -1
- package/app/.next/server/app/api/internal/request-detail/route.js.nft.json +1 -1
- package/app/.next/server/app/api/internal/usage/route.js +1 -1
- package/app/.next/server/app/api/internal/usage/route.js.nft.json +1 -1
- package/app/.next/server/app/api/keys/[id]/reset-usage/route.js +1 -1
- package/app/.next/server/app/api/keys/[id]/reset-usage/route.js.nft.json +1 -1
- package/app/.next/server/app/api/keys/[id]/route.js +1 -1
- package/app/.next/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/keys/[id]/usage/route.js +1 -1
- package/app/.next/server/app/api/keys/[id]/usage/route.js.nft.json +1 -1
- package/app/.next/server/app/api/oauth/[provider]/[action]/route.js +1 -1
- package/app/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/oauth/codex/bulk-import/route.js +1 -1
- package/app/.next/server/app/api/oauth/codex/bulk-import/route.js.nft.json +1 -1
- package/app/.next/server/app/api/oauth/codex/import-token/route.js +1 -1
- package/app/.next/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/app/.next/server/app/api/oauth/cursor/auto-import/route.js +2 -2
- package/app/.next/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/[id]/models/route.js +1 -1
- package/app/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/[id]/test/route.js +1 -1
- package/app/.next/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/client/route.js +1 -1
- package/app/.next/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/test-batch/route.js +1 -1
- package/app/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/validate/route.js +1 -1
- package/app/.next/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/route.js +1 -1
- package/app/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/translator/send/route.js +1 -1
- package/app/.next/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next/server/app/api/translator/translate/route.js +1 -1
- package/app/.next/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/disable/route.js +1 -1
- package/app/.next/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/enable/route.js +1 -1
- package/app/.next/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-disable/route.js +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-enable/route.js +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-install/route.js +2 -2
- package/app/.next/server/app/api/usage/[connectionId]/codex-reset-credits/route.js +1 -1
- package/app/.next/server/app/api/usage/[connectionId]/codex-reset-credits/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/[connectionId]/route.js +1 -1
- package/app/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/chart/route.js +1 -1
- package/app/.next/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/history/route.js +1 -1
- package/app/.next/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/logs/route.js +1 -1
- package/app/.next/server/app/api/usage/logs/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/report/route.js +1 -1
- package/app/.next/server/app/api/usage/report/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/request-details/route.js +1 -1
- package/app/.next/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/request-logs/route.js +1 -1
- package/app/.next/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/stats/route.js +1 -1
- package/app/.next/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/stream/route.js +1 -1
- package/app/.next/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/api/chat/route.js +1 -1
- package/app/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/chat/completions/route.js +1 -1
- package/app/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/embeddings/route.js +1 -1
- package/app/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/images/generations/route.js +1 -1
- 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 +1 -1
- package/app/.next/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/models/[kind]/route.js +1 -1
- package/app/.next/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/models/route.js +1 -1
- package/app/.next/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/responses/compact/route.js +1 -1
- package/app/.next/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/responses/route.js +1 -1
- package/app/.next/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/route.js +1 -1
- package/app/.next/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/search/route.js +1 -1
- package/app/.next/server/app/api/v1/search/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/videos/[id]/route.js +1 -1
- package/app/.next/server/app/api/v1/videos/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/videos/edits/route.js +1 -1
- package/app/.next/server/app/api/v1/videos/edits/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/videos/extensions/route.js +1 -1
- package/app/.next/server/app/api/v1/videos/extensions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/videos/generations/route.js +1 -1
- package/app/.next/server/app/api/v1/videos/generations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/web/fetch/route.js +1 -1
- package/app/.next/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1beta/models/[...path]/route.js +1 -1
- package/app/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/version/route.js +1 -1
- package/app/.next/server/app/callback/page.js +1 -1
- package/app/.next/server/app/callback/page.js.nft.json +1 -1
- package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/callback.html +1 -1
- package/app/.next/server/app/callback.rsc +3 -3
- package/app/.next/server/app/callback.segments/_full.segment.rsc +3 -3
- package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/callback.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/callback.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/basic-chat.html +1 -1
- package/app/.next/server/app/dashboard/basic-chat.rsc +5 -5
- package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/cli-tools.html +1 -1
- package/app/.next/server/app/dashboard/cli-tools.rsc +5 -5
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/combos.html +1 -1
- package/app/.next/server/app/dashboard/combos.rsc +5 -5
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/endpoint.html +1 -1
- package/app/.next/server/app/dashboard/endpoint.rsc +5 -5
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/media-providers/web.html +1 -1
- package/app/.next/server/app/dashboard/media-providers/web.rsc +5 -5
- package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/mitm.html +1 -1
- package/app/.next/server/app/dashboard/mitm.rsc +5 -5
- package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/profile.html +1 -1
- package/app/.next/server/app/dashboard/profile.rsc +5 -5
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.html +1 -1
- package/app/.next/server/app/dashboard/providers/new.rsc +5 -5
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers.html +1 -1
- package/app/.next/server/app/dashboard/providers.rsc +5 -5
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/proxy-pools.html +1 -1
- package/app/.next/server/app/dashboard/proxy-pools.rsc +5 -5
- package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/pxpipe.html +1 -1
- package/app/.next/server/app/dashboard/pxpipe.rsc +5 -5
- package/app/.next/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/pxpipe.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/pxpipe.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/quota.html +2 -2
- package/app/.next/server/app/dashboard/quota.rsc +6 -6
- package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
- package/app/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing/page.js +1 -1
- package/app/.next/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
- package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.rsc +3 -3
- package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/skills.html +1 -1
- package/app/.next/server/app/dashboard/skills.rsc +5 -5
- package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/skills.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/skills.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/token-saver.html +1 -1
- package/app/.next/server/app/dashboard/token-saver.rsc +5 -5
- package/app/.next/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/token-saver.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/token-saver.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/translator.html +1 -1
- package/app/.next/server/app/dashboard/translator.rsc +5 -5
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/usage.html +1 -1
- package/app/.next/server/app/dashboard/usage.rsc +5 -5
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard.html +1 -1
- package/app/.next/server/app/dashboard.rsc +5 -5
- package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/index.html +1 -1
- package/app/.next/server/app/index.rsc +3 -3
- package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/landing/page.js +1 -1
- package/app/.next/server/app/landing/page.js.nft.json +1 -1
- package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/landing.html +1 -1
- package/app/.next/server/app/landing.rsc +3 -3
- package/app/.next/server/app/landing.segments/_full.segment.rsc +3 -3
- package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/landing.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/landing.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
- package/app/.next/server/app/login/page.js +1 -1
- package/app/.next/server/app/login/page.js.nft.json +1 -1
- package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/login.html +1 -1
- package/app/.next/server/app/login.rsc +4 -4
- package/app/.next/server/app/login.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/login.segments/_index.segment.rsc +3 -3
- package/app/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/app/.next/server/app/page.js +1 -1
- package/app/.next/server/app/page.js.nft.json +1 -1
- package/app/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app-paths-manifest.json +16 -16
- package/app/.next/server/chunks/112.js +1 -1
- package/app/.next/server/chunks/1470.js +1 -1
- package/app/.next/server/chunks/3481.js +1 -1
- package/app/.next/server/chunks/3913.js +1 -1
- package/app/.next/server/chunks/4037.js +1 -1
- package/app/.next/server/chunks/412.js +1 -1
- package/app/.next/server/chunks/4334.js +2 -2
- package/app/.next/server/chunks/4705.js +1 -1
- package/app/.next/server/chunks/4953.js +1 -1
- package/app/.next/server/chunks/5285.js +1 -1
- package/app/.next/server/chunks/6306.js +1 -1
- package/app/.next/server/chunks/6671.js +1 -1
- package/app/.next/server/chunks/6763.js +1 -1
- package/app/.next/server/chunks/7137.js +1 -1
- package/app/.next/server/chunks/7211.js +1 -1
- package/app/.next/server/chunks/8145.js +1 -1
- package/app/.next/server/chunks/8301.js +1 -1
- package/app/.next/server/chunks/8499.js +1 -1
- package/app/.next/server/chunks/869.js +1 -1
- package/app/.next/server/chunks/8895.js +1 -1
- package/app/.next/server/chunks/8920.js +1 -1
- package/app/.next/server/middleware-build-manifest.js +1 -1
- package/app/.next/server/pages/404.html +1 -1
- 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/1321-13f12c43bc4c573f.js +1 -0
- package/app/.next/static/chunks/3277-5ccea691719301a1.js +64 -0
- package/app/.next/static/chunks/{4028-9d0d68c835868df5.js → 4028-85ab0e23e6b475d3.js} +7 -7
- package/app/.next/static/chunks/5497-b32d50ab4f6874e1.js +7 -0
- package/app/.next/static/chunks/{8198-bf66ab4ae1cda8e0.js → 8198-8a92496ac8c02cb7.js} +1 -1
- package/app/open-sse/providers/capabilities.js +16 -0
- package/app/open-sse/providers/pricing.js +4 -0
- package/app/open-sse/providers/registry/antigravity.js +3 -0
- package/app/open-sse/providers/registry/commandcode.js +7 -0
- package/app/open-sse/providers/registry/gemini.js +1 -0
- package/app/open-sse/services/usage/google.js +34 -1
- package/app/open-sse/translator/concerns/prefetch.js +3 -0
- package/app/open-sse/translator/request/openai-to-commandcode.js +36 -1
- package/app/package.json +4 -2
- package/app/server.js +1 -1
- package/app/src/mitm/config.js +5 -2
- package/app/src/shared/constants/cliTools.js +4 -1
- package/hooks/postinstall.js +9 -182
- package/package.json +1 -1
- package/app/.next/static/chunks/1321-99f0141dbac9848a.js +0 -1
- package/app/.next/static/chunks/3277-443e21d6166585f4.js +0 -64
- package/app/.next/static/chunks/5497-017258c3c16b719e.js +0 -7
- package/app/node_modules/bindings/bindings.js +0 -221
- package/app/node_modules/bindings/package.json +0 -28
- package/app/node_modules/file-uri-to-path/index.js +0 -66
- package/app/node_modules/file-uri-to-path/package.json +0 -32
- /package/app/.next/static/{flxITMsAmoXf-wWjPORMD → KyRBZmQI6kYmOhE879dai}/_buildManifest.js +0 -0
- /package/app/.next/static/{flxITMsAmoXf-wWjPORMD → KyRBZmQI6kYmOhE879dai}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8198],{11017:(e,t,r)=>{function n(e){if(null==e)return null;let t=String(e).trim();if(!t)return null;let r=t.toLowerCase();return r.includes("ultra")?"Ultra":r.includes("pro")?"Pro":r.includes("plus")?"Plus":r.includes("free")?"Free":null}function a(e){if(!e)return null;if("string"==typeof e)return n(e);for(let t of[e.accountType,e.plan,e.paidTier?.name,e.subscriptionTier,e.subscription_tier,e.currentTier?.name,e.subscriptionInfo?.paidTier?.name,e.quota?.subscription_tier,e.subscriptionInfo?.currentTier?.name]){let e=n(t);if(e)return e}return null}r.d(t,{_P:()=>a,fd:()=>n}),["Free","Plus","Pro","Ultra"].map(e=>({value:e,label:e}))},57294:(e,t,r)=>{r.d(t,{$4:()=>j,$L:()=>_,AA:()=>g,AI:()=>a,ED:()=>A,Ih:()=>M,JJ:()=>
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8198],{11017:(e,t,r)=>{function n(e){if(null==e)return null;let t=String(e).trim();if(!t)return null;let r=t.toLowerCase();return r.includes("ultra")?"Ultra":r.includes("pro")?"Pro":r.includes("plus")?"Plus":r.includes("free")?"Free":null}function a(e){if(!e)return null;if("string"==typeof e)return n(e);for(let t of[e.accountType,e.plan,e.paidTier?.name,e.subscriptionTier,e.subscription_tier,e.currentTier?.name,e.subscriptionInfo?.paidTier?.name,e.quota?.subscription_tier,e.subscriptionInfo?.currentTier?.name]){let e=n(t);if(e)return e}return null}r.d(t,{_P:()=>a,fd:()=>n}),["Free","Plus","Pro","Ultra"].map(e=>({value:e,label:e}))},57294:(e,t,r)=>{r.d(t,{$4:()=>j,$L:()=>_,AA:()=>g,AI:()=>a,ED:()=>A,Ih:()=>M,JJ:()=>d,J_:()=>i,Jp:()=>O,Ld:()=>C,Uh:()=>E,WA:()=>s,W_:()=>I,Wg:()=>l,Xr:()=>q,ZS:()=>S,b8:()=>f,dE:()=>k,dR:()=>z,fZ:()=>u,fr:()=>D,g5:()=>y,ku:()=>b,kx:()=>w,mO:()=>$,pT:()=>c,sL:()=>F,sQ:()=>T,uf:()=>p,vF:()=>h,w2:()=>o,wU:()=>P,wi:()=>v});var n=r(45564);let a="quotaCacheData",i=6e4,o=6e5,u=5,s="quotaAutoRefresh",l=20,c=[10,20,50,100],f=500,g=[{value:"all",label:"All accounts"},{value:"active",label:"Active"},{value:"inactive",label:"Turned off"}],h=[{value:"default",label:"Default quota order"},{value:"remaining-asc",label:"% quota: low to high"},{value:"remaining-desc",label:"% quota: high to low"}];function d(e){return e.name?.trim()||e.email?.trim()||e.displayName?.trim()||null}function m(e,t){let r=t[e.id]?.quotas?.[0];return r&&"number"==typeof r.remaining?r.remaining:1/0}function p(e,t,r,n,a){if("codex"===n&&"default"!==a)return[...e].sort((e,r)=>{let n=m(e,t),i=m(r,t),o="remaining-asc"===a?n-i:i-n;return 0!==o?o:(d(e)||"").localeCompare(d(r)||"")});if(!r){let t=new Map;for(let r of e){let e=r.provider||"";t.has(e)||t.set(e,[]),t.get(e).push(r)}return Array.from(t.values()).flat()}let i=e=>{let r=(t[e.id]?.quotas||[]).map(e=>e.resetAt?new Date(e.resetAt).getTime():1/0).filter(e=>Number.isFinite(e));return r.length>0?Math.min(...r):1/0};return[...e].sort((e,t)=>{let r=i(e)-i(t);return 0!==r?r:(e.provider||"").localeCompare(t.provider||"")||(d(e)||"").localeCompare(d(t)||"")})}function b(e){let t={};return e.forEach(e=>{t[e.id]=!0}),t}function A(e,t){let r=new Set(t.map(e=>e.id));return Object.fromEntries(Object.entries(e).filter(([e])=>r.has(e)))}function y(e,t,r){return e.eligibleConnections?e.providerFilteredConnections?{icon:"filter_alt_off",title:"No Accounts On This Page",description:"Try moving to another page or refreshing the current filters."}:{icon:"filter_alt_off",title:"No Accounts Match Current Filters",description:"all"===t?"Try changing the account status filter to see more quota trackers.":`No ${"inactive"===r?"turned off":"active"===r?"active":"matching"} accounts found for ${t}.`}:{icon:"cloud_off",title:"No Providers Connected",description:"Connect to providers with OAuth to track your API quota limits and usage."}}function q(e,t){return t?`Custom: ${e} / page`:`${e} / page`}function w(e){var t;let{start:r,end:n}=(t=e).total?{start:(t.page-1)*t.pageSize+1,end:Math.min(t.page*t.pageSize,t.total)}:{start:0,end:0};return`Showing ${r}-${n} of ${e.total}`}function v(e,t){return e||{page:1,pageSize:t,total:0,totalPages:1}}function k(e,t=0){return e||{eligibleConnections:t,providerFilteredConnections:t}}function P(e,t){return e!==t}function S(e,t){return e?.page||t}function E(e){return e||[]}async function O(e,t){return await e(t)}function C(){try{let e=window.localStorage.getItem(a);return e?JSON.parse(e):{}}catch(e){return console.error("Error reading quota cache:",e),{}}}function D(e,t){try{let r=C();r[e]={...t,cachedAt:new Date().toISOString()},window.localStorage.setItem(a,JSON.stringify(r))}catch(e){console.error("Error writing quota cache:",e)}}function $(e){if(!e)return"-";try{let t="string"==typeof e?new Date(e):e,r=new Date,n=t-r;if(n<=0)return"-";let a=Math.ceil(n/6e4);if(a<60)return`${a}m`;let i=Math.floor(a/60),o=a%60;if(i<24)return`${i}h ${o}m`;let u=Math.floor(i/24);return`${u}d ${i%24}h ${o}m`}catch(e){return"-"}}function T(e){if(!e)return null;try{let t="string"==typeof e?new Date(e):e,r=new Date,n=new Date(r.getFullYear(),r.getMonth(),r.getDate()),a=new Date(n);a.setDate(a.getDate()+1);let i=new Date(a);i.setDate(i.getDate()+1);let o="";o=t>=n&&t<a?"Today":t>=a&&t<i?"Tomorrow":t.toLocaleDateString("en-US",{month:"short",day:"numeric"});let u=t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0});return`${o}, ${u}`}catch{return null}}function j(e,t){return t&&0!==t?!e||e<0?100:e>=t?0:Math.round((t-e)/t*100):0}function _(e){return e?.remaining!==void 0?Math.max(0,Math.round(e.remaining)):e?.remainingPercentage!==void 0?Math.round(e.remainingPercentage):j(e?.used,e?.total)}function M(e){return e&&"object"==typeof e?String(e.modelKey||e.name||"").trim():""}function N(e,t){let r=t?.[e]?.hidden;return new Set(Array.isArray(r)?r.map(String):[])}function z(e,t=[],r={}){if(!Array.isArray(t)||0===t.length)return[];let n=N(e,r);return 0===n.size?t:t.filter(e=>!n.has(M(e)))}function F(e,t=[],r={}){if(!Array.isArray(t)||0===t.length)return[];let n=N(e,r);return 0===n.size?[]:t.filter(e=>n.has(M(e)))}function I(e,t){if(!t||"object"!=typeof t)return[];let r=[];try{switch(e.toLowerCase()){case"github":default:t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"antigravity":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:t.displayName||e,modelKey:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})});break;case"codex":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,remaining:t.remaining,resetAt:t.resetAt||null})});break;case"kiro":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"qoder":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{("organization"!==e||t&&0!==(Number(t.total)||0))&&r.push({name:"user"===e?"Personal":"organization"===e?"Organization":e,used:t.used||0,total:t.total||0,unit:t.unit,resetAt:t.resetAt||null})});break;case"claude":t.message?r.push({name:"error",used:0,total:0,resetAt:null,message:t.message}):t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"vercel-ai-gateway":case"ollama":case"deepseek":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})});break;case"codebuddy-cn":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,recurring:!1!==t.recurring})});break;case"grok-cli":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})});break;case"kimi":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})})}}catch(t){return console.error(`Error parsing quota data for ${e}:`,t),[]}let a=(0,n.KC)(e);if(a.length>0){let t=new Map(a.map((e,t)=>[e.id,t]));if("antigravity"===e.toLowerCase()){if(!t.has("gemini-3.8-flash")){let e=t.has("gemini-3.8-flash-high")?t.get("gemini-3.8-flash-high"):0;t.set("gemini-3.8-flash",e-.5)}if(!t.has("gemini-3.8-flash-tiered")){let e=t.has("gemini-3.8-flash-high")?t.get("gemini-3.8-flash-high"):0;t.set("gemini-3.8-flash-tiered",e-.5)}if(!t.has("gemini-3.7-flash-tiered")){let e=t.has("gemini-3.7-flash-high")?t.get("gemini-3.7-flash-high"):0;t.set("gemini-3.7-flash-tiered",e-.5)}}r.sort((e,r)=>{let n=e.modelKey||e.name,a=r.modelKey||r.name;return(t.get(n)??999)-(t.get(a)??999)})}return r}}}]);
|
|
@@ -205,6 +205,7 @@ export const PATTERN_CAPABILITIES = [
|
|
|
205
205
|
|
|
206
206
|
// ── Gemini (all 2.0+ multimodal + google_search grounding, 1M ctx) ─
|
|
207
207
|
{ pattern: "*gemini*image*", caps: { vision: true, imageOutput: true, contextWindow: 1048576 } },
|
|
208
|
+
{ pattern: "*gemini-3.8*", caps: { vision: true, audioInput: true, videoInput: true, reasoning: true, search: true, thinkingFormat: "gemini-level", thinkingCanDisable: false, contextWindow: 1048576, maxOutput: 65536 } },
|
|
208
209
|
{ pattern: "*gemini-3.7*", caps: { vision: true, audioInput: true, videoInput: true, reasoning: true, search: true, thinkingFormat: "gemini-level", thinkingCanDisable: false, contextWindow: 1048576, maxOutput: 65536 } },
|
|
209
210
|
{ pattern: "*gemini-3*pro*", caps: { vision: true, audioInput: true, videoInput: true, reasoning: true, search: true, thinkingFormat: "gemini-level", thinkingCanDisable: false, contextWindow: 1048576, maxOutput: 65535 } },
|
|
210
211
|
{ pattern: "*gemini-3*", caps: { vision: true, audioInput: true, videoInput: true, reasoning: true, search: true, thinkingFormat: "gemini-level", thinkingCanDisable: false, contextWindow: 1048576, maxOutput: 65536 } },
|
|
@@ -244,10 +245,18 @@ export const PATTERN_CAPABILITIES = [
|
|
|
244
245
|
{ pattern: "*qwen*vl*", caps: { vision: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 262144 } },
|
|
245
246
|
{ pattern: "*qwen*omni*", caps: { vision: true, audioInput: true, videoInput: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 262144, maxOutput: 65536 } },
|
|
246
247
|
{ pattern: "*qwen*coder*", caps: { reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000 } },
|
|
248
|
+
// Qwen3.8-Max reads images (verified live 2026-09-04), unlike Qwen3.6-Max-Preview
|
|
249
|
+
// which does not — so the version-specific entry must precede the text-only
|
|
250
|
+
// "*qwen*max*" family pattern below. Limits inherited from that pattern.
|
|
251
|
+
{ pattern: "*qwen3.8*max*", caps: { vision: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000, maxOutput: 65536 } },
|
|
247
252
|
{ pattern: "*qwen*max*", caps: { reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000, maxOutput: 65536 } },
|
|
248
253
|
{ pattern: "*qwen3.5*", caps: { vision: true, videoInput: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000, maxOutput: 65536 } },
|
|
249
254
|
{ pattern: "*qwen3.6*", caps: { vision: true, videoInput: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000, maxOutput: 65536 } },
|
|
250
255
|
{ pattern: "*qwen3.7*", caps: { vision: true, videoInput: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000, maxOutput: 65536 } },
|
|
256
|
+
// Qwen3.8-Flash vision verified live 2026-09-04. videoInput and the larger
|
|
257
|
+
// context of the 3.5-3.7 entries above are NOT verified for 3.8, so this keeps
|
|
258
|
+
// the conservative "*qwen*" family limits and only lifts the vision flag.
|
|
259
|
+
{ pattern: "*qwen3.8*", caps: { vision: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 262144 } },
|
|
251
260
|
{ pattern: "*qwen*plus*", caps: { vision: true, reasoning: true, thinkingFormat: "qwen", contextWindow: 1000000, maxOutput: 65536 } },
|
|
252
261
|
{ pattern: "*qwen*235b*", caps: { reasoning: true, thinkingFormat: "qwen", contextWindow: 262144 } },
|
|
253
262
|
{ pattern: "*qwq*", caps: { reasoning: true, thinkingFormat: "qwen", thinkingCanDisable: false, contextWindow: 131072 } },
|
|
@@ -261,12 +270,19 @@ export const PATTERN_CAPABILITIES = [
|
|
|
261
270
|
{ pattern: "*kimi*", caps: { reasoning: true, thinkingFormat: "kimi", contextWindow: 262144 } },
|
|
262
271
|
|
|
263
272
|
// ── GLM / Z.ai (thinking.enabled; disable via enable_thinking:false) ─
|
|
273
|
+
// GLM is text-only apart from explicit vision variants (see glm-4.6v / glm-5v-turbo),
|
|
274
|
+
// but glm-5.3-flash reads images (verified live 2026-09-04) despite carrying no "v"
|
|
275
|
+
// marker — so it needs its own entry ahead of the text-only "*glm-5*" family.
|
|
276
|
+
{ pattern: "*glm-5.3*flash*", caps: { vision: true, reasoning: true, thinkingFormat: "zai", contextWindow: 200000, maxOutput: 128000 } },
|
|
264
277
|
{ pattern: "*glm-5*", caps: { reasoning: true, thinkingFormat: "zai", contextWindow: 200000, maxOutput: 128000 } },
|
|
265
278
|
{ pattern: "*glm-4.7*", caps: { reasoning: true, thinkingFormat: "zai", contextWindow: 200000, maxOutput: 128000 } },
|
|
266
279
|
{ pattern: "*glm-4*", caps: { reasoning: true, thinkingFormat: "zai", contextWindow: 200000 } },
|
|
267
280
|
{ pattern: "*glm*", caps: { reasoning: true, thinkingFormat: "zai", contextWindow: 200000 } },
|
|
268
281
|
|
|
269
282
|
// ── DeepSeek (thinking.enabled + reasoning_effort; r1 = thinking-only) ─
|
|
283
|
+
// Vision variant must precede the plain family pattern below, or "*deepseek-v4*"
|
|
284
|
+
// swallows it and the model resolves to vision:false (media stripped upstream).
|
|
285
|
+
{ pattern: "*deepseek-v4*vision*", caps: { vision: true, reasoning: true, thinkingFormat: "deepseek", contextWindow: 1000000, maxOutput: 384000 } },
|
|
270
286
|
{ pattern: "*deepseek-v4*", caps: { reasoning: true, thinkingFormat: "deepseek", contextWindow: 1000000, maxOutput: 384000 } },
|
|
271
287
|
{ pattern: "*reasoner*", caps: { reasoning: true, thinkingFormat: "deepseek", thinkingCanDisable: false, contextWindow: 128000 } },
|
|
272
288
|
{ pattern: "*deepseek-r*", caps: { reasoning: true, thinkingFormat: "deepseek", thinkingCanDisable: false, contextWindow: 128000 } },
|
|
@@ -65,6 +65,10 @@ export const MODEL_PRICING = {
|
|
|
65
65
|
"gpt-5.4-nano": { input: 0.10, output: 0.40, cached: 0.05, reasoning: 0.60, cache_creation: 0.10 },
|
|
66
66
|
|
|
67
67
|
// === Gemini ===
|
|
68
|
+
"gemini-3.8-flash": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
|
|
69
|
+
"gemini-3.8-flash-high": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
|
|
70
|
+
"gemini-3.8-flash-medium": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
|
|
71
|
+
"gemini-3.8-flash-low": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
|
|
68
72
|
"gemini-3.7-flash": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
|
|
69
73
|
"gemini-3.7-flash-high": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
|
|
70
74
|
"gemini-3.7-flash-medium": { input: 1.50, output: 7.50, cached: 0.15, reasoning: 11.25, cache_creation: 1.875 },
|
|
@@ -45,6 +45,9 @@ export default {
|
|
|
45
45
|
clientSecret: "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",
|
|
46
46
|
},
|
|
47
47
|
models: [
|
|
48
|
+
{ id: "gemini-3.8-flash-high", name: "Gemini 3.8 Flash (High)", upstreamModelId: "gemini-3.8-flash-tiered(high)" },
|
|
49
|
+
{ id: "gemini-3.8-flash-medium", name: "Gemini 3.8 Flash (Medium)", upstreamModelId: "gemini-3.8-flash-tiered(medium)" },
|
|
50
|
+
{ id: "gemini-3.8-flash-low", name: "Gemini 3.8 Flash (Low)", upstreamModelId: "gemini-3.8-flash-tiered(low)" },
|
|
48
51
|
{ id: "gemini-3.7-flash-high", name: "Gemini 3.7 Flash (High)", upstreamModelId: "gemini-3.7-flash-tiered(high)" },
|
|
49
52
|
{ id: "gemini-3.7-flash-medium", name: "Gemini 3.7 Flash (Medium)", upstreamModelId: "gemini-3.7-flash-tiered(medium)" },
|
|
50
53
|
{ id: "gemini-3.7-flash-low", name: "Gemini 3.7 Flash (Low)", upstreamModelId: "gemini-3.7-flash-tiered(low)" },
|
|
@@ -30,6 +30,7 @@ export default {
|
|
|
30
30
|
models: [
|
|
31
31
|
{ id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro" },
|
|
32
32
|
{ id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash" },
|
|
33
|
+
{ id: "deepseek/deepseek-v4-flash-vision-exp", name: "DeepSeek V4 Flash Vision (exp)" },
|
|
33
34
|
{ id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6" },
|
|
34
35
|
{ id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5" },
|
|
35
36
|
{ id: "zai-org/GLM-5.1", name: "GLM 5.1" },
|
|
@@ -38,6 +39,12 @@ export default {
|
|
|
38
39
|
{ id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5" },
|
|
39
40
|
{ id: "Qwen/Qwen3.6-Max-Preview", name: "Qwen 3.6 Max Preview" },
|
|
40
41
|
{ id: "Qwen/Qwen3.6-Plus", name: "Qwen 3.6 Plus" },
|
|
42
|
+
{ id: "Qwen/Qwen3.8-Flash", name: "Qwen 3.8 Flash" },
|
|
43
|
+
{ id: "Qwen/Qwen3.8-Max", name: "Qwen 3.8 Max" },
|
|
44
|
+
// Vendor prefix is "z-ai/" here, not the "zai-org/" used by GLM-5/5.1 above:
|
|
45
|
+
// that is what CommandCode actually serves (verified — "zai-org/glm-5.3-flash"
|
|
46
|
+
// and "z-ai/glm-5.1" are not entitled), not a typo.
|
|
47
|
+
{ id: "z-ai/glm-5.3-flash", name: "GLM 5.3 Flash" },
|
|
41
48
|
{ id: "stepfun/Step-3.5-Flash", name: "Step 3.5 Flash" },
|
|
42
49
|
],
|
|
43
50
|
};
|
|
@@ -36,6 +36,7 @@ export default {
|
|
|
36
36
|
},
|
|
37
37
|
},
|
|
38
38
|
models: [
|
|
39
|
+
{ id: "gemini-3.8-flash", name: "Gemini 3.8 Flash" },
|
|
39
40
|
{ id: "gemini-3.7-flash", name: "Gemini 3.7 Flash" },
|
|
40
41
|
{ id: "gemini-3.6-flash", name: "Gemini 3.6 Flash" },
|
|
41
42
|
{ id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite" },
|
|
@@ -155,6 +155,34 @@ export async function getAntigravityUsage(accessToken, providerSpecificData, pro
|
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
const data = await response.json();
|
|
158
|
+
// Production can lag behind the IDE daily endpoint when new model buckets
|
|
159
|
+
// roll out. Merge only missing models so production values stay authoritative.
|
|
160
|
+
if (data.models && !Object.keys(data.models).some((modelKey) => modelKey.includes("gemini-3.8-flash"))) {
|
|
161
|
+
try {
|
|
162
|
+
const dailyResponse = await fetchWithTimeout(
|
|
163
|
+
"https://daily-cloudcode-pa.googleapis.com/v1internal:fetchAvailableModels",
|
|
164
|
+
{
|
|
165
|
+
method: "POST",
|
|
166
|
+
headers: {
|
|
167
|
+
"Authorization": `Bearer ${accessToken}`,
|
|
168
|
+
"User-Agent": ANTIGRAVITY_CONFIG.userAgent,
|
|
169
|
+
"Content-Type": "application/json",
|
|
170
|
+
"X-Client-Name": "antigravity",
|
|
171
|
+
"X-Client-Version": ANTIGRAVITY_IDE_VERSION,
|
|
172
|
+
},
|
|
173
|
+
body: JSON.stringify({ ...(projectId ? { project: projectId } : {}) }),
|
|
174
|
+
},
|
|
175
|
+
10000,
|
|
176
|
+
proxyOptions
|
|
177
|
+
);
|
|
178
|
+
if (dailyResponse.ok) {
|
|
179
|
+
const dailyData = await dailyResponse.json();
|
|
180
|
+
data.models = { ...dailyData.models, ...data.models };
|
|
181
|
+
}
|
|
182
|
+
} catch {
|
|
183
|
+
// Production quota data is still usable if the daily endpoint is unavailable.
|
|
184
|
+
}
|
|
185
|
+
}
|
|
158
186
|
const quotas = {};
|
|
159
187
|
|
|
160
188
|
// Parse model quotas (inspired by vscode-antigravity-cockpit)
|
|
@@ -162,7 +190,12 @@ export async function getAntigravityUsage(accessToken, providerSpecificData, pro
|
|
|
162
190
|
// Filter only recommended/important models (must match PROVIDER_MODELS ag ids,
|
|
163
191
|
// plus live fetchAvailableModels keys that have not been split into tiers yet).
|
|
164
192
|
const importantModels = {
|
|
165
|
-
// Live API
|
|
193
|
+
// Live API may ship base or `*-tiered` buckets instead of split tiers.
|
|
194
|
+
"gemini-3.8-flash": "Gemini 3.8 Flash",
|
|
195
|
+
"gemini-3.8-flash-tiered": "Gemini 3.8 Flash",
|
|
196
|
+
"gemini-3.8-flash-high": "Gemini 3.8 Flash (High)",
|
|
197
|
+
"gemini-3.8-flash-medium": "Gemini 3.8 Flash (Medium)",
|
|
198
|
+
"gemini-3.8-flash-low": "Gemini 3.8 Flash (Low)",
|
|
166
199
|
"gemini-3.7-flash-tiered": "Gemini 3.7 Flash",
|
|
167
200
|
"gemini-3.7-flash-high": "Gemini 3.7 Flash (High)",
|
|
168
201
|
"gemini-3.7-flash-medium": "Gemini 3.7 Flash (Medium)",
|
|
@@ -8,6 +8,9 @@ import { fetchImageAsBase64, parseDataUri } from "./image.js";
|
|
|
8
8
|
const TARGETS_NEED_BASE64 = new Set([
|
|
9
9
|
FORMATS.GEMINI, FORMATS.GEMINI_CLI, FORMATS.VERTEX,
|
|
10
10
|
FORMATS.ANTIGRAVITY, FORMATS.OLLAMA, FORMATS.KIRO,
|
|
11
|
+
// CommandCode accepts an https URL in an image part but its backend fails the
|
|
12
|
+
// fetch ("Failed to download image from ..."), so URLs must arrive as base64.
|
|
13
|
+
FORMATS.COMMANDCODE,
|
|
11
14
|
]);
|
|
12
15
|
|
|
13
16
|
function isRemoteUrl(url) {
|
|
@@ -7,7 +7,16 @@
|
|
|
7
7
|
* - params.messages[*].content: Array of content blocks (NEVER a string)
|
|
8
8
|
* - tool_use blocks (assistant): {type:"tool-call", toolCallId, toolName, input}
|
|
9
9
|
* - tool_result blocks (role=user): {type:"tool-result", toolCallId, toolName, output}
|
|
10
|
+
* - image blocks (role=user): {type:"image", image:"data:<mime>;base64,<data>"}
|
|
10
11
|
* - tools[*]: Anthropic plain {name, description, input_schema}
|
|
12
|
+
*
|
|
13
|
+
* Image support verified live against /alpha/generate (2026-09-04): an AI SDK v5
|
|
14
|
+
* `image` part carrying a data URL (or bare base64 + mediaType) is accepted; AI SDK
|
|
15
|
+
* `file` parts and OpenAI `image_url` parts are both rejected with HTTP 400. A remote
|
|
16
|
+
* https URL passes validation but the backend cannot fetch it, so chatCore prefetches
|
|
17
|
+
* remote images to base64 first (FORMATS.COMMANDCODE is in TARGETS_NEED_BASE64).
|
|
18
|
+
* Models without vision still get the text placeholder, but that decision belongs to
|
|
19
|
+
* stripUnsupportedModalities upstream — not to this translator.
|
|
11
20
|
*/
|
|
12
21
|
import { register } from "../index.js";
|
|
13
22
|
import { FORMATS } from "../formats.js";
|
|
@@ -29,6 +38,32 @@ function flattenText(content) {
|
|
|
29
38
|
return String(content);
|
|
30
39
|
}
|
|
31
40
|
|
|
41
|
+
// OpenAI/Claude-shaped image part -> AI SDK v5 image part. Returns null when no
|
|
42
|
+
// usable source is present, so the caller can fall back to the text placeholder.
|
|
43
|
+
function toImagePart(part) {
|
|
44
|
+
// `image_url` is either {url} or a flat string. Both shapes occur here — see
|
|
45
|
+
// prefetch.js, which rewrites a flat string in place, so a prefetched remote
|
|
46
|
+
// image arrives as a bare data-URI string and would otherwise be dropped
|
|
47
|
+
// after having already been fetched over the network.
|
|
48
|
+
const imageUrl = typeof part?.image_url === "string" ? part.image_url : part?.image_url?.url;
|
|
49
|
+
const direct = imageUrl ?? part?.image ?? part?.url;
|
|
50
|
+
if (typeof direct === "string" && direct) {
|
|
51
|
+
// Upstream does accept bare base64 with no mediaType (verified), but when the
|
|
52
|
+
// caller states a type, keep it rather than making upstream sniff the bytes.
|
|
53
|
+
const isUri = /^(data:|https?:)/.test(direct);
|
|
54
|
+
const mime = part?.mediaType || part?.media_type || "image/png";
|
|
55
|
+
return { type: OPENAI_BLOCK.IMAGE, image: isUri ? direct : `data:${mime};base64,${direct}` };
|
|
56
|
+
}
|
|
57
|
+
const src = part?.source;
|
|
58
|
+
if (src?.type === "base64" && src.data) {
|
|
59
|
+
return { type: OPENAI_BLOCK.IMAGE, image: `data:${src.media_type || "image/png"};base64,${src.data}` };
|
|
60
|
+
}
|
|
61
|
+
if (src?.type === "url" && typeof src.url === "string" && src.url) {
|
|
62
|
+
return { type: OPENAI_BLOCK.IMAGE, image: src.url };
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
|
|
32
67
|
function toContentBlocks(content) {
|
|
33
68
|
if (content == null) return [{ type: OPENAI_BLOCK.TEXT, text: "" }];
|
|
34
69
|
if (typeof content === "string") return [{ type: OPENAI_BLOCK.TEXT, text: content }];
|
|
@@ -41,7 +76,7 @@ function toContentBlocks(content) {
|
|
|
41
76
|
if (part.type === OPENAI_BLOCK.TEXT && typeof part.text === "string") {
|
|
42
77
|
blocks.push({ type: OPENAI_BLOCK.TEXT, text: part.text });
|
|
43
78
|
} else if (part.type === OPENAI_BLOCK.IMAGE_URL || part.type === OPENAI_BLOCK.IMAGE) {
|
|
44
|
-
blocks.push({ type: OPENAI_BLOCK.TEXT, text: "[image omitted]" });
|
|
79
|
+
blocks.push(toImagePart(part) || { type: OPENAI_BLOCK.TEXT, text: "[image omitted]" });
|
|
45
80
|
} else if (typeof part.text === "string") {
|
|
46
81
|
blocks.push({ type: OPENAI_BLOCK.TEXT, text: part.text });
|
|
47
82
|
}
|
package/app/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "n9router",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.57",
|
|
4
4
|
"description": "Self-hosted AI routing gateway — local proxy for Claude, Gemini, OpenAI and 40+ providers",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -59,7 +59,6 @@
|
|
|
59
59
|
"@node-saml/node-saml": "^5.1.0",
|
|
60
60
|
"@xyflow/react": "^12.10.1",
|
|
61
61
|
"bcryptjs": "^3.0.3",
|
|
62
|
-
"better-sqlite3": "^12.6.2",
|
|
63
62
|
"confbox": "^0.2.4",
|
|
64
63
|
"express": "^5.2.1",
|
|
65
64
|
"fs": "^0.0.1-security",
|
|
@@ -93,5 +92,8 @@
|
|
|
93
92
|
"eslint-config-next": "16.1.6",
|
|
94
93
|
"postcss": "^8.5.6",
|
|
95
94
|
"tailwindcss": "^4"
|
|
95
|
+
},
|
|
96
|
+
"engines": {
|
|
97
|
+
"node": ">=22.13.0"
|
|
96
98
|
}
|
|
97
99
|
}
|
package/app/server.js
CHANGED
|
@@ -9,7 +9,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
|
|
|
9
9
|
const hostname = process.env.HOSTNAME || '0.0.0.0'
|
|
10
10
|
|
|
11
11
|
let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
|
|
12
|
-
const nextConfig = {"env":{},"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.mjs","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":true,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/Users/cuongquach/projects/vibe/n9router","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":9,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":134217728,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["@xyflow/react","@dnd-kit/core","@dnd-kit/sortable","material-symbols","marked","lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.mjs","outputFileTracingIncludes":{"/*":["src/mitm/**/*","src/shared/constants/**/*","src/lib/dbFileSafety.js","open-sse/rtk/**/*"]},"serverExternalPackages":[
|
|
12
|
+
const nextConfig = {"env":{},"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.mjs","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":true,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/Users/cuongquach/projects/vibe/n9router","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":9,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":134217728,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["@xyflow/react","@dnd-kit/core","@dnd-kit/sortable","material-symbols","marked","lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.mjs","outputFileTracingIncludes":{"/*":["src/mitm/**/*","src/shared/constants/**/*","src/lib/dbFileSafety.js","open-sse/rtk/**/*"]},"serverExternalPackages":[],"turbopack":{"root":"/Users/cuongquach/projects/vibe/n9router"},"outputFileTracingExcludes":{"*":["./gitbook/**/*"]},"distDirRoot":".next","_originalRewrites":{"beforeFiles":[],"afterFiles":[{"source":"/v1/v1/:path*","destination":"/api/v1/:path*"},{"source":"/v1/v1","destination":"/api/v1"},{"source":"/codex/:path*","destination":"/api/v1/responses"},{"source":"/responses","destination":"/api/v1/responses"},{"source":"/v1beta/:path*","destination":"/api/v1beta/:path*"},{"source":"/v1beta","destination":"/api/v1beta"},{"source":"/v1/:path*","destination":"/api/v1/:path*"},{"source":"/v1","destination":"/api/v1"}],"fallback":[]}}
|
|
13
13
|
|
|
14
14
|
process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
|
|
15
15
|
|
package/app/src/mitm/config.js
CHANGED
|
@@ -55,6 +55,9 @@ const MODEL_SYNONYMS = {
|
|
|
55
55
|
"gemini-3.5-flash-high": "gemini-3-flash-agent",
|
|
56
56
|
"gemini-3.5-flash-medium": "gemini-3.5-flash-low",
|
|
57
57
|
"gemini-3.5-flash-extra-low": "gemini-3.5-flash-extra-low",
|
|
58
|
+
"gemini-3.8-flash-high": "gemini-3.8-flash-high",
|
|
59
|
+
"gemini-3.8-flash-medium": "gemini-3.8-flash-medium",
|
|
60
|
+
"gemini-3.8-flash-low": "gemini-3.8-flash-low",
|
|
58
61
|
"gemini-3.7-flash-high": "gemini-3.7-flash-high",
|
|
59
62
|
"gemini-3.7-flash-medium": "gemini-3.7-flash-medium",
|
|
60
63
|
"gemini-3.7-flash-low": "gemini-3.7-flash-low",
|
|
@@ -135,8 +138,8 @@ function extractModel(url, body) {
|
|
|
135
138
|
}
|
|
136
139
|
const model = urlModel || parsed.model || null;
|
|
137
140
|
const cleanModelName = String(model).replace(/^models\//, "");
|
|
138
|
-
if (cleanModelName === "gemini-3.6-flash-tiered" || cleanModelName === "gemini-3.7-flash-tiered") {
|
|
139
|
-
const ver = cleanModelName.includes("3.7") ? "3.7" : "3.6";
|
|
141
|
+
if (cleanModelName === "gemini-3.6-flash-tiered" || cleanModelName === "gemini-3.7-flash-tiered" || cleanModelName === "gemini-3.8-flash-tiered") {
|
|
142
|
+
const ver = cleanModelName.includes("3.8") ? "3.8" : cleanModelName.includes("3.7") ? "3.7" : "3.6";
|
|
140
143
|
const rawLevel = parsed.request?.generationConfig?.thinkingConfig?.thinkingLevel
|
|
141
144
|
|| parsed.generationConfig?.thinkingConfig?.thinkingLevel;
|
|
142
145
|
const level = ["high", "medium", "low"].includes(String(rawLevel).toLowerCase())
|
|
@@ -10,8 +10,11 @@ export const MITM_TOOLS = {
|
|
|
10
10
|
mitmDomain: "daily-cloudcode-pa.googleapis.com",
|
|
11
11
|
supportsTokenSwap: true,
|
|
12
12
|
tokenSwapProvider: "antigravity",
|
|
13
|
-
modelAliases: ["gemini-3.7-flash-high", "gemini-3.7-flash-medium", "gemini-3.7-flash-low", "gemini-3.6-flash-high", "gemini-3.6-flash-medium", "gemini-3.6-flash-low", "gemini-3.5-flash-low", "gemini-3-flash-agent", "gemini-3.5-flash-extra-low", "gemini-3.1-pro-low", "gemini-pro-agent", "claude-sonnet-4-6", "claude-opus-4-6-thinking", "gpt-oss-120b-medium", "gemini-3-flash"],
|
|
13
|
+
modelAliases: ["gemini-3.8-flash-high", "gemini-3.8-flash-medium", "gemini-3.8-flash-low", "gemini-3.7-flash-high", "gemini-3.7-flash-medium", "gemini-3.7-flash-low", "gemini-3.6-flash-high", "gemini-3.6-flash-medium", "gemini-3.6-flash-low", "gemini-3.5-flash-low", "gemini-3-flash-agent", "gemini-3.5-flash-extra-low", "gemini-3.1-pro-low", "gemini-pro-agent", "claude-sonnet-4-6", "claude-opus-4-6-thinking", "gpt-oss-120b-medium", "gemini-3-flash"],
|
|
14
14
|
defaultModels: [
|
|
15
|
+
{ id: "gemini-3.8-flash-high", name: "Gemini 3.8 Flash (High)", alias: "gemini-3.8-flash-high" },
|
|
16
|
+
{ id: "gemini-3.8-flash-medium", name: "Gemini 3.8 Flash (Medium)", alias: "gemini-3.8-flash-medium" },
|
|
17
|
+
{ id: "gemini-3.8-flash-low", name: "Gemini 3.8 Flash (Low)", alias: "gemini-3.8-flash-low" },
|
|
15
18
|
{ id: "gemini-3.7-flash-high", name: "Gemini 3.7 Flash (High)", alias: "gemini-3.7-flash-high" },
|
|
16
19
|
{ id: "gemini-3.7-flash-medium", name: "Gemini 3.7 Flash (Medium)", alias: "gemini-3.7-flash-medium" },
|
|
17
20
|
{ id: "gemini-3.7-flash-low", name: "Gemini 3.7 Flash (Low)", alias: "gemini-3.7-flash-low" },
|
package/hooks/postinstall.js
CHANGED
|
@@ -4,16 +4,14 @@
|
|
|
4
4
|
* Postinstall hook for n9router.
|
|
5
5
|
*
|
|
6
6
|
* Purpose:
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
7
|
+
* - Verify node:sqlite runtime availability
|
|
8
|
+
* - Copy open-sse assets for standalone installations
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
const fs = require("fs");
|
|
12
12
|
const path = require("path");
|
|
13
|
-
const { execSync } = require("child_process");
|
|
14
13
|
|
|
15
14
|
const pkgRoot = path.join(__dirname, "..");
|
|
16
|
-
const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
17
15
|
|
|
18
16
|
function info(msg) {
|
|
19
17
|
console.log(`[n9router:postinstall] ${msg}`);
|
|
@@ -42,152 +40,6 @@ function resolveStandaloneRoot() {
|
|
|
42
40
|
);
|
|
43
41
|
}
|
|
44
42
|
|
|
45
|
-
function readMagic(binaryPath) {
|
|
46
|
-
const fd = fs.openSync(binaryPath, "r");
|
|
47
|
-
const buffer = Buffer.alloc(4);
|
|
48
|
-
fs.readSync(fd, buffer, 0, 4, 0);
|
|
49
|
-
fs.closeSync(fd);
|
|
50
|
-
return buffer.toString("hex");
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function isBinaryValidForPlatform(binaryPath) {
|
|
54
|
-
if (!pathExists(binaryPath)) return false;
|
|
55
|
-
|
|
56
|
-
let magic = "";
|
|
57
|
-
try {
|
|
58
|
-
magic = readMagic(binaryPath);
|
|
59
|
-
} catch {
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const isLinux = magic.startsWith("7f454c46"); // ELF
|
|
64
|
-
const isMacOS = magic.startsWith("cffaedfe") || magic.startsWith("cefaedfe"); // Mach-O
|
|
65
|
-
const isWindows = magic.startsWith("4d5a"); // PE (MZ)
|
|
66
|
-
|
|
67
|
-
if (process.platform === "linux") return isLinux;
|
|
68
|
-
if (process.platform === "darwin") return isMacOS;
|
|
69
|
-
if (process.platform === "win32") return isWindows;
|
|
70
|
-
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function rebuildModule(moduleName, cwd) {
|
|
75
|
-
execSync(`${npmCmd} rebuild ${moduleName} --build-from-source`, {
|
|
76
|
-
cwd,
|
|
77
|
-
stdio: "inherit",
|
|
78
|
-
timeout: 180000,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function installModule(moduleName, cwd) {
|
|
83
|
-
// When running inside `npm install -g`, npm sets npm_config_global=true and
|
|
84
|
-
// npm_config_prefix to the global prefix. Clear these so the inner npm install
|
|
85
|
-
// installs locally into cwd/node_modules instead of global node_modules.
|
|
86
|
-
const env = { ...process.env };
|
|
87
|
-
delete env.npm_config_global;
|
|
88
|
-
delete env.npm_config_prefix;
|
|
89
|
-
execSync(`${npmCmd} install ${moduleName} --prefix "${cwd}"`, {
|
|
90
|
-
env,
|
|
91
|
-
stdio: "inherit",
|
|
92
|
-
timeout: 180000,
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function tryPrebuildInstall(moduleRoot) {
|
|
97
|
-
try {
|
|
98
|
-
info("Attempting to download prebuilt better-sqlite3 binary...");
|
|
99
|
-
execSync("npx prebuild-install --runtime electron --target 22.0.0 || npx prebuild-install", {
|
|
100
|
-
cwd: moduleRoot,
|
|
101
|
-
stdio: "pipe",
|
|
102
|
-
timeout: 60000,
|
|
103
|
-
});
|
|
104
|
-
return true;
|
|
105
|
-
} catch {
|
|
106
|
-
return false;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function ensureBetterSqlite3(locationName, moduleRoot) {
|
|
111
|
-
if (!pathExists(moduleRoot)) {
|
|
112
|
-
const installCwd = path.dirname(path.dirname(moduleRoot));
|
|
113
|
-
const packageJsonPath = path.join(installCwd, "package.json");
|
|
114
|
-
|
|
115
|
-
if (!pathExists(packageJsonPath)) {
|
|
116
|
-
info(`Skipping ${locationName}: package.json not present`);
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
info(`Installing better-sqlite3 in ${locationName}`);
|
|
121
|
-
try {
|
|
122
|
-
installModule("better-sqlite3", installCwd);
|
|
123
|
-
} catch (error) {
|
|
124
|
-
warn(`Install failed in ${locationName}: ${error.message}`);
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
if (!pathExists(moduleRoot)) {
|
|
129
|
-
warn(`better-sqlite3 still missing in ${locationName} after install`);
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
const binaryPath = path.join(moduleRoot, "build", "Release", "better_sqlite3.node");
|
|
135
|
-
if (isBinaryValidForPlatform(binaryPath)) {
|
|
136
|
-
info(`better-sqlite3 already valid in ${locationName}`);
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
info(`Rebuilding better-sqlite3 in ${locationName} for ${process.platform}/${process.arch}`);
|
|
141
|
-
|
|
142
|
-
// 1. Try to copy from root if this is the standalone target and root is already valid
|
|
143
|
-
const rootModuleRoot = path.join(pkgRoot, "node_modules", "better-sqlite3");
|
|
144
|
-
const rootBinaryPath = path.join(rootModuleRoot, "build", "Release", "better_sqlite3.node");
|
|
145
|
-
|
|
146
|
-
if (moduleRoot !== rootModuleRoot && isBinaryValidForPlatform(rootBinaryPath)) {
|
|
147
|
-
info(`Copying valid better-sqlite3 from root node_modules to ${locationName}`);
|
|
148
|
-
try {
|
|
149
|
-
fs.mkdirSync(path.dirname(binaryPath), { recursive: true });
|
|
150
|
-
fs.copyFileSync(rootBinaryPath, binaryPath);
|
|
151
|
-
return;
|
|
152
|
-
} catch (err) {
|
|
153
|
-
warn(`Failed to copy better-sqlite3 from root: ${err.message}`);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// 2. Try to download prebuilt binaries using prebuild-install
|
|
158
|
-
const prebuiltPath = path.join(moduleRoot, "build", "Release", "better_sqlite3.node");
|
|
159
|
-
if (tryPrebuildInstall(moduleRoot) && isBinaryValidForPlatform(prebuiltPath)) {
|
|
160
|
-
info(`Downloaded prebuilt better-sqlite3 for ${locationName}`);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// 3. Fall back to rebuild from source, but only if we have the source files
|
|
165
|
-
if (!pathExists(path.join(moduleRoot, "binding.gyp"))) {
|
|
166
|
-
warn(`Cannot rebuild better-sqlite3 in ${locationName}: binding.gyp not found`);
|
|
167
|
-
warn("API key usage limiting will be disabled. To fix, install build tools:");
|
|
168
|
-
warn(" macOS: xcode-select --install");
|
|
169
|
-
warn(" Linux: sudo apt-get install build-essential python3");
|
|
170
|
-
warn(" Windows: npm install --global windows-build-tools");
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
try {
|
|
175
|
-
rebuildModule("better-sqlite3", path.dirname(path.dirname(moduleRoot)));
|
|
176
|
-
} catch (error) {
|
|
177
|
-
warn(`Rebuild failed in ${locationName}: ${error.message}`);
|
|
178
|
-
warn("API key usage limiting will be disabled.");
|
|
179
|
-
warn("The app will still work - install just won't track per-key usage limits.");
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
if (isBinaryValidForPlatform(binaryPath)) {
|
|
184
|
-
info(`better-sqlite3 rebuild succeeded in ${locationName}`);
|
|
185
|
-
} else {
|
|
186
|
-
warn(`better-sqlite3 still not valid in ${locationName} after rebuild`);
|
|
187
|
-
warn("API key usage limiting will be disabled.");
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
43
|
function copyDirSync(src, dest) {
|
|
192
44
|
fs.mkdirSync(dest, { recursive: true });
|
|
193
45
|
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
@@ -232,38 +84,13 @@ function copyOpenSse() {
|
|
|
232
84
|
}
|
|
233
85
|
|
|
234
86
|
function main() {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
targets.push({ name: "root node_modules", moduleRoot: rootModuleRoot });
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
if (standaloneRoot) {
|
|
246
|
-
targets.push({
|
|
247
|
-
name: `${path.relative(pkgRoot, standaloneRoot)}/node_modules`,
|
|
248
|
-
moduleRoot: path.join(standaloneRoot, "node_modules", "better-sqlite3"),
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
let anySuccess = false;
|
|
253
|
-
for (const target of targets) {
|
|
254
|
-
const binaryPath = path.join(target.moduleRoot, "build", "Release", "better_sqlite3.node");
|
|
255
|
-
ensureBetterSqlite3(target.name, target.moduleRoot);
|
|
256
|
-
if (isBinaryValidForPlatform(binaryPath)) {
|
|
257
|
-
anySuccess = true;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// Summary message
|
|
262
|
-
if (anySuccess) {
|
|
263
|
-
info("better-sqlite3 is ready. API key usage limiting enabled.");
|
|
264
|
-
} else if (targets.some(t => pathExists(t.moduleRoot))) {
|
|
265
|
-
warn("better-sqlite3 could not be built. API key usage limiting disabled.");
|
|
266
|
-
warn("To enable usage limits, reinstall with build tools installed.");
|
|
87
|
+
// Check node:sqlite availability
|
|
88
|
+
try {
|
|
89
|
+
require("node:sqlite");
|
|
90
|
+
info("node:sqlite is ready. API key usage limiting enabled.");
|
|
91
|
+
} catch {
|
|
92
|
+
warn("node:sqlite is not available on this Node.js version.");
|
|
93
|
+
warn("Node.js >= 22.13.0 is recommended for API key usage limits.");
|
|
267
94
|
}
|
|
268
95
|
|
|
269
96
|
copyOpenSse();
|