9router 0.2.71 → 0.2.72

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 (257) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/app-path-routes-manifest.json +40 -40
  3. package/app/.next/build-manifest.json +2 -2
  4. package/app/.next/prerender-manifest.json +3 -3
  5. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  6. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  7. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/_global-error.html +2 -2
  17. package/app/.next/server/app/_global-error.rsc +1 -1
  18. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  19. package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  20. package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  21. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  22. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  23. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  24. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/_not-found.html +1 -1
  26. package/app/.next/server/app/_not-found.rsc +2 -2
  27. package/app/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  28. package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  29. package/app/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  30. package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  31. package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  32. package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  33. package/app/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  34. package/app/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  35. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
  36. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route_client-reference-manifest.js +1 -1
  37. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js +4 -5
  38. package/app/.next/server/app/api/cli-tools/antigravity-mitm/route_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/api/cli-tools/claude-settings/route.js +2 -2
  40. package/app/.next/server/app/api/cli-tools/claude-settings/route_client-reference-manifest.js +1 -1
  41. package/app/.next/server/app/api/cli-tools/codex-settings/route.js +2 -2
  42. package/app/.next/server/app/api/cli-tools/codex-settings/route_client-reference-manifest.js +1 -1
  43. package/app/.next/server/app/api/cli-tools/droid-settings/route.js +2 -2
  44. package/app/.next/server/app/api/cli-tools/droid-settings/route_client-reference-manifest.js +1 -1
  45. package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
  46. package/app/.next/server/app/api/cli-tools/openclaw-settings/route_client-reference-manifest.js +1 -1
  47. package/app/.next/server/app/api/cloud/auth/route_client-reference-manifest.js +1 -1
  48. package/app/.next/server/app/api/cloud/credentials/update/route_client-reference-manifest.js +1 -1
  49. package/app/.next/server/app/api/cloud/model/resolve/route_client-reference-manifest.js +1 -1
  50. package/app/.next/server/app/api/cloud/models/alias/route_client-reference-manifest.js +1 -1
  51. package/app/.next/server/app/api/combos/[id]/route_client-reference-manifest.js +1 -1
  52. package/app/.next/server/app/api/combos/route_client-reference-manifest.js +1 -1
  53. package/app/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  54. package/app/.next/server/app/api/keys/[id]/route_client-reference-manifest.js +1 -1
  55. package/app/.next/server/app/api/keys/route_client-reference-manifest.js +1 -1
  56. package/app/.next/server/app/api/models/alias/route_client-reference-manifest.js +1 -1
  57. package/app/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
  58. package/app/.next/server/app/api/oauth/[provider]/[action]/route_client-reference-manifest.js +1 -1
  59. package/app/.next/server/app/api/oauth/cursor/auto-import/route_client-reference-manifest.js +1 -1
  60. package/app/.next/server/app/api/oauth/cursor/import/route_client-reference-manifest.js +1 -1
  61. package/app/.next/server/app/api/oauth/kiro/auto-import/route_client-reference-manifest.js +1 -1
  62. package/app/.next/server/app/api/oauth/kiro/import/route_client-reference-manifest.js +1 -1
  63. package/app/.next/server/app/api/oauth/kiro/social-authorize/route_client-reference-manifest.js +1 -1
  64. package/app/.next/server/app/api/oauth/kiro/social-exchange/route_client-reference-manifest.js +1 -1
  65. package/app/.next/server/app/api/pricing/route_client-reference-manifest.js +1 -1
  66. package/app/.next/server/app/api/provider-nodes/[id]/route_client-reference-manifest.js +1 -1
  67. package/app/.next/server/app/api/provider-nodes/route_client-reference-manifest.js +1 -1
  68. package/app/.next/server/app/api/provider-nodes/validate/route_client-reference-manifest.js +1 -1
  69. package/app/.next/server/app/api/providers/[id]/models/route_client-reference-manifest.js +1 -1
  70. package/app/.next/server/app/api/providers/[id]/route_client-reference-manifest.js +1 -1
  71. package/app/.next/server/app/api/providers/[id]/test/route_client-reference-manifest.js +1 -1
  72. package/app/.next/server/app/api/providers/client/route_client-reference-manifest.js +1 -1
  73. package/app/.next/server/app/api/providers/route_client-reference-manifest.js +1 -1
  74. package/app/.next/server/app/api/providers/validate/route_client-reference-manifest.js +1 -1
  75. package/app/.next/server/app/api/settings/require-login/route_client-reference-manifest.js +1 -1
  76. package/app/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  77. package/app/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  78. package/app/.next/server/app/api/sync/cloud/route_client-reference-manifest.js +1 -1
  79. package/app/.next/server/app/api/sync/initialize/route_client-reference-manifest.js +1 -1
  80. package/app/.next/server/app/api/tags/route_client-reference-manifest.js +1 -1
  81. package/app/.next/server/app/api/translator/load/route_client-reference-manifest.js +1 -1
  82. package/app/.next/server/app/api/translator/save/route_client-reference-manifest.js +1 -1
  83. package/app/.next/server/app/api/translator/send/route_client-reference-manifest.js +1 -1
  84. package/app/.next/server/app/api/translator/translate/route_client-reference-manifest.js +1 -1
  85. package/app/.next/server/app/api/usage/[connectionId]/route_client-reference-manifest.js +1 -1
  86. package/app/.next/server/app/api/usage/history/route_client-reference-manifest.js +1 -1
  87. package/app/.next/server/app/api/usage/request-logs/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/messages/count_tokens/route_client-reference-manifest.js +1 -1
  91. package/app/.next/server/app/api/v1/messages/route_client-reference-manifest.js +1 -1
  92. package/app/.next/server/app/api/v1/models/route_client-reference-manifest.js +1 -1
  93. package/app/.next/server/app/api/v1/responses/route_client-reference-manifest.js +1 -1
  94. package/app/.next/server/app/api/v1/route_client-reference-manifest.js +1 -1
  95. package/app/.next/server/app/api/v1beta/models/[...path]/route_client-reference-manifest.js +1 -1
  96. package/app/.next/server/app/api/v1beta/models/route_client-reference-manifest.js +1 -1
  97. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  98. package/app/.next/server/app/callback.html +1 -1
  99. package/app/.next/server/app/callback.rsc +2 -2
  100. package/app/.next/server/app/callback.segments/_full.segment.rsc +2 -2
  101. package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  102. package/app/.next/server/app/callback.segments/_index.segment.rsc +2 -2
  103. package/app/.next/server/app/callback.segments/_tree.segment.rsc +1 -1
  104. package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  105. package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  106. package/app/.next/server/app/dashboard/cli-tools.html +1 -1
  107. package/app/.next/server/app/dashboard/cli-tools.rsc +4 -4
  108. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  109. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  110. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  111. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  112. package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +4 -4
  113. package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  114. package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +2 -2
  115. package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  116. package/app/.next/server/app/dashboard/combos.html +1 -1
  117. package/app/.next/server/app/dashboard/combos.rsc +4 -4
  118. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  119. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  120. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  121. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  122. package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +4 -4
  123. package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  124. package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +2 -2
  125. package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  126. package/app/.next/server/app/dashboard/endpoint.html +1 -1
  127. package/app/.next/server/app/dashboard/endpoint.rsc +4 -4
  128. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  129. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  130. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  131. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  132. package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +4 -4
  133. package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  134. package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +2 -2
  135. package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  136. package/app/.next/server/app/dashboard/profile.html +1 -1
  137. package/app/.next/server/app/dashboard/profile.rsc +4 -4
  138. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  139. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  140. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  141. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  142. package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +4 -4
  143. package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  144. package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +2 -2
  145. package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  146. package/app/.next/server/app/dashboard/providers/new.html +1 -1
  147. package/app/.next/server/app/dashboard/providers/new.rsc +4 -4
  148. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  149. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  150. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  151. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  152. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  153. package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +4 -4
  154. package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  155. package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +2 -2
  156. package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  157. package/app/.next/server/app/dashboard/providers.html +1 -1
  158. package/app/.next/server/app/dashboard/providers.rsc +4 -4
  159. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  160. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  161. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  162. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  163. package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +4 -4
  164. package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  165. package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +2 -2
  166. package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  167. package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  168. package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
  169. package/app/.next/server/app/dashboard/settings/pricing.rsc +2 -2
  170. package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +2 -2
  171. package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  172. package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +2 -2
  173. package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  174. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  175. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  176. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  177. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  178. package/app/.next/server/app/dashboard/translator.html +1 -1
  179. package/app/.next/server/app/dashboard/translator.rsc +4 -4
  180. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  181. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  182. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  183. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  184. package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +4 -4
  185. package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  186. package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +2 -2
  187. package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  188. package/app/.next/server/app/dashboard/usage.html +1 -1
  189. package/app/.next/server/app/dashboard/usage.rsc +4 -4
  190. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  191. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  192. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  193. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  194. package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +4 -4
  195. package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  196. package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +2 -2
  197. package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  198. package/app/.next/server/app/dashboard.html +1 -1
  199. package/app/.next/server/app/dashboard.rsc +4 -4
  200. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  201. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  202. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  203. package/app/.next/server/app/dashboard.segments/_full.segment.rsc +4 -4
  204. package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  205. package/app/.next/server/app/dashboard.segments/_index.segment.rsc +2 -2
  206. package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  207. package/app/.next/server/app/index.html +1 -1
  208. package/app/.next/server/app/index.rsc +2 -2
  209. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  210. package/app/.next/server/app/index.segments/_full.segment.rsc +2 -2
  211. package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
  212. package/app/.next/server/app/index.segments/_index.segment.rsc +2 -2
  213. package/app/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  214. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  215. package/app/.next/server/app/landing.html +1 -1
  216. package/app/.next/server/app/landing.rsc +2 -2
  217. package/app/.next/server/app/landing.segments/_full.segment.rsc +2 -2
  218. package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  219. package/app/.next/server/app/landing.segments/_index.segment.rsc +2 -2
  220. package/app/.next/server/app/landing.segments/_tree.segment.rsc +1 -1
  221. package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  222. package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  223. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  224. package/app/.next/server/app/login.html +1 -1
  225. package/app/.next/server/app/login.rsc +3 -3
  226. package/app/.next/server/app/login.segments/_full.segment.rsc +3 -3
  227. package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
  228. package/app/.next/server/app/login.segments/_index.segment.rsc +2 -2
  229. package/app/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  230. package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  231. package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
  232. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  233. package/app/.next/server/app-paths-manifest.json +40 -40
  234. package/app/.next/server/chunks/3110.js +2 -2
  235. package/app/.next/server/chunks/8954.js +1 -1
  236. package/app/.next/server/pages/404.html +1 -1
  237. package/app/.next/server/pages/500.html +2 -2
  238. package/app/.next/server/server-reference-manifest.js +1 -1
  239. package/app/.next/server/server-reference-manifest.json +1 -1
  240. package/app/.next/static/chunks/{1393-3fdad0258c0b525c.js → 1393-e96aa4a79d3e1568.js} +1 -1
  241. package/app/.next/static/chunks/{3624-b4d607564b40b24d.js → 3624-e096f4cf594e2fc8.js} +1 -1
  242. package/app/.next/static/chunks/{8729-9d273189141eb6fb.js → 8729-d228d83251fca5a4.js} +1 -1
  243. package/app/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-ebe23b0367ddebdc.js +1 -0
  244. package/app/.next/static/chunks/app/(dashboard)/dashboard/page-4940a5acf1d029cb.js +1 -0
  245. package/app/package.json +1 -1
  246. package/app/src/mitm/cert/generate.js +44 -0
  247. package/app/src/mitm/cert/install.js +136 -0
  248. package/app/src/mitm/dns/dnsConfig.js +130 -0
  249. package/app/src/mitm/manager.js +227 -0
  250. package/cli.js +110 -144
  251. package/package.json +1 -1
  252. package/src/cli/utils/input.js +7 -1
  253. package/src/cli/utils/menuHelper.js +2 -1
  254. package/app/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-000eaf8021eb5f32.js +0 -1
  255. package/app/.next/static/chunks/app/(dashboard)/dashboard/page-acb031d56db92fdf.js +0 -1
  256. /package/app/.next/static/{FcGNHUA9390qBi1g02a_v → VRVsJDwKk6UAo3wjmb_Mu}/_buildManifest.js +0 -0
  257. /package/app/.next/static/{FcGNHUA9390qBi1g02a_v → VRVsJDwKk6UAo3wjmb_Mu}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"node":{"403d59f76f03dc514735a133dd6a7cceb0a3d1973e":{"workers":{"app/api/cli-tools/antigravity-mitm/alias/route":{"moduleId":"50238","async":false}},"layer":{"app/api/cli-tools/antigravity-mitm/alias/route":"rsc"},"filename":"app/api/cli-tools/antigravity-mitm/alias/route.js","exportedName":"GET"},"40d252f39a3e16db750b9981630a886ff6212e2736":{"workers":{"app/api/cli-tools/antigravity-mitm/alias/route":{"moduleId":"50238","async":false}},"layer":{"app/api/cli-tools/antigravity-mitm/alias/route":"rsc"},"filename":"app/api/cli-tools/antigravity-mitm/alias/route.js","exportedName":"PUT"},"000d019ab166abe729fc16bec5764275dde58a07da":{"workers":{"app/api/cli-tools/claude-settings/route":{"moduleId":"88490","async":false}},"layer":{"app/api/cli-tools/claude-settings/route":"rsc"},"filename":"app/api/cli-tools/claude-settings/route.js","exportedName":"DELETE"},"00ada5834e91ad7720526be0bfdc337a2e460e5b74":{"workers":{"app/api/cli-tools/claude-settings/route":{"moduleId":"88490","async":false}},"layer":{"app/api/cli-tools/claude-settings/route":"rsc"},"filename":"app/api/cli-tools/claude-settings/route.js","exportedName":"GET"},"40e24b09e9787d266bea790d4a6bb54c25d834ec8e":{"workers":{"app/api/cli-tools/claude-settings/route":{"moduleId":"88490","async":false}},"layer":{"app/api/cli-tools/claude-settings/route":"rsc"},"filename":"app/api/cli-tools/claude-settings/route.js","exportedName":"POST"},"003bdacc6f3725ce0c0228940abaca555b1b173c17":{"workers":{"app/api/cli-tools/openclaw-settings/route":{"moduleId":"65366","async":false}},"layer":{"app/api/cli-tools/openclaw-settings/route":"rsc"},"filename":"app/api/cli-tools/openclaw-settings/route.js","exportedName":"DELETE"},"008fee03d7e581bbe8113513375376977efd94c06e":{"workers":{"app/api/cli-tools/openclaw-settings/route":{"moduleId":"65366","async":false}},"layer":{"app/api/cli-tools/openclaw-settings/route":"rsc"},"filename":"app/api/cli-tools/openclaw-settings/route.js","exportedName":"GET"},"400633385db47e5ce509a4a47f9380aab15653da7e":{"workers":{"app/api/cli-tools/openclaw-settings/route":{"moduleId":"65366","async":false}},"layer":{"app/api/cli-tools/openclaw-settings/route":"rsc"},"filename":"app/api/cli-tools/openclaw-settings/route.js","exportedName":"POST"},"0029345e55aeb34961e355bd6bf73143a79ad0fa69":{"workers":{"app/api/cli-tools/codex-settings/route":{"moduleId":"66501","async":false}},"layer":{"app/api/cli-tools/codex-settings/route":"rsc"},"filename":"app/api/cli-tools/codex-settings/route.js","exportedName":"DELETE"},"00922be4e72f8d88dcc3486a06892a9d1065927f2d":{"workers":{"app/api/cli-tools/codex-settings/route":{"moduleId":"66501","async":false}},"layer":{"app/api/cli-tools/codex-settings/route":"rsc"},"filename":"app/api/cli-tools/codex-settings/route.js","exportedName":"GET"},"404dc56bb22b296c3e08e3f9b5bc15f3993ec699d4":{"workers":{"app/api/cli-tools/codex-settings/route":{"moduleId":"66501","async":false}},"layer":{"app/api/cli-tools/codex-settings/route":"rsc"},"filename":"app/api/cli-tools/codex-settings/route.js","exportedName":"POST"},"00b21146902ce6f999dd5ababb8462e5068873fc6f":{"workers":{"app/api/cli-tools/droid-settings/route":{"moduleId":"5511","async":false}},"layer":{"app/api/cli-tools/droid-settings/route":"rsc"},"filename":"app/api/cli-tools/droid-settings/route.js","exportedName":"DELETE"},"00bb7533915a2cd62e55b7f0a06197ea5372887dee":{"workers":{"app/api/cli-tools/droid-settings/route":{"moduleId":"5511","async":false}},"layer":{"app/api/cli-tools/droid-settings/route":"rsc"},"filename":"app/api/cli-tools/droid-settings/route.js","exportedName":"GET"},"40445d33960e32cf1b5a905a623e6fa62f8cd667fb":{"workers":{"app/api/cli-tools/droid-settings/route":{"moduleId":"5511","async":false}},"layer":{"app/api/cli-tools/droid-settings/route":"rsc"},"filename":"app/api/cli-tools/droid-settings/route.js","exportedName":"POST"},"00aa34c5bf3a751e6b691cef2a148c077880fe4ecd":{"workers":{"app/api/cli-tools/antigravity-mitm/route":{"moduleId":"77719","async":false}},"layer":{"app/api/cli-tools/antigravity-mitm/route":"rsc"},"filename":"app/api/cli-tools/antigravity-mitm/route.js","exportedName":"GET"},"40b00b57e77b9cf0ccfcdd93636c5d2688122a3520":{"workers":{"app/api/cli-tools/antigravity-mitm/route":{"moduleId":"77719","async":false}},"layer":{"app/api/cli-tools/antigravity-mitm/route":"rsc"},"filename":"app/api/cli-tools/antigravity-mitm/route.js","exportedName":"DELETE"},"40e91203fd199f95fb238abe373bb8e1f5b2d751ff":{"workers":{"app/api/cli-tools/antigravity-mitm/route":{"moduleId":"77719","async":false}},"layer":{"app/api/cli-tools/antigravity-mitm/route":"rsc"},"filename":"app/api/cli-tools/antigravity-mitm/route.js","exportedName":"POST"}},"edge":{},"encryptionKey":"/Axws6/wvMOsWRe6HSCxx5STMGGAI0fwKAUazjXGDPo="}
