9router 0.2.95 → 0.2.97

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 (249) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/app-path-routes-manifest.json +36 -36
  3. package/app/.next/build-manifest.json +2 -2
  4. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  5. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  6. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  7. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/_global-error.html +2 -2
  16. package/app/.next/server/app/_global-error.rsc +1 -1
  17. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  18. package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  19. package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  20. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  21. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  22. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  23. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/_not-found.html +1 -1
  25. package/app/.next/server/app/_not-found.rsc +2 -2
  26. package/app/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  27. package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  28. package/app/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  29. package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  30. package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  31. package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  32. package/app/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  34. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route_client-reference-manifest.js +1 -1
  35. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
  36. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route_client-reference-manifest.js +1 -1
  37. package/app/.next/server/app/api/cli-tools/claude-settings/route_client-reference-manifest.js +1 -1
  38. package/app/.next/server/app/api/cli-tools/codex-settings/route_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/api/cli-tools/droid-settings/route_client-reference-manifest.js +1 -1
  40. package/app/.next/server/app/api/cli-tools/openclaw-settings/route_client-reference-manifest.js +1 -1
  41. package/app/.next/server/app/api/cloud/auth/route_client-reference-manifest.js +1 -1
  42. package/app/.next/server/app/api/cloud/credentials/update/route_client-reference-manifest.js +1 -1
  43. package/app/.next/server/app/api/cloud/model/resolve/route_client-reference-manifest.js +1 -1
  44. package/app/.next/server/app/api/cloud/models/alias/route_client-reference-manifest.js +1 -1
  45. package/app/.next/server/app/api/combos/[id]/route_client-reference-manifest.js +1 -1
  46. package/app/.next/server/app/api/combos/route_client-reference-manifest.js +1 -1
  47. package/app/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  48. package/app/.next/server/app/api/keys/[id]/route_client-reference-manifest.js +1 -1
  49. package/app/.next/server/app/api/keys/route_client-reference-manifest.js +1 -1
  50. package/app/.next/server/app/api/models/alias/route_client-reference-manifest.js +1 -1
  51. package/app/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
  52. package/app/.next/server/app/api/oauth/[provider]/[action]/route_client-reference-manifest.js +1 -1
  53. package/app/.next/server/app/api/oauth/cursor/auto-import/route_client-reference-manifest.js +1 -1
  54. package/app/.next/server/app/api/oauth/cursor/import/route_client-reference-manifest.js +1 -1
  55. package/app/.next/server/app/api/oauth/kiro/auto-import/route_client-reference-manifest.js +1 -1
  56. package/app/.next/server/app/api/oauth/kiro/import/route_client-reference-manifest.js +1 -1
  57. package/app/.next/server/app/api/oauth/kiro/social-authorize/route_client-reference-manifest.js +1 -1
  58. package/app/.next/server/app/api/oauth/kiro/social-exchange/route_client-reference-manifest.js +1 -1
  59. package/app/.next/server/app/api/pricing/route_client-reference-manifest.js +1 -1
  60. package/app/.next/server/app/api/provider-nodes/[id]/route_client-reference-manifest.js +1 -1
  61. package/app/.next/server/app/api/provider-nodes/route_client-reference-manifest.js +1 -1
  62. package/app/.next/server/app/api/provider-nodes/validate/route_client-reference-manifest.js +1 -1
  63. package/app/.next/server/app/api/providers/[id]/models/route_client-reference-manifest.js +1 -1
  64. package/app/.next/server/app/api/providers/[id]/route_client-reference-manifest.js +1 -1
  65. package/app/.next/server/app/api/providers/[id]/test/route_client-reference-manifest.js +1 -1
  66. package/app/.next/server/app/api/providers/client/route_client-reference-manifest.js +1 -1
  67. package/app/.next/server/app/api/providers/route_client-reference-manifest.js +1 -1
  68. package/app/.next/server/app/api/providers/test-batch/route_client-reference-manifest.js +1 -1
  69. package/app/.next/server/app/api/providers/validate/route_client-reference-manifest.js +1 -1
  70. package/app/.next/server/app/api/settings/require-login/route_client-reference-manifest.js +1 -1
  71. package/app/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  72. package/app/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  73. package/app/.next/server/app/api/tags/route_client-reference-manifest.js +1 -1
  74. package/app/.next/server/app/api/translator/load/route_client-reference-manifest.js +1 -1
  75. package/app/.next/server/app/api/translator/save/route_client-reference-manifest.js +1 -1
  76. package/app/.next/server/app/api/translator/send/route_client-reference-manifest.js +1 -1
  77. package/app/.next/server/app/api/translator/translate/route_client-reference-manifest.js +1 -1
  78. package/app/.next/server/app/api/tunnel/disable/route_client-reference-manifest.js +1 -1
  79. package/app/.next/server/app/api/tunnel/enable/route_client-reference-manifest.js +1 -1
  80. package/app/.next/server/app/api/tunnel/status/route_client-reference-manifest.js +1 -1
  81. package/app/.next/server/app/api/usage/[connectionId]/route_client-reference-manifest.js +1 -1
  82. package/app/.next/server/app/api/usage/chart/route_client-reference-manifest.js +1 -1
  83. package/app/.next/server/app/api/usage/history/route_client-reference-manifest.js +1 -1
  84. package/app/.next/server/app/api/usage/providers/route_client-reference-manifest.js +1 -1
  85. package/app/.next/server/app/api/usage/request-details/route_client-reference-manifest.js +1 -1
  86. package/app/.next/server/app/api/usage/request-logs/route_client-reference-manifest.js +1 -1
  87. package/app/.next/server/app/api/usage/stream/route_client-reference-manifest.js +1 -1
  88. package/app/.next/server/app/api/v1/api/chat/route_client-reference-manifest.js +1 -1
  89. package/app/.next/server/app/api/v1/chat/completions/route_client-reference-manifest.js +1 -1
  90. package/app/.next/server/app/api/v1/embeddings/route_client-reference-manifest.js +1 -1
  91. package/app/.next/server/app/api/v1/messages/count_tokens/route_client-reference-manifest.js +1 -1
  92. package/app/.next/server/app/api/v1/messages/route_client-reference-manifest.js +1 -1
  93. package/app/.next/server/app/api/v1/models/route_client-reference-manifest.js +1 -1
  94. package/app/.next/server/app/api/v1/responses/route_client-reference-manifest.js +1 -1
  95. package/app/.next/server/app/api/v1/route_client-reference-manifest.js +1 -1
  96. package/app/.next/server/app/api/v1beta/models/[...path]/route_client-reference-manifest.js +1 -1
  97. package/app/.next/server/app/api/v1beta/models/route_client-reference-manifest.js +1 -1
  98. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  99. package/app/.next/server/app/callback.html +1 -1
  100. package/app/.next/server/app/callback.rsc +2 -2
  101. package/app/.next/server/app/callback.segments/_full.segment.rsc +2 -2
  102. package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  103. package/app/.next/server/app/callback.segments/_index.segment.rsc +2 -2
  104. package/app/.next/server/app/callback.segments/_tree.segment.rsc +1 -1
  105. package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  106. package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  107. package/app/.next/server/app/dashboard/cli-tools.html +1 -1
  108. package/app/.next/server/app/dashboard/cli-tools.rsc +4 -4
  109. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  110. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  111. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  112. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  113. package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +4 -4
  114. package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  115. package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +2 -2
  116. package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  117. package/app/.next/server/app/dashboard/combos.html +1 -1
  118. package/app/.next/server/app/dashboard/combos.rsc +4 -4
  119. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  120. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  121. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  122. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  123. package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +4 -4
  124. package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  125. package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +2 -2
  126. package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  127. package/app/.next/server/app/dashboard/endpoint.html +1 -1
  128. package/app/.next/server/app/dashboard/endpoint.rsc +4 -4
  129. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  130. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  131. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  132. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  133. package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +4 -4
  134. package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  135. package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +2 -2
  136. package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  137. package/app/.next/server/app/dashboard/profile.html +1 -1
  138. package/app/.next/server/app/dashboard/profile.rsc +4 -4
  139. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  140. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  141. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  142. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  143. package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +4 -4
  144. package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  145. package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +2 -2
  146. package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  147. package/app/.next/server/app/dashboard/providers/new.html +1 -1
  148. package/app/.next/server/app/dashboard/providers/new.rsc +4 -4
  149. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  150. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  151. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  152. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  153. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  154. package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +4 -4
  155. package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  156. package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +2 -2
  157. package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  158. package/app/.next/server/app/dashboard/providers.html +1 -1
  159. package/app/.next/server/app/dashboard/providers.rsc +4 -4
  160. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  161. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  162. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  163. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  164. package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +4 -4
  165. package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  166. package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +2 -2
  167. package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  168. package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  169. package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
  170. package/app/.next/server/app/dashboard/settings/pricing.rsc +2 -2
  171. package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +2 -2
  172. package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  173. package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +2 -2
  174. package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  175. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  176. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  177. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  178. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  179. package/app/.next/server/app/dashboard/translator.html +1 -1
  180. package/app/.next/server/app/dashboard/translator.rsc +4 -4
  181. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  182. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  183. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  184. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  185. package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +4 -4
  186. package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  187. package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +2 -2
  188. package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  189. package/app/.next/server/app/dashboard/usage.html +1 -1
  190. package/app/.next/server/app/dashboard/usage.rsc +4 -4
  191. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  192. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  193. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  194. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  195. package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +4 -4
  196. package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  197. package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +2 -2
  198. package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  199. package/app/.next/server/app/dashboard.html +1 -1
  200. package/app/.next/server/app/dashboard.rsc +4 -4
  201. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  202. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  203. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  204. package/app/.next/server/app/dashboard.segments/_full.segment.rsc +4 -4
  205. package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  206. package/app/.next/server/app/dashboard.segments/_index.segment.rsc +2 -2
  207. package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  208. package/app/.next/server/app/index.html +1 -1
  209. package/app/.next/server/app/index.rsc +2 -2
  210. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  211. package/app/.next/server/app/index.segments/_full.segment.rsc +2 -2
  212. package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
  213. package/app/.next/server/app/index.segments/_index.segment.rsc +2 -2
  214. package/app/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  215. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  216. package/app/.next/server/app/landing.html +1 -1
  217. package/app/.next/server/app/landing.rsc +2 -2
  218. package/app/.next/server/app/landing.segments/_full.segment.rsc +2 -2
  219. package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  220. package/app/.next/server/app/landing.segments/_index.segment.rsc +2 -2
  221. package/app/.next/server/app/landing.segments/_tree.segment.rsc +1 -1
  222. package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  223. package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  224. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  225. package/app/.next/server/app/login.html +1 -1
  226. package/app/.next/server/app/login.rsc +3 -3
  227. package/app/.next/server/app/login.segments/_full.segment.rsc +3 -3
  228. package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
  229. package/app/.next/server/app/login.segments/_index.segment.rsc +2 -2
  230. package/app/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  231. package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  232. package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
  233. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  234. package/app/.next/server/app-paths-manifest.json +36 -36
  235. package/app/.next/server/chunks/6186.js +4 -4
  236. package/app/.next/server/chunks/8694.js +1 -1
  237. package/app/.next/server/pages/404.html +1 -1
  238. package/app/.next/server/pages/500.html +2 -2
  239. package/app/.next/server/server-reference-manifest.js +1 -1
  240. package/app/.next/server/server-reference-manifest.json +1 -1
  241. package/app/.next/static/chunks/{8729-698bbd000dcc5476.js → 8729-564f99e14e0945b1.js} +1 -1
  242. package/app/package.json +1 -1
  243. package/app/src/mitm/cert/install.js +39 -6
  244. package/app/src/mitm/dns/dnsConfig.js +13 -3
  245. package/app/src/mitm/manager.js +97 -63
  246. package/app/src/mitm/server.js +7 -0
  247. package/package.json +1 -1
  248. /package/app/.next/static/{KJ0EmyBzHTnjNSb2Y-GW4 → xlwqCpfIhGINB7z-eb6uC}/_buildManifest.js +0 -0
  249. /package/app/.next/static/{KJ0EmyBzHTnjNSb2Y-GW4 → xlwqCpfIhGINB7z-eb6uC}/_ssgManifest.js +0 -0
