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