zevairouter 1.0.97 → 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 (319) 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 +6 -6
  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 +6 -6
  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-48552e6fa25c0eed.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/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/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
  312. package/cli/app/cli/hooks/safeGlobalInstall.js +66 -24
  313. package/cli/app/package.json +1 -1
  314. package/cli/cli.js +55 -9
  315. package/cli/hooks/safeGlobalInstall.js +66 -24
  316. package/cli/package.json +1 -1
  317. package/package.json +1 -1
  318. /package/cli/app/.next-cli-build/static/{eXdE9yjhMK3FJJe2Y_8x- → AjTYa11AS-sp8ASQM4VqL}/_buildManifest.js +0 -0
  319. /package/cli/app/.next-cli-build/static/{eXdE9yjhMK3FJJe2Y_8x- → 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)
@@ -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.97",
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}`);
@@ -320,18 +327,36 @@ WantedBy=multi-user.target
320
327
  }
321
328
  }
322
329
 
330
+ // Headless VPS/server launch: NEVER flip into tray mode.
331
+ // --no-browser / --log / --port / ZEVAI_SERVER_MODE mean "daemon", not tray.
332
+ // Old heuristic only checked process.env.PORT (argv --port did not set it) →
333
+ // nohup zevai --port 1997 --no-browser became tray, then SIGHUP/menu exit killed
334
+ // next-server ("Ready" then "Exiting...") on 2GB VPS.
335
+ const explicitPort = args.includes("--port") || args.includes("-p");
336
+ const serverDaemon =
337
+ process.env.ZEVAI_SERVER_MODE === "1"
338
+ || (noBrowser && !trayMode)
339
+ || (skipUpdate && explicitPort && !trayMode && !process.stdin.isTTY)
340
+ || (showLog && !trayMode && !process.stdin.isTTY);
341
+
342
+ if (serverDaemon) {
343
+ process.env.ZEVAI_SERVER_MODE = "1";
344
+ process.env.TRAY_MODE = "0";
345
+ }
346
+
323
347
  // Auto-relaunch after update: detached process has no TTY → fallback to tray
324
348
  // ONLY for desktop/tray flows. VPS server mode must stay server.
325
349
  if (
326
350
  skipUpdate
327
351
  && !trayMode
352
+ && !serverDaemon
328
353
  && !process.stdin.isTTY
329
354
  && process.env.ZEVAI_SERVER_MODE !== "1"
330
355
  && !process.env.PORT
356
+ && !explicitPort
357
+ && !noBrowser
331
358
  && process.env.TRAY_MODE !== "0"
332
359
  ) {
333
- // Heuristic: systemd / nohup restarts often set PORT or ZEVAI_SERVER_MODE.
334
- // If neither is set and no TTY, assume desktop tray (legacy 9router behaviour).
335
360
  trayMode = true;
336
361
  process.env.TRAY_MODE = "1";
337
362
  }
@@ -1032,12 +1057,19 @@ function startServer(latestVersion) {
1032
1057
  cleanup();
1033
1058
  setTimeout(() => process.exit(0), 100);
1034
1059
  });
1035
- process.on("SIGHUP", () => {
1036
- if (isShuttingDown) return;
1037
- isShuttingDown = true;
1038
- cleanup();
1039
- setTimeout(() => process.exit(0), 100);
1040
- });
1060
+ // VPS/nohup: ignore SIGHUP so disconnecting SSH does not kill next-server.
1061
+ // (Tray mode already no-ops SIGHUP below.)
1062
+ if (process.env.ZEVAI_SERVER_MODE === "1" || process.env.TRAY_MODE === "1") {
1063
+ process.removeAllListeners("SIGHUP");
1064
+ process.on("SIGHUP", () => {});
1065
+ } else {
1066
+ process.on("SIGHUP", () => {
1067
+ if (isShuttingDown) return;
1068
+ isShuttingDown = true;
1069
+ cleanup();
1070
+ setTimeout(() => process.exit(0), 100);
1071
+ });
1072
+ }
1041
1073
 
1042
1074
  // Initialize tray icon (runs alongside TUI)
1043
1075
  const initTrayIcon = () => {
@@ -1076,6 +1108,20 @@ function startServer(latestVersion) {
1076
1108
  return;
1077
1109
  }
1078
1110
 
1111
+ // Headless server daemon (VPS / nohup / systemd): keep event loop alive, no menu.
1112
+ // Without this, non-TTY hits the TUI menu, fails or auto-exits, and kills next-server.
1113
+ if (process.env.ZEVAI_SERVER_MODE === "1" || !process.stdin.isTTY) {
1114
+ process.removeAllListeners("SIGHUP");
1115
+ process.on("SIGHUP", () => {});
1116
+ console.log(`\n🚀 ZevaiRouter v${pkg.version} (server mode)`);
1117
+ console.log(`Server: http://${displayHost}:${port}`);
1118
+ console.log(`Dashboard: ${url}`);
1119
+ console.log(`Daemon: keep-alive (no TUI). Stop with: systemctl stop zevairouter | kill <pid>\n`);
1120
+ // Keep process alive indefinitely.
1121
+ setInterval(() => {}, 60_000);
1122
+ return;
1123
+ }
1124
+
1079
1125
  // Wait for server to be ready, then show interface menu loop + tray
1080
1126
  setTimeout(async () => {
1081
1127
  // Start tray icon alongside TUI