zevairouter 1.0.93 → 1.0.95
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 +7 -7
- 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 +7 -7
- 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/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-a9d48ed3afa2d5fd.js → 3702-2d50219fb7c4dcfd.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/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/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/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/app/src/lib/updater/updater.js +100 -8
- package/cli/cli.js +131 -11
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/src/app/api/version/route.js +14 -2
- package/src/lib/appUpdater.js +8 -4
- package/src/lib/updater/updater.js +100 -8
- /package/cli/app/.next-cli-build/static/{cHK1E1W2f05Bp9LKjAKXv → pJ5rFHQG90391nAOFCHiM}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{cHK1E1W2f05Bp9LKjAKXv → pJ5rFHQG90391nAOFCHiM}/_ssgManifest.js +0 -0
package/cli/cli.js
CHANGED
|
@@ -123,12 +123,16 @@ Options:
|
|
|
123
123
|
--force-restart Kill existing instance and start a new one (default: attach if healthy)
|
|
124
124
|
--doctor Show install paths (Node/npm/global) + dual-install hints
|
|
125
125
|
--fix-install Repair/reinstall global package for THIS Node (ENOTEMPTY-safe)
|
|
126
|
+
update [--to X.Y.Z] Force update + restart (VPS: systemctl, desktop: relaunch)
|
|
126
127
|
-h, --help Show this help message
|
|
127
128
|
-v, --version Show version
|
|
128
129
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
130
|
+
Update (simple — same Node as this zevai, restarts service):
|
|
131
|
+
zevai update
|
|
132
|
+
zevai update --to 1.0.93
|
|
133
|
+
|
|
134
|
+
One-shot install / reinstall (any device):
|
|
135
|
+
curl -fsSL https://gist.githubusercontent.com/Verifiedlabs/7fe0ab16692acbacd1b471d2c1bbd09b/raw/install.sh | bash
|
|
132
136
|
`);
|
|
133
137
|
process.exit(0);
|
|
134
138
|
} else if (args[i] === "--version" || args[i] === "-v") {
|
|
@@ -142,30 +146,128 @@ One-shot install (any device):
|
|
|
142
146
|
process.exit(1);
|
|
143
147
|
}
|
|
144
148
|
process.exit(0);
|
|
145
|
-
} else if (args[i] === "--fix-install") {
|
|
149
|
+
} else if (args[i] === "--fix-install" || args[i] === "update" || args[i] === "--update") {
|
|
150
|
+
// `zevai update` — one command, same as 9router simplicity.
|
|
151
|
+
// Force-clean global install + restart systemd (VPS) or relaunch process.
|
|
146
152
|
try {
|
|
147
153
|
const { safeInstallGlobal } = require("./hooks/safeGlobalInstall");
|
|
148
|
-
const { spawn } = require("child_process");
|
|
154
|
+
const { spawn, execFileSync } = require("child_process");
|
|
149
155
|
const fs = require("fs");
|
|
150
156
|
const path = require("path");
|
|
151
157
|
const verIdx = args.indexOf("--to");
|
|
152
158
|
const version = verIdx >= 0 && args[verIdx + 1] ? args[verIdx + 1] : "latest";
|
|
153
159
|
const wasTray = process.argv.includes("--tray") || process.env.TRAY_MODE === "1";
|
|
160
|
+
console.log(`\nUpdating zevairouter@${version}…`);
|
|
154
161
|
const result = safeInstallGlobal({ version, forceClean: true });
|
|
155
162
|
if (!result.ok) {
|
|
156
163
|
console.error(result.error || "install failed");
|
|
157
164
|
process.exit(1);
|
|
158
165
|
}
|
|
159
|
-
console.log(`\
|
|
166
|
+
console.log(`\n✓ Installed zevairouter@${result.version || version}`);
|
|
167
|
+
console.log(` binary: ${result.zevaiPath || "zevai"}`);
|
|
160
168
|
|
|
161
169
|
// Relaunch new binary detached, then exit this process so the new build loads.
|
|
162
170
|
if (process.env.ZEVAI_SKIP_RESTART === "1") {
|
|
163
171
|
console.log(`Restart skipped (ZEVAI_SKIP_RESTART=1). Run: zevai`);
|
|
164
172
|
process.exit(0);
|
|
165
173
|
}
|
|
174
|
+
|
|
175
|
+
// VPS: rewrite systemd unit to THIS Node + zevai, hard-stop old processes, restart.
|
|
176
|
+
// Without rewrite, unit can keep pointing at /usr/bin while nvm got the new package
|
|
177
|
+
// → currentVersion jumps but buildVersion stays on the old Next bundle.
|
|
178
|
+
if (process.platform === "linux" && process.getuid && process.getuid() === 0) {
|
|
179
|
+
const { execSync } = require("child_process");
|
|
180
|
+
const unitName = "zevairouter.service";
|
|
181
|
+
const unitPath = `/etc/systemd/system/${unitName}`;
|
|
182
|
+
const nodeBin = result.nodePath || process.execPath;
|
|
183
|
+
const nodeDir = path.dirname(nodeBin);
|
|
184
|
+
const zevaiBin = result.zevaiPath
|
|
185
|
+
|| path.join(result.globalBin || path.dirname(nodeBin), "zevai");
|
|
186
|
+
const cliJs = result.globalRoot
|
|
187
|
+
? path.join(result.globalRoot, "zevairouter", "cli", "cli.js")
|
|
188
|
+
: null;
|
|
189
|
+
const port = process.env.PORT || "1997";
|
|
190
|
+
// Prefer `node cli.js` over shim so the unit always runs the package we just installed.
|
|
191
|
+
const execStart = cliJs && fs.existsSync(cliJs)
|
|
192
|
+
? `${nodeBin} ${cliJs} --port ${port} --no-browser --skip-update --log`
|
|
193
|
+
: `${nodeBin} ${zevaiBin} --port ${port} --no-browser --skip-update --log`;
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
const unitBody = `[Unit]
|
|
197
|
+
Description=ZevaiRouter
|
|
198
|
+
After=network-online.target
|
|
199
|
+
Wants=network-online.target
|
|
200
|
+
|
|
201
|
+
[Service]
|
|
202
|
+
Type=simple
|
|
203
|
+
User=root
|
|
204
|
+
WorkingDirectory=/root
|
|
205
|
+
Environment="PATH=${nodeDir}:/usr/local/bin:/usr/bin:/bin"
|
|
206
|
+
Environment="PORT=${port}"
|
|
207
|
+
Environment="HOSTNAME=0.0.0.0"
|
|
208
|
+
Environment="DISPLAY=:99"
|
|
209
|
+
Environment="ZEVAI_MINIMAL_POSTINSTALL=1"
|
|
210
|
+
Environment="ZEVAI_SERVER_MODE=1"
|
|
211
|
+
Environment="ZEVAI_MAX_OLD_SPACE_SIZE=1536"
|
|
212
|
+
MemoryMax=2G
|
|
213
|
+
MemorySwapMax=0
|
|
214
|
+
ExecStartPre=/bin/bash -c "pgrep -x Xvfb >/dev/null || (Xvfb :99 -screen 0 1280x900x24 -ac -nolisten tcp >/var/log/xvfb-zevai.log 2>&1 & sleep 0.8)"
|
|
215
|
+
ExecStart=${execStart}
|
|
216
|
+
Restart=always
|
|
217
|
+
RestartSec=3
|
|
218
|
+
StandardOutput=append:/var/log/zevairouter.log
|
|
219
|
+
StandardError=append:/var/log/zevairouter.log
|
|
220
|
+
|
|
221
|
+
[Install]
|
|
222
|
+
WantedBy=multi-user.target
|
|
223
|
+
`;
|
|
224
|
+
fs.writeFileSync(unitPath, unitBody);
|
|
225
|
+
console.log(`Wrote ${unitPath}`);
|
|
226
|
+
console.log(` ExecStart=${execStart}`);
|
|
227
|
+
try { execFileSync("systemctl", ["stop", unitName], { stdio: "ignore", timeout: 15000 }); } catch { /* ignore */ }
|
|
228
|
+
// Kill any leftover (old nvm / tray / orphan) so port is free.
|
|
229
|
+
try {
|
|
230
|
+
execSync("pkill -f 'zevairouter/cli/cli.js' 2>/dev/null || true; pkill -f '/bin/zevai' 2>/dev/null || true", {
|
|
231
|
+
stdio: "ignore",
|
|
232
|
+
timeout: 5000,
|
|
233
|
+
});
|
|
234
|
+
} catch { /* ignore */ }
|
|
235
|
+
execFileSync("systemctl", ["daemon-reload"], { stdio: "ignore", timeout: 10000 });
|
|
236
|
+
execFileSync("systemctl", ["enable", unitName], { stdio: "ignore", timeout: 10000 });
|
|
237
|
+
console.log(`Starting ${unitName}…`);
|
|
238
|
+
execFileSync("systemctl", ["restart", unitName], { stdio: "inherit", timeout: 30000 });
|
|
239
|
+
|
|
240
|
+
let live = null;
|
|
241
|
+
for (let i = 0; i < 20; i++) {
|
|
242
|
+
execSync("sleep 1");
|
|
243
|
+
try {
|
|
244
|
+
const out = execSync(`curl -sS -m 2 http://127.0.0.1:${port}/api/version`, { encoding: "utf8" });
|
|
245
|
+
live = JSON.parse(out);
|
|
246
|
+
break;
|
|
247
|
+
} catch { /* wait */ }
|
|
248
|
+
}
|
|
249
|
+
if (live) {
|
|
250
|
+
console.log(`✓ Live: ${JSON.stringify(live)}`);
|
|
251
|
+
if (live.buildVersion && live.installedVersion && live.buildVersion !== live.installedVersion) {
|
|
252
|
+
console.warn(`! buildVersion (${live.buildVersion}) != installed (${live.installedVersion})`);
|
|
253
|
+
console.warn(" Still mixed install — check: systemctl cat zevairouter | grep ExecStart");
|
|
254
|
+
console.warn(" and: ls -la $(npm root -g)/zevairouter/package.json");
|
|
255
|
+
} else {
|
|
256
|
+
console.log(`✓ Version consistent: ${live.currentVersion}`);
|
|
257
|
+
}
|
|
258
|
+
process.exit(0);
|
|
259
|
+
}
|
|
260
|
+
console.warn("Service started but /api/version not responding yet.");
|
|
261
|
+
console.log(`Check: journalctl -u ${unitName} -n 40 --no-pager`);
|
|
262
|
+
process.exit(0);
|
|
263
|
+
} catch (e) {
|
|
264
|
+
console.warn(`systemd path failed (${e.message}) — falling back to direct relaunch`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
166
268
|
const relaunchArgs = wasTray
|
|
167
269
|
? ["--tray", "--skip-update"]
|
|
168
|
-
: ["--port", process.env.PORT || "1997", "--no-browser", "--skip-update"];
|
|
270
|
+
: ["--port", process.env.PORT || "1997", "--no-browser", "--skip-update", "--log"];
|
|
169
271
|
try {
|
|
170
272
|
const logDir = path.join(process.env.HOME || process.env.USERPROFILE || ".", ".zevai", "logs");
|
|
171
273
|
fs.mkdirSync(logDir, { recursive: true });
|
|
@@ -179,13 +281,21 @@ One-shot install (any device):
|
|
|
179
281
|
? spawn(process.execPath, [cliEntry, ...relaunchArgs], {
|
|
180
282
|
detached: true,
|
|
181
283
|
stdio: ["ignore", out, out],
|
|
182
|
-
env: {
|
|
284
|
+
env: {
|
|
285
|
+
...process.env,
|
|
286
|
+
TRAY_MODE: wasTray ? "1" : "",
|
|
287
|
+
ZEVAI_SERVER_MODE: wasTray ? "" : "1",
|
|
288
|
+
},
|
|
183
289
|
})
|
|
184
290
|
: spawn(result.zevaiPath || "zevai", relaunchArgs, {
|
|
185
291
|
detached: true,
|
|
186
292
|
stdio: ["ignore", out, out],
|
|
187
293
|
shell: process.platform === "win32",
|
|
188
|
-
env: {
|
|
294
|
+
env: {
|
|
295
|
+
...process.env,
|
|
296
|
+
TRAY_MODE: wasTray ? "1" : "",
|
|
297
|
+
ZEVAI_SERVER_MODE: wasTray ? "" : "1",
|
|
298
|
+
},
|
|
189
299
|
});
|
|
190
300
|
child.unref();
|
|
191
301
|
console.log(`Restarting ${wasTray ? "tray" : "server"}… (log ${logFile})`);
|
|
@@ -197,14 +307,24 @@ One-shot install (any device):
|
|
|
197
307
|
// Exit soon so :1997 is free for the new process.
|
|
198
308
|
setTimeout(() => process.exit(0), 500);
|
|
199
309
|
} catch (e) {
|
|
200
|
-
console.error("
|
|
310
|
+
console.error("update failed:", e.message);
|
|
201
311
|
process.exit(1);
|
|
202
312
|
}
|
|
203
313
|
}
|
|
204
314
|
}
|
|
205
315
|
|
|
206
316
|
// Auto-relaunch after update: detached process has no TTY → fallback to tray
|
|
207
|
-
|
|
317
|
+
// ONLY for desktop/tray flows. VPS server mode must stay server.
|
|
318
|
+
if (
|
|
319
|
+
skipUpdate
|
|
320
|
+
&& !trayMode
|
|
321
|
+
&& !process.stdin.isTTY
|
|
322
|
+
&& process.env.ZEVAI_SERVER_MODE !== "1"
|
|
323
|
+
&& !process.env.PORT
|
|
324
|
+
&& process.env.TRAY_MODE !== "0"
|
|
325
|
+
) {
|
|
326
|
+
// Heuristic: systemd / nohup restarts often set PORT or ZEVAI_SERVER_MODE.
|
|
327
|
+
// If neither is set and no TTY, assume desktop tray (legacy 9router behaviour).
|
|
208
328
|
trayMode = true;
|
|
209
329
|
process.env.TRAY_MODE = "1";
|
|
210
330
|
}
|
package/cli/package.json
CHANGED
package/package.json
CHANGED
|
@@ -156,16 +156,25 @@ function resolveInstalledVersion() {
|
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
export async function GET() {
|
|
159
|
-
|
|
159
|
+
// Webpack-inlined at `next build` time (can lag if an old process is still up).
|
|
160
|
+
const webpackBuildVersion = typeof pkg?.version === "string" ? pkg.version : null;
|
|
160
161
|
const installedVersion = resolveInstalledVersion();
|
|
161
162
|
// What the dashboard should treat as "this server": prefer disk install, then build
|
|
162
|
-
const currentVersion = installedVersion ||
|
|
163
|
+
const currentVersion = installedVersion || webpackBuildVersion || "0.0.0";
|
|
164
|
+
// Expose webpack embed as buildVersion for diagnostics; UI should use currentVersion.
|
|
165
|
+
const buildVersion = webpackBuildVersion;
|
|
163
166
|
|
|
164
167
|
const latestVersion = await fetchLatestVersion();
|
|
165
168
|
const hasUpdate = latestVersion
|
|
166
169
|
? compareVersions(latestVersion, currentVersion) > 0
|
|
167
170
|
: false;
|
|
168
171
|
|
|
172
|
+
const buildMismatch = Boolean(
|
|
173
|
+
installedVersion
|
|
174
|
+
&& webpackBuildVersion
|
|
175
|
+
&& installedVersion !== webpackBuildVersion,
|
|
176
|
+
);
|
|
177
|
+
|
|
169
178
|
return Response.json(
|
|
170
179
|
{
|
|
171
180
|
currentVersion,
|
|
@@ -173,6 +182,9 @@ export async function GET() {
|
|
|
173
182
|
buildVersion,
|
|
174
183
|
latestVersion,
|
|
175
184
|
hasUpdate,
|
|
185
|
+
// true when package.json is new but the running Next bundle is old
|
|
186
|
+
// (usually: systemd still on a different Node path, or process not fully restarted)
|
|
187
|
+
buildMismatch,
|
|
176
188
|
},
|
|
177
189
|
{
|
|
178
190
|
headers: {
|
package/src/lib/appUpdater.js
CHANGED
|
@@ -169,10 +169,12 @@ export function spawnUpdaterAndExit(packageName = UPDATER_CONFIG.npmPackageName)
|
|
|
169
169
|
const updaterPath = ensureRuntimeUpdater(resolveBundledUpdaterPath());
|
|
170
170
|
const isTray = process.env.TRAY_MODE === "1";
|
|
171
171
|
const relaunch = resolveRelaunchCommand();
|
|
172
|
-
// Relaunch matching original env: tray stays tray
|
|
172
|
+
// Relaunch matching original env: tray stays tray; server stays server
|
|
173
|
+
// (must pass --port/--no-browser so VPS doesn't flip into tray via no-TTY).
|
|
174
|
+
const appPort = String(process.env.PORT || UPDATER_CONFIG.appPort || 1997);
|
|
173
175
|
const relaunchArgs = isTray
|
|
174
176
|
? [...relaunch.args, "--tray", "--skip-update"]
|
|
175
|
-
: [...relaunch.args, "--skip-update"];
|
|
177
|
+
: [...relaunch.args, "--port", appPort, "--no-browser", "--skip-update", "--log"];
|
|
176
178
|
|
|
177
179
|
spawn(process.execPath, [updaterPath], {
|
|
178
180
|
detached: true,
|
|
@@ -180,7 +182,8 @@ export function spawnUpdaterAndExit(packageName = UPDATER_CONFIG.npmPackageName)
|
|
|
180
182
|
windowsHide: true,
|
|
181
183
|
env: {
|
|
182
184
|
...process.env,
|
|
183
|
-
|
|
185
|
+
// Always npm package name — never the CLI bin name "zevai".
|
|
186
|
+
UPDATER_PKG_NAME: packageName || "zevairouter",
|
|
184
187
|
UPDATER_PORT: String(UPDATER_CONFIG.statusPort),
|
|
185
188
|
UPDATER_TAIL_LINES: String(UPDATER_CONFIG.statusLogTailLines),
|
|
186
189
|
UPDATER_RETRIES: String(UPDATER_CONFIG.installRetries),
|
|
@@ -189,10 +192,11 @@ export function spawnUpdaterAndExit(packageName = UPDATER_CONFIG.npmPackageName)
|
|
|
189
192
|
UPDATER_WAIT_MIN_MS: String(UPDATER_CONFIG.waitForExitMinMs),
|
|
190
193
|
UPDATER_WAIT_MAX_MS: String(UPDATER_CONFIG.waitForExitMaxMs),
|
|
191
194
|
UPDATER_WAIT_CHECK_MS: String(UPDATER_CONFIG.waitForExitCheckMs),
|
|
192
|
-
UPDATER_APP_PORT:
|
|
195
|
+
UPDATER_APP_PORT: appPort,
|
|
193
196
|
UPDATER_RELAUNCH: "1",
|
|
194
197
|
UPDATER_RELAUNCH_CMD: relaunch.cmd,
|
|
195
198
|
UPDATER_RELAUNCH_ARGS: JSON.stringify(relaunchArgs),
|
|
199
|
+
ZEVAI_SERVER_MODE: isTray ? "" : "1",
|
|
196
200
|
},
|
|
197
201
|
}).unref();
|
|
198
202
|
|
|
@@ -9,7 +9,8 @@ const path = require("path");
|
|
|
9
9
|
const fs = require("fs");
|
|
10
10
|
const os = require("os");
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
// Must be npm package name (zevairouter), NOT the CLI bin (zevai).
|
|
13
|
+
const packageName = process.env.UPDATER_PKG_NAME || "zevairouter";
|
|
13
14
|
const port = parseInt(process.env.UPDATER_PORT || "20129", 10);
|
|
14
15
|
const tailLines = parseInt(process.env.UPDATER_TAIL_LINES || "8", 10);
|
|
15
16
|
const maxRetries = parseInt(process.env.UPDATER_RETRIES || "3", 10);
|
|
@@ -128,19 +129,72 @@ function sleep(ms) {
|
|
|
128
129
|
return new Promise((r) => setTimeout(r, ms));
|
|
129
130
|
}
|
|
130
131
|
|
|
132
|
+
function resolveSafeInstallHook() {
|
|
133
|
+
const candidates = [
|
|
134
|
+
path.join(path.dirname(process.execPath), "..", "lib", "node_modules", "zevairouter", "cli", "hooks", "safeGlobalInstall.js"),
|
|
135
|
+
path.join("/usr/lib/node_modules/zevairouter/cli/hooks/safeGlobalInstall.js"),
|
|
136
|
+
path.join("/usr/local/lib/node_modules/zevairouter/cli/hooks/safeGlobalInstall.js"),
|
|
137
|
+
path.join("/opt/homebrew/lib/node_modules/zevairouter/cli/hooks/safeGlobalInstall.js"),
|
|
138
|
+
...String(process.env.NODE_PATH || "")
|
|
139
|
+
.split(path.delimiter)
|
|
140
|
+
.filter(Boolean)
|
|
141
|
+
.map((p) => path.join(p, "zevairouter", "cli", "hooks", "safeGlobalInstall.js")),
|
|
142
|
+
];
|
|
143
|
+
try {
|
|
144
|
+
const { createRequire } = require("module");
|
|
145
|
+
const req = createRequire(path.join(process.cwd(), "package.json"));
|
|
146
|
+
candidates.unshift(req.resolve("zevairouter/cli/hooks/safeGlobalInstall.js"));
|
|
147
|
+
} catch { /* ignore */ }
|
|
148
|
+
// Updater itself may live next to a package tree under ~/.zevai
|
|
149
|
+
try {
|
|
150
|
+
const dataDir = getDataDir();
|
|
151
|
+
candidates.push(
|
|
152
|
+
path.join(dataDir, "runtime", "node_modules", "zevairouter", "cli", "hooks", "safeGlobalInstall.js"),
|
|
153
|
+
);
|
|
154
|
+
} catch { /* ignore */ }
|
|
155
|
+
|
|
156
|
+
for (const p of candidates) {
|
|
157
|
+
try {
|
|
158
|
+
if (p && fs.existsSync(p)) return p;
|
|
159
|
+
} catch { /* next */ }
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
|
|
131
164
|
function runInstall() {
|
|
132
165
|
state.attempt += 1;
|
|
133
166
|
setPhase("installing");
|
|
134
|
-
|
|
167
|
+
// Force-clean path (ENOTEMPTY-safe) like `zevai update` / install.sh.
|
|
168
|
+
// Plain `npm i -g` often leaves the old build running or fails half-way on VPS.
|
|
169
|
+
const pkgSpec = packageName.includes("@") ? packageName : `${packageName}@latest`;
|
|
170
|
+
pushLog(`[updater] attempt ${state.attempt}/${maxRetries} — safe install ${pkgSpec}`);
|
|
135
171
|
|
|
136
172
|
const isWin = process.platform === "win32";
|
|
137
|
-
const
|
|
138
|
-
|
|
173
|
+
const hook = resolveSafeInstallHook();
|
|
174
|
+
|
|
175
|
+
let cmd;
|
|
176
|
+
let args;
|
|
177
|
+
if (hook) {
|
|
178
|
+
cmd = process.execPath;
|
|
179
|
+
args = [hook, "--latest"];
|
|
180
|
+
pushLog(`[updater] using safeGlobalInstall: ${hook}`);
|
|
181
|
+
} else {
|
|
182
|
+
cmd = isWin ? "npm.cmd" : "npm";
|
|
183
|
+
// Explicit @latest — never install a phantom "zevai" package.
|
|
184
|
+
args = ["i", "-g", pkgSpec, "--prefer-online"];
|
|
185
|
+
pushLog(`[updater] safe hook missing — fallback npm ${args.join(" ")}`);
|
|
186
|
+
}
|
|
139
187
|
|
|
140
188
|
const child = spawn(cmd, args, {
|
|
141
189
|
stdio: ["ignore", "pipe", "pipe"],
|
|
142
190
|
windowsHide: true,
|
|
143
|
-
shell: isWin,
|
|
191
|
+
shell: isWin && !hook,
|
|
192
|
+
env: {
|
|
193
|
+
...process.env,
|
|
194
|
+
npm_config_fund: "false",
|
|
195
|
+
npm_config_audit: "false",
|
|
196
|
+
npm_config_update_notifier: "false",
|
|
197
|
+
},
|
|
144
198
|
});
|
|
145
199
|
|
|
146
200
|
child.stdout.on("data", (buf) => {
|
|
@@ -158,7 +212,7 @@ function runInstall() {
|
|
|
158
212
|
});
|
|
159
213
|
|
|
160
214
|
child.on("close", (code) => {
|
|
161
|
-
pushLog(`[updater]
|
|
215
|
+
pushLog(`[updater] install exited with code ${code}`);
|
|
162
216
|
if (code === 0) {
|
|
163
217
|
finalize(true, code, null);
|
|
164
218
|
return;
|
|
@@ -195,8 +249,40 @@ async function waitForAppAndOpenBrowser() {
|
|
|
195
249
|
pushLog(`[updater] app not responding within 30s, skip browser open`);
|
|
196
250
|
}
|
|
197
251
|
|
|
252
|
+
function trySystemdRestart() {
|
|
253
|
+
if (process.platform === "win32" || process.platform === "darwin") return false;
|
|
254
|
+
try {
|
|
255
|
+
const { execFileSync } = require("child_process");
|
|
256
|
+
// Prefer our unit name; fall back to common aliases.
|
|
257
|
+
const units = ["zevairouter.service", "zevai.service"];
|
|
258
|
+
for (const unit of units) {
|
|
259
|
+
try {
|
|
260
|
+
execFileSync("systemctl", ["cat", unit], { stdio: "ignore", timeout: 3000 });
|
|
261
|
+
} catch {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
pushLog(`[updater] restarting systemd unit ${unit}`);
|
|
265
|
+
execFileSync("systemctl", ["daemon-reload"], { stdio: "ignore", timeout: 10000 });
|
|
266
|
+
execFileSync("systemctl", ["restart", unit], { stdio: "ignore", timeout: 30000 });
|
|
267
|
+
pushLog(`[updater] systemctl restart ${unit} OK`);
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
} catch (e) {
|
|
271
|
+
pushLog(`[updater] systemd restart skipped: ${e.message}`);
|
|
272
|
+
}
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
|
|
198
276
|
function relaunchApp() {
|
|
199
277
|
if (process.env.UPDATER_RELAUNCH !== "1") return;
|
|
278
|
+
|
|
279
|
+
// VPS path: if systemd owns the service, restart that — don't spawn a second
|
|
280
|
+
// tray process that leaves the unit on the old binary forever.
|
|
281
|
+
if (trySystemdRestart()) {
|
|
282
|
+
waitForAppAndOpenBrowser();
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
|
|
200
286
|
const cmd = process.env.UPDATER_RELAUNCH_CMD;
|
|
201
287
|
if (!cmd) return;
|
|
202
288
|
let args = [];
|
|
@@ -208,11 +294,17 @@ function relaunchApp() {
|
|
|
208
294
|
stdio: "ignore",
|
|
209
295
|
windowsHide: true,
|
|
210
296
|
shell: isWin,
|
|
211
|
-
env: {
|
|
297
|
+
env: {
|
|
298
|
+
...process.env,
|
|
299
|
+
UPDATER_RELAUNCH: "",
|
|
300
|
+
UPDATER_RELAUNCH_CMD: "",
|
|
301
|
+
UPDATER_RELAUNCH_ARGS: "",
|
|
302
|
+
// Prevent cli.js from flipping headless server restarts into tray mode.
|
|
303
|
+
ZEVAI_SERVER_MODE: args.includes("--tray") ? "" : "1",
|
|
304
|
+
},
|
|
212
305
|
});
|
|
213
306
|
child.unref();
|
|
214
307
|
pushLog(`[updater] relaunched: ${cmd} ${args.join(" ")} (pid=${child.pid})`);
|
|
215
|
-
// Wait for new app to come up, then auto-open browser so user sees the result
|
|
216
308
|
waitForAppAndOpenBrowser();
|
|
217
309
|
} catch (e) {
|
|
218
310
|
pushLog(`[updater] relaunch failed: ${e.message}`);
|
|
File without changes
|
|
File without changes
|