axonrouter 2.0.1 → 2.0.3

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 (415) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/server/app/(dashboard)/dashboard/analytics/page.js.nft.json +1 -1
  5. package/.next/standalone/.next/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  6. package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  7. package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/(dashboard)/dashboard/caveman/page.js.nft.json +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/dashboard/caveman/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  13. package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/dashboard/intelligence/page.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/(dashboard)/dashboard/intelligence/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mcp/page.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mcp/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/page.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/dashboard/morph/page.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/(dashboard)/dashboard/morph/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/(dashboard)/dashboard/opencode/page.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/(dashboard)/dashboard/opencode/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/(dashboard)/dashboard/settings/page.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/(dashboard)/dashboard/settings/pricing/page.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  59. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  60. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  61. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  62. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  63. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  64. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  65. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  67. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  68. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  69. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  70. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  71. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  72. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  73. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  74. package/.next/standalone/.next/server/app/callback/page.js.nft.json +1 -1
  75. package/.next/standalone/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/callback.html +1 -1
  77. package/.next/standalone/.next/server/app/callback.rsc +3 -3
  78. package/.next/standalone/.next/server/app/callback.segments/_full.segment.rsc +3 -3
  79. package/.next/standalone/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  80. package/.next/standalone/.next/server/app/callback.segments/_index.segment.rsc +2 -2
  81. package/.next/standalone/.next/server/app/callback.segments/_tree.segment.rsc +2 -2
  82. package/.next/standalone/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +2 -2
  83. package/.next/standalone/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  84. package/.next/standalone/.next/server/app/dashboard/analytics.html +2 -2
  85. package/.next/standalone/.next/server/app/dashboard/analytics.rsc +6 -6
  86. package/.next/standalone/.next/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +2 -2
  87. package/.next/standalone/.next/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics.segment.rsc +1 -1
  88. package/.next/standalone/.next/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  89. package/.next/standalone/.next/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  90. package/.next/standalone/.next/server/app/dashboard/analytics.segments/_full.segment.rsc +6 -6
  91. package/.next/standalone/.next/server/app/dashboard/analytics.segments/_head.segment.rsc +1 -1
  92. package/.next/standalone/.next/server/app/dashboard/analytics.segments/_index.segment.rsc +3 -3
  93. package/.next/standalone/.next/server/app/dashboard/analytics.segments/_tree.segment.rsc +2 -2
  94. package/.next/standalone/.next/server/app/dashboard/basic-chat.html +2 -2
  95. package/.next/standalone/.next/server/app/dashboard/basic-chat.rsc +6 -6
  96. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  97. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  98. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  99. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  100. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
  101. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  102. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  103. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  104. package/.next/standalone/.next/server/app/dashboard/caveman.html +2 -2
  105. package/.next/standalone/.next/server/app/dashboard/caveman.rsc +6 -6
  106. package/.next/standalone/.next/server/app/dashboard/caveman.segments/!KGRhc2hib2FyZCk/dashboard/caveman/__PAGE__.segment.rsc +2 -2
  107. package/.next/standalone/.next/server/app/dashboard/caveman.segments/!KGRhc2hib2FyZCk/dashboard/caveman.segment.rsc +1 -1
  108. package/.next/standalone/.next/server/app/dashboard/caveman.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  109. package/.next/standalone/.next/server/app/dashboard/caveman.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  110. package/.next/standalone/.next/server/app/dashboard/caveman.segments/_full.segment.rsc +6 -6
  111. package/.next/standalone/.next/server/app/dashboard/caveman.segments/_head.segment.rsc +1 -1
  112. package/.next/standalone/.next/server/app/dashboard/caveman.segments/_index.segment.rsc +3 -3
  113. package/.next/standalone/.next/server/app/dashboard/caveman.segments/_tree.segment.rsc +2 -2
  114. package/.next/standalone/.next/server/app/dashboard/cli-tools.html +2 -2
  115. package/.next/standalone/.next/server/app/dashboard/cli-tools.rsc +7 -7
  116. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  117. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  118. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  119. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  120. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +7 -7
  121. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  122. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  123. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  124. package/.next/standalone/.next/server/app/dashboard/combos.html +2 -2
  125. package/.next/standalone/.next/server/app/dashboard/combos.rsc +6 -6
  126. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  127. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  128. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  129. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  130. package/.next/standalone/.next/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
  131. package/.next/standalone/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  132. package/.next/standalone/.next/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  133. package/.next/standalone/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  134. package/.next/standalone/.next/server/app/dashboard/endpoint.html +1 -1
  135. package/.next/standalone/.next/server/app/dashboard/endpoint.rsc +7 -7
  136. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  137. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  138. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  139. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  140. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +7 -7
  141. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  142. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  143. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  144. package/.next/standalone/.next/server/app/dashboard/intelligence.html +1 -1
  145. package/.next/standalone/.next/server/app/dashboard/intelligence.rsc +5 -5
  146. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/!KGRhc2hib2FyZCk/dashboard/intelligence/__PAGE__.segment.rsc +1 -1
  147. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/!KGRhc2hib2FyZCk/dashboard/intelligence.segment.rsc +1 -1
  148. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  149. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  150. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/_full.segment.rsc +5 -5
  151. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/_head.segment.rsc +1 -1
  152. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/_index.segment.rsc +3 -3
  153. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/_tree.segment.rsc +2 -2
  154. package/.next/standalone/.next/server/app/dashboard/mcp.html +2 -2
  155. package/.next/standalone/.next/server/app/dashboard/mcp.rsc +6 -6
  156. package/.next/standalone/.next/server/app/dashboard/mcp.segments/!KGRhc2hib2FyZCk/dashboard/mcp/__PAGE__.segment.rsc +2 -2
  157. package/.next/standalone/.next/server/app/dashboard/mcp.segments/!KGRhc2hib2FyZCk/dashboard/mcp.segment.rsc +1 -1
  158. package/.next/standalone/.next/server/app/dashboard/mcp.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  159. package/.next/standalone/.next/server/app/dashboard/mcp.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  160. package/.next/standalone/.next/server/app/dashboard/mcp.segments/_full.segment.rsc +6 -6
  161. package/.next/standalone/.next/server/app/dashboard/mcp.segments/_head.segment.rsc +1 -1
  162. package/.next/standalone/.next/server/app/dashboard/mcp.segments/_index.segment.rsc +3 -3
  163. package/.next/standalone/.next/server/app/dashboard/mcp.segments/_tree.segment.rsc +2 -2
  164. package/.next/standalone/.next/server/app/dashboard/media-providers.html +2 -2
  165. package/.next/standalone/.next/server/app/dashboard/media-providers.rsc +6 -6
  166. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/__PAGE__.segment.rsc +2 -2
  167. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  168. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  169. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  170. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/_full.segment.rsc +6 -6
  171. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/_head.segment.rsc +1 -1
  172. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/_index.segment.rsc +3 -3
  173. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/_tree.segment.rsc +2 -2
  174. package/.next/standalone/.next/server/app/dashboard/mitm.html +2 -2
  175. package/.next/standalone/.next/server/app/dashboard/mitm.rsc +6 -6
  176. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  177. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  178. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  179. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  180. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
  181. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  182. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  183. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  184. package/.next/standalone/.next/server/app/dashboard/morph.html +1 -1
  185. package/.next/standalone/.next/server/app/dashboard/morph.rsc +6 -6
  186. package/.next/standalone/.next/server/app/dashboard/morph.segments/!KGRhc2hib2FyZCk/dashboard/morph/__PAGE__.segment.rsc +2 -2
  187. package/.next/standalone/.next/server/app/dashboard/morph.segments/!KGRhc2hib2FyZCk/dashboard/morph.segment.rsc +1 -1
  188. package/.next/standalone/.next/server/app/dashboard/morph.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  189. package/.next/standalone/.next/server/app/dashboard/morph.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  190. package/.next/standalone/.next/server/app/dashboard/morph.segments/_full.segment.rsc +6 -6
  191. package/.next/standalone/.next/server/app/dashboard/morph.segments/_head.segment.rsc +1 -1
  192. package/.next/standalone/.next/server/app/dashboard/morph.segments/_index.segment.rsc +3 -3
  193. package/.next/standalone/.next/server/app/dashboard/morph.segments/_tree.segment.rsc +2 -2
  194. package/.next/standalone/.next/server/app/dashboard/opencode.html +1 -1
  195. package/.next/standalone/.next/server/app/dashboard/opencode.rsc +6 -6
  196. package/.next/standalone/.next/server/app/dashboard/opencode.segments/!KGRhc2hib2FyZCk/dashboard/opencode/__PAGE__.segment.rsc +2 -2
  197. package/.next/standalone/.next/server/app/dashboard/opencode.segments/!KGRhc2hib2FyZCk/dashboard/opencode.segment.rsc +1 -1
  198. package/.next/standalone/.next/server/app/dashboard/opencode.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  199. package/.next/standalone/.next/server/app/dashboard/opencode.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  200. package/.next/standalone/.next/server/app/dashboard/opencode.segments/_full.segment.rsc +6 -6
  201. package/.next/standalone/.next/server/app/dashboard/opencode.segments/_head.segment.rsc +1 -1
  202. package/.next/standalone/.next/server/app/dashboard/opencode.segments/_index.segment.rsc +3 -3
  203. package/.next/standalone/.next/server/app/dashboard/opencode.segments/_tree.segment.rsc +2 -2
  204. package/.next/standalone/.next/server/app/dashboard/profile.html +1 -1
  205. package/.next/standalone/.next/server/app/dashboard/profile.rsc +6 -6
  206. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  207. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  208. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  209. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  210. package/.next/standalone/.next/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  211. package/.next/standalone/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  212. package/.next/standalone/.next/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  213. package/.next/standalone/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  214. package/.next/standalone/.next/server/app/dashboard/providers/new.html +2 -2
  215. package/.next/standalone/.next/server/app/dashboard/providers/new.rsc +6 -6
  216. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  217. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  218. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  219. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  220. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  221. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
  222. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  223. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  224. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  225. package/.next/standalone/.next/server/app/dashboard/providers.html +2 -2
  226. package/.next/standalone/.next/server/app/dashboard/providers.rsc +6 -6
  227. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  228. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  229. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  230. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  231. package/.next/standalone/.next/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
  232. package/.next/standalone/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  233. package/.next/standalone/.next/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  234. package/.next/standalone/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  235. package/.next/standalone/.next/server/app/dashboard/proxy-pools.html +2 -2
  236. package/.next/standalone/.next/server/app/dashboard/proxy-pools.rsc +6 -6
  237. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  238. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  239. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  240. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  241. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
  242. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  243. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  244. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  245. package/.next/standalone/.next/server/app/dashboard/quota.html +2 -2
  246. package/.next/standalone/.next/server/app/dashboard/quota.rsc +6 -6
  247. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +2 -2
  248. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  249. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  250. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  251. package/.next/standalone/.next/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  252. package/.next/standalone/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  253. package/.next/standalone/.next/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  254. package/.next/standalone/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  255. package/.next/standalone/.next/server/app/dashboard/settings/pricing.html +1 -1
  256. package/.next/standalone/.next/server/app/dashboard/settings/pricing.rsc +5 -5
  257. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  258. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing.segment.rsc +1 -1
  259. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings.segment.rsc +1 -1
  260. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  261. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  262. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +5 -5
  263. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  264. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  265. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  266. package/.next/standalone/.next/server/app/dashboard/settings.html +2 -2
  267. package/.next/standalone/.next/server/app/dashboard/settings.rsc +6 -6
  268. package/.next/standalone/.next/server/app/dashboard/settings.segments/!KGRhc2hib2FyZCk/dashboard/settings/__PAGE__.segment.rsc +2 -2
  269. package/.next/standalone/.next/server/app/dashboard/settings.segments/!KGRhc2hib2FyZCk/dashboard/settings.segment.rsc +1 -1
  270. package/.next/standalone/.next/server/app/dashboard/settings.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  271. package/.next/standalone/.next/server/app/dashboard/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  272. package/.next/standalone/.next/server/app/dashboard/settings.segments/_full.segment.rsc +6 -6
  273. package/.next/standalone/.next/server/app/dashboard/settings.segments/_head.segment.rsc +1 -1
  274. package/.next/standalone/.next/server/app/dashboard/settings.segments/_index.segment.rsc +3 -3
  275. package/.next/standalone/.next/server/app/dashboard/settings.segments/_tree.segment.rsc +2 -2
  276. package/.next/standalone/.next/server/app/dashboard/skills.html +2 -2
  277. package/.next/standalone/.next/server/app/dashboard/skills.rsc +6 -6
  278. package/.next/standalone/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  279. package/.next/standalone/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  280. package/.next/standalone/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  281. package/.next/standalone/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  282. package/.next/standalone/.next/server/app/dashboard/skills.segments/_full.segment.rsc +6 -6
  283. package/.next/standalone/.next/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  284. package/.next/standalone/.next/server/app/dashboard/skills.segments/_index.segment.rsc +3 -3
  285. package/.next/standalone/.next/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
  286. package/.next/standalone/.next/server/app/dashboard/translator.html +2 -2
  287. package/.next/standalone/.next/server/app/dashboard/translator.rsc +6 -6
  288. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  289. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  290. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  291. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  292. package/.next/standalone/.next/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
  293. package/.next/standalone/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  294. package/.next/standalone/.next/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  295. package/.next/standalone/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  296. package/.next/standalone/.next/server/app/dashboard/usage.html +1 -1
  297. package/.next/standalone/.next/server/app/dashboard/usage.rsc +6 -6
  298. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  299. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  300. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  301. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  302. package/.next/standalone/.next/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
  303. package/.next/standalone/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  304. package/.next/standalone/.next/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  305. package/.next/standalone/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  306. package/.next/standalone/.next/server/app/dashboard.html +1 -1
  307. package/.next/standalone/.next/server/app/dashboard.rsc +7 -7
  308. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  309. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  310. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  311. package/.next/standalone/.next/server/app/dashboard.segments/_full.segment.rsc +7 -7
  312. package/.next/standalone/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  313. package/.next/standalone/.next/server/app/dashboard.segments/_index.segment.rsc +3 -3
  314. package/.next/standalone/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  315. package/.next/standalone/.next/server/app/index.html +1 -1
  316. package/.next/standalone/.next/server/app/index.rsc +2 -2
  317. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  318. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  319. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  320. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  321. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  322. package/.next/standalone/.next/server/app/landing/page.js.nft.json +1 -1
  323. package/.next/standalone/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  324. package/.next/standalone/.next/server/app/landing.html +1 -1
  325. package/.next/standalone/.next/server/app/landing.rsc +3 -3
  326. package/.next/standalone/.next/server/app/landing.segments/_full.segment.rsc +3 -3
  327. package/.next/standalone/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  328. package/.next/standalone/.next/server/app/landing.segments/_index.segment.rsc +2 -2
  329. package/.next/standalone/.next/server/app/landing.segments/_tree.segment.rsc +2 -2
  330. package/.next/standalone/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
  331. package/.next/standalone/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  332. package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -1
  333. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  334. package/.next/standalone/.next/server/app/login.html +1 -1
  335. package/.next/standalone/.next/server/app/login.rsc +3 -3
  336. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +3 -3
  337. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
  338. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +2 -2
  339. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  340. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  341. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
  342. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  343. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.mzodm._.js +1 -1
  344. package/.next/standalone/.next/server/chunks/[root-of-the-server]__003scm0._.js +1 -1
  345. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01kq~.r._.js +1 -1
  346. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03sw1c3._.js +1 -1
  347. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0brgjhf._.js +1 -1
  348. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0d~p0cq._.js +1 -1
  349. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0h9.ugv._.js +1 -1
  350. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i8ubss._.js +2 -2
  351. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k2~rdk._.js +1 -1
  352. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k6jln3._.js +1 -1
  353. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0m.0h8z._.js +1 -1
  354. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0n~_i6e._.js +1 -1
  355. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o_0bxa._.js +1 -1
  356. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uvu.gs._.js +1 -1
  357. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zbooww._.js +1 -1
  358. package/.next/standalone/.next/server/chunks/_0743~zr._.js +1 -1
  359. package/.next/standalone/.next/server/chunks/_0h~0zar._.js +1 -1
  360. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0k_a0xx.js +1 -1
  361. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0o8sjwu.js +1 -1
  362. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0tqpghm.js +1 -1
  363. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_12p6yih.js +5 -5
  364. package/.next/standalone/.next/server/chunks/ssr/_0-o1.gf._.js +3 -0
  365. package/.next/standalone/.next/server/chunks/ssr/_0-~8uap._.js +1 -1
  366. package/.next/standalone/.next/server/chunks/ssr/{_13vwxhk._.js → _03~l39c._.js} +2 -2
  367. package/.next/standalone/.next/server/chunks/ssr/_04w48i.._.js +3 -0
  368. package/.next/standalone/.next/server/chunks/ssr/_0_hztrw._.js +3 -0
  369. package/.next/standalone/.next/server/chunks/ssr/_0bquxrm._.js +3 -0
  370. package/.next/standalone/.next/server/chunks/ssr/_0k060hw._.js +3 -0
  371. package/.next/standalone/.next/server/chunks/ssr/_0p0d9p4._.js +3 -0
  372. package/.next/standalone/.next/server/chunks/ssr/_0p_8t2a._.js +3 -0
  373. package/.next/standalone/.next/server/chunks/ssr/_0y_u_c_._.js +7 -0
  374. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  375. package/.next/standalone/.next/server/pages/404.html +1 -1
  376. package/.next/standalone/.next/server/pages/500.html +1 -1
  377. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  378. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  379. package/.next/standalone/package-lock.json +2 -2
  380. package/.next/standalone/package.json +1 -1
  381. package/.next/static/chunks/{09zlsx5qsaeuo.js → 00j87-lc_wvtd.js} +1 -1
  382. package/.next/static/chunks/08hgd_~o140~6.js +1 -0
  383. package/.next/static/chunks/093sb5s6tg.d~.js +7 -0
  384. package/.next/static/chunks/0hf--lbch~.di.js +1 -0
  385. package/.next/static/chunks/0o3xjtrgx~i2u.js +1 -0
  386. package/.next/static/chunks/0r_8gbx840jol.js +1 -0
  387. package/.next/static/chunks/{0p8.i3a~t8wt4.js → 0sah4jw77ycqs.js} +1 -1
  388. package/.next/static/chunks/0s~jr3m--sfo2.js +5 -0
  389. package/.next/static/chunks/0woj8_9_5ws~k.css +1 -0
  390. package/.next/static/chunks/0~t7g-h-wdi67.js +1 -0
  391. package/package.json +1 -1
  392. package/scripts/service.js +252 -46
  393. package/scripts/start.js +24 -1
  394. package/src/app/login/page.tsx +39 -314
  395. package/.next/standalone/.next/server/chunks/ssr/_00f6536._.js +0 -3
  396. package/.next/standalone/.next/server/chunks/ssr/_01hq7xj._.js +0 -7
  397. package/.next/standalone/.next/server/chunks/ssr/_0c9x38a._.js +0 -3
  398. package/.next/standalone/.next/server/chunks/ssr/_0fikbv4._.js +0 -3
  399. package/.next/standalone/.next/server/chunks/ssr/_0fk4yvh._.js +0 -3
  400. package/.next/standalone/.next/server/chunks/ssr/_0frtcm3._.js +0 -3
  401. package/.next/standalone/.next/server/chunks/ssr/_0khqaqv._.js +0 -3
  402. package/.next/standalone/.next/server/chunks/ssr/_0x0xx9p._.js +0 -3
  403. package/.next/standalone/.next/server/chunks/ssr/_13u7lt-._.js +0 -3
  404. package/.next/static/chunks/0-6gya.tj0dk7.js +0 -1
  405. package/.next/static/chunks/04quk80rrt07~.js +0 -1
  406. package/.next/static/chunks/0eu47j24g2bzm.js +0 -5
  407. package/.next/static/chunks/0iv_qp-wgtx-_.css +0 -1
  408. package/.next/static/chunks/0jyn0615kxxi1.js +0 -1
  409. package/.next/static/chunks/0peqcn6~om0vp.js +0 -1
  410. package/.next/static/chunks/0vqox~1257tth.js +0 -1
  411. package/.next/static/chunks/0x871_qyqh.y4.js +0 -1
  412. package/.next/static/chunks/15p_plajhlg_e.js +0 -7
  413. /package/.next/static/{j3aSKymfEwDIROggm-txA → Au1OdaeQmL3pUJ_HFlKf3}/_buildManifest.js +0 -0
  414. /package/.next/static/{j3aSKymfEwDIROggm-txA → Au1OdaeQmL3pUJ_HFlKf3}/_clientMiddlewareManifest.js +0 -0
  415. /package/.next/static/{j3aSKymfEwDIROggm-txA → Au1OdaeQmL3pUJ_HFlKf3}/_ssgManifest.js +0 -0
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { execSync } from "node:child_process";
3
+ import { execSync, spawnSync } from "node:child_process";
4
4
  import fs from "node:fs";
