zevairouter 1.0.68 → 1.0.70
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 +10 -0
- package/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +4 -4
- 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/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/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_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 +3 -3
- package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
- 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 +1 -1
- 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 +4 -4
- 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/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/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-9e52be780ed358e2.js → 3702-838b157b1c575fad.js} +1 -1
- 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/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/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/package.json +1 -1
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/src/lib/oauth/services/kiroBulkImportManager.js +60 -10
- package/src/lib/oauth/services/kiroGoogleAutomation.js +80 -16
- /package/cli/app/.next-cli-build/static/{uAzRelvWR5AOBsQdc-bGC → YT3fPhaxMPPrUK4GTsQBO}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{uAzRelvWR5AOBsQdc-bGC → YT3fPhaxMPPrUK4GTsQBO}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Minimal PTY bridge for ZevaiRouter web terminal.
|
|
4
|
+
|
|
5
|
+
stdin -> PTY master (keystrokes)
|
|
6
|
+
stdout <- PTY master (shell output), raw binary
|
|
7
|
+
stderr = control / errors (utf-8 text lines)
|
|
8
|
+
|
|
9
|
+
Optional control on a side channel is not needed: resize arrives as
|
|
10
|
+
OSC-like escape on stdin: \\x1b]9999;<cols>;<rows>\\x07
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import errno
|
|
15
|
+
import fcntl
|
|
16
|
+
import os
|
|
17
|
+
import select
|
|
18
|
+
import signal
|
|
19
|
+
import struct
|
|
20
|
+
import sys
|
|
21
|
+
import termios
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def set_winsize(fd: int, rows: int, cols: int) -> None:
|
|
25
|
+
try:
|
|
26
|
+
packed = struct.pack("HHHH", max(5, rows), max(20, cols), 0, 0)
|
|
27
|
+
fcntl.ioctl(fd, termios.TIOCSWINSZ, packed)
|
|
28
|
+
except Exception:
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def main() -> int:
|
|
33
|
+
cols = int(sys.argv[1]) if len(sys.argv) > 1 else 120
|
|
34
|
+
rows = int(sys.argv[2]) if len(sys.argv) > 2 else 40
|
|
35
|
+
shell = os.environ.get("SHELL") or ("/bin/bash" if os.path.exists("/bin/bash") else "/bin/sh")
|
|
36
|
+
cwd = os.path.expanduser("~")
|
|
37
|
+
|
|
38
|
+
pid, master = pty_fork = _fork_pty()
|
|
39
|
+
if pid == 0:
|
|
40
|
+
# child
|
|
41
|
+
try:
|
|
42
|
+
os.chdir(cwd)
|
|
43
|
+
except Exception:
|
|
44
|
+
pass
|
|
45
|
+
os.environ.setdefault("TERM", "xterm-256color")
|
|
46
|
+
os.environ.setdefault("COLORTERM", "truecolor")
|
|
47
|
+
os.environ.setdefault("FORCE_COLOR", "1")
|
|
48
|
+
try:
|
|
49
|
+
os.execv(shell, [shell, "-il"])
|
|
50
|
+
except Exception:
|
|
51
|
+
os.execv("/bin/sh", ["/bin/sh", "-i"])
|
|
52
|
+
return 1
|
|
53
|
+
|
|
54
|
+
set_winsize(master, rows, cols)
|
|
55
|
+
|
|
56
|
+
# Non-blocking master + stdin
|
|
57
|
+
for fd in (master, sys.stdin.fileno()):
|
|
58
|
+
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
|
|
59
|
+
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
|
|
60
|
+
|
|
61
|
+
# Binary stdout
|
|
62
|
+
stdout = sys.stdout.buffer
|
|
63
|
+
stdin = sys.stdin.buffer
|
|
64
|
+
|
|
65
|
+
resize_buf = b""
|
|
66
|
+
|
|
67
|
+
def handle_resize_escape(chunk: bytes) -> bytes:
|
|
68
|
+
"""Strip and apply embedded resize escapes, return remaining bytes."""
|
|
69
|
+
nonlocal resize_buf
|
|
70
|
+
data = resize_buf + chunk
|
|
71
|
+
out = bytearray()
|
|
72
|
+
i = 0
|
|
73
|
+
while i < len(data):
|
|
74
|
+
# ESC ] 9999 ; cols ; rows BEL
|
|
75
|
+
if data[i] == 0x1B and data[i : i + 6] == b"\x1b]9999;":
|
|
76
|
+
end = data.find(b"\x07", i + 6)
|
|
77
|
+
if end < 0:
|
|
78
|
+
resize_buf = data[i:]
|
|
79
|
+
return bytes(out)
|
|
80
|
+
payload = data[i + 6 : end].decode("ascii", "ignore")
|
|
81
|
+
try:
|
|
82
|
+
c_s, r_s = payload.split(";", 1)
|
|
83
|
+
set_winsize(master, int(r_s), int(c_s))
|
|
84
|
+
except Exception:
|
|
85
|
+
pass
|
|
86
|
+
i = end + 1
|
|
87
|
+
resize_buf = b""
|
|
88
|
+
continue
|
|
89
|
+
out.append(data[i])
|
|
90
|
+
i += 1
|
|
91
|
+
resize_buf = b""
|
|
92
|
+
return bytes(out)
|
|
93
|
+
|
|
94
|
+
alive = True
|
|
95
|
+
|
|
96
|
+
def on_chld(signum, frame): # noqa: ARG001
|
|
97
|
+
nonlocal alive
|
|
98
|
+
alive = False
|
|
99
|
+
|
|
100
|
+
signal.signal(signal.SIGCHLD, on_chld)
|
|
101
|
+
|
|
102
|
+
try:
|
|
103
|
+
while alive:
|
|
104
|
+
try:
|
|
105
|
+
r, _, _ = select.select([master, sys.stdin.fileno()], [], [], 0.25)
|
|
106
|
+
except InterruptedError:
|
|
107
|
+
continue
|
|
108
|
+
|
|
109
|
+
if master in r:
|
|
110
|
+
try:
|
|
111
|
+
data = os.read(master, 8192)
|
|
112
|
+
except OSError as e:
|
|
113
|
+
if e.errno in (errno.EIO, errno.EAGAIN, errno.EWOULDBLOCK):
|
|
114
|
+
data = b""
|
|
115
|
+
else:
|
|
116
|
+
break
|
|
117
|
+
if not data:
|
|
118
|
+
# EIO often means child exited
|
|
119
|
+
if not alive:
|
|
120
|
+
break
|
|
121
|
+
else:
|
|
122
|
+
stdout.write(data)
|
|
123
|
+
stdout.flush()
|
|
124
|
+
|
|
125
|
+
if sys.stdin.fileno() in r:
|
|
126
|
+
try:
|
|
127
|
+
data = stdin.read(8192)
|
|
128
|
+
except Exception:
|
|
129
|
+
data = b""
|
|
130
|
+
if data is None:
|
|
131
|
+
data = b""
|
|
132
|
+
if data == b"" and not alive:
|
|
133
|
+
break
|
|
134
|
+
if data:
|
|
135
|
+
cleaned = handle_resize_escape(data)
|
|
136
|
+
if cleaned:
|
|
137
|
+
try:
|
|
138
|
+
os.write(master, cleaned)
|
|
139
|
+
except OSError:
|
|
140
|
+
break
|
|
141
|
+
finally:
|
|
142
|
+
try:
|
|
143
|
+
os.close(master)
|
|
144
|
+
except Exception:
|
|
145
|
+
pass
|
|
146
|
+
try:
|
|
147
|
+
os.waitpid(pid, 0)
|
|
148
|
+
except Exception:
|
|
149
|
+
pass
|
|
150
|
+
return 0
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def _fork_pty():
|
|
154
|
+
import pty
|
|
155
|
+
|
|
156
|
+
return pty.fork()
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
if __name__ == "__main__":
|
|
160
|
+
try:
|
|
161
|
+
raise SystemExit(main())
|
|
162
|
+
except KeyboardInterrupt:
|
|
163
|
+
raise SystemExit(0)
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Minimal PTY bridge for ZevaiRouter web terminal.
|
|
4
|
+
|
|
5
|
+
stdin -> PTY master (keystrokes)
|
|
6
|
+
stdout <- PTY master (shell output), raw binary
|
|
7
|
+
stderr = control / errors (utf-8 text lines)
|
|
8
|
+
|
|
9
|
+
Optional control on a side channel is not needed: resize arrives as
|
|
10
|
+
OSC-like escape on stdin: \\x1b]9999;<cols>;<rows>\\x07
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import errno
|
|
15
|
+
import fcntl
|
|
16
|
+
import os
|
|
17
|
+
import select
|
|
18
|
+
import signal
|
|
19
|
+
import struct
|
|
20
|
+
import sys
|
|
21
|
+
import termios
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def set_winsize(fd: int, rows: int, cols: int) -> None:
|
|
25
|
+
try:
|
|
26
|
+
packed = struct.pack("HHHH", max(5, rows), max(20, cols), 0, 0)
|
|
27
|
+
fcntl.ioctl(fd, termios.TIOCSWINSZ, packed)
|
|
28
|
+
except Exception:
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def main() -> int:
|
|
33
|
+
cols = int(sys.argv[1]) if len(sys.argv) > 1 else 120
|
|
34
|
+
rows = int(sys.argv[2]) if len(sys.argv) > 2 else 40
|
|
35
|
+
shell = os.environ.get("SHELL") or ("/bin/bash" if os.path.exists("/bin/bash") else "/bin/sh")
|
|
36
|
+
cwd = os.path.expanduser("~")
|
|
37
|
+
|
|
38
|
+
pid, master = pty_fork = _fork_pty()
|
|
39
|
+
if pid == 0:
|
|
40
|
+
# child
|
|
41
|
+
try:
|
|
42
|
+
os.chdir(cwd)
|
|
43
|
+
except Exception:
|
|
44
|
+
pass
|
|
45
|
+
os.environ.setdefault("TERM", "xterm-256color")
|
|
46
|
+
os.environ.setdefault("COLORTERM", "truecolor")
|
|
47
|
+
os.environ.setdefault("FORCE_COLOR", "1")
|
|
48
|
+
try:
|
|
49
|
+
os.execv(shell, [shell, "-il"])
|
|
50
|
+
except Exception:
|
|
51
|
+
os.execv("/bin/sh", ["/bin/sh", "-i"])
|
|
52
|
+
return 1
|
|
53
|
+
|
|
54
|
+
set_winsize(master, rows, cols)
|
|
55
|
+
|
|
56
|
+
# Non-blocking master + stdin
|
|
57
|
+
for fd in (master, sys.stdin.fileno()):
|
|
58
|
+
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
|
|
59
|
+
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
|
|
60
|
+
|
|
61
|
+
# Binary stdout
|
|
62
|
+
stdout = sys.stdout.buffer
|
|
63
|
+
stdin = sys.stdin.buffer
|
|
64
|
+
|
|
65
|
+
resize_buf = b""
|
|
66
|
+
|
|
67
|
+
def handle_resize_escape(chunk: bytes) -> bytes:
|
|
68
|
+
"""Strip and apply embedded resize escapes, return remaining bytes."""
|
|
69
|
+
nonlocal resize_buf
|
|
70
|
+
data = resize_buf + chunk
|
|
71
|
+
out = bytearray()
|
|
72
|
+
i = 0
|
|
73
|
+
while i < len(data):
|
|
74
|
+
# ESC ] 9999 ; cols ; rows BEL
|
|
75
|
+
if data[i] == 0x1B and data[i : i + 6] == b"\x1b]9999;":
|
|
76
|
+
end = data.find(b"\x07", i + 6)
|
|
77
|
+
if end < 0:
|
|
78
|
+
resize_buf = data[i:]
|
|
79
|
+
return bytes(out)
|
|
80
|
+
payload = data[i + 6 : end].decode("ascii", "ignore")
|
|
81
|
+
try:
|
|
82
|
+
c_s, r_s = payload.split(";", 1)
|
|
83
|
+
set_winsize(master, int(r_s), int(c_s))
|
|
84
|
+
except Exception:
|
|
85
|
+
pass
|
|
86
|
+
i = end + 1
|
|
87
|
+
resize_buf = b""
|
|
88
|
+
continue
|
|
89
|
+
out.append(data[i])
|
|
90
|
+
i += 1
|
|
91
|
+
resize_buf = b""
|
|
92
|
+
return bytes(out)
|
|
93
|
+
|
|
94
|
+
alive = True
|
|
95
|
+
|
|
96
|
+
def on_chld(signum, frame): # noqa: ARG001
|
|
97
|
+
nonlocal alive
|
|
98
|
+
alive = False
|
|
99
|
+
|
|
100
|
+
signal.signal(signal.SIGCHLD, on_chld)
|
|
101
|
+
|
|
102
|
+
try:
|
|
103
|
+
while alive:
|
|
104
|
+
try:
|
|
105
|
+
r, _, _ = select.select([master, sys.stdin.fileno()], [], [], 0.25)
|
|
106
|
+
except InterruptedError:
|
|
107
|
+
continue
|
|
108
|
+
|
|
109
|
+
if master in r:
|
|
110
|
+
try:
|
|
111
|
+
data = os.read(master, 8192)
|
|
112
|
+
except OSError as e:
|
|
113
|
+
if e.errno in (errno.EIO, errno.EAGAIN, errno.EWOULDBLOCK):
|
|
114
|
+
data = b""
|
|
115
|
+
else:
|
|
116
|
+
break
|
|
117
|
+
if not data:
|
|
118
|
+
# EIO often means child exited
|
|
119
|
+
if not alive:
|
|
120
|
+
break
|
|
121
|
+
else:
|
|
122
|
+
stdout.write(data)
|
|
123
|
+
stdout.flush()
|
|
124
|
+
|
|
125
|
+
if sys.stdin.fileno() in r:
|
|
126
|
+
try:
|
|
127
|
+
data = stdin.read(8192)
|
|
128
|
+
except Exception:
|
|
129
|
+
data = b""
|
|
130
|
+
if data is None:
|
|
131
|
+
data = b""
|
|
132
|
+
if data == b"" and not alive:
|
|
133
|
+
break
|
|
134
|
+
if data:
|
|
135
|
+
cleaned = handle_resize_escape(data)
|
|
136
|
+
if cleaned:
|
|
137
|
+
try:
|
|
138
|
+
os.write(master, cleaned)
|
|
139
|
+
except OSError:
|
|
140
|
+
break
|
|
141
|
+
finally:
|
|
142
|
+
try:
|
|
143
|
+
os.close(master)
|
|
144
|
+
except Exception:
|
|
145
|
+
pass
|
|
146
|
+
try:
|
|
147
|
+
os.waitpid(pid, 0)
|
|
148
|
+
except Exception:
|
|
149
|
+
pass
|
|
150
|
+
return 0
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def _fork_pty():
|
|
154
|
+
import pty
|
|
155
|
+
|
|
156
|
+
return pty.fork()
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
if __name__ == "__main__":
|
|
160
|
+
try:
|
|
161
|
+
raise SystemExit(main())
|
|
162
|
+
except KeyboardInterrupt:
|
|
163
|
+
raise SystemExit(0)
|
package/cli/app/package.json
CHANGED
package/cli/package.json
CHANGED
package/package.json
CHANGED
|
@@ -17,6 +17,8 @@ const TERMINAL_ACCOUNT_STATUSES = new Set([
|
|
|
17
17
|
"failed_invalid_credentials",
|
|
18
18
|
"failed_exchange",
|
|
19
19
|
"failed_timeout",
|
|
20
|
+
"failed_restricted",
|
|
21
|
+
"failed_browser_blocked",
|
|
20
22
|
"cancelled",
|
|
21
23
|
]);
|
|
22
24
|
|
|
@@ -222,6 +224,8 @@ function getFailedCount(accounts) {
|
|
|
222
224
|
|| account.status === "failed_invalid_credentials"
|
|
223
225
|
|| account.status === "failed_exchange"
|
|
224
226
|
|| account.status === "failed_timeout"
|
|
227
|
+
|| account.status === "failed_restricted"
|
|
228
|
+
|| account.status === "failed_browser_blocked"
|
|
225
229
|
)).length;
|
|
226
230
|
}
|
|
227
231
|
|
|
@@ -299,7 +303,7 @@ function sanitizeAccount(account) {
|
|
|
299
303
|
proxyUrl: maskProxyUrl(account.proxyUrl) || null,
|
|
300
304
|
currentStep: account.currentStep || null,
|
|
301
305
|
updatedAt: account.updatedAt || null,
|
|
302
|
-
logs: (account.logs || []).slice(-
|
|
306
|
+
logs: (account.logs || []).slice(-20),
|
|
303
307
|
manualSessionAvailable: Boolean(account.manualSession?.page) && account.status === "needs_manual",
|
|
304
308
|
manualSessionOpened: Boolean(account.manualSession?.opened),
|
|
305
309
|
};
|
|
@@ -354,7 +358,23 @@ export function buildLookupResponse(job, extras = {}) {
|
|
|
354
358
|
|
|
355
359
|
async function defaultBrowserLauncher(job) {
|
|
356
360
|
const { launchBulkImportBrowser } = await import("./bulkImportBrowserEngine.js");
|
|
357
|
-
|
|
361
|
+
const engine = job?.engine || "chromium";
|
|
362
|
+
// Google OAuth now rejects stock headless Chromium after email submit with
|
|
363
|
+
// /v3/signin/rejected ("This browser or app may not be secure"). That is the
|
|
364
|
+
// real reason Kiro bulk ends in needs_manual — not random captcha.
|
|
365
|
+
// Default: headed Chromium (Xvfb auto-starts on Linux). Camoufox can stay
|
|
366
|
+
// headless. Override with ZEVAI_KIRO_HEADLESS=0|1.
|
|
367
|
+
const envHeadless = process.env.ZEVAI_KIRO_HEADLESS;
|
|
368
|
+
let headless;
|
|
369
|
+
if (envHeadless === "1" || envHeadless === "true") headless = true;
|
|
370
|
+
else if (envHeadless === "0" || envHeadless === "false") headless = false;
|
|
371
|
+
else if (engine === "camoufox") headless = true;
|
|
372
|
+
else headless = false;
|
|
373
|
+
return launchBulkImportBrowser({
|
|
374
|
+
engine,
|
|
375
|
+
headless,
|
|
376
|
+
windowSize: { width: 1280, height: 900 },
|
|
377
|
+
});
|
|
358
378
|
}
|
|
359
379
|
|
|
360
380
|
async function defaultSocialExchange(args) {
|
|
@@ -830,23 +850,47 @@ export class KiroBulkImportManager {
|
|
|
830
850
|
if (!job) return readJsonFile(getJobFile(jobId, this.storageDir));
|
|
831
851
|
|
|
832
852
|
job.cancelRequested = true;
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
853
|
+
|
|
854
|
+
// Immediately terminalize ALL open accounts — including needs_manual.
|
|
855
|
+
// Previously cancel only flipped "queued" jobs and closed the browser, so
|
|
856
|
+
// needs_manual followups waited on a dead callback promise forever and the
|
|
857
|
+
// UI stayed "running" / Cancel did nothing.
|
|
858
|
+
for (const account of job.accounts || []) {
|
|
859
|
+
if (
|
|
860
|
+
account.status === "queued"
|
|
861
|
+
|| account.status === "running"
|
|
862
|
+
|| account.status === "needs_manual"
|
|
863
|
+
) {
|
|
864
|
+
const ms = account.manualSession;
|
|
865
|
+
const rs = account.runtimeSession;
|
|
866
|
+
const ctx = ms?.context || rs?.context || null;
|
|
867
|
+
const headed = ms?.headedBrowser || null;
|
|
868
|
+
if (ctx) void ctx.close().catch(() => null);
|
|
869
|
+
if (headed) void headed.close().catch(() => null);
|
|
870
|
+
account.manualSession = null;
|
|
871
|
+
account.runtimeSession = null;
|
|
872
|
+
this.finalizeAccount(account, "cancelled", {
|
|
873
|
+
error: "Job cancelled",
|
|
874
|
+
step: "cancelled",
|
|
875
|
+
message: "Job cancelled by user",
|
|
876
|
+
});
|
|
877
|
+
}
|
|
839
878
|
}
|
|
840
879
|
|
|
841
880
|
if (job.browser) {
|
|
842
881
|
const browser = job.browser;
|
|
843
882
|
job.browser = null;
|
|
844
|
-
// Prefer force-close: stuck proxy/nav can make browser.close() hang forever.
|
|
845
883
|
void import("./bulkImportBrowserEngine.js")
|
|
846
884
|
.then(({ forceCloseBrowser }) => forceCloseBrowser(browser))
|
|
847
885
|
.catch(() => browser.close().catch(() => null));
|
|
848
886
|
}
|
|
849
887
|
|
|
888
|
+
// Mark job cancelled immediately so UI unlocks; runJob finally still cleans up.
|
|
889
|
+
if (job.status === "queued" || job.status === "running") {
|
|
890
|
+
job.status = "cancelled";
|
|
891
|
+
job.finishedAt = job.finishedAt || nowIso();
|
|
892
|
+
}
|
|
893
|
+
|
|
850
894
|
void this.persistJobSnapshot(job, { forcePreview: true });
|
|
851
895
|
|
|
852
896
|
return sanitizeJob(job);
|
|
@@ -1173,7 +1217,11 @@ export class KiroBulkImportManager {
|
|
|
1173
1217
|
if (job.cancelRequested) {
|
|
1174
1218
|
job.status = "cancelled";
|
|
1175
1219
|
job.accounts.forEach((account) => {
|
|
1176
|
-
if (
|
|
1220
|
+
if (
|
|
1221
|
+
account.status === "queued"
|
|
1222
|
+
|| account.status === "running"
|
|
1223
|
+
|| account.status === "needs_manual"
|
|
1224
|
+
) {
|
|
1177
1225
|
this.finalizeAccount(account, "cancelled", {
|
|
1178
1226
|
error: "Job cancelled",
|
|
1179
1227
|
step: "cancelled",
|
|
@@ -1182,6 +1230,8 @@ export class KiroBulkImportManager {
|
|
|
1182
1230
|
}
|
|
1183
1231
|
});
|
|
1184
1232
|
} else {
|
|
1233
|
+
// If only needs_manual left and user never cancelled, still complete the job
|
|
1234
|
+
// once followups settle — do not leave status stuck on "running".
|
|
1185
1235
|
job.status = "completed";
|
|
1186
1236
|
}
|
|
1187
1237
|
await this.persistJobSnapshot(job, { forcePreview: true });
|
|
@@ -494,18 +494,34 @@ function isGoogleAuthPage(page) {
|
|
|
494
494
|
}
|
|
495
495
|
}
|
|
496
496
|
|
|
497
|
-
// Google bounces flagged (headless) browsers
|
|
498
|
-
//
|
|
499
|
-
//
|
|
497
|
+
// Google bounces flagged (headless) browsers:
|
|
498
|
+
// - myaccount.google.com/not-supported
|
|
499
|
+
// - accounts.google.com/v3/signin/rejected ("This browser or app may not be secure")
|
|
500
|
+
// - about.google drift after consent
|
|
500
501
|
function isBlockedBrowserPage(page) {
|
|
501
502
|
try {
|
|
502
503
|
const url = new URL(page.url());
|
|
503
504
|
if (url.pathname.startsWith("/not-supported")) return true;
|
|
504
505
|
if (url.pathname.includes("/signin/rejected")) return true;
|
|
505
|
-
|
|
506
|
+
if (url.pathname.includes("/rejected")) return true;
|
|
507
|
+
if (url.hostname === "about.google" || url.hostname.endsWith(".about.google")) return true;
|
|
506
508
|
} catch {
|
|
507
|
-
|
|
509
|
+
// fall through to body text
|
|
508
510
|
}
|
|
511
|
+
return false;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
async function isBlockedBrowser(page) {
|
|
515
|
+
if (isBlockedBrowserPage(page)) return true;
|
|
516
|
+
const text = await readPageText(page).catch(() => "");
|
|
517
|
+
return includesAny(text, [
|
|
518
|
+
"browser or app may not be secure",
|
|
519
|
+
"try using a different browser",
|
|
520
|
+
"couldn't sign you in",
|
|
521
|
+
"couldn\u2019t sign you in",
|
|
522
|
+
"this browser or app may not be secure",
|
|
523
|
+
"browser is not secure",
|
|
524
|
+
]);
|
|
509
525
|
}
|
|
510
526
|
|
|
511
527
|
function isProviderPage(page) {
|
|
@@ -1222,12 +1238,17 @@ export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MAN
|
|
|
1222
1238
|
const parsed = parseCallbackUrl(trackedPage.url?.() || "");
|
|
1223
1239
|
if (parsed) settle(parsed);
|
|
1224
1240
|
};
|
|
1241
|
+
const onClose = () => {
|
|
1242
|
+
// Cancel/force-close: unblock manual followup instead of hanging 15 min
|
|
1243
|
+
settle(null, new Error("Browser session closed while waiting for Kiro callback"));
|
|
1244
|
+
};
|
|
1225
1245
|
|
|
1226
1246
|
trackedPage.on("framenavigated", onFrame);
|
|
1227
1247
|
trackedPage.on("request", onRequest);
|
|
1228
1248
|
trackedPage.on("requestfailed", onRequestFailed);
|
|
1229
1249
|
trackedPage.on("domcontentloaded", onLoadState);
|
|
1230
1250
|
trackedPage.on("load", onLoadState);
|
|
1251
|
+
trackedPage.on("close", onClose);
|
|
1231
1252
|
|
|
1232
1253
|
ownerCleanups.push(() => {
|
|
1233
1254
|
trackedPage.off("framenavigated", onFrame);
|
|
@@ -1235,6 +1256,7 @@ export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MAN
|
|
|
1235
1256
|
trackedPage.off("requestfailed", onRequestFailed);
|
|
1236
1257
|
trackedPage.off("domcontentloaded", onLoadState);
|
|
1237
1258
|
trackedPage.off("load", onLoadState);
|
|
1259
|
+
trackedPage.off("close", onClose);
|
|
1238
1260
|
});
|
|
1239
1261
|
|
|
1240
1262
|
const current = parseCallbackUrl(trackedPage.url?.() || "");
|
|
@@ -1248,8 +1270,13 @@ export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MAN
|
|
|
1248
1270
|
contextCleanups.set(ctx, cleanups);
|
|
1249
1271
|
|
|
1250
1272
|
const onPage = (newPage) => registerPage(newPage, cleanups);
|
|
1273
|
+
const onClose = () => {
|
|
1274
|
+
settle(null, new Error("Browser context closed while waiting for Kiro callback"));
|
|
1275
|
+
};
|
|
1251
1276
|
ctx.on("page", onPage);
|
|
1277
|
+
ctx.on("close", onClose);
|
|
1252
1278
|
cleanups.push(() => ctx.off("page", onPage));
|
|
1279
|
+
cleanups.push(() => ctx.off("close", onClose));
|
|
1253
1280
|
|
|
1254
1281
|
if (pg) registerPage(pg, cleanups);
|
|
1255
1282
|
}
|
|
@@ -1260,6 +1287,11 @@ export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MAN
|
|
|
1260
1287
|
if (newContext) bind(newContext, newPage);
|
|
1261
1288
|
};
|
|
1262
1289
|
|
|
1290
|
+
// Allow cancel path to force-reject without waiting for timeout
|
|
1291
|
+
promise.abort = (reason = "Job cancelled") => {
|
|
1292
|
+
settle(null, new Error(reason));
|
|
1293
|
+
};
|
|
1294
|
+
|
|
1263
1295
|
return promise;
|
|
1264
1296
|
}
|
|
1265
1297
|
|
|
@@ -1425,15 +1457,19 @@ export async function runGoogleAccountAutomation({
|
|
|
1425
1457
|
continue;
|
|
1426
1458
|
}
|
|
1427
1459
|
|
|
1428
|
-
// Headless Chromium
|
|
1429
|
-
//
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1460
|
+
// Headless Chromium is rejected after email submit → /v3/signin/rejected
|
|
1461
|
+
// ("This browser or app may not be secure"). Fail fast — do not spin 90s.
|
|
1462
|
+
if (await isBlockedBrowser(page)) {
|
|
1463
|
+
const url = page.url?.() || "";
|
|
1464
|
+
reportStep(
|
|
1465
|
+
"browser_blocked_by_google",
|
|
1466
|
+
`Google blocked this browser (url=${url.slice(0, 120)}). Headless Chromium is rejected — use headed mode or Camoufox.`,
|
|
1467
|
+
);
|
|
1434
1468
|
return {
|
|
1435
|
-
status: "
|
|
1436
|
-
error:
|
|
1469
|
+
status: "failed_browser_blocked",
|
|
1470
|
+
error:
|
|
1471
|
+
"Google blocked the automated browser (\"This browser or app may not be secure\" / signin rejected). " +
|
|
1472
|
+
"Kiro bulk must use headed Chromium (Xvfb on Linux) or the Camoufox engine — not headless Chrome.",
|
|
1437
1473
|
};
|
|
1438
1474
|
}
|
|
1439
1475
|
|
|
@@ -1517,14 +1553,42 @@ export async function runGoogleAccountAutomation({
|
|
|
1517
1553
|
continue;
|
|
1518
1554
|
}
|
|
1519
1555
|
|
|
1520
|
-
|
|
1556
|
+
// Periodic diagnostics so jobs aren't opaque "waiting" spam
|
|
1557
|
+
if (Math.floor((Date.now() - startTime) / 5000) !== Math.floor((Date.now() - startTime - 700) / 5000)) {
|
|
1558
|
+
const url = page.url?.() || "";
|
|
1559
|
+
const snippet = String(text || (await readPageText(page).catch(() => ""))).slice(0, 100).replace(/\s+/g, " ");
|
|
1560
|
+
reportStep(
|
|
1561
|
+
"waiting_for_next_screen",
|
|
1562
|
+
`Waiting for the next Google or ${serviceLabel} screen (url=${url.slice(0, 100)} body=${snippet})`,
|
|
1563
|
+
);
|
|
1564
|
+
} else {
|
|
1565
|
+
reportStep("waiting_for_next_screen", `Waiting for the next Google or ${serviceLabel} screen`);
|
|
1566
|
+
}
|
|
1521
1567
|
await page.waitForTimeout(700);
|
|
1522
1568
|
}
|
|
1523
1569
|
|
|
1524
|
-
|
|
1570
|
+
// Final blocked check before generic needs_manual
|
|
1571
|
+
if (await isBlockedBrowser(page)) {
|
|
1572
|
+
reportStep("browser_blocked_by_google", "Google blocked browser at end of automation window");
|
|
1573
|
+
return {
|
|
1574
|
+
status: "failed_browser_blocked",
|
|
1575
|
+
error:
|
|
1576
|
+
"Google blocked the automated browser (\"This browser or app may not be secure\"). " +
|
|
1577
|
+
"Use headed Chromium (Xvfb) or Camoufox engine.",
|
|
1578
|
+
};
|
|
1579
|
+
}
|
|
1580
|
+
|
|
1581
|
+
const finalUrl = page.url?.() || "";
|
|
1582
|
+
const finalBody = String(await readPageText(page).catch(() => "")).slice(0, 120).replace(/\s+/g, " ");
|
|
1583
|
+
reportStep(
|
|
1584
|
+
"manual_assist_required",
|
|
1585
|
+
`Flow did not complete ${serviceLabel} authorization automatically (url=${finalUrl.slice(0, 100)} body=${finalBody})`,
|
|
1586
|
+
);
|
|
1525
1587
|
return {
|
|
1526
1588
|
status: "needs_manual",
|
|
1527
|
-
error:
|
|
1589
|
+
error:
|
|
1590
|
+
`Manual assist required — ${serviceLabel} authorization did not finish automatically ` +
|
|
1591
|
+
`(last url: ${finalUrl.slice(0, 140)}). If you see "browser may not be secure", switch to headed Chromium/Camoufox.`,
|
|
1528
1592
|
};
|
|
1529
1593
|
}
|
|
1530
1594
|
|
|
File without changes
|
|
File without changes
|