@euraika-labs/pan-ui 0.2.4 → 0.5.0
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/node_modules/next/node_modules/postcss/package.json +0 -0
- package/.next/standalone/package.json +7 -1
- package/.next/standalone/server.js +1 -1
- package/.next/static/H9AHLxE6FxdsWBnoBgfVx/_buildManifest.js +1 -0
- package/.next/{standalone/.next/static/chunks/5449-aba2dafba76d4508.js → static/chunks/4611-6b95c4a66713a3f3.js} +1 -1
- package/.next/static/chunks/5097-0a676d90b3a410e0.js +1 -0
- package/.next/{standalone/.next/static/chunks/app/_not-found/page-9c90a6b39424f003.js → static/chunks/app/_not-found/page-c4591bba1afe868d.js} +1 -1
- package/.next/{standalone/.next/static/chunks/app/api/audit/route-bb3f5b9060cdc631.js → static/chunks/app/api/audit/route-bc3ee2d6661cba9d.js} +1 -1
- package/.next/{standalone/.next/static/chunks/app/api/auth/login/route-bb3f5b9060cdc631.js → static/chunks/app/api/auth/login/route-bc3ee2d6661cba9d.js} +1 -1
- package/.next/{standalone/.next/static/chunks/app/api/auth/logout/route-bb3f5b9060cdc631.js → static/chunks/app/api/auth/logout/route-bc3ee2d6661cba9d.js} +1 -1
- package/.next/{standalone/.next/static/chunks/app/api/chat/sessions/[id]/fork/route-bb3f5b9060cdc631.js → static/chunks/app/api/chat/sessions/[id]/fork/route-bc3ee2d6661cba9d.js} +1 -1
- package/.next/static/chunks/app/api/chat/sessions/[id]/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/chat/sessions/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/chat/stream/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/extensions/[id]/capabilities/[capabilityId]/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/extensions/[id]/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/extensions/[id]/test/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/extensions/mcp/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/extensions/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/memory/agent/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/memory/context-inspector/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/memory/session-search/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/memory/user/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/profiles/[id]/config/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/profiles/[id]/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/profiles/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/runtime/approvals/[toolCallId]/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/runtime/approvals/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/runtime/artifacts/download/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/runtime/artifacts/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/runtime/export/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/runtime/health/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/runtime/mcp-probes/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/runtime/runs/[id]/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/runtime/runs/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/runtime/status/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/runtime/telemetry/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/runtime/timeline/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/runtime/update-check/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/disable/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/enable/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/files/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/install/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/load/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/skills/catalog/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/skills/categories/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/skills/hub/install/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/skills/hub/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/skills/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/telemetry/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/api/uploads/route-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/chat/page-fc4e161d14189132.js +1 -0
- package/.next/static/chunks/app/extensions/[id]/page-29eb52748adffbe1.js +1 -0
- package/.next/static/chunks/app/extensions/{page-c0fbb8efa9a3700c.js → page-6c558f23e432e258.js} +1 -1
- package/.next/static/chunks/app/layout-f3c578dd4202f2f5.js +1 -0
- package/.next/static/chunks/app/login/page-a3820386479beb5e.js +1 -0
- package/.next/static/chunks/app/memory/page-25758dcc848051cd.js +1 -0
- package/.next/static/chunks/app/page-bc3ee2d6661cba9d.js +1 -0
- package/.next/static/chunks/app/profiles/page-d30d62bab24f9586.js +1 -0
- package/.next/static/chunks/app/settings/approvals/{page-6843c585791e4db7.js → page-584452b077852c52.js} +1 -1
- package/.next/static/chunks/app/settings/artifacts/page-ca8b5d224787c098.js +1 -0
- package/.next/{standalone/.next/static/chunks/app/settings/audit/page-378bee43dd7c4903.js → static/chunks/app/settings/audit/page-26646388ec7f31a8.js} +1 -1
- package/.next/static/chunks/app/settings/health/page-28a2e023528ccd90.js +1 -0
- package/.next/static/chunks/app/settings/mcp-diagnostics/page-16915e0e513e44f7.js +1 -0
- package/.next/{standalone/.next/static/chunks/app/settings/page-8a40bdf895f43430.js → static/chunks/app/settings/page-e5a118618f94a163.js} +1 -1
- package/.next/static/chunks/app/settings/runs/[id]/page-936ee45da0921cdd.js +1 -0
- package/.next/static/chunks/app/settings/runs/page-2b170e0de57aeaa9.js +1 -0
- package/.next/{standalone/.next/static/chunks/app/settings/telemetry/page-c0446baefa5496cb.js → static/chunks/app/settings/telemetry/page-ff92d728e128b25a.js} +1 -1
- package/.next/static/chunks/app/skills/[id]/page-2858305b3f82198b.js +1 -0
- package/.next/static/chunks/app/skills/page-ce19f262a41f5924.js +1 -0
- package/.next/{standalone/.next/static/chunks/main-app-a9e2c007d433eaf9.js → static/chunks/main-app-f0e3f2828aa879c4.js} +1 -1
- package/.next/static/css/c673dd080485d07a.css +3 -0
- package/README.md +167 -144
- package/bin/pan-ui.mjs +565 -64
- package/hermes.version.json +17 -0
- package/package.json +7 -1
- package/.env.example +0 -30
- package/.next/standalone/.next/BUILD_ID +0 -1
- package/.next/standalone/.next/app-build-manifest.json +0 -508
- package/.next/standalone/.next/app-path-routes-manifest.json +0 -67
- package/.next/standalone/.next/build-manifest.json +0 -33
- package/.next/standalone/.next/package.json +0 -1
- package/.next/standalone/.next/prerender-manifest.json +0 -119
- package/.next/standalone/.next/react-loadable-manifest.json +0 -1
- package/.next/standalone/.next/required-server-files.json +0 -321
- package/.next/standalone/.next/routes-manifest.json +0 -295
- package/.next/standalone/.next/server/app/_not-found/page.js +0 -2
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/_not-found.html +0 -1
- package/.next/standalone/.next/server/app/_not-found.meta +0 -8
- package/.next/standalone/.next/server/app/_not-found.rsc +0 -18
- package/.next/standalone/.next/server/app/api/audit/route.js +0 -36
- package/.next/standalone/.next/server/app/api/audit/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/audit/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/auth/login/route.js +0 -1
- package/.next/standalone/.next/server/app/api/auth/login/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/auth/login/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +0 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/fork/route.js +0 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/fork/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/fork/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route.js +0 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/route.js +0 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/chat/stream/route.js +0 -170
- package/.next/standalone/.next/server/app/api/chat/stream/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/chat/stream/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/extensions/[id]/capabilities/[capabilityId]/route.js +0 -1
- package/.next/standalone/.next/server/app/api/extensions/[id]/capabilities/[capabilityId]/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/extensions/[id]/capabilities/[capabilityId]/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/extensions/[id]/route.js +0 -1
- package/.next/standalone/.next/server/app/api/extensions/[id]/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/extensions/[id]/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/extensions/[id]/test/route.js +0 -1
- package/.next/standalone/.next/server/app/api/extensions/[id]/test/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/extensions/[id]/test/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/extensions/mcp/route.js +0 -11
- package/.next/standalone/.next/server/app/api/extensions/mcp/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/extensions/mcp/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/extensions/route.js +0 -1
- package/.next/standalone/.next/server/app/api/extensions/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/extensions/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/memory/agent/route.js +0 -36
- package/.next/standalone/.next/server/app/api/memory/agent/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/memory/agent/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/memory/context-inspector/route.js +0 -1
- package/.next/standalone/.next/server/app/api/memory/context-inspector/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/memory/context-inspector/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/memory/session-search/route.js +0 -1
- package/.next/standalone/.next/server/app/api/memory/session-search/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/memory/session-search/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/memory/user/route.js +0 -36
- package/.next/standalone/.next/server/app/api/memory/user/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/memory/user/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/profiles/[id]/config/route.js +0 -92
- package/.next/standalone/.next/server/app/api/profiles/[id]/config/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/profiles/[id]/config/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/profiles/[id]/route.js +0 -31
- package/.next/standalone/.next/server/app/api/profiles/[id]/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/profiles/[id]/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/profiles/route.js +0 -31
- package/.next/standalone/.next/server/app/api/profiles/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/profiles/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/runtime/approvals/[toolCallId]/route.js +0 -133
- package/.next/standalone/.next/server/app/api/runtime/approvals/[toolCallId]/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/runtime/approvals/[toolCallId]/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/runtime/approvals/route.js +0 -133
- package/.next/standalone/.next/server/app/api/runtime/approvals/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/runtime/approvals/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/runtime/artifacts/download/route.js +0 -133
- package/.next/standalone/.next/server/app/api/runtime/artifacts/download/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/runtime/artifacts/download/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/runtime/artifacts/route.js +0 -133
- package/.next/standalone/.next/server/app/api/runtime/artifacts/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/runtime/artifacts/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/runtime/export/route.js +0 -143
- package/.next/standalone/.next/server/app/api/runtime/export/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/runtime/export/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/runtime/health/route.js +0 -18
- package/.next/standalone/.next/server/app/api/runtime/health/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/runtime/health/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/runtime/mcp-probes/route.js +0 -133
- package/.next/standalone/.next/server/app/api/runtime/mcp-probes/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/runtime/mcp-probes/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/runtime/runs/[id]/route.js +0 -51
- package/.next/standalone/.next/server/app/api/runtime/runs/[id]/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/runtime/runs/[id]/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/runtime/runs/route.js +0 -51
- package/.next/standalone/.next/server/app/api/runtime/runs/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/runtime/runs/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/runtime/status/route.js +0 -18
- package/.next/standalone/.next/server/app/api/runtime/status/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/runtime/status/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/runtime/telemetry/route.js +0 -133
- package/.next/standalone/.next/server/app/api/runtime/telemetry/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/runtime/telemetry/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/runtime/timeline/route.js +0 -133
- package/.next/standalone/.next/server/app/api/runtime/timeline/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/runtime/timeline/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/disable/route.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/disable/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/disable/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/enable/route.js +0 -21
- package/.next/standalone/.next/server/app/api/skills/[id]/enable/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/enable/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/files/route.js +0 -21
- package/.next/standalone/.next/server/app/api/skills/[id]/files/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/files/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/install/route.js +0 -56
- package/.next/standalone/.next/server/app/api/skills/[id]/install/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/install/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/load/route.js +0 -17
- package/.next/standalone/.next/server/app/api/skills/[id]/load/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/load/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/route.js +0 -21
- package/.next/standalone/.next/server/app/api/skills/[id]/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/catalog/route.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/catalog/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/skills/catalog/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/categories/route.js +0 -21
- package/.next/standalone/.next/server/app/api/skills/categories/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/skills/categories/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/hub/install/route.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/hub/install/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/skills/hub/install/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/hub/route.js +0 -21
- package/.next/standalone/.next/server/app/api/skills/hub/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/skills/hub/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/skills/route.js +0 -21
- package/.next/standalone/.next/server/app/api/skills/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/skills/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/telemetry/route.js +0 -133
- package/.next/standalone/.next/server/app/api/telemetry/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/telemetry/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/uploads/route.js +0 -36
- package/.next/standalone/.next/server/app/api/uploads/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/uploads/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/chat/page.js +0 -4
- package/.next/standalone/.next/server/app/chat/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/chat/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/extensions/[id]/page.js +0 -2
- package/.next/standalone/.next/server/app/extensions/[id]/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/extensions/[id]/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/extensions/page.js +0 -2
- package/.next/standalone/.next/server/app/extensions/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/extensions/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/favicon.ico/route.js +0 -1
- package/.next/standalone/.next/server/app/favicon.ico/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/favicon.ico.body +0 -0
- package/.next/standalone/.next/server/app/favicon.ico.meta +0 -1
- package/.next/standalone/.next/server/app/icon.svg/route.js +0 -1
- package/.next/standalone/.next/server/app/icon.svg/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/icon.svg.body +0 -10
- package/.next/standalone/.next/server/app/icon.svg.meta +0 -1
- package/.next/standalone/.next/server/app/index.html +0 -1
- package/.next/standalone/.next/server/app/index.meta +0 -9
- package/.next/standalone/.next/server/app/index.rsc +0 -19
- package/.next/standalone/.next/server/app/login/page.js +0 -2
- package/.next/standalone/.next/server/app/login/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/memory/page.js +0 -2
- package/.next/standalone/.next/server/app/memory/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/memory/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/page.js +0 -2
- package/.next/standalone/.next/server/app/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/profiles/page.js +0 -2
- package/.next/standalone/.next/server/app/profiles/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/profiles/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/settings/approvals/page.js +0 -2
- package/.next/standalone/.next/server/app/settings/approvals/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/settings/approvals/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/settings/artifacts/page.js +0 -2
- package/.next/standalone/.next/server/app/settings/artifacts/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/settings/artifacts/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/settings/audit/page.js +0 -2
- package/.next/standalone/.next/server/app/settings/audit/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/settings/audit/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/settings/health/page.js +0 -2
- package/.next/standalone/.next/server/app/settings/health/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/settings/health/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/settings/mcp-diagnostics/page.js +0 -2
- package/.next/standalone/.next/server/app/settings/mcp-diagnostics/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/settings/mcp-diagnostics/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/settings/page.js +0 -2
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/settings/runs/[id]/page.js +0 -2
- package/.next/standalone/.next/server/app/settings/runs/[id]/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/settings/runs/[id]/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/settings/runs/page.js +0 -2
- package/.next/standalone/.next/server/app/settings/runs/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/settings/runs/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/settings/telemetry/page.js +0 -2
- package/.next/standalone/.next/server/app/settings/telemetry/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/settings/telemetry/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/skills/[id]/page.js +0 -2
- package/.next/standalone/.next/server/app/skills/[id]/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/skills/[id]/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/skills/page.js +0 -2
- package/.next/standalone/.next/server/app/skills/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/skills/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +0 -67
- package/.next/standalone/.next/server/chunks/1331.js +0 -22
- package/.next/standalone/.next/server/chunks/1692.js +0 -1
- package/.next/standalone/.next/server/chunks/2043.js +0 -1
- package/.next/standalone/.next/server/chunks/4337.js +0 -143
- package/.next/standalone/.next/server/chunks/4561.js +0 -1
- package/.next/standalone/.next/server/chunks/4689.js +0 -25
- package/.next/standalone/.next/server/chunks/5611.js +0 -6
- package/.next/standalone/.next/server/chunks/6111.js +0 -1
- package/.next/standalone/.next/server/chunks/6143.js +0 -9
- package/.next/standalone/.next/server/chunks/6516.js +0 -143
- package/.next/standalone/.next/server/chunks/6802.js +0 -1
- package/.next/standalone/.next/server/chunks/9546.js +0 -1
- package/.next/standalone/.next/server/functions-config-manifest.json +0 -4
- package/.next/standalone/.next/server/middleware-build-manifest.js +0 -1
- package/.next/standalone/.next/server/middleware-manifest.json +0 -6
- package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +0 -1
- package/.next/standalone/.next/server/next-font-manifest.js +0 -1
- package/.next/standalone/.next/server/next-font-manifest.json +0 -1
- package/.next/standalone/.next/server/pages/404.html +0 -1
- package/.next/standalone/.next/server/pages/500.html +0 -1
- package/.next/standalone/.next/server/pages/_app.js +0 -1
- package/.next/standalone/.next/server/pages/_app.js.nft.json +0 -1
- package/.next/standalone/.next/server/pages/_document.js +0 -1
- package/.next/standalone/.next/server/pages/_document.js.nft.json +0 -1
- package/.next/standalone/.next/server/pages/_error.js +0 -19
- package/.next/standalone/.next/server/pages/_error.js.nft.json +0 -1
- package/.next/standalone/.next/server/pages-manifest.json +0 -6
- package/.next/standalone/.next/server/server-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +0 -1
- package/.next/standalone/.next/server/webpack-runtime.js +0 -1
- package/.next/standalone/.next/static/Pqhqpl3ZPqKI0qfvpIPeN/_buildManifest.js +0 -1
- package/.next/standalone/.next/static/chunks/1255-aadf393aa3a56bfa.js +0 -1
- package/.next/standalone/.next/static/chunks/1309-d826505bfad78fd1.js +0 -1
- package/.next/standalone/.next/static/chunks/2231-e0d8768bfce5fe57.js +0 -1
- package/.next/standalone/.next/static/chunks/4879-36321f505e9ce82a.js +0 -1
- package/.next/standalone/.next/static/chunks/4bd1b696-f785427dddbba9fb.js +0 -1
- package/.next/standalone/.next/static/chunks/9657-3ff4bf56070f324f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/chat/sessions/[id]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/chat/sessions/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/chat/stream/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/extensions/[id]/capabilities/[capabilityId]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/extensions/[id]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/extensions/[id]/test/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/extensions/mcp/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/extensions/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/memory/agent/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/memory/context-inspector/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/memory/session-search/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/memory/user/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/profiles/[id]/config/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/profiles/[id]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/profiles/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/runtime/approvals/[toolCallId]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/runtime/approvals/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/runtime/artifacts/download/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/runtime/artifacts/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/runtime/export/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/runtime/health/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/runtime/mcp-probes/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/runtime/runs/[id]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/runtime/runs/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/runtime/status/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/runtime/telemetry/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/runtime/timeline/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/skills/[id]/disable/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/skills/[id]/enable/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/skills/[id]/files/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/skills/[id]/install/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/skills/[id]/load/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/skills/[id]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/skills/catalog/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/skills/categories/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/skills/hub/install/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/skills/hub/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/skills/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/telemetry/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/uploads/route-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/chat/page-117a5b54aee7eae4.js +0 -1
- package/.next/standalone/.next/static/chunks/app/extensions/[id]/page-cca6df1771ec04d2.js +0 -1
- package/.next/standalone/.next/static/chunks/app/extensions/page-c0fbb8efa9a3700c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/layout-0bc970399be389b5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/page-984e33272681e1e0.js +0 -1
- package/.next/standalone/.next/static/chunks/app/memory/page-0684ff3ce6888ae7.js +0 -1
- package/.next/standalone/.next/static/chunks/app/page-bb3f5b9060cdc631.js +0 -1
- package/.next/standalone/.next/static/chunks/app/profiles/page-46a0ad35feda9741.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/approvals/page-6843c585791e4db7.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/artifacts/page-d3fddd43ac1243af.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/health/page-d34eadc11bc90af5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/mcp-diagnostics/page-3778d2842d5bdd79.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/runs/[id]/page-7837ec57d531ef2b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/runs/page-cb4d1617e199c38e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/skills/[id]/page-88bc62488ddf6c10.js +0 -1
- package/.next/standalone/.next/static/chunks/app/skills/page-e47c6a5f9559edc1.js +0 -1
- package/.next/standalone/.next/static/chunks/framework-f31701c9d93f12a4.js +0 -1
- package/.next/standalone/.next/static/chunks/main-1ac9e0711a0eb944.js +0 -1
- package/.next/standalone/.next/static/chunks/pages/_app-6c8c2371b16a04b8.js +0 -1
- package/.next/standalone/.next/static/chunks/pages/_error-94812ad32cad7365.js +0 -1
- package/.next/standalone/.next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
- package/.next/standalone/.next/static/chunks/webpack-0100acb42ec0d4c7.js +0 -1
- package/.next/standalone/.next/static/css/f5a43afa8024b892.css +0 -3
- package/.next/static/Pqhqpl3ZPqKI0qfvpIPeN/_buildManifest.js +0 -1
- package/.next/static/Pqhqpl3ZPqKI0qfvpIPeN/_ssgManifest.js +0 -1
- package/.next/static/chunks/5449-aba2dafba76d4508.js +0 -1
- package/.next/static/chunks/9657-3ff4bf56070f324f.js +0 -1
- package/.next/static/chunks/app/_not-found/page-9c90a6b39424f003.js +0 -1
- package/.next/static/chunks/app/api/audit/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/chat/sessions/[id]/fork/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/chat/sessions/[id]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/chat/sessions/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/chat/stream/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/extensions/[id]/capabilities/[capabilityId]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/extensions/[id]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/extensions/[id]/test/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/extensions/mcp/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/extensions/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/memory/agent/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/memory/context-inspector/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/memory/session-search/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/memory/user/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/profiles/[id]/config/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/profiles/[id]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/profiles/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/runtime/approvals/[toolCallId]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/runtime/approvals/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/runtime/artifacts/download/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/runtime/artifacts/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/runtime/export/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/runtime/health/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/runtime/mcp-probes/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/runtime/runs/[id]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/runtime/runs/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/runtime/status/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/runtime/telemetry/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/runtime/timeline/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/disable/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/enable/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/files/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/install/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/load/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/skills/catalog/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/skills/categories/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/skills/hub/install/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/skills/hub/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/skills/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/telemetry/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/api/uploads/route-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/chat/page-117a5b54aee7eae4.js +0 -1
- package/.next/static/chunks/app/extensions/[id]/page-cca6df1771ec04d2.js +0 -1
- package/.next/static/chunks/app/layout-0bc970399be389b5.js +0 -1
- package/.next/static/chunks/app/login/page-984e33272681e1e0.js +0 -1
- package/.next/static/chunks/app/memory/page-0684ff3ce6888ae7.js +0 -1
- package/.next/static/chunks/app/page-bb3f5b9060cdc631.js +0 -1
- package/.next/static/chunks/app/profiles/page-46a0ad35feda9741.js +0 -1
- package/.next/static/chunks/app/settings/artifacts/page-d3fddd43ac1243af.js +0 -1
- package/.next/static/chunks/app/settings/audit/page-378bee43dd7c4903.js +0 -1
- package/.next/static/chunks/app/settings/health/page-d34eadc11bc90af5.js +0 -1
- package/.next/static/chunks/app/settings/mcp-diagnostics/page-3778d2842d5bdd79.js +0 -1
- package/.next/static/chunks/app/settings/page-8a40bdf895f43430.js +0 -1
- package/.next/static/chunks/app/settings/runs/[id]/page-7837ec57d531ef2b.js +0 -1
- package/.next/static/chunks/app/settings/runs/page-cb4d1617e199c38e.js +0 -1
- package/.next/static/chunks/app/settings/telemetry/page-c0446baefa5496cb.js +0 -1
- package/.next/static/chunks/app/skills/[id]/page-88bc62488ddf6c10.js +0 -1
- package/.next/static/chunks/app/skills/page-e47c6a5f9559edc1.js +0 -1
- package/.next/static/chunks/main-app-a9e2c007d433eaf9.js +0 -1
- package/.next/static/css/f5a43afa8024b892.css +0 -3
- /package/.next/{standalone/.next/static/Pqhqpl3ZPqKI0qfvpIPeN → static/H9AHLxE6FxdsWBnoBgfVx}/_ssgManifest.js +0 -0
package/bin/pan-ui.mjs
CHANGED
|
@@ -4,15 +4,18 @@
|
|
|
4
4
|
* pan-ui — CLI launcher with interactive setup wizard.
|
|
5
5
|
*
|
|
6
6
|
* Usage:
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
7
|
+
* pan-ui start # start foreground (runs setup on first launch)
|
|
8
|
+
* pan-ui start --daemon # start in background (daemonize)
|
|
9
|
+
* pan-ui start --port 8080 # custom port
|
|
10
|
+
* pan-ui stop # stop background daemon
|
|
11
|
+
* pan-ui status # check if daemon is running
|
|
12
|
+
* pan-ui logs # tail daemon log output
|
|
13
|
+
* pan-ui setup # re-run setup wizard
|
|
14
|
+
* pan-ui update # check for and install updates
|
|
15
|
+
* pan-ui version # show current version
|
|
16
|
+
* pan-ui service install # install systemd user service
|
|
17
|
+
* pan-ui service remove # remove systemd user service
|
|
18
|
+
* pan-ui help # show help
|
|
16
19
|
*/
|
|
17
20
|
|
|
18
21
|
import { createInterface } from 'node:readline';
|
|
@@ -65,6 +68,22 @@ function startBanner(port) {
|
|
|
65
68
|
|
|
66
69
|
// ─── Detection ──────────────────────────────────────────────────────────────
|
|
67
70
|
|
|
71
|
+
function loadHermesVersionConfig() {
|
|
72
|
+
try {
|
|
73
|
+
const cfgPath = join(PKG_ROOT, 'hermes.version.json');
|
|
74
|
+
return JSON.parse(readFileSync(cfgPath, 'utf-8')).hermes;
|
|
75
|
+
} catch { return null; }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const HERMES_VERSION_CONFIG = loadHermesVersionConfig();
|
|
79
|
+
const HERMES_FORK_REPO = HERMES_VERSION_CONFIG?.repo || 'https://github.com/Euraika-Labs/hermes-agent.git';
|
|
80
|
+
const HERMES_PINNED_TAG = HERMES_VERSION_CONFIG?.tag || 'main';
|
|
81
|
+
const HERMES_PINNED_VERSION = HERMES_VERSION_CONFIG?.version || null;
|
|
82
|
+
const HERMES_MIN_VERSION = HERMES_VERSION_CONFIG?.minVersion || '0.7.0';
|
|
83
|
+
const HERMES_MAX_VERSION = HERMES_VERSION_CONFIG?.maxVersion || null;
|
|
84
|
+
// Fallback to upstream install script for manual instructions
|
|
85
|
+
const HERMES_INSTALL_URL = 'https://raw.githubusercontent.com/Euraika-Labs/hermes-agent/main/scripts/install.sh';
|
|
86
|
+
|
|
68
87
|
function detectHermesBinary() {
|
|
69
88
|
try {
|
|
70
89
|
const p = execSync('command -v hermes', { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
|
|
@@ -78,6 +97,44 @@ function detectHermesVersion(bin) {
|
|
|
78
97
|
} catch { return null; }
|
|
79
98
|
}
|
|
80
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Parse semver-like version string. Extracts x.y.z from strings like "Hermes Agent v0.7.0 (2026.4.3)".
|
|
102
|
+
* Returns the version as "x.y.z" string or null.
|
|
103
|
+
*/
|
|
104
|
+
function parseHermesVersion(str) {
|
|
105
|
+
if (!str) return null;
|
|
106
|
+
const m = str.match(/(\d+\.\d+\.\d+)/);
|
|
107
|
+
return m ? m[1] : null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Check if the installed hermes version is compatible with Pan's requirements.
|
|
112
|
+
* Uses the existing compareVersions(string, string) for semver comparison.
|
|
113
|
+
* Returns { compatible, installed, required, message }.
|
|
114
|
+
*/
|
|
115
|
+
function checkHermesCompatibility(versionString) {
|
|
116
|
+
const installed = parseHermesVersion(versionString);
|
|
117
|
+
if (!installed) return { compatible: true, installed: null, message: null }; // can't check, assume ok
|
|
118
|
+
|
|
119
|
+
if (HERMES_MIN_VERSION && compareVersions(installed, HERMES_MIN_VERSION) < 0) {
|
|
120
|
+
return {
|
|
121
|
+
compatible: false,
|
|
122
|
+
installed,
|
|
123
|
+
required: `>=${HERMES_MIN_VERSION}`,
|
|
124
|
+
message: `Hermes ${installed} is too old. Pan requires >=${HERMES_MIN_VERSION}.`
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (HERMES_MAX_VERSION && compareVersions(installed, HERMES_MAX_VERSION) >= 0) {
|
|
128
|
+
return {
|
|
129
|
+
compatible: false,
|
|
130
|
+
installed,
|
|
131
|
+
required: `<${HERMES_MAX_VERSION}`,
|
|
132
|
+
message: `Hermes ${installed} is too new (untested). Pan is tested with <${HERMES_MAX_VERSION}.`
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return { compatible: true, installed, message: null };
|
|
136
|
+
}
|
|
137
|
+
|
|
81
138
|
function detectHermesHome() {
|
|
82
139
|
if (process.env.HERMES_HOME) return process.env.HERMES_HOME;
|
|
83
140
|
const defaultPath = join(homedir(), '.hermes');
|
|
@@ -108,6 +165,355 @@ function detectPython() {
|
|
|
108
165
|
} catch { return false; }
|
|
109
166
|
}
|
|
110
167
|
|
|
168
|
+
// ─── Update check ───────────────────────────────────────────────────────────
|
|
169
|
+
|
|
170
|
+
const PKG_NAME = '@euraika-labs/pan-ui';
|
|
171
|
+
const UPDATE_CHECK_FILE = join(RUN_DIR, 'update-check.json');
|
|
172
|
+
|
|
173
|
+
function getCurrentVersion() {
|
|
174
|
+
try {
|
|
175
|
+
const pkg = JSON.parse(readFileSync(join(PKG_ROOT, 'package.json'), 'utf-8'));
|
|
176
|
+
return pkg.version || '0.0.0';
|
|
177
|
+
} catch { return '0.0.0'; }
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Check npm registry for the latest version. Caches result for 6 hours.
|
|
182
|
+
* Returns { current, latest, updateAvailable, checkedAt } or null on error.
|
|
183
|
+
*/
|
|
184
|
+
function checkForUpdates(forceCheck = false) {
|
|
185
|
+
const current = getCurrentVersion();
|
|
186
|
+
|
|
187
|
+
// Return cached result if still fresh (6 hours)
|
|
188
|
+
if (!forceCheck && existsSync(UPDATE_CHECK_FILE)) {
|
|
189
|
+
try {
|
|
190
|
+
const cached = JSON.parse(readFileSync(UPDATE_CHECK_FILE, 'utf-8'));
|
|
191
|
+
const age = Date.now() - (cached.checkedAt || 0);
|
|
192
|
+
if (age < 6 * 60 * 60 * 1000 && cached.current === current) {
|
|
193
|
+
return cached;
|
|
194
|
+
}
|
|
195
|
+
} catch {}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
try {
|
|
199
|
+
const latest = execSync(`npm view ${PKG_NAME} version 2>/dev/null`, {
|
|
200
|
+
encoding: 'utf-8',
|
|
201
|
+
timeout: 10_000,
|
|
202
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
203
|
+
}).trim();
|
|
204
|
+
|
|
205
|
+
if (!latest) return null;
|
|
206
|
+
|
|
207
|
+
const result = {
|
|
208
|
+
current,
|
|
209
|
+
latest,
|
|
210
|
+
updateAvailable: latest !== current && compareVersions(latest, current) > 0,
|
|
211
|
+
checkedAt: Date.now(),
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
// Cache result
|
|
215
|
+
try {
|
|
216
|
+
mkdirSync(RUN_DIR, { recursive: true });
|
|
217
|
+
writeFileSync(UPDATE_CHECK_FILE, JSON.stringify(result), 'utf-8');
|
|
218
|
+
} catch {}
|
|
219
|
+
|
|
220
|
+
return result;
|
|
221
|
+
} catch {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/** Simple semver comparison: returns >0 if a > b, <0 if a < b, 0 if equal */
|
|
227
|
+
function compareVersions(a, b) {
|
|
228
|
+
const pa = a.split('.').map(Number);
|
|
229
|
+
const pb = b.split('.').map(Number);
|
|
230
|
+
for (let i = 0; i < 3; i++) {
|
|
231
|
+
const diff = (pa[i] || 0) - (pb[i] || 0);
|
|
232
|
+
if (diff !== 0) return diff;
|
|
233
|
+
}
|
|
234
|
+
return 0;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/** Non-blocking startup update check — prints a notice if update is available */
|
|
238
|
+
function showUpdateNotice() {
|
|
239
|
+
try {
|
|
240
|
+
const result = checkForUpdates(false);
|
|
241
|
+
if (result?.updateAvailable) {
|
|
242
|
+
console.log(` ${yellow('⬆')} Update available: ${dim(result.current)} → ${green(result.latest)}`);
|
|
243
|
+
console.log(` ${dim('Run:')} ${cyan('pan-ui update')}`);
|
|
244
|
+
console.log('');
|
|
245
|
+
}
|
|
246
|
+
} catch {}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** Perform the update via npm */
|
|
250
|
+
async function performUpdate() {
|
|
251
|
+
const result = checkForUpdates(true);
|
|
252
|
+
if (!result) {
|
|
253
|
+
console.log(` ${yellow('!')} Could not check for updates (npm registry unreachable?)`);
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
console.log('');
|
|
258
|
+
console.log(` ${dim('Current version:')} ${cyan(result.current)}`);
|
|
259
|
+
console.log(` ${dim('Latest version:')} ${cyan(result.latest)}`);
|
|
260
|
+
console.log('');
|
|
261
|
+
|
|
262
|
+
if (!result.updateAvailable) {
|
|
263
|
+
console.log(` ${green('✓')} You're already on the latest version!`);
|
|
264
|
+
process.exit(0);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
console.log(` ${cyan('⬆')} Updating ${PKG_NAME} ${dim(result.current)} → ${green(result.latest)}...`);
|
|
268
|
+
console.log('');
|
|
269
|
+
|
|
270
|
+
try {
|
|
271
|
+
execSync(`npm install -g ${PKG_NAME}@latest`, { stdio: 'inherit', timeout: 120_000 });
|
|
272
|
+
console.log('');
|
|
273
|
+
console.log(` ${green('✓')} Updated to ${result.latest}!`);
|
|
274
|
+
|
|
275
|
+
// Clear update cache
|
|
276
|
+
try { unlinkSync(UPDATE_CHECK_FILE); } catch {}
|
|
277
|
+
|
|
278
|
+
// Check if running as systemd service
|
|
279
|
+
if (platform() === 'linux') {
|
|
280
|
+
try {
|
|
281
|
+
const status = execSync(`systemctl --user is-active ${SERVICE_NAME} 2>/dev/null`, {
|
|
282
|
+
encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'],
|
|
283
|
+
}).trim();
|
|
284
|
+
if (status === 'active') {
|
|
285
|
+
console.log(` ${dim('Restarting service...')}`);
|
|
286
|
+
execSync(`systemctl --user restart ${SERVICE_NAME}`, { stdio: 'ignore' });
|
|
287
|
+
console.log(` ${green('✓')} Service restarted`);
|
|
288
|
+
}
|
|
289
|
+
} catch {}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Check if running as daemon
|
|
293
|
+
const { running } = getDaemonStatus();
|
|
294
|
+
if (running) {
|
|
295
|
+
console.log(` ${yellow('!')} A daemon is running. Restart it with: ${cyan('pan-ui stop && pan-ui start --daemon')}`);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
console.log('');
|
|
299
|
+
} catch (err) {
|
|
300
|
+
console.log('');
|
|
301
|
+
console.log(` ${red('✗')} Update failed: ${err.message}`);
|
|
302
|
+
console.log(` ${dim('Try manually:')} ${cyan(`npm install -g ${PKG_NAME}@latest`)}`);
|
|
303
|
+
process.exit(1);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// ─── Sync Hermes ──────────────────────────────────────────────────────────
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Sync the local Hermes Agent install to Pan's pinned fork version.
|
|
311
|
+
* - If no hermes install exists: fresh clone from fork
|
|
312
|
+
* - If hermes exists: switch remote to fork, checkout pinned tag, reinstall
|
|
313
|
+
* - With --force: reinstall even if already on the correct version
|
|
314
|
+
*/
|
|
315
|
+
async function syncHermes(force = false) {
|
|
316
|
+
console.log('');
|
|
317
|
+
console.log(bold(' Hermes Agent Sync'));
|
|
318
|
+
console.log(dim(` Fork: ${HERMES_FORK_REPO}`));
|
|
319
|
+
console.log(dim(` Tag: ${HERMES_PINNED_TAG}`));
|
|
320
|
+
console.log(dim(` Version: ${HERMES_PINNED_VERSION || 'unknown'}`));
|
|
321
|
+
console.log('');
|
|
322
|
+
|
|
323
|
+
const hermesHome = join(homedir(), '.hermes');
|
|
324
|
+
const installDir = join(hermesHome, 'hermes-agent');
|
|
325
|
+
|
|
326
|
+
// Check current version
|
|
327
|
+
const hermesBin = detectHermesBinary();
|
|
328
|
+
if (hermesBin && !force) {
|
|
329
|
+
const version = detectHermesVersion(hermesBin);
|
|
330
|
+
const compat = checkHermesCompatibility(version);
|
|
331
|
+
if (compat.compatible && compat.installed === HERMES_PINNED_VERSION) {
|
|
332
|
+
console.log(` ${green('✓')} Already on the pinned version (${compat.installed})`);
|
|
333
|
+
console.log(` ${dim('Use --force to reinstall anyway')}`);
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
if (compat.installed) {
|
|
337
|
+
console.log(` ${dim('Current:')} ${yellow(compat.installed)} → ${green(HERMES_PINNED_VERSION)}`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Step 1: ensure git repo is pointing at our fork
|
|
342
|
+
if (existsSync(join(installDir, '.git'))) {
|
|
343
|
+
console.log(` ${cyan('→')} Switching to Euraika-Labs fork...`);
|
|
344
|
+
try {
|
|
345
|
+
const currentRemote = execSync('git remote get-url origin', {
|
|
346
|
+
cwd: installDir, encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore']
|
|
347
|
+
}).trim();
|
|
348
|
+
if (currentRemote !== HERMES_FORK_REPO) {
|
|
349
|
+
execSync(`git remote set-url origin ${HERMES_FORK_REPO}`, { cwd: installDir, stdio: 'ignore' });
|
|
350
|
+
// Keep upstream as a secondary remote for reference
|
|
351
|
+
try {
|
|
352
|
+
execSync('git remote get-url upstream', { cwd: installDir, stdio: 'ignore' });
|
|
353
|
+
} catch {
|
|
354
|
+
execSync(`git remote add upstream ${HERMES_VERSION_CONFIG?.upstream || 'https://github.com/NousResearch/hermes-agent.git'}`, {
|
|
355
|
+
cwd: installDir, stdio: 'ignore'
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
console.log(` ${green('✓')} Remote switched from ${dim(currentRemote)}`);
|
|
359
|
+
} else {
|
|
360
|
+
console.log(` ${green('✓')} Already pointing at fork`);
|
|
361
|
+
}
|
|
362
|
+
} catch (e) {
|
|
363
|
+
console.log(` ${yellow('!')} Could not update remote: ${e.message}`);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Step 2: fetch and checkout the pinned tag
|
|
367
|
+
console.log(` ${cyan('→')} Fetching ${HERMES_PINNED_TAG}...`);
|
|
368
|
+
try {
|
|
369
|
+
execSync(`git fetch origin --tags`, { cwd: installDir, stdio: 'inherit', timeout: 60_000 });
|
|
370
|
+
execSync(`git checkout ${HERMES_PINNED_TAG}`, { cwd: installDir, stdio: 'inherit', timeout: 30_000 });
|
|
371
|
+
console.log(` ${green('✓')} Checked out ${HERMES_PINNED_TAG}`);
|
|
372
|
+
} catch (e) {
|
|
373
|
+
console.log(` ${red('✗')} Fetch/checkout failed: ${e.message}`);
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
} else {
|
|
377
|
+
// Fresh clone
|
|
378
|
+
console.log(` ${cyan('→')} Cloning from fork...`);
|
|
379
|
+
mkdirSync(hermesHome, { recursive: true });
|
|
380
|
+
try {
|
|
381
|
+
execSync(
|
|
382
|
+
`git clone --branch ${HERMES_PINNED_TAG} ${HERMES_FORK_REPO} ${installDir}`,
|
|
383
|
+
{ stdio: 'inherit', timeout: 120_000 }
|
|
384
|
+
);
|
|
385
|
+
console.log(` ${green('✓')} Cloned`);
|
|
386
|
+
} catch (e) {
|
|
387
|
+
console.log(` ${red('✗')} Clone failed: ${e.message}`);
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// Step 3: reinstall in venv
|
|
393
|
+
console.log(` ${cyan('→')} Installing dependencies...`);
|
|
394
|
+
const localInstallScript = join(installDir, 'scripts', 'install.sh');
|
|
395
|
+
try {
|
|
396
|
+
if (existsSync(localInstallScript)) {
|
|
397
|
+
execSync(`bash ${localInstallScript} --skip-setup`, {
|
|
398
|
+
stdio: 'inherit', timeout: 300_000,
|
|
399
|
+
env: { ...process.env, HERMES_INSTALL_DIR: installDir }
|
|
400
|
+
});
|
|
401
|
+
} else {
|
|
402
|
+
const venvDir = join(installDir, 'venv');
|
|
403
|
+
if (!existsSync(venvDir)) {
|
|
404
|
+
execSync(`python3 -m venv ${venvDir}`, { stdio: 'inherit', timeout: 60_000 });
|
|
405
|
+
}
|
|
406
|
+
execSync(`${join(venvDir, 'bin', 'pip')} install -e ${installDir}`, {
|
|
407
|
+
stdio: 'inherit', timeout: 300_000
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
} catch (e) {
|
|
411
|
+
console.log(` ${red('✗')} Install failed: ${e.message}`);
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// Verify
|
|
416
|
+
const newBin = detectHermesBinary();
|
|
417
|
+
const newVersion = newBin ? detectHermesVersion(newBin) : null;
|
|
418
|
+
console.log('');
|
|
419
|
+
if (newBin) {
|
|
420
|
+
console.log(` ${green('✓')} Hermes synced: ${cyan(newVersion || 'unknown version')}`);
|
|
421
|
+
} else {
|
|
422
|
+
console.log(` ${yellow('!')} Install completed but hermes binary not found in PATH`);
|
|
423
|
+
console.log(` ${dim('You may need to restart your shell or source ~/.bashrc')}`);
|
|
424
|
+
}
|
|
425
|
+
console.log('');
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Install Hermes Agent from the Euraika-Labs fork at the pinned version tag.
|
|
430
|
+
* Uses git clone + pip install for reproducible, version-controlled installs.
|
|
431
|
+
* Falls back to the upstream install script if git is unavailable.
|
|
432
|
+
* Returns the hermes binary path on success, null on failure.
|
|
433
|
+
*/
|
|
434
|
+
async function installHermesAgent() {
|
|
435
|
+
console.log('');
|
|
436
|
+
console.log(` ${cyan('⬇')} Installing Hermes Agent ${HERMES_PINNED_VERSION ? `v${HERMES_PINNED_VERSION}` : ''}...`);
|
|
437
|
+
console.log(` ${dim(`Source: ${HERMES_FORK_REPO} @ ${HERMES_PINNED_TAG}`)}`);
|
|
438
|
+
console.log('');
|
|
439
|
+
|
|
440
|
+
const hermesHome = join(homedir(), '.hermes');
|
|
441
|
+
const installDir = join(hermesHome, 'hermes-agent');
|
|
442
|
+
|
|
443
|
+
try {
|
|
444
|
+
// Prefer our fork-based install for version control
|
|
445
|
+
mkdirSync(hermesHome, { recursive: true });
|
|
446
|
+
|
|
447
|
+
if (existsSync(installDir)) {
|
|
448
|
+
// Existing install — update to pinned tag
|
|
449
|
+
console.log(` ${dim('Existing install found, updating to pinned version...')}`);
|
|
450
|
+
execSync(`cd ${installDir} && git fetch origin && git checkout ${HERMES_PINNED_TAG}`, {
|
|
451
|
+
stdio: 'inherit', timeout: 120_000
|
|
452
|
+
});
|
|
453
|
+
} else {
|
|
454
|
+
// Fresh clone from our fork at the pinned tag
|
|
455
|
+
execSync(
|
|
456
|
+
`git clone --depth 1 --branch ${HERMES_PINNED_TAG} ${HERMES_FORK_REPO} ${installDir}`,
|
|
457
|
+
{ stdio: 'inherit', timeout: 120_000 }
|
|
458
|
+
);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// Set the remote to our fork (in case it was previously pointing at NousResearch)
|
|
462
|
+
try {
|
|
463
|
+
execSync(`cd ${installDir} && git remote set-url origin ${HERMES_FORK_REPO}`, { stdio: 'ignore' });
|
|
464
|
+
} catch {}
|
|
465
|
+
|
|
466
|
+
// Install in venv using the upstream install script from the cloned repo
|
|
467
|
+
const localInstallScript = join(installDir, 'scripts', 'install.sh');
|
|
468
|
+
if (existsSync(localInstallScript)) {
|
|
469
|
+
execSync(`bash ${localInstallScript} --skip-setup`, {
|
|
470
|
+
stdio: 'inherit', timeout: 300_000,
|
|
471
|
+
env: { ...process.env, HERMES_INSTALL_DIR: installDir }
|
|
472
|
+
});
|
|
473
|
+
} else {
|
|
474
|
+
// Fallback: direct pip install
|
|
475
|
+
const venvDir = join(installDir, 'venv');
|
|
476
|
+
if (!existsSync(venvDir)) {
|
|
477
|
+
execSync(`python3 -m venv ${venvDir}`, { stdio: 'inherit', timeout: 60_000 });
|
|
478
|
+
}
|
|
479
|
+
execSync(`${join(venvDir, 'bin', 'pip')} install -e ${installDir}`, {
|
|
480
|
+
stdio: 'inherit', timeout: 300_000
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
} catch (err) {
|
|
484
|
+
console.log('');
|
|
485
|
+
console.log(` ${red('✗')} Hermes installation failed: ${err.message}`);
|
|
486
|
+
console.log(` ${dim('Try installing manually:')}`);
|
|
487
|
+
console.log(` ${cyan(`curl -fsSL ${HERMES_INSTALL_URL} | bash`)}`);
|
|
488
|
+
return null;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// Find the binary after install
|
|
492
|
+
const possiblePaths = [
|
|
493
|
+
join(installDir, 'venv', 'bin', 'hermes'),
|
|
494
|
+
join(installDir, '.venv', 'bin', 'hermes'),
|
|
495
|
+
join(homedir(), '.local', 'bin', 'hermes'),
|
|
496
|
+
];
|
|
497
|
+
|
|
498
|
+
// Also try sourcing the updated shell profile
|
|
499
|
+
try {
|
|
500
|
+
const shell = process.env.SHELL || '/bin/bash';
|
|
501
|
+
const rcFile = shell.endsWith('zsh') ? '~/.zshrc' : '~/.bashrc';
|
|
502
|
+
const found = execSync(
|
|
503
|
+
`source ${rcFile} 2>/dev/null; command -v hermes`,
|
|
504
|
+
{ encoding: 'utf-8', shell: '/bin/bash', stdio: ['ignore', 'pipe', 'ignore'], timeout: 5000 }
|
|
505
|
+
).trim();
|
|
506
|
+
if (found) return found;
|
|
507
|
+
} catch {}
|
|
508
|
+
|
|
509
|
+
for (const p of possiblePaths) {
|
|
510
|
+
if (existsSync(p)) return p;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// Last resort: maybe it's in PATH now after install
|
|
514
|
+
return detectHermesBinary();
|
|
515
|
+
}
|
|
516
|
+
|
|
111
517
|
// ─── .env parser/writer ─────────────────────────────────────────────────────
|
|
112
518
|
|
|
113
519
|
function loadEnv(envPath) {
|
|
@@ -133,7 +539,7 @@ function loadEnv(envPath) {
|
|
|
133
539
|
function writeEnv(envPath, env) {
|
|
134
540
|
const header = [
|
|
135
541
|
'# Pan UI configuration',
|
|
136
|
-
'# Generated by:
|
|
542
|
+
'# Generated by: pan-ui setup',
|
|
137
543
|
`# Updated: ${new Date().toISOString()}`,
|
|
138
544
|
'',
|
|
139
545
|
];
|
|
@@ -257,17 +663,52 @@ async function setup(forceWizard = false) {
|
|
|
257
663
|
env.HERMES_MOCK_MODE = (mockAnswer === 'true' || mockAnswer === 'yes') ? 'true' : (mockAnswer || currentMock);
|
|
258
664
|
console.log('');
|
|
259
665
|
|
|
260
|
-
// ── Step 6: Diagnostics
|
|
666
|
+
// ── Step 6: Diagnostics & Auto-Install ─────────────────────────────────
|
|
261
667
|
|
|
262
668
|
console.log(bold(' 6/6 Environment Check'));
|
|
263
669
|
|
|
264
|
-
|
|
670
|
+
let hermesBin = detectHermesBinary();
|
|
265
671
|
if (hermesBin) {
|
|
266
672
|
const version = detectHermesVersion(hermesBin);
|
|
267
673
|
console.log(` ${green('✓')} Hermes binary: ${cyan(hermesBin)}${version ? ` (${version})` : ''}`);
|
|
674
|
+
|
|
675
|
+
// Check version compatibility with Pan's pinned range
|
|
676
|
+
const compat = checkHermesCompatibility(version);
|
|
677
|
+
if (!compat.compatible) {
|
|
678
|
+
console.log(` ${yellow('⚠')} ${compat.message}`);
|
|
679
|
+
console.log(` ${dim(`Pan is tested with Hermes ${HERMES_PINNED_VERSION} (${HERMES_FORK_REPO} @ ${HERMES_PINNED_TAG})`)}`);
|
|
680
|
+
console.log(` ${dim('Run:')} ${cyan('pan-ui sync-hermes')} ${dim('to install the compatible version')}`);
|
|
681
|
+
}
|
|
268
682
|
} else {
|
|
269
|
-
console.log(` ${yellow('!')} Hermes
|
|
270
|
-
console.log(`
|
|
683
|
+
console.log(` ${yellow('!')} Hermes Agent not found in PATH`);
|
|
684
|
+
console.log(` ${dim('Pan needs Hermes Agent to function — sessions, skills, memory, and the gateway all require it.')}`);
|
|
685
|
+
console.log('');
|
|
686
|
+
const doInstall = (await ask(` ${bold('Install Hermes Agent now? [Y/n]:')} `)).trim().toLowerCase();
|
|
687
|
+
|
|
688
|
+
if (doInstall === '' || doInstall === 'y' || doInstall === 'yes') {
|
|
689
|
+
hermesBin = await installHermesAgent();
|
|
690
|
+
if (hermesBin) {
|
|
691
|
+
const version = detectHermesVersion(hermesBin);
|
|
692
|
+
console.log('');
|
|
693
|
+
console.log(` ${green('✓')} Hermes installed: ${cyan(hermesBin)}${version ? ` (${version})` : ''}`);
|
|
694
|
+
|
|
695
|
+
// Update HERMES_HOME if it was just the default and install created it
|
|
696
|
+
const newHome = detectHermesHome();
|
|
697
|
+
if (newHome && newHome !== env.HERMES_HOME) {
|
|
698
|
+
env.HERMES_HOME = newHome;
|
|
699
|
+
console.log(` ${green('✓')} HERMES_HOME updated to ${cyan(newHome)}`);
|
|
700
|
+
}
|
|
701
|
+
} else {
|
|
702
|
+
console.log('');
|
|
703
|
+
console.log(` ${yellow('⚠')} Installation did not succeed. Pan will start but with limited functionality.`);
|
|
704
|
+
console.log(` ${dim('Install manually later:')}`);
|
|
705
|
+
console.log(` ${cyan(`curl -fsSL ${HERMES_INSTALL_URL} | bash`)}`);
|
|
706
|
+
}
|
|
707
|
+
} else {
|
|
708
|
+
console.log(` ${dim('Skipped. Pan will start in limited mode without Hermes.')}`);
|
|
709
|
+
console.log(` ${dim('Install later:')}`);
|
|
710
|
+
console.log(` ${cyan(`curl -fsSL ${HERMES_INSTALL_URL} | bash`)}`);
|
|
711
|
+
}
|
|
271
712
|
}
|
|
272
713
|
|
|
273
714
|
if (detectPython()) {
|
|
@@ -282,7 +723,20 @@ async function setup(forceWizard = false) {
|
|
|
282
723
|
if (existsSync(configPath)) {
|
|
283
724
|
console.log(` ${green('✓')} config.yaml found`);
|
|
284
725
|
} else {
|
|
285
|
-
|
|
726
|
+
// If hermes is available, offer to run setup
|
|
727
|
+
if (hermesBin) {
|
|
728
|
+
console.log(` ${yellow('!')} config.yaml not found — running ${cyan('hermes setup')} to initialize...`);
|
|
729
|
+
try {
|
|
730
|
+
execSync(`${hermesBin} setup --non-interactive 2>/dev/null || true`, {
|
|
731
|
+
stdio: 'inherit',
|
|
732
|
+
timeout: 30_000,
|
|
733
|
+
});
|
|
734
|
+
} catch {
|
|
735
|
+
console.log(` ${yellow('!')} config.yaml not found — run ${cyan('hermes setup')} to configure API keys`);
|
|
736
|
+
}
|
|
737
|
+
} else {
|
|
738
|
+
console.log(` ${yellow('!')} config.yaml not found — run ${cyan('hermes setup')} after installing Hermes`);
|
|
739
|
+
}
|
|
286
740
|
}
|
|
287
741
|
}
|
|
288
742
|
|
|
@@ -296,7 +750,7 @@ async function setup(forceWizard = false) {
|
|
|
296
750
|
|
|
297
751
|
writeEnv(ENV_PATH, env);
|
|
298
752
|
console.log(` ${green('✓')} Configuration saved to ${cyan(ENV_PATH)}`);
|
|
299
|
-
console.log(` ${dim('Re-run with:')} ${cyan('
|
|
753
|
+
console.log(` ${dim('Re-run with:')} ${cyan('pan-ui setup')}`);
|
|
300
754
|
console.log('');
|
|
301
755
|
|
|
302
756
|
return env;
|
|
@@ -440,7 +894,7 @@ function startDaemon(env, portOverride) {
|
|
|
440
894
|
const { running, pid: existingPid } = getDaemonStatus();
|
|
441
895
|
if (running) {
|
|
442
896
|
console.log(` ${yellow('!')} Pan UI is already running (PID ${existingPid})`);
|
|
443
|
-
console.log(` ${dim('Stop with:')} ${cyan('
|
|
897
|
+
console.log(` ${dim('Stop with:')} ${cyan('pan-ui stop')}`);
|
|
444
898
|
process.exit(0);
|
|
445
899
|
}
|
|
446
900
|
|
|
@@ -494,9 +948,9 @@ function startDaemon(env, portOverride) {
|
|
|
494
948
|
console.log(` ${dim('Local:')} ${cyan(`http://localhost:${port}`)}`);
|
|
495
949
|
console.log(` ${dim('Log:')} ${cyan(LOG_FILE)}`);
|
|
496
950
|
console.log('');
|
|
497
|
-
console.log(` ${dim('Stop with:')} ${cyan('
|
|
498
|
-
console.log(` ${dim('View logs:')} ${cyan('
|
|
499
|
-
console.log(` ${dim('Check status:')} ${cyan('
|
|
951
|
+
console.log(` ${dim('Stop with:')} ${cyan('pan-ui stop')}`);
|
|
952
|
+
console.log(` ${dim('View logs:')} ${cyan('pan-ui logs')}`);
|
|
953
|
+
console.log(` ${dim('Check status:')} ${cyan('pan-ui status')}`);
|
|
500
954
|
console.log('');
|
|
501
955
|
}
|
|
502
956
|
|
|
@@ -532,7 +986,7 @@ function showStatus() {
|
|
|
532
986
|
} else {
|
|
533
987
|
console.log('');
|
|
534
988
|
console.log(` ${red('●')} Pan UI is ${red('stopped')}`);
|
|
535
|
-
console.log(` ${dim('Start with:')} ${cyan('
|
|
989
|
+
console.log(` ${dim('Start with:')} ${cyan('pan-ui start --daemon')}`);
|
|
536
990
|
console.log('');
|
|
537
991
|
}
|
|
538
992
|
}
|
|
@@ -602,7 +1056,7 @@ WantedBy=default.target
|
|
|
602
1056
|
async function serviceInstall() {
|
|
603
1057
|
if (platform() !== 'linux') {
|
|
604
1058
|
console.log(` ${red('✗')} Systemd services are only supported on Linux.`);
|
|
605
|
-
console.log(` ${dim('Use')} ${cyan('
|
|
1059
|
+
console.log(` ${dim('Use')} ${cyan('pan-ui start --daemon')} ${dim('instead.')}`);
|
|
606
1060
|
process.exit(1);
|
|
607
1061
|
}
|
|
608
1062
|
|
|
@@ -669,7 +1123,7 @@ function doServiceInstall(env) {
|
|
|
669
1123
|
console.log(` ${cyan(`systemctl --user status ${SERVICE_NAME}`)}`);
|
|
670
1124
|
console.log(` ${cyan(`systemctl --user restart ${SERVICE_NAME}`)}`);
|
|
671
1125
|
console.log(` ${cyan(`journalctl --user -u ${SERVICE_NAME} -f`)}`);
|
|
672
|
-
console.log(` ${cyan(`
|
|
1126
|
+
console.log(` ${cyan(`pan-ui service remove`)}`);
|
|
673
1127
|
console.log('');
|
|
674
1128
|
}
|
|
675
1129
|
|
|
@@ -719,7 +1173,7 @@ function serviceStatus() {
|
|
|
719
1173
|
} catch (err) {
|
|
720
1174
|
// systemctl returns non-zero for inactive services
|
|
721
1175
|
if (err.stdout) console.log(err.stdout);
|
|
722
|
-
else console.log(` ${dim('Service not installed. Run:')} ${cyan('
|
|
1176
|
+
else console.log(` ${dim('Service not installed. Run:')} ${cyan('pan-ui service install')}`);
|
|
723
1177
|
}
|
|
724
1178
|
}
|
|
725
1179
|
|
|
@@ -729,7 +1183,8 @@ async function main() {
|
|
|
729
1183
|
const args = process.argv.slice(2);
|
|
730
1184
|
const command = args[0];
|
|
731
1185
|
|
|
732
|
-
// Parse
|
|
1186
|
+
// Parse global flags from any position
|
|
1187
|
+
const allArgs = new Set(args);
|
|
733
1188
|
let portOverride = null;
|
|
734
1189
|
const portIdx = args.indexOf('--port');
|
|
735
1190
|
if (portIdx !== -1 && args[portIdx + 1]) {
|
|
@@ -740,8 +1195,15 @@ async function main() {
|
|
|
740
1195
|
portOverride = args[shortPortIdx + 1];
|
|
741
1196
|
}
|
|
742
1197
|
|
|
743
|
-
|
|
744
|
-
|
|
1198
|
+
const isDaemon = allArgs.has('--daemon') || allArgs.has('-d');
|
|
1199
|
+
|
|
1200
|
+
// ── Version ────────────────────────────────────────────────────────────
|
|
1201
|
+
|
|
1202
|
+
if (command === 'version' || command === '--version' || command === '-v') {
|
|
1203
|
+
rl.close();
|
|
1204
|
+
console.log(`pan-ui ${getCurrentVersion()}`);
|
|
1205
|
+
process.exit(0);
|
|
1206
|
+
}
|
|
745
1207
|
|
|
746
1208
|
// ── Stop ──────────────────────────────────────────────────────────────
|
|
747
1209
|
|
|
@@ -789,65 +1251,104 @@ async function main() {
|
|
|
789
1251
|
rl.close();
|
|
790
1252
|
console.log('');
|
|
791
1253
|
console.log(` ${dim('Usage:')}`);
|
|
792
|
-
console.log(` ${cyan('
|
|
793
|
-
console.log(` ${cyan('
|
|
794
|
-
console.log(` ${cyan('
|
|
1254
|
+
console.log(` ${cyan('pan-ui service install')} Install systemd user service`);
|
|
1255
|
+
console.log(` ${cyan('pan-ui service remove')} Remove systemd user service`);
|
|
1256
|
+
console.log(` ${cyan('pan-ui service status')} Show service status`);
|
|
795
1257
|
console.log('');
|
|
796
1258
|
process.exit(1);
|
|
797
1259
|
}
|
|
798
1260
|
|
|
1261
|
+
// ── Update ────────────────────────────────────────────────────────────
|
|
1262
|
+
|
|
1263
|
+
if (command === 'update' || command === 'upgrade') {
|
|
1264
|
+
rl.close();
|
|
1265
|
+
await performUpdate();
|
|
1266
|
+
process.exit(0);
|
|
1267
|
+
}
|
|
1268
|
+
|
|
1269
|
+
// ── Sync Hermes ──────────────────────────────────────────────────────
|
|
1270
|
+
|
|
1271
|
+
if (command === 'sync-hermes') {
|
|
1272
|
+
rl.close();
|
|
1273
|
+
await syncHermes(allArgs.has('--force'));
|
|
1274
|
+
process.exit(0);
|
|
1275
|
+
}
|
|
1276
|
+
|
|
799
1277
|
// ── Setup ─────────────────────────────────────────────────────────────
|
|
800
1278
|
|
|
801
1279
|
if (command === 'setup') {
|
|
802
1280
|
const env = await setup(true);
|
|
803
1281
|
rl.close();
|
|
804
|
-
console.log(` ${dim('Start with:')} ${cyan('
|
|
1282
|
+
console.log(` ${dim('Start with:')} ${cyan('pan-ui start')}`);
|
|
805
1283
|
console.log('');
|
|
806
1284
|
process.exit(0);
|
|
807
1285
|
}
|
|
808
1286
|
|
|
809
1287
|
// ── Help ──────────────────────────────────────────────────────────────
|
|
810
1288
|
|
|
811
|
-
if (command === '--help' || command === '-h') {
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
console.log('');
|
|
815
|
-
console.log(' Usage:');
|
|
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`);
|
|
826
|
-
console.log('');
|
|
827
|
-
console.log(' Environment variables:');
|
|
828
|
-
console.log(` ${dim('HERMES_HOME')} Path to Hermes home (default: ~/.hermes)`);
|
|
829
|
-
console.log(` ${dim('HERMES_API_BASE_URL')} Hermes API server URL (default: http://127.0.0.1:8642)`);
|
|
830
|
-
console.log(` ${dim('HERMES_API_KEY')} API key for Hermes API server`);
|
|
831
|
-
console.log(` ${dim('HERMES_WORKSPACE_USERNAME')} Login username (default: admin)`);
|
|
832
|
-
console.log(` ${dim('HERMES_WORKSPACE_PASSWORD')} Login password (default: changeme)`);
|
|
833
|
-
console.log(` ${dim('HERMES_WORKSPACE_SECRET')} Session signing secret`);
|
|
834
|
-
console.log(` ${dim('HERMES_MOCK_MODE')} Enable mock data (default: false)`);
|
|
835
|
-
console.log(` ${dim('PORT')} Server port (default: 3199)`);
|
|
836
|
-
console.log('');
|
|
1289
|
+
if (command === 'help' || command === '--help' || command === '-h') {
|
|
1290
|
+
rl.close();
|
|
1291
|
+
showHelp();
|
|
837
1292
|
process.exit(0);
|
|
838
1293
|
}
|
|
839
1294
|
|
|
840
|
-
// ──
|
|
1295
|
+
// ── Start (explicit or default) ───────────────────────────────────────
|
|
841
1296
|
|
|
842
|
-
|
|
843
|
-
|
|
1297
|
+
if (command === 'start' || !command || command.startsWith('-')) {
|
|
1298
|
+
const env = await setup(false);
|
|
1299
|
+
rl.close();
|
|
844
1300
|
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
1301
|
+
// Non-blocking update check at startup
|
|
1302
|
+
showUpdateNotice();
|
|
1303
|
+
|
|
1304
|
+
if (isDaemon) {
|
|
1305
|
+
await startDaemon(env, portOverride);
|
|
1306
|
+
process.exit(0);
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
startServer(env, portOverride);
|
|
1310
|
+
return;
|
|
848
1311
|
}
|
|
849
1312
|
|
|
850
|
-
|
|
1313
|
+
// ── Unknown command ───────────────────────────────────────────────────
|
|
1314
|
+
|
|
1315
|
+
rl.close();
|
|
1316
|
+
console.log('');
|
|
1317
|
+
console.log(` ${red('✗')} Unknown command: ${cyan(command)}`);
|
|
1318
|
+
console.log('');
|
|
1319
|
+
showHelp();
|
|
1320
|
+
process.exit(1);
|
|
1321
|
+
}
|
|
1322
|
+
|
|
1323
|
+
function showHelp() {
|
|
1324
|
+
console.log('');
|
|
1325
|
+
console.log(bold(' pan-ui') + dim(` v${getCurrentVersion()} — Beautiful WebUI for Hermes Agent`));
|
|
1326
|
+
console.log('');
|
|
1327
|
+
console.log(' ' + bold('Commands:'));
|
|
1328
|
+
console.log(` ${cyan('pan-ui start')} Start the workspace (foreground)`);
|
|
1329
|
+
console.log(` ${cyan('pan-ui start --daemon')} Start in background`);
|
|
1330
|
+
console.log(` ${cyan('pan-ui start --port 8080')} Custom port`);
|
|
1331
|
+
console.log(` ${cyan('pan-ui stop')} Stop background daemon`);
|
|
1332
|
+
console.log(` ${cyan('pan-ui status')} Check if running`);
|
|
1333
|
+
console.log(` ${cyan('pan-ui logs')} Tail daemon logs`);
|
|
1334
|
+
console.log(` ${cyan('pan-ui setup')} Run setup wizard`);
|
|
1335
|
+
console.log(` ${cyan('pan-ui update')} Check for and install Pan updates`);
|
|
1336
|
+
console.log(` ${cyan('pan-ui sync-hermes')} Sync Hermes to the pinned version`);
|
|
1337
|
+
console.log(` ${cyan('pan-ui version')} Show current version`);
|
|
1338
|
+
console.log(` ${cyan('pan-ui service install')} Install as systemd user service`);
|
|
1339
|
+
console.log(` ${cyan('pan-ui service remove')} Remove systemd service`);
|
|
1340
|
+
console.log(` ${cyan('pan-ui help')} Show this help`);
|
|
1341
|
+
console.log('');
|
|
1342
|
+
console.log(' ' + bold('Environment variables:'));
|
|
1343
|
+
console.log(` ${dim('HERMES_HOME')} Path to Hermes home (default: ~/.hermes)`);
|
|
1344
|
+
console.log(` ${dim('HERMES_API_BASE_URL')} Hermes API server URL (default: http://127.0.0.1:8642)`);
|
|
1345
|
+
console.log(` ${dim('HERMES_API_KEY')} API key for Hermes API server`);
|
|
1346
|
+
console.log(` ${dim('HERMES_WORKSPACE_USERNAME')} Login username (default: admin)`);
|
|
1347
|
+
console.log(` ${dim('HERMES_WORKSPACE_PASSWORD')} Login password (default: changeme)`);
|
|
1348
|
+
console.log(` ${dim('HERMES_WORKSPACE_SECRET')} Session signing secret`);
|
|
1349
|
+
console.log(` ${dim('HERMES_MOCK_MODE')} Enable mock data (default: false)`);
|
|
1350
|
+
console.log(` ${dim('PORT')} Server port (default: 3199)`);
|
|
1351
|
+
console.log('');
|
|
851
1352
|
}
|
|
852
1353
|
|
|
853
1354
|
main().catch((err) => {
|