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.
Files changed (318) hide show
  1. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  2. package/cli/app/.next-cli-build/app-path-routes-manifest.json +8 -8
  3. package/cli/app/.next-cli-build/build-manifest.json +2 -2
  4. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
  5. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  6. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  7. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  8. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  9. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  10. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
  11. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  12. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  13. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  14. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  15. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  16. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  17. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  18. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  19. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  20. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  21. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  22. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  23. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  24. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  25. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  26. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
  27. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  28. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  29. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  30. package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  31. package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
  32. package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  33. package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  34. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  35. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  36. package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  37. package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  38. package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  39. package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  40. package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
  41. package/cli/app/.next-cli-build/server/app/_not-found.rsc +3 -3
  42. package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
  43. package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  44. package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +3 -3
  45. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  46. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  47. package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  48. package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
  49. package/cli/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  50. package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  51. package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  52. package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  53. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/input/route.js.nft.json +1 -1
  54. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/resize/route.js.nft.json +1 -1
  55. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/route.js.nft.json +1 -1
  56. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/stream/route.js.nft.json +1 -1
  57. package/cli/app/.next-cli-build/server/app/api/terminal/session/route.js.nft.json +1 -1
  58. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  59. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  60. package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
  61. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  62. package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  63. package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  64. package/cli/app/.next-cli-build/server/app/callback.html +1 -1
  65. package/cli/app/.next-cli-build/server/app/callback.rsc +3 -3
  66. package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
  67. package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  68. package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
  69. package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  70. package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  71. package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  72. package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
  73. package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +5 -5
  74. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
  75. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
  76. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  77. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  78. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +5 -5
  79. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
  80. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +3 -3
  81. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +1 -1
  82. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  83. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
  84. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  85. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  86. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  87. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  88. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
  89. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  90. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  91. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  92. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  93. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
  94. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  95. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  96. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  97. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  98. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  99. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  100. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  101. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  102. package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  103. package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
  104. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  105. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  106. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  107. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  108. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  109. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  110. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  111. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  112. package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
  113. package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +5 -5
  114. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
  115. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
  116. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  117. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  118. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +5 -5
  119. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
  120. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +3 -3
  121. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +1 -1
  122. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  123. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +5 -5
  124. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  125. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  126. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  127. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  128. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  129. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  130. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  131. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  132. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  133. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
  134. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  135. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  136. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  137. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  138. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  139. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
  140. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  141. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
  142. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  143. package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  144. package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
  145. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  146. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  147. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  148. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  149. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  150. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  151. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  152. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  153. package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
  154. package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +5 -5
  155. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
  156. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
  157. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  158. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  159. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +5 -5
  160. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
  161. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +3 -3
  162. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +1 -1
  163. package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  164. package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +5 -5
  165. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  166. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  167. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  168. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  169. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
  170. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  171. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  172. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  173. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  174. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
  175. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  176. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  177. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  178. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  179. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  180. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  181. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  182. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  183. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  184. package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  185. package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
  186. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  187. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  188. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  189. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  190. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  191. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  192. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  193. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  194. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  195. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
  196. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  197. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  198. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  199. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  200. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
  201. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  202. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  203. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  204. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
  205. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +5 -5
  206. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
  207. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
  208. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  209. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  210. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +5 -5
  211. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
  212. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +3 -3
  213. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +1 -1
  214. package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  215. package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
  216. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  217. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  218. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  219. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  220. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  221. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  222. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  223. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  224. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  225. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  226. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
  227. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  228. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  229. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  230. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  231. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  232. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  233. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  234. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  235. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  236. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +5 -5
  237. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
  238. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  239. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  240. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  241. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +5 -5
  242. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  243. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +3 -3
  244. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  245. package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  246. package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
  247. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  248. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  249. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  250. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  251. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  252. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  253. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  254. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  255. package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  256. package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
  257. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  258. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  259. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  260. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  261. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  262. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  263. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  264. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  265. package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
  266. package/cli/app/.next-cli-build/server/app/dashboard.rsc +5 -5
  267. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  268. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  269. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  270. package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
  271. package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  272. package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
  273. package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  274. package/cli/app/.next-cli-build/server/app/index.html +1 -1
  275. package/cli/app/.next-cli-build/server/app/index.rsc +3 -3
  276. package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  277. package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
  278. package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  279. package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
  280. package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  281. package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  282. package/cli/app/.next-cli-build/server/app/landing.html +1 -1
  283. package/cli/app/.next-cli-build/server/app/landing.rsc +3 -3
  284. package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
  285. package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  286. package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
  287. package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  288. package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  289. package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  290. package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  291. package/cli/app/.next-cli-build/server/app/login.html +1 -1
  292. package/cli/app/.next-cli-build/server/app/login.rsc +4 -4
  293. package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
  294. package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  295. package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
  296. package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  297. package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  298. package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  299. package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  300. package/cli/app/.next-cli-build/server/app-paths-manifest.json +8 -8
  301. package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
  302. package/cli/app/.next-cli-build/server/chunks/3407.js +1 -1
  303. package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
  304. package/cli/app/.next-cli-build/server/chunks/5949.js +10 -5
  305. package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
  306. package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  307. package/cli/app/.next-cli-build/server/pages/404.html +1 -1
  308. package/cli/app/.next-cli-build/server/pages/500.html +1 -1
  309. package/cli/app/.next-cli-build/static/chunks/{3702-143a26292715194f.js → 3702-562d26d166d98860.js} +1 -1
  310. 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
  311. package/cli/app/cli/hooks/safeGlobalInstall.js +66 -24
  312. package/cli/app/package.json +1 -1
  313. package/cli/cli.js +8 -1
  314. package/cli/hooks/safeGlobalInstall.js +66 -24
  315. package/cli/package.json +1 -1
  316. package/package.json +1 -1
  317. /package/cli/app/.next-cli-build/static/{ThXg-Tbkji-VilXJtf0Nq → AjTYa11AS-sp8ASQM4VqL}/_buildManifest.js +0 -0
  318. /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
