9router 0.3.30 → 0.3.32

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 (341) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/app-path-routes-manifest.json +43 -43
  3. package/app/.next/build-manifest.json +2 -2
  4. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +1 -1
  5. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  6. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  7. package/app/.next/server/app/(dashboard)/dashboard/combos/page.js +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/console-log/page.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/mitm/page.js +2 -2
  17. package/app/.next/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/page.js +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/profile/page.js +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +1 -1
  26. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  28. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page.js +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  30. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  31. package/app/.next/server/app/(dashboard)/dashboard/providers/page.js +1 -1
  32. package/app/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  33. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  34. package/app/.next/server/app/(dashboard)/dashboard/quota/page.js +1 -1
  35. package/app/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  36. package/app/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  37. package/app/.next/server/app/(dashboard)/dashboard/translator/page.js +1 -1
  38. package/app/.next/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  39. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  40. package/app/.next/server/app/(dashboard)/dashboard/usage/page.js +1 -1
  41. package/app/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  42. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  43. package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  44. package/app/.next/server/app/_global-error.html +2 -2
  45. package/app/.next/server/app/_global-error.rsc +1 -1
  46. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  47. package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  48. package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  49. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  50. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  51. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  52. package/app/.next/server/app/_not-found/page.js +1 -1
  53. package/app/.next/server/app/_not-found/page.js.nft.json +1 -1
  54. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  55. package/app/.next/server/app/_not-found.html +1 -1
  56. package/app/.next/server/app/_not-found.rsc +3 -3
  57. package/app/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  58. package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  59. package/app/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  60. package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  61. package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  62. package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  63. package/app/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  64. package/app/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  65. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
  66. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  67. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route_client-reference-manifest.js +1 -1
  68. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
  69. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  70. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route_client-reference-manifest.js +1 -1
  71. package/app/.next/server/app/api/cli-tools/claude-settings/route_client-reference-manifest.js +1 -1
  72. package/app/.next/server/app/api/cli-tools/codex-settings/route_client-reference-manifest.js +1 -1
  73. package/app/.next/server/app/api/cli-tools/copilot-settings/route_client-reference-manifest.js +1 -1
  74. package/app/.next/server/app/api/cli-tools/droid-settings/route_client-reference-manifest.js +1 -1
  75. package/app/.next/server/app/api/cli-tools/openclaw-settings/route_client-reference-manifest.js +1 -1
  76. package/app/.next/server/app/api/cli-tools/opencode-settings/route_client-reference-manifest.js +1 -1
  77. package/app/.next/server/app/api/cloud/auth/route_client-reference-manifest.js +1 -1
  78. package/app/.next/server/app/api/cloud/credentials/update/route_client-reference-manifest.js +1 -1
  79. package/app/.next/server/app/api/cloud/model/resolve/route_client-reference-manifest.js +1 -1
  80. package/app/.next/server/app/api/cloud/models/alias/route_client-reference-manifest.js +1 -1
  81. package/app/.next/server/app/api/combos/[id]/route_client-reference-manifest.js +1 -1
  82. package/app/.next/server/app/api/combos/route_client-reference-manifest.js +1 -1
  83. package/app/.next/server/app/api/init/route.js +1 -1
  84. package/app/.next/server/app/api/init/route.js.nft.json +1 -1
  85. package/app/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  86. package/app/.next/server/app/api/keys/[id]/route_client-reference-manifest.js +1 -1
  87. package/app/.next/server/app/api/keys/route_client-reference-manifest.js +1 -1
  88. package/app/.next/server/app/api/models/alias/route_client-reference-manifest.js +1 -1
  89. package/app/.next/server/app/api/models/route.js +1 -1
  90. package/app/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
  91. package/app/.next/server/app/api/models/test/route_client-reference-manifest.js +1 -1
  92. package/app/.next/server/app/api/oauth/[provider]/[action]/route_client-reference-manifest.js +1 -1
  93. package/app/.next/server/app/api/oauth/cursor/auto-import/route_client-reference-manifest.js +1 -1
  94. package/app/.next/server/app/api/oauth/cursor/import/route_client-reference-manifest.js +1 -1
  95. package/app/.next/server/app/api/oauth/iflow/cookie/route_client-reference-manifest.js +1 -1
  96. package/app/.next/server/app/api/oauth/kiro/auto-import/route_client-reference-manifest.js +1 -1
  97. package/app/.next/server/app/api/oauth/kiro/import/route_client-reference-manifest.js +1 -1
  98. package/app/.next/server/app/api/oauth/kiro/social-authorize/route_client-reference-manifest.js +1 -1
  99. package/app/.next/server/app/api/oauth/kiro/social-exchange/route_client-reference-manifest.js +1 -1
  100. package/app/.next/server/app/api/pricing/route_client-reference-manifest.js +1 -1
  101. package/app/.next/server/app/api/provider-nodes/[id]/route_client-reference-manifest.js +1 -1
  102. package/app/.next/server/app/api/provider-nodes/route_client-reference-manifest.js +1 -1
  103. package/app/.next/server/app/api/provider-nodes/validate/route_client-reference-manifest.js +1 -1
  104. package/app/.next/server/app/api/providers/[id]/models/route_client-reference-manifest.js +1 -1
  105. package/app/.next/server/app/api/providers/[id]/route_client-reference-manifest.js +1 -1
  106. package/app/.next/server/app/api/providers/[id]/test/route_client-reference-manifest.js +1 -1
  107. package/app/.next/server/app/api/providers/[id]/test-models/route_client-reference-manifest.js +1 -1
  108. package/app/.next/server/app/api/providers/client/route_client-reference-manifest.js +1 -1
  109. package/app/.next/server/app/api/providers/route.js +1 -1
  110. package/app/.next/server/app/api/providers/route_client-reference-manifest.js +1 -1
  111. package/app/.next/server/app/api/providers/test-batch/route_client-reference-manifest.js +1 -1
  112. package/app/.next/server/app/api/providers/validate/route_client-reference-manifest.js +1 -1
  113. package/app/.next/server/app/api/settings/database/route_client-reference-manifest.js +1 -1
  114. package/app/.next/server/app/api/settings/proxy-test/route_client-reference-manifest.js +1 -1
  115. package/app/.next/server/app/api/settings/require-login/route_client-reference-manifest.js +1 -1
  116. package/app/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  117. package/app/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  118. package/app/.next/server/app/api/tags/route_client-reference-manifest.js +1 -1
  119. package/app/.next/server/app/api/translator/console-logs/route.js +1 -1
  120. package/app/.next/server/app/api/translator/console-logs/route_client-reference-manifest.js +1 -1
  121. package/app/.next/server/app/api/translator/console-logs/stream/route.js +1 -1
  122. package/app/.next/server/app/api/translator/console-logs/stream/route_client-reference-manifest.js +1 -1
  123. package/app/.next/server/app/api/translator/load/route_client-reference-manifest.js +1 -1
  124. package/app/.next/server/app/api/translator/save/route_client-reference-manifest.js +1 -1
  125. package/app/.next/server/app/api/translator/send/route_client-reference-manifest.js +1 -1
  126. package/app/.next/server/app/api/translator/translate/route_client-reference-manifest.js +1 -1
  127. package/app/.next/server/app/api/tunnel/disable/route_client-reference-manifest.js +1 -1
  128. package/app/.next/server/app/api/tunnel/enable/route_client-reference-manifest.js +1 -1
  129. package/app/.next/server/app/api/tunnel/status/route_client-reference-manifest.js +1 -1
  130. package/app/.next/server/app/api/usage/[connectionId]/route_client-reference-manifest.js +1 -1
  131. package/app/.next/server/app/api/usage/chart/route_client-reference-manifest.js +1 -1
  132. package/app/.next/server/app/api/usage/history/route_client-reference-manifest.js +1 -1
  133. package/app/.next/server/app/api/usage/providers/route_client-reference-manifest.js +1 -1
  134. package/app/.next/server/app/api/usage/request-details/route_client-reference-manifest.js +1 -1
  135. package/app/.next/server/app/api/usage/request-logs/route_client-reference-manifest.js +1 -1
  136. package/app/.next/server/app/api/usage/stats/route_client-reference-manifest.js +1 -1
  137. package/app/.next/server/app/api/usage/stream/route_client-reference-manifest.js +1 -1
  138. package/app/.next/server/app/api/v1/api/chat/route_client-reference-manifest.js +1 -1
  139. package/app/.next/server/app/api/v1/chat/completions/route_client-reference-manifest.js +1 -1
  140. package/app/.next/server/app/api/v1/embeddings/route_client-reference-manifest.js +1 -1
  141. package/app/.next/server/app/api/v1/messages/count_tokens/route_client-reference-manifest.js +1 -1
  142. package/app/.next/server/app/api/v1/messages/route_client-reference-manifest.js +1 -1
  143. package/app/.next/server/app/api/v1/models/route_client-reference-manifest.js +1 -1
  144. package/app/.next/server/app/api/v1/responses/route_client-reference-manifest.js +1 -1
  145. package/app/.next/server/app/api/v1/route_client-reference-manifest.js +1 -1
  146. package/app/.next/server/app/api/v1beta/models/[...path]/route_client-reference-manifest.js +1 -1
  147. package/app/.next/server/app/api/v1beta/models/route_client-reference-manifest.js +1 -1
  148. package/app/.next/server/app/api/version/route.js +1 -1
  149. package/app/.next/server/app/api/version/route_client-reference-manifest.js +1 -1
  150. package/app/.next/server/app/callback/page.js +1 -1
  151. package/app/.next/server/app/callback/page.js.nft.json +1 -1
  152. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  153. package/app/.next/server/app/callback.html +1 -1
  154. package/app/.next/server/app/callback.rsc +3 -3
  155. package/app/.next/server/app/callback.segments/_full.segment.rsc +3 -3
  156. package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  157. package/app/.next/server/app/callback.segments/_index.segment.rsc +3 -3
  158. package/app/.next/server/app/callback.segments/_tree.segment.rsc +2 -2
  159. package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  160. package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  161. package/app/.next/server/app/dashboard/cli-tools.html +1 -1
  162. package/app/.next/server/app/dashboard/cli-tools.rsc +5 -5
  163. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  164. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  165. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  166. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  167. package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  168. package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  169. package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  170. package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  171. package/app/.next/server/app/dashboard/combos.html +1 -1
  172. package/app/.next/server/app/dashboard/combos.rsc +5 -5
  173. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  174. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  175. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  176. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  177. package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  178. package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  179. package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  180. package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  181. package/app/.next/server/app/dashboard/endpoint.html +1 -1
  182. package/app/.next/server/app/dashboard/endpoint.rsc +5 -5
  183. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  184. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  185. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  186. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  187. package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  188. package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  189. package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  190. package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  191. package/app/.next/server/app/dashboard/mitm.html +1 -1
  192. package/app/.next/server/app/dashboard/mitm.rsc +5 -5
  193. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  194. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  195. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  196. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  197. package/app/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  198. package/app/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  199. package/app/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  200. package/app/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  201. package/app/.next/server/app/dashboard/profile.html +1 -1
  202. package/app/.next/server/app/dashboard/profile.rsc +5 -5
  203. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  204. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  205. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  206. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  207. package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
  208. package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  209. package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  210. package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  211. package/app/.next/server/app/dashboard/providers/new.html +1 -1
  212. package/app/.next/server/app/dashboard/providers/new.rsc +5 -5
  213. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  214. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  215. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  216. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  217. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  218. package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  219. package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  220. package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  221. package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  222. package/app/.next/server/app/dashboard/providers.html +1 -1
  223. package/app/.next/server/app/dashboard/providers.rsc +5 -5
  224. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  225. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  226. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  227. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  228. package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  229. package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  230. package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  231. package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  232. package/app/.next/server/app/dashboard/quota.html +2 -2
  233. package/app/.next/server/app/dashboard/quota.rsc +4 -4
  234. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +1 -1
  235. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  236. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  237. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  238. package/app/.next/server/app/dashboard/quota.segments/_full.segment.rsc +4 -4
  239. package/app/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  240. package/app/.next/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  241. package/app/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  242. package/app/.next/server/app/dashboard/settings/pricing/page.js +1 -1
  243. package/app/.next/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  244. package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  245. package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
  246. package/app/.next/server/app/dashboard/settings/pricing.rsc +3 -3
  247. package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  248. package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  249. package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  250. package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  251. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  252. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  253. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  254. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  255. package/app/.next/server/app/dashboard/translator.html +1 -1
  256. package/app/.next/server/app/dashboard/translator.rsc +5 -5
  257. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  258. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  259. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  260. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  261. package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  262. package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  263. package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  264. package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  265. package/app/.next/server/app/dashboard/usage.html +1 -1
  266. package/app/.next/server/app/dashboard/usage.rsc +5 -5
  267. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  268. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  269. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  270. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  271. package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  272. package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  273. package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  274. package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  275. package/app/.next/server/app/dashboard.html +1 -1
  276. package/app/.next/server/app/dashboard.rsc +5 -5
  277. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  278. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  279. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  280. package/app/.next/server/app/dashboard.segments/_full.segment.rsc +5 -5
  281. package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  282. package/app/.next/server/app/dashboard.segments/_index.segment.rsc +3 -3
  283. package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  284. package/app/.next/server/app/index.html +1 -1
  285. package/app/.next/server/app/index.rsc +3 -3
  286. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  287. package/app/.next/server/app/index.segments/_full.segment.rsc +3 -3
  288. package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
  289. package/app/.next/server/app/index.segments/_index.segment.rsc +3 -3
  290. package/app/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  291. package/app/.next/server/app/landing/page.js +1 -1
  292. package/app/.next/server/app/landing/page.js.nft.json +1 -1
  293. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  294. package/app/.next/server/app/landing.html +1 -1
  295. package/app/.next/server/app/landing.rsc +3 -3
  296. package/app/.next/server/app/landing.segments/_full.segment.rsc +3 -3
  297. package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  298. package/app/.next/server/app/landing.segments/_index.segment.rsc +3 -3
  299. package/app/.next/server/app/landing.segments/_tree.segment.rsc +2 -2
  300. package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  301. package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  302. package/app/.next/server/app/login/page.js +1 -1
  303. package/app/.next/server/app/login/page.js.nft.json +1 -1
  304. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  305. package/app/.next/server/app/login.html +1 -1
  306. package/app/.next/server/app/login.rsc +4 -4
  307. package/app/.next/server/app/login.segments/_full.segment.rsc +4 -4
  308. package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
  309. package/app/.next/server/app/login.segments/_index.segment.rsc +3 -3
  310. package/app/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  311. package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  312. package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
  313. package/app/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  314. package/app/.next/server/app/page.js +1 -1
  315. package/app/.next/server/app/page.js.nft.json +1 -1
  316. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  317. package/app/.next/server/app-paths-manifest.json +43 -43
  318. package/app/.next/server/chunks/2280.js +1 -1
  319. package/app/.next/server/chunks/2470.js +1 -0
  320. package/app/.next/server/chunks/6182.js +8 -9
  321. package/app/.next/server/chunks/649.js +1 -1
  322. package/app/.next/server/pages/404.html +1 -1
  323. package/app/.next/server/pages/500.html +2 -2
  324. package/app/.next/server/server-reference-manifest.js +1 -1
  325. package/app/.next/server/server-reference-manifest.json +1 -1
  326. package/app/.next/static/chunks/{5497-87f1cb95ee622c7b.js → 5497-839d8b620b5b944c.js} +1 -1
  327. package/app/.next/static/chunks/{9242-3524e9de7ad33a19.js → 9242-ebb05a40387b301d.js} +2 -2
  328. package/app/.next/static/chunks/app/(dashboard)/dashboard/mitm/page-d81fceb6f0154d11.js +1 -0
  329. package/app/.next/static/chunks/app/{layout-f9f92a7880a478f2.js → layout-053c430c558380e6.js} +1 -1
  330. package/app/.next/static/css/{fb5ab131d55b40e1.css → d3d9432d809fcee0.css} +1 -1
  331. package/app/package.json +1 -1
  332. package/app/src/mitm/cert/generate.js +21 -44
  333. package/app/src/mitm/cert/install.js +6 -6
  334. package/app/src/mitm/cert/rootCA.js +153 -0
  335. package/app/src/mitm/manager.js +30 -69
  336. package/app/src/mitm/server.js +45 -3
  337. package/package.json +1 -1
  338. package/app/.next/server/chunks/2044.js +0 -2
  339. package/app/.next/static/chunks/app/(dashboard)/dashboard/mitm/page-7f5a8700b96d31b1.js +0 -1
  340. /package/app/.next/static/{k3zp-r_EpPiF5lcYQ24hp → cva2-X-MI1QYEhGt-TYDp}/_buildManifest.js +0 -0
  341. /package/app/.next/static/{k3zp-r_EpPiF5lcYQ24hp → cva2-X-MI1QYEhGt-TYDp}/_ssgManifest.js +0 -0