5
+ import os from "node:os";
5
6
  import path from "node:path";
6
7
 
7
8
  const SERVICE_NAME = "axonrouter";
@@ -28,6 +29,27 @@ export function requireRoot() {
28
29
  }
29
30
  }
30
31
 
32
+ /**
33
+ * Run a command with sudo if not already root.
34
+ * Prompts for password interactively when needed.
35
+ */
36
+ export function runWithSudo(command, options = {}) {
37
+ if (isRoot()) {
38
+ return execSync(command, { stdio: "inherit", ...options });
39
+ }
40
+ return execSync(`sudo ${command}`, { stdio: "inherit", ...options });
41
+ }
42
+
43
+ /**
44
+ * Run a command with sudo silently (capture output instead of inheriting stdio).
45
+ */
46
+ export function runWithSudoSilent(command, options = {}) {
47
+ if (isRoot()) {
48
+ return execSync(command, { stdio: "pipe", ...options });
49
+ }
50
+ return execSync(`sudo ${command}`, { stdio: "pipe", ...options });
51
+ }
52
+
31
53
  /**
32
54
  * Detect the init system available on this machine.
33
55
  * Returns "systemd" if systemctl exists, otherwise "initd".
@@ -53,10 +75,121 @@ export function getExecPath() {
53
75
  }
54
76
  }
55
77
 
78
+ /**
79
+ * Get the full node binary path for use in service files.
80
+ * systemd does not use the shell to resolve shebangs via env/nvm,
81
+ * so we need the absolute path to node.
82
+ */
83
+ export function getNodePath() {
84
+ return process.execPath;
85
+ }
86
+
87
+ /**
88
+ * Resolve the home directory for a given user.
89
+ * When SUDO_USER is set, tries /etc/passwd lookup, then falls back to /home/<user>.
90
+ * For root, returns /root. Otherwise falls back to os.homedir().
91
+ */
92
+ export function getInstallingUserHome(user) {
93
+ if (user === "root") {
94
+ return "/root";
95
+ }
96
+
97
+ // Try to read from /etc/passwd
98
+ try {
99
+ const passwd = fs.readFileSync("/etc/passwd", "utf-8");
100
+ const lines = passwd.split("\n");
101
+ for (const line of lines) {
102
+ const fields = line.split(":");
103
+ if (fields[0] === user && fields[5]) {
104
+ return fields[5];
105
+ }
106
+ }
107
+ } catch {
108
+ // /etc/passwd not readable, fall through
109
+ }
110
+
111
+ // Fall back to /home/<user> if SUDO_USER is set
112
+ if (process.env.SUDO_USER) {
113
+ return `/home/${user}`;
114
+ }
115
+
116
+ return os.homedir();
117
+ }
118
+
119
+ /**
120
+ * Detect the real (non-root) user who invoked the install command.
121
+ * When run via sudo, reads SUDO_USER and SUDO_GID for the original user.
122
+ * Otherwise uses os.userInfo() for the current user.
123
+ * Returns { user, group, home }.
124
+ */
125
+ export function getInstallingUser() {
126
+ const sudoUser = process.env.SUDO_USER;
127
+
128
+ if (sudoUser) {
129
+ let group = process.env.SUDO_GID || String(os.userInfo().gid);
130
+ // Try to resolve group name from GID via /etc/group
131
+ try {
132
+ const groupFile = fs.readFileSync("/etc/group", "utf-8");
133
+ const lines = groupFile.split("\n");
134
+ for (const line of lines) {
135
+ const fields = line.split(":");
136
+ if (fields[2] === group) {
137
+ group = fields[0];
138
+ break;
139
+ }
140
+ }
141
+ } catch {
142
+ // If we can't resolve the group name, use the username as group
143
+ group = sudoUser;
144
+ }
145
+
146
+ // If group is still numeric (GID didn't resolve), fall back to username
147
+ if (/^\d+$/.test(group)) {
148
+ group = sudoUser;
149
+ }
150
+
151
+ const home = getInstallingUserHome(sudoUser);
152
+ return { user: sudoUser, group, home };
153
+ }
154
+
155
+ const info = os.userInfo();
156
+ const user = info.username;
157
+ let group = String(info.gid);
158
+
159
+ // Try to resolve group name from GID via /etc/group
160
+ try {
161
+ const groupFile = fs.readFileSync("/etc/group", "utf-8");
162
+ const lines = groupFile.split("\n");
163
+ for (const line of lines) {
164
+ const fields = line.split(":");
165
+ if (fields[2] === group) {
166
+ group = fields[0];
167
+ break;
168
+ }
169
+ }
170
+ } catch {
171
+ // Fall back to username as group
172
+ group = user;
173
+ }
174
+
175
+ // If group is still numeric (GID didn't resolve), fall back to username
176
+ if (/^\d+$/.test(group)) {
177
+ group = user;
178
+ }
179
+
180
+ const home = getInstallingUserHome(user);
181
+ return { user, group, home };
182
+ }
183
+
56
184
  /**
57
185
  * Generate systemd unit file content.
186
+ * Uses absolute node path + script path to avoid shebang/PATH issues under systemd.
187
+ * Accepts an optional userInfo parameter to avoid repeated getInstallingUser() calls.
58
188
  */
