axonrouter 2.0.3 → 2.0.4

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 (347) 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_client-reference-manifest.js +1 -1
  5. package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  6. package/.next/standalone/.next/server/app/(dashboard)/dashboard/caveman/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/dashboard/intelligence/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mcp/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/(dashboard)/dashboard/morph/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/dashboard/opencode/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  32. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  33. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  34. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  35. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  36. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  37. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  38. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  39. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  40. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  41. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  42. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  43. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  44. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  45. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  46. package/.next/standalone/.next/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/callback.html +1 -1
  48. package/.next/standalone/.next/server/app/callback.rsc +1 -1
  49. package/.next/standalone/.next/server/app/callback.segments/_full.segment.rsc +1 -1
  50. package/.next/standalone/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  51. package/.next/standalone/.next/server/app/callback.segments/_index.segment.rsc +1 -1
  52. package/.next/standalone/.next/server/app/callback.segments/_tree.segment.rsc +1 -1
  53. package/.next/standalone/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  54. package/.next/standalone/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  55. package/.next/standalone/.next/server/app/dashboard/analytics.html +2 -2
  56. package/.next/standalone/.next/server/app/dashboard/analytics.rsc +4 -4
  57. package/.next/standalone/.next/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +2 -2
  58. package/.next/standalone/.next/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics.segment.rsc +1 -1
  59. package/.next/standalone/.next/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  60. package/.next/standalone/.next/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  61. package/.next/standalone/.next/server/app/dashboard/analytics.segments/_full.segment.rsc +4 -4
  62. package/.next/standalone/.next/server/app/dashboard/analytics.segments/_head.segment.rsc +1 -1
  63. package/.next/standalone/.next/server/app/dashboard/analytics.segments/_index.segment.rsc +2 -2
  64. package/.next/standalone/.next/server/app/dashboard/analytics.segments/_tree.segment.rsc +1 -1
  65. package/.next/standalone/.next/server/app/dashboard/basic-chat.html +2 -2
  66. package/.next/standalone/.next/server/app/dashboard/basic-chat.rsc +4 -4
  67. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  68. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  69. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  70. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  71. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +4 -4
  72. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  73. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +2 -2
  74. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  75. package/.next/standalone/.next/server/app/dashboard/caveman.html +2 -2
  76. package/.next/standalone/.next/server/app/dashboard/caveman.rsc +4 -4
  77. package/.next/standalone/.next/server/app/dashboard/caveman.segments/!KGRhc2hib2FyZCk/dashboard/caveman/__PAGE__.segment.rsc +2 -2
  78. package/.next/standalone/.next/server/app/dashboard/caveman.segments/!KGRhc2hib2FyZCk/dashboard/caveman.segment.rsc +1 -1
  79. package/.next/standalone/.next/server/app/dashboard/caveman.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  80. package/.next/standalone/.next/server/app/dashboard/caveman.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  81. package/.next/standalone/.next/server/app/dashboard/caveman.segments/_full.segment.rsc +4 -4
  82. package/.next/standalone/.next/server/app/dashboard/caveman.segments/_head.segment.rsc +1 -1
  83. package/.next/standalone/.next/server/app/dashboard/caveman.segments/_index.segment.rsc +2 -2
  84. package/.next/standalone/.next/server/app/dashboard/caveman.segments/_tree.segment.rsc +1 -1
  85. package/.next/standalone/.next/server/app/dashboard/cli-tools.html +2 -2
  86. package/.next/standalone/.next/server/app/dashboard/cli-tools.rsc +4 -4
  87. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  88. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  89. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  90. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  91. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +4 -4
  92. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  93. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +2 -2
  94. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  95. package/.next/standalone/.next/server/app/dashboard/combos.html +2 -2
  96. package/.next/standalone/.next/server/app/dashboard/combos.rsc +4 -4
  97. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  98. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  99. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  100. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  101. package/.next/standalone/.next/server/app/dashboard/combos.segments/_full.segment.rsc +4 -4
  102. package/.next/standalone/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  103. package/.next/standalone/.next/server/app/dashboard/combos.segments/_index.segment.rsc +2 -2
  104. package/.next/standalone/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  105. package/.next/standalone/.next/server/app/dashboard/endpoint.html +1 -1
  106. package/.next/standalone/.next/server/app/dashboard/endpoint.rsc +4 -4
  107. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  108. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  109. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  110. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  111. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +4 -4
  112. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  113. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +2 -2
  114. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  115. package/.next/standalone/.next/server/app/dashboard/intelligence.html +1 -1
  116. package/.next/standalone/.next/server/app/dashboard/intelligence.rsc +3 -3
  117. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/!KGRhc2hib2FyZCk/dashboard/intelligence/__PAGE__.segment.rsc +1 -1
  118. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/!KGRhc2hib2FyZCk/dashboard/intelligence.segment.rsc +1 -1
  119. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  120. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  121. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/_full.segment.rsc +3 -3
  122. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/_head.segment.rsc +1 -1
  123. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/_index.segment.rsc +2 -2
  124. package/.next/standalone/.next/server/app/dashboard/intelligence.segments/_tree.segment.rsc +1 -1
  125. package/.next/standalone/.next/server/app/dashboard/mcp.html +2 -2
  126. package/.next/standalone/.next/server/app/dashboard/mcp.rsc +4 -4
  127. package/.next/standalone/.next/server/app/dashboard/mcp.segments/!KGRhc2hib2FyZCk/dashboard/mcp/__PAGE__.segment.rsc +2 -2
  128. package/.next/standalone/.next/server/app/dashboard/mcp.segments/!KGRhc2hib2FyZCk/dashboard/mcp.segment.rsc +1 -1
  129. package/.next/standalone/.next/server/app/dashboard/mcp.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  130. package/.next/standalone/.next/server/app/dashboard/mcp.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  131. package/.next/standalone/.next/server/app/dashboard/mcp.segments/_full.segment.rsc +4 -4
  132. package/.next/standalone/.next/server/app/dashboard/mcp.segments/_head.segment.rsc +1 -1
  133. package/.next/standalone/.next/server/app/dashboard/mcp.segments/_index.segment.rsc +2 -2
  134. package/.next/standalone/.next/server/app/dashboard/mcp.segments/_tree.segment.rsc +1 -1
  135. package/.next/standalone/.next/server/app/dashboard/media-providers.html +2 -2
  136. package/.next/standalone/.next/server/app/dashboard/media-providers.rsc +4 -4
  137. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/__PAGE__.segment.rsc +2 -2
  138. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  139. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  140. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  141. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/_full.segment.rsc +4 -4
  142. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/_head.segment.rsc +1 -1
  143. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/_index.segment.rsc +2 -2
  144. package/.next/standalone/.next/server/app/dashboard/media-providers.segments/_tree.segment.rsc +1 -1
  145. package/.next/standalone/.next/server/app/dashboard/mitm.html +2 -2
  146. package/.next/standalone/.next/server/app/dashboard/mitm.rsc +4 -4
  147. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  148. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  149. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  150. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  151. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +4 -4
  152. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  153. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +2 -2
  154. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  155. package/.next/standalone/.next/server/app/dashboard/morph.html +1 -1
  156. package/.next/standalone/.next/server/app/dashboard/morph.rsc +4 -4
  157. package/.next/standalone/.next/server/app/dashboard/morph.segments/!KGRhc2hib2FyZCk/dashboard/morph/__PAGE__.segment.rsc +2 -2
  158. package/.next/standalone/.next/server/app/dashboard/morph.segments/!KGRhc2hib2FyZCk/dashboard/morph.segment.rsc +1 -1
  159. package/.next/standalone/.next/server/app/dashboard/morph.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  160. package/.next/standalone/.next/server/app/dashboard/morph.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  161. package/.next/standalone/.next/server/app/dashboard/morph.segments/_full.segment.rsc +4 -4
  162. package/.next/standalone/.next/server/app/dashboard/morph.segments/_head.segment.rsc +1 -1
  163. package/.next/standalone/.next/server/app/dashboard/morph.segments/_index.segment.rsc +2 -2
  164. package/.next/standalone/.next/server/app/dashboard/morph.segments/_tree.segment.rsc +1 -1
  165. package/.next/standalone/.next/server/app/dashboard/opencode.html +1 -1
  166. package/.next/standalone/.next/server/app/dashboard/opencode.rsc +4 -4
  167. package/.next/standalone/.next/server/app/dashboard/opencode.segments/!KGRhc2hib2FyZCk/dashboard/opencode/__PAGE__.segment.rsc +2 -2
  168. package/.next/standalone/.next/server/app/dashboard/opencode.segments/!KGRhc2hib2FyZCk/dashboard/opencode.segment.rsc +1 -1
  169. package/.next/standalone/.next/server/app/dashboard/opencode.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  170. package/.next/standalone/.next/server/app/dashboard/opencode.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  171. package/.next/standalone/.next/server/app/dashboard/opencode.segments/_full.segment.rsc +4 -4
  172. package/.next/standalone/.next/server/app/dashboard/opencode.segments/_head.segment.rsc +1 -1
  173. package/.next/standalone/.next/server/app/dashboard/opencode.segments/_index.segment.rsc +2 -2
  174. package/.next/standalone/.next/server/app/dashboard/opencode.segments/_tree.segment.rsc +1 -1
  175. package/.next/standalone/.next/server/app/dashboard/profile.html +1 -1
  176. package/.next/standalone/.next/server/app/dashboard/profile.rsc +4 -4
  177. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  178. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  179. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  180. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  181. package/.next/standalone/.next/server/app/dashboard/profile.segments/_full.segment.rsc +4 -4
  182. package/.next/standalone/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  183. package/.next/standalone/.next/server/app/dashboard/profile.segments/_index.segment.rsc +2 -2
  184. package/.next/standalone/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  185. package/.next/standalone/.next/server/app/dashboard/providers/new.html +2 -2
  186. package/.next/standalone/.next/server/app/dashboard/providers/new.rsc +4 -4
  187. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  188. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  189. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  190. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  191. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  192. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +4 -4
  193. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  194. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +2 -2
  195. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  196. package/.next/standalone/.next/server/app/dashboard/providers.html +2 -2
  197. package/.next/standalone/.next/server/app/dashboard/providers.rsc +4 -4
  198. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  199. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  200. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  201. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  202. package/.next/standalone/.next/server/app/dashboard/providers.segments/_full.segment.rsc +4 -4
  203. package/.next/standalone/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  204. package/.next/standalone/.next/server/app/dashboard/providers.segments/_index.segment.rsc +2 -2
  205. package/.next/standalone/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  206. package/.next/standalone/.next/server/app/dashboard/proxy-pools.html +2 -2
  207. package/.next/standalone/.next/server/app/dashboard/proxy-pools.rsc +4 -4
  208. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  209. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  210. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  211. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  212. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +4 -4
  213. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  214. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +2 -2
  215. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  216. package/.next/standalone/.next/server/app/dashboard/quota.html +2 -2
  217. package/.next/standalone/.next/server/app/dashboard/quota.rsc +4 -4
  218. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +2 -2
  219. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  220. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  221. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  222. package/.next/standalone/.next/server/app/dashboard/quota.segments/_full.segment.rsc +4 -4
  223. package/.next/standalone/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  224. package/.next/standalone/.next/server/app/dashboard/quota.segments/_index.segment.rsc +2 -2
  225. package/.next/standalone/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  226. package/.next/standalone/.next/server/app/dashboard/settings/pricing.html +1 -1
  227. package/.next/standalone/.next/server/app/dashboard/settings/pricing.rsc +3 -3
  228. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  229. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing.segment.rsc +1 -1
  230. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings.segment.rsc +1 -1
  231. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  232. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  233. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  234. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  235. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +2 -2
  236. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  237. package/.next/standalone/.next/server/app/dashboard/settings.html +2 -2
  238. package/.next/standalone/.next/server/app/dashboard/settings.rsc +4 -4
  239. package/.next/standalone/.next/server/app/dashboard/settings.segments/!KGRhc2hib2FyZCk/dashboard/settings/__PAGE__.segment.rsc +2 -2
  240. package/.next/standalone/.next/server/app/dashboard/settings.segments/!KGRhc2hib2FyZCk/dashboard/settings.segment.rsc +1 -1
  241. package/.next/standalone/.next/server/app/dashboard/settings.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  242. package/.next/standalone/.next/server/app/dashboard/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  243. package/.next/standalone/.next/server/app/dashboard/settings.segments/_full.segment.rsc +4 -4
  244. package/.next/standalone/.next/server/app/dashboard/settings.segments/_head.segment.rsc +1 -1
  245. package/.next/standalone/.next/server/app/dashboard/settings.segments/_index.segment.rsc +2 -2
  246. package/.next/standalone/.next/server/app/dashboard/settings.segments/_tree.segment.rsc +1 -1
  247. package/.next/standalone/.next/server/app/dashboard/skills.html +2 -2
  248. package/.next/standalone/.next/server/app/dashboard/skills.rsc +4 -4
  249. package/.next/standalone/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  250. package/.next/standalone/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  251. package/.next/standalone/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  252. package/.next/standalone/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  253. package/.next/standalone/.next/server/app/dashboard/skills.segments/_full.segment.rsc +4 -4
  254. package/.next/standalone/.next/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  255. package/.next/standalone/.next/server/app/dashboard/skills.segments/_index.segment.rsc +2 -2
  256. package/.next/standalone/.next/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  257. package/.next/standalone/.next/server/app/dashboard/translator.html +2 -2
  258. package/.next/standalone/.next/server/app/dashboard/translator.rsc +4 -4
  259. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  260. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  261. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  262. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  263. package/.next/standalone/.next/server/app/dashboard/translator.segments/_full.segment.rsc +4 -4
  264. package/.next/standalone/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  265. package/.next/standalone/.next/server/app/dashboard/translator.segments/_index.segment.rsc +2 -2
  266. package/.next/standalone/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  267. package/.next/standalone/.next/server/app/dashboard/usage.html +1 -1
  268. package/.next/standalone/.next/server/app/dashboard/usage.rsc +4 -4
  269. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  270. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  271. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  272. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  273. package/.next/standalone/.next/server/app/dashboard/usage.segments/_full.segment.rsc +4 -4
  274. package/.next/standalone/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  275. package/.next/standalone/.next/server/app/dashboard/usage.segments/_index.segment.rsc +2 -2
  276. package/.next/standalone/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  277. package/.next/standalone/.next/server/app/dashboard.html +1 -1
  278. package/.next/standalone/.next/server/app/dashboard.rsc +4 -4
  279. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  280. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  281. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  282. package/.next/standalone/.next/server/app/dashboard.segments/_full.segment.rsc +4 -4
  283. package/.next/standalone/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  284. package/.next/standalone/.next/server/app/dashboard.segments/_index.segment.rsc +2 -2
  285. package/.next/standalone/.next/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  286. package/.next/standalone/.next/server/app/index.html +1 -1
  287. package/.next/standalone/.next/server/app/index.rsc +1 -1
  288. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  289. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  290. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  291. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  292. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  293. package/.next/standalone/.next/server/app/landing.html +1 -1
  294. package/.next/standalone/.next/server/app/landing.rsc +1 -1
  295. package/.next/standalone/.next/server/app/landing.segments/_full.segment.rsc +1 -1
  296. package/.next/standalone/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  297. package/.next/standalone/.next/server/app/landing.segments/_index.segment.rsc +1 -1
  298. package/.next/standalone/.next/server/app/landing.segments/_tree.segment.rsc +1 -1
  299. package/.next/standalone/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  300. package/.next/standalone/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  301. package/.next/standalone/.next/server/app/login.html +1 -1
  302. package/.next/standalone/.next/server/app/login.rsc +1 -1
  303. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +1 -1
  304. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
  305. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +1 -1
  306. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  307. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  308. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
  309. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.mzodm._.js +1 -1
  310. package/.next/standalone/.next/server/chunks/[root-of-the-server]__003scm0._.js +1 -1
  311. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01kq~.r._.js +1 -1
  312. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03sw1c3._.js +1 -1
  313. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0brgjhf._.js +1 -1
  314. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0d~p0cq._.js +1 -1
  315. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0h9.ugv._.js +1 -1
  316. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i8ubss._.js +1 -1
  317. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k2~rdk._.js +1 -1
  318. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k6jln3._.js +2 -2
  319. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0m.0h8z._.js +1 -1
  320. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0n~_i6e._.js +1 -1
  321. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o_0bxa._.js +1 -1
  322. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uvu.gs._.js +1 -1
  323. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zbooww._.js +1 -1
  324. package/.next/standalone/.next/server/chunks/_0743~zr._.js +1 -1
  325. package/.next/standalone/.next/server/chunks/_0h~0zar._.js +1 -1
  326. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0k_a0xx.js +1 -1
  327. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0o8sjwu.js +1 -1
  328. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0tqpghm.js +1 -1
  329. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_12p6yih.js +1 -1
  330. package/.next/standalone/.next/server/chunks/ssr/_0-~8uap._.js +1 -1
  331. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  332. package/.next/standalone/.next/server/pages/404.html +1 -1
  333. package/.next/standalone/.next/server/pages/500.html +1 -1
  334. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  335. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  336. package/.next/standalone/WorkerProxy/package-lock.json +3570 -0
  337. package/.next/standalone/WorkerProxy/package.json +22 -0
  338. package/.next/standalone/WorkerProxy/tsconfig.json +20 -0
  339. package/.next/standalone/package-lock.json +2 -2
  340. package/.next/standalone/package.json +3 -2
  341. package/.next/static/chunks/{0sah4jw77ycqs.js → 0-8mpnlo8y_tj.js} +1 -1
  342. package/installer.sh +211 -0
  343. package/package.json +3 -2
  344. package/scripts/service.js +261 -69
  345. /package/.next/static/{Au1OdaeQmL3pUJ_HFlKf3 → JwKavHa5OgD3g5HXE6pag}/_buildManifest.js +0 -0
  346. /package/.next/static/{Au1OdaeQmL3pUJ_HFlKf3 → JwKavHa5OgD3g5HXE6pag}/_clientMiddlewareManifest.js +0 -0
  347. /package/.next/static/{Au1OdaeQmL3pUJ_HFlKf3 → JwKavHa5OgD3g5HXE6pag}/_ssgManifest.js +0 -0
