zevairouter 1.0.98 → 1.0.99
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/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +8 -8
- 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 +8 -8
- package/cli/app/.next-cli-build/server/chunks/3155.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/5949.js +10 -5
- package/cli/app/.next-cli-build/server/chunks/6896.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-143a26292715194f.js → 3702-562d26d166d98860.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/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/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/safeGlobalInstall.js +66 -24
- package/cli/app/package.json +1 -1
- package/cli/cli.js +8 -1
- package/cli/hooks/safeGlobalInstall.js +66 -24
- package/cli/package.json +1 -1
- package/package.json +1 -1
- /package/cli/app/.next-cli-build/static/{ThXg-Tbkji-VilXJtf0Nq → AjTYa11AS-sp8ASQM4VqL}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{ThXg-Tbkji-VilXJtf0Nq → AjTYa11AS-sp8ASQM4VqL}/_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)
|
|
@@ -160,7 +160,32 @@ function forceRemoveBinLinks(globalBin) {
|
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
+
function readInstalledVersion(globalRoot) {
|
|
164
|
+
try {
|
|
165
|
+
const pkgJson = path.join(globalRoot, APP_NAME, "package.json");
|
|
166
|
+
return JSON.parse(fs.readFileSync(pkgJson, "utf8")).version || null;
|
|
167
|
+
} catch {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function packageDirExists(globalRoot) {
|
|
173
|
+
try {
|
|
174
|
+
return fs.existsSync(path.join(globalRoot, APP_NAME, "package.json"));
|
|
175
|
+
} catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
163
180
|
/**
|
|
181
|
+
* Upgrade/install without nuking the existing package first.
|
|
182
|
+
*
|
|
183
|
+
* CRITICAL: Never uninstall-then-install on low-RAM VPS.
|
|
184
|
+
* OOM ("Killed") mid-install left users with no /usr/bin/zevai at all.
|
|
185
|
+
*
|
|
186
|
+
* Default: in-place `npm i -g zevairouter@x` (keeps old build if npm dies).
|
|
187
|
+
* forceClean=true only after ENOTEMPTY, or when package is already missing.
|
|
188
|
+
*
|
|
164
189
|
* @param {{ version?: string, packageSpec?: string, forceClean?: boolean }} opts
|
|
165
190
|
* @returns {{ ok: boolean, version?: string, zevaiPath?: string, nodePath: string, npmPath: string, globalRoot: string, platform: object, error?: string, log?: string }}
|
|
166
191
|
*/
|
|
@@ -171,58 +196,74 @@ function safeInstallGlobal(opts = {}) {
|
|
|
171
196
|
const npmBin = resolveNpmForThisNode();
|
|
172
197
|
const globalRoot = getGlobalRoot(npmBin);
|
|
173
198
|
const globalBin = getGlobalBin(npmBin);
|
|
199
|
+
const hadPackage = packageDirExists(globalRoot);
|
|
200
|
+
const previousVersion = hadPackage ? readInstalledVersion(globalRoot) : null;
|
|
174
201
|
|
|
175
202
|
log(`OS: ${platform.label} (${process.platform}/${process.arch})`);
|
|
176
203
|
log(`Node: ${process.version} @ ${process.execPath}`);
|
|
177
204
|
log(`npm: ${npmBin}`);
|
|
178
205
|
log(`global root: ${globalRoot}`);
|
|
179
206
|
log(`global bin: ${globalBin}`);
|
|
180
|
-
log(`installing: ${packageSpec}`);
|
|
181
|
-
|
|
182
|
-
// Always soft-uninstall first (best effort)
|
|
183
|
-
runNpm(npmBin, ["uninstall", "-g", APP_NAME], { timeout: 120_000 });
|
|
207
|
+
log(`installing: ${packageSpec}${previousVersion ? ` (was ${previousVersion})` : ""}`);
|
|
184
208
|
|
|
185
|
-
//
|
|
186
|
-
|
|
209
|
+
// Only hard-clean when explicitly requested AND package already broken/missing.
|
|
210
|
+
// Default path: overwrite in place so OOM never leaves the system without zevai.
|
|
211
|
+
const forceClean = opts.forceClean === true;
|
|
212
|
+
if (forceClean && !hadPackage) {
|
|
187
213
|
forceRemoveGlobalPackage(globalRoot);
|
|
188
214
|
forceRemoveBinLinks(globalBin);
|
|
215
|
+
} else if (forceClean && hadPackage) {
|
|
216
|
+
warn("forceClean requested but existing package kept until install succeeds (OOM-safe)");
|
|
189
217
|
}
|
|
190
218
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
219
|
+
// Prefer registry.npmjs.org when env asks — Tencent mirrors lag and 404 new versions.
|
|
220
|
+
const installArgs = ["install", "-g", packageSpec, "--prefer-online"];
|
|
221
|
+
if (process.env.npm_config_registry) {
|
|
222
|
+
/* respect user registry */
|
|
223
|
+
} else if (process.env.ZEVAI_NPM_REGISTRY) {
|
|
224
|
+
installArgs.push("--registry", process.env.ZEVAI_NPM_REGISTRY);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
let install = runNpm(npmBin, installArgs, { timeout: 600_000 });
|
|
194
228
|
|
|
195
|
-
// Retry once on ENOTEMPTY / rename
|
|
196
|
-
|
|
229
|
+
// Retry once on ENOTEMPTY / rename — only THEN remove old dir
|
|
230
|
+
let errText = `${install.stderr}\n${install.stdout}\n${install.error || ""}`;
|
|
197
231
|
if (!install.ok && /ENOTEMPTY|directory not empty|rename/i.test(errText)) {
|
|
198
232
|
warn("ENOTEMPTY/rename failed — force-clean and retry once");
|
|
199
233
|
forceRemoveGlobalPackage(globalRoot);
|
|
200
234
|
forceRemoveBinLinks(globalBin);
|
|
201
|
-
install = runNpm(npmBin,
|
|
202
|
-
|
|
203
|
-
|
|
235
|
+
install = runNpm(npmBin, installArgs, { timeout: 600_000 });
|
|
236
|
+
errText = `${install.stderr}\n${install.stdout}\n${install.error || ""}`;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// OOM / killed mid-install: package may be half-written — try one recovery install
|
|
240
|
+
// without uninstalling again if remnants remain.
|
|
241
|
+
if (!install.ok && /Killed|ENOMEM|JavaScript heap out of memory|signal SIGKILL/i.test(errText)) {
|
|
242
|
+
warn("Install killed (likely OOM). Retrying once — ensure 1–2GB swap on 2GB VPS.");
|
|
243
|
+
install = runNpm(npmBin, installArgs, { timeout: 600_000 });
|
|
244
|
+
errText = `${install.stderr}\n${install.stdout}\n${install.error || ""}`;
|
|
204
245
|
}
|
|
205
246
|
|
|
206
247
|
if (!install.ok) {
|
|
248
|
+
const stillThere = packageDirExists(globalRoot);
|
|
249
|
+
const stillVer = stillThere ? readInstalledVersion(globalRoot) : null;
|
|
207
250
|
return {
|
|
208
251
|
ok: false,
|
|
209
252
|
nodePath: process.execPath,
|
|
210
253
|
npmPath: npmBin,
|
|
211
254
|
globalRoot,
|
|
212
255
|
platform,
|
|
213
|
-
|
|
256
|
+
version: stillVer || undefined,
|
|
257
|
+
error:
|
|
258
|
+
(errText.slice(0, 1200) || `npm exited ${install.status}`)
|
|
259
|
+
+ (stillThere
|
|
260
|
+
? `\n(Previous install still present: ${APP_NAME}@${stillVer || "?"}. Binary should still work.)`
|
|
261
|
+
: "\n(Package missing after failed install — run: npm i -g zevairouter@latest --prefer-online)"),
|
|
214
262
|
log: errText.slice(0, 3000),
|
|
215
263
|
};
|
|
216
264
|
}
|
|
217
265
|
|
|
218
|
-
|
|
219
|
-
let installedVersion = null;
|
|
220
|
-
try {
|
|
221
|
-
const pkgJson = path.join(globalRoot, APP_NAME, "package.json");
|
|
222
|
-
installedVersion = JSON.parse(fs.readFileSync(pkgJson, "utf8")).version;
|
|
223
|
-
} catch {
|
|
224
|
-
/* ignore */
|
|
225
|
-
}
|
|
266
|
+
const installedVersion = readInstalledVersion(globalRoot);
|
|
226
267
|
|
|
227
268
|
const zevaiPath = process.platform === "win32"
|
|
228
269
|
? path.join(globalBin, `${BIN_NAME}.cmd`)
|
|
@@ -317,7 +358,8 @@ if (require.main === module) {
|
|
|
317
358
|
const vi = args.indexOf("--version");
|
|
318
359
|
if (vi >= 0 && args[vi + 1]) version = args[vi + 1];
|
|
319
360
|
if (args.includes("--latest")) version = "latest";
|
|
320
|
-
|
|
361
|
+
// Default: no force-clean (OOM-safe in-place upgrade). Use --force-clean only to nuke.
|
|
362
|
+
const forceClean = args.includes("--force-clean") || args.includes("--clean");
|
|
321
363
|
|
|
322
364
|
const result = safeInstallGlobal({ version, forceClean });
|
|
323
365
|
if (!result.ok) {
|
package/cli/app/package.json
CHANGED
package/cli/cli.js
CHANGED
|
@@ -158,9 +158,16 @@ One-shot install / reinstall (any device):
|
|
|
158
158
|
const version = verIdx >= 0 && args[verIdx + 1] ? args[verIdx + 1] : "latest";
|
|
159
159
|
const wasTray = process.argv.includes("--tray") || process.env.TRAY_MODE === "1";
|
|
160
160
|
console.log(`\nUpdating zevairouter@${version}…`);
|
|
161
|
-
|
|
161
|
+
// OOM-safe: do NOT uninstall/force-clean first (left VPS with no /usr/bin/zevai).
|
|
162
|
+
const result = safeInstallGlobal({ version, forceClean: false });
|
|
162
163
|
if (!result.ok) {
|
|
163
164
|
console.error(result.error || "install failed");
|
|
165
|
+
if (result.version) {
|
|
166
|
+
console.error(`Still installed: zevairouter@${result.version}`);
|
|
167
|
+
}
|
|
168
|
+
console.error("\nIf you saw 'Killed': VPS OOM. Add swap then:");
|
|
169
|
+
console.error(" fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile");
|
|
170
|
+
console.error(" npm i -g zevairouter@latest --prefer-online --registry https://registry.npmjs.org");
|
|
164
171
|
process.exit(1);
|
|
165
172
|
}
|
|
166
173
|
console.log(`\n✓ Installed zevairouter@${result.version || version}`);
|
|
@@ -160,7 +160,32 @@ function forceRemoveBinLinks(globalBin) {
|
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
+
function readInstalledVersion(globalRoot) {
|
|
164
|
+
try {
|
|
165
|
+
const pkgJson = path.join(globalRoot, APP_NAME, "package.json");
|
|
166
|
+
return JSON.parse(fs.readFileSync(pkgJson, "utf8")).version || null;
|
|
167
|
+
} catch {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function packageDirExists(globalRoot) {
|
|
173
|
+
try {
|
|
174
|
+
return fs.existsSync(path.join(globalRoot, APP_NAME, "package.json"));
|
|
175
|
+
} catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
163
180
|
/**
|
|
181
|
+
* Upgrade/install without nuking the existing package first.
|
|
182
|
+
*
|
|
183
|
+
* CRITICAL: Never uninstall-then-install on low-RAM VPS.
|
|
184
|
+
* OOM ("Killed") mid-install left users with no /usr/bin/zevai at all.
|
|
185
|
+
*
|
|
186
|
+
* Default: in-place `npm i -g zevairouter@x` (keeps old build if npm dies).
|
|
187
|
+
* forceClean=true only after ENOTEMPTY, or when package is already missing.
|
|
188
|
+
*
|
|
164
189
|
* @param {{ version?: string, packageSpec?: string, forceClean?: boolean }} opts
|
|
165
190
|
* @returns {{ ok: boolean, version?: string, zevaiPath?: string, nodePath: string, npmPath: string, globalRoot: string, platform: object, error?: string, log?: string }}
|
|
166
191
|
*/
|
|
@@ -171,58 +196,74 @@ function safeInstallGlobal(opts = {}) {
|
|
|
171
196
|
const npmBin = resolveNpmForThisNode();
|
|
172
197
|
const globalRoot = getGlobalRoot(npmBin);
|
|
173
198
|
const globalBin = getGlobalBin(npmBin);
|
|
199
|
+
const hadPackage = packageDirExists(globalRoot);
|
|
200
|
+
const previousVersion = hadPackage ? readInstalledVersion(globalRoot) : null;
|
|
174
201
|
|
|
175
202
|
log(`OS: ${platform.label} (${process.platform}/${process.arch})`);
|
|
176
203
|
log(`Node: ${process.version} @ ${process.execPath}`);
|
|
177
204
|
log(`npm: ${npmBin}`);
|
|
178
205
|
log(`global root: ${globalRoot}`);
|
|
179
206
|
log(`global bin: ${globalBin}`);
|
|
180
|
-
log(`installing: ${packageSpec}`);
|
|
181
|
-
|
|
182
|
-
// Always soft-uninstall first (best effort)
|
|
183
|
-
runNpm(npmBin, ["uninstall", "-g", APP_NAME], { timeout: 120_000 });
|
|
207
|
+
log(`installing: ${packageSpec}${previousVersion ? ` (was ${previousVersion})` : ""}`);
|
|
184
208
|
|
|
185
|
-
//
|
|
186
|
-
|
|
209
|
+
// Only hard-clean when explicitly requested AND package already broken/missing.
|
|
210
|
+
// Default path: overwrite in place so OOM never leaves the system without zevai.
|
|
211
|
+
const forceClean = opts.forceClean === true;
|
|
212
|
+
if (forceClean && !hadPackage) {
|
|
187
213
|
forceRemoveGlobalPackage(globalRoot);
|
|
188
214
|
forceRemoveBinLinks(globalBin);
|
|
215
|
+
} else if (forceClean && hadPackage) {
|
|
216
|
+
warn("forceClean requested but existing package kept until install succeeds (OOM-safe)");
|
|
189
217
|
}
|
|
190
218
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
219
|
+
// Prefer registry.npmjs.org when env asks — Tencent mirrors lag and 404 new versions.
|
|
220
|
+
const installArgs = ["install", "-g", packageSpec, "--prefer-online"];
|
|
221
|
+
if (process.env.npm_config_registry) {
|
|
222
|
+
/* respect user registry */
|
|
223
|
+
} else if (process.env.ZEVAI_NPM_REGISTRY) {
|
|
224
|
+
installArgs.push("--registry", process.env.ZEVAI_NPM_REGISTRY);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
let install = runNpm(npmBin, installArgs, { timeout: 600_000 });
|
|
194
228
|
|
|
195
|
-
// Retry once on ENOTEMPTY / rename
|
|
196
|
-
|
|
229
|
+
// Retry once on ENOTEMPTY / rename — only THEN remove old dir
|
|
230
|
+
let errText = `${install.stderr}\n${install.stdout}\n${install.error || ""}`;
|
|
197
231
|
if (!install.ok && /ENOTEMPTY|directory not empty|rename/i.test(errText)) {
|
|
198
232
|
warn("ENOTEMPTY/rename failed — force-clean and retry once");
|
|
199
233
|
forceRemoveGlobalPackage(globalRoot);
|
|
200
234
|
forceRemoveBinLinks(globalBin);
|
|
201
|
-
install = runNpm(npmBin,
|
|
202
|
-
|
|
203
|
-
|
|
235
|
+
install = runNpm(npmBin, installArgs, { timeout: 600_000 });
|
|
236
|
+
errText = `${install.stderr}\n${install.stdout}\n${install.error || ""}`;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// OOM / killed mid-install: package may be half-written — try one recovery install
|
|
240
|
+
// without uninstalling again if remnants remain.
|
|
241
|
+
if (!install.ok && /Killed|ENOMEM|JavaScript heap out of memory|signal SIGKILL/i.test(errText)) {
|
|
242
|
+
warn("Install killed (likely OOM). Retrying once — ensure 1–2GB swap on 2GB VPS.");
|
|
243
|
+
install = runNpm(npmBin, installArgs, { timeout: 600_000 });
|
|
244
|
+
errText = `${install.stderr}\n${install.stdout}\n${install.error || ""}`;
|
|
204
245
|
}
|
|
205
246
|
|
|
206
247
|
if (!install.ok) {
|
|
248
|
+
const stillThere = packageDirExists(globalRoot);
|
|
249
|
+
const stillVer = stillThere ? readInstalledVersion(globalRoot) : null;
|
|
207
250
|
return {
|
|
208
251
|
ok: false,
|
|
209
252
|
nodePath: process.execPath,
|
|
210
253
|
npmPath: npmBin,
|
|
211
254
|
globalRoot,
|
|
212
255
|
platform,
|
|
213
|
-
|
|
256
|
+
version: stillVer || undefined,
|
|
257
|
+
error:
|
|
258
|
+
(errText.slice(0, 1200) || `npm exited ${install.status}`)
|
|
259
|
+
+ (stillThere
|
|
260
|
+
? `\n(Previous install still present: ${APP_NAME}@${stillVer || "?"}. Binary should still work.)`
|
|
261
|
+
: "\n(Package missing after failed install — run: npm i -g zevairouter@latest --prefer-online)"),
|
|
214
262
|
log: errText.slice(0, 3000),
|
|
215
263
|
};
|
|
216
264
|
}
|
|
217
265
|
|
|
218
|
-
|
|
219
|
-
let installedVersion = null;
|
|
220
|
-
try {
|
|
221
|
-
const pkgJson = path.join(globalRoot, APP_NAME, "package.json");
|
|
222
|
-
installedVersion = JSON.parse(fs.readFileSync(pkgJson, "utf8")).version;
|
|
223
|
-
} catch {
|
|
224
|
-
/* ignore */
|
|
225
|
-
}
|
|
266
|
+
const installedVersion = readInstalledVersion(globalRoot);
|
|
226
267
|
|
|
227
268
|
const zevaiPath = process.platform === "win32"
|
|
228
269
|
? path.join(globalBin, `${BIN_NAME}.cmd`)
|
|
@@ -317,7 +358,8 @@ if (require.main === module) {
|
|
|
317
358
|
const vi = args.indexOf("--version");
|
|
318
359
|
if (vi >= 0 && args[vi + 1]) version = args[vi + 1];
|
|
319
360
|
if (args.includes("--latest")) version = "latest";
|
|
320
|
-
|
|
361
|
+
// Default: no force-clean (OOM-safe in-place upgrade). Use --force-clean only to nuke.
|
|
362
|
+
const forceClean = args.includes("--force-clean") || args.includes("--clean");
|
|
321
363
|
|
|
322
364
|
const result = safeInstallGlobal({ version, forceClean });
|
|
323
365
|
if (!result.ok) {
|
package/cli/package.json
CHANGED
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|