@@ -0,0 +1,153 @@
1
+ const path = require("path");
2
+ const fs = require("fs");
3
+ const forge = require("node-forge");
4
+ const { MITM_DIR } = require("../paths");
5
+
6
+ const ROOT_CA_KEY_PATH = path.join(MITM_DIR, "rootCA.key");
7
+ const ROOT_CA_CERT_PATH = path.join(MITM_DIR, "rootCA.crt");
8
+
9
+ /**
10
+ * Generate Root CA certificate (only once)
11
+ * This Root CA will sign all dynamic leaf certificates
12
+ */
13
+ async function generateRootCA() {
14
+ if (fs.existsSync(ROOT_CA_KEY_PATH) && fs.existsSync(ROOT_CA_CERT_PATH)) {
15
+ console.log("✅ Root CA already exists");
16
+ return { key: ROOT_CA_KEY_PATH, cert: ROOT_CA_CERT_PATH };
17
+ }
18
+
19
+ if (!fs.existsSync(MITM_DIR)) {
20
+ fs.mkdirSync(MITM_DIR, { recursive: true });
21
+ }
22
+
23
+ console.log("🔐 Generating Root CA certificate...");
24
+
25
+ // Generate RSA key pair
26
+ const keys = forge.pki.rsa.generateKeyPair(2048);
27
+
28
+ // Create Root CA certificate
29
+ const cert = forge.pki.createCertificate();
30
+ cert.publicKey = keys.publicKey;
31
+ cert.serialNumber = "01";
32
+ cert.validity.notBefore = new Date();
33
+ cert.validity.notAfter = new Date();
34
+ cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 10);
35
+
36
+ const attrs = [
37
+ { name: "commonName", value: "9Router MITM Root CA" },
38
+ { name: "organizationName", value: "9Router" },
39
+ { name: "countryName", value: "US" }
40
+ ];
41
+
42
+ cert.setSubject(attrs);
43
+ cert.setIssuer(attrs); // Self-signed
44
+
45
+ cert.setExtensions([
46
+ {
47
+ name: "basicConstraints",
48
+ cA: true,
49
+ critical: true
50
+ },
51
+ {
52
+ name: "keyUsage",
53
+ keyCertSign: true,
54
+ cRLSign: true,
55
+ critical: true
56
+ },
57
+ {
58
+ name: "subjectKeyIdentifier"
59
+ }
60
+ ]);
61
+
62
+ // Self-sign the certificate
63
+ cert.sign(keys.privateKey, forge.md.sha256.create());
64
+
65
+ // Save to disk
66
+ const privateKeyPem = forge.pki.privateKeyToPem(keys.privateKey);
67
+ const certPem = forge.pki.certificateToPem(cert);
68
+
69
+ fs.writeFileSync(ROOT_CA_KEY_PATH, privateKeyPem);
70
+ fs.writeFileSync(ROOT_CA_CERT_PATH, certPem);
71
+
72
+ console.log("✅ Root CA generated successfully");
73
+ return { key: ROOT_CA_KEY_PATH, cert: ROOT_CA_CERT_PATH };
74
+ }
75
+
76
+ /**
77
+ * Load Root CA from disk
78
+ */
79
+ function loadRootCA() {
80
+ if (!fs.existsSync(ROOT_CA_KEY_PATH) || !fs.existsSync(ROOT_CA_CERT_PATH)) {
81
+ throw new Error("Root CA not found. Generate it first.");
82
+ }
83
+
84
+ const keyPem = fs.readFileSync(ROOT_CA_KEY_PATH, "utf8");
85
+ const certPem = fs.readFileSync(ROOT_CA_CERT_PATH, "utf8");
86
+
87
+ return {
88
+ key: forge.pki.privateKeyFromPem(keyPem),
89
+ cert: forge.pki.certificateFromPem(certPem)
90
+ };
91
+ }
92
+
93
+ /**
94
+ * Generate leaf certificate for a specific domain, signed by Root CA
95
+ */
96
+ function generateLeafCert(domain, rootCA) {
97
+ // Generate key pair for leaf cert
98
+ const keys = forge.pki.rsa.generateKeyPair(2048);
99
+
100
+ // Create leaf certificate
101
+ const cert = forge.pki.createCertificate();
102
+ cert.publicKey = keys.publicKey;
103
+ cert.serialNumber = Math.floor(Math.random() * 1000000).toString();
104
+ cert.validity.notBefore = new Date();
105
+ cert.validity.notAfter = new Date();
106
+ cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1);
107
+
108
+ cert.setSubject([
109
+ { name: "commonName", value: domain }
110
+ ]);
111
+
112
+ cert.setIssuer(rootCA.cert.subject.attributes);
113
+
114
+ cert.setExtensions([
115
+ {
116
+ name: "basicConstraints",
117
+ cA: false
118
+ },
119
+ {
120
+ name: "keyUsage",
121
+ digitalSignature: true,
122
+ keyEncipherment: true
123
+ },
124
+ {
125
+ name: "extKeyUsage",
126
+ serverAuth: true,
127
+ clientAuth: true
128
+ },
129
+ {
130
+ name: "subjectAltName",
131
+ altNames: [
132
+ { type: 2, value: domain }, // DNS
133
+ { type: 2, value: `*.${domain}` } // Wildcard
134
+ ]
135
+ }
136
+ ]);
137
+
138
+ // Sign with Root CA
139
+ cert.sign(rootCA.key, forge.md.sha256.create());
140
+
141
+ return {
142
+ key: forge.pki.privateKeyToPem(keys.privateKey),
143
+ cert: forge.pki.certificateToPem(cert)
144
+ };
145
+ }
146
+
147
+ module.exports = {
148
+ generateRootCA,
149
+ loadRootCA,
150
+ generateLeafCert,
151
+ ROOT_CA_CERT_PATH,
152
+ ROOT_CA_KEY_PATH
153
+ };
@@ -245,37 +245,6 @@ function pollMitmHealth(timeoutMs, port = MITM_PORT) {
245
245
  });