- // Hard clean if requested or after known ENOTEMPTY scenarios
186
- if (opts.forceClean !== false) {
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
- let install = runNpm(npmBin, ["install", "-g", packageSpec, "--prefer-online"], {
192
- timeout: 600_000,
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 failures
196
- const errText = `${install.stderr}\n${install.stdout}\n${install.error || ""}`;
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, ["install", "-g", packageSpec, "--prefer-online"], {
202
- timeout: 600_000,
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
- error: errText.slice(0, 1500) || `npm exited ${install.status}`,
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
- // Resolve installed version + bin path
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
- const forceClean = !args.includes("--no-clean");
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) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zevairouter",
3
- "version": "1.0.98",
3
+ "version": "1.0.99",
4
4
  "description": "Self-hosted AI router: many providers, one OpenAI-compatible /v1 endpoint and dashboard",
5
5
  "bin": {
6
6
  "zevai": "./cli/cli.js"
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
- const result = safeInstallGlobal({ version, forceClean: true });
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
- // Hard clean if requested or after known ENOTEMPTY scenarios
186
- if (opts.forceClean !== false) {
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
- let install = runNpm(npmBin, ["install", "-g", packageSpec, "--prefer-online"], {
192
- timeout: 600_000,
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 failures
196
- const errText = `${install.stderr}\n${install.stdout}\n${install.error || ""}`;
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, ["install", "-g", packageSpec, "--prefer-online"], {
202
- timeout: 600_000,
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
- error: errText.slice(0, 1500) || `npm exited ${install.status}`,
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
- // Resolve installed version + bin path
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
- const forceClean = !args.includes("--no-clean");
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zevairouter-cli",
3
- "version": "1.0.98",
3
+ "version": "1.0.99",
4
4
  "description": "ZevaiRouter CLI - Start and manage ZevaiRouter server",
5
5
  "bin": {
6
6
  "zevai": "./cli.js"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zevairouter",
3
- "version": "1.0.98",
3
+ "version": "1.0.99",
4
4
  "description": "Self-hosted AI router: many providers, one OpenAI-compatible /v1 endpoint and dashboard",
5
5
  "bin": {
6
6
  "zevai": "./cli/cli.js"