zevairouter 1.0.62 → 1.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -8
- package/README.md +58 -10
- package/README.zh-CN.md +37 -0
- package/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +20 -20
- package/cli/app/.next-cli-build/build-manifest.json +2 -2
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/cancel/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/manual/[workerId]/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/latest/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/settings/database/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/settings/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/input/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/resize/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/stream/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback.html +1 -1
- package/cli/app/.next-cli-build/server/app/callback.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.html +1 -1
- package/cli/app/.next-cli-build/server/app/index.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing/page.js +1 -1
- package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/landing.html +1 -1
- package/cli/app/.next-cli-build/server/app/landing.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/login.html +1 -1
- package/cli/app/.next-cli-build/server/app/login.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app-paths-manifest.json +20 -20
- package/cli/app/.next-cli-build/server/chunks/3110.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/3407.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/5681.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/5949.js +8 -3
- package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/7276.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/8157.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/8371.js +1 -1
- package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/pages/404.html +1 -1
- package/cli/app/.next-cli-build/server/pages/500.html +1 -1
- package/cli/app/.next-cli-build/static/chunks/{3702-3049f543449956ae.js → 3702-a3e0eb456327db63.js} +1 -1
- package/cli/app/.next-cli-build/static/chunks/app/landing/page-6621ec8b157e77cc.js +1 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/hooks/camoufoxRuntime.js +227 -24
- package/cli/app/cli/hooks/cloakbrowserRuntime.js +0 -7
- package/cli/app/package.json +1 -1
- package/cli/app/src/lib/oauth/services/displayEnv.js +134 -0
- package/cli/hooks/camoufoxRuntime.js +227 -24
- package/cli/hooks/cloakbrowserRuntime.js +0 -7
- package/cli/package.json +1 -1
- package/i18n/README.ja-JP.md +19 -1191
- package/i18n/README.ru.md +19 -1293
- package/i18n/README.vi.md +19 -1292
- package/i18n/README.zh-CN.md +19 -1288
- package/open-sse/config/kiroConstants.js +1 -1
- package/package.json +1 -1
- package/src/app/landing/components/Features.js +2 -2
- package/src/app/landing/components/HeroSection.js +1 -1
- package/src/app/landing/components/HowItWorks.js +2 -2
- package/src/app/landing/page.js +3 -3
- package/src/lib/network/outboundProxy.js +37 -23
- package/src/lib/oauth/services/bulkImportBrowserEngine.js +219 -22
- package/src/lib/oauth/services/codebuddyCnBulkImportManager.js +161 -72
- package/src/lib/oauth/services/codebuddyCnPhoneAutomation.js +95 -41
- package/src/lib/oauth/services/kiroBulkImportManager.js +18 -13
- package/src/mitm/manager.js +1 -1
- package/src/shared/constants/providers.js +4 -4
- package/cli/app/.next-cli-build/static/chunks/app/landing/page-77b3f78b93a8d0c7.js +0 -1
- package/cli/app/src/lib/oauth/services/bulkImportBrowserEngine.js +0 -325
- /package/cli/app/.next-cli-build/static/{4qzgXNlTatuSwREqjg1Tx → UogfdHPvWmU8zuWF5IR-t}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{4qzgXNlTatuSwREqjg1Tx → UogfdHPvWmU8zuWF5IR-t}/_ssgManifest.js +0 -0
|
@@ -169,7 +169,7 @@ export function shouldExposeKiroReasoning(body) {
|
|
|
169
169
|
const envSource = typeof process !== "undefined" ? process.env : {};
|
|
170
170
|
const env = firstDefined(
|
|
171
171
|
envSource.KIRO_EXPOSE_REASONING,
|
|
172
|
-
envSource.
|
|
172
|
+
envSource.ZEVAI_EXPOSE_REASONING
|
|
173
173
|
);
|
|
174
174
|
const parsedEnv = parseBooleanLike(env);
|
|
175
175
|
return parsedEnv === true;
|
package/package.json
CHANGED
|
@@ -104,9 +104,9 @@ export default function Features() {
|
|
|
104
104
|
<section className="py-24 px-6" id="features">
|
|
105
105
|
<div className="max-w-7xl mx-auto">
|
|
106
106
|
<div className="mb-16">
|
|
107
|
-
<h2 className="text-3xl md:text-4xl font-bold mb-4">
|
|
107
|
+
<h2 className="text-3xl md:text-4xl font-bold mb-4">Features</h2>
|
|
108
108
|
<p className="text-gray-400 max-w-xl text-lg">
|
|
109
|
-
|
|
109
|
+
Routing, dashboard, and tooling for the accounts you connect.
|
|
110
110
|
</p>
|
|
111
111
|
</div>
|
|
112
112
|
|
|
@@ -21,7 +21,7 @@ export default function HeroSection() {
|
|
|
21
21
|
|
|
22
22
|
{/* Description */}
|
|
23
23
|
<p className="text-lg md:text-xl text-gray-400 max-w-2xl mx-auto font-light">
|
|
24
|
-
AI
|
|
24
|
+
Self-hosted AI router with a web dashboard. One OpenAI-compatible endpoint for Claude Code, Codex, Cline, Cursor, and similar tools.
|
|
25
25
|
</p>
|
|
26
26
|
|
|
27
27
|
{/* CTA Buttons */}
|
|
@@ -7,7 +7,7 @@ export default function HowItWorks() {
|
|
|
7
7
|
<div className="mb-16">
|
|
8
8
|
<h2 className="text-3xl md:text-4xl font-bold mb-4">How ZevaiRouter Works</h2>
|
|
9
9
|
<p className="text-gray-400 max-w-xl text-lg">
|
|
10
|
-
|
|
10
|
+
Tools call one local endpoint. ZevaiRouter routes to the accounts you connected and can fall back when one hits a limit.
|
|
11
11
|
</p>
|
|
12
12
|
</div>
|
|
13
13
|
|
|
@@ -36,7 +36,7 @@ export default function HowItWorks() {
|
|
|
36
36
|
<div>
|
|
37
37
|
<h3 className="text-xl font-bold mb-2 text-[#f97815]">2. ZevaiRouter Hub</h3>
|
|
38
38
|
<p className="text-sm text-gray-400">
|
|
39
|
-
|
|
39
|
+
Routes to your connected providers using combos, strategies, and quota-aware fallback.
|
|
40
40
|
</p>
|
|
41
41
|
</div>
|
|
42
42
|
</div>
|
package/src/app/landing/page.js
CHANGED
|
@@ -51,16 +51,16 @@ export default function LandingPage() {
|
|
|
51
51
|
<section className="py-32 px-6 relative overflow-hidden">
|
|
52
52
|
<div className="absolute inset-0 bg-linear-to-t from-[#f97815]/5 to-transparent pointer-events-none"></div>
|
|
53
53
|
<div className="max-w-4xl mx-auto text-center relative z-10">
|
|
54
|
-
<h2 className="text-4xl md:text-5xl font-black mb-6">
|
|
54
|
+
<h2 className="text-4xl md:text-5xl font-black mb-6">Open the dashboard</h2>
|
|
55
55
|
<p className="text-xl text-gray-400 mb-10 max-w-2xl mx-auto">
|
|
56
|
-
|
|
56
|
+
Self-hosted. Open source (MIT). Point your tools at <code className="text-sm text-gray-300">http://localhost:1997/v1</code>.
|
|
57
57
|
</p>
|
|
58
58
|
<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
|
|
59
59
|
<button
|
|
60
60
|
onClick={() => router.push("/dashboard")}
|
|
61
61
|
className="w-full sm:w-auto h-14 px-10 rounded-lg bg-[#f97815] hover:bg-[#e0650a] text-[#181411] text-lg font-bold transition-all shadow-[0_0_20px_rgba(249,120,21,0.5)]"
|
|
62
62
|
>
|
|
63
|
-
|
|
63
|
+
Open dashboard
|
|
64
64
|
</button>
|
|
65
65
|
<button
|
|
66
66
|
onClick={() => window.open("https://github.com/Verifiedlabs/zevairouter#readme", "_blank")}
|
|
@@ -3,24 +3,38 @@ function normalizeString(value) {
|
|
|
3
3
|
return String(value).trim();
|
|
4
4
|
}
|
|
5
5
|
|
|
6
|
+
/** Env markers for managed outbound proxy (ZevaiRouter). */
|
|
7
|
+
const MARK_MANAGED = "ZEVAI_PROXY_MANAGED";
|
|
8
|
+
const MARK_URL = "ZEVAI_PROXY_URL";
|
|
9
|
+
const MARK_NO_PROXY = "ZEVAI_NO_PROXY";
|
|
10
|
+
|
|
11
|
+
function isManaged(env) {
|
|
12
|
+
return env[MARK_MANAGED] === "1";
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function clearManagedMarkers(env) {
|
|
16
|
+
delete env[MARK_MANAGED];
|
|
17
|
+
delete env[MARK_URL];
|
|
18
|
+
delete env[MARK_NO_PROXY];
|
|
19
|
+
}
|
|
20
|
+
|
|
6
21
|
export function applyOutboundProxyEnv(
|
|
7
22
|
{ outboundProxyEnabled, outboundProxyUrl, outboundNoProxy } = {}
|
|
8
23
|
) {
|
|
9
24
|
if (typeof process === "undefined" || !process.env) return;
|
|
25
|
+
const env = process.env;
|
|
10
26
|
const enabled = Boolean(outboundProxyEnabled);
|
|
11
27
|
const proxyUrl = normalizeString(outboundProxyUrl);
|
|
12
28
|
const noProxy = normalizeString(outboundNoProxy);
|
|
13
29
|
|
|
14
30
|
// If disabled, only clear env vars we previously managed.
|
|
15
31
|
if (!enabled) {
|
|
16
|
-
if (
|
|
17
|
-
delete
|
|
18
|
-
delete
|
|
19
|
-
delete
|
|
20
|
-
delete
|
|
21
|
-
|
|
22
|
-
delete process.env.NINE_ROUTER_PROXY_URL;
|
|
23
|
-
delete process.env.NINE_ROUTER_NO_PROXY;
|
|
32
|
+
if (isManaged(env)) {
|
|
33
|
+
delete env.HTTP_PROXY;
|
|
34
|
+
delete env.HTTPS_PROXY;
|
|
35
|
+
delete env.ALL_PROXY;
|
|
36
|
+
delete env.NO_PROXY;
|
|
37
|
+
clearManagedMarkers(env);
|
|
24
38
|
}
|
|
25
39
|
return;
|
|
26
40
|
}
|
|
@@ -29,40 +43,40 @@ export function applyOutboundProxyEnv(
|
|
|
29
43
|
// - If values are provided, write them and mark as managed
|
|
30
44
|
// - If values are empty, do not touch externally-provided env,
|
|
31
45
|
// but do clear values we previously managed.
|
|
32
|
-
const wasManaged =
|
|
46
|
+
const wasManaged = isManaged(env);
|
|
33
47
|
let managed = false;
|
|
34
48
|
|
|
35
49
|
if (wasManaged) {
|
|
36
50
|
if (!proxyUrl) {
|
|
37
|
-
delete
|
|
38
|
-
delete
|
|
39
|
-
delete
|
|
40
|
-
delete
|
|
51
|
+
delete env.HTTP_PROXY;
|
|
52
|
+
delete env.HTTPS_PROXY;
|
|
53
|
+
delete env.ALL_PROXY;
|
|
54
|
+
delete env[MARK_URL];
|
|
41
55
|
}
|
|
42
56
|
if (!noProxy) {
|
|
43
|
-
delete
|
|
44
|
-
delete
|
|
57
|
+
delete env.NO_PROXY;
|
|
58
|
+
delete env[MARK_NO_PROXY];
|
|
45
59
|
}
|
|
46
60
|
}
|
|
47
61
|
|
|
48
62
|
if (proxyUrl) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
63
|
+
env.HTTP_PROXY = proxyUrl;
|
|
64
|
+
env.HTTPS_PROXY = proxyUrl;
|
|
65
|
+
env.ALL_PROXY = proxyUrl;
|
|
66
|
+
env[MARK_URL] = proxyUrl;
|
|
53
67
|
managed = true;
|
|
54
68
|
}
|
|
55
69
|
|
|
56
70
|
if (noProxy) {
|
|
57
|
-
|
|
58
|
-
|
|
71
|
+
env.NO_PROXY = noProxy;
|
|
72
|
+
env[MARK_NO_PROXY] = noProxy;
|
|
59
73
|
managed = true;
|
|
60
74
|
}
|
|
61
75
|
|
|
62
76
|
if (managed) {
|
|
63
|
-
|
|
77
|
+
env[MARK_MANAGED] = "1";
|
|
64
78
|
} else if (wasManaged) {
|
|
65
79
|
// If we previously managed env but now cleared everything, drop the marker.
|
|
66
|
-
|
|
80
|
+
clearManagedMarkers(env);
|
|
67
81
|
}
|
|
68
82
|
}
|
|
@@ -91,7 +91,27 @@ function wrapBrowserWithStealth(browser) {
|
|
|
91
91
|
return browser;
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
+
/**
|
|
95
|
+
* Headed engines (Camoufox / Chromium / CloakBrowser) need a display on Linux VPS.
|
|
96
|
+
* Auto-start Xvfb via displayEnv when available.
|
|
97
|
+
*/
|
|
98
|
+
async function ensureHeadedDisplayOrThrow() {
|
|
99
|
+
const { ensureDisplayForHeadedBrowser } = await import("./displayEnv.js");
|
|
100
|
+
const display = ensureDisplayForHeadedBrowser();
|
|
101
|
+
if (!display.ok) {
|
|
102
|
+
const err = display.error || new Error("No display for headed browser");
|
|
103
|
+
err.code = err.code || "NO_DISPLAY";
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
return display;
|
|
107
|
+
}
|
|
108
|
+
|
|
94
109
|
async function launchChromium({ proxyUrl, headless = true, windowSize = null } = {}) {
|
|
110
|
+
const wantHeadless = headless !== false;
|
|
111
|
+
if (!wantHeadless) {
|
|
112
|
+
await ensureHeadedDisplayOrThrow();
|
|
113
|
+
}
|
|
114
|
+
|
|
95
115
|
let chromium = null;
|
|
96
116
|
let importErr = null;
|
|
97
117
|
try {
|
|
@@ -130,10 +150,10 @@ async function launchChromium({ proxyUrl, headless = true, windowSize = null } =
|
|
|
130
150
|
throw friendly;
|
|
131
151
|
}
|
|
132
152
|
|
|
133
|
-
const width = windowSize?.width || (
|
|
134
|
-
const height = windowSize?.height || (
|
|
153
|
+
const width = windowSize?.width || (wantHeadless ? 1920 : 900);
|
|
154
|
+
const height = windowSize?.height || (wantHeadless ? 1080 : 700);
|
|
135
155
|
const options = {
|
|
136
|
-
headless:
|
|
156
|
+
headless: wantHeadless,
|
|
137
157
|
args: [
|
|
138
158
|
"--disable-blink-features=AutomationControlled",
|
|
139
159
|
"--disable-features=IsolateOrigins,site-per-process,AutomationControlled",
|
|
@@ -149,7 +169,7 @@ async function launchChromium({ proxyUrl, headless = true, windowSize = null } =
|
|
|
149
169
|
"--password-store=basic",
|
|
150
170
|
"--use-mock-keychain",
|
|
151
171
|
`--window-size=${width},${height}`,
|
|
152
|
-
...(
|
|
172
|
+
...(wantHeadless ? [] : ["--window-position=80,80"]),
|
|
153
173
|
],
|
|
154
174
|
ignoreDefaultArgs: ["--enable-automation"],
|
|
155
175
|
};
|
|
@@ -158,15 +178,31 @@ async function launchChromium({ proxyUrl, headless = true, windowSize = null } =
|
|
|
158
178
|
options.proxy = parsePlaywrightProxy(proxyUrl) || { server: proxyUrl };
|
|
159
179
|
}
|
|
160
180
|
|
|
161
|
-
|
|
162
|
-
|
|
181
|
+
try {
|
|
182
|
+
const browser = await chromium.launch(options);
|
|
183
|
+
return wrapBrowserWithStealth(browser);
|
|
184
|
+
} catch (error) {
|
|
185
|
+
const msg = String(error?.message || error || "");
|
|
186
|
+
if (!wantHeadless && /XServer|DISPLAY|Missing X server|headed browser|no DISPLAY/i.test(msg)) {
|
|
187
|
+
await ensureHeadedDisplayOrThrow();
|
|
188
|
+
const browser = await chromium.launch(options);
|
|
189
|
+
return wrapBrowserWithStealth(browser);
|
|
190
|
+
}
|
|
191
|
+
throw error;
|
|
192
|
+
}
|
|
163
193
|
}
|
|
164
194
|
|
|
165
195
|
async function launchCamoufox({ proxyUrl, headless = true, windowSize = null } = {}) {
|
|
196
|
+
// CodeBuddy CN bulk defaults to headed Camoufox — needs Xvfb on Linux VPS.
|
|
197
|
+
const useHeadless = headless !== false;
|
|
198
|
+
if (!useHeadless) {
|
|
199
|
+
await ensureHeadedDisplayOrThrow();
|
|
200
|
+
}
|
|
201
|
+
|
|
166
202
|
const runtime = loadRuntimeHelper("camoufoxRuntime");
|
|
167
203
|
if (!runtime?.ensureCamoufoxRuntime) {
|
|
168
204
|
const err = new Error(
|
|
169
|
-
`Camoufox runtime helper missing. Reinstall
|
|
205
|
+
`Camoufox runtime helper missing. Reinstall zevairouter or pick the Chromium engine.`
|
|
170
206
|
);
|
|
171
207
|
err.code = "CAMOUFOX_RUNTIME_HELPER_MISSING";
|
|
172
208
|
throw err;
|
|
@@ -205,23 +241,131 @@ async function launchCamoufox({ proxyUrl, headless = true, windowSize = null } =
|
|
|
205
241
|
// Context-only proxy is flaky (blank pages / half-sessions / 401 on console APIs).
|
|
206
242
|
const { parsePlaywrightProxy } = await import("./proxyUtils.js");
|
|
207
243
|
const parsedProxy = proxyUrl ? (parsePlaywrightProxy(proxyUrl) || { server: proxyUrl }) : null;
|
|
208
|
-
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
244
|
+
|
|
245
|
+
const buildLaunchOptions = async () => {
|
|
246
|
+
const camoufoxOptions = await camoufox.launchOptions({
|
|
247
|
+
headless: useHeadless,
|
|
248
|
+
...(parsedProxy ? { proxy: parsedProxy, geoip: true } : {}),
|
|
249
|
+
});
|
|
250
|
+
// camoufox-js can emit fingerprint keys (e.g. audio:seed) that older Camoufox
|
|
251
|
+
// binaries reject → "Unknown property audio:seed in config". Always sanitize
|
|
252
|
+
// so Mac/Ubuntu users with a stale ~/.cache (or Library/Caches) still launch.
|
|
253
|
+
let opts = sanitizeCamoufoxLaunchOptions({
|
|
254
|
+
...camoufoxOptions,
|
|
255
|
+
headless: useHeadless,
|
|
256
|
+
});
|
|
257
|
+
if (parsedProxy) opts.proxy = parsedProxy;
|
|
258
|
+
if (!useHeadless) {
|
|
259
|
+
const width = windowSize?.width || 900;
|
|
260
|
+
const height = windowSize?.height || 700;
|
|
261
|
+
opts.args = [...(opts.args || []), `--width=${width}`, `--height=${height}`];
|
|
262
|
+
}
|
|
263
|
+
return opts;
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
let launchOptions = await buildLaunchOptions();
|
|
267
|
+
|
|
268
|
+
const launchOnce = async (opts) => firefox.launch(opts);
|
|
269
|
+
|
|
270
|
+
try {
|
|
271
|
+
return await launchOnce(launchOptions);
|
|
272
|
+
} catch (error) {
|
|
273
|
+
const msg = String(error?.message || error || "");
|
|
274
|
+
|
|
275
|
+
// 1) Strip the exact unknown property the binary reported, retry.
|
|
276
|
+
const unknownProp = msg.match(/Unknown property\s+([^\s]+)\s+in config/i);
|
|
277
|
+
if (unknownProp?.[1]) {
|
|
278
|
+
try {
|
|
279
|
+
launchOptions = sanitizeCamoufoxLaunchOptions(launchOptions, {
|
|
280
|
+
extraDropKeys: [unknownProp[1]],
|
|
281
|
+
});
|
|
282
|
+
return await launchOnce(launchOptions);
|
|
283
|
+
} catch {
|
|
284
|
+
// continue to binary refresh
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// 2) Config/fingerprint mismatch often means binary is older than camoufox-js.
|
|
289
|
+
// Force-fetch the matching browser (Mac + Linux + Windows) and retry once.
|
|
290
|
+
if (/Unknown property|not described in this scheme|CAMOU_CONFIG|fingerprint/i.test(msg)) {
|
|
291
|
+
try {
|
|
292
|
+
if (typeof runtime.refreshCamoufoxBinary === "function") {
|
|
293
|
+
runtime.refreshCamoufoxBinary({ silent: false });
|
|
294
|
+
} else if (typeof runtime.ensureCamoufoxRuntime === "function") {
|
|
295
|
+
runtime.ensureCamoufoxRuntime({ silent: false, forceBinaryRefresh: true });
|
|
296
|
+
}
|
|
297
|
+
launchOptions = await buildLaunchOptions();
|
|
298
|
+
return await launchOnce(launchOptions);
|
|
299
|
+
} catch {
|
|
300
|
+
// fall through
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
if (!useHeadless && /XServer|DISPLAY|Missing X server|headed browser|no DISPLAY/i.test(msg)) {
|
|
305
|
+
await ensureHeadedDisplayOrThrow();
|
|
306
|
+
return launchOnce(launchOptions);
|
|
307
|
+
}
|
|
308
|
+
if (!useHeadless) {
|
|
309
|
+
const friendly = new Error(
|
|
310
|
+
`${msg}\n\nVPS has no display for headed Camoufox (CodeBuddy CN). Install then restart:\n` +
|
|
311
|
+
` sudo apt-get update && sudo apt-get install -y xvfb\n` +
|
|
312
|
+
` sudo systemctl restart zevairouter\n` +
|
|
313
|
+
`ZevaiRouter auto-starts Xvfb when installed.`
|
|
314
|
+
);
|
|
315
|
+
friendly.code = "NO_DISPLAY";
|
|
316
|
+
friendly.cause = error;
|
|
317
|
+
throw friendly;
|
|
318
|
+
}
|
|
319
|
+
throw error;
|
|
222
320
|
}
|
|
321
|
+
}
|
|
223
322
|
|
|
224
|
-
|
|
323
|
+
/**
|
|
324
|
+
* Remove fingerprint keys older Camoufox binaries do not understand.
|
|
325
|
+
* Keys are dropped from CAMOU_CONFIG* env JSON blobs produced by camoufox-js.
|
|
326
|
+
*
|
|
327
|
+
* Keep this conservative: drop known-bad families (audio:*) plus any keys the
|
|
328
|
+
* binary explicitly complained about. Do NOT strip the whole config.
|
|
329
|
+
*/
|
|
330
|
+
function sanitizeCamoufoxLaunchOptions(options = {}, { extraDropKeys = [] } = {}) {
|
|
331
|
+
const dropKeys = new Set([
|
|
332
|
+
"audio:seed",
|
|
333
|
+
"audio.seed",
|
|
334
|
+
"Audio:seed",
|
|
335
|
+
...extraDropKeys.filter(Boolean),
|
|
336
|
+
]);
|
|
337
|
+
if (!options?.env || typeof options.env !== "object") {
|
|
338
|
+
return options;
|
|
339
|
+
}
|
|
340
|
+
const env = { ...options.env };
|
|
341
|
+
for (const [key, value] of Object.entries(env)) {
|
|
342
|
+
if (typeof value !== "string") continue;
|
|
343
|
+
// CAMOU_CONFIG may be split across CAMOU_CONFIG_1, _2, ...
|
|
344
|
+
if (!/^CAMOU_CONFIG/i.test(key) && !/camou.*config/i.test(key)) continue;
|
|
345
|
+
const trimmed = value.trim();
|
|
346
|
+
if (!trimmed.startsWith("{")) continue;
|
|
347
|
+
try {
|
|
348
|
+
const parsed = JSON.parse(trimmed);
|
|
349
|
+
let changed = false;
|
|
350
|
+
for (const drop of dropKeys) {
|
|
351
|
+
if (Object.prototype.hasOwnProperty.call(parsed, drop)) {
|
|
352
|
+
delete parsed[drop];
|
|
353
|
+
changed = true;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Older binaries (pre-152) reject the whole audio:* family.
|
|
357
|
+
for (const k of Object.keys(parsed)) {
|
|
358
|
+
if (/^audio[:.]/i.test(k) || dropKeys.has(k)) {
|
|
359
|
+
delete parsed[k];
|
|
360
|
+
changed = true;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (changed) env[key] = JSON.stringify(parsed);
|
|
364
|
+
} catch {
|
|
365
|
+
// leave non-JSON env alone
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return { ...options, env };
|
|
225
369
|
}
|
|
226
370
|
|
|
227
371
|
/**
|
|
@@ -320,6 +464,59 @@ export async function launchBulkImportBrowser({
|
|
|
320
464
|
return launchChromium({ proxyUrl, headless, windowSize });
|
|
321
465
|
}
|
|
322
466
|
|
|
467
|
+
/**
|
|
468
|
+
* Force-close a Playwright/Camoufox browser. Graceful close can hang forever when
|
|
469
|
+
* the browser is stuck on a blackholed proxy / spinning renderer — on a 2GB VPS
|
|
470
|
+
* that pins CPU until reboot. Always race close() with a kill of the process tree.
|
|
471
|
+
*/
|
|
472
|
+
export async function forceCloseBrowser(browser, { timeoutMs = 4_000 } = {}) {
|
|
473
|
+
if (!browser) return;
|
|
474
|
+
|
|
475
|
+
let pid = null;
|
|
476
|
+
try {
|
|
477
|
+
const proc = typeof browser.process === "function" ? browser.process() : null;
|
|
478
|
+
pid = proc?.pid || null;
|
|
479
|
+
} catch {
|
|
480
|
+
pid = null;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
try {
|
|
484
|
+
await Promise.race([
|
|
485
|
+
Promise.resolve()
|
|
486
|
+
.then(() => browser.close())
|
|
487
|
+
.catch(() => null),
|
|
488
|
+
new Promise((resolve) => setTimeout(resolve, timeoutMs)),
|
|
489
|
+
]);
|
|
490
|
+
} catch {
|
|
491
|
+
// ignore
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
if (pid && Number.isFinite(pid) && pid > 1) {
|
|
495
|
+
// Still alive? SIGTERM then SIGKILL. Also try process-group kill (negative pid)
|
|
496
|
+
// so Camoufox helper children die with the parent.
|
|
497
|
+
for (const signal of ["SIGTERM", "SIGKILL"]) {
|
|
498
|
+
try {
|
|
499
|
+
process.kill(pid, 0); // throws ESRCH if gone
|
|
500
|
+
} catch {
|
|
501
|
+
break;
|
|
502
|
+
}
|
|
503
|
+
try {
|
|
504
|
+
process.kill(pid, signal);
|
|
505
|
+
} catch {
|
|
506
|
+
// ignore
|
|
507
|
+
}
|
|
508
|
+
try {
|
|
509
|
+
process.kill(-pid, signal);
|
|
510
|
+
} catch {
|
|
511
|
+
// ignore (no process group / permission)
|
|
512
|
+
}
|
|
513
|
+
if (signal === "SIGTERM") {
|
|
514
|
+
await new Promise((r) => setTimeout(r, 400));
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
323
520
|
export function makeBrowserLauncher({ engine, proxyUrl, headless = true, windowSize = null } = {}) {
|
|
324
521
|
return () => launchBulkImportBrowser({ engine, proxyUrl, headless, windowSize });
|
|
325
522
|
}
|