@euraika-labs/pan-ui 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +30 -0
- package/.next/standalone/.next/BUILD_ID +1 -0
- package/.next/standalone/.next/app-build-manifest.json +508 -0
- package/.next/standalone/.next/app-path-routes-manifest.json +67 -0
- package/.next/standalone/.next/build-manifest.json +33 -0
- package/.next/standalone/.next/package.json +1 -0
- package/.next/standalone/.next/prerender-manifest.json +119 -0
- package/.next/standalone/.next/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/required-server-files.json +321 -0
- package/.next/standalone/.next/routes-manifest.json +295 -0
- package/.next/standalone/.next/server/app/_not-found/page.js +2 -0
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/_not-found.html +1 -0
- package/.next/standalone/.next/server/app/_not-found.meta +8 -0
- package/.next/standalone/.next/server/app/_not-found.rsc +18 -0
- package/.next/standalone/.next/server/app/api/audit/route.js +36 -0
- package/.next/standalone/.next/server/app/api/audit/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/audit/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/auth/login/route.js +1 -0
- package/.next/standalone/.next/server/app/api/auth/login/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +1 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/fork/route.js +1 -0
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/fork/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/fork/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route.js +1 -0
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/chat/sessions/route.js +1 -0
- package/.next/standalone/.next/server/app/api/chat/sessions/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/chat/sessions/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/chat/stream/route.js +170 -0
- package/.next/standalone/.next/server/app/api/chat/stream/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/chat/stream/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/extensions/[id]/capabilities/[capabilityId]/route.js +1 -0
- package/.next/standalone/.next/server/app/api/extensions/[id]/capabilities/[capabilityId]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/extensions/[id]/capabilities/[capabilityId]/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/extensions/[id]/route.js +1 -0
- package/.next/standalone/.next/server/app/api/extensions/[id]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/extensions/[id]/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/extensions/[id]/test/route.js +1 -0
- package/.next/standalone/.next/server/app/api/extensions/[id]/test/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/extensions/[id]/test/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/extensions/mcp/route.js +11 -0
- package/.next/standalone/.next/server/app/api/extensions/mcp/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/extensions/mcp/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/extensions/route.js +1 -0
- package/.next/standalone/.next/server/app/api/extensions/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/extensions/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/memory/agent/route.js +36 -0
- package/.next/standalone/.next/server/app/api/memory/agent/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/memory/agent/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/memory/context-inspector/route.js +1 -0
- package/.next/standalone/.next/server/app/api/memory/context-inspector/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/memory/context-inspector/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/memory/session-search/route.js +1 -0
- package/.next/standalone/.next/server/app/api/memory/session-search/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/memory/session-search/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/memory/user/route.js +36 -0
- package/.next/standalone/.next/server/app/api/memory/user/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/memory/user/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/profiles/[id]/config/route.js +92 -0
- package/.next/standalone/.next/server/app/api/profiles/[id]/config/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/profiles/[id]/config/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/profiles/[id]/route.js +31 -0
- package/.next/standalone/.next/server/app/api/profiles/[id]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/profiles/[id]/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/profiles/route.js +31 -0
- package/.next/standalone/.next/server/app/api/profiles/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/profiles/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/runtime/approvals/[toolCallId]/route.js +133 -0
- package/.next/standalone/.next/server/app/api/runtime/approvals/[toolCallId]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/runtime/approvals/[toolCallId]/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/runtime/approvals/route.js +133 -0
- package/.next/standalone/.next/server/app/api/runtime/approvals/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/runtime/approvals/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/runtime/artifacts/download/route.js +133 -0
- package/.next/standalone/.next/server/app/api/runtime/artifacts/download/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/runtime/artifacts/download/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/runtime/artifacts/route.js +133 -0
- package/.next/standalone/.next/server/app/api/runtime/artifacts/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/runtime/artifacts/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/runtime/export/route.js +143 -0
- package/.next/standalone/.next/server/app/api/runtime/export/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/runtime/export/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/runtime/health/route.js +18 -0
- package/.next/standalone/.next/server/app/api/runtime/health/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/runtime/health/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/runtime/mcp-probes/route.js +133 -0
- package/.next/standalone/.next/server/app/api/runtime/mcp-probes/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/runtime/mcp-probes/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/runtime/runs/[id]/route.js +51 -0
- package/.next/standalone/.next/server/app/api/runtime/runs/[id]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/runtime/runs/[id]/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/runtime/runs/route.js +51 -0
- package/.next/standalone/.next/server/app/api/runtime/runs/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/runtime/runs/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/runtime/status/route.js +18 -0
- package/.next/standalone/.next/server/app/api/runtime/status/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/runtime/status/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/runtime/telemetry/route.js +133 -0
- package/.next/standalone/.next/server/app/api/runtime/telemetry/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/runtime/telemetry/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/runtime/timeline/route.js +133 -0
- package/.next/standalone/.next/server/app/api/runtime/timeline/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/runtime/timeline/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/disable/route.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/disable/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/disable/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/enable/route.js +21 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/enable/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/enable/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/files/route.js +21 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/files/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/files/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/install/route.js +56 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/install/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/install/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/load/route.js +17 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/load/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/load/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/route.js +21 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/catalog/route.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/catalog/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/skills/catalog/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/categories/route.js +21 -0
- package/.next/standalone/.next/server/app/api/skills/categories/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/skills/categories/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/hub/install/route.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/hub/install/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/skills/hub/install/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/hub/route.js +21 -0
- package/.next/standalone/.next/server/app/api/skills/hub/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/skills/hub/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/skills/route.js +21 -0
- package/.next/standalone/.next/server/app/api/skills/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/telemetry/route.js +133 -0
- package/.next/standalone/.next/server/app/api/telemetry/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/telemetry/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/uploads/route.js +36 -0
- package/.next/standalone/.next/server/app/api/uploads/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/uploads/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/chat/page.js +4 -0
- package/.next/standalone/.next/server/app/chat/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/chat/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/extensions/[id]/page.js +2 -0
- package/.next/standalone/.next/server/app/extensions/[id]/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/extensions/[id]/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/extensions/page.js +2 -0
- package/.next/standalone/.next/server/app/extensions/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/extensions/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/favicon.ico/route.js +1 -0
- package/.next/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/favicon.ico.body +0 -0
- package/.next/standalone/.next/server/app/favicon.ico.meta +1 -0
- package/.next/standalone/.next/server/app/icon.svg/route.js +1 -0
- package/.next/standalone/.next/server/app/icon.svg/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/icon.svg.body +10 -0
- package/.next/standalone/.next/server/app/icon.svg.meta +1 -0
- package/.next/standalone/.next/server/app/index.html +1 -0
- package/.next/standalone/.next/server/app/index.meta +9 -0
- package/.next/standalone/.next/server/app/index.rsc +19 -0
- package/.next/standalone/.next/server/app/login/page.js +2 -0
- package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/memory/page.js +2 -0
- package/.next/standalone/.next/server/app/memory/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/memory/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/page.js +2 -0
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/profiles/page.js +2 -0
- package/.next/standalone/.next/server/app/profiles/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/profiles/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/settings/approvals/page.js +2 -0
- package/.next/standalone/.next/server/app/settings/approvals/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/approvals/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/settings/artifacts/page.js +2 -0
- package/.next/standalone/.next/server/app/settings/artifacts/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/artifacts/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/settings/audit/page.js +2 -0
- package/.next/standalone/.next/server/app/settings/audit/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/audit/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/settings/health/page.js +2 -0
- package/.next/standalone/.next/server/app/settings/health/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/health/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/settings/mcp-diagnostics/page.js +2 -0
- package/.next/standalone/.next/server/app/settings/mcp-diagnostics/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/mcp-diagnostics/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/settings/page.js +2 -0
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/settings/runs/[id]/page.js +2 -0
- package/.next/standalone/.next/server/app/settings/runs/[id]/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/runs/[id]/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/settings/runs/page.js +2 -0
- package/.next/standalone/.next/server/app/settings/runs/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/runs/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/settings/telemetry/page.js +2 -0
- package/.next/standalone/.next/server/app/settings/telemetry/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/telemetry/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/skills/[id]/page.js +2 -0
- package/.next/standalone/.next/server/app/skills/[id]/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/skills/[id]/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/skills/page.js +2 -0
- package/.next/standalone/.next/server/app/skills/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/skills/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app-paths-manifest.json +67 -0
- package/.next/standalone/.next/server/chunks/1331.js +22 -0
- package/.next/standalone/.next/server/chunks/1692.js +1 -0
- package/.next/standalone/.next/server/chunks/2043.js +1 -0
- package/.next/standalone/.next/server/chunks/4337.js +143 -0
- package/.next/standalone/.next/server/chunks/4561.js +1 -0
- package/.next/standalone/.next/server/chunks/4689.js +25 -0
- package/.next/standalone/.next/server/chunks/5611.js +6 -0
- package/.next/standalone/.next/server/chunks/6111.js +1 -0
- package/.next/standalone/.next/server/chunks/6143.js +9 -0
- package/.next/standalone/.next/server/chunks/6516.js +143 -0
- package/.next/standalone/.next/server/chunks/6802.js +1 -0
- package/.next/standalone/.next/server/chunks/9546.js +1 -0
- package/.next/standalone/.next/server/functions-config-manifest.json +4 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -0
- package/.next/standalone/.next/server/middleware-manifest.json +6 -0
- package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/standalone/.next/server/next-font-manifest.js +1 -0
- package/.next/standalone/.next/server/next-font-manifest.json +1 -0
- package/.next/standalone/.next/server/pages/404.html +1 -0
- package/.next/standalone/.next/server/pages/500.html +1 -0
- package/.next/standalone/.next/server/pages/_app.js +1 -0
- package/.next/standalone/.next/server/pages/_app.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/_document.js +1 -0
- package/.next/standalone/.next/server/pages/_document.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages/_error.js +19 -0
- package/.next/standalone/.next/server/pages/_error.js.nft.json +1 -0
- package/.next/standalone/.next/server/pages-manifest.json +6 -0
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -0
- package/.next/standalone/.next/server/webpack-runtime.js +1 -0
- package/.next/standalone/.next/static/chunks/1255-aadf393aa3a56bfa.js +1 -0
- package/.next/standalone/.next/static/chunks/1309-d826505bfad78fd1.js +1 -0
- package/.next/standalone/.next/static/chunks/2231-e0d8768bfce5fe57.js +1 -0
- package/.next/standalone/.next/static/chunks/4879-36321f505e9ce82a.js +1 -0
- package/.next/standalone/.next/static/chunks/4bd1b696-f785427dddbba9fb.js +1 -0
- package/.next/standalone/.next/static/chunks/5449-aba2dafba76d4508.js +1 -0
- package/.next/standalone/.next/static/chunks/9657-3ff4bf56070f324f.js +1 -0
- package/.next/{static/chunks/app/_not-found/page-c4591bba1afe868d.js → standalone/.next/static/chunks/app/_not-found/page-9c90a6b39424f003.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/api/audit/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/login/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/chat/sessions/[id]/fork/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/chat/sessions/[id]/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/chat/sessions/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/chat/stream/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/extensions/[id]/capabilities/[capabilityId]/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/extensions/[id]/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/extensions/[id]/test/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/extensions/mcp/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/extensions/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/memory/agent/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/memory/context-inspector/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/memory/session-search/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/memory/user/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/profiles/[id]/config/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/profiles/[id]/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/profiles/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/runtime/approvals/[toolCallId]/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/runtime/approvals/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/runtime/artifacts/download/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/runtime/artifacts/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/runtime/export/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/runtime/health/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/runtime/mcp-probes/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/runtime/runs/[id]/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/runtime/runs/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/runtime/status/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/runtime/telemetry/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/runtime/timeline/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/skills/[id]/disable/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/skills/[id]/enable/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/skills/[id]/files/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/skills/[id]/install/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/skills/[id]/load/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/skills/[id]/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/skills/catalog/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/skills/categories/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/skills/hub/install/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/skills/hub/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/skills/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/telemetry/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/uploads/route-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/chat/page-117a5b54aee7eae4.js +1 -0
- package/.next/{static/chunks/app/extensions/[id]/page-18e579a71a9d93c3.js → standalone/.next/static/chunks/app/extensions/[id]/page-cca6df1771ec04d2.js} +1 -1
- package/.next/{static/chunks/app/extensions/page-82f358e2fcabc6a3.js → standalone/.next/static/chunks/app/extensions/page-c0fbb8efa9a3700c.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/layout-0bc970399be389b5.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/page-984e33272681e1e0.js +1 -0
- package/.next/{static/chunks/app/memory/page-a90ea51b004acc94.js → standalone/.next/static/chunks/app/memory/page-0684ff3ce6888ae7.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/page-bb3f5b9060cdc631.js +1 -0
- package/.next/standalone/.next/static/chunks/app/profiles/page-46a0ad35feda9741.js +1 -0
- package/.next/{static/chunks/app/settings/approvals/page-1fd1b90371c02705.js → standalone/.next/static/chunks/app/settings/approvals/page-6843c585791e4db7.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/settings/artifacts/page-d3fddd43ac1243af.js +1 -0
- package/.next/standalone/.next/static/chunks/app/settings/audit/page-378bee43dd7c4903.js +1 -0
- package/.next/standalone/.next/static/chunks/app/settings/health/page-d34eadc11bc90af5.js +1 -0
- package/.next/standalone/.next/static/chunks/app/settings/mcp-diagnostics/page-3778d2842d5bdd79.js +1 -0
- package/.next/{static/chunks/app/settings/page-5f9f8ba836ac9b7e.js → standalone/.next/static/chunks/app/settings/page-8a40bdf895f43430.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/settings/runs/[id]/page-7837ec57d531ef2b.js +1 -0
- package/.next/{static/chunks/app/settings/runs/page-312bdcd82b1f3a64.js → standalone/.next/static/chunks/app/settings/runs/page-cb4d1617e199c38e.js} +1 -1
- package/.next/{static/chunks/app/settings/telemetry/page-e61a1efd390b87a4.js → standalone/.next/static/chunks/app/settings/telemetry/page-c0446baefa5496cb.js} +1 -1
- package/.next/{static/chunks/app/skills/[id]/page-f65ae8d81a901c1a.js → standalone/.next/static/chunks/app/skills/[id]/page-88bc62488ddf6c10.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/skills/page-e47c6a5f9559edc1.js +1 -0
- package/.next/standalone/.next/static/chunks/framework-f31701c9d93f12a4.js +1 -0
- package/.next/standalone/.next/static/chunks/main-1ac9e0711a0eb944.js +1 -0
- package/.next/{static/chunks/main-app-f0e3f2828aa879c4.js → standalone/.next/static/chunks/main-app-a9e2c007d433eaf9.js} +1 -1
- package/.next/standalone/.next/static/chunks/pages/_app-6c8c2371b16a04b8.js +1 -0
- package/.next/standalone/.next/static/chunks/pages/_error-94812ad32cad7365.js +1 -0
- package/.next/standalone/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/standalone/.next/static/chunks/webpack-0100acb42ec0d4c7.js +1 -0
- package/.next/standalone/.next/static/css/f5a43afa8024b892.css +3 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/package.json +0 -0
- package/.next/standalone/package.json +3 -3
- package/.next/standalone/server.js +1 -1
- package/.next/static/Pqhqpl3ZPqKI0qfvpIPeN/_buildManifest.js +1 -0
- package/.next/static/Pqhqpl3ZPqKI0qfvpIPeN/_ssgManifest.js +1 -0
- package/.next/static/chunks/app/_not-found/page-9c90a6b39424f003.js +1 -0
- package/.next/static/chunks/app/chat/page-117a5b54aee7eae4.js +1 -0
- package/.next/static/chunks/app/extensions/[id]/page-cca6df1771ec04d2.js +1 -0
- package/.next/static/chunks/app/extensions/page-c0fbb8efa9a3700c.js +1 -0
- package/.next/static/chunks/app/layout-0bc970399be389b5.js +1 -0
- package/.next/static/chunks/app/login/page-984e33272681e1e0.js +1 -0
- package/.next/static/chunks/app/memory/page-0684ff3ce6888ae7.js +1 -0
- package/.next/static/chunks/app/profiles/page-46a0ad35feda9741.js +1 -0
- package/.next/static/chunks/app/settings/approvals/page-6843c585791e4db7.js +1 -0
- package/.next/static/chunks/app/settings/artifacts/page-d3fddd43ac1243af.js +1 -0
- package/.next/static/chunks/app/settings/audit/page-378bee43dd7c4903.js +1 -0
- package/.next/static/chunks/app/settings/health/page-d34eadc11bc90af5.js +1 -0
- package/.next/static/chunks/app/settings/mcp-diagnostics/page-3778d2842d5bdd79.js +1 -0
- package/.next/static/chunks/app/settings/page-8a40bdf895f43430.js +1 -0
- package/.next/static/chunks/app/settings/runs/[id]/page-7837ec57d531ef2b.js +1 -0
- package/.next/static/chunks/app/settings/runs/page-cb4d1617e199c38e.js +1 -0
- package/.next/static/chunks/app/settings/telemetry/page-c0446baefa5496cb.js +1 -0
- package/.next/static/chunks/app/skills/[id]/page-88bc62488ddf6c10.js +1 -0
- package/.next/static/chunks/app/skills/page-e47c6a5f9559edc1.js +1 -0
- package/.next/static/chunks/main-app-a9e2c007d433eaf9.js +1 -0
- package/bin/pan-ui.mjs +452 -11
- package/package.json +3 -3
- package/.next/static/chunks/app/chat/page-2bbb44aeac61920e.js +0 -1
- package/.next/static/chunks/app/layout-f3c578dd4202f2f5.js +0 -1
- package/.next/static/chunks/app/login/page-a3820386479beb5e.js +0 -1
- package/.next/static/chunks/app/profiles/page-7b5924f80e882d7e.js +0 -1
- package/.next/static/chunks/app/settings/artifacts/page-35ee6c14a4836aad.js +0 -1
- package/.next/static/chunks/app/settings/audit/page-a11b23ffa1e40949.js +0 -1
- package/.next/static/chunks/app/settings/health/page-9b7914bfd7bf665b.js +0 -1
- package/.next/static/chunks/app/settings/mcp-diagnostics/page-102367ef8b2cc105.js +0 -1
- package/.next/static/chunks/app/settings/runs/[id]/page-d0184e7e90f5867c.js +0 -1
- package/.next/static/chunks/app/skills/page-d480e9f5081fd9b6.js +0 -1
- /package/.next/{static/ocf5CMC3si1YTWJ4rwtKP → standalone/.next/static/Pqhqpl3ZPqKI0qfvpIPeN}/_buildManifest.js +0 -0
- /package/.next/{static/ocf5CMC3si1YTWJ4rwtKP → standalone/.next/static/Pqhqpl3ZPqKI0qfvpIPeN}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7809],{155:(e,s,r)=>{"use strict";r.d(s,{SkillDetail:()=>y});var l=r(5155),t=r(2115),d=r(2619),n=r.n(d),a=r(63),o=r(1613),i=r(9715),c=r(8734);let x=(0,r(1847).A)("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]);var m=r(7726),u=r(6288),p=r(9318);function h(e){let{skill:s,hasActiveSession:r,onInstall:t,onEnableToggle:d,onLoadIntoSession:n,onUninstall:a}=e,o="builtin"!==s.scope;return(0,l.jsxs)("div",{className:"flex flex-wrap gap-2",children:["builtin"===s.scope?(0,l.jsx)("button",{type:"button",onClick:t,className:"rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground",children:o?"Install":"Copy to profile scope"}):null,s.scope&&"builtin"===s.scope?null:(0,l.jsx)("button",{type:"button",onClick:d,className:"rounded-lg border border-border px-4 py-2 text-sm",children:s.enabled?"Disable":"Enable"}),(0,l.jsx)("button",{type:"button",onClick:n,disabled:!r,className:"rounded-lg border border-border px-4 py-2 text-sm disabled:cursor-not-allowed disabled:opacity-50",children:"Load into current session"}),"builtin"!==s.scope?(0,l.jsx)("button",{type:"button",onClick:a,className:"rounded-lg border border-border px-4 py-2 text-sm text-danger",children:"Remove local copy"}):null]})}function b(e){let{content:s,readOnly:r,targetPath:d,scopeLabel:n,onSave:a}=e,[o,i]=(0,t.useState)(s),[c,x]=(0,t.useState)(!1);(0,t.useEffect)(()=>{i(s)},[s]);let m=o!==s,u=(0,t.useMemo)(()=>o.split("\n").length,[o]);return(0,l.jsxs)("div",{className:"space-y-3",children:[(0,l.jsxs)("div",{className:"rounded-xl border border-border bg-background p-3 text-xs text-muted-foreground",children:[(0,l.jsxs)("p",{children:[(0,l.jsx)("strong",{children:"Edit mode:"})," ",r?"Read-only until copied into profile scope.":"Saving writes the local SKILL.md file directly."]}),n?(0,l.jsxs)("p",{className:"mt-1",children:[(0,l.jsx)("strong",{children:"Target scope:"})," ",n]}):null,d?(0,l.jsxs)("p",{className:"mt-1 break-all",children:[(0,l.jsx)("strong",{children:"Target path:"})," ",d]}):null,(0,l.jsxs)("p",{className:"mt-1",children:[(0,l.jsx)("strong",{children:"Validation:"})," YAML frontmatter and body content are checked before save."]})]}),(0,l.jsx)("textarea",{value:o,onChange:e=>i(e.target.value),readOnly:r,className:"min-h-72 w-full rounded-2xl border border-border bg-card p-4 font-mono text-sm outline-none focus:border-primary"}),(0,l.jsxs)("div",{className:"flex items-center justify-between gap-4",children:[(0,l.jsxs)("p",{className:"text-xs text-muted-foreground",children:[u," lines ",m?"\xb7 unsaved changes":"\xb7 no local changes"]}),(0,l.jsx)("button",{type:"button",onClick:async()=>{x(!0);try{await a(o)}finally{x(!1)}},disabled:r||!m||c,className:"rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground disabled:cursor-not-allowed disabled:opacity-50",children:c?"Saving…":"Save skill"})]})]})}var g=r(685),f=r(2604);function j(e){let{skillId:s,filePath:r}=e,t=(0,p.Qc)(s,r);return t.isLoading?(0,l.jsxs)("div",{className:"rounded-xl border border-border/70 bg-background/60 p-4 text-sm text-muted-foreground",children:["Loading ",r,"…"]}):t.error||!t.data?(0,l.jsxs)("div",{className:"rounded-xl border border-danger/30 bg-danger/5 p-4 text-sm text-muted-foreground",children:["Failed to load ",r]}):(0,l.jsxs)("div",{className:"rounded-xl border border-border/70 bg-background/60",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2 border-b border-border/50 px-4 py-2 text-xs text-muted-foreground",children:[(0,l.jsx)(o.A,{className:"h-3.5 w-3.5"}),(0,l.jsx)("span",{className:"font-medium text-foreground",children:r}),(0,l.jsxs)("span",{className:"ml-auto",children:[t.data.content.split("\n").length," lines"]})]}),(0,l.jsx)("pre",{className:"max-h-[400px] overflow-auto px-4 py-3 text-xs leading-6",children:(0,l.jsx)("code",{children:t.data.content})})]})}let N={references:(0,l.jsx)(i.A,{className:"h-3.5 w-3.5"}),templates:(0,l.jsx)(c.A,{className:"h-3.5 w-3.5"}),scripts:(0,l.jsx)(x,{className:"h-3.5 w-3.5"}),assets:(0,l.jsx)(o.A,{className:"h-3.5 w-3.5"})};function y(e){var s,r,d,i,x,y,v;let{skillId:k}=e,w=(0,a.useRouter)(),S=(0,a.useSearchParams)().get("session"),I=(0,p.Pt)(k),L=(0,p.I3)(),A=(0,p.aO)(),C=(0,p.b_)(),P=(0,p.F8)(),O=(0,p.hL)(),{activeSessionId:E,setActiveSessionId:R,rememberLoadedSkillInSession:_}=(0,f.j)(),T=null!=S?S:E,[U,V]=(0,t.useState)(null);(0,t.useEffect)(()=>{S&&(S!==E&&R(S),w.replace("/skills/".concat(k),{scroll:!1}))},[E,S,w,R,k]);let F=(0,u.wV)(T);if(I.isLoading||!I.data)return(0,l.jsx)("div",{className:"p-4 text-sm text-muted-foreground lg:p-6",children:"Loading skill…"});let q=I.data,D=!!(null==(r=F.data)||null==(s=r.loadedSkillIds)?void 0:s.includes(q.id)),J="builtin"===q.scope,K={};for(let e of null!=(y=q.linkedFiles)?y:[])K[e.group]||(K[e.group]=[]),K[e.group].push(e);return(0,l.jsxs)("div",{className:"h-full overflow-y-auto space-y-6 p-4 lg:p-6",children:[(0,l.jsx)(n(),{href:T?"/skills?session=".concat(encodeURIComponent(T)):"/skills",className:"text-sm text-muted-foreground hover:text-foreground",children:"← Back to Skills"}),(0,l.jsxs)("div",{className:"space-y-3",children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs text-muted-foreground",children:[(0,l.jsx)("span",{className:"rounded-full border border-border px-2 py-1",children:(0,g.VJ)(q.scope,q.ownerProfileId)}),(0,l.jsx)("span",{className:"rounded-full border border-border px-2 py-1",children:(0,g.CV)(q.provenance)}),(0,l.jsxs)("span",{className:"rounded-full border border-border px-2 py-1",children:["v",null!=(v=q.version)?v:"unversioned"]}),(0,l.jsx)("span",{className:"rounded-full border border-border px-2 py-1",children:q.enabled?"Enabled":"Disabled"}),D?(0,l.jsx)("span",{className:"rounded-full bg-primary/10 px-2 py-1 text-foreground",children:"Loaded in current session"}):null,q.category?(0,l.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full border border-primary/20 bg-primary/5 px-2 py-1",children:[(0,l.jsx)(c.A,{className:"h-3 w-3"}),q.category]}):null,q.author?(0,l.jsxs)("span",{className:"rounded-full border border-border px-2 py-1",children:["by ",q.author]}):null]}),(0,l.jsx)("h1",{className:"text-2xl font-semibold",children:q.name}),(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:q.description}),q.tags&&q.tags.length>0?(0,l.jsx)("div",{className:"flex flex-wrap gap-1.5",children:q.tags.map(e=>(0,l.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-lg bg-primary/8 px-2 py-1 text-xs text-muted-foreground",children:[(0,l.jsx)(m.A,{className:"h-3 w-3"}),e]},e))}):null,(0,l.jsx)(h,{skill:q,hasActiveSession:!!T,onInstall:()=>void L.mutateAsync(q.id),onEnableToggle:()=>void A.mutateAsync({skillId:q.id,enabled:!q.enabled}),onLoadIntoSession:()=>{T&&(R(T),_(T,q.id),w.replace("/skills/".concat(k,"?session=").concat(encodeURIComponent(T),"&loadedSkill=").concat(encodeURIComponent(q.id)),{scroll:!1}),P.mutateAsync({skillId:q.id,sessionId:T}))},onUninstall:()=>void O.mutateAsync(q.id)}),T?(0,l.jsxs)("p",{className:"text-xs text-muted-foreground",children:["Current chat session available: ",T,D?" \xb7 skill already loaded":""]}):(0,l.jsx)("p",{className:"text-xs text-muted-foreground",children:"Open Chat and select a session before loading a skill into it."})]}),(0,l.jsxs)("section",{className:"grid gap-4 xl:grid-cols-[1.2fr_0.8fr]",children:[(0,l.jsxs)("div",{className:"space-y-4",children:[(0,l.jsxs)("div",{className:"rounded-2xl border border-border bg-card p-5 shadow-sm",children:[(0,l.jsx)("h2",{className:"text-lg font-semibold",children:"Skill source"}),(0,l.jsxs)("p",{className:"mt-1 text-sm text-muted-foreground",children:["SKILL.md — ",q.content.split("\n").length," lines",q.filePath?" \xb7 ".concat(q.filePath):""]}),(0,l.jsx)("div",{className:"mt-4",children:(0,l.jsx)(b,{content:q.content,readOnly:J,targetPath:q.filePath,scopeLabel:(0,g.VJ)(q.scope,q.ownerProfileId),onSave:async e=>{await C.mutateAsync({skillId:q.id,content:e})}})})]}),Object.keys(K).length>0?(0,l.jsxs)("div",{className:"rounded-2xl border border-border bg-card p-5 shadow-sm",children:[(0,l.jsx)("h2",{className:"text-lg font-semibold",children:"Linked files"}),(0,l.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"Supporting references, templates, and scripts bundled with this skill."}),(0,l.jsx)("div",{className:"mt-4 space-y-3",children:Object.entries(K).map(e=>{var s;let[r,t]=e;return(0,l.jsxs)("div",{children:[(0,l.jsxs)("div",{className:"flex items-center gap-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:[null!=(s=N[r])?s:(0,l.jsx)(o.A,{className:"h-3.5 w-3.5"}),r," (",t.length,")"]}),(0,l.jsx)("div",{className:"mt-2 flex flex-wrap gap-2",children:t.map(e=>(0,l.jsx)("button",{type:"button",onClick:()=>V(U===e.path?null:e.path),className:"rounded-lg border px-3 py-1.5 text-xs font-medium transition ".concat(U===e.path?"border-primary/40 bg-primary/10 text-foreground":"border-border/60 text-muted-foreground hover:bg-muted/40"),children:e.name},e.path))})]},r)})}),U?(0,l.jsx)("div",{className:"mt-4",children:(0,l.jsx)(j,{skillId:k,filePath:U})}):null]}):null]}),(0,l.jsxs)("div",{className:"space-y-4",children:[(0,l.jsxs)("section",{className:"rounded-2xl border border-border bg-card p-5 shadow-sm",children:[(0,l.jsx)("h2",{className:"text-lg font-semibold",children:"Session impact"}),(0,l.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:"Skills attach reusable instructions and can imply tool requirements for the current workspace."}),(0,l.jsxs)("div",{className:"mt-4 space-y-2 text-sm text-muted-foreground",children:[(0,l.jsxs)("p",{children:[(0,l.jsx)("strong",{className:"text-foreground",children:"Owner:"})," ",(0,g.VJ)(q.scope,q.ownerProfileId)]}),(0,l.jsxs)("p",{children:[(0,l.jsx)("strong",{className:"text-foreground",children:"Updated:"})," ",q.updatedAt?new Date(q.updatedAt).toLocaleString():"Unknown"]}),(0,l.jsxs)("p",{children:[(0,l.jsx)("strong",{className:"text-foreground",children:"Loaded sessions:"})," ",(null==(d=q.loadedInSessions)?void 0:d.length)?q.loadedInSessions.join(", "):"None recorded yet"]}),(null==(i=q.linkedFiles)?void 0:i.length)?(0,l.jsxs)("p",{children:[(0,l.jsx)("strong",{className:"text-foreground",children:"Linked files:"})," ",q.linkedFiles.length," (",Object.entries(K).map(e=>{let[s,r]=e;return"".concat(r.length," ").concat(s)}).join(", "),")"]}):null]})]}),(0,l.jsxs)("section",{className:"rounded-2xl border border-border bg-card p-5 shadow-sm",children:[(0,l.jsx)("h2",{className:"text-lg font-semibold",children:"Tool expectations"}),(0,l.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:"Rendered only from available metadata. No capability assumptions are fabricated."}),(0,l.jsx)("div",{className:"mt-4 flex flex-wrap gap-2",children:((null==(x=q.impliedTools)?void 0:x.length)?q.impliedTools:["No declared tool dependencies"]).map(e=>(0,l.jsx)("span",{className:"rounded-full border border-border px-2 py-1 text-xs text-muted-foreground",children:e},e))})]}),q.relatedSkills&&q.relatedSkills.length>0?(0,l.jsxs)("section",{className:"rounded-2xl border border-border bg-card p-5 shadow-sm",children:[(0,l.jsx)("h2",{className:"text-lg font-semibold",children:"Related skills"}),(0,l.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:q.relatedSkills.map(e=>(0,l.jsx)(n(),{href:"/skills/".concat(e),className:"rounded-lg border border-border/60 px-3 py-1.5 text-xs font-medium text-muted-foreground transition hover:bg-muted/40 hover:text-foreground",children:e},e))})]}):null]})]})]})}},4609:(e,s,r)=>{Promise.resolve().then(r.bind(r,1935)),Promise.resolve().then(r.bind(r,594)),Promise.resolve().then(r.bind(r,6981)),Promise.resolve().then(r.bind(r,155))}},e=>{e.O(0,[2231,5449,4879,9657,1309,8441,1255,7358],()=>e(e.s=4609)),_N_E=e.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9501],{5269:(e,t,r)=>{Promise.resolve().then(r.bind(r,1935)),Promise.resolve().then(r.bind(r,594)),Promise.resolve().then(r.bind(r,6981)),Promise.resolve().then(r.bind(r,8211))},7910:(e,t,r)=>{"use strict";r.d(t,{A:()=>l});let l=(0,r(1847).A)("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]])},8211:(e,t,r)=>{"use strict";r.d(t,{SkillsScreen:()=>I});var l=r(5155),s=r(2115),a=r(63),n=r(6907),d=r(7910),o=r(7801),i=r(1847);let c=(0,i.A)("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]),u=(0,i.A)("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);var m=r(9068);let x=(0,i.A)("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]);var p=r(6651),g=r(5229),h=r(8734),f=r(8584),b=r(2619),y=r.n(b),j=r(7726),v=r(1613),N=r(685);function k(e){var t;let{skill:r,loadedInCurrentSession:s=!1,sessionId:a}=e,n=a?"/skills/".concat(r.id,"?session=").concat(encodeURIComponent(a)):"/skills/".concat(r.id),d=null==(t=r.linkedFiles)?void 0:t.reduce((e,t)=>(e[t.group]=(e[t.group]||0)+1,e),{});return(0,l.jsxs)(y(),{href:n,"aria-label":r.id,className:"block rounded-2xl border border-border/70 bg-card p-4 shadow-sm transition hover:-translate-y-0.5 hover:bg-muted/40 hover:shadow-md",children:[(0,l.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,l.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("h3",{className:"truncate text-sm font-semibold",children:r.name}),r.category?(0,l.jsxs)("span",{className:"hidden shrink-0 items-center gap-1 rounded-md bg-muted/60 px-1.5 py-0.5 text-3xs text-muted-foreground sm:inline-flex",children:[(0,l.jsx)(h.A,{className:"h-2.5 w-2.5"}),r.category]}):null]}),(0,l.jsx)("p",{className:"mt-1 line-clamp-2 text-xs leading-5 text-muted-foreground",children:r.description})]}),(0,l.jsxs)("div",{className:"space-y-1.5 text-right text-3xs",children:[(0,l.jsx)("p",{className:"rounded-full border border-border/60 px-2 py-0.5",children:(0,N.VJ)(r.scope,r.ownerProfileId)}),(0,l.jsx)("p",{className:"rounded-full border border-border/60 px-2 py-0.5",children:(0,N.CV)(r.provenance)})]})]}),r.tags&&r.tags.length>0?(0,l.jsxs)("div",{className:"mt-2 flex flex-wrap gap-1",children:[r.tags.slice(0,4).map(e=>(0,l.jsxs)("span",{className:"inline-flex items-center gap-0.5 rounded-md bg-primary/8 px-1.5 py-0.5 text-3xs text-muted-foreground",children:[(0,l.jsx)(j.A,{className:"h-2 w-2"}),e]},e)),r.tags.length>4?(0,l.jsxs)("span",{className:"rounded-md bg-muted/50 px-1.5 py-0.5 text-3xs text-muted-foreground",children:["+",r.tags.length-4]}):null]}):null,(0,l.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-1.5 text-xs",children:[(0,l.jsx)("span",{className:"rounded-full px-2 py-0.5 ".concat(r.enabled?"bg-success/15 text-foreground":"bg-muted text-muted-foreground"),children:r.enabled?"Enabled":r.installed?"Installed":"Available"}),s?(0,l.jsx)("span",{className:"rounded-full bg-primary/10 px-2 py-0.5 text-foreground",children:"Loaded"}):null,d&&Object.keys(d).length>0?(0,l.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full border border-border/50 px-2 py-0.5 text-muted-foreground",children:[(0,l.jsx)(v.A,{className:"h-3 w-3"}),Object.entries(d).map(e=>{let[t,r]=e;return"".concat(r," ").concat(t)}).join(", ")]}):null,r.updatedAt?(0,l.jsx)("span",{className:"rounded-full border border-border/50 px-2 py-0.5 text-muted-foreground",children:new Date(r.updatedAt).toLocaleDateString()}):null]})]})}var w=r(9318),A=r(2604);function C(e){let{level:t}=e;return"trusted"===t?(0,l.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full bg-emerald-500/15 px-2 py-0.5 text-3xs font-medium text-emerald-400",children:[(0,l.jsx)(n.A,{className:"h-2.5 w-2.5"}),"Trusted"]}):"official"===t?(0,l.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full bg-blue-500/15 px-2 py-0.5 text-3xs font-medium text-blue-400",children:[(0,l.jsx)(d.A,{className:"h-2.5 w-2.5"}),"Official"]}):(0,l.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full bg-amber-500/15 px-2 py-0.5 text-3xs font-medium text-amber-400",children:[(0,l.jsx)(o.A,{className:"h-2.5 w-2.5"}),"Community"]})}function S(e){let{audits:t}=e;return t?(0,l.jsx)("div",{className:"flex gap-1",children:Object.entries(t).map(e=>{let[t,r]=e;return(0,l.jsxs)("span",{className:"rounded-full px-1.5 py-0.5 text-[9px] font-medium ".concat("Pass"===r?"bg-emerald-500/15 text-emerald-400":"Warn"===r?"bg-amber-500/15 text-amber-400":"bg-red-500/15 text-red-400"),children:[t,": ",r]},t)})}):null}function L(e){var t,r;let{skill:s,onInstall:a,installing:n}=e;return(0,l.jsxs)("div",{className:"flex flex-col rounded-2xl border border-border/70 bg-card p-4 shadow-sm transition hover:-translate-y-0.5 hover:shadow-md",children:[(0,l.jsxs)("div",{className:"flex items-start justify-between gap-2",children:[(0,l.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("h3",{className:"truncate text-sm font-semibold",children:s.name}),(0,l.jsx)(C,{level:s.trustLevel})]}),(0,l.jsx)("p",{className:"mt-0.5 text-2xs text-muted-foreground",children:s.repo})]}),null!=s.installs?(0,l.jsxs)("span",{className:"shrink-0 rounded-lg bg-muted/50 px-2 py-0.5 text-3xs text-muted-foreground",children:[(0,l.jsx)(c,{className:"mr-0.5 inline h-2.5 w-2.5"}),s.installs.toLocaleString()]}):null]}),(0,l.jsx)("p",{className:"mt-2 line-clamp-3 flex-1 text-xs leading-5 text-muted-foreground",children:(null==(t=s.detail)?void 0:t.summary)||s.description}),(null==(r=s.detail)?void 0:r.securityAudits)?(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)(S,{audits:s.detail.securityAudits})}):null,(0,l.jsxs)("div",{className:"mt-3 flex items-center gap-2",children:[(0,l.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),a()},disabled:n,className:"rounded-xl bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground shadow-sm transition hover:opacity-90 disabled:opacity-50",children:n?"Installing…":"Install"}),s.detailUrl?(0,l.jsxs)("a",{href:s.detailUrl,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 rounded-xl border border-border/50 px-2.5 py-1.5 text-xs text-muted-foreground transition hover:bg-muted/40",onClick:e=>e.stopPropagation(),children:[(0,l.jsx)(u,{className:"h-3 w-3"}),"skills.sh"]}):null,s.repoUrl?(0,l.jsxs)("a",{href:s.repoUrl,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 rounded-xl border border-border/50 px-2.5 py-1.5 text-xs text-muted-foreground transition hover:bg-muted/40",onClick:e=>e.stopPropagation(),children:[(0,l.jsx)(m.A,{className:"h-3 w-3"}),"Repo"]}):null]})]})}function I(){var e,t,r,n,d,o;let i=(0,a.useRouter)(),c=(0,a.useSearchParams)().get("session"),[u,m]=(0,s.useState)("installed"),[b,y]=(0,s.useState)(null),[j,v]=(0,s.useState)(""),[N,C]=(0,s.useState)(""),[S,I]=(0,s.useState)(""),M=(0,w.a$)("installed"===u),P=(0,w.$P)(),_=(0,w.vb)(N||void 0),F=(0,w.jM)(),[D,E]=(0,s.useState)(null),{selectedProfileId:O,activeSessionId:U,setActiveSessionId:q}=(0,A.j)();(0,s.useEffect)(()=>{c&&(c!==U&&q(c),i.replace("/skills",{scroll:!1}))},[U,c,i,q]);let z=(0,f.Ux)(O,null!=c?c:U),T=new Set((null==(t=z.data)||null==(e=t.loadedSkillIds)?void 0:e.length)?z.data.loadedSkillIds:["skill-authoring"]),V=null!=(d=M.data)?d:[],R=(0,s.useMemo)(()=>{var e;let t=new Set;for(let e of V)e.category&&t.add(e.category);for(let r of null!=(e=P.data)?e:[])t.add(r);return Array.from(t).sort()},[V,P.data]),H=(0,s.useMemo)(()=>{let e=V;if(b&&(e=e.filter(e=>e.category===b)),j.trim()){let t=j.toLowerCase();e=e.filter(e=>{var r,l;return e.name.toLowerCase().includes(t)||e.description.toLowerCase().includes(t)||(null==(r=e.tags)?void 0:r.some(e=>e.toLowerCase().includes(t)))||(null==(l=e.category)?void 0:l.toLowerCase().includes(t))})}return e},[V,b,j]),$=null!=(o=null==(r=_.data)?void 0:r.skills)?o:[],B=V.filter(e=>e.enabled).length,G=V.filter(e=>e.linkedFiles&&e.linkedFiles.length>0).length;async function J(e){E(e.id);try{await F.mutateAsync({identifier:e.identifier})}finally{E(null)}}return(0,l.jsxs)("div",{className:"h-full overflow-y-auto space-y-5 p-4 pb-8 lg:p-6 lg:pb-10",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("h1",{className:"text-2xl font-semibold",children:"Skills"}),(0,l.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:"installed"===u?(0,l.jsxs)(l.Fragment,{children:["Browse ",V.length," installed skills across ",R.length," categories.",B>0?" ".concat(B," enabled."):"",G>0?" ".concat(G," include references, scripts, or templates."):""]}):(0,l.jsxs)(l.Fragment,{children:["Discover skills from skills.sh and other registries. ",$.length," available to install",(null==(n=_.data)?void 0:n.total)?" (".concat(_.data.total," total, ").concat(_.data.total-$.length," already installed)"):"","."]})})]}),(0,l.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,l.jsxs)("div",{className:"flex gap-2",children:[(0,l.jsxs)("button",{type:"button",onClick:()=>m("installed"),className:"rounded-xl px-4 py-2 text-sm font-medium transition ".concat("installed"===u?"bg-primary text-primary-foreground shadow-sm":"border border-border/70 text-muted-foreground hover:bg-card"),children:["Installed (",V.length,")"]}),(0,l.jsxs)("button",{type:"button",onClick:()=>m("discover"),className:"rounded-xl px-4 py-2 text-sm font-medium transition ".concat("discover"===u?"bg-primary text-primary-foreground shadow-sm":"border border-border/70 text-muted-foreground hover:bg-card"),children:[(0,l.jsx)(x,{className:"mr-1 inline h-3.5 w-3.5"}),"Discover"]})]}),"installed"===u?(0,l.jsxs)("div",{className:"relative flex-1 min-w-[200px] max-w-md",children:[(0,l.jsx)(p.A,{className:"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"}),(0,l.jsx)("input",{type:"text",placeholder:"Search skills by name, tag, or category…",value:j,onChange:e=>v(e.target.value),className:"w-full rounded-xl border border-border/70 bg-background/80 py-2 pl-9 pr-8 text-sm outline-none placeholder:text-muted-foreground focus:ring-2 focus:ring-primary/30"}),j?(0,l.jsx)("button",{type:"button",onClick:()=>v(""),className:"absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground",children:(0,l.jsx)(g.A,{className:"h-4 w-4"})}):null]}):(0,l.jsxs)("form",{className:"relative flex-1 min-w-[200px] max-w-md",onSubmit:e=>{e.preventDefault(),C(S)},children:[(0,l.jsx)(p.A,{className:"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"}),(0,l.jsx)("input",{type:"text",placeholder:"Search skills.sh (e.g. kubernetes, react, python)…",value:S,onChange:e=>I(e.target.value),className:"w-full rounded-xl border border-border/70 bg-background/80 py-2 pl-9 pr-8 text-sm outline-none placeholder:text-muted-foreground focus:ring-2 focus:ring-primary/30"}),S?(0,l.jsx)("button",{type:"button",onClick:()=>{I(""),C("")},className:"absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground",children:(0,l.jsx)(g.A,{className:"h-4 w-4"})}):null]})]}),"installed"===u?(0,l.jsxs)(l.Fragment,{children:[R.length>0?(0,l.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,l.jsx)(h.A,{className:"h-4 w-4 text-muted-foreground"}),(0,l.jsx)("button",{type:"button",onClick:()=>y(null),className:"rounded-lg px-3 py-1 text-xs font-medium transition ".concat(b?"border border-border/50 text-muted-foreground hover:bg-card":"bg-primary/15 text-foreground ring-1 ring-primary/30"),children:"All"}),R.map(e=>{let t=V.filter(t=>t.category===e).length;return(0,l.jsxs)("button",{type:"button",onClick:()=>y(b===e?null:e),className:"rounded-lg px-3 py-1 text-xs font-medium transition ".concat(b===e?"bg-primary/15 text-foreground ring-1 ring-primary/30":"border border-border/50 text-muted-foreground hover:bg-card"),children:[e," (",t,")"]},e)})]}):null,M.isLoading?(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading skill data…"}):null,T.size?(0,l.jsxs)("div",{className:"rounded-2xl border border-border/70 bg-card/80 p-3 text-sm text-muted-foreground",children:[(0,l.jsx)("span",{className:"font-medium text-foreground",children:"Loaded in current session:"}),(0,l.jsx)("span",{className:"ml-2",children:Array.from(T).join(", ")})]}):null,M.isLoading||0!==H.length?null:(0,l.jsx)("div",{className:"rounded-2xl border border-dashed border-border/70 bg-card/60 p-5 text-sm text-muted-foreground",children:j||b?'No skills match "'.concat(j||b,'". Try a different filter.'):"No installed skills were detected for the current runtime/profile scope."}),(0,l.jsx)("div",{className:"grid gap-4 md:grid-cols-2 xl:grid-cols-3",children:H.map(e=>(0,l.jsx)(k,{skill:e,loadedInCurrentSession:T.has(e.id),sessionId:null!=c?c:U},e.id))})]}):null,"discover"===u?(0,l.jsxs)(l.Fragment,{children:[_.isLoading?(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:"Searching skills.sh…"}):null,_.isLoading||0!==$.length?null:(0,l.jsx)("div",{className:"rounded-2xl border border-dashed border-border/70 bg-card/60 p-5 text-sm text-muted-foreground",children:N?'No skills found for "'.concat(N,'". Try a different search term.'):"No discoverable skills found. The skills.sh cache may need to be populated — run `hermes skills browse` in your terminal."}),(0,l.jsx)("div",{className:"grid gap-4 md:grid-cols-2 xl:grid-cols-3",children:$.map(e=>(0,l.jsx)(L,{skill:e,onInstall:()=>J(e),installing:D===e.id},e.id))})]}):null]})}},9068:(e,t,r)=>{"use strict";r.d(t,{A:()=>l});let l=(0,r(1847).A)("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]])}},e=>{e.O(0,[2231,5449,4879,9657,1309,8441,1255,7358],()=>e(e.s=5269)),_N_E=e.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7358],{3033:(e,s,n)=>{Promise.resolve().then(n.t.bind(n,7150,23)),Promise.resolve().then(n.t.bind(n,1959,23)),Promise.resolve().then(n.t.bind(n,7989,23)),Promise.resolve().then(n.t.bind(n,3886,23)),Promise.resolve().then(n.t.bind(n,9766,23)),Promise.resolve().then(n.t.bind(n,5278,23)),Promise.resolve().then(n.t.bind(n,8924,23)),Promise.resolve().then(n.t.bind(n,4431,23)),Promise.resolve().then(n.bind(n,622))},9393:()=>{}},e=>{var s=s=>e(e.s=s);e.O(0,[8441,1255],()=>(s(1666),s(3033))),_N_E=e.O()}]);
|
package/bin/pan-ui.mjs
CHANGED
|
@@ -4,17 +4,23 @@
|
|
|
4
4
|
* pan-ui — CLI launcher with interactive setup wizard.
|
|
5
5
|
*
|
|
6
6
|
* Usage:
|
|
7
|
-
* npx pan-ui
|
|
8
|
-
* npx pan-ui
|
|
9
|
-
* npx pan-ui
|
|
7
|
+
* npx pan-ui # start foreground (runs setup on first launch)
|
|
8
|
+
* npx pan-ui --daemon # start in background (daemonize)
|
|
9
|
+
* npx pan-ui stop # stop background daemon
|
|
10
|
+
* npx pan-ui status # check if daemon is running
|
|
11
|
+
* npx pan-ui logs # tail daemon log output
|
|
12
|
+
* npx pan-ui setup # re-run setup wizard
|
|
13
|
+
* npx pan-ui service install # install systemd user service
|
|
14
|
+
* npx pan-ui service remove # remove systemd user service
|
|
15
|
+
* npx pan-ui --port 8080 # custom port
|
|
10
16
|
*/
|
|
11
17
|
|
|
12
18
|
import { createInterface } from 'node:readline';
|
|
13
|
-
import { existsSync, readFileSync, writeFileSync, mkdirSync, statSync, readdirSync } from 'node:fs';
|
|
19
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, statSync, readdirSync, unlinkSync, openSync } from 'node:fs';
|
|
14
20
|
import { resolve, join, dirname } from 'node:path';
|
|
15
21
|
import { execSync, spawn, execFileSync } from 'node:child_process';
|
|
16
22
|
import { fileURLToPath } from 'node:url';
|
|
17
|
-
import { homedir } from 'node:os';
|
|
23
|
+
import { homedir, platform } from 'node:os';
|
|
18
24
|
import crypto from 'node:crypto';
|
|
19
25
|
|
|
20
26
|
// ─── Paths ──────────────────────────────────────────────────────────────────
|
|
@@ -23,6 +29,9 @@ const __filename = fileURLToPath(import.meta.url);
|
|
|
23
29
|
const __dirname = dirname(__filename);
|
|
24
30
|
const PKG_ROOT = resolve(__dirname, '..');
|
|
25
31
|
const ENV_PATH = join(PKG_ROOT, '.env.local');
|
|
32
|
+
const RUN_DIR = join(homedir(), '.pan-ui');
|
|
33
|
+
const PID_FILE = join(RUN_DIR, 'pan-ui.pid');
|
|
34
|
+
const LOG_FILE = join(RUN_DIR, 'pan-ui.log');
|
|
26
35
|
|
|
27
36
|
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
28
37
|
|
|
@@ -306,6 +315,47 @@ function findStandaloneServer() {
|
|
|
306
315
|
return null;
|
|
307
316
|
}
|
|
308
317
|
|
|
318
|
+
/**
|
|
319
|
+
* Patch required-server-files.json so the standalone build can find its
|
|
320
|
+
* assets regardless of where npm installed the package. The build bakes
|
|
321
|
+
* in the absolute path of the *build* machine — we rewrite it to the
|
|
322
|
+
* current installation path at startup.
|
|
323
|
+
*/
|
|
324
|
+
function patchStandalonePaths() {
|
|
325
|
+
const rsfPath = join(PKG_ROOT, '.next', 'standalone', '.next', 'required-server-files.json');
|
|
326
|
+
if (!existsSync(rsfPath)) return;
|
|
327
|
+
|
|
328
|
+
try {
|
|
329
|
+
const raw = readFileSync(rsfPath, 'utf-8');
|
|
330
|
+
const data = JSON.parse(raw);
|
|
331
|
+
let changed = false;
|
|
332
|
+
|
|
333
|
+
const standaloneDir = join(PKG_ROOT, '.next', 'standalone');
|
|
334
|
+
|
|
335
|
+
if (data.appDir && data.appDir !== standaloneDir) {
|
|
336
|
+
data.appDir = standaloneDir;
|
|
337
|
+
data.relativeAppDir = '';
|
|
338
|
+
changed = true;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
if (data.config?.outputFileTracingRoot && data.config.outputFileTracingRoot !== standaloneDir) {
|
|
342
|
+
data.config.outputFileTracingRoot = standaloneDir;
|
|
343
|
+
changed = true;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
if (data.config?.turbopack?.root && data.config.turbopack.root !== standaloneDir) {
|
|
347
|
+
data.config.turbopack.root = standaloneDir;
|
|
348
|
+
changed = true;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if (changed) {
|
|
352
|
+
writeFileSync(rsfPath, JSON.stringify(data), 'utf-8');
|
|
353
|
+
}
|
|
354
|
+
} catch {
|
|
355
|
+
// Non-fatal — server may still work without the patch
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
309
359
|
function startServer(env, portOverride) {
|
|
310
360
|
const port = portOverride || env.PORT || '3199';
|
|
311
361
|
|
|
@@ -322,6 +372,7 @@ function startServer(env, portOverride) {
|
|
|
322
372
|
|
|
323
373
|
if (standaloneServer) {
|
|
324
374
|
// Standalone mode — shipped as npm package
|
|
375
|
+
patchStandalonePaths();
|
|
325
376
|
startBanner(port);
|
|
326
377
|
const child = spawn('node', [standaloneServer], {
|
|
327
378
|
cwd: join(PKG_ROOT, '.next', 'standalone'),
|
|
@@ -354,6 +405,324 @@ function startServer(env, portOverride) {
|
|
|
354
405
|
}
|
|
355
406
|
}
|
|
356
407
|
|
|
408
|
+
// ─── Daemon management ───────────────────────────────────────────────────────
|
|
409
|
+
|
|
410
|
+
function ensureRunDir() {
|
|
411
|
+
if (!existsSync(RUN_DIR)) mkdirSync(RUN_DIR, { recursive: true });
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
function readPid() {
|
|
415
|
+
if (!existsSync(PID_FILE)) return null;
|
|
416
|
+
const pid = parseInt(readFileSync(PID_FILE, 'utf-8').trim(), 10);
|
|
417
|
+
if (isNaN(pid)) return null;
|
|
418
|
+
return pid;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
function isProcessRunning(pid) {
|
|
422
|
+
try {
|
|
423
|
+
process.kill(pid, 0); // signal 0 = check existence
|
|
424
|
+
return true;
|
|
425
|
+
} catch {
|
|
426
|
+
return false;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
function getDaemonStatus() {
|
|
431
|
+
const pid = readPid();
|
|
432
|
+
if (!pid) return { running: false, pid: null };
|
|
433
|
+
if (isProcessRunning(pid)) return { running: true, pid };
|
|
434
|
+
// Stale PID file
|
|
435
|
+
try { unlinkSync(PID_FILE); } catch {}
|
|
436
|
+
return { running: false, pid: null };
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
function startDaemon(env, portOverride) {
|
|
440
|
+
const { running, pid: existingPid } = getDaemonStatus();
|
|
441
|
+
if (running) {
|
|
442
|
+
console.log(` ${yellow('!')} Pan UI is already running (PID ${existingPid})`);
|
|
443
|
+
console.log(` ${dim('Stop with:')} ${cyan('npx pan-ui stop')}`);
|
|
444
|
+
process.exit(0);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
ensureRunDir();
|
|
448
|
+
|
|
449
|
+
const port = portOverride || env.PORT || '3199';
|
|
450
|
+
const serverEnv = {
|
|
451
|
+
...process.env,
|
|
452
|
+
...env,
|
|
453
|
+
PORT: port,
|
|
454
|
+
NODE_ENV: 'production',
|
|
455
|
+
HOSTNAME: '0.0.0.0',
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
const standaloneServer = findStandaloneServer();
|
|
459
|
+
let cmd, cmdArgs, cwd;
|
|
460
|
+
|
|
461
|
+
if (standaloneServer) {
|
|
462
|
+
patchStandalonePaths();
|
|
463
|
+
cmd = process.execPath; // node
|
|
464
|
+
cmdArgs = [standaloneServer];
|
|
465
|
+
cwd = join(PKG_ROOT, '.next', 'standalone');
|
|
466
|
+
} else {
|
|
467
|
+
const hasProductionBuild = existsSync(join(PKG_ROOT, '.next', 'BUILD_ID'));
|
|
468
|
+
const nextCmd = hasProductionBuild ? 'start' : 'dev';
|
|
469
|
+
cmd = 'npx';
|
|
470
|
+
cmdArgs = ['next', nextCmd, '-p', port];
|
|
471
|
+
cwd = PKG_ROOT;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// Open log file for stdout/stderr
|
|
475
|
+
const logFd = openSync(LOG_FILE, 'a');
|
|
476
|
+
|
|
477
|
+
const child = spawn(cmd, cmdArgs, {
|
|
478
|
+
cwd,
|
|
479
|
+
env: serverEnv,
|
|
480
|
+
detached: true,
|
|
481
|
+
stdio: ['ignore', logFd, logFd],
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
child.unref();
|
|
485
|
+
|
|
486
|
+
writeFileSync(PID_FILE, String(child.pid), 'utf-8');
|
|
487
|
+
|
|
488
|
+
console.log('');
|
|
489
|
+
console.log(bold(' ╔══════════════════════════════════════════╗'));
|
|
490
|
+
console.log(bold(' ║') + green(' ⚡ Pan UI started (daemon) ') + bold('║'));
|
|
491
|
+
console.log(bold(' ╚══════════════════════════════════════════╝'));
|
|
492
|
+
console.log('');
|
|
493
|
+
console.log(` ${dim('PID:')} ${cyan(String(child.pid))}`);
|
|
494
|
+
console.log(` ${dim('Local:')} ${cyan(`http://localhost:${port}`)}`);
|
|
495
|
+
console.log(` ${dim('Log:')} ${cyan(LOG_FILE)}`);
|
|
496
|
+
console.log('');
|
|
497
|
+
console.log(` ${dim('Stop with:')} ${cyan('npx pan-ui stop')}`);
|
|
498
|
+
console.log(` ${dim('View logs:')} ${cyan('npx pan-ui logs')}`);
|
|
499
|
+
console.log(` ${dim('Check status:')} ${cyan('npx pan-ui status')}`);
|
|
500
|
+
console.log('');
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
function stopDaemon() {
|
|
504
|
+
const { running, pid } = getDaemonStatus();
|
|
505
|
+
if (!running) {
|
|
506
|
+
console.log(` ${dim('Pan UI is not running.')}`);
|
|
507
|
+
process.exit(0);
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
try {
|
|
511
|
+
process.kill(pid, 'SIGTERM');
|
|
512
|
+
console.log(` ${green('✓')} Pan UI stopped (PID ${pid})`);
|
|
513
|
+
} catch (err) {
|
|
514
|
+
console.log(` ${red('✗')} Failed to stop PID ${pid}: ${err.message}`);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
try { unlinkSync(PID_FILE); } catch {}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
function showStatus() {
|
|
521
|
+
const { running, pid } = getDaemonStatus();
|
|
522
|
+
const env = loadEnv(ENV_PATH);
|
|
523
|
+
const port = env.PORT || '3199';
|
|
524
|
+
|
|
525
|
+
if (running) {
|
|
526
|
+
console.log('');
|
|
527
|
+
console.log(` ${green('●')} Pan UI is ${green('running')}`);
|
|
528
|
+
console.log(` ${dim('PID:')} ${cyan(String(pid))}`);
|
|
529
|
+
console.log(` ${dim('Local:')} ${cyan(`http://localhost:${port}`)}`);
|
|
530
|
+
console.log(` ${dim('Log:')} ${cyan(LOG_FILE)}`);
|
|
531
|
+
console.log('');
|
|
532
|
+
} else {
|
|
533
|
+
console.log('');
|
|
534
|
+
console.log(` ${red('●')} Pan UI is ${red('stopped')}`);
|
|
535
|
+
console.log(` ${dim('Start with:')} ${cyan('npx pan-ui --daemon')}`);
|
|
536
|
+
console.log('');
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
function showLogs() {
|
|
541
|
+
if (!existsSync(LOG_FILE)) {
|
|
542
|
+
console.log(` ${dim('No log file found. Start the daemon first.')}`);
|
|
543
|
+
process.exit(0);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
// Tail the last 50 lines, then follow
|
|
547
|
+
const child = spawn('tail', ['-n', '50', '-f', LOG_FILE], {
|
|
548
|
+
stdio: 'inherit',
|
|
549
|
+
});
|
|
550
|
+
process.on('SIGINT', () => { child.kill('SIGINT'); process.exit(0); });
|
|
551
|
+
child.on('exit', (code) => process.exit(code ?? 0));
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// ─── Systemd service management ─────────────────────────────────────────────
|
|
555
|
+
|
|
556
|
+
function getServiceDir() {
|
|
557
|
+
return join(homedir(), '.config', 'systemd', 'user');
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
const SERVICE_NAME = 'pan-ui';
|
|
561
|
+
|
|
562
|
+
function getServicePath() {
|
|
563
|
+
return join(getServiceDir(), `${SERVICE_NAME}.service`);
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
function generateServiceUnit(env) {
|
|
567
|
+
const port = env.PORT || '3199';
|
|
568
|
+
const nodePath = process.execPath;
|
|
569
|
+
const binPath = resolve(__dirname, 'pan-ui.mjs');
|
|
570
|
+
|
|
571
|
+
// Build environment lines (skip PORT — we add it explicitly below)
|
|
572
|
+
const envLines = [];
|
|
573
|
+
for (const [key, value] of Object.entries(env)) {
|
|
574
|
+
if (key && value && key !== 'PORT') envLines.push(`Environment=${key}=${value}`);
|
|
575
|
+
}
|
|
576
|
+
envLines.push(`Environment=NODE_ENV=production`);
|
|
577
|
+
envLines.push(`Environment=PORT=${port}`);
|
|
578
|
+
envLines.push(`Environment=HOSTNAME=0.0.0.0`);
|
|
579
|
+
|
|
580
|
+
return `[Unit]
|
|
581
|
+
Description=Pan UI — WebUI for Hermes Agent
|
|
582
|
+
After=network.target
|
|
583
|
+
|
|
584
|
+
[Service]
|
|
585
|
+
Type=simple
|
|
586
|
+
ExecStart=${nodePath} ${binPath}
|
|
587
|
+
WorkingDirectory=${PKG_ROOT}
|
|
588
|
+
Restart=on-failure
|
|
589
|
+
RestartSec=5
|
|
590
|
+
${envLines.join('\n')}
|
|
591
|
+
|
|
592
|
+
# Logging
|
|
593
|
+
StandardOutput=journal
|
|
594
|
+
StandardError=journal
|
|
595
|
+
SyslogIdentifier=pan-ui
|
|
596
|
+
|
|
597
|
+
[Install]
|
|
598
|
+
WantedBy=default.target
|
|
599
|
+
`;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
async function serviceInstall() {
|
|
603
|
+
if (platform() !== 'linux') {
|
|
604
|
+
console.log(` ${red('✗')} Systemd services are only supported on Linux.`);
|
|
605
|
+
console.log(` ${dim('Use')} ${cyan('npx pan-ui --daemon')} ${dim('instead.')}`);
|
|
606
|
+
process.exit(1);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// Ensure setup has been run
|
|
610
|
+
const env = loadEnv(ENV_PATH);
|
|
611
|
+
if (Object.keys(env).length === 0) {
|
|
612
|
+
console.log(` ${yellow('!')} No configuration found. Running setup first...`);
|
|
613
|
+
console.log('');
|
|
614
|
+
const newEnv = await setup(true);
|
|
615
|
+
rl.close();
|
|
616
|
+
return doServiceInstall(newEnv);
|
|
617
|
+
}
|
|
618
|
+
rl.close();
|
|
619
|
+
return doServiceInstall(env);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
function doServiceInstall(env) {
|
|
623
|
+
const serviceDir = getServiceDir();
|
|
624
|
+
const servicePath = getServicePath();
|
|
625
|
+
|
|
626
|
+
mkdirSync(serviceDir, { recursive: true });
|
|
627
|
+
|
|
628
|
+
const unit = generateServiceUnit(env);
|
|
629
|
+
writeFileSync(servicePath, unit, 'utf-8');
|
|
630
|
+
|
|
631
|
+
console.log('');
|
|
632
|
+
console.log(` ${green('✓')} Service file written to ${cyan(servicePath)}`);
|
|
633
|
+
|
|
634
|
+
// Reload and enable
|
|
635
|
+
try {
|
|
636
|
+
execSync('systemctl --user daemon-reload', { stdio: 'ignore' });
|
|
637
|
+
console.log(` ${green('✓')} Systemd daemon reloaded`);
|
|
638
|
+
} catch {
|
|
639
|
+
console.log(` ${yellow('!')} Could not reload systemd daemon (are you in a user session?)`);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
try {
|
|
643
|
+
execSync(`systemctl --user enable ${SERVICE_NAME}`, { stdio: 'ignore' });
|
|
644
|
+
console.log(` ${green('✓')} Service enabled (starts on login)`);
|
|
645
|
+
} catch {
|
|
646
|
+
console.log(` ${yellow('!')} Could not enable service`);
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
try {
|
|
650
|
+
execSync(`systemctl --user start ${SERVICE_NAME}`, { stdio: 'ignore' });
|
|
651
|
+
console.log(` ${green('✓')} Service started`);
|
|
652
|
+
} catch {
|
|
653
|
+
console.log(` ${yellow('!')} Could not start service — try: systemctl --user start ${SERVICE_NAME}`);
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
// Enable lingering so service runs even when not logged in
|
|
657
|
+
try {
|
|
658
|
+
execSync(`loginctl enable-linger ${process.env.USER || ''}`, { stdio: 'ignore' });
|
|
659
|
+
console.log(` ${green('✓')} Lingering enabled (survives logout)`);
|
|
660
|
+
} catch {
|
|
661
|
+
console.log(` ${dim('Tip: run')} ${cyan(`loginctl enable-linger`)} ${dim('so the service survives logout')}`);
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
const port = env.PORT || '3199';
|
|
665
|
+
console.log('');
|
|
666
|
+
console.log(` ${dim('Local:')} ${cyan(`http://localhost:${port}`)}`);
|
|
667
|
+
console.log('');
|
|
668
|
+
console.log(` ${dim('Manage with:')}`);
|
|
669
|
+
console.log(` ${cyan(`systemctl --user status ${SERVICE_NAME}`)}`);
|
|
670
|
+
console.log(` ${cyan(`systemctl --user restart ${SERVICE_NAME}`)}`);
|
|
671
|
+
console.log(` ${cyan(`journalctl --user -u ${SERVICE_NAME} -f`)}`);
|
|
672
|
+
console.log(` ${cyan(`npx pan-ui service remove`)}`);
|
|
673
|
+
console.log('');
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
function serviceRemove() {
|
|
677
|
+
if (platform() !== 'linux') {
|
|
678
|
+
console.log(` ${red('✗')} Systemd services are only supported on Linux.`);
|
|
679
|
+
process.exit(1);
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
const servicePath = getServicePath();
|
|
683
|
+
|
|
684
|
+
// Stop and disable
|
|
685
|
+
try {
|
|
686
|
+
execSync(`systemctl --user stop ${SERVICE_NAME}`, { stdio: 'ignore' });
|
|
687
|
+
console.log(` ${green('✓')} Service stopped`);
|
|
688
|
+
} catch {}
|
|
689
|
+
|
|
690
|
+
try {
|
|
691
|
+
execSync(`systemctl --user disable ${SERVICE_NAME}`, { stdio: 'ignore' });
|
|
692
|
+
console.log(` ${green('✓')} Service disabled`);
|
|
693
|
+
} catch {}
|
|
694
|
+
|
|
695
|
+
if (existsSync(servicePath)) {
|
|
696
|
+
unlinkSync(servicePath);
|
|
697
|
+
console.log(` ${green('✓')} Removed ${servicePath}`);
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
try {
|
|
701
|
+
execSync('systemctl --user daemon-reload', { stdio: 'ignore' });
|
|
702
|
+
console.log(` ${green('✓')} Systemd daemon reloaded`);
|
|
703
|
+
} catch {}
|
|
704
|
+
|
|
705
|
+
console.log('');
|
|
706
|
+
console.log(` ${dim('Pan UI service has been fully removed.')}`);
|
|
707
|
+
console.log('');
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
function serviceStatus() {
|
|
711
|
+
if (platform() !== 'linux') {
|
|
712
|
+
console.log(` ${red('✗')} Systemd services are only supported on Linux.`);
|
|
713
|
+
process.exit(1);
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
try {
|
|
717
|
+
const output = execSync(`systemctl --user status ${SERVICE_NAME} 2>&1`, { encoding: 'utf-8' });
|
|
718
|
+
console.log(output);
|
|
719
|
+
} catch (err) {
|
|
720
|
+
// systemctl returns non-zero for inactive services
|
|
721
|
+
if (err.stdout) console.log(err.stdout);
|
|
722
|
+
else console.log(` ${dim('Service not installed. Run:')} ${cyan('npx pan-ui service install')}`);
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
|
|
357
726
|
// ─── CLI entry point ────────────────────────────────────────────────────────
|
|
358
727
|
|
|
359
728
|
async function main() {
|
|
@@ -371,8 +740,65 @@ async function main() {
|
|
|
371
740
|
portOverride = args[shortPortIdx + 1];
|
|
372
741
|
}
|
|
373
742
|
|
|
743
|
+
// Parse --daemon / -d flag
|
|
744
|
+
const isDaemon = args.includes('--daemon') || args.includes('-d');
|
|
745
|
+
|
|
746
|
+
// ── Stop ──────────────────────────────────────────────────────────────
|
|
747
|
+
|
|
748
|
+
if (command === 'stop') {
|
|
749
|
+
rl.close();
|
|
750
|
+
stopDaemon();
|
|
751
|
+
process.exit(0);
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
// ── Status ────────────────────────────────────────────────────────────
|
|
755
|
+
|
|
756
|
+
if (command === 'status') {
|
|
757
|
+
rl.close();
|
|
758
|
+
showStatus();
|
|
759
|
+
process.exit(0);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
// ── Logs ──────────────────────────────────────────────────────────────
|
|
763
|
+
|
|
764
|
+
if (command === 'logs') {
|
|
765
|
+
rl.close();
|
|
766
|
+
showLogs();
|
|
767
|
+
return; // showLogs takes over the process
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
// ── Service management ────────────────────────────────────────────────
|
|
771
|
+
|
|
772
|
+
if (command === 'service') {
|
|
773
|
+
const subcommand = args[1];
|
|
774
|
+
if (subcommand === 'install') {
|
|
775
|
+
await serviceInstall();
|
|
776
|
+
process.exit(0);
|
|
777
|
+
}
|
|
778
|
+
if (subcommand === 'remove' || subcommand === 'uninstall') {
|
|
779
|
+
rl.close();
|
|
780
|
+
serviceRemove();
|
|
781
|
+
process.exit(0);
|
|
782
|
+
}
|
|
783
|
+
if (subcommand === 'status') {
|
|
784
|
+
rl.close();
|
|
785
|
+
serviceStatus();
|
|
786
|
+
process.exit(0);
|
|
787
|
+
}
|
|
788
|
+
// Unknown subcommand
|
|
789
|
+
rl.close();
|
|
790
|
+
console.log('');
|
|
791
|
+
console.log(` ${dim('Usage:')}`);
|
|
792
|
+
console.log(` ${cyan('npx pan-ui service install')} Install systemd user service`);
|
|
793
|
+
console.log(` ${cyan('npx pan-ui service remove')} Remove systemd user service`);
|
|
794
|
+
console.log(` ${cyan('npx pan-ui service status')} Show service status`);
|
|
795
|
+
console.log('');
|
|
796
|
+
process.exit(1);
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
// ── Setup ─────────────────────────────────────────────────────────────
|
|
800
|
+
|
|
374
801
|
if (command === 'setup') {
|
|
375
|
-
// Explicit setup
|
|
376
802
|
const env = await setup(true);
|
|
377
803
|
rl.close();
|
|
378
804
|
console.log(` ${dim('Start with:')} ${cyan('npx pan-ui')}`);
|
|
@@ -380,15 +806,23 @@ async function main() {
|
|
|
380
806
|
process.exit(0);
|
|
381
807
|
}
|
|
382
808
|
|
|
809
|
+
// ── Help ──────────────────────────────────────────────────────────────
|
|
810
|
+
|
|
383
811
|
if (command === '--help' || command === '-h') {
|
|
384
812
|
console.log('');
|
|
385
813
|
console.log(bold(' pan-ui') + dim(' — Beautiful WebUI for Hermes Agent'));
|
|
386
814
|
console.log('');
|
|
387
815
|
console.log(' Usage:');
|
|
388
|
-
console.log(` ${cyan('npx pan-ui')}
|
|
389
|
-
console.log(` ${cyan('npx pan-ui
|
|
390
|
-
console.log(` ${cyan('npx pan-ui
|
|
391
|
-
console.log(` ${cyan('npx pan-ui
|
|
816
|
+
console.log(` ${cyan('npx pan-ui')} Start the workspace (foreground)`);
|
|
817
|
+
console.log(` ${cyan('npx pan-ui --daemon')} Start in background`);
|
|
818
|
+
console.log(` ${cyan('npx pan-ui stop')} Stop background daemon`);
|
|
819
|
+
console.log(` ${cyan('npx pan-ui status')} Check if running`);
|
|
820
|
+
console.log(` ${cyan('npx pan-ui logs')} Tail daemon logs`);
|
|
821
|
+
console.log(` ${cyan('npx pan-ui setup')} Run setup wizard`);
|
|
822
|
+
console.log(` ${cyan('npx pan-ui service install')} Install as systemd user service`);
|
|
823
|
+
console.log(` ${cyan('npx pan-ui service remove')} Remove systemd service`);
|
|
824
|
+
console.log(` ${cyan('npx pan-ui --port 8080')} Custom port`);
|
|
825
|
+
console.log(` ${cyan('npx pan-ui --help')} Show this help`);
|
|
392
826
|
console.log('');
|
|
393
827
|
console.log(' Environment variables:');
|
|
394
828
|
console.log(` ${dim('HERMES_HOME')} Path to Hermes home (default: ~/.hermes)`);
|
|
@@ -403,9 +837,16 @@ async function main() {
|
|
|
403
837
|
process.exit(0);
|
|
404
838
|
}
|
|
405
839
|
|
|
406
|
-
// Default:
|
|
840
|
+
// ── Default: setup if first time, then start ──────────────────────────
|
|
841
|
+
|
|
407
842
|
const env = await setup(false);
|
|
408
843
|
rl.close();
|
|
844
|
+
|
|
845
|
+
if (isDaemon) {
|
|
846
|
+
await startDaemon(env, portOverride);
|
|
847
|
+
process.exit(0);
|
|
848
|
+
}
|
|
849
|
+
|
|
409
850
|
startServer(env, portOverride);
|
|
410
851
|
}
|
|
411
852
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@euraika-labs/pan-ui",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"description": "Beautiful WebUI for Hermes Agent — chat, skills, plugins, memory, profiles, and runtime diagnostics in one workspace.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"hermes",
|
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
"license": "MIT",
|
|
17
17
|
"repository": {
|
|
18
18
|
"type": "git",
|
|
19
|
-
"url": "https://github.com/Euraika-Labs/pan-ui"
|
|
19
|
+
"url": "git+https://github.com/Euraika-Labs/pan-ui.git"
|
|
20
20
|
},
|
|
21
21
|
"homepage": "https://github.com/Euraika-Labs/pan-ui",
|
|
22
22
|
"bin": {
|
|
23
|
-
"pan-ui": "
|
|
23
|
+
"pan-ui": "bin/pan-ui.mjs"
|
|
24
24
|
},
|
|
25
25
|
"files": [
|
|
26
26
|
"bin/",
|