@jheavenknows/bluerouter 1.0.26 → 1.0.29
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/LICENSE +1 -1
- package/README.md +3 -3
- package/app/.next-cli-build/BUILD_ID +1 -1
- package/app/.next-cli-build/app-path-routes-manifest.json +3 -3
- package/app/.next-cli-build/build-manifest.json +2 -2
- package/app/.next-cli-build/prerender-manifest.json +3 -3
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +3 -3
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/virtual-combos/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/app/.next-cli-build/server/app/_not-found.rsc +5 -5
- package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/login/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js +5 -5
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js +3 -3
- package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js +3 -3
- package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js +2 -2
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/restart/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/virtual-combos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/virtual-combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/callback.html +1 -1
- package/app/.next-cli-build/server/app/callback.rsc +5 -5
- package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
- package/app/.next-cli-build/server/app/dashboard/quota.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.html +2 -2
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/!KGRhc2hib2FyZCk/dashboard/virtual-combos/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/!KGRhc2hib2FyZCk/dashboard/virtual-combos.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/app/.next-cli-build/server/app/dashboard.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/favicon.ico/route.js +1 -1
- package/app/.next-cli-build/server/app/favicon.ico.body +0 -0
- package/app/.next-cli-build/server/app/index.html +1 -1
- package/app/.next-cli-build/server/app/index.rsc +5 -5
- package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/landing/page.js +1 -1
- package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/landing.html +1 -1
- package/app/.next-cli-build/server/app/landing.rsc +6 -6
- package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/login.html +1 -1
- package/app/.next-cli-build/server/app/login.rsc +5 -5
- package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/manifest.webmanifest/route.js +1 -1
- package/app/.next-cli-build/server/app/manifest.webmanifest.body +1 -1
- package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app-paths-manifest.json +3 -3
- package/app/.next-cli-build/server/chunks/3110.js +2 -2
- package/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/app/.next-cli-build/server/chunks/476.js +2 -2
- package/app/.next-cli-build/server/chunks/6182.js +3 -3
- package/app/.next-cli-build/server/chunks/6567.js +8 -8
- package/app/.next-cli-build/server/chunks/7153.js +1 -1
- package/app/.next-cli-build/server/chunks/9447.js +1 -1
- package/app/.next-cli-build/server/chunks/9526.js +1 -1
- package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/app/.next-cli-build/server/middleware.js +3 -3
- package/app/.next-cli-build/server/pages/404.html +1 -1
- package/app/.next-cli-build/server/pages/500.html +1 -1
- package/app/.next-cli-build/server/server-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/server-reference-manifest.json +1 -1
- package/app/.next-cli-build/static/chunks/{1321-932e605b6d47063d.js → 1321-33266ff5666dd394.js} +1 -1
- package/app/.next-cli-build/static/chunks/4404-63455b79e318b1c7.js +53 -0
- package/app/.next-cli-build/static/chunks/5497-90dfe11dd01a459e.js +7 -0
- package/app/.next-cli-build/static/chunks/{5907-b4c71b034a42cd8c.js → 5907-46d07be8a58ce080.js} +2 -2
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/cli-tools/page-d8b42a4e1ae60f65.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/skills/page-84e359aafb683d81.js +1 -0
- package/app/.next-cli-build/static/chunks/app/landing/page-70884f02f4f66d0e.js +1 -0
- package/app/.next-cli-build/static/css/ec82d5a88f0fa69d.css +1 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/upgrade-1.0.27-to-1.0.28-1.0.28-20260526-112925/data.sqlite +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/upgrade-1.0.28-to-1.0.29-1.0.29-20260526-115911/data.sqlite +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
- package/app/package.json +1 -1
- package/app/public/favicon.svg +49 -13
- package/app/public/i18n/literals/ar.json +3 -3
- package/app/public/i18n/literals/bn.json +3 -3
- package/app/public/i18n/literals/cs.json +3 -3
- package/app/public/i18n/literals/da.json +3 -3
- package/app/public/i18n/literals/de.json +3 -3
- package/app/public/i18n/literals/el.json +3 -3
- package/app/public/i18n/literals/es.json +3 -3
- package/app/public/i18n/literals/fi.json +3 -3
- package/app/public/i18n/literals/fr.json +3 -3
- package/app/public/i18n/literals/he.json +3 -3
- package/app/public/i18n/literals/hi.json +3 -3
- package/app/public/i18n/literals/hu.json +3 -3
- package/app/public/i18n/literals/id.json +3 -3
- package/app/public/i18n/literals/it.json +3 -3
- package/app/public/i18n/literals/ja.json +3 -3
- package/app/public/i18n/literals/ko.json +3 -3
- package/app/public/i18n/literals/nl.json +3 -3
- package/app/public/i18n/literals/no.json +3 -3
- package/app/public/i18n/literals/pl.json +3 -3
- package/app/public/i18n/literals/pt-BR.json +3 -3
- package/app/public/i18n/literals/pt-PT.json +3 -3
- package/app/public/i18n/literals/ro.json +3 -3
- package/app/public/i18n/literals/ru.json +3 -3
- package/app/public/i18n/literals/sv.json +3 -3
- package/app/public/i18n/literals/th.json +3 -3
- package/app/public/i18n/literals/tl.json +3 -3
- package/app/public/i18n/literals/tr.json +3 -3
- package/app/public/i18n/literals/uk.json +3 -3
- package/app/public/i18n/literals/ur.json +3 -3
- package/app/public/i18n/literals/vi.json +3 -3
- package/app/public/i18n/literals/zh-CN.json +12 -12
- package/app/public/i18n/literals/zh-TW.json +3 -3
- package/app/src/mitm/server.js +2 -2
- package/cli.js +4 -4
- package/package.json +2 -2
- package/src/cli/api/client.js +1 -1
- package/src/cli/menus/cliTools.js +14 -14
- package/src/cli/terminalUI.js +2 -2
- package/src/cli/tray/autostart.js +2 -2
- package/src/cli/tray/tray.js +3 -3
- package/src/cli/tray/tray.ps1 +1 -1
- package/app/.next-cli-build/static/chunks/4404-3bd3186f4ee612a1.js +0 -53
- package/app/.next-cli-build/static/chunks/5497-886bdd124c9e47a3.js +0 -7
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/cli-tools/page-93016427d63637f4.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/skills/page-d00a05320aab3650.js +0 -1
- package/app/.next-cli-build/static/chunks/app/landing/page-743f3f6975e53a9a.js +0 -1
- package/app/.next-cli-build/static/css/7b0382cf3964c9a0.css +0 -1
- /package/app/.next-cli-build/static/{QxXip6ZNmTsndS1LuvETC → s7R5afHZdGdLCrnzcfPPg}/_buildManifest.js +0 -0
- /package/app/.next-cli-build/static/{QxXip6ZNmTsndS1LuvETC → s7R5afHZdGdLCrnzcfPPg}/_ssgManifest.js +0 -0
- /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-1.0.23-to-1.0.24-1.0.24-20260526-103341 → upgrade-1.0.26-to-1.0.27-1.0.27-20260526-112743}/data.sqlite +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"2. Provider Request (Translated)": "2. 提供商请求(已翻译)",
|
|
9
9
|
"2. Redirects": "2. 重定向",
|
|
10
10
|
"24h": "24小时",
|
|
11
|
-
"3. Maps Antigravity models to any provider via
|
|
11
|
+
"3. Maps Antigravity models to any provider via Bluerouter": "3. 通过 Bluerouter 将Antigravity模型映射到任何提供商",
|
|
12
12
|
"3. Provider Response (Raw)": "3. 提供商响应(原始)",
|
|
13
13
|
"4. Client Response (Final)": "4. 客户端响应(最终)",
|
|
14
14
|
"About": "关于",
|
|
@@ -194,7 +194,7 @@
|
|
|
194
194
|
"Enter your API key": "输入您的 API 密钥",
|
|
195
195
|
"Est. Cost": "预估成本",
|
|
196
196
|
"Estimated, not actual billing": "预估费用,非实际账单",
|
|
197
|
-
"Expose your local
|
|
197
|
+
"Expose your local Bluerouter to the internet. No port forwarding, no static IP needed. Share endpoint URL with your team or use it in Cursor, Cline, and other AI tools from anywhere.": "将您本地的 Bluerouter 暴露到互联网。无需端口转发,无需静态 IP。与您的团队共享端点 URL 或从任何地方在 Cursor、Cline 和其他 AI 工具中使用它。",
|
|
198
198
|
"Factory Droid - Manual Configuration": "Factory Droid - 手动配置",
|
|
199
199
|
"Factory Droid CLI not installed": "Factory Droid CLI 未安装",
|
|
200
200
|
"Failed to load usage statistics.": "无法加载使用情况统计信息。",
|
|
@@ -226,7 +226,7 @@
|
|
|
226
226
|
"Input:": "输入:",
|
|
227
227
|
"Installation Guide": "安装指南",
|
|
228
228
|
"Interactive diagram visible on desktop": "桌面上可见的交互式图表",
|
|
229
|
-
"Intercepts Antigravity traffic via DNS redirect, letting you reroute models through
|
|
229
|
+
"Intercepts Antigravity traffic via DNS redirect, letting you reroute models through Bluerouter.": "通过 DNS 重定向拦截Antigravity流量,让您可以通过 Bluerouter 重新路由模型。",
|
|
230
230
|
"KB per field": "每个字段的 KB",
|
|
231
231
|
"Key Name": "密钥名称",
|
|
232
232
|
"Kimi": "Kimi",
|
|
@@ -463,7 +463,7 @@
|
|
|
463
463
|
"Total Models": "模型总数",
|
|
464
464
|
"Total Requests": "请求总数",
|
|
465
465
|
"Total:": "总计:",
|
|
466
|
-
"traffic through
|
|
466
|
+
"traffic through Bluerouter via MITM.": "通过 MITM 通过 Bluerouter 的流量。",
|
|
467
467
|
"Translator Debug": "翻译器调试",
|
|
468
468
|
"Try Again": "再试一次",
|
|
469
469
|
"Tunnel connected!": "隧道连通!",
|
|
@@ -478,7 +478,7 @@
|
|
|
478
478
|
"Usage by API Key": "按 API 密钥统计",
|
|
479
479
|
"Usage by Endpoint": "按端点统计",
|
|
480
480
|
"Usage by Model": "按模型统计",
|
|
481
|
-
"Use Antigravity IDE & GitHub Copilot → with ANY provider/model from
|
|
481
|
+
"Use Antigravity IDE & GitHub Copilot → with ANY provider/model from Bluerouter": "使用 Antigravity IDE 和 GitHub Copilot → 与 Bluerouter 的任何提供商/模型",
|
|
482
482
|
"Use in Cursor/Cline": "在Cursor/Cline中使用",
|
|
483
483
|
"Use the buttons above to add OpenAI or Anthropic compatible endpoints": "使用上面的按钮添加 OpenAI 或 Anthropic 兼容端点",
|
|
484
484
|
"Use your API from any network": "从任何网络使用您的 API",
|
|
@@ -490,8 +490,8 @@
|
|
|
490
490
|
"Warning": "警告",
|
|
491
491
|
"When": "时间",
|
|
492
492
|
"When ON, dashboard requires password. When OFF, access without login.": "当打开时,仪表板需要密码。当关闭时,无需登录即可访问。",
|
|
493
|
-
"Windows: Run
|
|
494
|
-
"Windows: Run terminal (
|
|
493
|
+
"Windows: Run Bluerouter terminal as Administrator": "Windows:以管理员身份运行 Bluerouter 终端",
|
|
494
|
+
"Windows: Run terminal (Bluerouter) as Administrator to enable MITM": "Windows:以管理员身份运行终端 (Bluerouter) 以启用 MITM",
|
|
495
495
|
"Writes to": "写入到",
|
|
496
496
|
"You can override default pricing for specific models. Reset to defaults anytime to restore standard rates.": "您可以覆盖特定模型的默认定价。随时重置为默认值以恢复标准费率。",
|
|
497
497
|
"Your": "你的",
|
|
@@ -517,11 +517,11 @@
|
|
|
517
517
|
"Route AI requests through subscription, cheap, and free tiers with auto-fallback. One endpoint for Claude, GPT, Gemini, and more.": "通过订阅、低价和免费层级路由 AI 请求并自动回退。一个端点接入 Claude、GPT、Gemini 等。",
|
|
518
518
|
"Get Started": "开始使用",
|
|
519
519
|
"View on GitHub": "在 GitHub 上查看",
|
|
520
|
-
"How
|
|
520
|
+
"How Bluerouter Works": "Bluerouter 工作原理",
|
|
521
521
|
"Data flows seamlessly through our intelligent routing system": "数据通过我们的智能路由系统无缝流转",
|
|
522
522
|
"1. CLI & SDKs": "1. CLI 和 SDK",
|
|
523
523
|
"Your requests start from your favorite tools — Cursor, Claude, Copilot, or any OpenAI-compatible SDK.": "请求从您常用的工具发起——Cursor、Claude、Copilot 或任何 OpenAI 兼容的 SDK。",
|
|
524
|
-
"2.
|
|
524
|
+
"2. Bluerouter Hub": "2. Bluerouter 枢纽",
|
|
525
525
|
"Our engine analyzes the prompt and routes through your subscription, cheap, and free provider tiers with automatic fallback.": "我们的引擎分析提示词并通过您的订阅、低价和免费提供商层级路由,自动回退。",
|
|
526
526
|
"3. AI Providers": "3. AI 提供商",
|
|
527
527
|
"The request is fulfilled by OpenAI, Anthropic, Gemini, or others instantly.": "请求由 OpenAI、Anthropic、Gemini 或其他提供商即时响应。",
|
|
@@ -544,7 +544,7 @@
|
|
|
544
544
|
"Dashboard": "仪表盘",
|
|
545
545
|
"Beautiful web dashboard for managing providers and monitoring usage.": "精美的 Web 仪表盘,用于管理提供商和监控使用情况。",
|
|
546
546
|
"Get Started in 30 Seconds": "30 秒快速上手",
|
|
547
|
-
"Install
|
|
547
|
+
"Install Bluerouter": "安装 Bluerouter",
|
|
548
548
|
"Open Dashboard": "打开仪表盘",
|
|
549
549
|
"Route Requests": "路由请求",
|
|
550
550
|
"npm install -g bluerouter": "npm install -g bluerouter",
|
|
@@ -558,7 +558,7 @@
|
|
|
558
558
|
"Model combos with fallback": "模型组合及回退",
|
|
559
559
|
"Monitor your API usage, token consumption, and request logs": "监控您的 API 使用量、Token 消耗和请求日志",
|
|
560
560
|
"Track and manage your API quota limits": "跟踪和管理您的 API 配额限制",
|
|
561
|
-
"Intercept CLI tool traffic and route through
|
|
561
|
+
"Intercept CLI tool traffic and route through Bluerouter": "拦截 CLI 工具流量并通过 Bluerouter 路由",
|
|
562
562
|
"Configure CLI tools": "配置 CLI 工具",
|
|
563
563
|
"Manage your proxy pool configurations": "管理您的代理池配置",
|
|
564
564
|
"API endpoint configuration": "API 端点配置",
|
|
@@ -689,7 +689,7 @@
|
|
|
689
689
|
"Select models to add": "选择要添加的模型",
|
|
690
690
|
"Add Model for OpenCode": "为 OpenCode 添加模型",
|
|
691
691
|
"Default Model": "默认模型",
|
|
692
|
-
"
|
|
692
|
+
"Bluerouter Base URL": "Bluerouter 基础 URL",
|
|
693
693
|
"Trust Cert": "信任证书",
|
|
694
694
|
"Trusted": "已信任",
|
|
695
695
|
"not detected locally": "未在本地检测到",
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
"Manage your AI provider connections": "管理您的 AI 提供者連接",
|
|
109
109
|
"Model combos with fallback": "具有備用的模型組合",
|
|
110
110
|
"Monitor your API usage, token consumption, and request logs": "監控您的 API 使用、令牌消耗和請求日誌",
|
|
111
|
-
"Intercept CLI tool traffic and route through
|
|
111
|
+
"Intercept CLI tool traffic and route through Bluerouter": "攔截 CLI 工具流量並通過 Bluerouter 路由",
|
|
112
112
|
"Configure CLI tools": "配置 CLI 工具",
|
|
113
113
|
"API endpoint configuration": "API 端點配置",
|
|
114
114
|
"Manage your preferences": "管理您的首選項",
|
|
@@ -172,9 +172,9 @@
|
|
|
172
172
|
"Cert": "證書",
|
|
173
173
|
"Server": "服務器",
|
|
174
174
|
"Purpose:": "目的:",
|
|
175
|
-
"Use Antigravity IDE & GitHub Copilot → with ANY provider/model from
|
|
175
|
+
"Use Antigravity IDE & GitHub Copilot → with ANY provider/model from Bluerouter": "使用 Antigravity IDE 和 GitHub Copilot → 與 Bluerouter 中的任何提供者/模型一起",
|
|
176
176
|
"How it works:": "工作原理:",
|
|
177
|
-
"Antigravity/Copilot IDE request → DNS redirect to localhost:443 → AI Traffic Proxy intercepts →
|
|
177
|
+
"Antigravity/Copilot IDE request → DNS redirect to localhost:443 → AI Traffic Proxy intercepts → Bluerouter → response to Antigravity/Copilot": "Antigravity/Copilot IDE 請求 → DNS 重定向到 localhost:443 → MITM 代理攔截 → Bluerouter → 响應到 Antigravity/Copilot",
|
|
178
178
|
"No API keys — create one in Keys page": "沒有 API 金鑰 — 在金鑰頁面中創建一個",
|
|
179
179
|
"sk_bluerouter (default)": "sk_bluerouter(默認)",
|
|
180
180
|
"Server started": "服務器已啟動",
|
package/app/src/mitm/server.js
CHANGED
|
@@ -23,7 +23,7 @@ Private-Lines: `+u+`\r
|
|
|
23
23
|
`,s+=c;var S=xa("putty-private-key-file-mac-key",t),T=xe.util.createBuffer();Cr(T,r),Cr(T,n),Cr(T,a),T.putInt32(i.length()),T.putBuffer(i),T.putInt32(l.length()),T.putBuffer(l);var B=xe.hmac.create();return B.start("sha1",S),B.update(T.bytes()),s+=`\r
|
|
24
24
|
Private-MAC: `+B.digest().toHex()+`\r
|
|
25
25
|
`,s};Sa.publicKeyToOpenSSH=function(e,t){var a="ssh-rsa";t=t||"";var r=xe.util.createBuffer();return Cr(r,a),St(r,e.e),St(r,e.n),a+" "+xe.util.encode64(r.bytes())+" "+t};Sa.privateKeyToOpenSSH=function(e,t){return t?xe.pki.encryptRsaPrivateKey(e,t,{legacy:!0,algorithm:"aes128"}):xe.pki.privateKeyToPem(e)};Sa.getPublicKeyFingerprint=function(e,t){t=t||{};var a=t.md||xe.md.md5.create(),r="ssh-rsa",n=xe.util.createBuffer();Cr(n,r),St(n,e.e),St(n,e.n),a.start(),a.update(n.getBytes());var s=a.digest();if(t.encoding==="hex"){var i=s.toHex();return t.delimiter?i.match(/.{2}/g).join(t.delimiter):i}else{if(t.encoding==="binary")return s.getBytes();if(t.encoding)throw new Error('Unknown encoding "'+t.encoding+'".')}return s};function St(e,t){var a=t.toString(16);a[0]>="8"&&(a="00"+a);var r=xe.util.hexToBytes(a);e.putInt32(r.length),e.putBytes(r)}function Cr(e,t){e.putInt32(t.length),e.putString(t)}function xa(){for(var e=xe.md.sha1.create(),t=arguments.length,a=0;a<t;++a)e.update(arguments[a]);return e.digest()}});var So=K(($h,xo)=>{xo.exports=$();Lt();Ks();ft();Qr();br();no();or();uo();ho();yo();sn();aa();Yt();Za();ln();mo();fn();tn();za();ca();nt();ja();Eo();vn();ae()});var Bo=K((jh,Io)=>{var Mt=require("path"),j=require("fs"),ge=So(),{execFileSync:On}=require("child_process"),{MITM_DIR:qt}=nr(),Re=Mt.join(qt,"rootCA.key"),Te=Mt.join(qt,"rootCA.crt"),Tt=Mt.join(qt,"rootCA.csr"),Dn=Mt.join(qt,"rootCA.csr.cnf"),Xe=Mt.join(qt,"rootCA.pending.key"),Un=Mt.join(qt,"backup");function Kr(){j.existsSync(qt)||j.mkdirSync(qt,{recursive:!0})}function Fr(e,t){let a=String(e||"").trim();if(!a)throw new Error(`${t} is empty`);return`${a}
|
|
26
|
-
`}function Vn(e){return ge.md.sha256.create().update(ge.pki.publicKeyToPem(e),"utf8").digest().toHex()}function bf(e){if(!e?.n||!e?.e)throw new Error("Only RSA private keys are supported for MITM Root CA");return ge.pki.setRsaPublicKey(e.n,e.e)}function Fn(e){let t=e.getExtension("basicConstraints"),a=e.getExtension("keyUsage");return!!t?.cA&&(!a||a.keyCertSign===!0)}function To(e,t){let a=Vn(e.publicKey),r=Vn(bf(t));if(a!==r)throw new Error("Certificate public key does not match private key")}function Ta(){Kr();let e=j.existsSync(Re),t=j.existsSync(Te);if(!e&&!t)return null;j.mkdirSync(Un,{recursive:!0});let a=new Date().toISOString().replace(/[:.]/g,"-"),r={key:Mt.join(Un,`rootCA.${a}.key`),cert:Mt.join(Un,`rootCA.${a}.crt`)};return e&&j.copyFileSync(Re,r.key),t&&j.copyFileSync(Te,r.cert),r}function Kn(e,t="Certificate"){try{return ge.pki.certificateFromPem(Fr(e,t))}catch(a){throw new Error(`${t} is not a valid PEM certificate: ${a.message}`)}}function Ao(e,t="Private key"){try{return ge.pki.privateKeyFromPem(Fr(e,t))}catch(a){throw new Error(`${t} is not a valid PEM private key: ${a.message}`)}}function Mn(e){try{let t=ge.pki.certificateFromPem(j.readFileSync(e,"utf8")),a=new Date(Date.now()+720*60*60*1e3);return t.validity.notAfter<a}catch{return!0}}function qn(){let e=j.existsSync(Te),t=j.existsSync(Re),a=j.existsSync(Tt),r=j.existsSync(Xe),n={certExists:e,keyExists:t,csrExists:a,pendingKeyExists:r,certPath:Te,keyPath:Re,csrPath:Tt,pendingKeyPath:Xe};if(!e)return n;try{let s=Kn(j.readFileSync(Te,"utf8")),i=s.subject.attributes.map(u=>`${u.shortName||u.name}=${u.value}`).join(", "),o=s.issuer.attributes.map(u=>`${u.shortName||u.name}=${u.value}`).join(", ");n.subject=i,n.issuer=o,n.serialNumber=s.serialNumber,n.notBefore=s.validity.notBefore.toISOString(),n.notAfter=s.validity.notAfter.toISOString(),n.expiredOrExpiringSoon=Mn(Te),n.isCa=Fn(s),n.isSelfSigned=i===o,n.fingerprint=Vn(s.publicKey)}catch(s){n.error=s.message}return n}async function _f(){let e=j.existsSync(Re)&&j.existsSync(Te);if(e&&!Mn(Te))return console.log("\u2705 Root CA already exists"),{key:Re,cert:Te};if(e){console.log("\u{1F510} Root CA expired or expiring soon \u2014 regenerating...");try{j.unlinkSync(Re)}catch{}try{j.unlinkSync(Te)}catch{}}Kr(),console.log("\u{1F510} Generating Root CA certificate...");let t=ge.pki.rsa.generateKeyPair(2048),a=ge.pki.createCertificate();a.publicKey=t.publicKey,a.serialNumber="01",a.validity.notBefore=new Date,a.validity.notAfter=new Date,a.validity.notAfter.setFullYear(a.validity.notBefore.getFullYear()+10);let r=[{name:"commonName",value:"Blue Router Gateway Root CA"},{name:"organizationName",value:"Blue Router Gateway"},{name:"countryName",value:"VN"}];a.setSubject(r),a.setIssuer(r),a.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,cRLSign:!0,critical:!0},{name:"subjectKeyIdentifier"}]),a.sign(t.privateKey,ge.md.sha256.create());let n=ge.pki.privateKeyToPem(t.privateKey),s=ge.pki.certificateToPem(a);return j.writeFileSync(Re,n,{mode:384}),j.writeFileSync(Te,s),console.log("\u2705 Root CA generated successfully"),{key:Re,cert:Te}}function Nf({certPem:e,keyPem:t}){Kr();let a=Fr(e,"Certificate"),r=Fr(t,"Private key"),n=Kn(a),s=Ao(r);if(To(n,s),!Fn(n))throw new Error("Certificate must be a CA certificate with basicConstraints CA:true and keyCertSign usage");if(n.validity.notAfter<new Date)throw new Error("Certificate is already expired");let i=Ta();j.writeFileSync(Re,r,{mode:384}),j.writeFileSync(Te,a);try{j.unlinkSync(Tt)}catch{}try{j.unlinkSync(Xe)}catch{}return{key:Re,cert:Te,backup:i,info:qn()}}function Pn(e,t){return String(e||t||"").replace(/[\r\n]+/g," ").replace(/[\\]/g,"\\\\").trim()||String(t||"")}function wf(){try{return On("openssl",["version"],{stdio:"ignore"}),!0}catch{return!1}}function Rf({commonName:e,organizationName:t,countryName:a}={}){let r=Pn(e,"Fujinet
|
|
26
|
+
`}function Vn(e){return ge.md.sha256.create().update(ge.pki.publicKeyToPem(e),"utf8").digest().toHex()}function bf(e){if(!e?.n||!e?.e)throw new Error("Only RSA private keys are supported for MITM Root CA");return ge.pki.setRsaPublicKey(e.n,e.e)}function Fn(e){let t=e.getExtension("basicConstraints"),a=e.getExtension("keyUsage");return!!t?.cA&&(!a||a.keyCertSign===!0)}function To(e,t){let a=Vn(e.publicKey),r=Vn(bf(t));if(a!==r)throw new Error("Certificate public key does not match private key")}function Ta(){Kr();let e=j.existsSync(Re),t=j.existsSync(Te);if(!e&&!t)return null;j.mkdirSync(Un,{recursive:!0});let a=new Date().toISOString().replace(/[:.]/g,"-"),r={key:Mt.join(Un,`rootCA.${a}.key`),cert:Mt.join(Un,`rootCA.${a}.crt`)};return e&&j.copyFileSync(Re,r.key),t&&j.copyFileSync(Te,r.cert),r}function Kn(e,t="Certificate"){try{return ge.pki.certificateFromPem(Fr(e,t))}catch(a){throw new Error(`${t} is not a valid PEM certificate: ${a.message}`)}}function Ao(e,t="Private key"){try{return ge.pki.privateKeyFromPem(Fr(e,t))}catch(a){throw new Error(`${t} is not a valid PEM private key: ${a.message}`)}}function Mn(e){try{let t=ge.pki.certificateFromPem(j.readFileSync(e,"utf8")),a=new Date(Date.now()+720*60*60*1e3);return t.validity.notAfter<a}catch{return!0}}function qn(){let e=j.existsSync(Te),t=j.existsSync(Re),a=j.existsSync(Tt),r=j.existsSync(Xe),n={certExists:e,keyExists:t,csrExists:a,pendingKeyExists:r,certPath:Te,keyPath:Re,csrPath:Tt,pendingKeyPath:Xe};if(!e)return n;try{let s=Kn(j.readFileSync(Te,"utf8")),i=s.subject.attributes.map(u=>`${u.shortName||u.name}=${u.value}`).join(", "),o=s.issuer.attributes.map(u=>`${u.shortName||u.name}=${u.value}`).join(", ");n.subject=i,n.issuer=o,n.serialNumber=s.serialNumber,n.notBefore=s.validity.notBefore.toISOString(),n.notAfter=s.validity.notAfter.toISOString(),n.expiredOrExpiringSoon=Mn(Te),n.isCa=Fn(s),n.isSelfSigned=i===o,n.fingerprint=Vn(s.publicKey)}catch(s){n.error=s.message}return n}async function _f(){let e=j.existsSync(Re)&&j.existsSync(Te);if(e&&!Mn(Te))return console.log("\u2705 Root CA already exists"),{key:Re,cert:Te};if(e){console.log("\u{1F510} Root CA expired or expiring soon \u2014 regenerating...");try{j.unlinkSync(Re)}catch{}try{j.unlinkSync(Te)}catch{}}Kr(),console.log("\u{1F510} Generating Root CA certificate...");let t=ge.pki.rsa.generateKeyPair(2048),a=ge.pki.createCertificate();a.publicKey=t.publicKey,a.serialNumber="01",a.validity.notBefore=new Date,a.validity.notAfter=new Date,a.validity.notAfter.setFullYear(a.validity.notBefore.getFullYear()+10);let r=[{name:"commonName",value:"Blue Router Gateway Root CA"},{name:"organizationName",value:"Blue Router Gateway"},{name:"countryName",value:"VN"}];a.setSubject(r),a.setIssuer(r),a.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,cRLSign:!0,critical:!0},{name:"subjectKeyIdentifier"}]),a.sign(t.privateKey,ge.md.sha256.create());let n=ge.pki.privateKeyToPem(t.privateKey),s=ge.pki.certificateToPem(a);return j.writeFileSync(Re,n,{mode:384}),j.writeFileSync(Te,s),console.log("\u2705 Root CA generated successfully"),{key:Re,cert:Te}}function Nf({certPem:e,keyPem:t}){Kr();let a=Fr(e,"Certificate"),r=Fr(t,"Private key"),n=Kn(a),s=Ao(r);if(To(n,s),!Fn(n))throw new Error("Certificate must be a CA certificate with basicConstraints CA:true and keyCertSign usage");if(n.validity.notAfter<new Date)throw new Error("Certificate is already expired");let i=Ta();j.writeFileSync(Re,r,{mode:384}),j.writeFileSync(Te,a);try{j.unlinkSync(Tt)}catch{}try{j.unlinkSync(Xe)}catch{}return{key:Re,cert:Te,backup:i,info:qn()}}function Pn(e,t){return String(e||t||"").replace(/[\r\n]+/g," ").replace(/[\\]/g,"\\\\").trim()||String(t||"")}function wf(){try{return On("openssl",["version"],{stdio:"ignore"}),!0}catch{return!1}}function Rf({commonName:e,organizationName:t,countryName:a}={}){let r=Pn(e,"Fujinet Bluerouter MITM CA"),n=Pn(t,"Fujinet"),i=`[ req ]
|
|
27
27
|
default_bits = 4096
|
|
28
28
|
prompt = no
|
|
29
29
|
distinguished_name = dn
|
|
@@ -39,7 +39,7 @@ CN = ${r}
|
|
|
39
39
|
basicConstraints = critical, CA:true, pathlen:0
|
|
40
40
|
keyUsage = critical, keyCertSign, cRLSign
|
|
41
41
|
subjectKeyIdentifier = hash
|
|
42
|
-
`,o=Ta();j.writeFileSync(Dn,i,"utf8");try{On("openssl",["genrsa","-out",Xe,"4096"],{stdio:["ignore","pipe","pipe"]}),On("openssl",["req","-new","-key",Xe,"-out",Tt,"-config",Dn],{stdio:["ignore","pipe","pipe"]});try{j.chmodSync(Xe,384)}catch{}return{csr:Tt,pendingKey:Xe,config:Dn,backup:o}}catch(u){try{j.unlinkSync(Xe)}catch{}try{j.unlinkSync(Tt)}catch{}let l=u?.stderr?String(u.stderr).trim():"";throw new Error(`OpenSSL CSR generation failed${l?`: ${l}`:""}`)}}function Lf({commonName:e,organizationName:t,countryName:a}={}){if(Kr(),wf())return Rf({commonName:e,organizationName:t,countryName:a});let r=[{name:"commonName",value:String(e||"Fujinet
|
|
42
|
+
`,o=Ta();j.writeFileSync(Dn,i,"utf8");try{On("openssl",["genrsa","-out",Xe,"4096"],{stdio:["ignore","pipe","pipe"]}),On("openssl",["req","-new","-key",Xe,"-out",Tt,"-config",Dn],{stdio:["ignore","pipe","pipe"]});try{j.chmodSync(Xe,384)}catch{}return{csr:Tt,pendingKey:Xe,config:Dn,backup:o}}catch(u){try{j.unlinkSync(Xe)}catch{}try{j.unlinkSync(Tt)}catch{}let l=u?.stderr?String(u.stderr).trim():"";throw new Error(`OpenSSL CSR generation failed${l?`: ${l}`:""}`)}}function Lf({commonName:e,organizationName:t,countryName:a}={}){if(Kr(),wf())return Rf({commonName:e,organizationName:t,countryName:a});let r=[{name:"commonName",value:String(e||"Fujinet Bluerouter MITM CA").trim()||"Fujinet Bluerouter MITM CA"},{name:"organizationName",value:String(t||"Fujinet").trim()||"Fujinet"},{name:"organizationalUnitName",value:"AI Gateway"}],n=String(a||"VN").trim().slice(0,2).toUpperCase();n&&r.push({name:"countryName",value:n});let s=ge.pki.rsa.generateKeyPair(4096),i=ge.pki.createCertificationRequest();if(i.publicKey=s.publicKey,i.setSubject(r),i.sign(s.privateKey,ge.md.sha256.create()),!i.verify())throw new Error("Generated CSR failed verification");let o=Ta(),u=ge.pki.certificationRequestToPem(i),l=ge.pki.privateKeyToPem(s.privateKey);return j.writeFileSync(Xe,l,{mode:384}),j.writeFileSync(Tt,u),{csr:Tt,pendingKey:Xe,backup:o}}function kf({certPem:e}){if(Kr(),!j.existsSync(Xe))throw new Error("No pending CSR private key found. Generate a CSR first.");let t=Fr(e,"Signed certificate"),a=Kn(t,"Signed certificate"),r=Ao(j.readFileSync(Xe,"utf8"),"Pending private key");if(To(a,r),!Fn(a))throw new Error("Signed certificate must be a CA certificate with CA:true and keyCertSign usage");if(a.validity.notAfter<new Date)throw new Error("Signed certificate is already expired");let n=Ta();j.copyFileSync(Xe,Re);try{j.chmodSync(Re,384)}catch{}j.writeFileSync(Te,t);try{j.unlinkSync(Tt)}catch{}try{j.unlinkSync(Xe)}catch{}return{key:Re,cert:Te,backup:n,info:qn()}}function Df(){if(!j.existsSync(Re)||!j.existsSync(Te))throw new Error("Root CA not found. Generate it first.");let e=j.readFileSync(Re,"utf8"),t=j.readFileSync(Te,"utf8");return{key:ge.pki.privateKeyFromPem(e),cert:ge.pki.certificateFromPem(t)}}function Uf(e,t){let a=ge.pki.rsa.generateKeyPair(2048),r=ge.pki.createCertificate();return r.publicKey=a.publicKey,r.serialNumber=Math.floor(Math.random()*1e6).toString(),r.validity.notBefore=new Date,r.validity.notAfter=new Date,r.validity.notAfter.setFullYear(r.validity.notBefore.getFullYear()+1),r.setSubject([{name:"commonName",value:e}]),r.setIssuer(t.cert.subject.attributes),r.setExtensions([{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:[{type:2,value:e},{type:2,value:`*.${e}`}]}]),r.sign(t.key,ge.md.sha256.create()),{key:ge.pki.privateKeyToPem(a.privateKey),cert:ge.pki.certificateToPem(r)}}Io.exports={generateRootCA:_f,importRootCAPair:Nf,generateRootCACsr:Lf,importSignedRootCACert:kf,loadRootCA:Df,generateLeafCert:Uf,isCertExpired:Mn,readRootCAInfo:qn,ROOT_CA_CERT_PATH:Te,ROOT_CA_KEY_PATH:Re,ROOT_CA_CSR_PATH:Tt,ROOT_CA_PENDING_KEY_PATH:Xe}});var _o=K((Jh,bo)=>{var Yh=require("path"),Wh=require("fs"),{MITM_DIR:Xh}=nr(),{generateRootCA:Pf,loadRootCA:Of,generateLeafCert:Vf}=Bo();async function Ff(){return await Pf()}function Kf(e){try{let t=Of(),a=Vf(e,t);return{key:a.key,cert:a.cert}}catch(t){return console.error(`Failed to generate cert for ${e}:`,t.message),null}}bo.exports={generateCert:Ff,getCertForDomain:Kf}});var Lo=K((Zh,Ro)=>{var No=require("fs"),Mf=require("path"),{DATA_DIR:qf}=nr(),wo=Mf.join(qf,"mitm","aliases.json");function Hf(){try{return No.existsSync(wo)?JSON.parse(No.readFileSync(wo,"utf-8")):null}catch{return null}}function Gf(e){return Hf()?.[e]||null}Ro.exports={getMitmAlias:Gf}});var Aa=K((rp,Uo)=>{var{log:ep,err:tp}=$t(),ko="http://localhost:20128",zf=String(process.env.MITM_ROUTER_BASE||ko).trim().replace(/\/+$/,"")||ko,Do=process.env.ROUTER_API_KEY,Qf=new Set(["host","content-length","connection","transfer-encoding","content-type","authorization"]);async function $f(e,t="/v1/chat/completions",a={}){let r={};for(let[s,i]of Object.entries(a))Qf.has(s.toLowerCase())||(r[s]=i);return await fetch(`${zf}${t}`,{method:"POST",headers:{...r,"Content-Type":"application/json",...Do&&{Authorization:`Bearer ${Do}`}},body:JSON.stringify(e)})}async function jf(e,t,a){let r=e.headers.get("content-type")||"application/json",n=e.status||200,s={"Content-Type":r,"Cache-Control":"no-cache",Connection:"keep-alive"};if(r.includes("text/event-stream")&&(s["X-Accel-Buffering"]="no"),t.writeHead(n,s),a&&a.writeHeader(e.status,Object.fromEntries(e.headers)),!e.body){let u=await e.text().catch(()=>"");a&&(a.writeChunk(u),a.end()),t.end(u);return}let i=e.body.getReader(),o=new TextDecoder;for(;;){let{done:u,value:l}=await i.read();if(u){a&&a.end(),t.end();break}a&&a.writeChunk(l),t.write(o.decode(l,{stream:!0}))}}Uo.exports={fetchRouter:$f,pipeSSE:jf}});var Oo=K((ap,Po)=>{var{err:Yf,createResponseDumper:Wf}=$t(),{IS_DEV:Xf}=Sr(),{fetchRouter:Jf,pipeSSE:Zf}=Aa();async function ed(e,t,a,r){let n=Xf?Wf(e,"intercept-antigravity"):null,s=e.url.includes(":streamGenerateContent");try{let i=JSON.parse(a.toString());i.model&&(i.model=r);let o=await Jf(i,"/v1/chat/completions",e.headers);await Zf(o,t,n)}catch(i){Yf(`[antigravity] ${i.message}`),n&&(n.writeChunk(`
|
|
43
43
|
[ERROR] ${i.message}
|
|
44
44
|
`),n.end()),s?(t.headersSent||t.writeHead(200,{"Content-Type":"text/event-stream"}),t.end(`data: ${JSON.stringify({error:{message:i.message}})}\r
|
|
45
45
|
\r
|
package/cli.js
CHANGED
|
@@ -196,7 +196,7 @@ for i in $(seq 1 "\${MAX_WAIT_SECONDS}"); do
|
|
|
196
196
|
done
|
|
197
197
|
|
|
198
198
|
if [[ "\${ready}" != "1" ]]; then
|
|
199
|
-
log "
|
|
199
|
+
log "Bluerouter API is not ready; skip MITM autostart"
|
|
200
200
|
exit 0
|
|
201
201
|
fi
|
|
202
202
|
|
|
@@ -492,7 +492,7 @@ function writeSystemdService({
|
|
|
492
492
|
.join("\n");
|
|
493
493
|
|
|
494
494
|
const unit = `[Unit]
|
|
495
|
-
Description=
|
|
495
|
+
Description=Bluerouter
|
|
496
496
|
After=network.target
|
|
497
497
|
|
|
498
498
|
[Service]
|
|
@@ -1319,7 +1319,7 @@ function startServer(latestVersion) {
|
|
|
1319
1319
|
process.on("SIGHUP", () => {});
|
|
1320
1320
|
|
|
1321
1321
|
console.log(`\n⏳ Switching to tray mode... (icon already visible in menu bar)`);
|
|
1322
|
-
console.log(`🔔
|
|
1322
|
+
console.log(`🔔 Bluerouter is running in tray (PID: ${process.pid})`);
|
|
1323
1323
|
console.log(` Server: http://${displayHost}:${port}`);
|
|
1324
1324
|
console.log(`\n💡 You can close this terminal. Right-click tray icon to quit.\n`);
|
|
1325
1325
|
|
|
@@ -1338,7 +1338,7 @@ function startServer(latestVersion) {
|
|
|
1338
1338
|
});
|
|
1339
1339
|
bgProcess.unref();
|
|
1340
1340
|
|
|
1341
|
-
console.log(`🔔
|
|
1341
|
+
console.log(`🔔 Bluerouter is now running in background (PID: ${bgProcess.pid})`);
|
|
1342
1342
|
console.log(` Server: http://${displayHost}:${port}`);
|
|
1343
1343
|
console.log(`\n💡 You can close this terminal. Right-click tray icon to quit.\n`);
|
|
1344
1344
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jheavenknows/bluerouter",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.29",
|
|
4
|
+
"description": "Bluerouter CLI - Start and manage Bluerouter server",
|
|
5
5
|
"bin": {
|
|
6
6
|
"bluerouter": "./cli.js"
|
|
7
7
|
},
|
package/src/cli/api/client.js
CHANGED
|
@@ -364,7 +364,7 @@ async function deleteCombo(id) {
|
|
|
364
364
|
/**
|
|
365
365
|
* Get CLI tool settings
|
|
366
366
|
* @param {string} tool - Tool name: claude | codex | droid | openclaw
|
|
367
|
-
* @returns {Promise<Object>} { success, data: { installed,
|
|
367
|
+
* @returns {Promise<Object>} { success, data: { installed, hasBluerouter, ... } }
|
|
368
368
|
*/
|
|
369
369
|
async function getCliToolSettings(tool) {
|
|
370
370
|
return makeRequest("GET", `/api/cli-tools/${tool}-settings`);
|
|
@@ -179,10 +179,10 @@ async function buildCodexHeader() {
|
|
|
179
179
|
const result = await api.getCliToolSettings("codex");
|
|
180
180
|
if (!result.success) return ` ${COLORS.red}Failed to load settings${COLORS.reset}`;
|
|
181
181
|
|
|
182
|
-
const { installed,
|
|
182
|
+
const { installed, hasBluerouter, config } = result.data;
|
|
183
183
|
if (!installed) return `Status: ${COLORS.red}✗ Codex CLI not installed${COLORS.reset}`;
|
|
184
184
|
|
|
185
|
-
if (!
|
|
185
|
+
if (!hasBluerouter) {
|
|
186
186
|
return [
|
|
187
187
|
`Status: ${COLORS.red}✗ Not configured${COLORS.reset}`,
|
|
188
188
|
`${COLORS.dim}Run "Quick Setup" to configure${COLORS.reset}`
|
|
@@ -267,18 +267,18 @@ async function buildDroidHeader() {
|
|
|
267
267
|
const result = await api.getCliToolSettings("droid");
|
|
268
268
|
if (!result.success) return ` ${COLORS.red}Failed to load settings${COLORS.reset}`;
|
|
269
269
|
|
|
270
|
-
const { installed,
|
|
270
|
+
const { installed, hasBluerouter, settings } = result.data;
|
|
271
271
|
if (!installed) return `Status: ${COLORS.red}✗ Factory Droid not installed${COLORS.reset}`;
|
|
272
272
|
|
|
273
|
-
if (!
|
|
273
|
+
if (!hasBluerouter) {
|
|
274
274
|
return [
|
|
275
275
|
`Status: ${COLORS.red}✗ Not configured${COLORS.reset}`,
|
|
276
276
|
`${COLORS.dim}Run "Quick Setup" to configure${COLORS.reset}`
|
|
277
277
|
].join("\n");
|
|
278
278
|
}
|
|
279
279
|
|
|
280
|
-
// Extract
|
|
281
|
-
const custom = settings?.customModels?.find(m => m.id === "custom:
|
|
280
|
+
// Extract Bluerouter custom model config
|
|
281
|
+
const custom = settings?.customModels?.find(m => m.id === "custom:Bluerouter-0");
|
|
282
282
|
const lines = [`Status: ${COLORS.green}✓ Configured${COLORS.reset}`];
|
|
283
283
|
if (custom?.baseUrl) lines.push(`Endpoint: ${COLORS.cyan}${custom.baseUrl}${COLORS.reset}`);
|
|
284
284
|
if (custom?.model) lines.push(`Model: ${COLORS.dim}${custom.model}${COLORS.reset}`);
|
|
@@ -350,17 +350,17 @@ async function buildOpenClawHeader() {
|
|
|
350
350
|
const result = await api.getCliToolSettings("openclaw");
|
|
351
351
|
if (!result.success) return ` ${COLORS.red}Failed to load settings${COLORS.reset}`;
|
|
352
352
|
|
|
353
|
-
const { installed,
|
|
353
|
+
const { installed, hasBluerouter, settings } = result.data;
|
|
354
354
|
if (!installed) return `Status: ${COLORS.red}✗ Open Claw not installed${COLORS.reset}`;
|
|
355
355
|
|
|
356
|
-
if (!
|
|
356
|
+
if (!hasBluerouter) {
|
|
357
357
|
return [
|
|
358
358
|
`Status: ${COLORS.red}✗ Not configured${COLORS.reset}`,
|
|
359
359
|
`${COLORS.dim}Run "Quick Setup" to configure${COLORS.reset}`
|
|
360
360
|
].join("\n");
|
|
361
361
|
}
|
|
362
362
|
|
|
363
|
-
// Extract
|
|
363
|
+
// Extract Bluerouter provider config
|
|
364
364
|
const provider = settings?.models?.providers?.["bluerouter"];
|
|
365
365
|
const primary = settings?.agents?.defaults?.model?.primary || "";
|
|
366
366
|
const model = primary.startsWith("bluerouter/") ? primary.replace("bluerouter/", "") : (provider?.models?.[0]?.id || "");
|
|
@@ -431,10 +431,10 @@ async function buildOpenCodeHeader() {
|
|
|
431
431
|
const result = await api.getCliToolSettings("opencode");
|
|
432
432
|
if (!result.success) return ` ${COLORS.red}Failed to load settings${COLORS.reset}`;
|
|
433
433
|
|
|
434
|
-
const { installed,
|
|
434
|
+
const { installed, hasBluerouter, opencode } = result.data;
|
|
435
435
|
if (!installed) return `Status: ${COLORS.red}✗ OpenCode CLI not installed${COLORS.reset}`;
|
|
436
436
|
|
|
437
|
-
if (!
|
|
437
|
+
if (!hasBluerouter) {
|
|
438
438
|
return [
|
|
439
439
|
`Status: ${COLORS.red}✗ Not configured${COLORS.reset}`,
|
|
440
440
|
`${COLORS.dim}Run "Quick Setup" to configure${COLORS.reset}`
|
|
@@ -519,10 +519,10 @@ async function buildHermesHeader() {
|
|
|
519
519
|
const result = await api.getCliToolSettings("hermes");
|
|
520
520
|
if (!result.success) return ` ${COLORS.red}Failed to load settings${COLORS.reset}`;
|
|
521
521
|
|
|
522
|
-
const { installed,
|
|
522
|
+
const { installed, hasBluerouter, settings } = result.data;
|
|
523
523
|
if (!installed) return `Status: ${COLORS.red}✗ Hermes Agent not installed${COLORS.reset}`;
|
|
524
524
|
|
|
525
|
-
if (!
|
|
525
|
+
if (!hasBluerouter) {
|
|
526
526
|
return [
|
|
527
527
|
`Status: ${COLORS.red}✗ Not configured${COLORS.reset}`,
|
|
528
528
|
`${COLORS.dim}Run "Quick Setup" to configure${COLORS.reset}`
|
|
@@ -585,7 +585,7 @@ async function showCliToolsMenu(port, breadcrumb = []) {
|
|
|
585
585
|
await showMenuWithBack({
|
|
586
586
|
title: "🔧 CLI Tools",
|
|
587
587
|
breadcrumb,
|
|
588
|
-
headerContent: `Configure CLI tools to use
|
|
588
|
+
headerContent: `Configure CLI tools to use Bluerouter\nEndpoint: ${endpoint}`,
|
|
589
589
|
items: [
|
|
590
590
|
{
|
|
591
591
|
label: "Claude Code",
|
package/src/cli/terminalUI.js
CHANGED
|
@@ -67,14 +67,14 @@ async function startTerminalUI(port) {
|
|
|
67
67
|
// Configure API client
|
|
68
68
|
api.configure({ port });
|
|
69
69
|
|
|
70
|
-
const basePath = ["
|
|
70
|
+
const basePath = ["Bluerouter"];
|
|
71
71
|
|
|
72
72
|
// Prime header cache before first render
|
|
73
73
|
await refreshHeaderBg(port);
|
|
74
74
|
|
|
75
75
|
// Main menu
|
|
76
76
|
await showMenuWithBack({
|
|
77
|
-
title: "📡
|
|
77
|
+
title: "📡 Bluerouter Terminal UI",
|
|
78
78
|
breadcrumb: basePath,
|
|
79
79
|
headerContent: () => getHeader(port),
|
|
80
80
|
items: [
|
|
@@ -280,8 +280,8 @@ function enableLinux(cliPath) {
|
|
|
280
280
|
|
|
281
281
|
const desktopContent = `[Desktop Entry]
|
|
282
282
|
Type=Application
|
|
283
|
-
Name=
|
|
284
|
-
Comment=
|
|
283
|
+
Name=Bluerouter
|
|
284
|
+
Comment=Bluerouter API Proxy
|
|
285
285
|
Exec=${nodePath} ${routerScript} --tray --skip-update
|
|
286
286
|
Hidden=false
|
|
287
287
|
NoDisplay=false
|
package/src/cli/tray/tray.js
CHANGED
|
@@ -58,7 +58,7 @@ function initTray(options) {
|
|
|
58
58
|
*/
|
|
59
59
|
function buildMenuItems(port, autostartEnabled) {
|
|
60
60
|
return [
|
|
61
|
-
{ title: `
|
|
61
|
+
{ title: `Bluerouter (Port ${port})`, tooltip: "Server is running", enabled: false },
|
|
62
62
|
{ title: "Open Dashboard", tooltip: "Open in browser", enabled: true },
|
|
63
63
|
{
|
|
64
64
|
title: autostartEnabled ? "✓ Auto-start Enabled" : "Enable Auto-start",
|
|
@@ -121,7 +121,7 @@ function initWindowsTray(options) {
|
|
|
121
121
|
|
|
122
122
|
trayInstance = initWinTray({
|
|
123
123
|
iconPath,
|
|
124
|
-
tooltip: `
|
|
124
|
+
tooltip: `Bluerouter - Port ${port}`,
|
|
125
125
|
items,
|
|
126
126
|
onClick: (index) => {
|
|
127
127
|
handleClick(index, options, (newEnabled) => {
|
|
@@ -204,7 +204,7 @@ function initUnixTray(options) {
|
|
|
204
204
|
// because template mode only uses the alpha channel.
|
|
205
205
|
isTemplateIcon: false,
|
|
206
206
|
title: "",
|
|
207
|
-
tooltip: `
|
|
207
|
+
tooltip: `Bluerouter - Port ${port}`,
|
|
208
208
|
items
|
|
209
209
|
};
|
|
210
210
|
|
package/src/cli/tray/tray.ps1
CHANGED