@techysy/10router 1.0.4 → 1.0.6

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 (1002) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +10 -7
  3. package/app/.next-cli-build/build-manifest.json +2 -2
  4. package/app/.next-cli-build/prerender-manifest.json +4 -4
  5. package/app/.next-cli-build/routes-manifest.json +18 -0
  6. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js +1 -1
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  38. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  39. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  44. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  45. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js +2 -2
  46. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  47. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  48. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js +1 -1
  49. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  50. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  51. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js +1 -1
  52. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  53. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  54. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js +1 -1
  55. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  56. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  57. package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page.js +1 -1
  58. package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page.js.nft.json +1 -1
  59. package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  60. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js +1 -1
  61. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  62. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  63. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js +1 -1
  64. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
  65. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  66. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js +1 -1
  67. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
  68. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  69. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js +1 -1
  70. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  71. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  72. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js +1 -1
  73. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  74. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  75. package/app/.next-cli-build/server/app/_global-error/page.js +1 -1
  76. package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
  77. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  78. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  79. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  80. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  81. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  82. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  83. package/app/.next-cli-build/server/app/_not-found/page.js +1 -1
  84. package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
  85. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  86. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  87. package/app/.next-cli-build/server/app/_not-found.rsc +5 -5
  88. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +5 -5
  89. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -5
  90. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  91. package/app/.next-cli-build/server/app/api/auth/login/route.js +1 -1
  92. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/api/auth/logout/route.js +1 -1
  94. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  95. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js +1 -1
  96. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js +1 -1
  98. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  99. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js +1 -1
  100. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/auth/reset-password/route.js +1 -1
  102. package/app/.next-cli-build/server/app/api/auth/reset-password/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/auth/saml/acs/route.js +2 -2
  104. package/app/.next-cli-build/server/app/api/auth/saml/acs/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/auth/saml/metadata/route.js +2 -2
  106. package/app/.next-cli-build/server/app/api/auth/saml/metadata/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/auth/saml/start/route.js +2 -2
  108. package/app/.next-cli-build/server/app/api/auth/saml/start/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/auth/saml/test/route.js +2 -2
  110. package/app/.next-cli-build/server/app/api/auth/saml/test/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/auth/status/route.js +1 -1
  112. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js +3 -3
  114. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
  116. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
  118. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js +1 -1
  120. package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js +1 -1
  122. package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js +1 -1
  124. package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js +2 -2
  126. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js +2 -2
  128. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js +1 -1
  130. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js +1 -1
  132. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js +2 -2
  134. package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/cli-tools/devin-settings/route.js +1 -1
  136. package/app/.next-cli-build/server/app/api/cli-tools/devin-settings/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js +2 -2
  138. package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/cli-tools/grok-build-settings/route.js +1 -1
  140. package/app/.next-cli-build/server/app/api/cli-tools/grok-build-settings/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js +1 -1
  142. package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js +2 -2
  144. package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js +1 -1
  146. package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
  148. package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js +2 -2
  150. package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/combos/[id]/route.js +1 -1
  152. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/combos/route.js +1 -1
  154. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/headroom/extras/route.js +1 -1
  156. package/app/.next-cli-build/server/app/api/headroom/extras/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/headroom/proxy/[...path]/route.js +1 -1
  158. package/app/.next-cli-build/server/app/api/headroom/proxy/[...path]/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/headroom/restart/route.js +1 -1
  160. package/app/.next-cli-build/server/app/api/headroom/restart/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/headroom/start/route.js +1 -1
  162. package/app/.next-cli-build/server/app/api/headroom/start/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/headroom/status/route.js +1 -1
  164. package/app/.next-cli-build/server/app/api/headroom/status/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/headroom/stop/route.js +1 -1
  166. package/app/.next-cli-build/server/app/api/headroom/stop/route.js.nft.json +1 -1
  167. package/app/.next-cli-build/server/app/api/health/route.js +1 -1
  168. package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/init/route.js +1 -1
  170. package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
  171. package/app/.next-cli-build/server/app/api/keys/[id]/route.js +1 -1
  172. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  173. package/app/.next-cli-build/server/app/api/keys/route.js +1 -1
  174. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/locale/route.js +1 -1
  176. package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js +1 -1
  178. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js +1 -1
  180. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  181. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
  182. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -1
  184. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js +1 -1
  186. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  187. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js +1 -1
  188. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  189. package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js +1 -1
  190. package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/models/alias/route.js +1 -1
  192. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  193. package/app/.next-cli-build/server/app/api/models/availability/route.js +1 -1
  194. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  195. package/app/.next-cli-build/server/app/api/models/custom/route.js +1 -1
  196. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  197. package/app/.next-cli-build/server/app/api/models/disabled/route.js +1 -1
  198. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  199. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  200. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  201. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  202. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  203. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  204. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  205. package/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/route.js +1 -0
  206. package/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/route.js.nft.json +1 -0
  207. package/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/route_client-reference-manifest.js +1 -0
  208. package/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/checkin/route.js +1 -0
  209. package/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/checkin/route.js.nft.json +1 -0
  210. package/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/checkin/route_client-reference-manifest.js +1 -0
  211. package/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/export/route.js +1 -0
  212. package/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/export/route.js.nft.json +1 -0
  213. package/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/export/route_client-reference-manifest.js +1 -0
  214. package/app/.next-cli-build/server/app/api/oauth/codex/bulk-import/route.js +1 -1
  215. package/app/.next-cli-build/server/app/api/oauth/codex/bulk-import/route.js.nft.json +1 -1
  216. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js +1 -1
  217. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  218. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js +1 -1
  219. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  220. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js +1 -1
  221. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  222. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js +1 -1
  223. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  224. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js +1 -1
  225. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  226. package/app/.next-cli-build/server/app/api/oauth/kiro/api-key/route.js +1 -1
  227. package/app/.next-cli-build/server/app/api/oauth/kiro/api-key/route.js.nft.json +1 -1
  228. package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js +1 -1
  229. package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
  230. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js +1 -1
  231. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  232. package/app/.next-cli-build/server/app/api/oauth/kiro/import-cli-proxy/route.js +1 -1
  233. package/app/.next-cli-build/server/app/api/oauth/kiro/import-cli-proxy/route.js.nft.json +1 -1
  234. package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js +1 -1
  235. package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
  236. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
  237. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  238. package/app/.next-cli-build/server/app/api/pricing/route.js +1 -1
  239. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  240. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js +1 -1
  241. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  242. package/app/.next-cli-build/server/app/api/provider-nodes/route.js +1 -1
  243. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  244. package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js +1 -1
  245. package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
  246. package/app/.next-cli-build/server/app/api/providers/[id]/json-models/route.js +1 -1
  247. package/app/.next-cli-build/server/app/api/providers/[id]/json-models/route.js.nft.json +1 -1
  248. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js +1 -1
  249. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  250. package/app/.next-cli-build/server/app/api/providers/[id]/route.js +1 -1
  251. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  252. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js +1 -1
  253. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  254. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  255. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  256. package/app/.next-cli-build/server/app/api/providers/client/route.js +1 -1
  257. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  258. package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js +1 -1
  259. package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
  260. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  261. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  262. package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js +1 -1
  263. package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
  264. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js +1 -1
  265. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  266. package/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  267. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  268. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js +1 -1
  269. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  270. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js +1 -1
  271. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  272. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js +2 -2
  273. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  274. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js +2 -2
  275. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  276. package/app/.next-cli-build/server/app/api/proxy-pools/route.js +1 -1
  277. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  278. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js +2 -2
  279. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  280. package/app/.next-cli-build/server/app/api/pxpipe/health/route.js +2 -2
  281. package/app/.next-cli-build/server/app/api/pxpipe/health/route.js.nft.json +1 -1
  282. package/app/.next-cli-build/server/app/api/pxpipe/install/route.js +2 -2
  283. package/app/.next-cli-build/server/app/api/pxpipe/install/route.js.nft.json +1 -1
  284. package/app/.next-cli-build/server/app/api/pxpipe/logs/route.js +2 -2
  285. package/app/.next-cli-build/server/app/api/pxpipe/logs/route.js.nft.json +1 -1
  286. package/app/.next-cli-build/server/app/api/pxpipe/restart/route.js +2 -2
  287. package/app/.next-cli-build/server/app/api/pxpipe/restart/route.js.nft.json +1 -1
  288. package/app/.next-cli-build/server/app/api/pxpipe/start/route.js +2 -2
  289. package/app/.next-cli-build/server/app/api/pxpipe/start/route.js.nft.json +1 -1
  290. package/app/.next-cli-build/server/app/api/pxpipe/stats/route.js +2 -2
  291. package/app/.next-cli-build/server/app/api/pxpipe/stats/route.js.nft.json +1 -1
  292. package/app/.next-cli-build/server/app/api/pxpipe/status/route.js +2 -2
  293. package/app/.next-cli-build/server/app/api/pxpipe/status/route.js.nft.json +1 -1
  294. package/app/.next-cli-build/server/app/api/pxpipe/stop/route.js +2 -2
  295. package/app/.next-cli-build/server/app/api/pxpipe/stop/route.js.nft.json +1 -1
  296. package/app/.next-cli-build/server/app/api/settings/database/import-usage/route.js +1 -1
  297. package/app/.next-cli-build/server/app/api/settings/database/import-usage/route.js.nft.json +1 -1
  298. package/app/.next-cli-build/server/app/api/settings/database/route.js +1 -1
  299. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  300. package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js +1 -1
  301. package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
  302. package/app/.next-cli-build/server/app/api/settings/require-login/route.js +1 -1
  303. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  304. package/app/.next-cli-build/server/app/api/settings/route.js +1 -1
  305. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  306. package/app/.next-cli-build/server/app/api/shutdown/route.js +1 -1
  307. package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
  308. package/app/.next-cli-build/server/app/api/tags/route.js +1 -1
  309. package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
  310. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  311. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
  312. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +2 -2
  313. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
  314. package/app/.next-cli-build/server/app/api/translator/load/route.js +1 -1
  315. package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
  316. package/app/.next-cli-build/server/app/api/translator/save/route.js +1 -1
  317. package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
  318. package/app/.next-cli-build/server/app/api/translator/send/route.js +1 -1
  319. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  320. package/app/.next-cli-build/server/app/api/translator/translate/route.js +1 -1
  321. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  322. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js +1 -1
  323. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  324. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js +1 -1
  325. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  326. package/app/.next-cli-build/server/app/api/tunnel/status/route.js +1 -1
  327. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  328. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js +1 -1
  329. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  330. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js +1 -1
  331. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  332. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js +1 -1
  333. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  334. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js +2 -2
  335. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  336. package/app/.next-cli-build/server/app/api/usage/[connectionId]/codex-reset-credits/route.js +1 -1
  337. package/app/.next-cli-build/server/app/api/usage/[connectionId]/codex-reset-credits/route.js.nft.json +1 -1
  338. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js +1 -1
  339. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  340. package/app/.next-cli-build/server/app/api/usage/chart/route.js +1 -1
  341. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  342. package/app/.next-cli-build/server/app/api/usage/history/route.js +1 -1
  343. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  344. package/app/.next-cli-build/server/app/api/usage/logs/route.js +1 -1
  345. package/app/.next-cli-build/server/app/api/usage/logs/route.js.nft.json +1 -1
  346. package/app/.next-cli-build/server/app/api/usage/providers/route.js +1 -1
  347. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  348. package/app/.next-cli-build/server/app/api/usage/request-details/route.js +1 -1
  349. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  350. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js +1 -1
  351. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  352. package/app/.next-cli-build/server/app/api/usage/stats/route.js +1 -1
  353. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  354. package/app/.next-cli-build/server/app/api/usage/stream/route.js +2 -2
  355. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  356. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js +1 -1
  357. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  358. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js +1 -1
  359. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  360. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js +1 -1
  361. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  362. package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js +1 -1
  363. package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
  364. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js +1 -1
  365. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  366. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js +1 -1
  367. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  368. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js +2 -2
  369. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  370. package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js +1 -1
  371. package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
  372. package/app/.next-cli-build/server/app/api/v1/messages/route.js +1 -1
  373. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  374. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js +1 -1
  375. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  376. package/app/.next-cli-build/server/app/api/v1/models/info/route.js +1 -1
  377. package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
  378. package/app/.next-cli-build/server/app/api/v1/models/route.js +1 -1
  379. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  380. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js +1 -1
  381. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  382. package/app/.next-cli-build/server/app/api/v1/responses/route.js +1 -1
  383. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  384. package/app/.next-cli-build/server/app/api/v1/route.js +1 -1
  385. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  386. package/app/.next-cli-build/server/app/api/v1/search/route.js +1 -1
  387. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  388. package/app/.next-cli-build/server/app/api/v1/videos/[id]/route.js +1 -1
  389. package/app/.next-cli-build/server/app/api/v1/videos/[id]/route.js.nft.json +1 -1
  390. package/app/.next-cli-build/server/app/api/v1/videos/edits/route.js +1 -1
  391. package/app/.next-cli-build/server/app/api/v1/videos/edits/route.js.nft.json +1 -1
  392. package/app/.next-cli-build/server/app/api/v1/videos/extensions/route.js +1 -1
  393. package/app/.next-cli-build/server/app/api/v1/videos/extensions/route.js.nft.json +1 -1
  394. package/app/.next-cli-build/server/app/api/v1/videos/generations/route.js +1 -1
  395. package/app/.next-cli-build/server/app/api/v1/videos/generations/route.js.nft.json +1 -1
  396. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js +1 -1
  397. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  398. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js +1 -1
  399. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  400. package/app/.next-cli-build/server/app/api/v1beta/models/route.js +1 -1
  401. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  402. package/app/.next-cli-build/server/app/api/version/route.js +1 -1
  403. package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
  404. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  405. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  406. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  407. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  408. package/app/.next-cli-build/server/app/callback/page.js +1 -1
  409. package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
  410. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  411. package/app/.next-cli-build/server/app/callback.html +1 -1
  412. package/app/.next-cli-build/server/app/callback.rsc +5 -5
  413. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +5 -5
  414. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
  415. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +5 -5
  416. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  417. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +7 -7
  418. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +7 -7
  419. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +7 -7
  420. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  421. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  422. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +7 -7
  423. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +7 -7
  424. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +7 -7
  425. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  426. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  427. package/app/.next-cli-build/server/app/dashboard/combos.rsc +7 -7
  428. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +7 -7
  429. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +7 -7
  430. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  431. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  432. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +7 -7
  433. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +7 -7
  434. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +7 -7
  435. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  436. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  437. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +7 -7
  438. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +7 -7
  439. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +7 -7
  440. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
  441. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  442. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +7 -7
  443. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +7 -7
  444. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +7 -7
  445. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  446. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  447. package/app/.next-cli-build/server/app/dashboard/profile.rsc +7 -7
  448. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +7 -7
  449. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +7 -7
  450. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  451. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  452. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +7 -7
  453. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +7 -7
  454. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +7 -7
  455. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  456. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  457. package/app/.next-cli-build/server/app/dashboard/providers.rsc +7 -7
  458. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +7 -7
  459. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +7 -7
  460. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  461. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  462. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +7 -7
  463. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +7 -7
  464. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +7 -7
  465. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  466. package/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
  467. package/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +7 -7
  468. package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +7 -7
  469. package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +7 -7
  470. package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +2 -2
  471. package/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  472. package/app/.next-cli-build/server/app/dashboard/quota.rsc +8 -8
  473. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +8 -8
  474. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +8 -8
  475. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  476. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js +1 -1
  477. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  478. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  479. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  480. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +5 -5
  481. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +5 -5
  482. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  483. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +5 -5
  484. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  485. package/app/.next-cli-build/server/app/dashboard/skills.rsc +7 -7
  486. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +7 -7
  487. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +7 -7
  488. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
  489. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  490. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +7 -7
  491. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +7 -7
  492. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +7 -7
  493. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
  494. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  495. package/app/.next-cli-build/server/app/dashboard/translator.rsc +7 -7
  496. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +7 -7
  497. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +7 -7
  498. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  499. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  500. package/app/.next-cli-build/server/app/dashboard/usage.rsc +7 -7
  501. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +7 -7
  502. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +7 -7
  503. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  504. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  505. package/app/.next-cli-build/server/app/dashboard.rsc +7 -7
  506. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +7 -7
  507. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +7 -7
  508. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  509. package/app/.next-cli-build/server/app/favicon.ico/route.js +1 -1
  510. package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
  511. package/app/.next-cli-build/server/app/index.html +1 -1
  512. package/app/.next-cli-build/server/app/index.rsc +5 -5
  513. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +5 -5
  514. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +5 -5
  515. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
  516. package/app/.next-cli-build/server/app/landing/page.js +1 -1
  517. package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
  518. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  519. package/app/.next-cli-build/server/app/landing.html +1 -1
  520. package/app/.next-cli-build/server/app/landing.rsc +5 -5
  521. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
  522. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
  523. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +5 -5
  524. package/app/.next-cli-build/server/app/login/page.js +1 -1
  525. package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
  526. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  527. package/app/.next-cli-build/server/app/login.html +1 -1
  528. package/app/.next-cli-build/server/app/login.rsc +6 -6
  529. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +6 -6
  530. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
  531. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +6 -6
  532. package/app/.next-cli-build/server/app/manifest.webmanifest/route.js +2 -2
  533. package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  534. package/app/.next-cli-build/server/app/page.js +1 -1
  535. package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
  536. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  537. package/app/.next-cli-build/server/app-paths-manifest.json +10 -7
  538. package/app/.next-cli-build/server/chunks/{6832.js → 1332.js} +1 -1
  539. package/app/.next-cli-build/server/chunks/1377.js +1 -1
  540. package/app/.next-cli-build/server/chunks/1564.js +1 -0
  541. package/app/.next-cli-build/server/chunks/1636.js +1 -0
  542. package/app/.next-cli-build/server/chunks/1937.js +1 -0
  543. package/app/.next-cli-build/server/chunks/2179.js +1 -0
  544. package/app/.next-cli-build/server/chunks/2732.js +1 -0
  545. package/app/.next-cli-build/server/chunks/295.js +1 -0
  546. package/app/.next-cli-build/server/chunks/318.js +3 -3
  547. package/app/.next-cli-build/server/chunks/3212.js +1 -1
  548. package/app/.next-cli-build/server/chunks/3350.js +1 -1
  549. package/app/.next-cli-build/server/chunks/3943.js +1 -1
  550. package/app/.next-cli-build/server/chunks/3962.js +1 -0
  551. package/app/.next-cli-build/server/chunks/4037.js +1 -1
  552. package/app/.next-cli-build/server/chunks/412.js +1 -1
  553. package/app/.next-cli-build/server/chunks/4123.js +1 -1
  554. package/app/.next-cli-build/server/chunks/4125.js +1 -1
  555. package/app/.next-cli-build/server/chunks/5217.js +1 -1
  556. package/app/.next-cli-build/server/chunks/5612.js +1 -1
  557. package/app/.next-cli-build/server/chunks/5615.js +1 -1
  558. package/app/.next-cli-build/server/chunks/5781.js +2 -2
  559. package/app/.next-cli-build/server/chunks/6070.js +1 -1
  560. package/app/.next-cli-build/server/chunks/615.js +1 -1
  561. package/app/.next-cli-build/server/chunks/6212.js +1 -0
  562. package/app/.next-cli-build/server/chunks/6306.js +1 -1
  563. package/app/.next-cli-build/server/chunks/6326.js +1 -0
  564. package/app/.next-cli-build/server/chunks/6457.js +2 -2
  565. package/app/.next-cli-build/server/chunks/653.js +1 -0
  566. package/app/.next-cli-build/server/chunks/6763.js +1 -1
  567. package/app/.next-cli-build/server/chunks/6877.js +1 -1
  568. package/app/.next-cli-build/server/chunks/7211.js +1 -1
  569. package/app/.next-cli-build/server/chunks/7239.js +63 -0
  570. package/app/.next-cli-build/server/chunks/7247.js +1 -0
  571. package/app/.next-cli-build/server/chunks/7598.js +1 -0
  572. package/app/.next-cli-build/server/chunks/7774.js +3 -3
  573. package/app/.next-cli-build/server/chunks/8038.js +1 -1
  574. package/app/.next-cli-build/server/chunks/8162.js +6 -0
  575. package/app/.next-cli-build/server/chunks/8444.js +3 -0
  576. package/app/.next-cli-build/server/chunks/869.js +1 -1
  577. package/app/.next-cli-build/server/chunks/8838.js +1 -0
  578. package/app/.next-cli-build/server/chunks/8895.js +7 -7
  579. package/app/.next-cli-build/server/chunks/8920.js +1 -1
  580. package/app/.next-cli-build/server/chunks/{5448.js → 9140.js} +4 -4
  581. package/app/.next-cli-build/server/chunks/9463.js +1 -0
  582. package/app/.next-cli-build/server/chunks/9609.js +1 -0
  583. package/app/.next-cli-build/server/chunks/9703.js +2 -2
  584. package/app/.next-cli-build/server/instrumentation.js +1 -1
  585. package/app/.next-cli-build/server/instrumentation.js.nft.json +1 -1
  586. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  587. package/app/.next-cli-build/server/middleware.js +4 -4
  588. package/app/.next-cli-build/server/middleware.js.nft.json +1 -1
  589. package/app/.next-cli-build/server/pages/404.html +1 -1
  590. package/app/.next-cli-build/server/pages/500.html +1 -1
  591. package/app/.next-cli-build/static/chunks/1321-656ff6a3f06c59ae.js +1 -0
  592. package/app/.next-cli-build/static/chunks/{5116-bd22c80869d4be20.js → 5116-4618105f24431c4a.js} +1 -1
  593. package/app/.next-cli-build/static/chunks/5497-7b21d4160c9e592e.js +7 -0
  594. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-ddb08251c0405731.js +1 -0
  595. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-a2431d795923337a.js +14 -0
  596. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-595256b6306fa952.js +1 -0
  597. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-568a544f8e220d5b.js +1 -0
  598. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/skills/page-e16aaf24dc525a49.js +1 -0
  599. package/app/.next-cli-build/static/chunks/app/(dashboard)/layout-a52d19cb5aacd04f.js +1 -0
  600. package/app/.next-cli-build/static/chunks/app/_global-error/page-610e2a51edf6ccba.js +1 -0
  601. package/app/.next-cli-build/static/chunks/app/api/auth/login/route-610e2a51edf6ccba.js +1 -0
  602. package/app/.next-cli-build/static/chunks/app/api/auth/logout/route-610e2a51edf6ccba.js +1 -0
  603. package/app/.next-cli-build/static/chunks/app/api/auth/oidc/callback/route-610e2a51edf6ccba.js +1 -0
  604. package/app/.next-cli-build/static/chunks/app/api/auth/oidc/start/route-610e2a51edf6ccba.js +1 -0
  605. package/app/.next-cli-build/static/chunks/app/api/auth/oidc/test/route-610e2a51edf6ccba.js +1 -0
  606. package/app/.next-cli-build/static/chunks/app/api/auth/reset-password/route-610e2a51edf6ccba.js +1 -0
  607. package/app/.next-cli-build/static/chunks/app/api/auth/saml/acs/route-610e2a51edf6ccba.js +1 -0
  608. package/app/.next-cli-build/static/chunks/app/api/auth/saml/metadata/route-610e2a51edf6ccba.js +1 -0
  609. package/app/.next-cli-build/static/chunks/app/api/auth/saml/start/route-610e2a51edf6ccba.js +1 -0
  610. package/app/.next-cli-build/static/chunks/app/api/auth/saml/test/route-610e2a51edf6ccba.js +1 -0
  611. package/app/.next-cli-build/static/chunks/app/api/auth/status/route-610e2a51edf6ccba.js +1 -0
  612. package/app/.next-cli-build/static/chunks/app/api/cli-tools/all-statuses/route-610e2a51edf6ccba.js +1 -0
  613. package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-610e2a51edf6ccba.js +1 -0
  614. package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/route-610e2a51edf6ccba.js +1 -0
  615. package/app/.next-cli-build/static/chunks/app/api/cli-tools/claude-settings/route-610e2a51edf6ccba.js +1 -0
  616. package/app/.next-cli-build/static/chunks/app/api/cli-tools/cline-settings/route-610e2a51edf6ccba.js +1 -0
  617. package/app/.next-cli-build/static/chunks/app/api/cli-tools/codex-settings/route-610e2a51edf6ccba.js +1 -0
  618. package/app/.next-cli-build/static/chunks/app/api/cli-tools/copilot-settings/route-610e2a51edf6ccba.js +1 -0
  619. package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-610e2a51edf6ccba.js +1 -0
  620. package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-610e2a51edf6ccba.js +1 -0
  621. package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-settings/route-610e2a51edf6ccba.js +1 -0
  622. package/app/.next-cli-build/static/chunks/app/api/cli-tools/deepseek-tui-settings/route-610e2a51edf6ccba.js +1 -0
  623. package/app/.next-cli-build/static/chunks/app/api/cli-tools/devin-settings/route-610e2a51edf6ccba.js +1 -0
  624. package/app/.next-cli-build/static/chunks/app/api/cli-tools/droid-settings/route-610e2a51edf6ccba.js +1 -0
  625. package/app/.next-cli-build/static/chunks/app/api/cli-tools/grok-build-settings/route-610e2a51edf6ccba.js +1 -0
  626. package/app/.next-cli-build/static/chunks/app/api/cli-tools/hermes-settings/route-610e2a51edf6ccba.js +1 -0
  627. package/app/.next-cli-build/static/chunks/app/api/cli-tools/jcode-settings/route-610e2a51edf6ccba.js +1 -0
  628. package/app/.next-cli-build/static/chunks/app/api/cli-tools/kilo-settings/route-610e2a51edf6ccba.js +1 -0
  629. package/app/.next-cli-build/static/chunks/app/api/cli-tools/openclaw-settings/route-610e2a51edf6ccba.js +1 -0
  630. package/app/.next-cli-build/static/chunks/app/api/cli-tools/opencode-settings/route-610e2a51edf6ccba.js +1 -0
  631. package/app/.next-cli-build/static/chunks/app/api/combos/[id]/route-610e2a51edf6ccba.js +1 -0
  632. package/app/.next-cli-build/static/chunks/app/api/combos/route-610e2a51edf6ccba.js +1 -0
  633. package/app/.next-cli-build/static/chunks/app/api/headroom/extras/route-610e2a51edf6ccba.js +1 -0
  634. package/app/.next-cli-build/static/chunks/app/api/headroom/proxy/[...path]/route-610e2a51edf6ccba.js +1 -0
  635. package/app/.next-cli-build/static/chunks/app/api/headroom/restart/route-610e2a51edf6ccba.js +1 -0
  636. package/app/.next-cli-build/static/chunks/app/api/headroom/start/route-610e2a51edf6ccba.js +1 -0
  637. package/app/.next-cli-build/static/chunks/app/api/headroom/status/route-610e2a51edf6ccba.js +1 -0
  638. package/app/.next-cli-build/static/chunks/app/api/headroom/stop/route-610e2a51edf6ccba.js +1 -0
  639. package/app/.next-cli-build/static/chunks/app/api/health/route-610e2a51edf6ccba.js +1 -0
  640. package/app/.next-cli-build/static/chunks/app/api/init/route-610e2a51edf6ccba.js +1 -0
  641. package/app/.next-cli-build/static/chunks/app/api/keys/[id]/route-610e2a51edf6ccba.js +1 -0
  642. package/app/.next-cli-build/static/chunks/app/api/keys/route-610e2a51edf6ccba.js +1 -0
  643. package/app/.next-cli-build/static/chunks/app/api/locale/route-610e2a51edf6ccba.js +1 -0
  644. package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/message/route-610e2a51edf6ccba.js +1 -0
  645. package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/sse/route-610e2a51edf6ccba.js +1 -0
  646. package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/deepgram/voices/route-610e2a51edf6ccba.js +1 -0
  647. package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-610e2a51edf6ccba.js +1 -0
  648. package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/inworld/voices/route-610e2a51edf6ccba.js +1 -0
  649. package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/minimax/voices/route-610e2a51edf6ccba.js +1 -0
  650. package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/voices/route-610e2a51edf6ccba.js +1 -0
  651. package/app/.next-cli-build/static/chunks/app/api/models/alias/route-610e2a51edf6ccba.js +1 -0
  652. package/app/.next-cli-build/static/chunks/app/api/models/availability/route-610e2a51edf6ccba.js +1 -0
  653. package/app/.next-cli-build/static/chunks/app/api/models/custom/route-610e2a51edf6ccba.js +1 -0
  654. package/app/.next-cli-build/static/chunks/app/api/models/disabled/route-610e2a51edf6ccba.js +1 -0
  655. package/app/.next-cli-build/static/chunks/app/api/models/route-610e2a51edf6ccba.js +1 -0
  656. package/app/.next-cli-build/static/chunks/app/api/models/test/route-610e2a51edf6ccba.js +1 -0
  657. package/app/.next-cli-build/static/chunks/app/api/oauth/[provider]/[action]/route-610e2a51edf6ccba.js +1 -0
  658. package/app/.next-cli-build/static/chunks/app/api/oauth/codebuddy-cn/bulk-import/route-610e2a51edf6ccba.js +1 -0
  659. package/app/.next-cli-build/static/chunks/app/api/oauth/codebuddy-cn/checkin/route-610e2a51edf6ccba.js +1 -0
  660. package/app/.next-cli-build/static/chunks/app/api/oauth/codebuddy-cn/export/route-610e2a51edf6ccba.js +1 -0
  661. package/app/.next-cli-build/static/chunks/app/api/oauth/codex/bulk-import/route-610e2a51edf6ccba.js +1 -0
  662. package/app/.next-cli-build/static/chunks/app/api/oauth/codex/import-token/route-610e2a51edf6ccba.js +1 -0
  663. package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/auto-import/route-610e2a51edf6ccba.js +1 -0
  664. package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/import/route-610e2a51edf6ccba.js +1 -0
  665. package/app/.next-cli-build/static/chunks/app/api/oauth/gitlab/pat/route-610e2a51edf6ccba.js +1 -0
  666. package/app/.next-cli-build/static/chunks/app/api/oauth/iflow/cookie/route-610e2a51edf6ccba.js +1 -0
  667. package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/api-key/route-610e2a51edf6ccba.js +1 -0
  668. package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/auto-import/route-610e2a51edf6ccba.js +1 -0
  669. package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/import/route-610e2a51edf6ccba.js +1 -0
  670. package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/import-cli-proxy/route-610e2a51edf6ccba.js +1 -0
  671. package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-authorize/route-610e2a51edf6ccba.js +1 -0
  672. package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-exchange/route-610e2a51edf6ccba.js +1 -0
  673. package/app/.next-cli-build/static/chunks/app/api/pricing/route-610e2a51edf6ccba.js +1 -0
  674. package/app/.next-cli-build/static/chunks/app/api/provider-nodes/[id]/route-610e2a51edf6ccba.js +1 -0
  675. package/app/.next-cli-build/static/chunks/app/api/provider-nodes/route-610e2a51edf6ccba.js +1 -0
  676. package/app/.next-cli-build/static/chunks/app/api/provider-nodes/validate/route-610e2a51edf6ccba.js +1 -0
  677. package/app/.next-cli-build/static/chunks/app/api/providers/[id]/json-models/route-610e2a51edf6ccba.js +1 -0
  678. package/app/.next-cli-build/static/chunks/app/api/providers/[id]/models/route-610e2a51edf6ccba.js +1 -0
  679. package/app/.next-cli-build/static/chunks/app/api/providers/[id]/route-610e2a51edf6ccba.js +1 -0
  680. package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test/route-610e2a51edf6ccba.js +1 -0
  681. package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test-models/route-610e2a51edf6ccba.js +1 -0
  682. package/app/.next-cli-build/static/chunks/app/api/providers/client/route-610e2a51edf6ccba.js +1 -0
  683. package/app/.next-cli-build/static/chunks/app/api/providers/kilo/free-models/route-610e2a51edf6ccba.js +1 -0
  684. package/app/.next-cli-build/static/chunks/app/api/providers/route-610e2a51edf6ccba.js +1 -0
  685. package/app/.next-cli-build/static/chunks/app/api/providers/suggested-models/route-610e2a51edf6ccba.js +1 -0
  686. package/app/.next-cli-build/static/chunks/app/api/providers/test-batch/route-610e2a51edf6ccba.js +1 -0
  687. package/app/.next-cli-build/static/chunks/app/api/providers/validate/route-610e2a51edf6ccba.js +1 -0
  688. package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/route-610e2a51edf6ccba.js +1 -0
  689. package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/test/route-610e2a51edf6ccba.js +1 -0
  690. package/app/.next-cli-build/static/chunks/app/api/proxy-pools/cloudflare-deploy/route-610e2a51edf6ccba.js +1 -0
  691. package/app/.next-cli-build/static/chunks/app/api/proxy-pools/deno-deploy/route-610e2a51edf6ccba.js +1 -0
  692. package/app/.next-cli-build/static/chunks/app/api/proxy-pools/route-610e2a51edf6ccba.js +1 -0
  693. package/app/.next-cli-build/static/chunks/app/api/proxy-pools/vercel-deploy/route-610e2a51edf6ccba.js +1 -0
  694. package/app/.next-cli-build/static/chunks/app/api/pxpipe/health/route-610e2a51edf6ccba.js +1 -0
  695. package/app/.next-cli-build/static/chunks/app/api/pxpipe/install/route-610e2a51edf6ccba.js +1 -0
  696. package/app/.next-cli-build/static/chunks/app/api/pxpipe/logs/route-610e2a51edf6ccba.js +1 -0
  697. package/app/.next-cli-build/static/chunks/app/api/pxpipe/restart/route-610e2a51edf6ccba.js +1 -0
  698. package/app/.next-cli-build/static/chunks/app/api/pxpipe/start/route-610e2a51edf6ccba.js +1 -0
  699. package/app/.next-cli-build/static/chunks/app/api/pxpipe/stats/route-610e2a51edf6ccba.js +1 -0
  700. package/app/.next-cli-build/static/chunks/app/api/pxpipe/status/route-610e2a51edf6ccba.js +1 -0
  701. package/app/.next-cli-build/static/chunks/app/api/pxpipe/stop/route-610e2a51edf6ccba.js +1 -0
  702. package/app/.next-cli-build/static/chunks/app/api/settings/database/import-usage/route-610e2a51edf6ccba.js +1 -0
  703. package/app/.next-cli-build/static/chunks/app/api/settings/database/route-610e2a51edf6ccba.js +1 -0
  704. package/app/.next-cli-build/static/chunks/app/api/settings/proxy-test/route-610e2a51edf6ccba.js +1 -0
  705. package/app/.next-cli-build/static/chunks/app/api/settings/require-login/route-610e2a51edf6ccba.js +1 -0
  706. package/app/.next-cli-build/static/chunks/app/api/settings/route-610e2a51edf6ccba.js +1 -0
  707. package/app/.next-cli-build/static/chunks/app/api/shutdown/route-610e2a51edf6ccba.js +1 -0
  708. package/app/.next-cli-build/static/chunks/app/api/tags/route-610e2a51edf6ccba.js +1 -0
  709. package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/route-610e2a51edf6ccba.js +1 -0
  710. package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/stream/route-610e2a51edf6ccba.js +1 -0
  711. package/app/.next-cli-build/static/chunks/app/api/translator/load/route-610e2a51edf6ccba.js +1 -0
  712. package/app/.next-cli-build/static/chunks/app/api/translator/save/route-610e2a51edf6ccba.js +1 -0
  713. package/app/.next-cli-build/static/chunks/app/api/translator/send/route-610e2a51edf6ccba.js +1 -0
  714. package/app/.next-cli-build/static/chunks/app/api/translator/translate/route-610e2a51edf6ccba.js +1 -0
  715. package/app/.next-cli-build/static/chunks/app/api/tunnel/disable/route-610e2a51edf6ccba.js +1 -0
  716. package/app/.next-cli-build/static/chunks/app/api/tunnel/enable/route-610e2a51edf6ccba.js +1 -0
  717. package/app/.next-cli-build/static/chunks/app/api/tunnel/status/route-610e2a51edf6ccba.js +1 -0
  718. package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-check/route-610e2a51edf6ccba.js +1 -0
  719. package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-disable/route-610e2a51edf6ccba.js +1 -0
  720. package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-enable/route-610e2a51edf6ccba.js +1 -0
  721. package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-install/route-610e2a51edf6ccba.js +1 -0
  722. package/app/.next-cli-build/static/chunks/app/api/usage/[connectionId]/codex-reset-credits/route-610e2a51edf6ccba.js +1 -0
  723. package/app/.next-cli-build/static/chunks/app/api/usage/[connectionId]/route-610e2a51edf6ccba.js +1 -0
  724. package/app/.next-cli-build/static/chunks/app/api/usage/chart/route-610e2a51edf6ccba.js +1 -0
  725. package/app/.next-cli-build/static/chunks/app/api/usage/history/route-610e2a51edf6ccba.js +1 -0
  726. package/app/.next-cli-build/static/chunks/app/api/usage/logs/route-610e2a51edf6ccba.js +1 -0
  727. package/app/.next-cli-build/static/chunks/app/api/usage/providers/route-610e2a51edf6ccba.js +1 -0
  728. package/app/.next-cli-build/static/chunks/app/api/usage/request-details/route-610e2a51edf6ccba.js +1 -0
  729. package/app/.next-cli-build/static/chunks/app/api/usage/request-logs/route-610e2a51edf6ccba.js +1 -0
  730. package/app/.next-cli-build/static/chunks/app/api/usage/stats/route-610e2a51edf6ccba.js +1 -0
  731. package/app/.next-cli-build/static/chunks/app/api/usage/stream/route-610e2a51edf6ccba.js +1 -0
  732. package/app/.next-cli-build/static/chunks/app/api/v1/api/chat/route-610e2a51edf6ccba.js +1 -0
  733. package/app/.next-cli-build/static/chunks/app/api/v1/audio/speech/route-610e2a51edf6ccba.js +1 -0
  734. package/app/.next-cli-build/static/chunks/app/api/v1/audio/transcriptions/route-610e2a51edf6ccba.js +1 -0
  735. package/app/.next-cli-build/static/chunks/app/api/v1/audio/voices/route-610e2a51edf6ccba.js +1 -0
  736. package/app/.next-cli-build/static/chunks/app/api/v1/chat/completions/route-610e2a51edf6ccba.js +1 -0
  737. package/app/.next-cli-build/static/chunks/app/api/v1/embeddings/route-610e2a51edf6ccba.js +1 -0
  738. package/app/.next-cli-build/static/chunks/app/api/v1/images/generations/route-610e2a51edf6ccba.js +1 -0
  739. package/app/.next-cli-build/static/chunks/app/api/v1/messages/count_tokens/route-610e2a51edf6ccba.js +1 -0
  740. package/app/.next-cli-build/static/chunks/app/api/v1/messages/route-610e2a51edf6ccba.js +1 -0
  741. package/app/.next-cli-build/static/chunks/app/api/v1/models/[kind]/route-610e2a51edf6ccba.js +1 -0
  742. package/app/.next-cli-build/static/chunks/app/api/v1/models/info/route-610e2a51edf6ccba.js +1 -0
  743. package/app/.next-cli-build/static/chunks/app/api/v1/models/route-610e2a51edf6ccba.js +1 -0
  744. package/app/.next-cli-build/static/chunks/app/api/v1/responses/compact/route-610e2a51edf6ccba.js +1 -0
  745. package/app/.next-cli-build/static/chunks/app/api/v1/responses/route-610e2a51edf6ccba.js +1 -0
  746. package/app/.next-cli-build/static/chunks/app/api/v1/route-610e2a51edf6ccba.js +1 -0
  747. package/app/.next-cli-build/static/chunks/app/api/v1/search/route-610e2a51edf6ccba.js +1 -0
  748. package/app/.next-cli-build/static/chunks/app/api/v1/videos/[id]/route-610e2a51edf6ccba.js +1 -0
  749. package/app/.next-cli-build/static/chunks/app/api/v1/videos/edits/route-610e2a51edf6ccba.js +1 -0
  750. package/app/.next-cli-build/static/chunks/app/api/v1/videos/extensions/route-610e2a51edf6ccba.js +1 -0
  751. package/app/.next-cli-build/static/chunks/app/api/v1/videos/generations/route-610e2a51edf6ccba.js +1 -0
  752. package/app/.next-cli-build/static/chunks/app/api/v1/web/fetch/route-610e2a51edf6ccba.js +1 -0
  753. package/app/.next-cli-build/static/chunks/app/api/v1beta/models/[...path]/route-610e2a51edf6ccba.js +1 -0
  754. package/app/.next-cli-build/static/chunks/app/api/v1beta/models/route-610e2a51edf6ccba.js +1 -0
  755. package/app/.next-cli-build/static/chunks/app/api/version/route-610e2a51edf6ccba.js +1 -0
  756. package/app/.next-cli-build/static/chunks/app/api/version/shutdown/route-610e2a51edf6ccba.js +1 -0
  757. package/app/.next-cli-build/static/chunks/app/api/version/update/route-610e2a51edf6ccba.js +1 -0
  758. package/app/.next-cli-build/static/chunks/app/manifest.webmanifest/route-610e2a51edf6ccba.js +1 -0
  759. package/app/.next-cli-build/static/chunks/app/page-610e2a51edf6ccba.js +1 -0
  760. package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/app-error-610e2a51edf6ccba.js +1 -0
  761. package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/forbidden-610e2a51edf6ccba.js +1 -0
  762. package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/not-found-610e2a51edf6ccba.js +1 -0
  763. package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/unauthorized-610e2a51edf6ccba.js +1 -0
  764. package/app/.next-cli-build/static/css/87048d3b7e880a4f.css +1 -0
  765. package/app/.next-cli-build/static/rPl9WrF0GIBOKSW3yAMMs/_buildManifest.js +1 -0
  766. package/app/package.json +1 -1
  767. package/app/public/i18n/changelog/en.md +32 -0
  768. package/app/public/i18n/changelog/zh-CN.md +30 -0
  769. package/app/public/i18n/changelog/zh-TW.md +32 -0
  770. package/app/public/i18n/literals/zh-CN.json +46 -1
  771. package/app/public/i18n/literals/zh-TW.json +32 -3
  772. package/app/public/providers/agnes-ai-cn.png +0 -0
  773. package/app/public/providers/agnes-ai.png +0 -0
  774. package/app/public/providers/apinex.png +0 -0
  775. package/app/src/mitm/server.js +2 -2
  776. package/app/src/sse/services/codebuddyCheckin.js +385 -0
  777. package/cli.js +857 -873
  778. package/package.json +1 -1
  779. package/src/cli/i18n/index.js +83 -0
  780. package/src/cli/i18n/locales/en/api-keys.json +31 -0
  781. package/src/cli/i18n/locales/en/core.json +40 -0
  782. package/src/cli/i18n/locales/en/menus-clitools.json +50 -0
  783. package/src/cli/i18n/locales/en/menus-combos.json +76 -0
  784. package/src/cli/i18n/locales/en/menus-providers.json +97 -0
  785. package/src/cli/i18n/locales/en/settings.json +35 -0
  786. package/src/cli/i18n/locales/en/terminal-ui.json +19 -0
  787. package/src/cli/i18n/locales/en/tray.json +15 -0
  788. package/src/cli/i18n/locales/en/utils.json +27 -0
  789. package/src/cli/i18n/locales/zh-CN/api-keys.json +31 -0
  790. package/src/cli/i18n/locales/zh-CN/core.json +40 -0
  791. package/src/cli/i18n/locales/zh-CN/menus-clitools.json +50 -0
  792. package/src/cli/i18n/locales/zh-CN/menus-combos.json +76 -0
  793. package/src/cli/i18n/locales/zh-CN/menus-providers.json +97 -0
  794. package/src/cli/i18n/locales/zh-CN/settings.json +35 -0
  795. package/src/cli/i18n/locales/zh-CN/terminal-ui.json +19 -0
  796. package/src/cli/i18n/locales/zh-CN/tray.json +15 -0
  797. package/src/cli/i18n/locales/zh-CN/utils.json +27 -0
  798. package/src/cli/i18n/locales/zh-TW/api-keys.json +31 -0
  799. package/src/cli/i18n/locales/zh-TW/core.json +40 -0
  800. package/src/cli/i18n/locales/zh-TW/menus-clitools.json +50 -0
  801. package/src/cli/i18n/locales/zh-TW/menus-combos.json +76 -0
  802. package/src/cli/i18n/locales/zh-TW/menus-providers.json +97 -0
  803. package/src/cli/i18n/locales/zh-TW/settings.json +35 -0
  804. package/src/cli/i18n/locales/zh-TW/terminal-ui.json +19 -0
  805. package/src/cli/i18n/locales/zh-TW/tray.json +15 -0
  806. package/src/cli/i18n/locales/zh-TW/utils.json +27 -0
  807. package/src/cli/menus/apiKeys.js +50 -49
  808. package/src/cli/menus/cliTools.js +93 -92
  809. package/src/cli/menus/combos.js +131 -130
  810. package/src/cli/menus/providers.js +142 -138
  811. package/src/cli/menus/settings.js +33 -32
  812. package/src/cli/terminalUI.js +26 -19
  813. package/src/cli/tray/tray.js +14 -13
  814. package/src/cli/utils/format.js +13 -8
  815. package/src/cli/utils/input.js +6 -5
  816. package/src/cli/utils/menuHelper.js +3 -2
  817. package/src/cli/utils/modelSelector.js +6 -5
  818. package/app/.next-cli-build/server/chunks/112.js +0 -3
  819. package/app/.next-cli-build/server/chunks/2283.js +0 -1
  820. package/app/.next-cli-build/server/chunks/3016.js +0 -1
  821. package/app/.next-cli-build/server/chunks/3558.js +0 -1
  822. package/app/.next-cli-build/server/chunks/5699.js +0 -1
  823. package/app/.next-cli-build/server/chunks/7356.js +0 -1
  824. package/app/.next-cli-build/server/chunks/7419.js +0 -1
  825. package/app/.next-cli-build/server/chunks/8123.js +0 -1
  826. package/app/.next-cli-build/server/chunks/8185.js +0 -1
  827. package/app/.next-cli-build/server/chunks/827.js +0 -1
  828. package/app/.next-cli-build/server/chunks/8847.js +0 -1
  829. package/app/.next-cli-build/server/chunks/8936.js +0 -1
  830. package/app/.next-cli-build/server/chunks/915.js +0 -63
  831. package/app/.next-cli-build/static/AFIMSU-vh_yXimJozqVPF/_buildManifest.js +0 -1
  832. package/app/.next-cli-build/static/chunks/1321-ba0a9ba95063bed9.js +0 -1
  833. package/app/.next-cli-build/static/chunks/5497-17b531f18a6a3a3c.js +0 -7
  834. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-90106fd2380ae2f8.js +0 -1
  835. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-928e8fa95cccfc03.js +0 -14
  836. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-bccad1d38f846812.js +0 -1
  837. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-06dd8e4a0a6a89ac.js +0 -1
  838. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/skills/page-19ac7c0fa9dd6792.js +0 -1
  839. package/app/.next-cli-build/static/chunks/app/(dashboard)/layout-f4af951b9e6f6d37.js +0 -1
  840. package/app/.next-cli-build/static/chunks/app/_global-error/page-7c4d396dcbcd6a83.js +0 -1
  841. package/app/.next-cli-build/static/chunks/app/api/auth/login/route-7c4d396dcbcd6a83.js +0 -1
  842. package/app/.next-cli-build/static/chunks/app/api/auth/logout/route-7c4d396dcbcd6a83.js +0 -1
  843. package/app/.next-cli-build/static/chunks/app/api/auth/oidc/callback/route-7c4d396dcbcd6a83.js +0 -1
  844. package/app/.next-cli-build/static/chunks/app/api/auth/oidc/start/route-7c4d396dcbcd6a83.js +0 -1
  845. package/app/.next-cli-build/static/chunks/app/api/auth/oidc/test/route-7c4d396dcbcd6a83.js +0 -1
  846. package/app/.next-cli-build/static/chunks/app/api/auth/reset-password/route-7c4d396dcbcd6a83.js +0 -1
  847. package/app/.next-cli-build/static/chunks/app/api/auth/saml/acs/route-7c4d396dcbcd6a83.js +0 -1
  848. package/app/.next-cli-build/static/chunks/app/api/auth/saml/metadata/route-7c4d396dcbcd6a83.js +0 -1
  849. package/app/.next-cli-build/static/chunks/app/api/auth/saml/start/route-7c4d396dcbcd6a83.js +0 -1
  850. package/app/.next-cli-build/static/chunks/app/api/auth/saml/test/route-7c4d396dcbcd6a83.js +0 -1
  851. package/app/.next-cli-build/static/chunks/app/api/auth/status/route-7c4d396dcbcd6a83.js +0 -1
  852. package/app/.next-cli-build/static/chunks/app/api/cli-tools/all-statuses/route-7c4d396dcbcd6a83.js +0 -1
  853. package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-7c4d396dcbcd6a83.js +0 -1
  854. package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/route-7c4d396dcbcd6a83.js +0 -1
  855. package/app/.next-cli-build/static/chunks/app/api/cli-tools/claude-settings/route-7c4d396dcbcd6a83.js +0 -1
  856. package/app/.next-cli-build/static/chunks/app/api/cli-tools/cline-settings/route-7c4d396dcbcd6a83.js +0 -1
  857. package/app/.next-cli-build/static/chunks/app/api/cli-tools/codex-settings/route-7c4d396dcbcd6a83.js +0 -1
  858. package/app/.next-cli-build/static/chunks/app/api/cli-tools/copilot-settings/route-7c4d396dcbcd6a83.js +0 -1
  859. package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-7c4d396dcbcd6a83.js +0 -1
  860. package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-7c4d396dcbcd6a83.js +0 -1
  861. package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-settings/route-7c4d396dcbcd6a83.js +0 -1
  862. package/app/.next-cli-build/static/chunks/app/api/cli-tools/deepseek-tui-settings/route-7c4d396dcbcd6a83.js +0 -1
  863. package/app/.next-cli-build/static/chunks/app/api/cli-tools/devin-settings/route-7c4d396dcbcd6a83.js +0 -1
  864. package/app/.next-cli-build/static/chunks/app/api/cli-tools/droid-settings/route-7c4d396dcbcd6a83.js +0 -1
  865. package/app/.next-cli-build/static/chunks/app/api/cli-tools/grok-build-settings/route-7c4d396dcbcd6a83.js +0 -1
  866. package/app/.next-cli-build/static/chunks/app/api/cli-tools/hermes-settings/route-7c4d396dcbcd6a83.js +0 -1
  867. package/app/.next-cli-build/static/chunks/app/api/cli-tools/jcode-settings/route-7c4d396dcbcd6a83.js +0 -1
  868. package/app/.next-cli-build/static/chunks/app/api/cli-tools/kilo-settings/route-7c4d396dcbcd6a83.js +0 -1
  869. package/app/.next-cli-build/static/chunks/app/api/cli-tools/openclaw-settings/route-7c4d396dcbcd6a83.js +0 -1
  870. package/app/.next-cli-build/static/chunks/app/api/cli-tools/opencode-settings/route-7c4d396dcbcd6a83.js +0 -1
  871. package/app/.next-cli-build/static/chunks/app/api/combos/[id]/route-7c4d396dcbcd6a83.js +0 -1
  872. package/app/.next-cli-build/static/chunks/app/api/combos/route-7c4d396dcbcd6a83.js +0 -1
  873. package/app/.next-cli-build/static/chunks/app/api/headroom/extras/route-7c4d396dcbcd6a83.js +0 -1
  874. package/app/.next-cli-build/static/chunks/app/api/headroom/proxy/[...path]/route-7c4d396dcbcd6a83.js +0 -1
  875. package/app/.next-cli-build/static/chunks/app/api/headroom/restart/route-7c4d396dcbcd6a83.js +0 -1
  876. package/app/.next-cli-build/static/chunks/app/api/headroom/start/route-7c4d396dcbcd6a83.js +0 -1
  877. package/app/.next-cli-build/static/chunks/app/api/headroom/status/route-7c4d396dcbcd6a83.js +0 -1
  878. package/app/.next-cli-build/static/chunks/app/api/headroom/stop/route-7c4d396dcbcd6a83.js +0 -1
  879. package/app/.next-cli-build/static/chunks/app/api/health/route-7c4d396dcbcd6a83.js +0 -1
  880. package/app/.next-cli-build/static/chunks/app/api/init/route-7c4d396dcbcd6a83.js +0 -1
  881. package/app/.next-cli-build/static/chunks/app/api/keys/[id]/route-7c4d396dcbcd6a83.js +0 -1
  882. package/app/.next-cli-build/static/chunks/app/api/keys/route-7c4d396dcbcd6a83.js +0 -1
  883. package/app/.next-cli-build/static/chunks/app/api/locale/route-7c4d396dcbcd6a83.js +0 -1
  884. package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/message/route-7c4d396dcbcd6a83.js +0 -1
  885. package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/sse/route-7c4d396dcbcd6a83.js +0 -1
  886. package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/deepgram/voices/route-7c4d396dcbcd6a83.js +0 -1
  887. package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-7c4d396dcbcd6a83.js +0 -1
  888. package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/inworld/voices/route-7c4d396dcbcd6a83.js +0 -1
  889. package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/minimax/voices/route-7c4d396dcbcd6a83.js +0 -1
  890. package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/voices/route-7c4d396dcbcd6a83.js +0 -1
  891. package/app/.next-cli-build/static/chunks/app/api/models/alias/route-7c4d396dcbcd6a83.js +0 -1
  892. package/app/.next-cli-build/static/chunks/app/api/models/availability/route-7c4d396dcbcd6a83.js +0 -1
  893. package/app/.next-cli-build/static/chunks/app/api/models/custom/route-7c4d396dcbcd6a83.js +0 -1
  894. package/app/.next-cli-build/static/chunks/app/api/models/disabled/route-7c4d396dcbcd6a83.js +0 -1
  895. package/app/.next-cli-build/static/chunks/app/api/models/route-7c4d396dcbcd6a83.js +0 -1
  896. package/app/.next-cli-build/static/chunks/app/api/models/test/route-7c4d396dcbcd6a83.js +0 -1
  897. package/app/.next-cli-build/static/chunks/app/api/oauth/[provider]/[action]/route-7c4d396dcbcd6a83.js +0 -1
  898. package/app/.next-cli-build/static/chunks/app/api/oauth/codex/bulk-import/route-7c4d396dcbcd6a83.js +0 -1
  899. package/app/.next-cli-build/static/chunks/app/api/oauth/codex/import-token/route-7c4d396dcbcd6a83.js +0 -1
  900. package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/auto-import/route-7c4d396dcbcd6a83.js +0 -1
  901. package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/import/route-7c4d396dcbcd6a83.js +0 -1
  902. package/app/.next-cli-build/static/chunks/app/api/oauth/gitlab/pat/route-7c4d396dcbcd6a83.js +0 -1
  903. package/app/.next-cli-build/static/chunks/app/api/oauth/iflow/cookie/route-7c4d396dcbcd6a83.js +0 -1
  904. package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/api-key/route-7c4d396dcbcd6a83.js +0 -1
  905. package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/auto-import/route-7c4d396dcbcd6a83.js +0 -1
  906. package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/import/route-7c4d396dcbcd6a83.js +0 -1
  907. package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/import-cli-proxy/route-7c4d396dcbcd6a83.js +0 -1
  908. package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-authorize/route-7c4d396dcbcd6a83.js +0 -1
  909. package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-exchange/route-7c4d396dcbcd6a83.js +0 -1
  910. package/app/.next-cli-build/static/chunks/app/api/pricing/route-7c4d396dcbcd6a83.js +0 -1
  911. package/app/.next-cli-build/static/chunks/app/api/provider-nodes/[id]/route-7c4d396dcbcd6a83.js +0 -1
  912. package/app/.next-cli-build/static/chunks/app/api/provider-nodes/route-7c4d396dcbcd6a83.js +0 -1
  913. package/app/.next-cli-build/static/chunks/app/api/provider-nodes/validate/route-7c4d396dcbcd6a83.js +0 -1
  914. package/app/.next-cli-build/static/chunks/app/api/providers/[id]/json-models/route-7c4d396dcbcd6a83.js +0 -1
  915. package/app/.next-cli-build/static/chunks/app/api/providers/[id]/models/route-7c4d396dcbcd6a83.js +0 -1
  916. package/app/.next-cli-build/static/chunks/app/api/providers/[id]/route-7c4d396dcbcd6a83.js +0 -1
  917. package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test/route-7c4d396dcbcd6a83.js +0 -1
  918. package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test-models/route-7c4d396dcbcd6a83.js +0 -1
  919. package/app/.next-cli-build/static/chunks/app/api/providers/client/route-7c4d396dcbcd6a83.js +0 -1
  920. package/app/.next-cli-build/static/chunks/app/api/providers/kilo/free-models/route-7c4d396dcbcd6a83.js +0 -1
  921. package/app/.next-cli-build/static/chunks/app/api/providers/route-7c4d396dcbcd6a83.js +0 -1
  922. package/app/.next-cli-build/static/chunks/app/api/providers/suggested-models/route-7c4d396dcbcd6a83.js +0 -1
  923. package/app/.next-cli-build/static/chunks/app/api/providers/test-batch/route-7c4d396dcbcd6a83.js +0 -1
  924. package/app/.next-cli-build/static/chunks/app/api/providers/validate/route-7c4d396dcbcd6a83.js +0 -1
  925. package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/route-7c4d396dcbcd6a83.js +0 -1
  926. package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/test/route-7c4d396dcbcd6a83.js +0 -1
  927. package/app/.next-cli-build/static/chunks/app/api/proxy-pools/cloudflare-deploy/route-7c4d396dcbcd6a83.js +0 -1
  928. package/app/.next-cli-build/static/chunks/app/api/proxy-pools/deno-deploy/route-7c4d396dcbcd6a83.js +0 -1
  929. package/app/.next-cli-build/static/chunks/app/api/proxy-pools/route-7c4d396dcbcd6a83.js +0 -1
  930. package/app/.next-cli-build/static/chunks/app/api/proxy-pools/vercel-deploy/route-7c4d396dcbcd6a83.js +0 -1
  931. package/app/.next-cli-build/static/chunks/app/api/pxpipe/health/route-7c4d396dcbcd6a83.js +0 -1
  932. package/app/.next-cli-build/static/chunks/app/api/pxpipe/install/route-7c4d396dcbcd6a83.js +0 -1
  933. package/app/.next-cli-build/static/chunks/app/api/pxpipe/logs/route-7c4d396dcbcd6a83.js +0 -1
  934. package/app/.next-cli-build/static/chunks/app/api/pxpipe/restart/route-7c4d396dcbcd6a83.js +0 -1
  935. package/app/.next-cli-build/static/chunks/app/api/pxpipe/start/route-7c4d396dcbcd6a83.js +0 -1
  936. package/app/.next-cli-build/static/chunks/app/api/pxpipe/stats/route-7c4d396dcbcd6a83.js +0 -1
  937. package/app/.next-cli-build/static/chunks/app/api/pxpipe/status/route-7c4d396dcbcd6a83.js +0 -1
  938. package/app/.next-cli-build/static/chunks/app/api/pxpipe/stop/route-7c4d396dcbcd6a83.js +0 -1
  939. package/app/.next-cli-build/static/chunks/app/api/settings/database/import-usage/route-7c4d396dcbcd6a83.js +0 -1
  940. package/app/.next-cli-build/static/chunks/app/api/settings/database/route-7c4d396dcbcd6a83.js +0 -1
  941. package/app/.next-cli-build/static/chunks/app/api/settings/proxy-test/route-7c4d396dcbcd6a83.js +0 -1
  942. package/app/.next-cli-build/static/chunks/app/api/settings/require-login/route-7c4d396dcbcd6a83.js +0 -1
  943. package/app/.next-cli-build/static/chunks/app/api/settings/route-7c4d396dcbcd6a83.js +0 -1
  944. package/app/.next-cli-build/static/chunks/app/api/shutdown/route-7c4d396dcbcd6a83.js +0 -1
  945. package/app/.next-cli-build/static/chunks/app/api/tags/route-7c4d396dcbcd6a83.js +0 -1
  946. package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/route-7c4d396dcbcd6a83.js +0 -1
  947. package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/stream/route-7c4d396dcbcd6a83.js +0 -1
  948. package/app/.next-cli-build/static/chunks/app/api/translator/load/route-7c4d396dcbcd6a83.js +0 -1
  949. package/app/.next-cli-build/static/chunks/app/api/translator/save/route-7c4d396dcbcd6a83.js +0 -1
  950. package/app/.next-cli-build/static/chunks/app/api/translator/send/route-7c4d396dcbcd6a83.js +0 -1
  951. package/app/.next-cli-build/static/chunks/app/api/translator/translate/route-7c4d396dcbcd6a83.js +0 -1
  952. package/app/.next-cli-build/static/chunks/app/api/tunnel/disable/route-7c4d396dcbcd6a83.js +0 -1
  953. package/app/.next-cli-build/static/chunks/app/api/tunnel/enable/route-7c4d396dcbcd6a83.js +0 -1
  954. package/app/.next-cli-build/static/chunks/app/api/tunnel/status/route-7c4d396dcbcd6a83.js +0 -1
  955. package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-check/route-7c4d396dcbcd6a83.js +0 -1
  956. package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-disable/route-7c4d396dcbcd6a83.js +0 -1
  957. package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-enable/route-7c4d396dcbcd6a83.js +0 -1
  958. package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-install/route-7c4d396dcbcd6a83.js +0 -1
  959. package/app/.next-cli-build/static/chunks/app/api/usage/[connectionId]/codex-reset-credits/route-7c4d396dcbcd6a83.js +0 -1
  960. package/app/.next-cli-build/static/chunks/app/api/usage/[connectionId]/route-7c4d396dcbcd6a83.js +0 -1
  961. package/app/.next-cli-build/static/chunks/app/api/usage/chart/route-7c4d396dcbcd6a83.js +0 -1
  962. package/app/.next-cli-build/static/chunks/app/api/usage/history/route-7c4d396dcbcd6a83.js +0 -1
  963. package/app/.next-cli-build/static/chunks/app/api/usage/logs/route-7c4d396dcbcd6a83.js +0 -1
  964. package/app/.next-cli-build/static/chunks/app/api/usage/providers/route-7c4d396dcbcd6a83.js +0 -1
  965. package/app/.next-cli-build/static/chunks/app/api/usage/request-details/route-7c4d396dcbcd6a83.js +0 -1
  966. package/app/.next-cli-build/static/chunks/app/api/usage/request-logs/route-7c4d396dcbcd6a83.js +0 -1
  967. package/app/.next-cli-build/static/chunks/app/api/usage/stats/route-7c4d396dcbcd6a83.js +0 -1
  968. package/app/.next-cli-build/static/chunks/app/api/usage/stream/route-7c4d396dcbcd6a83.js +0 -1
  969. package/app/.next-cli-build/static/chunks/app/api/v1/api/chat/route-7c4d396dcbcd6a83.js +0 -1
  970. package/app/.next-cli-build/static/chunks/app/api/v1/audio/speech/route-7c4d396dcbcd6a83.js +0 -1
  971. package/app/.next-cli-build/static/chunks/app/api/v1/audio/transcriptions/route-7c4d396dcbcd6a83.js +0 -1
  972. package/app/.next-cli-build/static/chunks/app/api/v1/audio/voices/route-7c4d396dcbcd6a83.js +0 -1
  973. package/app/.next-cli-build/static/chunks/app/api/v1/chat/completions/route-7c4d396dcbcd6a83.js +0 -1
  974. package/app/.next-cli-build/static/chunks/app/api/v1/embeddings/route-7c4d396dcbcd6a83.js +0 -1
  975. package/app/.next-cli-build/static/chunks/app/api/v1/images/generations/route-7c4d396dcbcd6a83.js +0 -1
  976. package/app/.next-cli-build/static/chunks/app/api/v1/messages/count_tokens/route-7c4d396dcbcd6a83.js +0 -1
  977. package/app/.next-cli-build/static/chunks/app/api/v1/messages/route-7c4d396dcbcd6a83.js +0 -1
  978. package/app/.next-cli-build/static/chunks/app/api/v1/models/[kind]/route-7c4d396dcbcd6a83.js +0 -1
  979. package/app/.next-cli-build/static/chunks/app/api/v1/models/info/route-7c4d396dcbcd6a83.js +0 -1
  980. package/app/.next-cli-build/static/chunks/app/api/v1/models/route-7c4d396dcbcd6a83.js +0 -1
  981. package/app/.next-cli-build/static/chunks/app/api/v1/responses/compact/route-7c4d396dcbcd6a83.js +0 -1
  982. package/app/.next-cli-build/static/chunks/app/api/v1/responses/route-7c4d396dcbcd6a83.js +0 -1
  983. package/app/.next-cli-build/static/chunks/app/api/v1/route-7c4d396dcbcd6a83.js +0 -1
  984. package/app/.next-cli-build/static/chunks/app/api/v1/search/route-7c4d396dcbcd6a83.js +0 -1
  985. package/app/.next-cli-build/static/chunks/app/api/v1/videos/[id]/route-7c4d396dcbcd6a83.js +0 -1
  986. package/app/.next-cli-build/static/chunks/app/api/v1/videos/edits/route-7c4d396dcbcd6a83.js +0 -1
  987. package/app/.next-cli-build/static/chunks/app/api/v1/videos/extensions/route-7c4d396dcbcd6a83.js +0 -1
  988. package/app/.next-cli-build/static/chunks/app/api/v1/videos/generations/route-7c4d396dcbcd6a83.js +0 -1
  989. package/app/.next-cli-build/static/chunks/app/api/v1/web/fetch/route-7c4d396dcbcd6a83.js +0 -1
  990. package/app/.next-cli-build/static/chunks/app/api/v1beta/models/[...path]/route-7c4d396dcbcd6a83.js +0 -1
  991. package/app/.next-cli-build/static/chunks/app/api/v1beta/models/route-7c4d396dcbcd6a83.js +0 -1
  992. package/app/.next-cli-build/static/chunks/app/api/version/route-7c4d396dcbcd6a83.js +0 -1
  993. package/app/.next-cli-build/static/chunks/app/api/version/shutdown/route-7c4d396dcbcd6a83.js +0 -1
  994. package/app/.next-cli-build/static/chunks/app/api/version/update/route-7c4d396dcbcd6a83.js +0 -1
  995. package/app/.next-cli-build/static/chunks/app/manifest.webmanifest/route-7c4d396dcbcd6a83.js +0 -1
  996. package/app/.next-cli-build/static/chunks/app/page-7c4d396dcbcd6a83.js +0 -1
  997. package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/app-error-7c4d396dcbcd6a83.js +0 -1
  998. package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/forbidden-7c4d396dcbcd6a83.js +0 -1
  999. package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/not-found-7c4d396dcbcd6a83.js +0 -1
  1000. package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/unauthorized-7c4d396dcbcd6a83.js +0 -1
  1001. package/app/.next-cli-build/static/css/744832b960884f40.css +0 -1
  1002. /package/app/.next-cli-build/static/{AFIMSU-vh_yXimJozqVPF → rPl9WrF0GIBOKSW3yAMMs}/_ssgManifest.js +0 -0
