zevairouter 1.0.61 → 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 +36 -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 +25 -25
- 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 +25 -25
- 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-18f5f207de6e9eeb.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/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 +81 -31
- package/cli/app/cli/hooks/postinstall.js +3 -3
- 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 +81 -31
- package/cli/hooks/postinstall.js +3 -3
- 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 +220 -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 -324
- /package/cli/app/.next-cli-build/static/{Fip2gTBHjVyX1dEyiiJZM → UogfdHPvWmU8zuWF5IR-t}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{Fip2gTBHjVyX1dEyiiJZM → UogfdHPvWmU8zuWF5IR-t}/_ssgManifest.js +0 -0
|
@@ -148,12 +148,12 @@ try {
|
|
|
148
148
|
warn(`Camoufox skipped: ${e.message}`);
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
-
// 5) CloakBrowser (Grok Turnstile /
|
|
151
|
+
// 5) CloakBrowser + mmdb-lib (Grok Turnstile / proxy geoip)
|
|
152
152
|
try {
|
|
153
|
-
log("… CloakBrowser (Grok bulk /
|
|
153
|
+
log("… CloakBrowser + mmdb-lib (Grok bulk / geoip)");
|
|
154
154
|
const cloak = warmCloakbrowser();
|
|
155
155
|
if (cloak.ok) {
|
|
156
|
-
log("✓ CloakBrowser ready");
|
|
156
|
+
log("✓ CloakBrowser + mmdb-lib ready");
|
|
157
157
|
} else {
|
|
158
158
|
warn(`CloakBrowser skipped: ${cloak.error?.message || "unknown"} — install on first Grok bulk if needed`);
|
|
159
159
|
}
|
package/cli/app/package.json
CHANGED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headed browsers need a display. On bare Linux VPS there is no $DISPLAY.
|
|
3
|
+
* We try to start Xvfb automatically so CloakBrowser / Turnstile can run.
|
|
4
|
+
*/
|
|
5
|
+
import { spawn, execFileSync } from "node:child_process";
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
|
|
9
|
+
const g = globalThis.__zevaiXvfb ??= {
|
|
10
|
+
proc: null,
|
|
11
|
+
display: null,
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
function which(bin) {
|
|
15
|
+
try {
|
|
16
|
+
return execFileSync("which", [bin], { encoding: "utf8" }).trim() || null;
|
|
17
|
+
} catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function hasUsableDisplay() {
|
|
23
|
+
// Desktop OS: headed Chromium/Playwright works without $DISPLAY
|
|
24
|
+
// (macOS GUI session / Windows). Only bare Linux servers need Xvfb.
|
|
25
|
+
if (process.platform === "darwin" || process.platform === "win32") {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const d = process.env.DISPLAY;
|
|
30
|
+
if (!d || !String(d).trim()) return false;
|
|
31
|
+
|
|
32
|
+
// On Linux, verify something is listening if xdpyinfo exists
|
|
33
|
+
if (which("xdpyinfo")) {
|
|
34
|
+
try {
|
|
35
|
+
execFileSync("xdpyinfo", ["-display", d], {
|
|
36
|
+
stdio: "ignore",
|
|
37
|
+
timeout: 2000,
|
|
38
|
+
});
|
|
39
|
+
return true;
|
|
40
|
+
} catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function findFreeDisplayNumber() {
|
|
48
|
+
for (let n = 99; n <= 119; n += 1) {
|
|
49
|
+
const lock = path.join("/tmp", `.X${n}-lock`);
|
|
50
|
+
if (!fs.existsSync(lock)) return n;
|
|
51
|
+
}
|
|
52
|
+
return 99;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Ensure process.env.DISPLAY is set for headed launches.
|
|
57
|
+
* @returns {{ ok: boolean, display?: string, managed?: boolean, error?: Error }}
|
|
58
|
+
*/
|
|
59
|
+
export function ensureDisplayForHeadedBrowser() {
|
|
60
|
+
if (hasUsableDisplay()) {
|
|
61
|
+
return {
|
|
62
|
+
ok: true,
|
|
63
|
+
display: process.env.DISPLAY || (process.platform === "darwin" ? "aqua" : ""),
|
|
64
|
+
managed: false,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Only Linux VPS needs a virtual framebuffer
|
|
69
|
+
if (process.platform !== "linux") {
|
|
70
|
+
// Should not reach here (hasUsableDisplay is true on darwin/win32)
|
|
71
|
+
return { ok: true, display: process.env.DISPLAY || "", managed: false };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (g.display && g.proc && !g.proc.killed) {
|
|
75
|
+
process.env.DISPLAY = g.display;
|
|
76
|
+
return { ok: true, display: g.display, managed: true };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const xvfb = which("Xvfb");
|
|
80
|
+
if (!xvfb) {
|
|
81
|
+
const err = new Error(
|
|
82
|
+
"This VPS has no graphical display ($DISPLAY). Grok/CloakBrowser needs a virtual screen.\n" +
|
|
83
|
+
"Fix (Ubuntu/Debian as root):\n" +
|
|
84
|
+
" apt-get update && apt-get install -y xvfb\n" +
|
|
85
|
+
"Then restart zevai / zevairouter and retry bulk import.\n" +
|
|
86
|
+
"ZevaiRouter will auto-start Xvfb when it is installed."
|
|
87
|
+
);
|
|
88
|
+
err.code = "XVFB_MISSING";
|
|
89
|
+
return { ok: false, error: err };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const num = findFreeDisplayNumber();
|
|
93
|
+
const display = `:${num}`;
|
|
94
|
+
try {
|
|
95
|
+
const proc = spawn(
|
|
96
|
+
xvfb,
|
|
97
|
+
[display, "-screen", "0", "1280x900x24", "-ac", "-nolisten", "tcp"],
|
|
98
|
+
{
|
|
99
|
+
stdio: "ignore",
|
|
100
|
+
detached: true,
|
|
101
|
+
}
|
|
102
|
+
);
|
|
103
|
+
proc.unref();
|
|
104
|
+
g.proc = proc;
|
|
105
|
+
g.display = display;
|
|
106
|
+
process.env.DISPLAY = display;
|
|
107
|
+
|
|
108
|
+
// Brief settle so clients don't connect before X is up
|
|
109
|
+
const start = Date.now();
|
|
110
|
+
while (Date.now() - start < 800) {
|
|
111
|
+
/* spin */
|
|
112
|
+
}
|
|
113
|
+
if (which("xdpyinfo")) {
|
|
114
|
+
try {
|
|
115
|
+
execFileSync("xdpyinfo", ["-display", display], {
|
|
116
|
+
stdio: "ignore",
|
|
117
|
+
timeout: 2000,
|
|
118
|
+
});
|
|
119
|
+
} catch {
|
|
120
|
+
// still proceed — some images lack xdpyinfo
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
console.log(`[display] Started Xvfb on ${display} for headed browser automation`);
|
|
125
|
+
return { ok: true, display, managed: true };
|
|
126
|
+
} catch (error) {
|
|
127
|
+
const err = new Error(
|
|
128
|
+
`Failed to start Xvfb: ${error?.message || error}. Install with: apt-get install -y xvfb`
|
|
129
|
+
);
|
|
130
|
+
err.code = "XVFB_START_FAILED";
|
|
131
|
+
err.cause = error;
|
|
132
|
+
return { ok: false, error: err };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
// Ensure camoufox-js (optional stealth Firefox engine) is installed AND its
|
|
2
|
-
// browser binary is downloaded
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
2
|
+
// browser binary is downloaded + kept in sync with the JS package.
|
|
3
|
+
//
|
|
4
|
+
// Failure mode we fix for end users (Mac + Ubuntu/Linux + Windows):
|
|
5
|
+
// camoufox-js emits fingerprint keys (e.g. audio:seed) that an *old* cached
|
|
6
|
+
// Camoufox binary rejects → "Unknown property audio:seed in config".
|
|
7
|
+
//
|
|
8
|
+
// Strategy:
|
|
9
|
+
// 1) Install camoufox-js into ~/.zevai/runtime when missing
|
|
10
|
+
// 2) On every process first-use: if binary missing OR package version changed
|
|
11
|
+
// OR no zevai stamp, run `camoufox-js fetch` (no-op when already current)
|
|
12
|
+
// 3) Export force-refresh so launch can recover after Unknown-property errors
|
|
13
|
+
// 4) Linux: best-effort install of GUI libs via playwright install-deps
|
|
7
14
|
const { spawnSync } = require("child_process");
|
|
8
15
|
const { createRequire } = require("module");
|
|
9
16
|
const fs = require("fs");
|
|
@@ -14,6 +21,9 @@ const { runNpmInstall, getRuntimeDir, getRuntimeNodeModules } = require("./sqlit
|
|
|
14
21
|
|
|
15
22
|
const CAMOUFOX_PACKAGE = "camoufox-js";
|
|
16
23
|
const CAMOUFOX_VERSION = "^0.11.0";
|
|
24
|
+
// Bump when we need every install to re-check binary even if package version
|
|
25
|
+
// string is unchanged (e.g. known bad binary fingerprints).
|
|
26
|
+
const BINARY_POLICY = "v2-audio-seed";
|
|
17
27
|
|
|
18
28
|
// This helper is reached through webpack-bundled server code, which rewrites
|
|
19
29
|
// bare `require(...)` into its own module registry — so `require("camoufox-js")`
|
|
@@ -37,6 +47,7 @@ function getRuntimeRequire() {
|
|
|
37
47
|
}
|
|
38
48
|
|
|
39
49
|
let cachedReady = null;
|
|
50
|
+
let binaryCheckedThisProcess = false;
|
|
40
51
|
|
|
41
52
|
function tryRequireCamoufox() {
|
|
42
53
|
// 1) Direct absolute-path resolution via a runtime-anchored createRequire —
|
|
@@ -62,6 +73,34 @@ function tryRequireCamoufox() {
|
|
|
62
73
|
return null;
|
|
63
74
|
}
|
|
64
75
|
|
|
76
|
+
function findCamoufoxPackageDir() {
|
|
77
|
+
try {
|
|
78
|
+
const rreq = getRuntimeRequire();
|
|
79
|
+
const candidate = path.join(getRuntimeNodeModules(), CAMOUFOX_PACKAGE);
|
|
80
|
+
if (fs.existsSync(path.join(candidate, "package.json"))) return candidate;
|
|
81
|
+
if (rreq) {
|
|
82
|
+
try {
|
|
83
|
+
return path.dirname(rreq.resolve(`${CAMOUFOX_PACKAGE}/package.json`));
|
|
84
|
+
} catch {}
|
|
85
|
+
}
|
|
86
|
+
} catch {}
|
|
87
|
+
try {
|
|
88
|
+
return path.dirname(nodeRequire.resolve(`${CAMOUFOX_PACKAGE}/package.json`));
|
|
89
|
+
} catch {}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function getCamoufoxJsPackageVersion() {
|
|
94
|
+
try {
|
|
95
|
+
const dir = findCamoufoxPackageDir();
|
|
96
|
+
if (!dir) return null;
|
|
97
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(dir, "package.json"), "utf8"));
|
|
98
|
+
return String(pkg.version || "").trim() || null;
|
|
99
|
+
} catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
65
104
|
function findCamoufoxCli() {
|
|
66
105
|
const candidates = [];
|
|
67
106
|
// camoufox-js ships its CLI entry as dist/__main__.js (there is no cli.js).
|
|
@@ -73,6 +112,8 @@ function findCamoufoxCli() {
|
|
|
73
112
|
try {
|
|
74
113
|
candidates.push(path.join(getRuntimeNodeModules(), CAMOUFOX_PACKAGE, ...rel));
|
|
75
114
|
} catch {}
|
|
115
|
+
const pkgDir = findCamoufoxPackageDir();
|
|
116
|
+
if (pkgDir) candidates.push(path.join(pkgDir, ...rel));
|
|
76
117
|
for (const candidate of candidates) {
|
|
77
118
|
if (candidate && fs.existsSync(candidate)) return candidate;
|
|
78
119
|
}
|
|
@@ -92,6 +133,10 @@ function getCamoufoxBinaryDir() {
|
|
|
92
133
|
return path.join(homeDir, ".cache", "camoufox");
|
|
93
134
|
}
|
|
94
135
|
|
|
136
|
+
function getStampPath() {
|
|
137
|
+
return path.join(getCamoufoxBinaryDir(), ".zevai-binary-stamp.json");
|
|
138
|
+
}
|
|
139
|
+
|
|
95
140
|
// The launch binary camoufox-js resolves per OS (dist/pkgman.js LAUNCH_FILE),
|
|
96
141
|
// relative to the install dir. Linux is the primary target (Ubuntu VPS).
|
|
97
142
|
function getCamoufoxLaunchBinary() {
|
|
@@ -109,6 +154,70 @@ function isCamoufoxBinaryAvailable() {
|
|
|
109
154
|
}
|
|
110
155
|
}
|
|
111
156
|
|
|
157
|
+
function getInstalledBinaryVersion() {
|
|
158
|
+
try {
|
|
159
|
+
const versionPath = path.join(getCamoufoxBinaryDir(), "version.json");
|
|
160
|
+
if (!fs.existsSync(versionPath)) return null;
|
|
161
|
+
const data = JSON.parse(fs.readFileSync(versionPath, "utf8"));
|
|
162
|
+
if (!data?.version) return null;
|
|
163
|
+
return `${data.version}${data.release ? `-${data.release}` : ""}`;
|
|
164
|
+
} catch {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function readBinaryStamp() {
|
|
170
|
+
try {
|
|
171
|
+
const p = getStampPath();
|
|
172
|
+
if (!fs.existsSync(p)) return null;
|
|
173
|
+
return JSON.parse(fs.readFileSync(p, "utf8"));
|
|
174
|
+
} catch {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function writeBinaryStamp({ packageVersion, binaryVersion } = {}) {
|
|
180
|
+
try {
|
|
181
|
+
const dir = getCamoufoxBinaryDir();
|
|
182
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
183
|
+
const stamp = {
|
|
184
|
+
policy: BINARY_POLICY,
|
|
185
|
+
packageVersion: packageVersion || getCamoufoxJsPackageVersion(),
|
|
186
|
+
binaryVersion: binaryVersion || getInstalledBinaryVersion(),
|
|
187
|
+
platform: process.platform,
|
|
188
|
+
arch: process.arch,
|
|
189
|
+
fetchedAt: new Date().toISOString(),
|
|
190
|
+
};
|
|
191
|
+
fs.writeFileSync(getStampPath(), JSON.stringify(stamp, null, 2));
|
|
192
|
+
return stamp;
|
|
193
|
+
} catch {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Decide whether we should run `camoufox-js fetch`.
|
|
200
|
+
* - Missing binary → yes
|
|
201
|
+
* - No stamp (legacy installs, Mac beta.24 era) → yes (fetch is no-op if current)
|
|
202
|
+
* - Package version or policy changed → yes
|
|
203
|
+
* - force → yes
|
|
204
|
+
*/
|
|
205
|
+
function shouldFetchCamoufoxBinary({ force = false } = {}) {
|
|
206
|
+
if (force) return true;
|
|
207
|
+
if (process.env.ZEVAI_CAMOUFOX_SKIP_FETCH === "1") return false;
|
|
208
|
+
if (!isCamoufoxBinaryAvailable()) return true;
|
|
209
|
+
if (!getInstalledBinaryVersion()) return true;
|
|
210
|
+
|
|
211
|
+
const stamp = readBinaryStamp();
|
|
212
|
+
if (!stamp) return true;
|
|
213
|
+
|
|
214
|
+
const pkgVer = getCamoufoxJsPackageVersion();
|
|
215
|
+
if (pkgVer && stamp.packageVersion && stamp.packageVersion !== pkgVer) return true;
|
|
216
|
+
if (stamp.policy !== BINARY_POLICY) return true;
|
|
217
|
+
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
|
|
112
221
|
function ensureCamoufoxPackage({ silent = false } = {}) {
|
|
113
222
|
const mod = tryRequireCamoufox();
|
|
114
223
|
if (mod) return { ok: true, module: mod };
|
|
@@ -140,15 +249,30 @@ function fetchCamoufoxBinary({ silent = false, timeout = 600_000 } = {}) {
|
|
|
140
249
|
if (!cliPath) {
|
|
141
250
|
return { ok: false, reason: "camoufox-js cli script not found after install" };
|
|
142
251
|
}
|
|
143
|
-
if (!silent)
|
|
252
|
+
if (!silent) {
|
|
253
|
+
console.log(
|
|
254
|
+
isCamoufoxBinaryAvailable()
|
|
255
|
+
? "\u23f3 Checking/updating Camoufox browser binary (keeps fingerprint config compatible)..."
|
|
256
|
+
: "\u23f3 Downloading Camoufox browser binary (first run, ~150–300MB)..."
|
|
257
|
+
);
|
|
258
|
+
}
|
|
144
259
|
const res = spawnSync(process.execPath, [cliPath, "fetch"], {
|
|
145
260
|
stdio: silent ? ["ignore", "pipe", "pipe"] : "inherit",
|
|
146
261
|
timeout,
|
|
147
262
|
encoding: "utf8",
|
|
263
|
+
env: {
|
|
264
|
+
...process.env,
|
|
265
|
+
// Never skip: users hit audio:seed / unknown property when binary lags.
|
|
266
|
+
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: undefined,
|
|
267
|
+
},
|
|
148
268
|
});
|
|
149
269
|
if (res.status === 0) {
|
|
270
|
+
writeBinaryStamp({
|
|
271
|
+
packageVersion: getCamoufoxJsPackageVersion(),
|
|
272
|
+
binaryVersion: getInstalledBinaryVersion(),
|
|
273
|
+
});
|
|
150
274
|
if (!silent) console.log("\u2705 Camoufox browser ready");
|
|
151
|
-
return { ok: true };
|
|
275
|
+
return { ok: true, binaryVersion: getInstalledBinaryVersion() };
|
|
152
276
|
}
|
|
153
277
|
const stderr = String(res.stderr || "");
|
|
154
278
|
let reason = "unknown error";
|
|
@@ -159,6 +283,66 @@ function fetchCamoufoxBinary({ silent = false, timeout = 600_000 } = {}) {
|
|
|
159
283
|
return { ok: false, reason };
|
|
160
284
|
}
|
|
161
285
|
|
|
286
|
+
/**
|
|
287
|
+
* Ensure binary exists and matches current camoufox-js expectations.
|
|
288
|
+
* Safe to call often: after the first successful check this process, subsequent
|
|
289
|
+
* calls are free unless force=true.
|
|
290
|
+
*/
|
|
291
|
+
function ensureCamoufoxBinary({ silent = false, force = false } = {}) {
|
|
292
|
+
if (!force && binaryCheckedThisProcess && isCamoufoxBinaryAvailable()) {
|
|
293
|
+
return { ok: true, skipped: "already-checked", binaryVersion: getInstalledBinaryVersion() };
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (!shouldFetchCamoufoxBinary({ force })) {
|
|
297
|
+
// Stamp already valid — still write stamp if somehow missing binary version field
|
|
298
|
+
if (!readBinaryStamp()) {
|
|
299
|
+
writeBinaryStamp();
|
|
300
|
+
}
|
|
301
|
+
binaryCheckedThisProcess = true;
|
|
302
|
+
return { ok: true, skipped: "up-to-date", binaryVersion: getInstalledBinaryVersion() };
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const fetched = fetchCamoufoxBinary({ silent });
|
|
306
|
+
if (!fetched.ok) {
|
|
307
|
+
// If we already have *some* binary, degrade gracefully — launch path will
|
|
308
|
+
// sanitize unsupported fingerprint keys. Only hard-fail when missing entirely.
|
|
309
|
+
if (isCamoufoxBinaryAvailable()) {
|
|
310
|
+
if (!silent) {
|
|
311
|
+
console.log(
|
|
312
|
+
`\u26a0 Camoufox binary update failed (${fetched.reason}); using existing binary with config sanitization.`
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
binaryCheckedThisProcess = true;
|
|
316
|
+
return {
|
|
317
|
+
ok: true,
|
|
318
|
+
degraded: true,
|
|
319
|
+
reason: fetched.reason,
|
|
320
|
+
binaryVersion: getInstalledBinaryVersion(),
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
return fetched;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
binaryCheckedThisProcess = true;
|
|
327
|
+
return fetched;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Force re-download after launch errors like "Unknown property audio:seed".
|
|
332
|
+
* Clears process cache so the next ensure re-checks.
|
|
333
|
+
*/
|
|
334
|
+
function refreshCamoufoxBinary({ silent = false } = {}) {
|
|
335
|
+
binaryCheckedThisProcess = false;
|
|
336
|
+
cachedReady = null;
|
|
337
|
+
try {
|
|
338
|
+
const stamp = getStampPath();
|
|
339
|
+
if (fs.existsSync(stamp)) fs.unlinkSync(stamp);
|
|
340
|
+
} catch {
|
|
341
|
+
// ignore
|
|
342
|
+
}
|
|
343
|
+
return ensureCamoufoxBinary({ silent, force: true });
|
|
344
|
+
}
|
|
345
|
+
|
|
162
346
|
function findPlaywrightCli() {
|
|
163
347
|
const candidates = [];
|
|
164
348
|
for (const pkg of ["playwright", "playwright-core"]) {
|
|
@@ -184,7 +368,11 @@ function findPlaywrightCli() {
|
|
|
184
368
|
function ensureLinuxBrowserDeps({ silent = false } = {}) {
|
|
185
369
|
if (process.platform !== "linux") return { ok: true, skipped: "not-linux" };
|
|
186
370
|
if (typeof process.getuid === "function" && process.getuid() !== 0) {
|
|
187
|
-
if (!silent)
|
|
371
|
+
if (!silent) {
|
|
372
|
+
console.log(
|
|
373
|
+
"\u2139 Skipping auto-install of Camoufox system libs (not root). If Camoufox fails to launch, run: npx playwright install-deps firefox"
|
|
374
|
+
);
|
|
375
|
+
}
|
|
188
376
|
return { ok: true, skipped: "not-root" };
|
|
189
377
|
}
|
|
190
378
|
const cliPath = findPlaywrightCli();
|
|
@@ -199,37 +387,41 @@ function ensureLinuxBrowserDeps({ silent = false } = {}) {
|
|
|
199
387
|
if (!silent) console.log("\u2705 Camoufox system libraries ready");
|
|
200
388
|
return { ok: true };
|
|
201
389
|
}
|
|
202
|
-
if (!silent)
|
|
390
|
+
if (!silent) {
|
|
391
|
+
console.log(
|
|
392
|
+
"\u26a0 Could not auto-install system libs; if Camoufox fails to launch run: npx playwright install-deps firefox"
|
|
393
|
+
);
|
|
394
|
+
}
|
|
203
395
|
return { ok: false, reason: String(res.stderr || "").trim().split(/\r?\n/).pop()?.slice(0, 200) };
|
|
204
396
|
}
|
|
205
397
|
|
|
206
|
-
function ensureCamoufoxRuntime({ silent = false } = {}) {
|
|
207
|
-
if (cachedReady === true)
|
|
398
|
+
function ensureCamoufoxRuntime({ silent = false, forceBinaryRefresh = false } = {}) {
|
|
399
|
+
if (cachedReady === true && !forceBinaryRefresh) {
|
|
400
|
+
return { ok: true, module: tryRequireCamoufox() };
|
|
401
|
+
}
|
|
208
402
|
|
|
209
403
|
const pkg = ensureCamoufoxPackage({ silent });
|
|
210
404
|
if (!pkg.ok) {
|
|
211
405
|
cachedReady = false;
|
|
212
406
|
const error = new Error(
|
|
213
407
|
`Camoufox engine not available. ${pkg.reason}. ` +
|
|
214
|
-
|
|
215
|
-
|
|
408
|
+
`Install manually with "npm install -g camoufox-js && npx camoufox-js fetch", then retry. ` +
|
|
409
|
+
`You can also switch back to the Chromium engine in the bulk-import modal.`
|
|
216
410
|
);
|
|
217
411
|
error.code = "CAMOUFOX_PACKAGE_MISSING";
|
|
218
412
|
return { ok: false, error };
|
|
219
413
|
}
|
|
220
414
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
`Camoufox browser binary not downloaded. ${fetched.reason}. ` +
|
|
415
|
+
const binary = ensureCamoufoxBinary({ silent, force: forceBinaryRefresh });
|
|
416
|
+
if (!binary.ok) {
|
|
417
|
+
cachedReady = false;
|
|
418
|
+
const error = new Error(
|
|
419
|
+
`Camoufox browser binary not downloaded. ${binary.reason}. ` +
|
|
227
420
|
`Run "npx camoufox-js fetch" manually, then retry. ` +
|
|
228
421
|
`You can also switch back to the Chromium engine in the bulk-import modal.`
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
}
|
|
422
|
+
);
|
|
423
|
+
error.code = "CAMOUFOX_BINARY_MISSING";
|
|
424
|
+
return { ok: false, error };
|
|
233
425
|
}
|
|
234
426
|
|
|
235
427
|
// Ensure Linux GUI libraries are present (idempotent). Runs even when the
|
|
@@ -238,7 +430,12 @@ function ensureCamoufoxRuntime({ silent = false } = {}) {
|
|
|
238
430
|
ensureLinuxBrowserDeps({ silent });
|
|
239
431
|
|
|
240
432
|
cachedReady = true;
|
|
241
|
-
return {
|
|
433
|
+
return {
|
|
434
|
+
ok: true,
|
|
435
|
+
module: pkg.module,
|
|
436
|
+
binaryVersion: binary.binaryVersion || getInstalledBinaryVersion(),
|
|
437
|
+
binaryDegraded: Boolean(binary.degraded),
|
|
438
|
+
};
|
|
242
439
|
}
|
|
243
440
|
|
|
244
441
|
function loadCamoufoxModule() {
|
|
@@ -247,11 +444,17 @@ function loadCamoufoxModule() {
|
|
|
247
444
|
|
|
248
445
|
function resetCache() {
|
|
249
446
|
cachedReady = null;
|
|
447
|
+
binaryCheckedThisProcess = false;
|
|
250
448
|
}
|
|
251
449
|
|
|
252
450
|
module.exports = {
|
|
253
451
|
ensureCamoufoxRuntime,
|
|
452
|
+
ensureCamoufoxBinary,
|
|
453
|
+
refreshCamoufoxBinary,
|
|
254
454
|
loadCamoufoxModule,
|
|
255
455
|
isCamoufoxBinaryAvailable,
|
|
456
|
+
getInstalledBinaryVersion,
|
|
457
|
+
getCamoufoxJsPackageVersion,
|
|
458
|
+
getCamoufoxBinaryDir,
|
|
256
459
|
resetCache,
|
|
257
460
|
};
|
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
// Lazy-install helper for cloakbrowser (stealth Chromium that can pass Turnstile).
|
|
2
2
|
// Same shape as camoufoxRuntime / playwrightRuntime — optional package, install on demand.
|
|
3
|
+
// Also installs mmdb-lib (required by cloakbrowser when geoip: true for proxy timezone match).
|
|
3
4
|
const { createRequire } = require("module");
|
|
4
5
|
const fs = require("fs");
|
|
5
6
|
const path = require("path");
|
|
6
7
|
|
|
7
|
-
const {
|
|
8
|
+
const {
|
|
9
|
+
runNpmInstall,
|
|
10
|
+
getRuntimeDir,
|
|
11
|
+
getRuntimeNodeModules,
|
|
12
|
+
summarizeNpmError,
|
|
13
|
+
buildEnvWithRuntime,
|
|
14
|
+
} = require("./sqliteRuntime");
|
|
8
15
|
|
|
9
16
|
const CLOAKBROWSER_PACKAGE = "cloakbrowser";
|
|
10
|
-
// Keep in sync with package.json optionalDependencies
|
|
11
17
|
const CLOAKBROWSER_VERSION = "^0.3.32";
|
|
18
|
+
const MMDB_PACKAGE = "mmdb-lib";
|
|
19
|
+
const MMDB_VERSION = "^3.0.2";
|
|
12
20
|
|
|
13
21
|
const nodeRequire =
|
|
14
22
|
typeof __non_webpack_require__ === "function" ? __non_webpack_require__ : require;
|
|
@@ -24,6 +32,10 @@ function getRuntimeRequire() {
|
|
|
24
32
|
|
|
25
33
|
let cachedReady = null;
|
|
26
34
|
|
|
35
|
+
function hasPackage(name) {
|
|
36
|
+
return fs.existsSync(path.join(getRuntimeNodeModules(), name, "package.json"));
|
|
37
|
+
}
|
|
38
|
+
|
|
27
39
|
function tryRequireCloakbrowser() {
|
|
28
40
|
try {
|
|
29
41
|
const rreq = getRuntimeRequire();
|
|
@@ -41,14 +53,20 @@ function tryRequireCloakbrowser() {
|
|
|
41
53
|
return nodeRequire(candidate);
|
|
42
54
|
}
|
|
43
55
|
} catch {}
|
|
44
|
-
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function tryRequireMmdb() {
|
|
45
60
|
try {
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
if (fs.existsSync(path.join(
|
|
49
|
-
return
|
|
61
|
+
const rreq = getRuntimeRequire();
|
|
62
|
+
const candidate = path.join(getRuntimeNodeModules(), MMDB_PACKAGE);
|
|
63
|
+
if (rreq && fs.existsSync(path.join(candidate, "package.json"))) {
|
|
64
|
+
return rreq(candidate);
|
|
50
65
|
}
|
|
51
66
|
} catch {}
|
|
67
|
+
try {
|
|
68
|
+
return nodeRequire(MMDB_PACKAGE);
|
|
69
|
+
} catch {}
|
|
52
70
|
return null;
|
|
53
71
|
}
|
|
54
72
|
|
|
@@ -56,45 +74,75 @@ function loadCloakbrowserModule() {
|
|
|
56
74
|
return tryRequireCloakbrowser();
|
|
57
75
|
}
|
|
58
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Ensure cloakbrowser + mmdb-lib are available under ~/.zevai/runtime.
|
|
79
|
+
* mmdb-lib is required when launching with geoip: true (proxy timezone/locale).
|
|
80
|
+
*/
|
|
59
81
|
function ensureCloakbrowserRuntime({ silent = false } = {}) {
|
|
60
|
-
if (cachedReady?.ok && cachedReady.module) {
|
|
82
|
+
if (cachedReady?.ok && cachedReady.module && tryRequireMmdb()) {
|
|
61
83
|
return cachedReady;
|
|
62
84
|
}
|
|
63
85
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
86
|
+
// Inject runtime node_modules into resolution for cloakbrowser's require("mmdb-lib")
|
|
87
|
+
try {
|
|
88
|
+
const env = buildEnvWithRuntime(process.env);
|
|
89
|
+
if (env.NODE_PATH && !process.env.NODE_PATH?.includes(getRuntimeNodeModules())) {
|
|
90
|
+
process.env.NODE_PATH = env.NODE_PATH;
|
|
91
|
+
// Re-init module paths for already-running process
|
|
92
|
+
try {
|
|
93
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
94
|
+
require("module").Module._initPaths();
|
|
95
|
+
} catch {
|
|
96
|
+
/* ignore */
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
} catch {
|
|
100
|
+
/* ignore */
|
|
68
101
|
}
|
|
69
102
|
|
|
70
|
-
|
|
71
|
-
|
|
103
|
+
let mod = tryRequireCloakbrowser();
|
|
104
|
+
const needCloak = !mod?.launch;
|
|
105
|
+
const needMmdb = !tryRequireMmdb() && !hasPackage(MMDB_PACKAGE);
|
|
106
|
+
|
|
107
|
+
if (needCloak || needMmdb) {
|
|
108
|
+
const pkgs = [];
|
|
109
|
+
if (needCloak) pkgs.push(`${CLOAKBROWSER_PACKAGE}@${CLOAKBROWSER_VERSION}`);
|
|
110
|
+
if (needMmdb) pkgs.push(`${MMDB_PACKAGE}@${MMDB_VERSION}`);
|
|
111
|
+
|
|
112
|
+
if (!silent) {
|
|
113
|
+
console.log(`[cloakbrowser] Installing ${pkgs.join(", ")} into runtime…`);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const installRes = runNpmInstall({
|
|
117
|
+
cwd: getRuntimeDir(),
|
|
118
|
+
pkgs,
|
|
119
|
+
timeout: 300_000,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
if (!installRes.ok) {
|
|
123
|
+
const reason = summarizeNpmError(installRes.stderr || installRes.stdout || "");
|
|
124
|
+
const err = new Error(
|
|
125
|
+
`Failed to install ${pkgs.join(", ")}. On the host run: cd "${getRuntimeDir()}" && npm install ${pkgs.join(" ")} — ${reason}`
|
|
126
|
+
);
|
|
127
|
+
err.code = "CLOAKBROWSER_INSTALL_FAILED";
|
|
128
|
+
return { ok: false, error: err };
|
|
129
|
+
}
|
|
72
130
|
}
|
|
73
131
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
// "Failed to install cloakbrowser … b is not iterable" on first Grok bulk use.
|
|
77
|
-
const installRes = runNpmInstall({
|
|
78
|
-
cwd: getRuntimeDir(),
|
|
79
|
-
pkgs: [`${CLOAKBROWSER_PACKAGE}@${CLOAKBROWSER_VERSION}`],
|
|
80
|
-
timeout: 300_000,
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
if (!installRes.ok) {
|
|
84
|
-
const reason = summarizeNpmError(installRes.stderr || installRes.stdout || "");
|
|
132
|
+
mod = tryRequireCloakbrowser();
|
|
133
|
+
if (!mod?.launch) {
|
|
85
134
|
const err = new Error(
|
|
86
|
-
`
|
|
135
|
+
`cloakbrowser installed but launch() is missing. Reinstall: cd "${getRuntimeDir()}" && npm install ${CLOAKBROWSER_PACKAGE}@${CLOAKBROWSER_VERSION} ${MMDB_PACKAGE}@${MMDB_VERSION}`
|
|
87
136
|
);
|
|
88
|
-
err.code = "
|
|
137
|
+
err.code = "CLOAKBROWSER_API_MISMATCH";
|
|
89
138
|
return { ok: false, error: err };
|
|
90
139
|
}
|
|
91
140
|
|
|
92
|
-
|
|
93
|
-
if (!mod?.launch) {
|
|
141
|
+
if (!tryRequireMmdb() && !hasPackage(MMDB_PACKAGE)) {
|
|
94
142
|
const err = new Error(
|
|
95
|
-
`
|
|
143
|
+
`mmdb-lib is required for geoip: true. Install: cd "${getRuntimeDir()}" && npm install ${MMDB_PACKAGE}@${MMDB_VERSION}`
|
|
96
144
|
);
|
|
97
|
-
err.code = "
|
|
145
|
+
err.code = "MMDB_MISSING";
|
|
98
146
|
return { ok: false, error: err };
|
|
99
147
|
}
|
|
100
148
|
|
|
@@ -107,4 +155,6 @@ module.exports = {
|
|
|
107
155
|
loadCloakbrowserModule,
|
|
108
156
|
CLOAKBROWSER_PACKAGE,
|
|
109
157
|
CLOAKBROWSER_VERSION,
|
|
158
|
+
MMDB_PACKAGE,
|
|
159
|
+
MMDB_VERSION,
|
|
110
160
|
};
|