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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/caveman/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/intelligence/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/mcp/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/morph/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/opencode/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/callback.html +1 -1
- package/.next/standalone/.next/server/app/callback.rsc +1 -1
- package/.next/standalone/.next/server/app/callback.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/callback.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/callback.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/callback.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/callback.segments/callback.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/analytics.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/analytics.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/analytics.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/analytics.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/analytics.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/analytics.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/basic-chat.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/basic-chat.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/caveman.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/caveman.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/caveman.segments/!KGRhc2hib2FyZCk/dashboard/caveman/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/caveman.segments/!KGRhc2hib2FyZCk/dashboard/caveman.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/caveman.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/caveman.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/caveman.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/caveman.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/caveman.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/caveman.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/cli-tools.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/cli-tools.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/combos.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/combos.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/combos.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/combos.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/endpoint.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/endpoint.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/intelligence.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/intelligence.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/intelligence.segments/!KGRhc2hib2FyZCk/dashboard/intelligence/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/intelligence.segments/!KGRhc2hib2FyZCk/dashboard/intelligence.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/intelligence.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/intelligence.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/intelligence.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/intelligence.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/intelligence.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/intelligence.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/mcp.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/mcp.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/mcp.segments/!KGRhc2hib2FyZCk/dashboard/mcp/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/mcp.segments/!KGRhc2hib2FyZCk/dashboard/mcp.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/mcp.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/mcp.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/mcp.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/mcp.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/mcp.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/mcp.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/media-providers.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/media-providers.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/media-providers.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/media-providers.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/media-providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/media-providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/media-providers.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/media-providers.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/media-providers.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/media-providers.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/mitm.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/mitm.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/morph.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/morph.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/morph.segments/!KGRhc2hib2FyZCk/dashboard/morph/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/morph.segments/!KGRhc2hib2FyZCk/dashboard/morph.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/morph.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/morph.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/morph.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/morph.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/morph.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/morph.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/opencode.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/opencode.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/opencode.segments/!KGRhc2hib2FyZCk/dashboard/opencode/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/opencode.segments/!KGRhc2hib2FyZCk/dashboard/opencode.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/opencode.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/opencode.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/opencode.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/opencode.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/opencode.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/opencode.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/profile.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/profile.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/profile.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/profile.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers/new.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/providers/new.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/providers.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/providers.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/quota.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/quota.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/quota.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/quota.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/settings.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/settings.segments/!KGRhc2hib2FyZCk/dashboard/settings/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/settings.segments/!KGRhc2hib2FyZCk/dashboard/settings.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/settings.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/settings.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/settings.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/skills.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/skills.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/skills.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/skills.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/translator.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/translator.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/translator.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/translator.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/usage.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/usage.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/usage.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/usage.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard.html +1 -1
- package/.next/standalone/.next/server/app/dashboard.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/landing.html +1 -1
- package/.next/standalone/.next/server/app/landing.rsc +1 -1
- package/.next/standalone/.next/server/app/landing.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/landing.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/landing.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/landing.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/landing.segments/landing.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.mzodm._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__003scm0._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__01kq~.r._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__03sw1c3._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0brgjhf._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0d~p0cq._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0h9.ugv._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i8ubss._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k2~rdk._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k6jln3._.js +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0m.0h8z._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0n~_i6e._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o_0bxa._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uvu.gs._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zbooww._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0743~zr._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0h~0zar._.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0k_a0xx.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0o8sjwu.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0tqpghm.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_12p6yih.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0-~8uap._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/WorkerProxy/package-lock.json +3570 -0
- package/.next/standalone/WorkerProxy/package.json +22 -0
- package/.next/standalone/WorkerProxy/tsconfig.json +20 -0
- package/.next/standalone/package-lock.json +2 -2
- package/.next/standalone/package.json +3 -2
- package/.next/static/chunks/{0sah4jw77ycqs.js → 0-8mpnlo8y_tj.js} +1 -1
- package/installer.sh +211 -0
- package/package.json +3 -2
- package/scripts/service.js +261 -69
- /package/.next/static/{Au1OdaeQmL3pUJ_HFlKf3 → JwKavHa5OgD3g5HXE6pag}/_buildManifest.js +0 -0
- /package/.next/static/{Au1OdaeQmL3pUJ_HFlKf3 → JwKavHa5OgD3g5HXE6pag}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{Au1OdaeQmL3pUJ_HFlKf3 → JwKavHa5OgD3g5HXE6pag}/_ssgManifest.js +0 -0
package/scripts/service.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
194
|
-
Description=AxonRouter AI Router
|
|
195
|
-
After=network.target
|
|
196
|
-
StartLimitIntervalSec=300
|
|
197
|
-
StartLimitBurst=5
|
|
187
|
+
const userMode = options.userMode || false;
|
|
198
188
|
|
|
199
|
-
|
|
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
|
|
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
|
-
*
|
|
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
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
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
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
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
|
|
444
|
-
|
|
578
|
+
const userLevelExists = fs.existsSync(USER_UNIT_PATH);
|
|
579
|
+
const systemLevelExists = fs.existsSync(SYSTEMD_UNIT_PATH);
|
|
445
580
|
|
|
446
|
-
if (
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|
|
File without changes
|
/package/.next/static/{Au1OdaeQmL3pUJ_HFlKf3 → JwKavHa5OgD3g5HXE6pag}/_clientMiddlewareManifest.js
RENAMED
|
File without changes
|
|
File without changes
|