package/cli.js CHANGED
@@ -1,873 +1,857 @@
1
- #!/usr/bin/env node
2
-
3
- const { spawn, exec, execSync } = require("child_process");
4
- const path = require("path");
5
- const fs = require("fs");
6
- const https = require("https");
7
- const net = require("net");
8
- const os = require("os");
9
-
10
- // Poll until the server accepts TCP connections on port, or timeout — avoids blind fixed waits.
11
- function waitServerReady(port, { timeoutMs = 15000, intervalMs = 150 } = {}) {
12
- const deadline = Date.now() + timeoutMs;
13
- return new Promise((resolve) => {
14
- const tryConnect = () => {
15
- const socket = net.connect({ host: "127.0.0.1", port }, () => {
16
- socket.destroy();
17
- resolve(true);
18
- });
19
- socket.on("error", () => {
20
- socket.destroy();
21
- if (Date.now() >= deadline) return resolve(false);
22
- setTimeout(tryConnect, intervalMs);
23
- });
24
- };
25
- tryConnect();
26
- });
27
- }
28
-
29
- // Native spinner - no external dependency
30
- function createSpinner(text) {
31
- const frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
32
- let i = 0;
33
- let interval = null;
34
- let currentText = text;
35
- return {
36
- start() {
37
- if (process.stdout.isTTY) {
38
- process.stdout.write(`\r${frames[0]} ${currentText}`);
39
- interval = setInterval(() => {
40
- process.stdout.write(`\r${frames[i++ % frames.length]} ${currentText}`);
41
- }, 80);
42
- }
43
- return this;
44
- },
45
- stop() {
46
- if (interval) {
47
- clearInterval(interval);
48
- interval = null;
49
- }
50
- if (process.stdout.isTTY) {
51
- process.stdout.write("\r\x1b[K");
52
- }
53
- },
54
- succeed(msg) {
55
- this.stop();
56
- console.log(`✅ ${msg}`);
57
- },
58
- fail(msg) {
59
- this.stop();
60
- console.log(`❌ ${msg}`);
61
- }
62
- };
63
- }
64
-
65
- const pkg = require("./package.json");
66
- const { ensureSqliteRuntime, buildEnvWithRuntime } = require("./hooks/sqliteRuntime");
67
- const { ensureTrayRuntime } = require("./hooks/trayRuntime");
68
- const args = process.argv.slice(2);
69
-
70
- // Subcommands (`10router xai video …`) run against an already-running gateway
71
- // and bypass the launcher flow (no runtime self-heal, no server spawn).
72
- if (args[0] === "xai" && args[1] === "video") {
73
- const { run } = require("./src/cli/commands/xaiVideo");
74
- run(args.slice(2))
75
- .then((code) => process.exit(code))
76
- .catch((err) => {
77
- console.error(`❌ ${err?.message || err}`);
78
- process.exit(1);
79
- });
80
- return;
81
- }
82
-
83
- // Self-heal SQLite runtime deps (sql.js + better-sqlite3) into ~/.10router/runtime
84
- // so the server can resolve them via NODE_PATH. Best-effort sql.js is required,
85
- // better-sqlite3 is optional. Logs to stderr only on failure.
86
- try { ensureSqliteRuntime({ silent: true }); } catch {}
87
-
88
- // Self-heal tray runtime (systray for macOS/Linux only). Windows skipped.
89
- try { ensureTrayRuntime({ silent: true }); } catch {}
90
-
91
- // Configuration constants
92
- // Two different names, identical until the npm package was renamed to
93
- // 10router-cli: APP_NAME is what you install, BIN_NAME is what you then type.
94
- const APP_NAME = pkg.name;
95
- const BIN_NAME = Object.keys(pkg.bin ?? {})[0] ?? pkg.name;
96
- const INSTALL_CMD_LATEST = `npm i -g ${APP_NAME}@latest --prefer-online`;
97
-
98
- const DEFAULT_PORT = 20128;
99
- const DEFAULT_HOST = "0.0.0.0";
100
-
101
- // First non-internal IPv4 — the address remote peers actually reach when bound to 0.0.0.0.
102
- function getLanIp() {
103
- for (const ifaces of Object.values(os.networkInterfaces())) {
104
- for (const i of ifaces || []) {
105
- if (i.family === "IPv4" && !i.internal) return i.address;
106
- }
107
- }
108
- return null;
109
- }
110
-
111
- // Local URL stays "localhost"; warn separately when bound to all interfaces (network-exposed).
112
- function getDisplayHost() {
113
- return host === DEFAULT_HOST ? "localhost" : host;
114
- }
115
- const MAX_PORT_ATTEMPTS = 10;
116
- // Identifiers for killAllAppProcesses - only kill 10router specifically
117
- const PROCESS_IDENTIFIERS = [
118
- '10router' // Only package name - avoid killing other apps
119
- ];
120
-
121
- // Parse arguments
122
- let port = DEFAULT_PORT;
123
- let host = DEFAULT_HOST;
124
- let noBrowser = false;
125
- let skipUpdate = false;
126
- let showLog = false;
127
- let trayMode = false;
128
-
129
- for (let i = 0; i < args.length; i++) {
130
- if (args[i] === "--port" || args[i] === "-p") {
131
- port = parseInt(args[i + 1], 10) || DEFAULT_PORT;
132
- i++;
133
- } else if (args[i] === "--host" || args[i] === "-H") {
134
- host = args[i + 1] || DEFAULT_HOST;
135
- i++;
136
- } else if (args[i] === "--no-browser" || args[i] === "-n") {
137
- noBrowser = true;
138
- } else if (args[i] === "--log" || args[i] === "-l") {
139
- showLog = true;
140
- } else if (args[i] === "--skip-update") {
141
- skipUpdate = true;
142
- } else if (args[i] === "--tray" || args[i] === "-t") {
143
- trayMode = true;
144
- process.env.TRAY_MODE = "1";
145
- } else if (args[i] === "--help" || args[i] === "-h") {
146
- console.log(`
147
- Usage: ${BIN_NAME} [options]
148
-
149
- Options:
150
- -p, --port <port> Port to run the server (default: ${DEFAULT_PORT})
151
- -H, --host <host> Host to bind (default: ${DEFAULT_HOST})
152
- -n, --no-browser Don't open browser automatically
153
- -l, --log Show server logs (default: hidden)
154
- -t, --tray Run in system tray mode (background)
155
- --skip-update Skip auto-update check
156
- -h, --help Show this help message
157
- -v, --version Show version
158
-
159
- Commands:
160
- xai video --prompt "..." --output video.mp4
161
- Generate a Grok Imagine video via the running gateway
162
- (see: ${BIN_NAME} xai video --help)
163
- `);
164
- process.exit(0);
165
- } else if (args[i] === "--version" || args[i] === "-v") {
166
- console.log(pkg.version);
167
- process.exit(0);
168
- }
169
- }
170
-
171
- // Auto-relaunch after update: detached process has no TTY → fallback to tray
172
- if (skipUpdate && !trayMode && !process.stdin.isTTY) {
173
- trayMode = true;
174
- process.env.TRAY_MODE = "1";
175
- }
176
-
177
- // Always use Node.js runtime with absolute path
178
- const RUNTIME = process.execPath;
179
-
180
- // Compare semver versions: returns 1 if a > b, -1 if a < b, 0 if equal
181
- function compareVersions(a, b) {
182
- const partsA = a.split(".").map(Number);
183
- const partsB = b.split(".").map(Number);
184
- for (let i = 0; i < 3; i++) {
185
- if (partsA[i] > partsB[i]) return 1;
186
- if (partsA[i] < partsB[i]) return -1;
187
- }
188
- return 0;
189
- }
190
-
191
- // Get app data dir (matches app/src/lib/dataDir.js convention)
192
- function getAppDataDir() {
193
- return process.platform === "win32"
194
- ? path.join(process.env.APPDATA || "", "10router")
195
- : path.join(os.homedir(), ".10router");
196
- }
197
-
198
- // Kill PID from file (best-effort, removes file after)
199
- function killByPidFile(pidFile) {
200
- try {
201
- if (!fs.existsSync(pidFile)) return;
202
- const pid = parseInt(fs.readFileSync(pidFile, "utf8").trim(), 10);
203
- if (!pid) return;
204
- try {
205
- if (process.platform === "win32") {
206
- execSync(`taskkill /F /T /PID ${pid}`, { stdio: "ignore", windowsHide: true, timeout: 3000 });
207
- } else {
208
- process.kill(pid, "SIGKILL");
209
- }
210
- } catch { }
211
- try { fs.unlinkSync(pidFile); } catch { }
212
- } catch { }
213
- }
214
-
215
- // Kill tunnel processes (cloudflared/tailscale) by their PID files
216
- function killTunnelByPidFile() {
217
- const tunnelDir = path.join(getAppDataDir(), "tunnel");
218
- killByPidFile(path.join(tunnelDir, "cloudflared.pid"));
219
- killByPidFile(path.join(tunnelDir, "tailscale.pid"));
220
- }
221
-
222
- // Kill cloudflared whose --url targets this app's port (covers stale PID file case)
223
- function killCloudflaredByAppPort(appPort) {
224
- if (!appPort) return [];
225
- const portMatchers = [`localhost:${appPort}`, `127.0.0.1:${appPort}`];
226
- const pids = [];
227
- try {
228
- if (process.platform === "win32") {
229
- const psCmd = `powershell -NonInteractive -WindowStyle Hidden -Command "Get-WmiObject Win32_Process -Filter 'Name=\\"cloudflared.exe\\"' | Select-Object ProcessId,CommandLine | ConvertTo-Csv -NoTypeInformation"`;
230
- const output = execSync(psCmd, { encoding: "utf8", windowsHide: true, timeout: 5000 });
231
- const lines = output.split("\n").slice(1).filter(l => l.trim());
232
- lines.forEach(line => {
233
- if (portMatchers.some(m => line.includes(m))) {
234
- const match = line.match(/^"(\d+)"/);
235
- if (match && match[1]) pids.push(match[1]);
236
- }
237
- });
238
- } else {
239
- const output = execSync("ps -eo pid,command 2>/dev/null", { encoding: "utf8", timeout: 5000 });
240
- output.split("\n").forEach(line => {
241
- if (line.includes("cloudflared") && portMatchers.some(m => line.includes(m))) {
242
- const parts = line.trim().split(/\s+/);
243
- const pid = parts[0];
244
- if (pid && !isNaN(pid)) pids.push(pid);
245
- }
246
- });
247
- }
248
- } catch { }
249
- return pids;
250
- }
251
-
252
- // Kill all 10router processes
253
- function killAllAppProcesses(appPort) {
254
- return new Promise((resolve) => {
255
- try {
256
- // Background: MITM + tunnel/cloudflared run on separate ports/processes —
257
- // killing them doesn't free the app port, so don't block the critical path.
258
- // Server-side MITM manager has stale-lock recovery and starts deferred (~3s).
259
- setImmediate(() => {
260
- try { killProxyByPidFile(); } catch {}
261
- try { killTunnelByPidFile(); } catch {}
262
- try { killCloudflaredByAppPort(appPort); } catch {}
263
- });
264
-
265
- const platform = process.platform;
266
- let pids = [];
267
-
268
- if (platform === "win32") {
269
- // Windows: use WMI to get full CommandLine (tasklist /V doesn't include it)
270
- try {
271
- const psCmd = `powershell -NonInteractive -WindowStyle Hidden -Command "Get-WmiObject Win32_Process -Filter 'Name=\\"node.exe\\"' | Select-Object ProcessId,CommandLine | ConvertTo-Csv -NoTypeInformation"`;
272
- const output = execSync(psCmd, {
273
- encoding: "utf8",
274
- windowsHide: true,
275
- timeout: 5000
276
- });
277
- const lines = output.split("\n").slice(1).filter(l => l.trim());
278
- lines.forEach(line => {
279
- // Whitelist: real node process running 10router/cli.js, or next-server.
280
- // Avoids killing editors/grep/strace/cursor that just have "10router" in cmdline.
281
- const cmd = line.toLowerCase();
282
- const isAppProcess =
283
- (cmd.includes("node") && cmd.includes("10router") && (cmd.includes("cli.js") || cmd.includes("\\10router") || cmd.includes("/10router")))
284
- || cmd.includes("next-server");
285
- if (isAppProcess) {
286
- const match = line.match(/^"(\d+)"/);
287
- if (match && match[1] && match[1] !== process.pid.toString()) {
288
- pids.push(match[1]);
289
- }
290
- }
291
- });
292
- } catch (e) {
293
- // No processes found or error - continue
294
- }
295
- } else {
296
- // macOS/Linux: use ps to find all matching processes
297
- try {
298
- const output = execSync('ps aux 2>/dev/null', {
299
- encoding: 'utf8',
300
- timeout: 5000
301
- });
302
- const lines = output.split('\n');
303
-
304
- lines.forEach(line => {
305
- // Whitelist: real node process running 10router/cli.js, or next-server.
306
- // Avoids killing grep/strace/editors/cursor that incidentally match "10router".
307
- const cmd = line.toLowerCase();
308
- const isAppProcess =
309
- (cmd.includes("node") && cmd.includes("10router") && (cmd.includes("cli.js") || cmd.includes("/10router")))
310
- || cmd.includes("next-server");
311
- if (isAppProcess) {
312
- const parts = line.trim().split(/\s+/);
313
- const pid = parts[1];
314
- if (pid && !isNaN(pid) && pid !== process.pid.toString()) {
315
- pids.push(pid);
316
- }
317
- }
318
- });
319
- } catch (e) {
320
- // No processes found or error - continue
321
- }
322
- }
323
-
324
- // Kill all found processes
325
- if (pids.length > 0) {
326
- pids.forEach(pid => {
327
- try {
328
- if (platform === "win32") {
329
- execSync(`taskkill /F /PID ${pid} 2>nul`, { stdio: 'ignore', shell: true, windowsHide: true, timeout: 3000 });
330
- } else {
331
- execSync(`kill -9 ${pid} 2>/dev/null`, { stdio: 'ignore', timeout: 3000 });
332
- }
333
- } catch (err) {
334
- // Process already dead or can't kill - continue
335
- }
336
- });
337
-
338
- // Wait for processes to fully terminate
339
- setTimeout(() => resolve(), 1000);
340
- } else {
341
- resolve();
342
- }
343
- } catch (err) {
344
- // Silent fail - continue anyway
345
- resolve();
346
- }
347
- });
348
- }
349
-
350
- // Sleep helper using SharedArrayBuffer wait (sync, no busy-loop)
351
- function sleepSync(ms) {
352
- try { Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms); } catch { /* ignore */ }
353
- }
354
-
355
- // Wait until process dies or timeout reached
356
- function waitForExit(pid, timeoutMs) {
357
- const deadline = Date.now() + timeoutMs;
358
- while (Date.now() < deadline) {
359
- try { process.kill(pid, 0); } catch { return true; }
360
- sleepSync(100);
361
- }
362
- return false;
363
- }
364
-
365
- // Kill MIT server by PID file (runs privileged, needs special handling)
366
- // Sends SIGTERM first so MIT can clean up host entries before dying.
367
- function killProxyByPidFile() {
368
- try {
369
- const pidFile = path.join(getAppDataDir(), "mitm", ".mitm.pid");
370
- if (!fs.existsSync(pidFile)) return;
371
- const pid = parseInt(fs.readFileSync(pidFile, "utf8").trim(), 10);
372
- if (!pid) return;
373
-
374
- if (process.platform === "win32") {
375
- // Graceful first (lets server cleanup hosts), then force
376
- try { execSync(`taskkill /T /PID ${pid}`, { stdio: "ignore", windowsHide: true, timeout: 2000 }); } catch { }
377
- if (!waitForExit(pid, 1500)) {
378
- try { execSync(`taskkill /F /T /PID ${pid}`, { stdio: "ignore", windowsHide: true, timeout: 3000 }); } catch { }
379
- }
380
- // Last-resort: PowerShell Stop-Process (sometimes succeeds where taskkill fails on admin processes)
381
- if (!waitForExit(pid, 500)) {
382
- try { execSync(`powershell -NonInteractive -WindowStyle Hidden -Command "Stop-Process -Id ${pid} -Force"`, { stdio: "ignore", windowsHide: true, timeout: 3000 }); } catch { }
383
- }
384
- } else {
385
- // SIGTERM via cached sudo token first
386
- try { execSync(`sudo -n kill -TERM ${pid} 2>/dev/null`, { stdio: "ignore", timeout: 2000 }); }
387
- catch { try { process.kill(pid, "SIGTERM"); } catch { } }
388
- if (!waitForExit(pid, 1500)) {
389
- try { execSync(`sudo -n kill -9 ${pid} 2>/dev/null`, { stdio: "ignore", timeout: 2000 }); }
390
- catch { try { process.kill(pid, "SIGKILL"); } catch { } }
391
- }
392
- }
393
- try { fs.unlinkSync(pidFile); } catch { }
394
- } catch { }
395
- }
396
-
397
- // Kill any process on specific port
398
- function killProcessOnPort(port) {
399
- return new Promise((resolve) => {
400
- try {
401
- const platform = process.platform;
402
- let pid;
403
-
404
- if (platform === "win32") {
405
- try {
406
- const output = execSync(`netstat -ano | findstr :${port}`, {
407
- encoding: 'utf8',
408
- shell: true,
409
- windowsHide: true,
410
- timeout: 5000
411
- }).trim();
412
- const lines = output.split('\n').filter(l => l.includes('LISTENING'));
413
- if (lines.length > 0) {
414
- pid = lines[0].trim().split(/\s+/).pop();
415
- execSync(`taskkill /F /PID ${pid} 2>nul`, { stdio: 'ignore', shell: true, windowsHide: true, timeout: 3000 });
416
- }
417
- } catch (e) {
418
- // Port is free or error
419
- }
420
- } else {
421
- // macOS/Linux
422
- try {
423
- const pidOutput = execSync(`lsof -ti:${port}`, {
424
- encoding: 'utf8',
425
- stdio: ['pipe', 'pipe', 'ignore']
426
- }).trim();
427
- if (pidOutput) {
428
- pid = pidOutput.split('\n')[0];
429
- execSync(`kill -9 ${pid} 2>/dev/null`, { stdio: 'ignore', timeout: 3000 });
430
- }
431
- } catch (e) {
432
- // Port is free or error
433
- }
434
- }
435
-
436
- // Wait for port to be released
437
- setTimeout(() => resolve(), 500);
438
- } catch (err) {
439
- // Silent fail - continue anyway
440
- resolve();
441
- }
442
- });
443
- }
444
-
445
-
446
- // Detect if running in restricted environment (Codespaces, Docker)
447
- function isRestrictedEnvironment() {
448
- // Check for Codespaces
449
- if (process.env.CODESPACES === "true" || process.env.GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN) {
450
- return "GitHub Codespaces";
451
- }
452
-
453
- // Check for Docker
454
- if (fs.existsSync("/.dockerenv") || (fs.existsSync("/proc/1/cgroup") && fs.readFileSync("/proc/1/cgroup", "utf8").includes("docker"))) {
455
- return "Docker";
456
- }
457
-
458
- return null;
459
- }
460
-
461
- // Check if new version available, return latest version or null
462
- function checkForUpdate() {
463
- return new Promise((resolve) => {
464
- if (skipUpdate) {
465
- resolve(null);
466
- return;
467
- }
468
-
469
- const spinner = createSpinner("Checking for updates...").start();
470
- let resolved = false;
471
-
472
- const safetyTimeout = setTimeout(() => {
473
- if (!resolved) {
474
- resolved = true;
475
- spinner.stop();
476
- resolve(null);
477
- }
478
- }, 8000);
479
-
480
- const done = (version) => {
481
- if (resolved) return;
482
- resolved = true;
483
- clearTimeout(safetyTimeout);
484
- spinner.stop();
485
- resolve(version);
486
- };
487
-
488
- const req = https.get(`https://registry.npmjs.org/${pkg.name}/latest`, { timeout: 3000 }, (res) => {
489
- let data = "";
490
- res.on("data", chunk => data += chunk);
491
- res.on("end", () => {
492
- try {
493
- const latest = JSON.parse(data);
494
- if (latest.version && compareVersions(latest.version, pkg.version) > 0) {
495
- done(latest.version);
496
- } else {
497
- done(null);
498
- }
499
- } catch (e) {
500
- done(null);
501
- }
502
- });
503
- });
504
-
505
- req.on("error", () => done(null));
506
- req.on("timeout", () => { req.destroy(); done(null); });
507
- });
508
- }
509
-
510
- // Open browser
511
- function openBrowser(url) {
512
- const platform = process.platform;
513
- let cmd;
514
-
515
- if (platform === "darwin") {
516
- cmd = `open "${url}"`;
517
- } else if (platform === "win32") {
518
- cmd = `start "" "${url}"`;
519
- } else {
520
- cmd = `xdg-open "${url}"`;
521
- }
522
-
523
- exec(cmd, { windowsHide: true }, (err) => {
524
- if (err) {
525
- console.log(`Open browser manually: ${url}`);
526
- }
527
- });
528
- }
529
-
530
- // Find standalone server (bundled in bin/app for published package).
531
- // Prefer custom-server.js (injects real socket IP) when present.
532
- const standaloneDir = path.join(__dirname, "app");
533
- const customServerPath = path.join(standaloneDir, "custom-server.js");
534
- const serverPath = fs.existsSync(customServerPath)
535
- ? customServerPath
536
- : path.join(standaloneDir, "server.js");
537
-
538
- if (!fs.existsSync(serverPath)) {
539
- console.error("Error: Standalone build not found.");
540
- console.error("Please run 'npm run build:cli' first.");
541
- process.exit(1);
542
- }
543
-
544
- // Start server immediately; run update check in parallel (not on the critical path).
545
- const updatePromise = checkForUpdate();
546
- killAllAppProcesses(port)
547
- .then(() => killProcessOnPort(port))
548
- .then(() => startServer(updatePromise));
549
-
550
- // Show interface selection menu
551
- async function showInterfaceMenu(latestVersion) {
552
- const { selectMenu } = require("./src/cli/utils/input");
553
- const { clearScreen } = require("./src/cli/utils/display");
554
- const { getEndpoint } = require("./src/cli/utils/endpoint");
555
-
556
- clearScreen();
557
-
558
- const displayHost = getDisplayHost();
559
-
560
- // Detect tunnel/local mode for server URL display
561
- let serverUrl;
562
- try {
563
- const { endpoint, tunnelEnabled } = await getEndpoint(port);
564
- serverUrl = tunnelEnabled ? endpoint.replace(/\/v1$/, "") : `http://${displayHost}:${port}`;
565
- } catch (e) {
566
- serverUrl = `http://${displayHost}:${port}`;
567
- }
568
-
569
- const subtitle = `🚀 Server: \x1b[32m${serverUrl}\x1b[0m`;
570
-
571
- const menuItems = [];
572
-
573
- if (latestVersion) {
574
- menuItems.push({ label: `Update to v${latestVersion} (current: v${pkg.version})`, icon: "" });
575
- }
576
-
577
- menuItems.push(
578
- { label: "Web UI (Open in Browser)", icon: "🌐" },
579
- { label: "Terminal UI (Interactive CLI)", icon: "💻" },
580
- { label: "Hide to Tray (Background)", icon: "🔔" },
581
- { label: "Exit", icon: "🚪" }
582
- );
583
-
584
- const selected = await selectMenu(`Choose Interface (v${pkg.version})`, menuItems, 0, subtitle);
585
-
586
- const offset = latestVersion ? 1 : 0;
587
-
588
- if (latestVersion && selected === 0) return "update";
589
- if (selected === offset) return "web";
590
- if (selected === offset + 1) return "terminal";
591
- if (selected === offset + 2) return "hide";
592
- return "exit";
593
- }
594
-
595
- const MAX_RESTARTS = 2;
596
- const RESTART_RESET_MS = 30000; // Reset counter if alive > 30s
597
-
598
- function startServer(updatePromise) {
599
- // Accept either a Promise (parallel update check) or a resolved value.
600
- const latestVersionPromise = Promise.resolve(updatePromise);
601
- const displayHost = getDisplayHost();
602
- const url = `http://${displayHost}:${port}/dashboard`;
603
- // Surface real network exposure when bound to all interfaces (default 0.0.0.0).
604
- if (host === DEFAULT_HOST) {
605
- const lanIp = getLanIp();
606
- if (lanIp) console.log(`\x1b[33m⚠ Network-exposed: reachable at http://${lanIp}:${port} (bound 0.0.0.0). Use --host 127.0.0.1 for local-only.\x1b[0m`);
607
- }
608
-
609
- let restartCount = 0;
610
- let serverStartTime = Date.now();
611
-
612
- const CRASH_LOG_LINES = 50;
613
- let crashLog = [];
614
-
615
- function spawnServer() {
616
- serverStartTime = Date.now();
617
- crashLog = [];
618
- const child = spawn(RUNTIME, ["--dns-result-order=ipv4first", "--max-old-space-size=6144", serverPath], {
619
- cwd: standaloneDir,
620
- stdio: showLog ? "inherit" : ["ignore", "ignore", "pipe"],
621
- detached: true,
622
- windowsHide: true,
623
- env: {
624
- ...buildEnvWithRuntime(process.env),
625
- PORT: port.toString(),
626
- HOSTNAME: host
627
- }
628
- });
629
- if (!showLog && child.stderr) {
630
- child.stderr.on("data", (data) => {
631
- const lines = data.toString().split("\n").filter(Boolean);
632
- crashLog.push(...lines);
633
- if (crashLog.length > CRASH_LOG_LINES) crashLog = crashLog.slice(-CRASH_LOG_LINES);
634
- });
635
- }
636
- return child;
637
- }
638
-
639
- let server = spawnServer();
640
-
641
- // Cleanup function - force kill server process
642
- let isCleaningUp = false;
643
- function cleanup() {
644
- if (isCleaningUp) return;
645
- isCleaningUp = true;
646
- try {
647
- // Kill tray if running
648
- try {
649
- const { killTray } = require("./src/cli/tray/tray");
650
- killTray();
651
- } catch (e) { }
652
- // Kill MIT server (privileged process) via PID file
653
- killProxyByPidFile();
654
- // Kill cloudflared/tailscale via PID file (only this app's tunnel)
655
- killTunnelByPidFile();
656
- // Kill server process directly
657
- if (server.pid) {
658
- process.kill(server.pid, "SIGKILL");
659
- }
660
- // Also try to kill process group
661
- process.kill(-server.pid, "SIGKILL");
662
- } catch (e) { }
663
- }
664
-
665
- // Suppress all errors during shutdown (systray lib throws JSON parse errors)
666
- let isShuttingDown = false;
667
- process.on("uncaughtException", (err) => {
668
- if (isShuttingDown) return;
669
- console.error("Error:", err.message);
670
- });
671
-
672
- // Handle all exit scenarios
673
- process.on("SIGINT", () => {
674
- if (isShuttingDown) return;
675
- isShuttingDown = true;
676
- console.log("\nExiting...");
677
- cleanup();
678
- setTimeout(() => process.exit(0), 100);
679
- });
680
- process.on("SIGTERM", () => {
681
- if (isShuttingDown) return;
682
- isShuttingDown = true;
683
- cleanup();
684
- setTimeout(() => process.exit(0), 100);
685
- });
686
- process.on("SIGHUP", () => {
687
- if (isShuttingDown) return;
688
- isShuttingDown = true;
689
- cleanup();
690
- setTimeout(() => process.exit(0), 100);
691
- });
692
-
693
- // Initialize tray icon (runs alongside TUI)
694
- const initTrayIcon = () => {
695
- try {
696
- const { initTray } = require("./src/cli/tray/tray");
697
- initTray({
698
- port,
699
- onQuit: () => {
700
- isShuttingDown = true;
701
- console.log("\n👋 Shutting down from tray...");
702
- cleanup();
703
- setTimeout(() => process.exit(0), 100);
704
- },
705
- onOpenDashboard: () => openBrowser(url)
706
- });
707
- } catch (err) {
708
- // Tray not available - continue without it
709
- }
710
- };
711
-
712
- // Tray-only mode: no TUI, just tray icon
713
- if (trayMode) {
714
- // Ignore SIGHUP so macOS terminal close doesn't kill the background tray process
715
- process.removeAllListeners("SIGHUP");
716
- process.on("SIGHUP", () => {});
717
-
718
- console.log(`\n🚀 ${pkg.name} v${pkg.version}`);
719
- console.log(`Server: http://${displayHost}:${port}`);
720
-
721
- waitServerReady(port).then(() => {
722
- initTrayIcon();
723
- console.log("\n💡 Router is now running in system tray. Close this terminal if you want.");
724
- console.log(" Right-click tray icon to open dashboard or quit.\n");
725
- });
726
-
727
- return;
728
- }
729
-
730
- // Wait for server to be ready, then show interface menu loop + tray
731
- waitServerReady(port).then(async () => {
732
- // Resolve parallel update check (already running); don't block server start on it.
733
- const latestVersion = await latestVersionPromise;
734
- // Start tray icon alongside TUI
735
- initTrayIcon();
736
-
737
- try {
738
- while (true) {
739
- const choice = await showInterfaceMenu(latestVersion);
740
-
741
- if (choice === "update") {
742
- isShuttingDown = true;
743
- const { clearScreen } = require("./src/cli/utils/display");
744
- clearScreen();
745
- console.log(`\n⬆ Update v${pkg.version} → v${latestVersion}\n`);
746
- console.log(`Run this after exit:\n`);
747
- console.log(` \x1b[33m${INSTALL_CMD_LATEST}\x1b[0m\n`);
748
- cleanup();
749
- await killAllAppProcesses(port);
750
- await killProcessOnPort(port);
751
- setTimeout(() => process.exit(0), 200);
752
- return;
753
- } else if (choice === "web") {
754
- openBrowser(url);
755
- // Wait for user to come back
756
- const { pause } = require("./src/cli/utils/input");
757
- await pause("\nPress Enter to go back to menu...");
758
- } else if (choice === "terminal") {
759
- // Start Terminal UI - it will return when user selects Back
760
- const { startTerminalUI } = require("./src/cli/terminalUI");
761
- await startTerminalUI(port);
762
- // Loop continues, show menu again
763
- } else if (choice === "hide") {
764
- const { clearScreen } = require("./src/cli/utils/display");
765
- clearScreen();
766
-
767
- // Enable auto startup on OS boot
768
- try {
769
- const { enableAutoStart } = require("./src/cli/tray/autostart");
770
- enableAutoStart(__filename);
771
- } catch (e) { }
772
-
773
- if (process.platform === "darwin") {
774
- // macOS: keep current process alive — spawning a detached child puts
775
- // it outside the login session so NSStatusItem silently fails.
776
- process.removeAllListeners("SIGHUP");
777
- process.on("SIGHUP", () => {});
778
-
779
- console.log(`\n⏳ Switching to tray mode... (icon already visible in menu bar)`);
780
- console.log(`🔔 10Router is running in tray (PID: ${process.pid})`);
781
- console.log(` Server: http://${displayHost}:${port}`);
782
- console.log(`\n💡 You can close this terminal. Right-click tray icon to quit.\n`);
783
-
784
- // Tray already init'd at startup — just keep event loop alive.
785
- return;
786
- }
787
-
788
- // Windows/Linux: spawn detached bgProcess (systray works fine in child)
789
- console.log(`\n⏳ Starting background process... (tray icon will appear in ~3s)`);
790
-
791
- const bgProcess = spawn(process.execPath, ["--dns-result-order=ipv4first", __filename, "--tray", "--skip-update", "-p", port.toString()], {
792
- detached: true,
793
- stdio: "ignore",
794
- windowsHide: true,
795
- env: { ...process.env }
796
- });
797
- bgProcess.unref();
798
-
799
- console.log(`🔔 10Router is now running in background (PID: ${bgProcess.pid})`);
800
- console.log(` Server: http://${displayHost}:${port}`);
801
- console.log(`\n💡 You can close this terminal. Right-click tray icon to quit.\n`);
802
-
803
- // cleanup() kills server so bgProcess can claim the port fresh
804
- cleanup();
805
- process.exit(0);
806
- } else if (choice === "exit") {
807
- isShuttingDown = true;
808
- console.log("\nExiting...");
809
- cleanup();
810
- setTimeout(() => process.exit(0), 100);
811
- }
812
- }
813
- } catch (err) {
814
- console.error("Error:", err.message);
815
- cleanup();
816
- process.exit(1);
817
- }
818
- });
819
-
820
- function attachServerEvents() {
821
- server.on("error", (err) => {
822
- console.error("Failed to start server:", err.message);
823
- if (!isShuttingDown) tryRestart();
824
- else { cleanup(); process.exit(1); }
825
- });
826
-
827
- server.on("close", (code) => {
828
- if (isShuttingDown || code === 0) {
829
- process.exit(code || 0);
830
- return;
831
- }
832
- tryRestart(code);
833
- });
834
- }
835
-
836
- function tryRestart(code) {
837
- const aliveMs = Date.now() - serverStartTime;
838
- // Reset counter if last run was stable
839
- if (aliveMs >= RESTART_RESET_MS) restartCount = 0;
840
-
841
- if (restartCount >= MAX_RESTARTS) {
842
- console.error(`\n⚠️ Server crashed ${MAX_RESTARTS} times. Disabling MIT and restarting...`);
843
- try {
844
- const dbPath = path.join(os.homedir(), process.platform === "win32" ? path.join("AppData", "Roaming", "10router", "db.json") : path.join(".10router", "db.json"));
845
- if (fs.existsSync(dbPath)) {
846
- const db = JSON.parse(fs.readFileSync(dbPath, "utf-8"));
847
- if (db.settings) db.settings.mitmEnabled = false;
848
- fs.writeFileSync(dbPath, JSON.stringify(db, null, 2));
849
- }
850
- } catch { /* best effort */ }
851
- restartCount = 0;
852
- server = spawnServer();
853
- attachServerEvents();
854
- return;
855
- }
856
-
857
- restartCount++;
858
- const delay = Math.min(1000 * restartCount, 10000);
859
- console.error(`\n⚠️ Server exited (code=${code ?? "unknown"}). Restarting in ${delay / 1000}s... (${restartCount}/${MAX_RESTARTS})`);
860
- if (crashLog.length) {
861
- console.error("\n--- Server crash log ---");
862
- crashLog.forEach(l => console.error(l));
863
- console.error("--- End crash log ---\n");
864
- }
865
-
866
- setTimeout(() => {
867
- server = spawnServer();
868
- attachServerEvents();
869
- }, delay);
870
- }
871
-
872
- attachServerEvents();
873
- }
1
+ #!/usr/bin/env node
2
+
3
+ const { spawn, exec, execSync } = require("child_process");
4
+ const path = require("path");
5
+ const fs = require("fs");
6
+ const https = require("https");
7
+ const net = require("net");
8
+ const os = require("os");
9
+ const { t } = require("./src/cli/i18n");
10
+
11
+ // Poll until the server accepts TCP connections on port, or timeout avoids blind fixed waits.
12
+ function waitServerReady(port, { timeoutMs = 15000, intervalMs = 150 } = {}) {
13
+ const deadline = Date.now() + timeoutMs;
14
+ return new Promise((resolve) => {
15
+ const tryConnect = () => {
16
+ const socket = net.connect({ host: "127.0.0.1", port }, () => {
17
+ socket.destroy();
18
+ resolve(true);
19
+ });
20
+ socket.on("error", () => {
21
+ socket.destroy();
22
+ if (Date.now() >= deadline) return resolve(false);
23
+ setTimeout(tryConnect, intervalMs);
24
+ });
25
+ };
26
+ tryConnect();
27
+ });
28
+ }
29
+
30
+ // Native spinner - no external dependency
31
+ function createSpinner(text) {
32
+ const frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
33
+ let i = 0;
34
+ let interval = null;
35
+ let currentText = text;
36
+ return {
37
+ start() {
38
+ if (process.stdout.isTTY) {
39
+ process.stdout.write(`\r${frames[0]} ${currentText}`);
40
+ interval = setInterval(() => {
41
+ process.stdout.write(`\r${frames[i++ % frames.length]} ${currentText}`);
42
+ }, 80);
43
+ }
44
+ return this;
45
+ },
46
+ stop() {
47
+ if (interval) {
48
+ clearInterval(interval);
49
+ interval = null;
50
+ }
51
+ if (process.stdout.isTTY) {
52
+ process.stdout.write("\r\x1b[K");
53
+ }
54
+ },
55
+ succeed(msg) {
56
+ this.stop();
57
+ console.log(`✅ ${msg}`);
58
+ },
59
+ fail(msg) {
60
+ this.stop();
61
+ console.log(`❌ ${msg}`);
62
+ }
63
+ };
64
+ }
65
+
66
+ const pkg = require("./package.json");
67
+ const { ensureSqliteRuntime, buildEnvWithRuntime } = require("./hooks/sqliteRuntime");
68
+ const { ensureTrayRuntime } = require("./hooks/trayRuntime");
69
+ const args = process.argv.slice(2);
70
+
71
+ // Subcommands (`10router xai video …`) run against an already-running gateway
72
+ // and bypass the launcher flow (no runtime self-heal, no server spawn).
73
+ if (args[0] === "xai" && args[1] === "video") {
74
+ const { run } = require("./src/cli/commands/xaiVideo");
75
+ run(args.slice(2))
76
+ .then((code) => process.exit(code))
77
+ .catch((err) => {
78
+ console.error(`❌ ${err?.message || err}`);
79
+ process.exit(1);
80
+ });
81
+ return;
82
+ }
83
+
84
+ // Self-heal SQLite runtime deps (sql.js + better-sqlite3) into ~/.10router/runtime
85
+ // so the server can resolve them via NODE_PATH. Best-effort — sql.js is required,
86
+ // better-sqlite3 is optional. Logs to stderr only on failure.
87
+ try { ensureSqliteRuntime({ silent: true }); } catch {}
88
+
89
+ // Self-heal tray runtime (systray for macOS/Linux only). Windows skipped.
90
+ try { ensureTrayRuntime({ silent: true }); } catch {}
91
+
92
+ // Configuration constants
93
+ // Two different names, identical until the npm package was renamed to
94
+ // 10router-cli: APP_NAME is what you install, BIN_NAME is what you then type.
95
+ const APP_NAME = pkg.name;
96
+ const BIN_NAME = Object.keys(pkg.bin ?? {})[0] ?? pkg.name;
97
+ const INSTALL_CMD_LATEST = `npm i -g ${APP_NAME}@latest --prefer-online`;
98
+
99
+ const DEFAULT_PORT = 20128;
100
+ const DEFAULT_HOST = "0.0.0.0";
101
+
102
+ // First non-internal IPv4 — the address remote peers actually reach when bound to 0.0.0.0.
103
+ function getLanIp() {
104
+ for (const ifaces of Object.values(os.networkInterfaces())) {
105
+ for (const i of ifaces || []) {
106
+ if (i.family === "IPv4" && !i.internal) return i.address;
107
+ }
108
+ }
109
+ return null;
110
+ }
111
+
112
+ // Local URL stays "localhost"; warn separately when bound to all interfaces (network-exposed).
113
+ function getDisplayHost() {
114
+ return host === DEFAULT_HOST ? "localhost" : host;
115
+ }
116
+ const MAX_PORT_ATTEMPTS = 10;
117
+ // Identifiers for killAllAppProcesses - only kill 10router specifically
118
+ const PROCESS_IDENTIFIERS = [
119
+ '10router' // Only package name - avoid killing other apps
120
+ ];
121
+
122
+ // Parse arguments
123
+ let port = DEFAULT_PORT;
124
+ let host = DEFAULT_HOST;
125
+ let noBrowser = false;
126
+ let skipUpdate = false;
127
+ let showLog = false;
128
+ let trayMode = false;
129
+
130
+ for (let i = 0; i < args.length; i++) {
131
+ if (args[i] === "--port" || args[i] === "-p") {
132
+ port = parseInt(args[i + 1], 10) || DEFAULT_PORT;
133
+ i++;
134
+ } else if (args[i] === "--host" || args[i] === "-H") {
135
+ host = args[i + 1] || DEFAULT_HOST;
136
+ i++;
137
+ } else if (args[i] === "--no-browser" || args[i] === "-n") {
138
+ noBrowser = true;
139
+ } else if (args[i] === "--log" || args[i] === "-l") {
140
+ showLog = true;
141
+ } else if (args[i] === "--skip-update") {
142
+ skipUpdate = true;
143
+ } else if (args[i] === "--tray" || args[i] === "-t") {
144
+ trayMode = true;
145
+ process.env.TRAY_MODE = "1";
146
+ } else if (args[i] === "--help" || args[i] === "-h") {
147
+ console.log(t("help.text", { bin: BIN_NAME, port: DEFAULT_PORT, host: DEFAULT_HOST }));
148
+ process.exit(0);
149
+ } else if (args[i] === "--version" || args[i] === "-v") {
150
+ console.log(pkg.version);
151
+ process.exit(0);
152
+ }
153
+ }
154
+
155
+ // Auto-relaunch after update: detached process has no TTY → fallback to tray
156
+ if (skipUpdate && !trayMode && !process.stdin.isTTY) {
157
+ trayMode = true;
158
+ process.env.TRAY_MODE = "1";
159
+ }
160
+
161
+ // Always use Node.js runtime with absolute path
162
+ const RUNTIME = process.execPath;
163
+
164
+ // Compare semver versions: returns 1 if a > b, -1 if a < b, 0 if equal
165
+ function compareVersions(a, b) {
166
+ const partsA = a.split(".").map(Number);
167
+ const partsB = b.split(".").map(Number);
168
+ for (let i = 0; i < 3; i++) {
169
+ if (partsA[i] > partsB[i]) return 1;
170
+ if (partsA[i] < partsB[i]) return -1;
171
+ }
172
+ return 0;
173
+ }
174
+
175
+ // Get app data dir (matches app/src/lib/dataDir.js convention)
176
+ function getAppDataDir() {
177
+ return process.platform === "win32"
178
+ ? path.join(process.env.APPDATA || "", "10router")
179
+ : path.join(os.homedir(), ".10router");
180
+ }
181
+
182
+ // Kill PID from file (best-effort, removes file after)
183
+ function killByPidFile(pidFile) {
184
+ try {
185
+ if (!fs.existsSync(pidFile)) return;
186
+ const pid = parseInt(fs.readFileSync(pidFile, "utf8").trim(), 10);
187
+ if (!pid) return;
188
+ try {
189
+ if (process.platform === "win32") {
190
+ execSync(`taskkill /F /T /PID ${pid}`, { stdio: "ignore", windowsHide: true, timeout: 3000 });
191
+ } else {
192
+ process.kill(pid, "SIGKILL");
193
+ }
194
+ } catch { }
195
+ try { fs.unlinkSync(pidFile); } catch { }
196
+ } catch { }
197
+ }
198
+
199
+ // Kill tunnel processes (cloudflared/tailscale) by their PID files
200
+ function killTunnelByPidFile() {
201
+ const tunnelDir = path.join(getAppDataDir(), "tunnel");
202
+ killByPidFile(path.join(tunnelDir, "cloudflared.pid"));
203
+ killByPidFile(path.join(tunnelDir, "tailscale.pid"));
204
+ }
205
+
206
+ // Kill cloudflared whose --url targets this app's port (covers stale PID file case)
207
+ function killCloudflaredByAppPort(appPort) {
208
+ if (!appPort) return [];
209
+ const portMatchers = [`localhost:${appPort}`, `127.0.0.1:${appPort}`];
210
+ const pids = [];
211
+ try {
212
+ if (process.platform === "win32") {
213
+ const psCmd = `powershell -NonInteractive -WindowStyle Hidden -Command "Get-WmiObject Win32_Process -Filter 'Name=\\"cloudflared.exe\\"' | Select-Object ProcessId,CommandLine | ConvertTo-Csv -NoTypeInformation"`;
214
+ const output = execSync(psCmd, { encoding: "utf8", windowsHide: true, timeout: 5000 });
215
+ const lines = output.split("\n").slice(1).filter(l => l.trim());
216
+ lines.forEach(line => {
217
+ if (portMatchers.some(m => line.includes(m))) {
218
+ const match = line.match(/^"(\d+)"/);
219
+ if (match && match[1]) pids.push(match[1]);
220
+ }
221
+ });
222
+ } else {
223
+ const output = execSync("ps -eo pid,command 2>/dev/null", { encoding: "utf8", timeout: 5000 });
224
+ output.split("\n").forEach(line => {
225
+ if (line.includes("cloudflared") && portMatchers.some(m => line.includes(m))) {
226
+ const parts = line.trim().split(/\s+/);
227
+ const pid = parts[0];
228
+ if (pid && !isNaN(pid)) pids.push(pid);
229
+ }
230
+ });
231
+ }
232
+ } catch { }
233
+ return pids;
234
+ }
235
+
236
+ // Kill all 10router processes
237
+ function killAllAppProcesses(appPort) {
238
+ return new Promise((resolve) => {
239
+ try {
240
+ // Background: MITM + tunnel/cloudflared run on separate ports/processes —
241
+ // killing them doesn't free the app port, so don't block the critical path.
242
+ // Server-side MITM manager has stale-lock recovery and starts deferred (~3s).
243
+ setImmediate(() => {
244
+ try { killProxyByPidFile(); } catch {}
245
+ try { killTunnelByPidFile(); } catch {}
246
+ try { killCloudflaredByAppPort(appPort); } catch {}
247
+ });
248
+
249
+ const platform = process.platform;
250
+ let pids = [];
251
+
252
+ if (platform === "win32") {
253
+ // Windows: use WMI to get full CommandLine (tasklist /V doesn't include it)
254
+ try {
255
+ const psCmd = `powershell -NonInteractive -WindowStyle Hidden -Command "Get-WmiObject Win32_Process -Filter 'Name=\\"node.exe\\"' | Select-Object ProcessId,CommandLine | ConvertTo-Csv -NoTypeInformation"`;
256
+ const output = execSync(psCmd, {
257
+ encoding: "utf8",
258
+ windowsHide: true,
259
+ timeout: 5000
260
+ });
261
+ const lines = output.split("\n").slice(1).filter(l => l.trim());
262
+ lines.forEach(line => {
263
+ // Whitelist: real node process running 10router/cli.js, or next-server.
264
+ // Avoids killing editors/grep/strace/cursor that just have "10router" in cmdline.
265
+ const cmd = line.toLowerCase();
266
+ const isAppProcess =
267
+ (cmd.includes("node") && cmd.includes("10router") && (cmd.includes("cli.js") || cmd.includes("\\10router") || cmd.includes("/10router")))
268
+ || cmd.includes("next-server");
269
+ if (isAppProcess) {
270
+ const match = line.match(/^"(\d+)"/);
271
+ if (match && match[1] && match[1] !== process.pid.toString()) {
272
+ pids.push(match[1]);
273
+ }
274
+ }
275
+ });
276
+ } catch (e) {
277
+ // No processes found or error - continue
278
+ }
279
+ } else {
280
+ // macOS/Linux: use ps to find all matching processes
281
+ try {
282
+ const output = execSync('ps aux 2>/dev/null', {
283
+ encoding: 'utf8',
284
+ timeout: 5000
285
+ });
286
+ const lines = output.split('\n');
287
+
288
+ lines.forEach(line => {
289
+ // Whitelist: real node process running 10router/cli.js, or next-server.
290
+ // Avoids killing grep/strace/editors/cursor that incidentally match "10router".
291
+ const cmd = line.toLowerCase();
292
+ const isAppProcess =
293
+ (cmd.includes("node") && cmd.includes("10router") && (cmd.includes("cli.js") || cmd.includes("/10router")))
294
+ || cmd.includes("next-server");
295
+ if (isAppProcess) {
296
+ const parts = line.trim().split(/\s+/);
297
+ const pid = parts[1];
298
+ if (pid && !isNaN(pid) && pid !== process.pid.toString()) {
299
+ pids.push(pid);
300
+ }
301
+ }
302
+ });
303
+ } catch (e) {
304
+ // No processes found or error - continue
305
+ }
306
+ }
307
+
308
+ // Kill all found processes
309
+ if (pids.length > 0) {
310
+ pids.forEach(pid => {
311
+ try {
312
+ if (platform === "win32") {
313
+ execSync(`taskkill /F /PID ${pid} 2>nul`, { stdio: 'ignore', shell: true, windowsHide: true, timeout: 3000 });
314
+ } else {
315
+ execSync(`kill -9 ${pid} 2>/dev/null`, { stdio: 'ignore', timeout: 3000 });
316
+ }
317
+ } catch (err) {
318
+ // Process already dead or can't kill - continue
319
+ }
320
+ });
321
+
322
+ // Wait for processes to fully terminate
323
+ setTimeout(() => resolve(), 1000);
324
+ } else {
325
+ resolve();
326
+ }
327
+ } catch (err) {
328
+ // Silent fail - continue anyway
329
+ resolve();
330
+ }
331
+ });
332
+ }
333
+
334
+ // Sleep helper using SharedArrayBuffer wait (sync, no busy-loop)
335
+ function sleepSync(ms) {
336
+ try { Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms); } catch { /* ignore */ }
337
+ }
338
+
339
+ // Wait until process dies or timeout reached
340
+ function waitForExit(pid, timeoutMs) {
341
+ const deadline = Date.now() + timeoutMs;
342
+ while (Date.now() < deadline) {
343
+ try { process.kill(pid, 0); } catch { return true; }
344
+ sleepSync(100);
345
+ }
346
+ return false;
347
+ }
348
+
349
+ // Kill MIT server by PID file (runs privileged, needs special handling)
350
+ // Sends SIGTERM first so MIT can clean up host entries before dying.
351
+ function killProxyByPidFile() {
352
+ try {
353
+ const pidFile = path.join(getAppDataDir(), "mitm", ".mitm.pid");
354
+ if (!fs.existsSync(pidFile)) return;
355
+ const pid = parseInt(fs.readFileSync(pidFile, "utf8").trim(), 10);
356
+ if (!pid) return;
357
+
358
+ if (process.platform === "win32") {
359
+ // Graceful first (lets server cleanup hosts), then force
360
+ try { execSync(`taskkill /T /PID ${pid}`, { stdio: "ignore", windowsHide: true, timeout: 2000 }); } catch { }
361
+ if (!waitForExit(pid, 1500)) {
362
+ try { execSync(`taskkill /F /T /PID ${pid}`, { stdio: "ignore", windowsHide: true, timeout: 3000 }); } catch { }
363
+ }
364
+ // Last-resort: PowerShell Stop-Process (sometimes succeeds where taskkill fails on admin processes)
365
+ if (!waitForExit(pid, 500)) {
366
+ try { execSync(`powershell -NonInteractive -WindowStyle Hidden -Command "Stop-Process -Id ${pid} -Force"`, { stdio: "ignore", windowsHide: true, timeout: 3000 }); } catch { }
367
+ }
368
+ } else {
369
+ // SIGTERM via cached sudo token first
370
+ try { execSync(`sudo -n kill -TERM ${pid} 2>/dev/null`, { stdio: "ignore", timeout: 2000 }); }
371
+ catch { try { process.kill(pid, "SIGTERM"); } catch { } }
372
+ if (!waitForExit(pid, 1500)) {
373
+ try { execSync(`sudo -n kill -9 ${pid} 2>/dev/null`, { stdio: "ignore", timeout: 2000 }); }
374
+ catch { try { process.kill(pid, "SIGKILL"); } catch { } }
375
+ }
376
+ }
377
+ try { fs.unlinkSync(pidFile); } catch { }
378
+ } catch { }
379
+ }
380
+
381
+ // Kill any process on specific port
382
+ function killProcessOnPort(port) {
383
+ return new Promise((resolve) => {
384
+ try {
385
+ const platform = process.platform;
386
+ let pid;
387
+
388
+ if (platform === "win32") {
389
+ try {
390
+ const output = execSync(`netstat -ano | findstr :${port}`, {
391
+ encoding: 'utf8',
392
+ shell: true,
393
+ windowsHide: true,
394
+ timeout: 5000
395
+ }).trim();
396
+ const lines = output.split('\n').filter(l => l.includes('LISTENING'));
397
+ if (lines.length > 0) {
398
+ pid = lines[0].trim().split(/\s+/).pop();
399
+ execSync(`taskkill /F /PID ${pid} 2>nul`, { stdio: 'ignore', shell: true, windowsHide: true, timeout: 3000 });
400
+ }
401
+ } catch (e) {
402
+ // Port is free or error
403
+ }
404
+ } else {
405
+ // macOS/Linux
406
+ try {
407
+ const pidOutput = execSync(`lsof -ti:${port}`, {
408
+ encoding: 'utf8',
409
+ stdio: ['pipe', 'pipe', 'ignore']
410
+ }).trim();
411
+ if (pidOutput) {
412
+ pid = pidOutput.split('\n')[0];
413
+ execSync(`kill -9 ${pid} 2>/dev/null`, { stdio: 'ignore', timeout: 3000 });
414
+ }
415
+ } catch (e) {
416
+ // Port is free or error
417
+ }
418
+ }
419
+
420
+ // Wait for port to be released
421
+ setTimeout(() => resolve(), 500);
422
+ } catch (err) {
423
+ // Silent fail - continue anyway
424
+ resolve();
425
+ }
426
+ });
427
+ }
428
+
429
+
430
+ // Detect if running in restricted environment (Codespaces, Docker)
431
+ function isRestrictedEnvironment() {
432
+ // Check for Codespaces
433
+ if (process.env.CODESPACES === "true" || process.env.GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN) {
434
+ return "GitHub Codespaces";
435
+ }
436
+
437
+ // Check for Docker
438
+ if (fs.existsSync("/.dockerenv") || (fs.existsSync("/proc/1/cgroup") && fs.readFileSync("/proc/1/cgroup", "utf8").includes("docker"))) {
439
+ return "Docker";
440
+ }
441
+
442
+ return null;
443
+ }
444
+
445
+ // Check if new version available, return latest version or null
446
+ function checkForUpdate() {
447
+ return new Promise((resolve) => {
448
+ if (skipUpdate) {
449
+ resolve(null);
450
+ return;
451
+ }
452
+
453
+ const spinner = createSpinner(t("update.checking")).start();
454
+ let resolved = false;
455
+
456
+ const safetyTimeout = setTimeout(() => {
457
+ if (!resolved) {
458
+ resolved = true;
459
+ spinner.stop();
460
+ resolve(null);
461
+ }
462
+ }, 8000);
463
+
464
+ const done = (version) => {
465
+ if (resolved) return;
466
+ resolved = true;
467
+ clearTimeout(safetyTimeout);
468
+ spinner.stop();
469
+ resolve(version);
470
+ };
471
+
472
+ const req = https.get(`https://registry.npmjs.org/${pkg.name}/latest`, { timeout: 3000 }, (res) => {
473
+ let data = "";
474
+ res.on("data", chunk => data += chunk);
475
+ res.on("end", () => {
476
+ try {
477
+ const latest = JSON.parse(data);
478
+ if (latest.version && compareVersions(latest.version, pkg.version) > 0) {
479
+ done(latest.version);
480
+ } else {
481
+ done(null);
482
+ }
483
+ } catch (e) {
484
+ done(null);
485
+ }
486
+ });
487
+ });
488
+
489
+ req.on("error", () => done(null));
490
+ req.on("timeout", () => { req.destroy(); done(null); });
491
+ });
492
+ }
493
+
494
+ // Open browser
495
+ function openBrowser(url) {
496
+ const platform = process.platform;
497
+ let cmd;
498
+
499
+ if (platform === "darwin") {
500
+ cmd = `open "${url}"`;
501
+ } else if (platform === "win32") {
502
+ cmd = `start "" "${url}"`;
503
+ } else {
504
+ cmd = `xdg-open "${url}"`;
505
+ }
506
+
507
+ exec(cmd, { windowsHide: true }, (err) => {
508
+ if (err) {
509
+ console.log(t("update.openManually", { url }));
510
+ }
511
+ });
512
+ }
513
+
514
+ // Find standalone server (bundled in bin/app for published package).
515
+ // Prefer custom-server.js (injects real socket IP) when present.
516
+ const standaloneDir = path.join(__dirname, "app");
517
+ const customServerPath = path.join(standaloneDir, "custom-server.js");
518
+ const serverPath = fs.existsSync(customServerPath)
519
+ ? customServerPath
520
+ : path.join(standaloneDir, "server.js");
521
+
522
+ if (!fs.existsSync(serverPath)) {
523
+ console.error(t("error.standaloneMissing"));
524
+ console.error(t("error.standaloneHint"));
525
+ process.exit(1);
526
+ }
527
+
528
+ // Start server immediately; run update check in parallel (not on the critical path).
529
+ const updatePromise = checkForUpdate();
530
+ killAllAppProcesses(port)
531
+ .then(() => killProcessOnPort(port))
532
+ .then(() => startServer(updatePromise));
533
+
534
+ // Show interface selection menu
535
+ async function showInterfaceMenu(latestVersion) {
536
+ const { selectMenu } = require("./src/cli/utils/input");
537
+ const { clearScreen } = require("./src/cli/utils/display");
538
+ const { getEndpoint } = require("./src/cli/utils/endpoint");
539
+
540
+ clearScreen();
541
+
542
+ const displayHost = getDisplayHost();
543
+
544
+ // Detect tunnel/local mode for server URL display
545
+ let serverUrl;
546
+ try {
547
+ const { endpoint, tunnelEnabled } = await getEndpoint(port);
548
+ serverUrl = tunnelEnabled ? endpoint.replace(/\/v1$/, "") : `http://${displayHost}:${port}`;
549
+ } catch (e) {
550
+ serverUrl = `http://${displayHost}:${port}`;
551
+ }
552
+
553
+ const subtitle = t("menu.serverSubtitle", { url: `\x1b[32m${serverUrl}\x1b[0m` });
554
+
555
+ const menuItems = [];
556
+
557
+ if (latestVersion) {
558
+ menuItems.push({ label: t("menu.updateTo", { latest: latestVersion, current: pkg.version }), icon: "⬆" });
559
+ }
560
+
561
+ menuItems.push(
562
+ { label: t("menu.webUi"), icon: "🌐" },
563
+ { label: t("menu.terminalUi"), icon: "💻" },
564
+ { label: t("menu.hideToTray"), icon: "🔔" },
565
+ { label: t("menu.exit"), icon: "🚪" }
566
+ );
567
+
568
+ const selected = await selectMenu(t("menu.interfaceTitle", { version: pkg.version }), menuItems, 0, subtitle);
569
+
570
+ const offset = latestVersion ? 1 : 0;
571
+
572
+ if (latestVersion && selected === 0) return "update";
573
+ if (selected === offset) return "web";
574
+ if (selected === offset + 1) return "terminal";
575
+ if (selected === offset + 2) return "hide";
576
+ return "exit";
577
+ }
578
+
579
+ const MAX_RESTARTS = 2;
580
+ const RESTART_RESET_MS = 30000; // Reset counter if alive > 30s
581
+
582
+ function startServer(updatePromise) {
583
+ // Accept either a Promise (parallel update check) or a resolved value.
584
+ const latestVersionPromise = Promise.resolve(updatePromise);
585
+ const displayHost = getDisplayHost();
586
+ const url = `http://${displayHost}:${port}/dashboard`;
587
+ // Surface real network exposure when bound to all interfaces (default 0.0.0.0).
588
+ if (host === DEFAULT_HOST) {
589
+ const lanIp = getLanIp();
590
+ if (lanIp) console.log(`\x1b[33m${t("launcher.networkExposed", { url: `http://${lanIp}:${port}` })}\x1b[0m`);
591
+ }
592
+
593
+ let restartCount = 0;
594
+ let serverStartTime = Date.now();
595
+
596
+ const CRASH_LOG_LINES = 50;
597
+ let crashLog = [];
598
+
599
+ function spawnServer() {
600
+ serverStartTime = Date.now();
601
+ crashLog = [];
602
+ const child = spawn(RUNTIME, ["--dns-result-order=ipv4first", "--max-old-space-size=6144", serverPath], {
603
+ cwd: standaloneDir,
604
+ stdio: showLog ? "inherit" : ["ignore", "ignore", "pipe"],
605
+ detached: true,
606
+ windowsHide: true,
607
+ env: {
608
+ ...buildEnvWithRuntime(process.env),
609
+ PORT: port.toString(),
610
+ HOSTNAME: host
611
+ }
612
+ });
613
+ if (!showLog && child.stderr) {
614
+ child.stderr.on("data", (data) => {
615
+ const lines = data.toString().split("\n").filter(Boolean);
616
+ crashLog.push(...lines);
617
+ if (crashLog.length > CRASH_LOG_LINES) crashLog = crashLog.slice(-CRASH_LOG_LINES);
618
+ });
619
+ }
620
+ return child;
621
+ }
622
+
623
+ let server = spawnServer();
624
+
625
+ // Cleanup function - force kill server process
626
+ let isCleaningUp = false;
627
+ function cleanup() {
628
+ if (isCleaningUp) return;
629
+ isCleaningUp = true;
630
+ try {
631
+ // Kill tray if running
632
+ try {
633
+ const { killTray } = require("./src/cli/tray/tray");
634
+ killTray();
635
+ } catch (e) { }
636
+ // Kill MIT server (privileged process) via PID file
637
+ killProxyByPidFile();
638
+ // Kill cloudflared/tailscale via PID file (only this app's tunnel)
639
+ killTunnelByPidFile();
640
+ // Kill server process directly
641
+ if (server.pid) {
642
+ process.kill(server.pid, "SIGKILL");
643
+ }
644
+ // Also try to kill process group
645
+ process.kill(-server.pid, "SIGKILL");
646
+ } catch (e) { }
647
+ }
648
+
649
+ // Suppress all errors during shutdown (systray lib throws JSON parse errors)
650
+ let isShuttingDown = false;
651
+ process.on("uncaughtException", (err) => {
652
+ if (isShuttingDown) return;
653
+ console.error(t("common.error"), err.message);
654
+ });
655
+
656
+ // Handle all exit scenarios
657
+ process.on("SIGINT", () => {
658
+ if (isShuttingDown) return;
659
+ isShuttingDown = true;
660
+ console.log(t("launcher.exiting"));
661
+ cleanup();
662
+ setTimeout(() => process.exit(0), 100);
663
+ });
664
+ process.on("SIGTERM", () => {
665
+ if (isShuttingDown) return;
666
+ isShuttingDown = true;
667
+ cleanup();
668
+ setTimeout(() => process.exit(0), 100);
669
+ });
670
+ process.on("SIGHUP", () => {
671
+ if (isShuttingDown) return;
672
+ isShuttingDown = true;
673
+ cleanup();
674
+ setTimeout(() => process.exit(0), 100);
675
+ });
676
+
677
+ // Initialize tray icon (runs alongside TUI)
678
+ const initTrayIcon = () => {
679
+ try {
680
+ const { initTray } = require("./src/cli/tray/tray");
681
+ initTray({
682
+ port,
683
+ onQuit: () => {
684
+ isShuttingDown = true;
685
+ console.log(t("launcher.shutdownFromTray"));
686
+ cleanup();
687
+ setTimeout(() => process.exit(0), 100);
688
+ },
689
+ onOpenDashboard: () => openBrowser(url)
690
+ });
691
+ } catch (err) {
692
+ // Tray not available - continue without it
693
+ }
694
+ };
695
+
696
+ // Tray-only mode: no TUI, just tray icon
697
+ if (trayMode) {
698
+ // Ignore SIGHUP so macOS terminal close doesn't kill the background tray process
699
+ process.removeAllListeners("SIGHUP");
700
+ process.on("SIGHUP", () => {});
701
+
702
+ console.log(t("launcher.banner", { name: pkg.name, version: pkg.version }));
703
+ console.log(t("launcher.serverLine", { url: `http://${displayHost}:${port}` }));
704
+
705
+ waitServerReady(port).then(() => {
706
+ initTrayIcon();
707
+ console.log(t("launcher.trayReady"));
708
+ console.log(t("launcher.trayReadyHint"));
709
+ });
710
+
711
+ return;
712
+ }
713
+
714
+ // Wait for server to be ready, then show interface menu loop + tray
715
+ waitServerReady(port).then(async () => {
716
+ // Resolve parallel update check (already running); don't block server start on it.
717
+ const latestVersion = await latestVersionPromise;
718
+ // Start tray icon alongside TUI
719
+ initTrayIcon();
720
+
721
+ try {
722
+ while (true) {
723
+ const choice = await showInterfaceMenu(latestVersion);
724
+
725
+ if (choice === "update") {
726
+ isShuttingDown = true;
727
+ const { clearScreen } = require("./src/cli/utils/display");
728
+ clearScreen();
729
+ console.log(t("launcher.updateHeader", { current: pkg.version, latest: latestVersion }));
730
+ console.log(t("launcher.updateRunAfterExit"));
731
+ console.log(` \x1b[33m${INSTALL_CMD_LATEST}\x1b[0m\n`);
732
+ cleanup();
733
+ await killAllAppProcesses(port);
734
+ await killProcessOnPort(port);
735
+ setTimeout(() => process.exit(0), 200);
736
+ return;
737
+ } else if (choice === "web") {
738
+ openBrowser(url);
739
+ // Wait for user to come back
740
+ const { pause } = require("./src/cli/utils/input");
741
+ await pause(t("launcher.pressEnterBack"));
742
+ } else if (choice === "terminal") {
743
+ // Start Terminal UI - it will return when user selects Back
744
+ const { startTerminalUI } = require("./src/cli/terminalUI");
745
+ await startTerminalUI(port);
746
+ // Loop continues, show menu again
747
+ } else if (choice === "hide") {
748
+ const { clearScreen } = require("./src/cli/utils/display");
749
+ clearScreen();
750
+
751
+ // Enable auto startup on OS boot
752
+ try {
753
+ const { enableAutoStart } = require("./src/cli/tray/autostart");
754
+ enableAutoStart(__filename);
755
+ } catch (e) { }
756
+
757
+ if (process.platform === "darwin") {
758
+ // macOS: keep current process alive — spawning a detached child puts
759
+ // it outside the login session so NSStatusItem silently fails.
760
+ process.removeAllListeners("SIGHUP");
761
+ process.on("SIGHUP", () => {});
762
+
763
+ console.log(t("launcher.switchingToTray"));
764
+ console.log(t("launcher.trayRunning", { pid: process.pid }));
765
+ console.log(t("launcher.serverLineIndent", { url: `http://${displayHost}:${port}` }));
766
+ console.log(t("launcher.closeTerminalHint"));
767
+
768
+ // Tray already init'd at startup — just keep event loop alive.
769
+ return;
770
+ }
771
+
772
+ // Windows/Linux: spawn detached bgProcess (systray works fine in child)
773
+ console.log(t("launcher.startingBackground"));
774
+
775
+ const bgProcess = spawn(process.execPath, ["--dns-result-order=ipv4first", __filename, "--tray", "--skip-update", "-p", port.toString()], {
776
+ detached: true,
777
+ stdio: "ignore",
778
+ windowsHide: true,
779
+ env: { ...process.env }
780
+ });
781
+ bgProcess.unref();
782
+
783
+ console.log(t("launcher.backgroundRunning", { pid: bgProcess.pid }));
784
+ console.log(t("launcher.serverLineIndent", { url: `http://${displayHost}:${port}` }));
785
+ console.log(t("launcher.closeTerminalHint"));
786
+
787
+ // cleanup() kills server so bgProcess can claim the port fresh
788
+ cleanup();
789
+ process.exit(0);
790
+ } else if (choice === "exit") {
791
+ isShuttingDown = true;
792
+ console.log(t("launcher.exiting"));
793
+ cleanup();
794
+ setTimeout(() => process.exit(0), 100);
795
+ }
796
+ }
797
+ } catch (err) {
798
+ console.error(t("common.error"), err.message);
799
+ cleanup();
800
+ process.exit(1);
801
+ }
802
+ });
803
+
804
+ function attachServerEvents() {
805
+ server.on("error", (err) => {
806
+ console.error(t("launcher.startFailed", { message: err.message }));
807
+ if (!isShuttingDown) tryRestart();
808
+ else { cleanup(); process.exit(1); }
809
+ });
810
+
811
+ server.on("close", (code) => {
812
+ if (isShuttingDown || code === 0) {
813
+ process.exit(code || 0);
814
+ return;
815
+ }
816
+ tryRestart(code);
817
+ });
818
+ }
819
+
820
+ function tryRestart(code) {
821
+ const aliveMs = Date.now() - serverStartTime;
822
+ // Reset counter if last run was stable
823
+ if (aliveMs >= RESTART_RESET_MS) restartCount = 0;
824
+
825
+ if (restartCount >= MAX_RESTARTS) {
826
+ console.error(t("launcher.crashedDisablingMit", { count: MAX_RESTARTS }));
827
+ try {
828
+ const dbPath = path.join(os.homedir(), process.platform === "win32" ? path.join("AppData", "Roaming", "10router", "db.json") : path.join(".10router", "db.json"));
829
+ if (fs.existsSync(dbPath)) {
830
+ const db = JSON.parse(fs.readFileSync(dbPath, "utf-8"));
831
+ if (db.settings) db.settings.mitmEnabled = false;
832
+ fs.writeFileSync(dbPath, JSON.stringify(db, null, 2));
833
+ }
834
+ } catch { /* best effort */ }
835
+ restartCount = 0;
836
+ server = spawnServer();
837
+ attachServerEvents();
838
+ return;
839
+ }
840
+
841
+ restartCount++;
842
+ const delay = Math.min(1000 * restartCount, 10000);
843
+ console.error(t("launcher.crashedRestarting", { code: code ?? "unknown", seconds: delay / 1000, attempt: restartCount, max: MAX_RESTARTS }));
844
+ if (crashLog.length) {
845
+ console.error(t("launcher.crashLogHeader"));
846
+ crashLog.forEach(l => console.error(l));
847
+ console.error(t("launcher.crashLogFooter"));
848
+ }
849
+
850
+ setTimeout(() => {
851
+ server = spawnServer();
852
+ attachServerEvents();
853
+ }, delay);
854
+ }
855
+
856
+ attachServerEvents();
857
+ }