@@ -1,9 +1,12 @@
1
1
  #!/usr/bin/env node
2
+ // IMPORTANT: Never chown the axonrouter package directory to root.
3
+ // This breaks native modules like better-sqlite3.
2
4
 
3
5
  import { execSync, spawnSync } from "node:child_process";
4
6
  import fs from "node:fs";
5
7
  import os from "node:os";
6
8
  import path from "node:path";
9
+ import { fileURLToPath } from "node:url";
7
10
 
8
11
  const SERVICE_NAME = "axonrouter";
9
12
  const SYSTEMD_UNIT_PATH = `/etc/systemd/system/${SERVICE_NAME}.service`;
@@ -11,6 +14,9 @@ const INITD_SCRIPT_PATH = `/etc/init.d/${SERVICE_NAME}`;
11
14
  const PID_FILE = `/var/run/${SERVICE_NAME}.pid`;
12
15
  const DEFAULT_PORT = 12711;
13
16
 
17
+ const USER_SYSTEMD_DIR = path.join(os.homedir(), ".config", "systemd", "user");
18
+ const USER_UNIT_PATH = path.join(USER_SYSTEMD_DIR, `${SERVICE_NAME}.service`);
19
+
14
20
  /**
15
21
  * Check if the current process is running as root (uid 0).
16
22
  */