246
246
  }
247
247
 
248
- /**
249
- * Check which tools have their domains covered by the installed cert SAN.
250
- * Uses built-in crypto.X509Certificate (Node 15.6+).
251
- */
252
- function getCertToolCoverage(certPath) {
253
- try {
254
- const pem = fs.readFileSync(certPath, "utf8");
255
- const cert = new crypto.X509Certificate(pem);
256
- const san = cert.subjectAltName || "";
257
- // Extract all DNS SANs
258
- const sans = san.split(",").map(s => s.trim().replace(/^DNS:/, ""));
259
- const matchesSan = (domain) => sans.some(s => {
260
- if (s === domain) return true;
261
- // Wildcard: *.foo.com matches bar.foo.com
262
- if (s.startsWith("*.")) {
263
- const suffix = s.slice(1); // .foo.com
264
- return domain.endsWith(suffix) && !domain.slice(0, -suffix.length).includes(".");
265
- }
266
- return false;
267
- });
268
- const { TOOL_HOSTS } = require("./dns/dnsConfig");
269
- const coverage = {};
270
- for (const [tool, hosts] of Object.entries(TOOL_HOSTS)) {
271
- coverage[tool] = hosts.every(matchesSan);
272
- }
273
- return coverage;
274
- } catch {
275
- return {};
276
- }
277
- }
278
-
279
248
  /**
280
249
  * Get full MITM status including per-tool DNS status
281
250
  */