1
+ {"node":{"4032e64f5ea2908f6fabc6aa209c092bddee20fae6":{"workers":{"app/api/cli-tools/antigravity-mitm/alias/route":{"moduleId":"31937","async":false}},"layer":{"app/api/cli-tools/antigravity-mitm/alias/route":"rsc"},"filename":"app/api/cli-tools/antigravity-mitm/alias/route.js","exportedName":"PUT"},"40c4535616d5f4a77508117d60f3b496e3a17e78b7":{"workers":{"app/api/cli-tools/antigravity-mitm/alias/route":{"moduleId":"31937","async":false}},"layer":{"app/api/cli-tools/antigravity-mitm/alias/route":"rsc"},"filename":"app/api/cli-tools/antigravity-mitm/alias/route.js","exportedName":"GET"},"003523b2f8d88ac7d32c39bad3685692def7e2dc18":{"workers":{"app/api/cli-tools/droid-settings/route":{"moduleId":"43615","async":false}},"layer":{"app/api/cli-tools/droid-settings/route":"rsc"},"filename":"app/api/cli-tools/droid-settings/route.js","exportedName":"DELETE"},"00816c40c7b69f867b790de3a390e9681d58f29574":{"workers":{"app/api/cli-tools/droid-settings/route":{"moduleId":"43615","async":false}},"layer":{"app/api/cli-tools/droid-settings/route":"rsc"},"filename":"app/api/cli-tools/droid-settings/route.js","exportedName":"GET"},"401feaf7f296911bb850f9790b7f044f37863a2e71":{"workers":{"app/api/cli-tools/droid-settings/route":{"moduleId":"43615","async":false}},"layer":{"app/api/cli-tools/droid-settings/route":"rsc"},"filename":"app/api/cli-tools/droid-settings/route.js","exportedName":"POST"},"008cf113283768c26f3247f3cba1e47299677c6bfa":{"workers":{"app/api/cli-tools/codex-settings/route":{"moduleId":"10263","async":false}},"layer":{"app/api/cli-tools/codex-settings/route":"rsc"},"filename":"app/api/cli-tools/codex-settings/route.js","exportedName":"GET"},"00db2118c646447dac238b45700eaf7a7acd86fe2c":{"workers":{"app/api/cli-tools/codex-settings/route":{"moduleId":"10263","async":false}},"layer":{"app/api/cli-tools/codex-settings/route":"rsc"},"filename":"app/api/cli-tools/codex-settings/route.js","exportedName":"DELETE"},"40e3a14a3d0aae609ce5d5de9d4354f25ab7ce0096":{"workers":{"app/api/cli-tools/codex-settings/route":{"moduleId":"10263","async":false}},"layer":{"app/api/cli-tools/codex-settings/route":"rsc"},"filename":"app/api/cli-tools/codex-settings/route.js","exportedName":"POST"},"00168a8e161959542b41c01a576c156b196b23e94e":{"workers":{"app/api/cli-tools/openclaw-settings/route":{"moduleId":"15901","async":false}},"layer":{"app/api/cli-tools/openclaw-settings/route":"rsc"},"filename":"app/api/cli-tools/openclaw-settings/route.js","exportedName":"GET"},"00a69bd94a092102e26f15244c0592ace2e032cd60":{"workers":{"app/api/cli-tools/openclaw-settings/route":{"moduleId":"15901","async":false}},"layer":{"app/api/cli-tools/openclaw-settings/route":"rsc"},"filename":"app/api/cli-tools/openclaw-settings/route.js","exportedName":"DELETE"},"40d73977ee95c7c12a5a4114673fb814df16286dc2":{"workers":{"app/api/cli-tools/openclaw-settings/route":{"moduleId":"15901","async":false}},"layer":{"app/api/cli-tools/openclaw-settings/route":"rsc"},"filename":"app/api/cli-tools/openclaw-settings/route.js","exportedName":"POST"},"000c014f5fc995066202a5352d5d8a87041af63044":{"workers":{"app/api/cli-tools/claude-settings/route":{"moduleId":"24093","async":false}},"layer":{"app/api/cli-tools/claude-settings/route":"rsc"},"filename":"app/api/cli-tools/claude-settings/route.js","exportedName":"GET"},"009e6557058c7d13bd87f9101965cbbadd3b750b8b":{"workers":{"app/api/cli-tools/claude-settings/route":{"moduleId":"24093","async":false}},"layer":{"app/api/cli-tools/claude-settings/route":"rsc"},"filename":"app/api/cli-tools/claude-settings/route.js","exportedName":"DELETE"},"40b544cfdcf74fc9c0f0bb9ce744b871134aa5c8e1":{"workers":{"app/api/cli-tools/claude-settings/route":{"moduleId":"24093","async":false}},"layer":{"app/api/cli-tools/claude-settings/route":"rsc"},"filename":"app/api/cli-tools/claude-settings/route.js","exportedName":"POST"},"001c005b09de37b2cfc962f15ee2535dc18abfec9b":{"workers":{"app/api/cli-tools/antigravity-mitm/route":{"moduleId":"35805","async":false}},"layer":{"app/api/cli-tools/antigravity-mitm/route":"rsc"},"filename":"app/api/cli-tools/antigravity-mitm/route.js","exportedName":"GET"},"40917a24e693561f7b86a67a3ee8789cb68b85111b":{"workers":{"app/api/cli-tools/antigravity-mitm/route":{"moduleId":"35805","async":false}},"layer":{"app/api/cli-tools/antigravity-mitm/route":"rsc"},"filename":"app/api/cli-tools/antigravity-mitm/route.js","exportedName":"POST"},"4091af35cdf07bcd016e0abdaa2a971a1f355f2d0e":{"workers":{"app/api/cli-tools/antigravity-mitm/route":{"moduleId":"35805","async":false}},"layer":{"app/api/cli-tools/antigravity-mitm/route":"rsc"},"filename":"app/api/cli-tools/antigravity-mitm/route.js","exportedName":"DELETE"}},"edge":{},"encryptionKey":"zthXiAVFGkqO5LTQ5pnqq7RexFVYySnjjj8aY/m0ZWE="}
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1393],{1393:(e,s,l)=>{Promise.resolve().then(l.bind(l,5907))},5907:(e,s,l)=>{"use strict";l.d(s,{default:()=>c});var t=l(5155),a=l(2115),r=l(4051),i=l.n(r),n=l(5497),d=l(1059);let o=15e3;function c({machineId:e}){let[s,l]=(0,a.useState)([]),[r,i]=(0,a.useState)(!0),[c,m]=(0,a.useState)(!1),[x,y]=(0,a.useState)(""),[h,u]=(0,a.useState)(null),[p,b]=(0,a.useState)(!1),[g,f]=(0,a.useState)(!1),[j,N]=(0,a.useState)(!1),[v,k]=(0,a.useState)(!1),[w,C]=(0,a.useState)(null),[S,_]=(0,a.useState)(""),{copied:E,copy:P}=(0,d.C)();(0,a.useEffect)(()=>{O(),A()},[]);let $=async(e,s=o)=>{let l=new AbortController,t=setTimeout(()=>l.abort(),s);try{let s=await fetch("/api/sync/cloud",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:e}),signal:l.signal}),t=await s.json().catch(()=>({}));return{ok:s.ok,status:s.status,data:t}}catch(e){if(e?.name==="AbortError")return{ok:!1,status:408,data:{error:"Cloud request timeout"}};return{ok:!1,status:500,data:{error:e.message||"Cloud request failed"}}}finally{clearTimeout(t)}},A=async()=>{try{let e=await fetch("/api/settings");if(e.ok){let s=await e.json();b(s.cloudEnabled||!1)}}catch(e){console.log("Error loading cloud settings:",e)}},O=async()=>{try{let e=await fetch("/api/keys"),s=await e.json();e.ok&&l(s.keys||[])}catch(e){console.log("Error fetching data:",e)}finally{i(!1)}},D=e=>{e?f(!0):N(!0)},I=async()=>{k(!0),_("syncing");try{let{ok:e,data:s}=await $("enable");e?(_("verifying"),s.verified?(b(!0),C({type:"success",message:"Cloud Proxy connected and verified!"})):(b(!0),C({type:"warning",message:s.verifyError||"Connected but verification failed"})),f(!1),s.createdKey&&await O()):C({type:"error",message:s.error||"Failed to enable cloud"})}catch(e){C({type:"error",message:e.message})}finally{k(!1),_("")}},T=async()=>{k(!0),_("syncing");try{await $("sync"),_("disabling");let{ok:e,data:s}=await $("disable");e?(b(!1),C({type:"success",message:"Cloud disabled"}),N(!1)):C({type:"error",message:s.error||"Failed to disable cloud"})}catch(e){console.log("Error disabling cloud:",e),C({type:"error",message:"Failed to disable cloud"})}finally{k(!1),_("")}},W=async()=>{if(x.trim())try{let e=await fetch("/api/keys",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:x})}),s=await e.json();e.ok&&(u(s.key),await O(),y(""),m(!1))}catch(e){console.log("Error creating key:",e)}},F=async e=>{if(confirm("Delete this API key?"))try{(await fetch(`/api/keys/${e}`,{method:"DELETE"})).ok&&l(s.filter(s=>s.id!==e))}catch(e){console.log("Error deleting key:",e)}},[K,q]=(0,a.useState)("/v1");if((0,a.useEffect)(()=>{q(`${window.location.origin}/v1`)},[]),r)return(0,t.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,t.jsx)(n.Qv,{}),(0,t.jsx)(n.Qv,{})]});let L=p?"https://9router.com/v1":K;return(0,t.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,t.jsxs)(n.Zp,{className:"",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold",children:"API Endpoint"}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:p?"Using Cloud Proxy":"Using Local Server"})]}),(0,t.jsx)("div",{className:"flex items-center gap-2",children:p?(0,t.jsx)(n.$n,{size:"sm",variant:"secondary",icon:"cloud_off",onClick:()=>D(!1),disabled:v,className:"bg-red-500/10! text-red-500! hover:bg-red-500/20! border-red-500/30!",children:"Disable Cloud"}):(0,t.jsx)(n.$n,{variant:"primary",icon:"cloud_upload",onClick:()=>D(!0),disabled:v,className:"bg-linear-to-r from-primary to-blue-500 hover:from-primary-hover hover:to-blue-600",children:"Enable Cloud"})})]}),(0,t.jsxs)("div",{className:"flex gap-2 mb-3",children:[(0,t.jsx)(n.pd,{value:L,readOnly:!0,className:`flex-1 font-mono text-sm ${p?"animate-border-glow":""}`}),(0,t.jsx)(n.$n,{variant:"secondary",icon:"endpoint_url"===E?"check":"content_copy",onClick:()=>P(L,"endpoint_url"),children:"endpoint_url"===E?"Copied!":"Copy"})]})]}),(0,t.jsxs)(n.Zp,{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold",children:"API Keys"}),(0,t.jsx)(n.$n,{icon:"add",onClick:()=>m(!0),children:"Create Key"})]}),0===s.length?(0,t.jsxs)("div",{className:"text-center py-12",children:[(0,t.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 text-primary mb-4",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-[32px]",children:"vpn_key"})}),(0,t.jsx)("p",{className:"text-text-main font-medium mb-1",children:"No API keys yet"}),(0,t.jsx)("p",{className:"text-sm text-text-muted mb-4",children:"Create your first API key to get started"}),(0,t.jsx)(n.$n,{icon:"add",onClick:()=>m(!0),children:"Create Key"})]}):(0,t.jsx)("div",{className:"flex flex-col",children:s.map(e=>(0,t.jsxs)("div",{className:"group flex items-center justify-between py-3 border-b border-black/[0.03] dark:border-white/[0.03] last:border-b-0",children:[(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:e.name}),(0,t.jsxs)("div",{className:"flex items-center gap-2 mt-1",children:[(0,t.jsx)("code",{className:"text-xs text-text-muted font-mono",children:e.key}),(0,t.jsx)("button",{onClick:()=>P(e.key,e.id),className:"p-1 hover:bg-black/5 dark:hover:bg-white/5 rounded text-text-muted hover:text-primary opacity-0 group-hover:opacity-100 transition-all",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:E===e.id?"check":"content_copy"})})]}),(0,t.jsxs)("p",{className:"text-xs text-text-muted mt-1",children:["Created ",new Date(e.createdAt).toLocaleDateString()]})]}),(0,t.jsx)("button",{onClick:()=>F(e.id),className:"p-2 hover:bg-red-500/10 rounded text-red-500 opacity-0 group-hover:opacity-100 transition-all",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"delete"})})]},e.id))})]}),!1,(0,t.jsx)(n.aF,{isOpen:g,title:"Enable Cloud Proxy",onClose:()=>f(!1),children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsxs)("div",{className:"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4",children:[(0,t.jsx)("p",{className:"text-sm text-blue-800 dark:text-blue-200 font-medium mb-2",children:"What you will get"}),(0,t.jsxs)("ul",{className:"text-sm text-blue-700 dark:text-blue-300 space-y-1",children:[(0,t.jsx)("li",{children:"• Access your API from anywhere in the world"}),(0,t.jsx)("li",{children:"• Share endpoint with your team easily"}),(0,t.jsx)("li",{children:"• No need to open ports or configure firewall"}),(0,t.jsx)("li",{children:"• Fast global edge network"})]})]}),(0,t.jsxs)("div",{className:"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4",children:[(0,t.jsx)("p",{className:"text-sm text-yellow-800 dark:text-yellow-200 font-medium mb-1",children:"Note"}),(0,t.jsxs)("ul",{className:"text-sm text-yellow-700 dark:text-yellow-300 space-y-1",children:[(0,t.jsx)("li",{children:"• Cloud will keep your auth session for 1 day. If not used, it will be automatically deleted."}),(0,t.jsx)("li",{children:"• Cloud is currently unstable with Claude Code OAuth in some cases."})]})]}),v&&(0,t.jsxs)("div",{className:"flex items-center gap-3 p-3 bg-primary/10 border border-primary/30 rounded-lg",children:[(0,t.jsx)("span",{className:"material-symbols-outlined animate-spin text-primary",children:"progress_activity"}),(0,t.jsx)("div",{className:"flex-1",children:(0,t.jsxs)("p",{className:"text-sm font-medium text-primary",children:["syncing"===S&&"Syncing data to cloud...","verifying"===S&&"Verifying connection..."]})})]}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(n.$n,{onClick:I,fullWidth:!0,disabled:v,children:v?(0,t.jsxs)("span",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"material-symbols-outlined animate-spin text-sm",children:"progress_activity"}),"syncing"===S?"Syncing...":"Verifying..."]}):"Enable Cloud"}),(0,t.jsx)(n.$n,{onClick:()=>f(!1),variant:"ghost",fullWidth:!0,disabled:v,children:"Cancel"})]})]})}),(0,t.jsx)(n.aF,{isOpen:c,title:"Create API Key",onClose:()=>{m(!1),y("")},children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)(n.pd,{label:"Key Name",value:x,onChange:e=>y(e.target.value),placeholder:"Production Key"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(n.$n,{onClick:W,fullWidth:!0,disabled:!x.trim(),children:"Create"}),(0,t.jsx)(n.$n,{onClick:()=>{m(!1),y("")},variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})}),(0,t.jsx)(n.aF,{isOpen:!!h,title:"API Key Created",onClose:()=>u(null),children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsxs)("div",{className:"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4",children:[(0,t.jsx)("p",{className:"text-sm text-yellow-800 dark:text-yellow-200 mb-2 font-medium",children:"Save this key now!"}),(0,t.jsx)("p",{className:"text-sm text-yellow-700 dark:text-yellow-300",children:"This is the only time you will see this key. Store it securely."})]}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(n.pd,{value:h||"",readOnly:!0,className:"flex-1 font-mono text-sm"}),(0,t.jsx)(n.$n,{variant:"secondary",icon:"created_key"===E?"check":"content_copy",onClick:()=>P(h,"created_key"),children:"created_key"===E?"Copied!":"Copy"})]}),(0,t.jsx)(n.$n,{onClick:()=>u(null),fullWidth:!0,children:"Done"})]})}),(0,t.jsx)(n.aF,{isOpen:j,title:"Disable Cloud Proxy",onClose:()=>!v&&N(!1),children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)("div",{className:"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4",children:(0,t.jsxs)("div",{className:"flex items-start gap-3",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-red-600 dark:text-red-400",children:"warning"}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm text-red-800 dark:text-red-200 font-medium mb-1",children:"Warning"}),(0,t.jsx)("p",{className:"text-sm text-red-700 dark:text-red-300",children:"All auth sessions will be deleted from cloud."})]})]})}),v&&(0,t.jsxs)("div",{className:"flex items-center gap-3 p-3 bg-primary/10 border border-primary/30 rounded-lg",children:[(0,t.jsx)("span",{className:"material-symbols-outlined animate-spin text-primary",children:"progress_activity"}),(0,t.jsx)("div",{className:"flex-1",children:(0,t.jsxs)("p",{className:"text-sm font-medium text-primary",children:["syncing"===S&&"Syncing latest data...","disabling"===S&&"Disabling cloud..."]})})]}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:"Are you sure you want to disable cloud proxy?"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(n.$n,{onClick:T,fullWidth:!0,disabled:v,className:"bg-red-500! hover:bg-red-600! text-white!",children:v?(0,t.jsxs)("span",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"material-symbols-outlined animate-spin text-sm",children:"progress_activity"}),"syncing"===S?"Syncing...":"Disabling..."]}):"Disable Cloud"}),(0,t.jsx)(n.$n,{onClick:()=>N(!1),variant:"ghost",fullWidth:!0,disabled:v,children:"Cancel"})]})]})})]})}c.propTypes={machineId:i().string.isRequired}}}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1393],{3774:(e,s,l)=>{Promise.resolve().then(l.bind(l,5907))},5907:(e,s,l)=>{"use strict";l.d(s,{default:()=>c});var t=l(5155),a=l(2115),r=l(4051),i=l.n(r),n=l(5497),d=l(1059);let o=15e3;function c({machineId:e}){let[s,l]=(0,a.useState)([]),[r,i]=(0,a.useState)(!0),[c,m]=(0,a.useState)(!1),[x,y]=(0,a.useState)(""),[h,u]=(0,a.useState)(null),[p,b]=(0,a.useState)(!1),[g,f]=(0,a.useState)(!1),[j,N]=(0,a.useState)(!1),[v,k]=(0,a.useState)(!1),[w,C]=(0,a.useState)(null),[S,_]=(0,a.useState)(""),{copied:E,copy:P}=(0,d.C)();(0,a.useEffect)(()=>{O(),A()},[]);let $=async(e,s=o)=>{let l=new AbortController,t=setTimeout(()=>l.abort(),s);try{let s=await fetch("/api/sync/cloud",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:e}),signal:l.signal}),t=await s.json().catch(()=>({}));return{ok:s.ok,status:s.status,data:t}}catch(e){if(e?.name==="AbortError")return{ok:!1,status:408,data:{error:"Cloud request timeout"}};return{ok:!1,status:500,data:{error:e.message||"Cloud request failed"}}}finally{clearTimeout(t)}},A=async()=>{try{let e=await fetch("/api/settings");if(e.ok){let s=await e.json();b(s.cloudEnabled||!1)}}catch(e){console.log("Error loading cloud settings:",e)}},O=async()=>{try{let e=await fetch("/api/keys"),s=await e.json();e.ok&&l(s.keys||[])}catch(e){console.log("Error fetching data:",e)}finally{i(!1)}},D=e=>{e?f(!0):N(!0)},I=async()=>{k(!0),_("syncing");try{let{ok:e,data:s}=await $("enable");e?(_("verifying"),s.verified?(b(!0),C({type:"success",message:"Cloud Proxy connected and verified!"})):(b(!0),C({type:"warning",message:s.verifyError||"Connected but verification failed"})),f(!1),s.createdKey&&await O()):C({type:"error",message:s.error||"Failed to enable cloud"})}catch(e){C({type:"error",message:e.message})}finally{k(!1),_("")}},T=async()=>{k(!0),_("syncing");try{await $("sync"),_("disabling");let{ok:e,data:s}=await $("disable");e?(b(!1),C({type:"success",message:"Cloud disabled"}),N(!1)):C({type:"error",message:s.error||"Failed to disable cloud"})}catch(e){console.log("Error disabling cloud:",e),C({type:"error",message:"Failed to disable cloud"})}finally{k(!1),_("")}},W=async()=>{if(x.trim())try{let e=await fetch("/api/keys",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:x})}),s=await e.json();e.ok&&(u(s.key),await O(),y(""),m(!1))}catch(e){console.log("Error creating key:",e)}},F=async e=>{if(confirm("Delete this API key?"))try{(await fetch(`/api/keys/${e}`,{method:"DELETE"})).ok&&l(s.filter(s=>s.id!==e))}catch(e){console.log("Error deleting key:",e)}},[K,q]=(0,a.useState)("/v1");if((0,a.useEffect)(()=>{q(`${window.location.origin}/v1`)},[]),r)return(0,t.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,t.jsx)(n.Qv,{}),(0,t.jsx)(n.Qv,{})]});let L=p?"https://9router.com/v1":K;return(0,t.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,t.jsxs)(n.Zp,{className:"",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold",children:"API Endpoint"}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:p?"Using Cloud Proxy":"Using Local Server"})]}),(0,t.jsx)("div",{className:"flex items-center gap-2",children:p?(0,t.jsx)(n.$n,{size:"sm",variant:"secondary",icon:"cloud_off",onClick:()=>D(!1),disabled:v,className:"bg-red-500/10! text-red-500! hover:bg-red-500/20! border-red-500/30!",children:"Disable Cloud"}):(0,t.jsx)(n.$n,{variant:"primary",icon:"cloud_upload",onClick:()=>D(!0),disabled:v,className:"bg-linear-to-r from-primary to-blue-500 hover:from-primary-hover hover:to-blue-600",children:"Enable Cloud"})})]}),(0,t.jsxs)("div",{className:"flex gap-2 mb-3",children:[(0,t.jsx)(n.pd,{value:L,readOnly:!0,className:`flex-1 font-mono text-sm ${p?"animate-border-glow":""}`}),(0,t.jsx)(n.$n,{variant:"secondary",icon:"endpoint_url"===E?"check":"content_copy",onClick:()=>P(L,"endpoint_url"),children:"endpoint_url"===E?"Copied!":"Copy"})]})]}),(0,t.jsxs)(n.Zp,{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold",children:"API Keys"}),(0,t.jsx)(n.$n,{icon:"add",onClick:()=>m(!0),children:"Create Key"})]}),0===s.length?(0,t.jsxs)("div",{className:"text-center py-12",children:[(0,t.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 text-primary mb-4",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-[32px]",children:"vpn_key"})}),(0,t.jsx)("p",{className:"text-text-main font-medium mb-1",children:"No API keys yet"}),(0,t.jsx)("p",{className:"text-sm text-text-muted mb-4",children:"Create your first API key to get started"}),(0,t.jsx)(n.$n,{icon:"add",onClick:()=>m(!0),children:"Create Key"})]}):(0,t.jsx)("div",{className:"flex flex-col",children:s.map(e=>(0,t.jsxs)("div",{className:"group flex items-center justify-between py-3 border-b border-black/[0.03] dark:border-white/[0.03] last:border-b-0",children:[(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:e.name}),(0,t.jsxs)("div",{className:"flex items-center gap-2 mt-1",children:[(0,t.jsx)("code",{className:"text-xs text-text-muted font-mono",children:e.key}),(0,t.jsx)("button",{onClick:()=>P(e.key,e.id),className:"p-1 hover:bg-black/5 dark:hover:bg-white/5 rounded text-text-muted hover:text-primary opacity-0 group-hover:opacity-100 transition-all",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:E===e.id?"check":"content_copy"})})]}),(0,t.jsxs)("p",{className:"text-xs text-text-muted mt-1",children:["Created ",new Date(e.createdAt).toLocaleDateString()]})]}),(0,t.jsx)("button",{onClick:()=>F(e.id),className:"p-2 hover:bg-red-500/10 rounded text-red-500 opacity-0 group-hover:opacity-100 transition-all",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"delete"})})]},e.id))})]}),!1,(0,t.jsx)(n.aF,{isOpen:g,title:"Enable Cloud Proxy",onClose:()=>f(!1),children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsxs)("div",{className:"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4",children:[(0,t.jsx)("p",{className:"text-sm text-blue-800 dark:text-blue-200 font-medium mb-2",children:"What you will get"}),(0,t.jsxs)("ul",{className:"text-sm text-blue-700 dark:text-blue-300 space-y-1",children:[(0,t.jsx)("li",{children:"• Access your API from anywhere in the world"}),(0,t.jsx)("li",{children:"• Share endpoint with your team easily"}),(0,t.jsx)("li",{children:"• No need to open ports or configure firewall"}),(0,t.jsx)("li",{children:"• Fast global edge network"})]})]}),(0,t.jsxs)("div",{className:"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4",children:[(0,t.jsx)("p",{className:"text-sm text-yellow-800 dark:text-yellow-200 font-medium mb-1",children:"Note"}),(0,t.jsxs)("ul",{className:"text-sm text-yellow-700 dark:text-yellow-300 space-y-1",children:[(0,t.jsx)("li",{children:"• Cloud will keep your auth session for 1 day. If not used, it will be automatically deleted."}),(0,t.jsx)("li",{children:"• Cloud is currently unstable with Claude Code OAuth in some cases."})]})]}),v&&(0,t.jsxs)("div",{className:"flex items-center gap-3 p-3 bg-primary/10 border border-primary/30 rounded-lg",children:[(0,t.jsx)("span",{className:"material-symbols-outlined animate-spin text-primary",children:"progress_activity"}),(0,t.jsx)("div",{className:"flex-1",children:(0,t.jsxs)("p",{className:"text-sm font-medium text-primary",children:["syncing"===S&&"Syncing data to cloud...","verifying"===S&&"Verifying connection..."]})})]}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(n.$n,{onClick:I,fullWidth:!0,disabled:v,children:v?(0,t.jsxs)("span",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"material-symbols-outlined animate-spin text-sm",children:"progress_activity"}),"syncing"===S?"Syncing...":"Verifying..."]}):"Enable Cloud"}),(0,t.jsx)(n.$n,{onClick:()=>f(!1),variant:"ghost",fullWidth:!0,disabled:v,children:"Cancel"})]})]})}),(0,t.jsx)(n.aF,{isOpen:c,title:"Create API Key",onClose:()=>{m(!1),y("")},children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)(n.pd,{label:"Key Name",value:x,onChange:e=>y(e.target.value),placeholder:"Production Key"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(n.$n,{onClick:W,fullWidth:!0,disabled:!x.trim(),children:"Create"}),(0,t.jsx)(n.$n,{onClick:()=>{m(!1),y("")},variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})}),(0,t.jsx)(n.aF,{isOpen:!!h,title:"API Key Created",onClose:()=>u(null),children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsxs)("div",{className:"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4",children:[(0,t.jsx)("p",{className:"text-sm text-yellow-800 dark:text-yellow-200 mb-2 font-medium",children:"Save this key now!"}),(0,t.jsx)("p",{className:"text-sm text-yellow-700 dark:text-yellow-300",children:"This is the only time you will see this key. Store it securely."})]}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(n.pd,{value:h||"",readOnly:!0,className:"flex-1 font-mono text-sm"}),(0,t.jsx)(n.$n,{variant:"secondary",icon:"created_key"===E?"check":"content_copy",onClick:()=>P(h,"created_key"),children:"created_key"===E?"Copied!":"Copy"})]}),(0,t.jsx)(n.$n,{onClick:()=>u(null),fullWidth:!0,children:"Done"})]})}),(0,t.jsx)(n.aF,{isOpen:j,title:"Disable Cloud Proxy",onClose:()=>!v&&N(!1),children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)("div",{className:"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4",children:(0,t.jsxs)("div",{className:"flex items-start gap-3",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-red-600 dark:text-red-400",children:"warning"}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm text-red-800 dark:text-red-200 font-medium mb-1",children:"Warning"}),(0,t.jsx)("p",{className:"text-sm text-red-700 dark:text-red-300",children:"All auth sessions will be deleted from cloud."})]})]})}),v&&(0,t.jsxs)("div",{className:"flex items-center gap-3 p-3 bg-primary/10 border border-primary/30 rounded-lg",children:[(0,t.jsx)("span",{className:"material-symbols-outlined animate-spin text-primary",children:"progress_activity"}),(0,t.jsx)("div",{className:"flex-1",children:(0,t.jsxs)("p",{className:"text-sm font-medium text-primary",children:["syncing"===S&&"Syncing latest data...","disabling"===S&&"Disabling cloud..."]})})]}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:"Are you sure you want to disable cloud proxy?"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(n.$n,{onClick:T,fullWidth:!0,disabled:v,className:"bg-red-500! hover:bg-red-600! text-white!",children:v?(0,t.jsxs)("span",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"material-symbols-outlined animate-spin text-sm",children:"progress_activity"}),"syncing"===S?"Syncing...":"Disabling..."]}):"Disable Cloud"}),(0,t.jsx)(n.$n,{onClick:()=>N(!1),variant:"ghost",fullWidth:!0,disabled:v,children:"Cancel"})]})]})})]})}c.propTypes={machineId:i().string.isRequired}}}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3624],{91:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={formatUrl:function(){return u},formatWithValidation:function(){return l},urlObjectKeys:function(){return s}};for(var o in n)Object.defineProperty(t,o,{enumerable:!0,get:n[o]});let a=r(6388)._(r(3774)),i=/https?|ftp|gopher|file/;function u(e){let{auth:t,hostname:r}=e,n=e.protocol||"",o=e.pathname||"",u=e.hash||"",s=e.query||"",l=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?l=t+e.host:r&&(l=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(l+=":"+e.port)),s&&"object"==typeof s&&(s=String(a.urlQueryToSearchParams(s)));let c=e.search||s&&`?${s}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||i.test(n))&&!1!==l?(l="//"+(l||""),o&&"/"!==o[0]&&(o="/"+o)):l||(l=""),u&&"#"!==u[0]&&(u="#"+u),c&&"?"!==c[0]&&(c="?"+c),o=o.replace(/[?#]/g,encodeURIComponent),c=c.replace("#","%23"),`${n}${l}${o}${c}${u}`}let s=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function l(e){return u(e)}},857:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={DecodeError:function(){return y},MiddlewareNotFoundError:function(){return S},MissingStaticPage:function(){return b},NormalizeError:function(){return m},PageNotFoundError:function(){return v},SP:function(){return h},ST:function(){return g},WEB_VITALS:function(){return o},execOnce:function(){return a},getDisplayName:function(){return c},getLocationOrigin:function(){return s},getURL:function(){return l},isAbsoluteUrl:function(){return u},isResSent:function(){return f},loadGetInitialProps:function(){return d},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return P}};for(var n in r)Object.defineProperty(t,n,{enumerable:!0,get:r[n]});let o=["CLS","FCP","FID","INP","LCP","TTFB"];function a(e){let t,r=!1;return(...n)=>(r||(r=!0,t=e(...n)),t)}let i=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,u=e=>i.test(e);function s(){let{protocol:e,hostname:t,port:r}=window.location;return`${e}//${t}${r?":"+r:""}`}function l(){let{href:e}=window.location,t=s();return e.substring(t.length)}function c(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function f(e){return e.finished||e.headersSent}function p(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function d(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await d(t.Component,t.ctx)}:{};let n=await e.getInitialProps(t);if(r&&f(r))return n;if(!n)throw Object.defineProperty(Error(`"${c(e)}.getInitialProps()" should resolve to an object. But found "${n}" instead.`),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return n}let h="u">typeof performance,g=h&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class y extends Error{}class m extends Error{}class v extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class b extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class S extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function P(e){return JSON.stringify({message:e.message,stack:e.stack})}},1934:(e,t,r)=>{"use strict";r.d(t,{v:()=>i});var n=r(2115);let o=e=>{let t,r=new Set,n=(e,n)=>{let o="function"==typeof e?e(t):e;if(!Object.is(o,t)){let e=t;t=(null!=n?n:"object"!=typeof o||null===o)?o:Object.assign({},t,o),r.forEach(r=>r(t,e))}},o=()=>t,a={setState:n,getState:o,getInitialState:()=>i,subscribe:e=>(r.add(e),()=>r.delete(e))},i=t=e(n,o,a);return a},a=e=>{let t=e?o(e):o,r=e=>(function(e,t=e=>e){let r=n.useSyncExternalStore(e.subscribe,n.useCallback(()=>t(e.getState()),[e,t]),n.useCallback(()=>t(e.getInitialState()),[e,t]));return n.useDebugValue(r),r})(t,e);return Object.assign(r,t),r},i=e=>e?a(e):a},2114:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},3774:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={assign:function(){return u},searchParamsToUrlQuery:function(){return o},urlQueryToSearchParams:function(){return i}};for(var n in r)Object.defineProperty(t,n,{enumerable:!0,get:r[n]});function o(e){let t={};for(let[r,n]of e.entries()){let e=t[r];void 0===e?t[r]=n:Array.isArray(e)?e.push(n):t[r]=[e,n]}return t}function a(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function i(e){let t=new URLSearchParams;for(let[r,n]of Object.entries(e))if(Array.isArray(n))for(let e of n)t.append(r,a(e));else t.set(r,a(n));return t}function u(e,...t){for(let r of t){for(let t of r.keys())e.delete(t);for(let[t,n]of r.entries())e.append(t,n)}return e}},4051:(e,t,r)=>{e.exports=r(4701)()},4701:(e,t,r)=>{"use strict";var n=r(2114);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,r,o,a,i){if(i!==n){var u=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw u.name="Invariant Violation",u}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return r.PropTypes=r,r}},8500:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={default:function(){return m},useLinkStatus:function(){return b}};for(var o in n)Object.defineProperty(t,o,{enumerable:!0,get:n[o]});let a=r(6388),i=r(5155),u=a._(r(2115)),s=r(91),l=r(2909),c=r(1172),f=r(857),p=r(127);r(7284);let d=r(4972),h=r(9470),g=r(7565);function y(e){return"string"==typeof e?e:(0,s.formatUrl)(e)}function m(e){var t;let n,o,a,[s,m]=(0,u.useOptimistic)(d.IDLE_LINK_STATUS),b=(0,u.useRef)(null),{href:S,as:P,children:E,prefetch:O=null,passHref:_,replace:T,shallow:C,scroll:I,onClick:j,onMouseEnter:w,onTouchStart:N,legacyBehavior:R=!1,onNavigate:k,ref:x,unstable_dynamicOnHover:L,...U}=e;n=E,R&&("string"==typeof n||"number"==typeof n)&&(n=(0,i.jsx)("a",{children:n}));let $=u.default.useContext(l.AppRouterContext),A=!1!==O,M=!1!==O?null===(t=O)||"auto"===t?g.FetchStrategy.PPR:g.FetchStrategy.Full:g.FetchStrategy.PPR,{href:F,as:D}=u.default.useMemo(()=>{let e=y(S);return{href:e,as:P?y(P):e}},[S,P]);if(R){if(n?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});o=u.default.Children.only(n)}let z=R?o&&"object"==typeof o&&o.ref:x,B=u.default.useCallback(e=>(null!==$&&(b.current=(0,d.mountLinkInstance)(e,F,$,M,A,m)),()=>{b.current&&((0,d.unmountLinkForCurrentNavigation)(b.current),b.current=null),(0,d.unmountPrefetchableInstance)(e)}),[A,F,$,M,m]),K={ref:(0,c.useMergedRef)(B,z),onClick(e){R||"function"!=typeof j||j(e),R&&o.props&&"function"==typeof o.props.onClick&&o.props.onClick(e),!$||e.defaultPrevented||function(e,t,n,o,a,i,s){{let l,{nodeName:c}=e.currentTarget;if("A"===c.toUpperCase()&&((l=e.currentTarget.getAttribute("target"))&&"_self"!==l||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||e.nativeEvent&&2===e.nativeEvent.which)||e.currentTarget.hasAttribute("download"))return;if(!(0,h.isLocalURL)(t)){a&&(e.preventDefault(),location.replace(t));return}if(e.preventDefault(),s){let e=!1;if(s({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:f}=r(156);u.default.startTransition(()=>{f(n||t,a?"replace":"push",i??!0,o.current)})}}(e,F,D,b,T,I,k)},onMouseEnter(e){R||"function"!=typeof w||w(e),R&&o.props&&"function"==typeof o.props.onMouseEnter&&o.props.onMouseEnter(e),$&&A&&(0,d.onNavigationIntent)(e.currentTarget,!0===L)},onTouchStart:function(e){R||"function"!=typeof N||N(e),R&&o.props&&"function"==typeof o.props.onTouchStart&&o.props.onTouchStart(e),$&&A&&(0,d.onNavigationIntent)(e.currentTarget,!0===L)}};return(0,f.isAbsoluteUrl)(D)?K.href=D:R&&!_&&("a"!==o.type||"href"in o.props)||(K.href=(0,p.addBasePath)(D)),a=R?u.default.cloneElement(o,K):(0,i.jsx)("a",{...U,...K,children:n}),(0,i.jsx)(v.Provider,{value:s,children:a})}r(9842);let v=(0,u.createContext)(d.IDLE_LINK_STATUS),b=()=>(0,u.useContext)(v);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},9311:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>o});let n=e=>t=>{try{let r=e(t);if(r instanceof Promise)return r;return{then:e=>n(e)(r),catch(e){return this}}}catch(e){return{then(e){return this},catch:t=>n(t)(e)}}},o=(e,t)=>(r,o,a)=>{let i,u={storage:function(e,t){let r;try{r=e()}catch(e){return}return{getItem:e=>{var t;let n=e=>null===e?null:JSON.parse(e,void 0),o=null!=(t=r.getItem(e))?t:null;return o instanceof Promise?o.then(n):n(o)},setItem:(e,t)=>r.setItem(e,JSON.stringify(t,void 0)),removeItem:e=>r.removeItem(e)}}(()=>window.localStorage),partialize:e=>e,version:0,merge:(e,t)=>({...t,...e}),...t},s=!1,l=0,c=new Set,f=new Set,p=u.storage;if(!p)return e((...e)=>{console.warn(`[zustand persist middleware] Unable to update item '${u.name}', the given storage is currently unavailable.`),r(...e)},o,a);let d=()=>{let e=u.partialize({...o()});return p.setItem(u.name,{state:e,version:u.version})},h=a.setState;a.setState=(e,t)=>(h(e,t),d());let g=e((...e)=>(r(...e),d()),o,a);a.getInitialState=()=>g;let y=()=>{var e,t;if(!p)return;let a=++l;s=!1,c.forEach(e=>{var t;return e(null!=(t=o())?t:g)});let h=(null==(t=u.onRehydrateStorage)?void 0:t.call(u,null!=(e=o())?e:g))||void 0;return n(p.getItem.bind(p))(u.name).then(e=>{if(e)if("number"!=typeof e.version||e.version===u.version)return[!1,e.state];else{if(u.migrate){let t=u.migrate(e.state,e.version);return t instanceof Promise?t.then(e=>[!0,e]):[!0,t]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}return[!1,void 0]}).then(e=>{var t;if(a!==l)return;let[n,s]=e;if(r(i=u.merge(s,null!=(t=o())?t:g),!0),n)return d()}).then(()=>{a===l&&(null==h||h(i,void 0),i=o(),s=!0,f.forEach(e=>e(i)))}).catch(e=>{a===l&&(null==h||h(void 0,e))})};return a.persist={setOptions:e=>{u={...u,...e},e.storage&&(p=e.storage)},clearStorage:()=>{null==p||p.removeItem(u.name)},getOptions:()=>u,rehydrate:()=>y(),hasHydrated:()=>s,onHydrate:e=>(c.add(e),()=>{c.delete(e)}),onFinishHydration:e=>(f.add(e),()=>{f.delete(e)})},u.skipHydration||y(),i||g}},9470:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"isLocalURL",{enumerable:!0,get:function(){return a}});let n=r(857),o=r(8512);function a(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,o.hasBasePath)(r.pathname)}catch(e){return!1}}},9842:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"errorOnce",{enumerable:!0,get:function(){return r}});let r=e=>{}}}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3624],{91:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={formatUrl:function(){return u},formatWithValidation:function(){return l},urlObjectKeys:function(){return s}};for(var o in n)Object.defineProperty(t,o,{enumerable:!0,get:n[o]});let a=r(6388)._(r(1393)),i=/https?|ftp|gopher|file/;function u(e){let{auth:t,hostname:r}=e,n=e.protocol||"",o=e.pathname||"",u=e.hash||"",s=e.query||"",l=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?l=t+e.host:r&&(l=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(l+=":"+e.port)),s&&"object"==typeof s&&(s=String(a.urlQueryToSearchParams(s)));let c=e.search||s&&`?${s}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||i.test(n))&&!1!==l?(l="//"+(l||""),o&&"/"!==o[0]&&(o="/"+o)):l||(l=""),u&&"#"!==u[0]&&(u="#"+u),c&&"?"!==c[0]&&(c="?"+c),o=o.replace(/[?#]/g,encodeURIComponent),c=c.replace("#","%23"),`${n}${l}${o}${c}${u}`}let s=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function l(e){return u(e)}},857:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={DecodeError:function(){return y},MiddlewareNotFoundError:function(){return S},MissingStaticPage:function(){return b},NormalizeError:function(){return m},PageNotFoundError:function(){return v},SP:function(){return h},ST:function(){return g},WEB_VITALS:function(){return o},execOnce:function(){return a},getDisplayName:function(){return c},getLocationOrigin:function(){return s},getURL:function(){return l},isAbsoluteUrl:function(){return u},isResSent:function(){return f},loadGetInitialProps:function(){return d},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return P}};for(var n in r)Object.defineProperty(t,n,{enumerable:!0,get:r[n]});let o=["CLS","FCP","FID","INP","LCP","TTFB"];function a(e){let t,r=!1;return(...n)=>(r||(r=!0,t=e(...n)),t)}let i=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,u=e=>i.test(e);function s(){let{protocol:e,hostname:t,port:r}=window.location;return`${e}//${t}${r?":"+r:""}`}function l(){let{href:e}=window.location,t=s();return e.substring(t.length)}function c(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function f(e){return e.finished||e.headersSent}function p(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function d(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await d(t.Component,t.ctx)}:{};let n=await e.getInitialProps(t);if(r&&f(r))return n;if(!n)throw Object.defineProperty(Error(`"${c(e)}.getInitialProps()" should resolve to an object. But found "${n}" instead.`),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return n}let h="u">typeof performance,g=h&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class y extends Error{}class m extends Error{}class v extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class b extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class S extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function P(e){return JSON.stringify({message:e.message,stack:e.stack})}},1393:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={assign:function(){return u},searchParamsToUrlQuery:function(){return o},urlQueryToSearchParams:function(){return i}};for(var n in r)Object.defineProperty(t,n,{enumerable:!0,get:r[n]});function o(e){let t={};for(let[r,n]of e.entries()){let e=t[r];void 0===e?t[r]=n:Array.isArray(e)?e.push(n):t[r]=[e,n]}return t}function a(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function i(e){let t=new URLSearchParams;for(let[r,n]of Object.entries(e))if(Array.isArray(n))for(let e of n)t.append(r,a(e));else t.set(r,a(n));return t}function u(e,...t){for(let r of t){for(let t of r.keys())e.delete(t);for(let[t,n]of r.entries())e.append(t,n)}return e}},1934:(e,t,r)=>{"use strict";r.d(t,{v:()=>i});var n=r(2115);let o=e=>{let t,r=new Set,n=(e,n)=>{let o="function"==typeof e?e(t):e;if(!Object.is(o,t)){let e=t;t=(null!=n?n:"object"!=typeof o||null===o)?o:Object.assign({},t,o),r.forEach(r=>r(t,e))}},o=()=>t,a={setState:n,getState:o,getInitialState:()=>i,subscribe:e=>(r.add(e),()=>r.delete(e))},i=t=e(n,o,a);return a},a=e=>{let t=e?o(e):o,r=e=>(function(e,t=e=>e){let r=n.useSyncExternalStore(e.subscribe,n.useCallback(()=>t(e.getState()),[e,t]),n.useCallback(()=>t(e.getInitialState()),[e,t]));return n.useDebugValue(r),r})(t,e);return Object.assign(r,t),r},i=e=>e?a(e):a},2114:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4051:(e,t,r)=>{e.exports=r(4701)()},4701:(e,t,r)=>{"use strict";var n=r(2114);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,r,o,a,i){if(i!==n){var u=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw u.name="Invariant Violation",u}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return r.PropTypes=r,r}},8500:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={default:function(){return m},useLinkStatus:function(){return b}};for(var o in n)Object.defineProperty(t,o,{enumerable:!0,get:n[o]});let a=r(6388),i=r(5155),u=a._(r(2115)),s=r(91),l=r(2909),c=r(1172),f=r(857),p=r(127);r(7284);let d=r(4972),h=r(9470),g=r(7565);function y(e){return"string"==typeof e?e:(0,s.formatUrl)(e)}function m(e){var t;let n,o,a,[s,m]=(0,u.useOptimistic)(d.IDLE_LINK_STATUS),b=(0,u.useRef)(null),{href:S,as:P,children:E,prefetch:O=null,passHref:_,replace:T,shallow:C,scroll:I,onClick:j,onMouseEnter:w,onTouchStart:N,legacyBehavior:R=!1,onNavigate:k,ref:x,unstable_dynamicOnHover:L,...U}=e;n=E,R&&("string"==typeof n||"number"==typeof n)&&(n=(0,i.jsx)("a",{children:n}));let $=u.default.useContext(l.AppRouterContext),A=!1!==O,M=!1!==O?null===(t=O)||"auto"===t?g.FetchStrategy.PPR:g.FetchStrategy.Full:g.FetchStrategy.PPR,{href:F,as:D}=u.default.useMemo(()=>{let e=y(S);return{href:e,as:P?y(P):e}},[S,P]);if(R){if(n?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});o=u.default.Children.only(n)}let z=R?o&&"object"==typeof o&&o.ref:x,B=u.default.useCallback(e=>(null!==$&&(b.current=(0,d.mountLinkInstance)(e,F,$,M,A,m)),()=>{b.current&&((0,d.unmountLinkForCurrentNavigation)(b.current),b.current=null),(0,d.unmountPrefetchableInstance)(e)}),[A,F,$,M,m]),K={ref:(0,c.useMergedRef)(B,z),onClick(e){R||"function"!=typeof j||j(e),R&&o.props&&"function"==typeof o.props.onClick&&o.props.onClick(e),!$||e.defaultPrevented||function(e,t,n,o,a,i,s){{let l,{nodeName:c}=e.currentTarget;if("A"===c.toUpperCase()&&((l=e.currentTarget.getAttribute("target"))&&"_self"!==l||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||e.nativeEvent&&2===e.nativeEvent.which)||e.currentTarget.hasAttribute("download"))return;if(!(0,h.isLocalURL)(t)){a&&(e.preventDefault(),location.replace(t));return}if(e.preventDefault(),s){let e=!1;if(s({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:f}=r(156);u.default.startTransition(()=>{f(n||t,a?"replace":"push",i??!0,o.current)})}}(e,F,D,b,T,I,k)},onMouseEnter(e){R||"function"!=typeof w||w(e),R&&o.props&&"function"==typeof o.props.onMouseEnter&&o.props.onMouseEnter(e),$&&A&&(0,d.onNavigationIntent)(e.currentTarget,!0===L)},onTouchStart:function(e){R||"function"!=typeof N||N(e),R&&o.props&&"function"==typeof o.props.onTouchStart&&o.props.onTouchStart(e),$&&A&&(0,d.onNavigationIntent)(e.currentTarget,!0===L)}};return(0,f.isAbsoluteUrl)(D)?K.href=D:R&&!_&&("a"!==o.type||"href"in o.props)||(K.href=(0,p.addBasePath)(D)),a=R?u.default.cloneElement(o,K):(0,i.jsx)("a",{...U,...K,children:n}),(0,i.jsx)(v.Provider,{value:s,children:a})}r(9842);let v=(0,u.createContext)(d.IDLE_LINK_STATUS),b=()=>(0,u.useContext)(v);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},9311:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>o});let n=e=>t=>{try{let r=e(t);if(r instanceof Promise)return r;return{then:e=>n(e)(r),catch(e){return this}}}catch(e){return{then(e){return this},catch:t=>n(t)(e)}}},o=(e,t)=>(r,o,a)=>{let i,u={storage:function(e,t){let r;try{r=e()}catch(e){return}return{getItem:e=>{var t;let n=e=>null===e?null:JSON.parse(e,void 0),o=null!=(t=r.getItem(e))?t:null;return o instanceof Promise?o.then(n):n(o)},setItem:(e,t)=>r.setItem(e,JSON.stringify(t,void 0)),removeItem:e=>r.removeItem(e)}}(()=>window.localStorage),partialize:e=>e,version:0,merge:(e,t)=>({...t,...e}),...t},s=!1,l=0,c=new Set,f=new Set,p=u.storage;if(!p)return e((...e)=>{console.warn(`[zustand persist middleware] Unable to update item '${u.name}', the given storage is currently unavailable.`),r(...e)},o,a);let d=()=>{let e=u.partialize({...o()});return p.setItem(u.name,{state:e,version:u.version})},h=a.setState;a.setState=(e,t)=>(h(e,t),d());let g=e((...e)=>(r(...e),d()),o,a);a.getInitialState=()=>g;let y=()=>{var e,t;if(!p)return;let a=++l;s=!1,c.forEach(e=>{var t;return e(null!=(t=o())?t:g)});let h=(null==(t=u.onRehydrateStorage)?void 0:t.call(u,null!=(e=o())?e:g))||void 0;return n(p.getItem.bind(p))(u.name).then(e=>{if(e)if("number"!=typeof e.version||e.version===u.version)return[!1,e.state];else{if(u.migrate){let t=u.migrate(e.state,e.version);return t instanceof Promise?t.then(e=>[!0,e]):[!0,t]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}return[!1,void 0]}).then(e=>{var t;if(a!==l)return;let[n,s]=e;if(r(i=u.merge(s,null!=(t=o())?t:g),!0),n)return d()}).then(()=>{a===l&&(null==h||h(i,void 0),i=o(),s=!0,f.forEach(e=>e(i)))}).catch(e=>{a===l&&(null==h||h(void 0,e))})};return a.persist={setOptions:e=>{u={...u,...e},e.storage&&(p=e.storage)},clearStorage:()=>{null==p||p.removeItem(u.name)},getOptions:()=>u,rehydrate:()=>y(),hasHydrated:()=>s,onHydrate:e=>(c.add(e),()=>{c.delete(e)}),onFinishHydration:e=>(f.add(e),()=>{f.delete(e)})},u.skipHydration||y(),i||g}},9470:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"isLocalURL",{enumerable:!0,get:function(){return a}});let n=r(857),o=r(8512);function a(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,o.hasBasePath)(r.pathname)}catch(e){return!1}}},9842:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"errorOnce",{enumerable:!0,get:function(){return r}});let r=e=>{}}}]);
@@ -1 +1 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8729],{85:(i,e,n)=>{n.d(e,{A:()=>t});var a=n(1934),o=n(9311),d=n(620);function m(i){let e=document.documentElement,n=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";"dark"===("system"===i?n:i)?e.classList.add("dark"):e.classList.remove("dark")}let t=(0,a.v)((0,o.Zr)((i,e)=>({theme:d.B2.defaultTheme,setTheme:e=>{i({theme:e}),m(e)},toggleTheme:()=>{let n="dark"===e().theme?"light":"dark";i({theme:n}),m(n)},initTheme:()=>{m(e().theme)}}),{name:d.B2.storageKey}))},620:(i,e,n)=>{n.d(e,{Q2:()=>a.Q2,fg:()=>a.fg,vQ:()=>o,MA:()=>a.MA,zN:()=>a.zN,B2:()=>d});var a=n(2679);n(8777);let o={name:"Endpoint Proxy",description:"AI Infrastructure Management",version:"0.2.71"},d={storageKey:"theme",defaultTheme:"system"}},1110:(i,e,n)=>{n.d(e,{ThemeProvider:()=>m});var a=n(5155),o=n(2115),d=n(85);function m({children:i}){let{initTheme:e}=(0,d.A)();return(0,o.useEffect)(()=>{e()},[e]),(0,a.jsx)(a.Fragment,{children:i})}},2679:(i,e,n)=>{n.d(e,{DI:()=>t,IS:()=>a,JH:()=>m,MA:()=>u,Q2:()=>r,fg:()=>d,gb:()=>c,mq:()=>l,wG:()=>s,wb:()=>g,zN:()=>o});let a={iflow:{id:"iflow",alias:"if",name:"iFlow AI",icon:"water_drop",color:"#6366F1"},qwen:{id:"qwen",alias:"qw",name:"Qwen Code",icon:"psychology",color:"#10B981"}},o={claude:{id:"claude",alias:"cc",name:"Claude Code",icon:"smart_toy",color:"#D97757"},antigravity:{id:"antigravity",alias:"ag",name:"Antigravity",icon:"rocket_launch",color:"#F59E0B"},codex:{id:"codex",alias:"cx",name:"OpenAI Codex",icon:"code",color:"#3B82F6"},"gemini-cli":{id:"gemini-cli",alias:"gc",name:"Gemini CLI",icon:"terminal",color:"#4285F4"},github:{id:"github",alias:"gh",name:"GitHub Copilot",icon:"code",color:"#333333"},kiro:{id:"kiro",alias:"kr",name:"Kiro AI",icon:"psychology_alt",color:"#FF6B35"},cursor:{id:"cursor",alias:"cu",name:"Cursor IDE",icon:"edit_note",color:"#00D4AA"}},d={openrouter:{id:"openrouter",alias:"openrouter",name:"OpenRouter",icon:"router",color:"#6366F1",textIcon:"OR",passthroughModels:!0},glm:{id:"glm",alias:"glm",name:"GLM Coding",icon:"code",color:"#2563EB",textIcon:"GL"},kimi:{id:"kimi",alias:"kimi",name:"Kimi Coding",icon:"psychology",color:"#1E3A8A",textIcon:"KM"},minimax:{id:"minimax",alias:"minimax",name:"Minimax Coding",icon:"memory",color:"#7C3AED",textIcon:"MM"},"minimax-cn":{id:"minimax-cn",alias:"minimax-cn",name:"Minimax (China)",icon:"memory",color:"#DC2626",textIcon:"MC"},openai:{id:"openai",alias:"openai",name:"OpenAI",icon:"auto_awesome",color:"#10A37F",textIcon:"OA"},anthropic:{id:"anthropic",alias:"anthropic",name:"Anthropic",icon:"smart_toy",color:"#D97757",textIcon:"AN"},gemini:{id:"gemini",alias:"gemini",name:"Gemini",icon:"diamond",color:"#4285F4",textIcon:"GE"}},m="openai-compatible-",t="anthropic-compatible-";function l(i){return"string"==typeof i&&i.startsWith(m)}function c(i){return"string"==typeof i&&i.startsWith(t)}let r={...a,...o,...d},u={oauth:{id:"oauth",name:"OAuth",icon:"lock"},apikey:{id:"apikey",name:"API Key",icon:"key"}};function s(i){let e=r[i];return e?.alias||i}Object.values(r).reduce((i,e)=>(i[e.alias]=e.id,i),{}),Object.values(r).reduce((i,e)=>(i[e.id]=e.alias,i),{});let g=["antigravity","kiro","github"]},3097:(i,e,n)=>{n.d(e,{KC:()=>d,Xg:()=>o,vq:()=>a});let a={cc:[{id:"claude-opus-4-6",name:"Claude Opus 4.6"},{id:"claude-opus-4-5-20251101",name:"Claude 4.5 Opus"},{id:"claude-sonnet-4-5-20250929",name:"Claude 4.5 Sonnet"},{id:"claude-haiku-4-5-20251001",name:"Claude 4.5 Haiku"}],cx:[{id:"gpt-5.3-codex",name:"GPT 5.3 Codex"},{id:"gpt-5.3-codex-xhigh",name:"GPT 5.3 Codex (xHigh)"},{id:"gpt-5.3-codex-high",name:"GPT 5.3 Codex (High)"},{id:"gpt-5.3-codex-low",name:"GPT 5.3 Codex (Low)"},{id:"gpt-5.3-codex-none",name:"GPT 5.3 Codex (None)"},{id:"gpt-5.1-codex-mini",name:"GPT 5.1 Codex Mini"},{id:"gpt-5.1-codex-mini-high",name:"GPT 5.1 Codex Mini (High)"},{id:"gpt-5.2-codex",name:"GPT 5.2 Codex"},{id:"gpt-5.2",name:"GPT 5.2"},{id:"gpt-5.1-codex-max",name:"GPT 5.1 Codex Max"},{id:"gpt-5.1-codex",name:"GPT 5.1 Codex"},{id:"gpt-5.1",name:"GPT 5.1"},{id:"gpt-5-codex",name:"GPT 5 Codex"},{id:"gpt-5-codex-mini",name:"GPT 5 Codex Mini"}],gc:[{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"gemini-3-pro-preview",name:"Gemini 3 Pro Preview"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"},{id:"gemini-2.5-flash-lite",name:"Gemini 2.5 Flash Lite"}],qw:[{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus"},{id:"qwen3-coder-flash",name:"Qwen3 Coder Flash"},{id:"vision-model",name:"Qwen3 Vision Model"}],if:[{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus"},{id:"kimi-k2",name:"Kimi K2"},{id:"kimi-k2-thinking",name:"Kimi K2 Thinking"},{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"deepseek-r1",name:"DeepSeek R1"},{id:"deepseek-v3.2-chat",name:"DeepSeek V3.2 Chat"},{id:"deepseek-v3.2-reasoner",name:"DeepSeek V3.2 Reasoner"},{id:"minimax-m2.1",name:"MiniMax M2.1"},{id:"glm-4.7",name:"GLM 4.7"}],ag:[{id:"claude-opus-4-6-thinking",name:"Claude Opus 4.6 Thinking"},{id:"claude-opus-4-5-thinking",name:"Claude Opus 4.5 Thinking"},{id:"claude-sonnet-4-5-thinking",name:"Claude Sonnet 4.5 Thinking"},{id:"claude-sonnet-4-5",name:"Claude Sonnet 4.5"},{id:"gemini-3-pro-high",name:"Gemini 3 Pro High"},{id:"gemini-3-pro-low",name:"Gemini 3 Pro Low"},{id:"gemini-3-flash",name:"Gemini 3 Flash"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"}],gh:[{id:"gpt-4.1",name:"GPT-4.1"},{id:"gpt-5",name:"GPT-5"},{id:"gpt-5-mini",name:"GPT-5 Mini"},{id:"gpt-5-codex",name:"GPT-5 Codex"},{id:"gpt-5.1",name:"GPT-5.1"},{id:"gpt-5.1-codex",name:"GPT-5.1 Codex"},{id:"gpt-5.1-codex-mini",name:"GPT-5.1 Codex Mini"},{id:"gpt-5.1-codex-max",name:"GPT-5.1 Codex Max"},{id:"gpt-5.2",name:"GPT-5.2"},{id:"gpt-5.2-codex",name:"GPT-5.2 Codex"},{id:"claude-haiku-4.5",name:"Claude Haiku 4.5"},{id:"claude-opus-4.1",name:"Claude Opus 4.1"},{id:"claude-opus-4-5-20251101",name:"Claude Opus 4.5 (Full ID)"},{id:"claude-sonnet-4",name:"Claude Sonnet 4"},{id:"claude-sonnet-4.5",name:"Claude Sonnet 4.5"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-3-flash",name:"Gemini 3 Flash"},{id:"gemini-3-pro",name:"Gemini 3 Pro"},{id:"grok-code-fast-1",name:"Grok Code Fast 1"},{id:"raptor-mini",name:"Raptor Mini"}],kr:[{id:"claude-sonnet-4.5",name:"Claude Sonnet 4.5"},{id:"claude-haiku-4.5",name:"Claude Haiku 4.5"}],cu:[{id:"default",name:"Auto (Server Picks)"},{id:"claude-4.5-opus-high-thinking",name:"Claude 4.5 Opus High Thinking"},{id:"claude-4.5-opus-high",name:"Claude 4.5 Opus High"},{id:"claude-4.5-sonnet-thinking",name:"Claude 4.5 Sonnet Thinking"},{id:"claude-4.5-sonnet",name:"Claude 4.5 Sonnet"},{id:"claude-4.5-haiku",name:"Claude 4.5 Haiku"},{id:"claude-4.5-opus",name:"Claude 4.5 Opus"},{id:"gpt-5.2-codex",name:"GPT 5.2 Codex"}],openai:[{id:"gpt-4o",name:"GPT-4o"},{id:"gpt-4o-mini",name:"GPT-4o Mini"},{id:"gpt-4-turbo",name:"GPT-4 Turbo"},{id:"o1",name:"O1"},{id:"o1-mini",name:"O1 Mini"}],anthropic:[{id:"claude-sonnet-4-20250514",name:"Claude Sonnet 4"},{id:"claude-opus-4-20250514",name:"Claude Opus 4"},{id:"claude-3-5-sonnet-20241022",name:"Claude 3.5 Sonnet"}],gemini:[{id:"gemini-3-pro-preview",name:"Gemini 3 Pro Preview"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"},{id:"gemini-2.5-flash-lite",name:"Gemini 2.5 Flash Lite"}],openrouter:[{id:"auto",name:"Auto (Best Available)"}],glm:[{id:"glm-4.7",name:"GLM 4.7"},{id:"glm-4.6v",name:"GLM 4.6V (Vision)"}],kimi:[{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"kimi-k2.5-thinking",name:"Kimi K2.5 Thinking"},{id:"kimi-latest",name:"Kimi Latest"}],minimax:[{id:"MiniMax-M2.1",name:"MiniMax M2.1"}]},o={claude:"cc",codex:"cx","gemini-cli":"gc",qwen:"qw",iflow:"if",antigravity:"ag",github:"gh",kiro:"kr",cursor:"cu",openai:"openai",anthropic:"anthropic",gemini:"gemini",openrouter:"openrouter",glm:"glm",kimi:"kimi",minimax:"minimax","minimax-cn":"minimax"};function d(i){return a[o[i]||i]||[]}},8777:(i,e,n)=>{n.d(e,{KC:()=>a.KC,Xg:()=>a.Xg});var a=n(3097);Object.entries(n(2679).Q2).filter(([,i])=>i.passthroughModels).map(([i])=>i),Object.entries(a.vq).flatMap(([i,e])=>e.map(e=>({provider:i,model:e.id,name:e.name})))}}]);
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8729],{85:(i,e,n)=>{n.d(e,{A:()=>t});var a=n(1934),o=n(9311),d=n(620);function m(i){let e=document.documentElement,n=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";"dark"===("system"===i?n:i)?e.classList.add("dark"):e.classList.remove("dark")}let t=(0,a.v)((0,o.Zr)((i,e)=>({theme:d.B2.defaultTheme,setTheme:e=>{i({theme:e}),m(e)},toggleTheme:()=>{let n="dark"===e().theme?"light":"dark";i({theme:n}),m(n)},initTheme:()=>{m(e().theme)}}),{name:d.B2.storageKey}))},620:(i,e,n)=>{n.d(e,{Q2:()=>a.Q2,fg:()=>a.fg,vQ:()=>o,MA:()=>a.MA,zN:()=>a.zN,B2:()=>d});var a=n(2679);n(8777);let o={name:"Endpoint Proxy",description:"AI Infrastructure Management",version:"0.2.72"},d={storageKey:"theme",defaultTheme:"system"}},1110:(i,e,n)=>{n.d(e,{ThemeProvider:()=>m});var a=n(5155),o=n(2115),d=n(85);function m({children:i}){let{initTheme:e}=(0,d.A)();return(0,o.useEffect)(()=>{e()},[e]),(0,a.jsx)(a.Fragment,{children:i})}},2679:(i,e,n)=>{n.d(e,{DI:()=>t,IS:()=>a,JH:()=>m,MA:()=>u,Q2:()=>r,fg:()=>d,gb:()=>c,mq:()=>l,wG:()=>s,wb:()=>g,zN:()=>o});let a={iflow:{id:"iflow",alias:"if",name:"iFlow AI",icon:"water_drop",color:"#6366F1"},qwen:{id:"qwen",alias:"qw",name:"Qwen Code",icon:"psychology",color:"#10B981"}},o={claude:{id:"claude",alias:"cc",name:"Claude Code",icon:"smart_toy",color:"#D97757"},antigravity:{id:"antigravity",alias:"ag",name:"Antigravity",icon:"rocket_launch",color:"#F59E0B"},codex:{id:"codex",alias:"cx",name:"OpenAI Codex",icon:"code",color:"#3B82F6"},"gemini-cli":{id:"gemini-cli",alias:"gc",name:"Gemini CLI",icon:"terminal",color:"#4285F4"},github:{id:"github",alias:"gh",name:"GitHub Copilot",icon:"code",color:"#333333"},kiro:{id:"kiro",alias:"kr",name:"Kiro AI",icon:"psychology_alt",color:"#FF6B35"},cursor:{id:"cursor",alias:"cu",name:"Cursor IDE",icon:"edit_note",color:"#00D4AA"}},d={openrouter:{id:"openrouter",alias:"openrouter",name:"OpenRouter",icon:"router",color:"#6366F1",textIcon:"OR",passthroughModels:!0},glm:{id:"glm",alias:"glm",name:"GLM Coding",icon:"code",color:"#2563EB",textIcon:"GL"},kimi:{id:"kimi",alias:"kimi",name:"Kimi Coding",icon:"psychology",color:"#1E3A8A",textIcon:"KM"},minimax:{id:"minimax",alias:"minimax",name:"Minimax Coding",icon:"memory",color:"#7C3AED",textIcon:"MM"},"minimax-cn":{id:"minimax-cn",alias:"minimax-cn",name:"Minimax (China)",icon:"memory",color:"#DC2626",textIcon:"MC"},openai:{id:"openai",alias:"openai",name:"OpenAI",icon:"auto_awesome",color:"#10A37F",textIcon:"OA"},anthropic:{id:"anthropic",alias:"anthropic",name:"Anthropic",icon:"smart_toy",color:"#D97757",textIcon:"AN"},gemini:{id:"gemini",alias:"gemini",name:"Gemini",icon:"diamond",color:"#4285F4",textIcon:"GE"}},m="openai-compatible-",t="anthropic-compatible-";function l(i){return"string"==typeof i&&i.startsWith(m)}function c(i){return"string"==typeof i&&i.startsWith(t)}let r={...a,...o,...d},u={oauth:{id:"oauth",name:"OAuth",icon:"lock"},apikey:{id:"apikey",name:"API Key",icon:"key"}};function s(i){let e=r[i];return e?.alias||i}Object.values(r).reduce((i,e)=>(i[e.alias]=e.id,i),{}),Object.values(r).reduce((i,e)=>(i[e.id]=e.alias,i),{});let g=["antigravity","kiro","github"]},3097:(i,e,n)=>{n.d(e,{KC:()=>d,Xg:()=>o,vq:()=>a});let a={cc:[{id:"claude-opus-4-6",name:"Claude Opus 4.6"},{id:"claude-opus-4-5-20251101",name:"Claude 4.5 Opus"},{id:"claude-sonnet-4-5-20250929",name:"Claude 4.5 Sonnet"},{id:"claude-haiku-4-5-20251001",name:"Claude 4.5 Haiku"}],cx:[{id:"gpt-5.3-codex",name:"GPT 5.3 Codex"},{id:"gpt-5.3-codex-xhigh",name:"GPT 5.3 Codex (xHigh)"},{id:"gpt-5.3-codex-high",name:"GPT 5.3 Codex (High)"},{id:"gpt-5.3-codex-low",name:"GPT 5.3 Codex (Low)"},{id:"gpt-5.3-codex-none",name:"GPT 5.3 Codex (None)"},{id:"gpt-5.1-codex-mini",name:"GPT 5.1 Codex Mini"},{id:"gpt-5.1-codex-mini-high",name:"GPT 5.1 Codex Mini (High)"},{id:"gpt-5.2-codex",name:"GPT 5.2 Codex"},{id:"gpt-5.2",name:"GPT 5.2"},{id:"gpt-5.1-codex-max",name:"GPT 5.1 Codex Max"},{id:"gpt-5.1-codex",name:"GPT 5.1 Codex"},{id:"gpt-5.1",name:"GPT 5.1"},{id:"gpt-5-codex",name:"GPT 5 Codex"},{id:"gpt-5-codex-mini",name:"GPT 5 Codex Mini"}],gc:[{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"gemini-3-pro-preview",name:"Gemini 3 Pro Preview"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"},{id:"gemini-2.5-flash-lite",name:"Gemini 2.5 Flash Lite"}],qw:[{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus"},{id:"qwen3-coder-flash",name:"Qwen3 Coder Flash"},{id:"vision-model",name:"Qwen3 Vision Model"}],if:[{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus"},{id:"kimi-k2",name:"Kimi K2"},{id:"kimi-k2-thinking",name:"Kimi K2 Thinking"},{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"deepseek-r1",name:"DeepSeek R1"},{id:"deepseek-v3.2-chat",name:"DeepSeek V3.2 Chat"},{id:"deepseek-v3.2-reasoner",name:"DeepSeek V3.2 Reasoner"},{id:"minimax-m2.1",name:"MiniMax M2.1"},{id:"glm-4.7",name:"GLM 4.7"}],ag:[{id:"claude-opus-4-6-thinking",name:"Claude Opus 4.6 Thinking"},{id:"claude-opus-4-5-thinking",name:"Claude Opus 4.5 Thinking"},{id:"claude-sonnet-4-5-thinking",name:"Claude Sonnet 4.5 Thinking"},{id:"claude-sonnet-4-5",name:"Claude Sonnet 4.5"},{id:"gemini-3-pro-high",name:"Gemini 3 Pro High"},{id:"gemini-3-pro-low",name:"Gemini 3 Pro Low"},{id:"gemini-3-flash",name:"Gemini 3 Flash"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"}],gh:[{id:"gpt-4.1",name:"GPT-4.1"},{id:"gpt-5",name:"GPT-5"},{id:"gpt-5-mini",name:"GPT-5 Mini"},{id:"gpt-5-codex",name:"GPT-5 Codex"},{id:"gpt-5.1",name:"GPT-5.1"},{id:"gpt-5.1-codex",name:"GPT-5.1 Codex"},{id:"gpt-5.1-codex-mini",name:"GPT-5.1 Codex Mini"},{id:"gpt-5.1-codex-max",name:"GPT-5.1 Codex Max"},{id:"gpt-5.2",name:"GPT-5.2"},{id:"gpt-5.2-codex",name:"GPT-5.2 Codex"},{id:"claude-haiku-4.5",name:"Claude Haiku 4.5"},{id:"claude-opus-4.1",name:"Claude Opus 4.1"},{id:"claude-opus-4-5-20251101",name:"Claude Opus 4.5 (Full ID)"},{id:"claude-sonnet-4",name:"Claude Sonnet 4"},{id:"claude-sonnet-4.5",name:"Claude Sonnet 4.5"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-3-flash",name:"Gemini 3 Flash"},{id:"gemini-3-pro",name:"Gemini 3 Pro"},{id:"grok-code-fast-1",name:"Grok Code Fast 1"},{id:"raptor-mini",name:"Raptor Mini"}],kr:[{id:"claude-sonnet-4.5",name:"Claude Sonnet 4.5"},{id:"claude-haiku-4.5",name:"Claude Haiku 4.5"}],cu:[{id:"default",name:"Auto (Server Picks)"},{id:"claude-4.5-opus-high-thinking",name:"Claude 4.5 Opus High Thinking"},{id:"claude-4.5-opus-high",name:"Claude 4.5 Opus High"},{id:"claude-4.5-sonnet-thinking",name:"Claude 4.5 Sonnet Thinking"},{id:"claude-4.5-sonnet",name:"Claude 4.5 Sonnet"},{id:"claude-4.5-haiku",name:"Claude 4.5 Haiku"},{id:"claude-4.5-opus",name:"Claude 4.5 Opus"},{id:"gpt-5.2-codex",name:"GPT 5.2 Codex"}],openai:[{id:"gpt-4o",name:"GPT-4o"},{id:"gpt-4o-mini",name:"GPT-4o Mini"},{id:"gpt-4-turbo",name:"GPT-4 Turbo"},{id:"o1",name:"O1"},{id:"o1-mini",name:"O1 Mini"}],anthropic:[{id:"claude-sonnet-4-20250514",name:"Claude Sonnet 4"},{id:"claude-opus-4-20250514",name:"Claude Opus 4"},{id:"claude-3-5-sonnet-20241022",name:"Claude 3.5 Sonnet"}],gemini:[{id:"gemini-3-pro-preview",name:"Gemini 3 Pro Preview"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"},{id:"gemini-2.5-flash-lite",name:"Gemini 2.5 Flash Lite"}],openrouter:[{id:"auto",name:"Auto (Best Available)"}],glm:[{id:"glm-4.7",name:"GLM 4.7"},{id:"glm-4.6v",name:"GLM 4.6V (Vision)"}],kimi:[{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"kimi-k2.5-thinking",name:"Kimi K2.5 Thinking"},{id:"kimi-latest",name:"Kimi Latest"}],minimax:[{id:"MiniMax-M2.1",name:"MiniMax M2.1"}]},o={claude:"cc",codex:"cx","gemini-cli":"gc",qwen:"qw",iflow:"if",antigravity:"ag",github:"gh",kiro:"kr",cursor:"cu",openai:"openai",anthropic:"anthropic",gemini:"gemini",openrouter:"openrouter",glm:"glm",kimi:"kimi",minimax:"minimax","minimax-cn":"minimax"};function d(i){return a[o[i]||i]||[]}},8777:(i,e,n)=>{n.d(e,{KC:()=>a.KC,Xg:()=>a.Xg});var a=n(3097);Object.entries(n(2679).Q2).filter(([,i])=>i.passthroughModels).map(([i])=>i),Object.entries(a.vq).flatMap(([i,e])=>e.map(e=>({provider:i,model:e.id,name:e.name})))}}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6099],{},_=>{_.O(0,[600,3624,8729,5497,1393,8441,3794,7358],()=>_(_.s=3774)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6337],{},_=>{_.O(0,[600,3624,8729,5497,1393,8441,3794,7358],()=>_(_.s=3774)),_N_E=_.O()}]);
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "9router-app",
3
- "version": "0.2.71",
3
+ "version": "0.2.72",
4
4
  "description": "9Router web dashboard",
5
5
  "private": true,
6
6
  "scripts": {
@@ -0,0 +1,44 @@
1
+ const path = require("path");
2
+ const fs = require("fs");
3
+ const os = require("os");
4
+
5
+ const TARGET_HOST = "daily-cloudcode-pa.googleapis.com";
6
+
7
+ /**
8
+ * Generate self-signed SSL certificate using selfsigned (pure JS, no openssl needed)
9
+ */
10
+ async function generateCert() {
11
+ const certDir = path.join(os.homedir(), ".9router", "mitm");
12
+ const keyPath = path.join(certDir, "server.key");
13
+ const certPath = path.join(certDir, "server.crt");
14
+
15
+ if (fs.existsSync(keyPath) && fs.existsSync(certPath)) {
16
+ console.log("✅ SSL certificate already exists");
17
+ return { key: keyPath, cert: certPath };
18
+ }
19
+
20
+ if (!fs.existsSync(certDir)) {
21
+ fs.mkdirSync(certDir, { recursive: true });
22
+ }
23
+
24
+ const selfsigned = require("selfsigned");
25
+ const attrs = [{ name: "commonName", value: TARGET_HOST }];
26
+ const notAfter = new Date();
27
+ notAfter.setFullYear(notAfter.getFullYear() + 1);
28
+ const pems = await selfsigned.generate(attrs, {
29
+ keySize: 2048,
30
+ algorithm: "sha256",
31
+ notAfterDate: notAfter,
32
+ extensions: [
33
+ { name: "subjectAltName", altNames: [{ type: 2, value: TARGET_HOST }] }
34
+ ]
35
+ });
36
+
37
+ fs.writeFileSync(keyPath, pems.private);
38
+ fs.writeFileSync(certPath, pems.cert);
39
+
40
+ console.log(`✅ Generated SSL certificate for ${TARGET_HOST}`);
41
+ return { key: keyPath, cert: certPath };
42
+ }
43
+
44
+ module.exports = { generateCert };
@@ -0,0 +1,136 @@
1
+ const fs = require("fs");
2
+ const crypto = require("crypto");
3
+ const { exec } = require("child_process");
4
+ const { execWithPassword } = require("../dns/dnsConfig.js");
5
+
6
+ const IS_WIN = process.platform === "win32";
7
+
8
+ // Get SHA1 fingerprint from cert file using Node.js crypto
9
+ function getCertFingerprint(certPath) {
10
+ const pem = fs.readFileSync(certPath, "utf-8");
11
+ const der = Buffer.from(pem.replace(/-----[^-]+-----/g, "").replace(/\s/g, ""), "base64");
12
+ return crypto.createHash("sha1").update(der).digest("hex").toUpperCase().match(/.{2}/g).join(":");
13
+ }
14
+
15
+ /**
16
+ * Check if certificate is already installed in system store
17
+ */
18
+ async function checkCertInstalled(certPath) {
19
+ if (IS_WIN) {
20
+ return checkCertInstalledWindows(certPath);
21
+ }
22
+ return checkCertInstalledMac(certPath);
23
+ }
24
+
25
+ function checkCertInstalledMac(certPath) {
26
+ return new Promise((resolve) => {
27
+ try {
28
+ const fingerprint = getCertFingerprint(certPath);
29
+ exec(`security find-certificate -a -Z /Library/Keychains/System.keychain | grep -i "${fingerprint}"`, (error) => {
30
+ resolve(!error);
31
+ });
32
+ } catch {
33
+ resolve(false);
34
+ }
35
+ });
36
+ }
37
+
38
+ function checkCertInstalledWindows(certPath) {
39
+ return new Promise((resolve) => {
40
+ // Check Root store for our cert by subject name
41
+ exec("certutil -store Root daily-cloudcode-pa.googleapis.com", (error) => {
42
+ resolve(!error);
43
+ });
44
+ });
45
+ }
46
+
47
+ /**
48
+ * Install SSL certificate to system trust store
49
+ */
50
+ async function installCert(sudoPassword, certPath) {
51
+ if (!fs.existsSync(certPath)) {
52
+ throw new Error(`Certificate file not found: ${certPath}`);
53
+ }
54
+
55
+ const isInstalled = await checkCertInstalled(certPath);
56
+ if (isInstalled) {
57
+ console.log("✅ Certificate already installed");
58
+ return;
59
+ }
60
+
61
+ if (IS_WIN) {
62
+ await installCertWindows(certPath);
63
+ } else {
64
+ await installCertMac(sudoPassword, certPath);
65
+ }
66
+ }
67
+
68
+ async function installCertMac(sudoPassword, certPath) {
69
+ const command = `security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "${certPath}"`;
70
+ try {
71
+ await execWithPassword(command, sudoPassword);
72
+ console.log(`✅ Installed certificate to system keychain: ${certPath}`);
73
+ } catch (error) {
74
+ const msg = error.message?.includes("canceled") ? "User canceled authorization" : "Certificate install failed";
75
+ throw new Error(msg);
76
+ }
77
+ }
78
+
79
+ async function installCertWindows(certPath) {
80
+ // Use PowerShell elevated to add cert to Root store
81
+ const psCommand = `Start-Process certutil -ArgumentList '-addstore','Root','${certPath.replace(/'/g, "''")}' -Verb RunAs -Wait`;
82
+ return new Promise((resolve, reject) => {
83
+ exec(`powershell -Command "${psCommand}"`, (error) => {
84
+ if (error) {
85
+ reject(new Error(`Failed to install certificate: ${error.message}`));
86
+ } else {
87
+ console.log(`✅ Installed certificate to Windows Root store`);
88
+ resolve();
89
+ }
90
+ });
91
+ });
92
+ }
93
+
94
+ /**
95
+ * Uninstall SSL certificate from system store
96
+ */
97
+ async function uninstallCert(sudoPassword, certPath) {
98
+ const isInstalled = await checkCertInstalled(certPath);
99
+ if (!isInstalled) {
100
+ console.log("Certificate not found in system store");
101
+ return;
102
+ }
103
+
104
+ if (IS_WIN) {
105
+ await uninstallCertWindows();
106
+ } else {
107
+ await uninstallCertMac(sudoPassword, certPath);
108
+ }
109
+ }
110
+
111
+ async function uninstallCertMac(sudoPassword, certPath) {
112
+ const fingerprint = getCertFingerprint(certPath).replace(/:/g, "");
113
+ const command = `security delete-certificate -Z "${fingerprint}" /Library/Keychains/System.keychain`;
114
+ try {
115
+ await execWithPassword(command, sudoPassword);
116
+ console.log("✅ Uninstalled certificate from system keychain");
117
+ } catch (err) {
118
+ throw new Error("Failed to uninstall certificate");
119
+ }
120
+ }
121
+
122
+ async function uninstallCertWindows() {
123
+ const psCommand = `Start-Process certutil -ArgumentList '-delstore','Root','daily-cloudcode-pa.googleapis.com' -Verb RunAs -Wait`;
124
+ return new Promise((resolve, reject) => {
125
+ exec(`powershell -Command "${psCommand}"`, (error) => {
126
+ if (error) {
127
+ reject(new Error(`Failed to uninstall certificate: ${error.message}`));
128
+ } else {
129
+ console.log("✅ Uninstalled certificate from Windows Root store");
130
+ resolve();
131
+ }
132
+ });
133
+ });
134
+ }
135
+
136
+ module.exports = { installCert, uninstallCert, checkCertInstalled };
@@ -0,0 +1,130 @@
1
+ const { exec, spawn } = require("child_process");
2
+ const fs = require("fs");
3
+ const path = require("path");
4
+
5
+ const TARGET_HOST = "daily-cloudcode-pa.googleapis.com";
6
+ const IS_WIN = process.platform === "win32";
7
+ const HOSTS_FILE = IS_WIN
8
+ ? path.join(process.env.SystemRoot || "C:\\Windows", "System32", "drivers", "etc", "hosts")
9
+ : "/etc/hosts";
10
+
11
+ /**
12
+ * Execute command with sudo password via stdin (macOS/Linux only)
13
+ */
14
+ function execWithPassword(command, password) {
15
+ return new Promise((resolve, reject) => {
16
+ const child = spawn("sudo", ["-S", "sh", "-c", command], {
17
+ stdio: ["pipe", "pipe", "pipe"]
18
+ });
19
+
20
+ let stdout = "";
21
+ let stderr = "";
22
+ child.stdout.on("data", (d) => { stdout += d; });
23
+ child.stderr.on("data", (d) => { stderr += d; });
24
+
25
+ child.on("close", (code) => {
26
+ if (code === 0) resolve(stdout);
27
+ else reject(new Error(stderr || `Exit code ${code}`));
28
+ });
29
+
30
+ child.stdin.write(`${password}\n`);
31
+ child.stdin.end();
32
+ });
33
+ }
34
+
35
+ /**
36
+ * Execute elevated command on Windows via PowerShell RunAs
37
+ */
38
+ function execElevatedWindows(command) {
39
+ return new Promise((resolve, reject) => {
40
+ const psCommand = `Start-Process cmd -ArgumentList '/c','${command.replace(/'/g, "''")}' -Verb RunAs -Wait`;
41
+ exec(`powershell -Command "${psCommand}"`, (error, stdout, stderr) => {
42
+ if (error) {
43
+ reject(new Error(`Elevated command failed: ${error.message}\n${stderr}`));
44
+ } else {
45
+ resolve(stdout);
46
+ }
47
+ });
48
+ });
49
+ }
50
+
51
+ /**
52
+ * Check if DNS entry already exists
53
+ */
54
+ function checkDNSEntry() {
55
+ try {
56
+ const hostsContent = fs.readFileSync(HOSTS_FILE, "utf8");
57
+ return hostsContent.includes(TARGET_HOST);
58
+ } catch {
59
+ return false;
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Add DNS entry to hosts file
65
+ */
66
+ async function addDNSEntry(sudoPassword) {
67
+ if (checkDNSEntry()) {
68
+ console.log(`DNS entry for ${TARGET_HOST} already exists`);
69
+ return;
70
+ }
71
+
72
+ const entry = `127.0.0.1 ${TARGET_HOST}`;
73
+
74
+ try {
75
+ if (IS_WIN) {
76
+ // Windows: use elevated echo >> hosts
77
+ await execElevatedWindows(`echo ${entry} >> "${HOSTS_FILE}"`);
78
+ } else {
79
+ await execWithPassword(`echo "${entry}" >> ${HOSTS_FILE}`, sudoPassword);
80
+ }
81
+ // Flush DNS cache
82
+ if (IS_WIN) {
83
+ await execElevatedWindows("ipconfig /flushdns");
84
+ } else {
85
+ await execWithPassword("dscacheutil -flushcache && killall -HUP mDNSResponder", sudoPassword);
86
+ }
87
+ console.log(`✅ Added DNS entry: ${entry}`);
88
+ } catch (error) {
89
+ const msg = error.message?.includes("incorrect password") ? "Wrong sudo password" : "Failed to add DNS entry";
90
+ throw new Error(msg);
91
+ }
92
+ }
93
+
94
+ /**
95
+ * Remove DNS entry from hosts file
96
+ */
97
+ async function removeDNSEntry(sudoPassword) {
98
+ if (!checkDNSEntry()) {
99
+ console.log(`DNS entry for ${TARGET_HOST} does not exist`);
100
+ return;
101
+ }
102
+
103
+ try {
104
+ if (IS_WIN) {
105
+ // Windows: read, filter, write back via elevated PowerShell
106
+ const psScript = `(Get-Content '${HOSTS_FILE}') | Where-Object { $_ -notmatch '${TARGET_HOST}' } | Set-Content '${HOSTS_FILE}'`;
107
+ const psCommand = `Start-Process powershell -ArgumentList '-Command','${psScript.replace(/'/g, "''")}' -Verb RunAs -Wait`;
108
+ await new Promise((resolve, reject) => {
109
+ exec(`powershell -Command "${psCommand}"`, (error) => {
110
+ if (error) reject(new Error(`Failed to remove DNS entry: ${error.message}`));
111
+ else resolve();
112
+ });
113
+ });
114
+ } else {
115
+ await execWithPassword(`sed -i '' '/${TARGET_HOST}/d' ${HOSTS_FILE}`, sudoPassword);
116
+ }
117
+ // Flush DNS cache
118
+ if (IS_WIN) {
119
+ await execElevatedWindows("ipconfig /flushdns");
120
+ } else {
121
+ await execWithPassword("dscacheutil -flushcache && killall -HUP mDNSResponder", sudoPassword);
122
+ }
123
+ console.log(`✅ Removed DNS entry for ${TARGET_HOST}`);
124
+ } catch (error) {
125
+ const msg = error.message?.includes("incorrect password") ? "Wrong sudo password" : "Failed to remove DNS entry";
126
+ throw new Error(msg);
127
+ }
128
+ }
129
+
130
+ module.exports = { addDNSEntry, removeDNSEntry, execWithPassword, checkDNSEntry };