@@ -18,17 +24,6 @@ export function isRoot() {
18
24
  return process.getuid() === 0;
19
25
  }
20
26
 
21
- /**
22
- * Require root privileges. Prints error and exits if not root.
23
- */
24
- export function requireRoot() {
25
- if (!isRoot()) {
26
- console.error("\x1b[31m[AxonRouter] Error: Service management requires root privileges.\x1b[0m");
27
- console.error("\x1b[33mPlease run with sudo: sudo axonrouter install-service\x1b[0m");
28
- process.exit(1);
29
- }
30
- }
31
-
32
27
  /**
33
28
  * Run a command with sudo if not already root.
34
29
  * Prompts for password interactively when needed.
@@ -64,15 +59,13 @@ export function detectInitSystem() {
64
59
  }
65
60
 
66
61
  /**
67
- * Get the path to the axonrouter binary (via `which axonrouter`).
62
+ * Get the path to the axonrouter binary resolved from import.meta.url.
63
+ * This avoids relying on 'which axonrouter' which fails under sudo or nvm.
68
64
  */
69
65
  export function getExecPath() {
70
- try {
71
- return execSync("which axonrouter", { encoding: "utf-8" }).trim();
72
- } catch {
73
- // Fallback to the current process argv
74
- return process.argv[1] || "/usr/local/bin/axonrouter";
75
- }
66
+ const __filename = fileURLToPath(import.meta.url);
67
+ const __dirname = path.dirname(__filename);
68
+ return path.resolve(__dirname, "..", "bin", "axonrouter.js");
76
69
  }