@@ -298,11 +267,10 @@ async function getMitmStatus() {
298
267
  }
299
268
 
300
269
  const dnsStatus = checkAllDNSStatus();
301
- const certPath = path.join(MITM_DIR, "server.crt");
302
- const certExists = fs.existsSync(certPath);
303
- const certCoversTools = certExists ? getCertToolCoverage(certPath) : {};
270
+ const rootCACertPath = path.join(MITM_DIR, "rootCA.crt");
271
+ const certExists = fs.existsSync(rootCACertPath);
304
272
 
305
- return { running, pid, certExists, dnsStatus, certCoversTools };
273
+ return { running, pid, certExists, dnsStatus };
306
274
  }
307
275
 
308
276
  /**
@@ -352,39 +320,34 @@ async function startServer(apiKey, sudoPassword) {
352
320
  }
353
321
  }
354
322
 
355
- // Step 1: Generate SSL certificate if not exists or missing domain coverage
356
- const certPath = path.join(MITM_DIR, "server.crt");
357
- const keyPath = path.join(MITM_DIR, "server.key");
358
- let needsRegenerate = false;
323
+ // Step 1: Auto-migration - Generate Root CA if not exists
324
+ const rootCACertPath = path.join(MITM_DIR, "rootCA.crt");
325
+ const rootCAKeyPath = path.join(MITM_DIR, "rootCA.key");
359
326
 
360
- if (!fs.existsSync(certPath)) {
361
- console.log("[MITM] Generating SSL certificate...");
362
- needsRegenerate = true;
363
- } else {
364
- // Check if cert covers all tool domains
365
- const coverage = getCertToolCoverage(certPath);
366
- const { TOOL_HOSTS } = require("./dns/dnsConfig");
367
- const allCovered = Object.keys(TOOL_HOSTS).every(tool => coverage[tool] === true);
368
- if (!allCovered) {
369
- console.log("[MITM] Certificate missing domain coverage — regenerating...");
370
- needsRegenerate = true;
371
- try {
372
- fs.unlinkSync(certPath);
373
- if (fs.existsSync(keyPath)) fs.unlinkSync(keyPath);
374
- } catch { /* ignore */ }
375
- }
327
+ if (!fs.existsSync(rootCACertPath) || !fs.existsSync(rootCAKeyPath)) {
328
+ console.log("[MITM] Generating Root CA certificate (first time or migration)...");
329
+ await generateCert();
376
330
  }
