axonrouter 2.0.2 → 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 +1 -1
  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/{0-7g8~~9az0a9.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 +127 -7
  393. package/scripts/start.js +23 -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/{olzWK3KCh9LlwHyWUO_bm → Au1OdaeQmL3pUJ_HFlKf3}/_buildManifest.js +0 -0
  414. /package/.next/static/{olzWK3KCh9LlwHyWUO_bm → Au1OdaeQmL3pUJ_HFlKf3}/_clientMiddlewareManifest.js +0 -0
  415. /package/.next/static/{olzWK3KCh9LlwHyWUO_bm → Au1OdaeQmL3pUJ_HFlKf3}/_ssgManifest.js +0 -0
@@ -2,6 +2,7 @@
2
2
 
3
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";
@@ -83,12 +84,112 @@ export function getNodePath() {
83
84
  return process.execPath;
84
85
  }
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
+
86
184
  /**
87
185
  * Generate systemd unit file content.
88
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.
89
188
  */
90
- export function generateSystemdUnit(execPath) {
189
+ export function generateSystemdUnit(execPath, userInfo) {
91
190
  const nodePath = getNodePath();
191
+ const { user, group, home } = userInfo || getInstallingUser();
192
+ const workingDirectory = path.resolve(path.dirname(execPath), "..");
92
193
  return `[Unit]
93
194
  Description=AxonRouter AI Router
94
195
  After=network.target
@@ -97,11 +198,15 @@ StartLimitBurst=5
97
198
 
98
199
  [Service]
99
200
  Type=simple
201
+ User=${user}
202
+ Group=${group}
203
+ WorkingDirectory=${workingDirectory}
100
204
  ExecStart=${nodePath} ${execPath}
101
205
  Restart=always
102
206
  RestartSec=5
103
207
  Environment=NODE_ENV=production
104
208
  Environment=PORT=${DEFAULT_PORT}
209
+ Environment=HOME=${home}
105
210
  # Graceful shutdown timeout
106
211
  TimeoutStopSec=30
107
212
  # Kill remaining child processes (cloudflared, tailscaled) on stop
@@ -115,9 +220,11 @@ WantedBy=multi-user.target
115
220
  /**
116
221
  * Generate init.d script content (LSB format).
117
222
  * Uses absolute node path to avoid PATH issues in init environment.
223
+ * Accepts an optional userInfo parameter to avoid repeated getInstallingUser() calls.
118
224
  */
119
- export function generateInitdScript(execPath) {
225
+ export function generateInitdScript(execPath, userInfo) {
120
226
  const nodePath = getNodePath();
227
+ const { user, group, home } = userInfo || getInstallingUser();
121
228
  return `#!/bin/sh
122
229
  ### BEGIN INIT INFO
123
230
  # Provides: ${SERVICE_NAME}
@@ -134,21 +241,24 @@ DAEMON="${execPath}"
134
241
  PIDFILE="${PID_FILE}"
135
242
  NAME="${SERVICE_NAME}"
136
243
  LOG_FILE="/var/log/${SERVICE_NAME}.log"
244
+ USER="${user}"
245
+ GROUP="${group}"
137
246
  export NODE_ENV=production
138
247
  export PORT=${DEFAULT_PORT}
248
+ export HOME=${home}
139
249
 
140
250
  start() {
141
251
  if [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE")" 2>/dev/null; then
142
252
  echo "$NAME is already running."
143
253
  return 1
144
254
  fi
145
- echo "Starting $NAME..."
255
+ echo "Starting $NAME as user $USER..."
146
256
  # Start with auto-respawn: restart up to 10 times with 5s delay if process exits
147
257
  (
148
258
  RESTART_COUNT=0
149
259
  MAX_RESTARTS=10
150
260
  while [ $RESTART_COUNT -lt $MAX_RESTARTS ]; do
151
- "$NODE" "$DAEMON" >> "$LOG_FILE" 2>&1
261
+ su - "$USER" -c "HOME='${home}' NODE_ENV=production PORT=${DEFAULT_PORT} '${nodePath}' '${execPath}'" >> "$LOG_FILE" 2>&1
152
262
  EXIT_CODE=$?
153
263
  if [ $EXIT_CODE -eq 0 ]; then
154
264
  break
@@ -211,12 +321,16 @@ exit 0
211
321
  export function installService() {
212
322
  const initSystem = detectInitSystem();
213
323
  const execPath = getExecPath();
324
+ const { user, group } = getInstallingUser();
214
325
 
215
326
  console.log(`[AxonRouter] Detected init system: ${initSystem}`);
216
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) };
217
331
 
218
332
  if (initSystem === "systemd") {
219
- const unitContent = generateSystemdUnit(execPath);
333
+ const unitContent = generateSystemdUnit(execPath, userInfo);
220
334
  // Write unit file via sudo tee (since we may not be root)
221
335
  const child = spawnSync("sudo", ["tee", SYSTEMD_UNIT_PATH], {
222
336
  input: unitContent,
@@ -233,7 +347,7 @@ export function installService() {
233
347
  runWithSudo(`systemctl start ${SERVICE_NAME}`);
234
348
  console.log(`[AxonRouter] Service installed, enabled, and started.`);
235
349
  } else {
236
- const scriptContent = generateInitdScript(execPath);
350
+ const scriptContent = generateInitdScript(execPath, userInfo);
237
351
  const child = spawnSync("sudo", ["tee", INITD_SCRIPT_PATH], {
238
352
  input: scriptContent,
239
353
  stdio: ["pipe", "pipe", "inherit"],
@@ -407,8 +521,14 @@ export function restartService() {
407
521
  * Show help message with available commands.
408
522
  */
409
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
+
410
530
  console.log(`
411
- \x1b[1mAxonRouter - AI Router Service Management\x1b[0m
531
+ \x1b[1mAxonRouter v${version} - AI Router\x1b[0m
412
532
 
413
533
  \x1b[33mUsage:\x1b[0m
414
534
  axonrouter <command> [options]
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",
@@ -95,7 +96,7 @@ function getBaseUrl(port) {
95
96
 
96
97
  function printStartupSummary({ port, hasStandaloneServer, standaloneServerPath }) {
97
98
  const baseUrl = getBaseUrl(port);
98
- console.log(`[Start] AxonRouter starting on port ${port}`);
99
+ console.log(`[Start] AxonRouter v${APP_VERSION} starting on port ${port}`);
99
100
  console.log(`[Start] Dashboard: ${baseUrl}/dashboard`);
100
101
  console.log(`[Start] API: ${baseUrl}/v1`);
101
102
  console.log(
@@ -157,6 +158,18 @@ export async function main() {
157
158
  return;
158
159
  }
159
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
+
160
173
  const standaloneServerPath = resolveStandaloneServerPath(projectRoot);
161
174
  const requestedPort = args.port || process.env.PORT || DEFAULT_AXONROUTER_PORT;
162
175
  const port = normalizePort(requestedPort);
@@ -435,6 +448,15 @@ export function syncStandaloneAssets(projectRoot, standaloneServerPath) {
435
448
  const standalonePublicDir = path.join(standaloneRoot, "public");
436
449
  const standaloneMitmDir = path.join(standaloneRoot, "src", "mitm");
437
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
+
438
460
  if (fs.existsSync(sourceStaticDir)) {
439
461
  fs.mkdirSync(path.dirname(standaloneStaticDir), { recursive: true });
440
462
  fs.rmSync(standaloneStaticDir, { recursive: true, force: true });
@@ -3,154 +3,14 @@
3
3
  import { useEffect, useState } from "react";
4
4
  import { useRouter } from "next/navigation";
5
5
  import { useQueryClient } from "@tanstack/react-query";
6
- import {
7
- ArrowRight,
8
- Check,
9
- LockKeyhole,
10
- Server,
11
- Waypoints,
12
- } from "lucide-react";
13
- import { Label as LabelPrimitive } from "radix-ui";
6
+ import { LockKeyhole } from "lucide-react";
7
+ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
8
+ import { Button } from "@/components/ui/button";
9
+ import { Input } from "@/components/ui/input";
10
+ import { Label } from "@/components/ui/label";
14
11
  import { translate } from "@/i18n/runtime";
15
12
  import { fetchJson, queryKeys } from "@/shared/query";
16
13
 
17
- const accessPoints = [
18
- { label: "Router", value: "127.0.0.1", icon: Server },
19
- { label: "Policy", value: "password auth", icon: LockKeyhole },
20
- { label: "Routes", value: "guarded", icon: Waypoints },
21
- ];
22
-
23
- const trustChecks = [
24
- "Keys stay local",
25
- "Routing rules stay private",
26
- "Telemetry hydrates after login",
27
- ];
28
-
29
- const shell = {
30
- page: {
31
- minHeight: "100dvh",
32
- display: "grid",
33
- gridTemplateColumns: "minmax(0, 1.18fr) minmax(360px, 520px)",
34
- background: "#09090b",
35
- color: "#fafafa",
36
- fontFamily:
37
- "ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
38
- },
39
- left: {
40
- minHeight: "100dvh",
41
- padding: "56px",
42
- display: "flex",
43
- flexDirection: "column" as const,
44
- justifyContent: "space-between",
45
- gap: "48px",
46
- borderRight: "1px solid rgba(255,255,255,0.08)",
47
- background:
48
- "radial-gradient(circle at 20% 20%, rgba(236,72,153,0.16), transparent 30rem), linear-gradient(135deg, #18181b 0%, #09090b 70%)",
49
- },
50
- right: {
51
- minHeight: "100dvh",
52
- display: "grid",
53
- placeItems: "center",
54
- padding: "32px",
55
- background: "#111113",
56
- },
57
- header: {
58
- display: "flex",
59
- alignItems: "center",
60
- gap: "12px",
61
- },
62
- iconBox: {
63
- width: "42px",
64
- height: "42px",
65
- display: "grid",
66
- placeItems: "center",
67
- borderRadius: "14px",
68
- border: "1px solid rgba(255,255,255,0.14)",
69
- background: "rgba(255,255,255,0.06)",
70
- color: "#f5f5f5",
71
- },
72
- badge: {
73
- marginLeft: "auto",
74
- borderRadius: "999px",
75
- border: "1px solid rgba(236,72,153,0.32)",
76
- background: "rgba(236,72,153,0.12)",
77
- padding: "6px 10px",
78
- fontSize: "12px",
79
- fontWeight: 800,
80
- color: "#f9a8d4",
81
- },
82
- eyebrow: {
83
- margin: "0 0 14px",
84
- fontSize: "12px",
85
- fontWeight: 850,
86
- letterSpacing: "0.18em",
87
- textTransform: "uppercase" as const,
88
- color: "#a1a1aa",
89
- },
90
- title: {
91
- margin: 0,
92
- maxWidth: "11ch",
93
- fontSize: "clamp(52px, 8vw, 104px)",
94
- lineHeight: 0.88,
95
- letterSpacing: "-0.08em",
96
- fontWeight: 900,
97
- },
98
- subtitle: {
99
- margin: "26px 0 0",
100
- maxWidth: "680px",
101
- fontSize: "17px",
102
- lineHeight: 1.75,
103
- color: "#d4d4d8",
104
- },
105
- accessGrid: {
106
- display: "grid",
107
- gridTemplateColumns: "repeat(3, minmax(0, 1fr))",
108
- gap: "12px",
109
- },
110
- statCard: {
111
- borderRadius: "20px",
112
- border: "1px solid rgba(255,255,255,0.1)",
113
- background: "rgba(255,255,255,0.055)",
114
- padding: "18px",
115
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.06)",
116
- },
117
- authCard: {
118
- width: "100%",
119
- maxWidth: "420px",
120
- borderRadius: "26px",
121
- border: "1px solid rgba(255,255,255,0.12)",
122
- background: "#18181b",
123
- padding: "28px",
124
- boxShadow: "0 28px 90px rgba(0,0,0,0.48)",
125
- },
126
- input: {
127
- width: "100%",
128
- boxSizing: "border-box" as const,
129
- borderRadius: "15px",
130
- border: "1px solid rgba(255,255,255,0.14)",
131
- background: "#09090b",
132
- color: "#fafafa",
133
- padding: "15px 16px",
134
- fontSize: "16px",
135
- outline: "none",
136
- },
137
- button: {
138
- width: "100%",
139
- minHeight: "54px",
140
- display: "inline-flex",
141
- alignItems: "center",
142
- justifyContent: "center",
143
- gap: "10px",
144
- borderRadius: "15px",
145
- border: "0",
146
- background: "#fafafa",
147
- color: "#09090b",
148
- fontSize: "15px",
149
- fontWeight: 850,
150
- cursor: "pointer",
151
- },
152
- };
153
-
154
14
  export default function LoginPage() {
155
15
  const [password, setPassword] = useState("");
156
16
  const [error, setError] = useState("");
@@ -217,124 +77,31 @@ export default function LoginPage() {
217
77
 
218
78
  if (hasPassword === null) {
219
79
  return (
220
- <main style={shell.right}>
221
- <section style={shell.authCard} aria-live="polite">
222
- <LockKeyhole size={26} aria-hidden="true" />
223
- <p style={{ margin: "16px 0 0", color: "#d4d4d8" }}>
224
- {translate("Loading...")}
225
- </p>
226
- </section>
80
+ <main className="min-h-dvh bg-background flex items-center justify-center p-4">
81
+ <Card className="w-full max-w-sm">
82
+ <CardContent className="flex items-center gap-3 py-6">
83
+ <LockKeyhole size={20} className="text-muted-foreground" aria-hidden="true" />
84
+ <p className="text-muted-foreground text-sm">{translate("Loading...")}</p>
85
+ </CardContent>
86
+ </Card>
227
87
  </main>
228
88
  );
229
89
  }
230
90
 
231
91
  return (
232
- <main style={shell.page}>
233
- <section style={shell.left}>
234
- <header style={shell.header}>
235
- <div style={shell.iconBox}>
236
- <LockKeyhole size={20} aria-hidden="true" />
237
- </div>
238
- <div>
239
- <p style={{ margin: 0, fontWeight: 850 }}>AxonRouter</p>
240
- <p
241
- style={{ margin: "2px 0 0", color: "#a1a1aa", fontSize: "13px" }}
242
- >
243
- provider routing control
244
- </p>
245
- </div>
246
- <span style={shell.badge}>auth.required</span>
247
- </header>
248
-
249
- <div>
250
- <p style={shell.eyebrow}>secure dashboard access</p>
251
- <h1 style={shell.title}>Route AI requests.</h1>
252
- <p style={shell.subtitle}>
253
- {hasPassword
254
- ? `${translate("Enter your password to access the dashboard")}. Provider keys, routing policy, and telemetry unlock only after local verification.`
255
- : "First-run password is 12345677. Sign in, then change it immediately in Settings -> Security."}
256
- </p>
257
- </div>
258
-
259
- <div style={shell.accessGrid}>
260
- {accessPoints.map((item) => {
261
- const Icon = item.icon;
262
- return (
263
- <article key={item.label} style={shell.statCard}>
264
- <div
265
- style={{
266
- display: "flex",
267
- alignItems: "center",
268
- justifyContent: "space-between",
269
- color: "#a1a1aa",
270
- fontSize: "12px",
271
- fontWeight: 850,
272
- textTransform: "uppercase",
273
- letterSpacing: "0.14em",
274
- }}
275
- >
276
- <span>{item.label}</span>
277
- <Icon size={16} aria-hidden="true" />
278
- </div>
279
- <p
280
- style={{
281
- margin: "20px 0 0",
282
- fontSize: "18px",
283
- fontWeight: 850,
284
- }}
285
- >
286
- {item.value}
287
- </p>
288
- </article>
289
- );
290
- })}
291
- </div>
292
- </section>
293
-
294
- <section style={shell.right} aria-labelledby="login-title">
295
- <div style={shell.authCard}>
296
- <div
297
- style={{
298
- display: "flex",
299
- alignItems: "start",
300
- justifyContent: "space-between",
301
- gap: "16px",
302
- }}
303
- >
304
- <div>
305
- <p style={shell.eyebrow}>control plane</p>
306
- <h2
307
- id="login-title"
308
- style={{
309
- margin: 0,
310
- fontSize: "34px",
311
- lineHeight: 1,
312
- letterSpacing: "-0.045em",
313
- }}
314
- >
315
- Login
316
- </h2>
317
- </div>
318
- <span style={{ ...shell.iconBox, fontWeight: 900 }}>RR</span>
319
- </div>
320
-
321
- <form
322
- onSubmit={handleLogin}
323
- style={{ marginTop: "32px", display: "grid", gap: "16px" }}
324
- >
325
- <div>
326
- <LabelPrimitive.Root
327
- htmlFor="password"
328
- style={{
329
- display: "block",
330
- marginBottom: "8px",
331
- fontSize: "14px",
332
- fontWeight: 850,
333
- }}
334
- >
335
- {translate("Password")}
336
- </LabelPrimitive.Root>
337
- <input
92
+ <main className="min-h-dvh bg-background flex items-center justify-center p-4">
93
+ <Card className="w-full max-w-sm">
94
+ <CardHeader>
95
+ <CardTitle className="flex items-center gap-2">
96
+ <LockKeyhole size={18} className="text-muted-foreground" aria-hidden="true" />
97
+ <span className="font-bold">AxonRouter</span>
98
+ </CardTitle>
99
+ </CardHeader>
100
+ <CardContent>
101
+ <form onSubmit={handleLogin} className="grid gap-4">
102
+ <div className="grid gap-2">
103
+ <Label htmlFor="password">{translate("Password")}</Label>
104
+ <Input
338
105
  id="password"
339
106
  type="password"
340
107
  placeholder={translate("Enter password")}
@@ -344,70 +111,28 @@ export default function LoginPage() {
344
111
  autoFocus
345
112
  aria-invalid={!!error}
346
113
  autoComplete="current-password"
347
- style={shell.input}
348
114
  />
349
- <p
350
- style={{
351
- margin: "10px 0 0",
352
- color: error ? "#fca5a5" : "#a1a1aa",
353
- fontSize: "13px",
354
- }}
355
- >
356
- {error ||
357
- (hasPassword
358
- ? "Use your configured management password."
359
- : "Use default password 12345677, then change it in Settings -> Security.")}
360
- </p>
361
115
  </div>
362
116
 
363
117
  {error && (
364
- <div
365
- role="alert"
366
- style={{
367
- borderRadius: "15px",
368
- border: "1px solid rgba(248,113,113,0.28)",
369
- background: "rgba(127,29,29,0.28)",
370
- padding: "12px 14px",
371
- color: "#fecaca",
372
- }}
373
- >
374
- <strong>{translate("Invalid password")}</strong>
375
- <p style={{ margin: "4px 0 0" }}>{error}</p>
376
- </div>
118
+ <p className="text-destructive text-sm" role="alert">
119
+ {error}
120
+ </p>
377
121
  )}
378
122
 
379
- <button
380
- type="submit"
381
- disabled={loading}
382
- style={{ ...shell.button, opacity: loading ? 0.72 : 1 }}
383
- >
384
- <LockKeyhole size={18} aria-hidden="true" />
385
- <span>
386
- {loading ? "Checking password..." : translate("Login")}
387
- </span>
388
- {!loading && <ArrowRight size={18} aria-hidden="true" />}
389
- </button>
123
+ <Button type="submit" size="lg" loading={loading} className="w-full">
124
+ <LockKeyhole size={16} aria-hidden="true" />
125
+ <span>{translate("Login")}</span>
126
+ </Button>
390
127
  </form>
391
128
 
392
- <div style={{ marginTop: "28px", display: "grid", gap: "10px" }}>
393
- {trustChecks.map((item) => (
394
- <div
395
- key={item}
396
- style={{
397
- display: "flex",
398
- alignItems: "center",
399
- gap: "8px",
400
- color: "#d4d4d8",
401
- fontSize: "14px",
402
- }}
403
- >
404
- <Check size={16} aria-hidden="true" />
405
- <span>{item}</span>
406
- </div>
407
- ))}
408
- </div>
409
- </div>
410
- </section>
129
+ {hasPassword === false && (
130
+ <p className="mt-4 text-muted-foreground text-sm">
131
+ Default password: 12345677. Change it in Settings after login.
132
+ </p>
133
+ )}
134
+ </CardContent>
135
+ </Card>
411
136
  </main>
412
137
  );
413
138
  }