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