@@ -3,6 +3,7 @@ const path = require("path");
3
3
  const fs = require("fs");
4
4
  const os = require("os");
5
5
  const net = require("net");
6
+ const https = require("https");
6
7
  const crypto = require("crypto");
7
8
  const { addDNSEntry, removeDNSEntry, checkDNSEntry } = require("./dns/dnsConfig");
8
9
 
@@ -49,12 +50,14 @@ function getCachedPassword() { return globalThis.__mitmSudoPassword || null; }
49
50
  function setCachedPassword(pwd) { globalThis.__mitmSudoPassword = pwd; }
50
51
 
51
52
  // Check if a PID is alive
53
+ // EACCES = process exists but no permission (e.g. root process) → still alive
54
+ // ESRCH = process does not exist → dead
52
55
  function isProcessAlive(pid) {
53
56
  try {
54
57
  process.kill(pid, 0);
55
58
  return true;
56
- } catch {
57
- return false;
59
+ } catch (err) {
60
+ return err.code === "EACCES";
58
61
  }
59
62
  }
60
63
 
@@ -165,53 +168,36 @@ function checkPort443Free() {
165
168
  * Get PID and process name currently holding port 443
166
169
  * Returns { pid, name } or null if port is free / cannot determine
167
170
  */
168
- function getPort443Owner() {
171
+ function getPort443Owner(sudoPassword) {
169
172
  return new Promise((resolve) => {
170
- const cmd = IS_WIN
171
- ? `netstat -ano | findstr ":443 "`
172
- // Only match TCP processes actually LISTEN-ing on port 443 (not outbound UDP/QUIC)
173
- : `lsof -i TCP:${MITM_PORT} -n -P -sTCP:LISTEN`;
174
-
175
- exec(cmd, (err, stdout) => {
176
- if (err || !stdout.trim()) return resolve(null);
177
-
178
- let pid = null;
179
-
180
- if (IS_WIN) {
181
- // netstat line: " TCP 0.0.0.0:443 0.0.0.0:0 LISTENING 1234"
173
+ if (IS_WIN) {
174
+ exec(`netstat -ano | findstr ":443 "`, (err, stdout) => {
175
+ if (err || !stdout.trim()) return resolve(null);
182
176
  for (const line of stdout.split("\n")) {
183
177
  const match = line.match(/LISTENING\s+(\d+)/i);
184
- if (match) { pid = parseInt(match[1], 10); break; }
178
+ if (match) {
179
+ const pid = parseInt(match[1], 10);
180
+ exec(`tasklist /FI "PID eq ${pid}" /FO CSV /NH`, (e2, out2) => {
181
+ const m = out2?.match(/"([^"]+)"/);
182
+ resolve({ pid, name: m ? m[1] : "unknown" });
183
+ });
184
+ return;
185
+ }
185
186
  }
186
- } else {
187
- // lsof line: "node 1234 user ..."
188
- for (const line of stdout.split("\n").slice(1)) {
187
+ resolve(null);
188
+ });
189
+ } else {
190
+ // Use ps to find node process running server.js (no sudo needed)
191
+ exec(`ps aux | grep "[s]erver.js"`, (err, stdout) => {
192
+ if (!stdout?.trim()) return resolve(null);
193
+ for (const line of stdout.split("\n")) {
189
194
  const parts = line.trim().split(/\s+/);
190
- if (parts.length >= 2) { pid = parseInt(parts[1], 10); break; }
195
+ const pid = parseInt(parts[1], 10);
196
+ if (!isNaN(pid)) return resolve({ pid, name: "node" });
191
197
  }
192
- }
193
-
194
- if (!pid || isNaN(pid)) return resolve(null);
195
-
196
- // Get process name by PID
197
- const nameCmd = IS_WIN
198
- ? `tasklist /FI "PID eq ${pid}" /FO CSV /NH`
199
- : `ps -p ${pid} -o comm=`;
200
-
201
- exec(nameCmd, (e2, out2) => {
202
- let name = "unknown";
203
- if (!e2 && out2.trim()) {
204
- if (IS_WIN) {
205
- // CSV: "node.exe","1234",...
206
- const m = out2.match(/"([^"]+)"/);
207
- if (m) name = m[1];
208
- } else {
209
- name = out2.trim();
210
- }
211
- }
212
- resolve({ pid, name });
198
+ resolve(null);
213
199
  });
214
- });
200
+ }
215
201
  });
216
202
  }
217
203
 
@@ -254,6 +240,37 @@ async function killLeftoverMitm(sudoPassword) {
254
240
  }
255
241
  }
256
242
 
243
+ /**
244
+ * Poll MITM health endpoint until server is up or timeout.
245
+ * Returns { ok, pid } on success, null on timeout.
246
+ */
247
+ function pollMitmHealth(timeoutMs) {
248
+ return new Promise((resolve) => {
249
+ const deadline = Date.now() + timeoutMs;
250
+ const check = () => {
251
+ const req = https.request(
252
+ { hostname: "127.0.0.1", port: 443, path: "/_mitm_health", method: "GET", rejectUnauthorized: false },
253
+ (res) => {
254
+ let body = "";
255
+ res.on("data", (d) => { body += d; });
256
+ res.on("end", () => {
257
+ try {
258
+ const json = JSON.parse(body);
259
+ resolve(json.ok === true ? { ok: true, pid: json.pid || null } : null);
260
+ } catch { resolve(null); }
261
+ });
262
+ }
263
+ );
264
+ req.on("error", () => {
265
+ if (Date.now() < deadline) setTimeout(check, 500);
266
+ else resolve(null);
267
+ });
268
+ req.end();
269
+ };
270
+ check();
271
+ });
272
+ }
273
+
257
274
  /**
258
275
  * Get MITM status
259
276
  */
@@ -319,19 +336,33 @@ async function startMitm(apiKey, sudoPassword) {
319
336
  await killLeftoverMitm(sudoPassword);
320
337
 
321
338
  // Check port 443 availability BEFORE modifying system
339
+ // "no-permission" = EACCES: port may be held by a root process, check via lsof/netstat
322
340
  const portStatus = await checkPort443Free();
323
- if (portStatus === "in-use") {
324
- const owner = await getPort443Owner();
325
- let ownerDesc = "another process";
326
- if (owner) {
341
+ if (portStatus === "in-use" || portStatus === "no-permission") {
342
+ const owner = await getPort443Owner(sudoPassword);
343
+ if (owner && owner.name === "node") {
344
+ // Orphan MITM node process — kill it and continue
345
+ console.log(`[MITM] Killing orphan node process on port 443 (PID ${owner.pid})...`);
346
+ try {
347
+ if (IS_WIN) {
348
+ await new Promise((resolve) => exec(`taskkill /F /PID ${owner.pid}`, resolve));
349
+ } else {
350
+ const { execWithPassword } = require("./dns/dnsConfig");
351
+ await execWithPassword(`kill -9 ${owner.pid}`, sudoPassword);
352
+ }
353
+ await new Promise(r => setTimeout(r, 800));
354
+ } catch {
355
+ // best effort — continue anyway
356
+ }
357
+ } else if (owner) {
327
358
  const shortName = owner.name.includes("/")
328
359
  ? owner.name.split("/").filter(Boolean).pop()
329
360
  : owner.name;
330
- ownerDesc = `"${shortName}" (PID ${owner.pid})`;
361
+ throw new Error(
362
+ `Port 443 is already in use by "${shortName}" (PID ${owner.pid}). Stop that process first, then retry.`
363
+ );
331
364
  }
332
- throw new Error(
333
- `Port 443 is already in use by ${ownerDesc}. Stop that process first, then retry.`
334
- );
365
+ // owner === null + no-permission → likely just needs sudo, proceed
335
366
  }
336
367
 
337
368
  // 1. Generate SSL certificate if not exists
@@ -358,12 +389,13 @@ async function startMitm(apiKey, sudoPassword) {
358
389
  console.log("Starting MITM server...");
359
390
 
360
391
  if (IS_WIN) {
361
- const nodePath = process.execPath;
362
- const envArgs = `$env:ROUTER_API_KEY='${apiKey}'; $env:NODE_ENV='production'; & '${nodePath}' '${SERVER_PATH}'`;
392
+ // Launch elevated node via PowerShell RunAs (triggers UAC prompt)
393
+ const nodePath = process.execPath.replace(/'/g, "''");
394
+ const serverPath = SERVER_PATH.replace(/'/g, "''");
363
395
  serverProcess = spawn("powershell", [
364
- "-Command",
365
- `Start-Process powershell -ArgumentList '-NoProfile','-Command','${envArgs.replace(/'/g, "''")}' -Verb RunAs -PassThru`
366
- ], { detached: false, stdio: ["ignore", "pipe", "pipe"] });
396
+ "-NoProfile", "-Command",
397
+ `$env:ROUTER_API_KEY='${apiKey}'; $env:NODE_ENV='production'; Start-Process '${nodePath}' -ArgumentList '''${serverPath}''' -Verb RunAs -WindowStyle Hidden`
398
+ ], { stdio: "ignore", env: process.env });
367
399
  } else {
368
400
  // sudo -S: read password from stdin, -E: preserve env vars
369
401
  // Pass ROUTER_API_KEY inline via env=... wrapper to avoid sudo stripping env
@@ -399,20 +431,22 @@ async function startMitm(apiKey, sudoPassword) {
399
431
  try { fs.unlinkSync(PID_FILE); } catch { /* ignore */ }
400
432
  });
401
433
 
402
- // Wait up to 8s sudo + Node startup takes longer than plain spawn
403
- const started = await new Promise((resolve) => {
404
- let resolved = false;
405
- const done = (val) => { if (!resolved) { resolved = true; resolve(val); } };
406
- const timeout = setTimeout(() => done(true), 8000);
407
- serverProcess.once("exit", () => { clearTimeout(timeout); done(false); });
408
- });
434
+ // Wait for server to be ready by polling health endpoint
435
+ const health = await pollMitmHealth(IS_WIN ? 12000 : 8000);
409
436
 
410
- if (!started) {
437
+ if (!health) {
438
+ if (IS_WIN) serverProcess = null;
411
439
  try { await removeDNSEntry(sudoPassword); } catch { /* best effort */ }
412
440
  const reason = startError || "Check sudo password or port 443 access.";
413
441
  throw new Error(`MITM server failed to start. ${reason}`);
414
442
  }
415
443
 
444
+ // On Windows, use real PID from health check (launcher exits immediately after UAC)
445
+ if (IS_WIN && health.pid) {
446
+ serverPid = health.pid;
447
+ fs.writeFileSync(PID_FILE, String(serverPid));
448
+ }
449
+
416
450
  await saveMitmSettings(true, sudoPassword);
417
451
  if (sudoPassword) setCachedPassword(sudoPassword);
418
452
 
@@ -173,6 +173,13 @@ async function intercept(req, res, bodyBuffer, mappedModel) {
173
173
  }
174
174
 
175
175
  const server = https.createServer(sslOptions, async (req, res) => {
176
+ // Health check endpoint for startup verification
177
+ if (req.url === "/_mitm_health") {
178
+ res.writeHead(200, { "Content-Type": "application/json" });
179
+ res.end(JSON.stringify({ ok: true, pid: process.pid }));
180
+ return;
181
+ }
182
+
176
183
  const bodyBuffer = await collectBodyRaw(req);
177
184
 
178
185
  // Save request log if enabled
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "9router",
3
- "version": "0.2.95",
3
+ "version": "0.2.97",
4
4
  "description": "9Router CLI - Start and manage 9Router server",
5
5
  "bin": {
6
6
  "9router": "./cli.js"