59
- export function generateSystemdUnit(execPath) {
189
+ export function generateSystemdUnit(execPath, userInfo) {
190
+ const nodePath = getNodePath();
191
+ const { user, group, home } = userInfo || getInstallingUser();
192
+ const workingDirectory = path.resolve(path.dirname(execPath), "..");
60
193
  return `[Unit]
61
194
  Description=AxonRouter AI Router
62
195
  After=network.target
@@ -65,11 +198,15 @@ StartLimitBurst=5
65
198
 
66
199
  [Service]
67
200
  Type=simple
68
- ExecStart=${execPath}
201
+ User=${user}
202
+ Group=${group}
203
+ WorkingDirectory=${workingDirectory}
204
+ ExecStart=${nodePath} ${execPath}
69
205
  Restart=always
70
206
  RestartSec=5
71
207
  Environment=NODE_ENV=production
72
208
  Environment=PORT=${DEFAULT_PORT}
209
+ Environment=HOME=${home}
73
210
  # Graceful shutdown timeout
74
211
  TimeoutStopSec=30
75
212
  # Kill remaining child processes (cloudflared, tailscaled) on stop
@@ -82,8 +219,12 @@ WantedBy=multi-user.target
82
219
 
83
220
  /**
84
221
  * Generate init.d script content (LSB format).
222
+ * Uses absolute node path to avoid PATH issues in init environment.
223
+ * Accepts an optional userInfo parameter to avoid repeated getInstallingUser() calls.
85
224
  */
86
- export function generateInitdScript(execPath) {
225
+ export function generateInitdScript(execPath, userInfo) {
226
+ const nodePath = getNodePath();
227
+ const { user, group, home } = userInfo || getInstallingUser();
87
228
  return `#!/bin/sh
88
229
  ### BEGIN INIT INFO
89
230
  # Provides: ${SERVICE_NAME}
@@ -95,25 +236,29 @@ export function generateInitdScript(execPath) {
95
236
  # Description: AxonRouter AI Router service
96
237
  ### END INIT INFO
97
238
 
239
+ NODE="${nodePath}"
98
240
  DAEMON="${execPath}"
99
241
  PIDFILE="${PID_FILE}"
100
242
  NAME="${SERVICE_NAME}"
101
243
  LOG_FILE="/var/log/${SERVICE_NAME}.log"
244
+ USER="${user}"
245
+ GROUP="${group}"
102
246
  export NODE_ENV=production
103
247
  export PORT=${DEFAULT_PORT}
248
+ export HOME=${home}
104
249
 
105
250
  start() {
106
251
  if [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE")" 2>/dev/null; then
107
252
  echo "$NAME is already running."
108
253
  return 1
109
254
  fi
110
- echo "Starting $NAME..."
255
+ echo "Starting $NAME as user $USER..."
111
256
  # Start with auto-respawn: restart up to 10 times with 5s delay if process exits
112
257
  (
113
258
  RESTART_COUNT=0
114
259
  MAX_RESTARTS=10
115
260
  while [ $RESTART_COUNT -lt $MAX_RESTARTS ]; do
116
- "$DAEMON" >> "$LOG_FILE" 2>&1
261
+ su - "$USER" -c "HOME='${home}' NODE_ENV=production PORT=${DEFAULT_PORT} '${nodePath}' '${execPath}'" >> "$LOG_FILE" 2>&1
117
262
  EXIT_CODE=$?
118
263
  if [ $EXIT_CODE -eq 0 ]; then
119
264
  break
@@ -174,40 +319,57 @@ exit 0
174
319
  * Writes the service file, enables, and starts the service.
175
320
  */
176
321
  export function installService() {
177
- requireRoot();
178
-
179
322
  const initSystem = detectInitSystem();
180
323
  const execPath = getExecPath();
324
+ const { user, group } = getInstallingUser();
181
325
 
182
326
  console.log(`[AxonRouter] Detected init system: ${initSystem}`);
183
327
  console.log(`[AxonRouter] Executable path: ${execPath}`);
328
+ console.log(`[AxonRouter] Service will run as user: ${user} (group: ${group})`);
329
+
330
+ const userInfo = { user, group, home: getInstallingUserHome(user) };
184
331
 
185
332
  if (initSystem === "systemd") {
186
- const unitContent = generateSystemdUnit(execPath);
187
- fs.writeFileSync(SYSTEMD_UNIT_PATH, unitContent, { mode: 0o644 });
333
+ const unitContent = generateSystemdUnit(execPath, userInfo);
334
+ // Write unit file via sudo tee (since we may not be root)
335
+ const child = spawnSync("sudo", ["tee", SYSTEMD_UNIT_PATH], {
336
+ input: unitContent,
337
+ stdio: ["pipe", "pipe", "inherit"],
338
+ });
339
+ if (child.status !== 0) {
340
+ console.error("[AxonRouter] Failed to write service file. Sudo access required.");
341
+ process.exit(1);
342
+ }
188
343
  console.log(`[AxonRouter] Service file written to ${SYSTEMD_UNIT_PATH}`);
189
344
 
190
- execSync("systemctl daemon-reload", { stdio: "inherit" });
191
- execSync(`systemctl enable ${SERVICE_NAME}`, { stdio: "inherit" });
192
- execSync(`systemctl start ${SERVICE_NAME}`, { stdio: "inherit" });
345
+ runWithSudo("systemctl daemon-reload");
346
+ runWithSudo(`systemctl enable ${SERVICE_NAME}`);
347
+ runWithSudo(`systemctl start ${SERVICE_NAME}`);
193
348
  console.log(`[AxonRouter] Service installed, enabled, and started.`);
194
349
  } else {
195
- const scriptContent = generateInitdScript(execPath);
196
- fs.writeFileSync(INITD_SCRIPT_PATH, scriptContent, { mode: 0o755 });
350
+ const scriptContent = generateInitdScript(execPath, userInfo);
351
+ const child = spawnSync("sudo", ["tee", INITD_SCRIPT_PATH], {
352
+ input: scriptContent,
353
+ stdio: ["pipe", "pipe", "inherit"],
354
+ });
355
+ if (child.status !== 0) {
356
+ console.error("[AxonRouter] Failed to write init script. Sudo access required.");
357
+ process.exit(1);
358
+ }
359
+ runWithSudo(`chmod 755 ${INITD_SCRIPT_PATH}`);
197
360
  console.log(`[AxonRouter] Init script written to ${INITD_SCRIPT_PATH}`);
198
361
 
199
362
  try {
200
- execSync(`update-rc.d ${SERVICE_NAME} defaults`, { stdio: "inherit" });
363
+ runWithSudo(`update-rc.d ${SERVICE_NAME} defaults`);
201
364
  } catch {
202
- // Some systems use chkconfig instead
203
365
  try {
204
- execSync(`chkconfig --add ${SERVICE_NAME}`, { stdio: "inherit" });
366
+ runWithSudo(`chkconfig --add ${SERVICE_NAME}`);
205
367
  } catch {
206
- console.warn("[AxonRouter] Warning: Could not enable service at boot. Please enable it manually.");
368
+ console.warn("[AxonRouter] Warning: Could not enable service at boot.");
207
369
  }
208
370
  }
209
371
 
210
- execSync(`${INITD_SCRIPT_PATH} start`, { stdio: "inherit" });
372
+ runWithSudo(`${INITD_SCRIPT_PATH} start`);
211
373
  console.log(`[AxonRouter] Service installed, enabled, and started.`);
212
374
  }
213
375
  }
@@ -216,50 +378,54 @@ export function installService() {
216
378
  * Uninstall the service (stop, disable, remove).
217
379
  */
218
380
  export function uninstallService() {
219
- requireRoot();
220
-
221
381
  const initSystem = detectInitSystem();
222
382
 
223
383
  console.log(`[AxonRouter] Detected init system: ${initSystem}`);
224
384
 
225
385
  if (initSystem === "systemd") {
226
386
  try {
227
- execSync(`systemctl stop ${SERVICE_NAME}`, { stdio: "inherit" });
387
+ runWithSudo(`systemctl stop ${SERVICE_NAME}`);
228
388
  } catch {
229
389
  // Service might not be running
230
390
  }
231
391
  try {
232
- execSync(`systemctl disable ${SERVICE_NAME}`, { stdio: "inherit" });
392
+ runWithSudo(`systemctl disable ${SERVICE_NAME}`);
233
393
  } catch {
234
394
  // Service might not be enabled
235
395
  }
236
- if (fs.existsSync(SYSTEMD_UNIT_PATH)) {
237
- fs.unlinkSync(SYSTEMD_UNIT_PATH);
396
+ try {
397
+ runWithSudo(`rm -f ${SYSTEMD_UNIT_PATH}`);
238
398
  console.log(`[AxonRouter] Removed ${SYSTEMD_UNIT_PATH}`);
399
+ } catch {
400
+ // File might not exist
239
401
  }
240
- execSync("systemctl daemon-reload", { stdio: "inherit" });
402
+ runWithSudo("systemctl daemon-reload");
241
403
  console.log(`[AxonRouter] Service uninstalled.`);
242
404
  } else {
243
405
  try {
244
- execSync(`${INITD_SCRIPT_PATH} stop`, { stdio: "inherit" });
406
+ runWithSudo(`${INITD_SCRIPT_PATH} stop`);
245
407
  } catch {
246
408
  // Service might not be running
247
409
  }
248
410
  try {
249
- execSync(`update-rc.d -f ${SERVICE_NAME} remove`, { stdio: "inherit" });
411
+ runWithSudo(`update-rc.d -f ${SERVICE_NAME} remove`);
250
412
  } catch {
251
413
  try {
252
- execSync(`chkconfig --del ${SERVICE_NAME}`, { stdio: "inherit" });
414
+ runWithSudo(`chkconfig --del ${SERVICE_NAME}`);
253
415
  } catch {
254
416
  // Ignore
255
417
  }
256
418
  }
257
- if (fs.existsSync(INITD_SCRIPT_PATH)) {
258
- fs.unlinkSync(INITD_SCRIPT_PATH);
419
+ try {
420
+ runWithSudo(`rm -f ${INITD_SCRIPT_PATH}`);
259
421
  console.log(`[AxonRouter] Removed ${INITD_SCRIPT_PATH}`);
422
+ } catch {
423
+ // File might not exist
260
424
  }
261
- if (fs.existsSync(PID_FILE)) {
262
- fs.unlinkSync(PID_FILE);
425
+ try {
426
+ runWithSudo(`rm -f ${PID_FILE}`);
427
+ } catch {
428
+ // Ignore
263
429
  }
264
430
  console.log(`[AxonRouter] Service uninstalled.`);
265
431
  }
@@ -310,14 +476,12 @@ export function checkService() {
310
476
  * Start the service.
311
477
  */
312
478
  export function startService() {
313
- requireRoot();
314
-
315
479
  const initSystem = detectInitSystem();
316
480
 
317
481
  if (initSystem === "systemd") {
318
- execSync(`systemctl start ${SERVICE_NAME}`, { stdio: "inherit" });
482
+ runWithSudo(`systemctl start ${SERVICE_NAME}`);
319
483
  } else {
320
- execSync(`${INITD_SCRIPT_PATH} start`, { stdio: "inherit" });
484
+ runWithSudo(`${INITD_SCRIPT_PATH} start`);
321
485
  }
322
486
 
323
487
  console.log(`[AxonRouter] Service started.`);
@@ -327,14 +491,12 @@ export function startService() {
327
491
  * Stop the service.
328
492
  */
329
493
  export function stopService() {
330
- requireRoot();
331
-
332
494
  const initSystem = detectInitSystem();
333
495
 
334
496
  if (initSystem === "systemd") {
335
- execSync(`systemctl stop ${SERVICE_NAME}`, { stdio: "inherit" });
497
+ runWithSudo(`systemctl stop ${SERVICE_NAME}`);
336
498
  } else {
337
- execSync(`${INITD_SCRIPT_PATH} stop`, { stdio: "inherit" });
499
+ runWithSudo(`${INITD_SCRIPT_PATH} stop`);
338
500
  }
339
501
 
340
502
  console.log(`[AxonRouter] Service stopped.`);
@@ -344,19 +506,61 @@ export function stopService() {
344
506
  * Restart the service.
345
507
  */
346
508
  export function restartService() {
347
- requireRoot();
348
-
349
509
  const initSystem = detectInitSystem();
350
510
 
351
511
  if (initSystem === "systemd") {
352
- execSync(`systemctl restart ${SERVICE_NAME}`, { stdio: "inherit" });
512
+ runWithSudo(`systemctl restart ${SERVICE_NAME}`);
353
513
  } else {
354
- execSync(`${INITD_SCRIPT_PATH} restart`, { stdio: "inherit" });
514
+ runWithSudo(`${INITD_SCRIPT_PATH} restart`);
355
515
  }
356
516
 
357
517
  console.log(`[AxonRouter] Service restarted.`);
358
518
  }
359
519
 
520
+ /**
521
+ * Show help message with available commands.
522
+ */
523
+ export function showHelp() {
524
+ let version = "unknown";
525
+ try {
526
+ const pkgUrl = new URL("../package.json", import.meta.url);
527
+ version = JSON.parse(fs.readFileSync(pkgUrl, "utf8")).version;
528
+ } catch {}
529
+
530
+ console.log(`
531
+ \x1b[1mAxonRouter v${version} - AI Router\x1b[0m
532
+
533
+ \x1b[33mUsage:\x1b[0m
534
+ axonrouter <command> [options]
535
+
536
+ \x1b[33mService Commands:\x1b[0m
537
+ install-service Install and start AxonRouter as a system service
538
+ uninstall-service Stop and remove the system service
539
+ check-service Check current service status
540
+ start Start the service
541
+ stop Stop the service
542
+ restart Restart the service
543
+
544
+ \x1b[33mOther Commands:\x1b[0m
545
+ mcp Start MCP stdio server
546
+ help, --help Show this help message
547
+
548
+ \x1b[33mOptions:\x1b[0m
549
+ --port <port> Set the listening port (default: 12711)
550
+ --hostname <host> Set the hostname to bind to
551
+
552
+ \x1b[33mExamples:\x1b[0m
553
+ axonrouter Start in foreground
554
+ axonrouter install-service Install as system service (prompts for sudo)
555
+ axonrouter check-service Check if service is running
556
+ axonrouter --port 3000 Start on custom port
557
+
558
+ \x1b[33mNotes:\x1b[0m
559
+ Service commands will prompt for sudo password if not running as root.
560
+ The service auto-restarts on crash (systemd: always, init.d: up to 10 times).
561
+ `);
562
+ }
563
+
360
564
  /**
361
565
  * Map of command names to handler functions.
362
566
  */
@@ -367,6 +571,8 @@ export const SERVICE_COMMANDS = {
367
571
  "start": startService,
368
572
  "stop": stopService,
369
573
  "restart": restartService,
574
+ "help": showHelp,
575
+ "--help": showHelp,
370
576
  };
371
577
 
372
578
  /**
package/scripts/start.js CHANGED
@@ -10,6 +10,7 @@ import { createRequire } from "node:module";
10
10
 
11
11
  const require = createRequire(import.meta.url);
12
12
  const { defaultPort: DEFAULT_AXONROUTER_PORT } = require("../src/shared/constants/runtimeDefaults.json");
13
+ const { version: APP_VERSION } = require("../package.json");
13
14
 
14
15
  const SERVICE_COMMAND_NAMES = new Set([
15
16
  "install-service",
@@ -18,6 +19,7 @@ const SERVICE_COMMAND_NAMES = new Set([
18
19
  "start",
19
20
  "stop",
20
21
  "restart",
22
+ "help",
21
23
  ]);
22
24
 
23
25
  export function parseArgs(args) {
@@ -94,7 +96,7 @@ function getBaseUrl(port) {
94
96
 
95
97
  function printStartupSummary({ port, hasStandaloneServer, standaloneServerPath }) {
96
98
  const baseUrl = getBaseUrl(port);
97
- console.log(`[Start] AxonRouter starting on port ${port}`);
99
+ console.log(`[Start] AxonRouter v${APP_VERSION} starting on port ${port}`);
98
100
  console.log(`[Start] Dashboard: ${baseUrl}/dashboard`);
99
101
  console.log(`[Start] API: ${baseUrl}/v1`);
100
102
  console.log(
@@ -156,6 +158,18 @@ export async function main() {
156
158
  return;
157
159
  }
158
160
 
161
+ // Check for unrecognized commands
162
+ if (args.forwardArgs.length > 0 && args.forwardArgs[0] !== "mcp") {
163
+ const unknownCmd = args.forwardArgs[0];
164
+ if (!unknownCmd.startsWith("-") && isNaN(Number(unknownCmd))) {
165
+ console.error(`\x1b[31m[AxonRouter] Unknown command: ${unknownCmd}\x1b[0m`);
166
+ console.error("");
167
+ const { showHelp } = await import("./service.js");
168
+ showHelp();
169
+ exit(1);
170
+ }
171
+ }
172
+
159
173
  const standaloneServerPath = resolveStandaloneServerPath(projectRoot);
160
174
  const requestedPort = args.port || process.env.PORT || DEFAULT_AXONROUTER_PORT;
161
175
  const port = normalizePort(requestedPort);
@@ -434,6 +448,15 @@ export function syncStandaloneAssets(projectRoot, standaloneServerPath) {
434
448
  const standalonePublicDir = path.join(standaloneRoot, "public");
435
449
  const standaloneMitmDir = path.join(standaloneRoot, "src", "mitm");
436
450
 
451
+ // Skip sync if we don't have write permission to the standalone directory
452
+ // (e.g. global npm install owned by root, running as non-root user)
453
+ try {
454
+ fs.accessSync(standaloneRoot, fs.constants.W_OK);
455
+ } catch {
456
+ // No write access - assets are already in place from npm publish/install
457
+ return;
458
+ }
459
+
437
460
  if (fs.existsSync(sourceStaticDir)) {
438
461
  fs.mkdirSync(path.dirname(standaloneStaticDir), { recursive: true });
439
462
  fs.rmSync(standaloneStaticDir, { recursive: true, force: true });