377
331
 
378
- if (needsRegenerate) {
379
- await generateCert();
332
+ // Step 1.5: Auto-install Root CA if not trusted yet
333
+ const { checkCertInstalled } = require("./cert/install");
334
+ const rootCATrusted = await checkCertInstalled(rootCACertPath);
335
+ if (!rootCATrusted) {
336
+ console.log("[MITM] Installing Root CA to system trust store...");
337
+ // Use provided password or cached/stored password
338
+ const password = sudoPassword || getCachedPassword() || await loadEncryptedPassword();
339
+ if (!password && !IS_WIN) {
340
+ throw new Error("Sudo password required to install Root CA certificate");
341
+ }
342
+ await installCert(password, rootCACertPath);
343
+ console.log("✅ Root CA installed successfully");
380
344
  }
381
345
 
382
- // Step 2: Install cert + spawn server
346
+ // Step 2: Spawn server (Root CA already installed in Step 1.5)
383
347
  if (IS_WIN) {
384
348
  const hostsFile = path.join(process.env.SystemRoot || "C:\\Windows", "System32", "drivers", "etc", "hosts");
385
349
  const flagFile = path.join(os.tmpdir(), `mitm_ready_${Date.now()}.flag`);
386
350
  const psSQ = (s) => s.replace(/'/g, "''");
387
- const certPs = psSQ(certPath);
388
351
  const nodePs = psSQ(process.execPath);
389
352
  const serverPs = psSQ(SERVER_PATH);
390
353
  const flagPs = psSQ(flagFile);
@@ -393,7 +356,6 @@ async function startServer(apiKey, sudoPassword) {
393
356
  `$conn = Get-NetTCPConnection -LocalPort 443 -State Listen -ErrorAction SilentlyContinue | Select-Object -First 1`,
394
357
  `if ($conn -and $conn.OwningProcess -gt 4) { Stop-Process -Id $conn.OwningProcess -Force -ErrorAction SilentlyContinue }`,
395
358
  `Start-Sleep -Milliseconds 500`,
396
- `& certutil -addstore Root '${certPs}' | Out-Null`,
397
359
  `$nodeCmd = 'set ROUTER_API_KEY=${psSQ(apiKey)}&& set NODE_ENV=production&& "${nodePs}" "${serverPs}"'`,
398
360
  `Start-Process cmd -ArgumentList '/c',$nodeCmd -WindowStyle Hidden`,
399
361
  `Start-Sleep -Milliseconds 500`,
@@ -429,13 +391,7 @@ async function startServer(apiKey, sudoPassword) {
429
391
 
430
392
  if (_updateSettings) await _updateSettings({ mitmCertInstalled: true }).catch(() => { });
431
393
  } else {
432
- const { checkCertInstalled } = require("./cert/install");
433
- const certTrusted = await checkCertInstalled(certPath);
434
- if (!certTrusted) {
435
- await installCert(sudoPassword, certPath);
436
- if (_updateSettings) await _updateSettings({ mitmCertInstalled: true }).catch(() => { });
437
- }
438
-
394
+ // Non-Windows: Root CA already installed in Step 1.5, just spawn server
439
395
  const inlineCmd = `ROUTER_API_KEY='${apiKey}' NODE_ENV='production' '${process.execPath}' '${SERVER_PATH}'`;
440
396
  serverProcess = spawn(
441
397
  "sudo", ["-S", "-E", "sh", "-c", inlineCmd],
@@ -583,7 +539,10 @@ async function stopServer(sudoPassword) {
583
539
  async function enableToolDNS(tool, sudoPassword) {
584
540
  const status = await getMitmStatus();
585
541
  if (!status.running) throw new Error("MITM server is not running. Start the server first.");
586
- await addDNSEntry(tool, sudoPassword);
542
+
543
+ // Use cached password if not provided
544
+ const password = sudoPassword || getCachedPassword() || await loadEncryptedPassword();
545
+ await addDNSEntry(tool, password);
587
546
  return { success: true };
588
547
  }
589
548
 
@@ -591,7 +550,9 @@ async function enableToolDNS(tool, sudoPassword) {
591
550
  * Disable DNS for a specific tool
592
551
  */
593
552
  async function disableToolDNS(tool, sudoPassword) {
594
- await removeDNSEntry(tool, sudoPassword);
553
+ // Use cached password if not provided
554
+ const password = sudoPassword || getCachedPassword() || await loadEncryptedPassword();
555
+ await removeDNSEntry(tool, password);
595
556
  return { success: true };
596
557
  }
597
558
 
@@ -26,15 +26,57 @@ if (!API_KEY) {
26
26
  process.exit(1);
27
27
  }
28
28
 
29
+ const { getCertForDomain } = require("./cert/generate");
30
+
31
+ // Certificate cache for performance
32
+ const certCache = new Map();
33
+
34
+ // SNI callback for dynamic certificate generation
35
+ function sniCallback(servername, cb) {
36
+ try {
37
+ // Check cache first
38
+ if (certCache.has(servername)) {
39
+ const cached = certCache.get(servername);
40
+ return cb(null, cached);
41
+ }
42
+
43
+ // Generate new cert for this domain
44
+ const certData = getCertForDomain(servername);
45
+ if (!certData) {
46
+ return cb(new Error(`Failed to generate cert for ${servername}`));
47
+ }
48
+
49
+ // Create secure context
50
+ const ctx = require("tls").createSecureContext({
51
+ key: certData.key,
52
+ cert: certData.cert
53
+ });
54
+
55
+ // Cache it
56
+ certCache.set(servername, ctx);
57
+ console.log(`✅ Generated cert for: ${servername}`);
58
+
59
+ cb(null, ctx);
60
+ } catch (error) {
61
+ console.error(`❌ SNI error for ${servername}:`, error.message);
62
+ cb(error);
63
+ }
64
+ }
65
+
66
+ // Load Root CA for default context
29
67
  const certDir = MITM_DIR;
68
+ const rootCAKeyPath = path.join(certDir, "rootCA.key");
69
+ const rootCACertPath = path.join(certDir, "rootCA.crt");
70
+
30
71
  let sslOptions;
31
72
  try {
32
73
  sslOptions = {
33
- key: fs.readFileSync(path.join(certDir, "server.key")),
34
- cert: fs.readFileSync(path.join(certDir, "server.crt"))
74
+ key: fs.readFileSync(rootCAKeyPath),
75
+ cert: fs.readFileSync(rootCACertPath),
76
+ SNICallback: sniCallback
35
77
  };
36
78
  } catch (e) {
37
- console.error(`❌ SSL cert not found in ${certDir}: ${e.message}`);
79
+ console.error(`❌ Root CA not found in ${certDir}: ${e.message}`);
38
80
  process.exit(1);
39
81
  }
40
82
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "9router",
3
- "version": "0.3.30",
3
+ "version": "0.3.32",
4
4
  "description": "9Router CLI - Start and manage 9Router server",
5
5
  "bin": {
6
6
  "9router": "./cli.js"