77
70
 
78
71
  /**
@@ -185,18 +178,31 @@ export function getInstallingUser() {
185
178
  * Generate systemd unit file content.
186
179
  * Uses absolute node path + script path to avoid shebang/PATH issues under systemd.
187
180
  * Accepts an optional userInfo parameter to avoid repeated getInstallingUser() calls.
181
+ * When userMode is true, omits User=/Group= and uses WantedBy=default.target.
188
182
  */
189
- export function generateSystemdUnit(execPath, userInfo) {
183
+ export function generateSystemdUnit(execPath, userInfo, options = {}) {
190
184
  const nodePath = getNodePath();
191
185
  const { user, group, home } = userInfo || getInstallingUser();
192
186
  const workingDirectory = path.resolve(path.dirname(execPath), "..");
193
- return `[Unit]
194
- Description=AxonRouter AI Router
195
- After=network.target
196
- StartLimitIntervalSec=300
197
- StartLimitBurst=5
187
+ const userMode = options.userMode || false;
198
188
 
199
- [Service]
189
+ let serviceSection;
190
+ if (userMode) {
191
+ serviceSection = `[Service]
192
+ Type=simple
193
+ WorkingDirectory=${workingDirectory}
194
+ ExecStart=${nodePath} ${execPath}
195
+ Restart=always
196
+ RestartSec=5
197
+ Environment=NODE_ENV=production
198
+ Environment=PORT=${DEFAULT_PORT}
199
+ Environment=HOME=${home}
200
+ # Graceful shutdown timeout
201
+ TimeoutStopSec=30
202
+ # Kill remaining child processes (cloudflared, tailscaled) on stop
203
+ KillMode=control-group`;
204
+ } else {
205
+ serviceSection = `[Service]
200
206
  Type=simple
201
207
  User=${user}
202
208
  Group=${group}
@@ -210,10 +216,21 @@ Environment=HOME=${home}
210
216
  # Graceful shutdown timeout
211
217
  TimeoutStopSec=30
212
218
  # Kill remaining child processes (cloudflared, tailscaled) on stop
213
- KillMode=control-group
219
+ KillMode=control-group`;
220
+ }
221
+
222
+ const wantedBy = userMode ? "default.target" : "multi-user.target";
223
+
224
+ return `[Unit]
225
+ Description=AxonRouter AI Router
226
+ After=network.target
227
+ StartLimitIntervalSec=300
228
+ StartLimitBurst=5
229
+
230
+ ${serviceSection}
214
231
 
215
232
  [Install]
216
- WantedBy=multi-user.target
233
+ WantedBy=${wantedBy}
217
234
  `;
218
235
  }
219
236
 
@@ -314,9 +331,40 @@ exit 0
314
331
  `;
315
332
  }
316
333
 
334
+ /**
335
+ * Check if the user session bus is available for systemctl --user commands.
336
+ * Returns true if the session bus is accessible, false otherwise.
337
+ */
338
+ export function isUserSessionAvailable() {
339
+ if (process.env.XDG_RUNTIME_DIR || process.env.DBUS_SESSION_BUS_ADDRESS) {
340
+ return true;
341
+ }
342
+ // Try running systemctl --user as a final check
343
+ try {
344
+ execSync("systemctl --user --no-pager status", { stdio: "ignore" });
345
+ return true;
346
+ } catch {
347
+ return false;
348
+ }
349
+ }
350
+
351
+ /**
352
+ * Get the user-level unit path for a specific user.
353
+ * When running as root with SUDO_USER set, resolves to that user's home.
354
+ */
355
+ export function getUserUnitPath(targetUser) {
356
+ if (targetUser) {
357
+ const home = getInstallingUserHome(targetUser);
358
+ return path.join(home, ".config", "systemd", "user", `${SERVICE_NAME}.service`);
359
+ }
360
+ return USER_UNIT_PATH;
361
+ }
362
+
317
363
  /**
318
364
  * Install the service (systemd or init.d).
319
- * Writes the service file, enables, and starts the service.
365
+ * When running as non-root with systemd, installs a user-level service.
366
+ * When running as root with systemd, installs a system-level service.
367
+ * For init.d, always uses sudo (no user-level support).
320
368
  */
321
369
  export function installService() {
322
370
  const initSystem = detectInitSystem();
@@ -330,23 +378,49 @@ export function installService() {
330
378
  const userInfo = { user, group, home: getInstallingUserHome(user) };
331
379
 
332
380
  if (initSystem === "systemd") {
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
- }
343
- console.log(`[AxonRouter] Service file written to ${SYSTEMD_UNIT_PATH}`);
381
+ if (isRoot()) {
382
+ // System-level service installation (existing behavior)
383
+ const unitContent = generateSystemdUnit(execPath, userInfo);
384
+ const child = spawnSync("sudo", ["tee", SYSTEMD_UNIT_PATH], {
385
+ input: unitContent,
386
+ stdio: ["pipe", "pipe", "inherit"],
387
+ });
388
+ if (child.status !== 0) {
389
+ console.error("[AxonRouter] Failed to write service file. Sudo access required.");
390
+ process.exit(1);
391
+ }
392
+ console.log(`[AxonRouter] Service file written to ${SYSTEMD_UNIT_PATH}`);
393
+
394
+ runWithSudo("systemctl daemon-reload");
395
+ runWithSudo(`systemctl enable ${SERVICE_NAME}`);
396
+ runWithSudo(`systemctl start ${SERVICE_NAME}`);
397
+ console.log(`[AxonRouter] System-level service installed, enabled, and started.`);
398
+ } else {
399
+ // User-level service installation (no sudo needed)
400
+ if (!isUserSessionAvailable()) {
401
+ console.error(`[AxonRouter] ERROR: User session bus is not available.`);
402
+ console.error(`[AxonRouter] systemctl --user requires an active user session or lingering enabled.`);
403
+ console.error(`[AxonRouter] To fix this, run: sudo loginctl enable-linger ${user}`);
404
+ console.error(`[AxonRouter] Then log out and back in, or reboot.`);
405
+ process.exit(1);
406
+ }
344
407
 
345
- runWithSudo("systemctl daemon-reload");
346
- runWithSudo(`systemctl enable ${SERVICE_NAME}`);
347
- runWithSudo(`systemctl start ${SERVICE_NAME}`);
348
- console.log(`[AxonRouter] Service installed, enabled, and started.`);
408
+ const unitContent = generateSystemdUnit(execPath, userInfo, { userMode: true });
409
+
410
+ fs.mkdirSync(USER_SYSTEMD_DIR, { recursive: true });
411
+ fs.writeFileSync(USER_UNIT_PATH, unitContent);
412
+ console.log(`[AxonRouter] Service file written to ${USER_UNIT_PATH}`);
413
+
414
+ execSync("systemctl --user daemon-reload", { stdio: "inherit" });
415
+ execSync(`systemctl --user enable ${SERVICE_NAME}`, { stdio: "inherit" });
416
+ execSync(`systemctl --user start ${SERVICE_NAME}`, { stdio: "inherit" });
417
+
418
+ console.log(`[AxonRouter] User-level service installed and started.`);
419
+ console.log(`[AxonRouter] To start at boot without login, run: sudo loginctl enable-linger ${user}`);
420
+ }
349
421
  } else {
422
+ // init.d has no user-level support, requires sudo
423
+ console.log(`[AxonRouter] init.d does not support user-level services; sudo is required.`);
350
424
  const scriptContent = generateInitdScript(execPath, userInfo);
351
425
  const child = spawnSync("sudo", ["tee", INITD_SCRIPT_PATH], {
352
426
  input: scriptContent,
@@ -376,6 +450,8 @@ export function installService() {
376
450
 
377
451
  /**
378
452
  * Uninstall the service (stop, disable, remove).
453
+ * Detects whether a user-level or system-level service is installed.
454
+ * When running as root, checks if SUDO_USER has a user-level unit.
379
455
  */
380
456
  export function uninstallService() {
381
457
  const initSystem = detectInitSystem();
@@ -383,24 +459,82 @@ export function uninstallService() {
383
459
  console.log(`[AxonRouter] Detected init system: ${initSystem}`);
384
460
 
385
461
  if (initSystem === "systemd") {
386
- try {
387
- runWithSudo(`systemctl stop ${SERVICE_NAME}`);
388
- } catch {
389
- // Service might not be running
390
- }
391
- try {
392
- runWithSudo(`systemctl disable ${SERVICE_NAME}`);
393
- } catch {
394
- // Service might not be enabled
395
- }
396
- try {
397
- runWithSudo(`rm -f ${SYSTEMD_UNIT_PATH}`);
398
- console.log(`[AxonRouter] Removed ${SYSTEMD_UNIT_PATH}`);
399
- } catch {
400
- // File might not exist
462
+ // When running as root with SUDO_USER, check that user's unit path too
463
+ const sudoUser = process.env.SUDO_USER;
464
+ const effectiveUserUnitPath = (isRoot() && sudoUser)
465
+ ? getUserUnitPath(sudoUser)
466
+ : USER_UNIT_PATH;
467
+
468
+ const userLevelExists = fs.existsSync(effectiveUserUnitPath);
469
+ const systemLevelExists = fs.existsSync(SYSTEMD_UNIT_PATH);
470
+
471
+ if (userLevelExists && !isRoot()) {
472
+ // Uninstall user-level service (current user)
473
+ try {
474
+ execSync(`systemctl --user stop ${SERVICE_NAME}`, { stdio: "inherit" });
475
+ } catch {
476
+ // Service might not be running
477
+ }
478
+ try {
479
+ execSync(`systemctl --user disable ${SERVICE_NAME}`, { stdio: "inherit" });
480
+ } catch {
481
+ // Service might not be enabled
482
+ }
483
+ try {
484
+ fs.unlinkSync(USER_UNIT_PATH);
485
+ console.log(`[AxonRouter] Removed ${USER_UNIT_PATH}`);
486
+ } catch {
487
+ // File might not exist
488
+ }
489
+ execSync("systemctl --user daemon-reload", { stdio: "inherit" });
490
+ console.log(`[AxonRouter] User-level service uninstalled.`);
491
+ } else if (userLevelExists && isRoot() && sudoUser) {
492
+ // Root is uninstalling a user-level service owned by SUDO_USER
493
+ try {
494
+ execSync(`sudo -u ${sudoUser} XDG_RUNTIME_DIR=/run/user/$(id -u ${sudoUser}) systemctl --user stop ${SERVICE_NAME}`, { stdio: "inherit" });
495
+ } catch {
496
+ // Service might not be running
497
+ }
498
+ try {
499
+ execSync(`sudo -u ${sudoUser} XDG_RUNTIME_DIR=/run/user/$(id -u ${sudoUser}) systemctl --user disable ${SERVICE_NAME}`, { stdio: "inherit" });
500
+ } catch {
501
+ // Service might not be enabled
502
+ }
503
+ try {
504
+ fs.unlinkSync(effectiveUserUnitPath);
505
+ console.log(`[AxonRouter] Removed ${effectiveUserUnitPath}`);
506
+ } catch {
507
+ // File might not exist
508
+ }
509
+ try {
510
+ execSync(`sudo -u ${sudoUser} XDG_RUNTIME_DIR=/run/user/$(id -u ${sudoUser}) systemctl --user daemon-reload`, { stdio: "inherit" });
511
+ } catch {
512
+ // daemon-reload may fail if session not available, but file is already removed
513
+ }
514
+ console.log(`[AxonRouter] User-level service for ${sudoUser} uninstalled.`);
515
+ } else if (systemLevelExists) {
516
+ // Uninstall system-level service
517
+ try {
518
+ runWithSudo(`systemctl stop ${SERVICE_NAME}`);
519
+ } catch {
520
+ // Service might not be running
521
+ }
522
+ try {
523
+ runWithSudo(`systemctl disable ${SERVICE_NAME}`);
524
+ } catch {
525
+ // Service might not be enabled
526
+ }
527
+ try {
528
+ runWithSudo(`rm -f ${SYSTEMD_UNIT_PATH}`);
529
+ console.log(`[AxonRouter] Removed ${SYSTEMD_UNIT_PATH}`);
530
+ } catch {
531
+ // File might not exist
532
+ }
533
+ runWithSudo("systemctl daemon-reload");
534
+ console.log(`[AxonRouter] System-level service uninstalled.`);
535
+ } else {
536
+ console.log(`[AxonRouter] No service found to uninstall.`);
401
537
  }
402
- runWithSudo("systemctl daemon-reload");
403
- console.log(`[AxonRouter] Service uninstalled.`);
404
538
  } else {
405
539
  try {
406
540
  runWithSudo(`${INITD_SCRIPT_PATH} stop`);
@@ -433,6 +567,7 @@ export function uninstallService() {
433
567
 
434
568
  /**
435
569
  * Check the status of the service.
570
+ * Checks both user-level and system-level unit paths and reports status.
436
571
  */
437
572
  export function checkService() {
438
573
  const initSystem = detectInitSystem();
@@ -440,17 +575,33 @@ export function checkService() {
440
575
  console.log(`[AxonRouter] Init system: ${initSystem}`);
441
576
 
442
577
  if (initSystem === "systemd") {
443
- const installed = fs.existsSync(SYSTEMD_UNIT_PATH);
444
- console.log(`[AxonRouter] Service installed: ${installed}`);
578
+ const userLevelExists = fs.existsSync(USER_UNIT_PATH);
579
+ const systemLevelExists = fs.existsSync(SYSTEMD_UNIT_PATH);
445
580
 
446
- if (installed) {
581
+ if (userLevelExists) {
582
+ console.log(`[AxonRouter] User-level service installed: ${USER_UNIT_PATH}`);
447
583
  try {
448
- const status = execSync(`systemctl is-active ${SERVICE_NAME}`, { encoding: "utf-8" }).trim();
584
+ const status = execSync(`systemctl --user is-active ${SERVICE_NAME}`, { encoding: "utf-8" }).trim();
449
585
  console.log(`[AxonRouter] Service status: ${status}`);
450
- } catch (err) {
586
+ } catch {
451
587
  console.log(`[AxonRouter] Service status: inactive`);
452
588
  }
589
+ try {
590
+ const enabled = execSync(`systemctl --user is-enabled ${SERVICE_NAME}`, { encoding: "utf-8" }).trim();
591
+ console.log(`[AxonRouter] Service enabled: ${enabled}`);
592
+ } catch {
593
+ console.log(`[AxonRouter] Service enabled: disabled`);
594
+ }
595
+ }
453
596
 
597
+ if (systemLevelExists) {
598
+ console.log(`[AxonRouter] System-level service installed: ${SYSTEMD_UNIT_PATH}`);
599
+ try {
600
+ const status = execSync(`systemctl is-active ${SERVICE_NAME}`, { encoding: "utf-8" }).trim();
601
+ console.log(`[AxonRouter] Service status: ${status}`);
602
+ } catch {
603
+ console.log(`[AxonRouter] Service status: inactive`);
604
+ }
454
605
  try {
455
606
  const enabled = execSync(`systemctl is-enabled ${SERVICE_NAME}`, { encoding: "utf-8" }).trim();
456
607
  console.log(`[AxonRouter] Service enabled: ${enabled}`);
@@ -458,6 +609,10 @@ export function checkService() {
458
609
  console.log(`[AxonRouter] Service enabled: disabled`);
459
610
  }
460
611
  }
612
+
613
+ if (!userLevelExists && !systemLevelExists) {
614
+ console.log(`[AxonRouter] Service installed: false`);
615
+ }
461
616
  } else {
462
617
  const installed = fs.existsSync(INITD_SCRIPT_PATH);
463
618
  console.log(`[AxonRouter] Service installed: ${installed}`);
@@ -474,12 +629,24 @@ export function checkService() {
474
629
 
475
630
  /**
476
631
  * Start the service.
632
+ * Checks for user-level service (including via SUDO_USER when root).
477
633
  */
478
634
  export function startService() {
479
635
  const initSystem = detectInitSystem();
480
636
 
481
637
  if (initSystem === "systemd") {
482
- runWithSudo(`systemctl start ${SERVICE_NAME}`);
638
+ const sudoUser = process.env.SUDO_USER;
639
+ const effectiveUserUnitPath = (isRoot() && sudoUser)
640
+ ? getUserUnitPath(sudoUser)
641
+ : USER_UNIT_PATH;
642
+
643
+ if (fs.existsSync(effectiveUserUnitPath) && !isRoot()) {
644
+ execSync(`systemctl --user start ${SERVICE_NAME}`, { stdio: "inherit" });
645
+ } else if (fs.existsSync(effectiveUserUnitPath) && isRoot() && sudoUser) {
646
+ execSync(`sudo -u ${sudoUser} XDG_RUNTIME_DIR=/run/user/$(id -u ${sudoUser}) systemctl --user start ${SERVICE_NAME}`, { stdio: "inherit" });
647
+ } else {
648
+ runWithSudo(`systemctl start ${SERVICE_NAME}`);
649
+ }
483
650
  } else {
484
651
  runWithSudo(`${INITD_SCRIPT_PATH} start`);
485
652
  }
@@ -489,12 +656,24 @@ export function startService() {
489
656
 
490
657
  /**
491
658
  * Stop the service.
659
+ * Checks for user-level service (including via SUDO_USER when root).
492
660
  */
493
661
  export function stopService() {
494
662
  const initSystem = detectInitSystem();
495
663
 
496
664
  if (initSystem === "systemd") {
497
- runWithSudo(`systemctl stop ${SERVICE_NAME}`);
665
+ const sudoUser = process.env.SUDO_USER;
666
+ const effectiveUserUnitPath = (isRoot() && sudoUser)
667
+ ? getUserUnitPath(sudoUser)
668
+ : USER_UNIT_PATH;
669
+
670
+ if (fs.existsSync(effectiveUserUnitPath) && !isRoot()) {
671
+ execSync(`systemctl --user stop ${SERVICE_NAME}`, { stdio: "inherit" });
672
+ } else if (fs.existsSync(effectiveUserUnitPath) && isRoot() && sudoUser) {
673
+ execSync(`sudo -u ${sudoUser} XDG_RUNTIME_DIR=/run/user/$(id -u ${sudoUser}) systemctl --user stop ${SERVICE_NAME}`, { stdio: "inherit" });
674
+ } else {
675
+ runWithSudo(`systemctl stop ${SERVICE_NAME}`);
676
+ }
498
677
  } else {
499
678
  runWithSudo(`${INITD_SCRIPT_PATH} stop`);
500
679
  }
@@ -504,12 +683,24 @@ export function stopService() {
504
683
 
505
684
  /**
506
685
  * Restart the service.
686
+ * Checks for user-level service (including via SUDO_USER when root).
507
687
  */
508
688
  export function restartService() {
509
689
  const initSystem = detectInitSystem();
510
690
 
511
691
  if (initSystem === "systemd") {
512
- runWithSudo(`systemctl restart ${SERVICE_NAME}`);
692
+ const sudoUser = process.env.SUDO_USER;
693
+ const effectiveUserUnitPath = (isRoot() && sudoUser)
694
+ ? getUserUnitPath(sudoUser)
695
+ : USER_UNIT_PATH;
696
+
697
+ if (fs.existsSync(effectiveUserUnitPath) && !isRoot()) {
698
+ execSync(`systemctl --user restart ${SERVICE_NAME}`, { stdio: "inherit" });
699
+ } else if (fs.existsSync(effectiveUserUnitPath) && isRoot() && sudoUser) {
700
+ execSync(`sudo -u ${sudoUser} XDG_RUNTIME_DIR=/run/user/$(id -u ${sudoUser}) systemctl --user restart ${SERVICE_NAME}`, { stdio: "inherit" });
701
+ } else {
702
+ runWithSudo(`systemctl restart ${SERVICE_NAME}`);
703
+ }
513
704
  } else {
514
705
  runWithSudo(`${INITD_SCRIPT_PATH} restart`);
515
706
  }
@@ -556,7 +747,8 @@ export function showHelp() {
556
747
  axonrouter --port 3000 Start on custom port
557
748
 
558
749
  \x1b[33mNotes:\x1b[0m
559
- Service commands will prompt for sudo password if not running as root.
750
+ When not running as root, service installs as a user-level systemd service.
751
+ When running as root, service installs as a system-level service.
560
752
  The service auto-restarts on crash (systemd: always, init.d: up to 10 times).
561
753
  `);
562
754
  }