@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.
Files changed (460) hide show
  1. package/.next/standalone/node_modules/next/node_modules/postcss/package.json +0 -0
  2. package/.next/standalone/package.json +7 -1
  3. package/.next/standalone/server.js +1 -1
  4. package/.next/static/H9AHLxE6FxdsWBnoBgfVx/_buildManifest.js +1 -0
  5. package/.next/{standalone/.next/static/chunks/5449-aba2dafba76d4508.js → static/chunks/4611-6b95c4a66713a3f3.js} +1 -1
  6. package/.next/static/chunks/5097-0a676d90b3a410e0.js +1 -0
  7. package/.next/{standalone/.next/static/chunks/app/_not-found/page-9c90a6b39424f003.js → static/chunks/app/_not-found/page-c4591bba1afe868d.js} +1 -1
  8. package/.next/{standalone/.next/static/chunks/app/api/audit/route-bb3f5b9060cdc631.js → static/chunks/app/api/audit/route-bc3ee2d6661cba9d.js} +1 -1
  9. package/.next/{standalone/.next/static/chunks/app/api/auth/login/route-bb3f5b9060cdc631.js → static/chunks/app/api/auth/login/route-bc3ee2d6661cba9d.js} +1 -1
  10. package/.next/{standalone/.next/static/chunks/app/api/auth/logout/route-bb3f5b9060cdc631.js → static/chunks/app/api/auth/logout/route-bc3ee2d6661cba9d.js} +1 -1
  11. 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
  12. package/.next/static/chunks/app/api/chat/sessions/[id]/route-bc3ee2d6661cba9d.js +1 -0
  13. package/.next/static/chunks/app/api/chat/sessions/route-bc3ee2d6661cba9d.js +1 -0
  14. package/.next/static/chunks/app/api/chat/stream/route-bc3ee2d6661cba9d.js +1 -0
  15. package/.next/static/chunks/app/api/extensions/[id]/capabilities/[capabilityId]/route-bc3ee2d6661cba9d.js +1 -0
  16. package/.next/static/chunks/app/api/extensions/[id]/route-bc3ee2d6661cba9d.js +1 -0
  17. package/.next/static/chunks/app/api/extensions/[id]/test/route-bc3ee2d6661cba9d.js +1 -0
  18. package/.next/static/chunks/app/api/extensions/mcp/route-bc3ee2d6661cba9d.js +1 -0
  19. package/.next/static/chunks/app/api/extensions/route-bc3ee2d6661cba9d.js +1 -0
  20. package/.next/static/chunks/app/api/memory/agent/route-bc3ee2d6661cba9d.js +1 -0
  21. package/.next/static/chunks/app/api/memory/context-inspector/route-bc3ee2d6661cba9d.js +1 -0
  22. package/.next/static/chunks/app/api/memory/session-search/route-bc3ee2d6661cba9d.js +1 -0
  23. package/.next/static/chunks/app/api/memory/user/route-bc3ee2d6661cba9d.js +1 -0
  24. package/.next/static/chunks/app/api/profiles/[id]/config/route-bc3ee2d6661cba9d.js +1 -0
  25. package/.next/static/chunks/app/api/profiles/[id]/route-bc3ee2d6661cba9d.js +1 -0
  26. package/.next/static/chunks/app/api/profiles/route-bc3ee2d6661cba9d.js +1 -0
  27. package/.next/static/chunks/app/api/runtime/approvals/[toolCallId]/route-bc3ee2d6661cba9d.js +1 -0
  28. package/.next/static/chunks/app/api/runtime/approvals/route-bc3ee2d6661cba9d.js +1 -0
  29. package/.next/static/chunks/app/api/runtime/artifacts/download/route-bc3ee2d6661cba9d.js +1 -0
  30. package/.next/static/chunks/app/api/runtime/artifacts/route-bc3ee2d6661cba9d.js +1 -0
  31. package/.next/static/chunks/app/api/runtime/export/route-bc3ee2d6661cba9d.js +1 -0
  32. package/.next/static/chunks/app/api/runtime/health/route-bc3ee2d6661cba9d.js +1 -0
  33. package/.next/static/chunks/app/api/runtime/mcp-probes/route-bc3ee2d6661cba9d.js +1 -0
  34. package/.next/static/chunks/app/api/runtime/runs/[id]/route-bc3ee2d6661cba9d.js +1 -0
  35. package/.next/static/chunks/app/api/runtime/runs/route-bc3ee2d6661cba9d.js +1 -0
  36. package/.next/static/chunks/app/api/runtime/status/route-bc3ee2d6661cba9d.js +1 -0
  37. package/.next/static/chunks/app/api/runtime/telemetry/route-bc3ee2d6661cba9d.js +1 -0
  38. package/.next/static/chunks/app/api/runtime/timeline/route-bc3ee2d6661cba9d.js +1 -0
  39. package/.next/static/chunks/app/api/runtime/update-check/route-bc3ee2d6661cba9d.js +1 -0
  40. package/.next/static/chunks/app/api/skills/[id]/disable/route-bc3ee2d6661cba9d.js +1 -0
  41. package/.next/static/chunks/app/api/skills/[id]/enable/route-bc3ee2d6661cba9d.js +1 -0
  42. package/.next/static/chunks/app/api/skills/[id]/files/route-bc3ee2d6661cba9d.js +1 -0
  43. package/.next/static/chunks/app/api/skills/[id]/install/route-bc3ee2d6661cba9d.js +1 -0
  44. package/.next/static/chunks/app/api/skills/[id]/load/route-bc3ee2d6661cba9d.js +1 -0
  45. package/.next/static/chunks/app/api/skills/[id]/route-bc3ee2d6661cba9d.js +1 -0
  46. package/.next/static/chunks/app/api/skills/catalog/route-bc3ee2d6661cba9d.js +1 -0
  47. package/.next/static/chunks/app/api/skills/categories/route-bc3ee2d6661cba9d.js +1 -0
  48. package/.next/static/chunks/app/api/skills/hub/install/route-bc3ee2d6661cba9d.js +1 -0
  49. package/.next/static/chunks/app/api/skills/hub/route-bc3ee2d6661cba9d.js +1 -0
  50. package/.next/static/chunks/app/api/skills/route-bc3ee2d6661cba9d.js +1 -0
  51. package/.next/static/chunks/app/api/telemetry/route-bc3ee2d6661cba9d.js +1 -0
  52. package/.next/static/chunks/app/api/uploads/route-bc3ee2d6661cba9d.js +1 -0
  53. package/.next/static/chunks/app/chat/page-fc4e161d14189132.js +1 -0
  54. package/.next/static/chunks/app/extensions/[id]/page-29eb52748adffbe1.js +1 -0
  55. package/.next/static/chunks/app/extensions/{page-c0fbb8efa9a3700c.js → page-6c558f23e432e258.js} +1 -1
  56. package/.next/static/chunks/app/layout-f3c578dd4202f2f5.js +1 -0
  57. package/.next/static/chunks/app/login/page-a3820386479beb5e.js +1 -0
  58. package/.next/static/chunks/app/memory/page-25758dcc848051cd.js +1 -0
  59. package/.next/static/chunks/app/page-bc3ee2d6661cba9d.js +1 -0
  60. package/.next/static/chunks/app/profiles/page-d30d62bab24f9586.js +1 -0
  61. package/.next/static/chunks/app/settings/approvals/{page-6843c585791e4db7.js → page-584452b077852c52.js} +1 -1
  62. package/.next/static/chunks/app/settings/artifacts/page-ca8b5d224787c098.js +1 -0
  63. package/.next/{standalone/.next/static/chunks/app/settings/audit/page-378bee43dd7c4903.js → static/chunks/app/settings/audit/page-26646388ec7f31a8.js} +1 -1
  64. package/.next/static/chunks/app/settings/health/page-28a2e023528ccd90.js +1 -0
  65. package/.next/static/chunks/app/settings/mcp-diagnostics/page-16915e0e513e44f7.js +1 -0
  66. package/.next/{standalone/.next/static/chunks/app/settings/page-8a40bdf895f43430.js → static/chunks/app/settings/page-e5a118618f94a163.js} +1 -1
  67. package/.next/static/chunks/app/settings/runs/[id]/page-936ee45da0921cdd.js +1 -0
  68. package/.next/static/chunks/app/settings/runs/page-2b170e0de57aeaa9.js +1 -0
  69. package/.next/{standalone/.next/static/chunks/app/settings/telemetry/page-c0446baefa5496cb.js → static/chunks/app/settings/telemetry/page-ff92d728e128b25a.js} +1 -1
  70. package/.next/static/chunks/app/skills/[id]/page-2858305b3f82198b.js +1 -0
  71. package/.next/static/chunks/app/skills/page-ce19f262a41f5924.js +1 -0
  72. package/.next/{standalone/.next/static/chunks/main-app-a9e2c007d433eaf9.js → static/chunks/main-app-f0e3f2828aa879c4.js} +1 -1
  73. package/.next/static/css/c673dd080485d07a.css +3 -0
  74. package/README.md +167 -144
  75. package/bin/pan-ui.mjs +565 -64
  76. package/hermes.version.json +17 -0
  77. package/package.json +7 -1
  78. package/.env.example +0 -30
  79. package/.next/standalone/.next/BUILD_ID +0 -1
  80. package/.next/standalone/.next/app-build-manifest.json +0 -508
  81. package/.next/standalone/.next/app-path-routes-manifest.json +0 -67
  82. package/.next/standalone/.next/build-manifest.json +0 -33
  83. package/.next/standalone/.next/package.json +0 -1
  84. package/.next/standalone/.next/prerender-manifest.json +0 -119
  85. package/.next/standalone/.next/react-loadable-manifest.json +0 -1
  86. package/.next/standalone/.next/required-server-files.json +0 -321
  87. package/.next/standalone/.next/routes-manifest.json +0 -295
  88. package/.next/standalone/.next/server/app/_not-found/page.js +0 -2
  89. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +0 -1
  90. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +0 -1
  91. package/.next/standalone/.next/server/app/_not-found.html +0 -1
  92. package/.next/standalone/.next/server/app/_not-found.meta +0 -8
  93. package/.next/standalone/.next/server/app/_not-found.rsc +0 -18
  94. package/.next/standalone/.next/server/app/api/audit/route.js +0 -36
  95. package/.next/standalone/.next/server/app/api/audit/route.js.nft.json +0 -1
  96. package/.next/standalone/.next/server/app/api/audit/route_client-reference-manifest.js +0 -1
  97. package/.next/standalone/.next/server/app/api/auth/login/route.js +0 -1
  98. package/.next/standalone/.next/server/app/api/auth/login/route.js.nft.json +0 -1
  99. package/.next/standalone/.next/server/app/api/auth/login/route_client-reference-manifest.js +0 -1
  100. package/.next/standalone/.next/server/app/api/auth/logout/route.js +0 -1
  101. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +0 -1
  102. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +0 -1
  103. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/fork/route.js +0 -1
  104. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/fork/route.js.nft.json +0 -1
  105. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/fork/route_client-reference-manifest.js +0 -1
  106. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route.js +0 -1
  107. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route.js.nft.json +0 -1
  108. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route_client-reference-manifest.js +0 -1
  109. package/.next/standalone/.next/server/app/api/chat/sessions/route.js +0 -1
  110. package/.next/standalone/.next/server/app/api/chat/sessions/route.js.nft.json +0 -1
  111. package/.next/standalone/.next/server/app/api/chat/sessions/route_client-reference-manifest.js +0 -1
  112. package/.next/standalone/.next/server/app/api/chat/stream/route.js +0 -170
  113. package/.next/standalone/.next/server/app/api/chat/stream/route.js.nft.json +0 -1
  114. package/.next/standalone/.next/server/app/api/chat/stream/route_client-reference-manifest.js +0 -1
  115. package/.next/standalone/.next/server/app/api/extensions/[id]/capabilities/[capabilityId]/route.js +0 -1
  116. package/.next/standalone/.next/server/app/api/extensions/[id]/capabilities/[capabilityId]/route.js.nft.json +0 -1
  117. package/.next/standalone/.next/server/app/api/extensions/[id]/capabilities/[capabilityId]/route_client-reference-manifest.js +0 -1
  118. package/.next/standalone/.next/server/app/api/extensions/[id]/route.js +0 -1
  119. package/.next/standalone/.next/server/app/api/extensions/[id]/route.js.nft.json +0 -1
  120. package/.next/standalone/.next/server/app/api/extensions/[id]/route_client-reference-manifest.js +0 -1
  121. package/.next/standalone/.next/server/app/api/extensions/[id]/test/route.js +0 -1
  122. package/.next/standalone/.next/server/app/api/extensions/[id]/test/route.js.nft.json +0 -1
  123. package/.next/standalone/.next/server/app/api/extensions/[id]/test/route_client-reference-manifest.js +0 -1
  124. package/.next/standalone/.next/server/app/api/extensions/mcp/route.js +0 -11
  125. package/.next/standalone/.next/server/app/api/extensions/mcp/route.js.nft.json +0 -1
  126. package/.next/standalone/.next/server/app/api/extensions/mcp/route_client-reference-manifest.js +0 -1
  127. package/.next/standalone/.next/server/app/api/extensions/route.js +0 -1
  128. package/.next/standalone/.next/server/app/api/extensions/route.js.nft.json +0 -1
  129. package/.next/standalone/.next/server/app/api/extensions/route_client-reference-manifest.js +0 -1
  130. package/.next/standalone/.next/server/app/api/memory/agent/route.js +0 -36
  131. package/.next/standalone/.next/server/app/api/memory/agent/route.js.nft.json +0 -1
  132. package/.next/standalone/.next/server/app/api/memory/agent/route_client-reference-manifest.js +0 -1
  133. package/.next/standalone/.next/server/app/api/memory/context-inspector/route.js +0 -1
  134. package/.next/standalone/.next/server/app/api/memory/context-inspector/route.js.nft.json +0 -1
  135. package/.next/standalone/.next/server/app/api/memory/context-inspector/route_client-reference-manifest.js +0 -1
  136. package/.next/standalone/.next/server/app/api/memory/session-search/route.js +0 -1
  137. package/.next/standalone/.next/server/app/api/memory/session-search/route.js.nft.json +0 -1
  138. package/.next/standalone/.next/server/app/api/memory/session-search/route_client-reference-manifest.js +0 -1
  139. package/.next/standalone/.next/server/app/api/memory/user/route.js +0 -36
  140. package/.next/standalone/.next/server/app/api/memory/user/route.js.nft.json +0 -1
  141. package/.next/standalone/.next/server/app/api/memory/user/route_client-reference-manifest.js +0 -1
  142. package/.next/standalone/.next/server/app/api/profiles/[id]/config/route.js +0 -92
  143. package/.next/standalone/.next/server/app/api/profiles/[id]/config/route.js.nft.json +0 -1
  144. package/.next/standalone/.next/server/app/api/profiles/[id]/config/route_client-reference-manifest.js +0 -1
  145. package/.next/standalone/.next/server/app/api/profiles/[id]/route.js +0 -31
  146. package/.next/standalone/.next/server/app/api/profiles/[id]/route.js.nft.json +0 -1
  147. package/.next/standalone/.next/server/app/api/profiles/[id]/route_client-reference-manifest.js +0 -1
  148. package/.next/standalone/.next/server/app/api/profiles/route.js +0 -31
  149. package/.next/standalone/.next/server/app/api/profiles/route.js.nft.json +0 -1
  150. package/.next/standalone/.next/server/app/api/profiles/route_client-reference-manifest.js +0 -1
  151. package/.next/standalone/.next/server/app/api/runtime/approvals/[toolCallId]/route.js +0 -133
  152. package/.next/standalone/.next/server/app/api/runtime/approvals/[toolCallId]/route.js.nft.json +0 -1
  153. package/.next/standalone/.next/server/app/api/runtime/approvals/[toolCallId]/route_client-reference-manifest.js +0 -1
  154. package/.next/standalone/.next/server/app/api/runtime/approvals/route.js +0 -133
  155. package/.next/standalone/.next/server/app/api/runtime/approvals/route.js.nft.json +0 -1
  156. package/.next/standalone/.next/server/app/api/runtime/approvals/route_client-reference-manifest.js +0 -1
  157. package/.next/standalone/.next/server/app/api/runtime/artifacts/download/route.js +0 -133
  158. package/.next/standalone/.next/server/app/api/runtime/artifacts/download/route.js.nft.json +0 -1
  159. package/.next/standalone/.next/server/app/api/runtime/artifacts/download/route_client-reference-manifest.js +0 -1
  160. package/.next/standalone/.next/server/app/api/runtime/artifacts/route.js +0 -133
  161. package/.next/standalone/.next/server/app/api/runtime/artifacts/route.js.nft.json +0 -1
  162. package/.next/standalone/.next/server/app/api/runtime/artifacts/route_client-reference-manifest.js +0 -1
  163. package/.next/standalone/.next/server/app/api/runtime/export/route.js +0 -143
  164. package/.next/standalone/.next/server/app/api/runtime/export/route.js.nft.json +0 -1
  165. package/.next/standalone/.next/server/app/api/runtime/export/route_client-reference-manifest.js +0 -1
  166. package/.next/standalone/.next/server/app/api/runtime/health/route.js +0 -18
  167. package/.next/standalone/.next/server/app/api/runtime/health/route.js.nft.json +0 -1
  168. package/.next/standalone/.next/server/app/api/runtime/health/route_client-reference-manifest.js +0 -1
  169. package/.next/standalone/.next/server/app/api/runtime/mcp-probes/route.js +0 -133
  170. package/.next/standalone/.next/server/app/api/runtime/mcp-probes/route.js.nft.json +0 -1
  171. package/.next/standalone/.next/server/app/api/runtime/mcp-probes/route_client-reference-manifest.js +0 -1
  172. package/.next/standalone/.next/server/app/api/runtime/runs/[id]/route.js +0 -51
  173. package/.next/standalone/.next/server/app/api/runtime/runs/[id]/route.js.nft.json +0 -1
  174. package/.next/standalone/.next/server/app/api/runtime/runs/[id]/route_client-reference-manifest.js +0 -1
  175. package/.next/standalone/.next/server/app/api/runtime/runs/route.js +0 -51
  176. package/.next/standalone/.next/server/app/api/runtime/runs/route.js.nft.json +0 -1
  177. package/.next/standalone/.next/server/app/api/runtime/runs/route_client-reference-manifest.js +0 -1
  178. package/.next/standalone/.next/server/app/api/runtime/status/route.js +0 -18
  179. package/.next/standalone/.next/server/app/api/runtime/status/route.js.nft.json +0 -1
  180. package/.next/standalone/.next/server/app/api/runtime/status/route_client-reference-manifest.js +0 -1
  181. package/.next/standalone/.next/server/app/api/runtime/telemetry/route.js +0 -133
  182. package/.next/standalone/.next/server/app/api/runtime/telemetry/route.js.nft.json +0 -1
  183. package/.next/standalone/.next/server/app/api/runtime/telemetry/route_client-reference-manifest.js +0 -1
  184. package/.next/standalone/.next/server/app/api/runtime/timeline/route.js +0 -133
  185. package/.next/standalone/.next/server/app/api/runtime/timeline/route.js.nft.json +0 -1
  186. package/.next/standalone/.next/server/app/api/runtime/timeline/route_client-reference-manifest.js +0 -1
  187. package/.next/standalone/.next/server/app/api/skills/[id]/disable/route.js +0 -1
  188. package/.next/standalone/.next/server/app/api/skills/[id]/disable/route.js.nft.json +0 -1
  189. package/.next/standalone/.next/server/app/api/skills/[id]/disable/route_client-reference-manifest.js +0 -1
  190. package/.next/standalone/.next/server/app/api/skills/[id]/enable/route.js +0 -21
  191. package/.next/standalone/.next/server/app/api/skills/[id]/enable/route.js.nft.json +0 -1
  192. package/.next/standalone/.next/server/app/api/skills/[id]/enable/route_client-reference-manifest.js +0 -1
  193. package/.next/standalone/.next/server/app/api/skills/[id]/files/route.js +0 -21
  194. package/.next/standalone/.next/server/app/api/skills/[id]/files/route.js.nft.json +0 -1
  195. package/.next/standalone/.next/server/app/api/skills/[id]/files/route_client-reference-manifest.js +0 -1
  196. package/.next/standalone/.next/server/app/api/skills/[id]/install/route.js +0 -56
  197. package/.next/standalone/.next/server/app/api/skills/[id]/install/route.js.nft.json +0 -1
  198. package/.next/standalone/.next/server/app/api/skills/[id]/install/route_client-reference-manifest.js +0 -1
  199. package/.next/standalone/.next/server/app/api/skills/[id]/load/route.js +0 -17
  200. package/.next/standalone/.next/server/app/api/skills/[id]/load/route.js.nft.json +0 -1
  201. package/.next/standalone/.next/server/app/api/skills/[id]/load/route_client-reference-manifest.js +0 -1
  202. package/.next/standalone/.next/server/app/api/skills/[id]/route.js +0 -21
  203. package/.next/standalone/.next/server/app/api/skills/[id]/route.js.nft.json +0 -1
  204. package/.next/standalone/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +0 -1
  205. package/.next/standalone/.next/server/app/api/skills/catalog/route.js +0 -1
  206. package/.next/standalone/.next/server/app/api/skills/catalog/route.js.nft.json +0 -1
  207. package/.next/standalone/.next/server/app/api/skills/catalog/route_client-reference-manifest.js +0 -1
  208. package/.next/standalone/.next/server/app/api/skills/categories/route.js +0 -21
  209. package/.next/standalone/.next/server/app/api/skills/categories/route.js.nft.json +0 -1
  210. package/.next/standalone/.next/server/app/api/skills/categories/route_client-reference-manifest.js +0 -1
  211. package/.next/standalone/.next/server/app/api/skills/hub/install/route.js +0 -1
  212. package/.next/standalone/.next/server/app/api/skills/hub/install/route.js.nft.json +0 -1
  213. package/.next/standalone/.next/server/app/api/skills/hub/install/route_client-reference-manifest.js +0 -1
  214. package/.next/standalone/.next/server/app/api/skills/hub/route.js +0 -21
  215. package/.next/standalone/.next/server/app/api/skills/hub/route.js.nft.json +0 -1
  216. package/.next/standalone/.next/server/app/api/skills/hub/route_client-reference-manifest.js +0 -1
  217. package/.next/standalone/.next/server/app/api/skills/route.js +0 -21
  218. package/.next/standalone/.next/server/app/api/skills/route.js.nft.json +0 -1
  219. package/.next/standalone/.next/server/app/api/skills/route_client-reference-manifest.js +0 -1
  220. package/.next/standalone/.next/server/app/api/telemetry/route.js +0 -133
  221. package/.next/standalone/.next/server/app/api/telemetry/route.js.nft.json +0 -1
  222. package/.next/standalone/.next/server/app/api/telemetry/route_client-reference-manifest.js +0 -1
  223. package/.next/standalone/.next/server/app/api/uploads/route.js +0 -36
  224. package/.next/standalone/.next/server/app/api/uploads/route.js.nft.json +0 -1
  225. package/.next/standalone/.next/server/app/api/uploads/route_client-reference-manifest.js +0 -1
  226. package/.next/standalone/.next/server/app/chat/page.js +0 -4
  227. package/.next/standalone/.next/server/app/chat/page.js.nft.json +0 -1
  228. package/.next/standalone/.next/server/app/chat/page_client-reference-manifest.js +0 -1
  229. package/.next/standalone/.next/server/app/extensions/[id]/page.js +0 -2
  230. package/.next/standalone/.next/server/app/extensions/[id]/page.js.nft.json +0 -1
  231. package/.next/standalone/.next/server/app/extensions/[id]/page_client-reference-manifest.js +0 -1
  232. package/.next/standalone/.next/server/app/extensions/page.js +0 -2
  233. package/.next/standalone/.next/server/app/extensions/page.js.nft.json +0 -1
  234. package/.next/standalone/.next/server/app/extensions/page_client-reference-manifest.js +0 -1
  235. package/.next/standalone/.next/server/app/favicon.ico/route.js +0 -1
  236. package/.next/standalone/.next/server/app/favicon.ico/route.js.nft.json +0 -1
  237. package/.next/standalone/.next/server/app/favicon.ico.body +0 -0
  238. package/.next/standalone/.next/server/app/favicon.ico.meta +0 -1
  239. package/.next/standalone/.next/server/app/icon.svg/route.js +0 -1
  240. package/.next/standalone/.next/server/app/icon.svg/route.js.nft.json +0 -1
  241. package/.next/standalone/.next/server/app/icon.svg.body +0 -10
  242. package/.next/standalone/.next/server/app/icon.svg.meta +0 -1
  243. package/.next/standalone/.next/server/app/index.html +0 -1
  244. package/.next/standalone/.next/server/app/index.meta +0 -9
  245. package/.next/standalone/.next/server/app/index.rsc +0 -19
  246. package/.next/standalone/.next/server/app/login/page.js +0 -2
  247. package/.next/standalone/.next/server/app/login/page.js.nft.json +0 -1
  248. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +0 -1
  249. package/.next/standalone/.next/server/app/memory/page.js +0 -2
  250. package/.next/standalone/.next/server/app/memory/page.js.nft.json +0 -1
  251. package/.next/standalone/.next/server/app/memory/page_client-reference-manifest.js +0 -1
  252. package/.next/standalone/.next/server/app/page.js +0 -2
  253. package/.next/standalone/.next/server/app/page.js.nft.json +0 -1
  254. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +0 -1
  255. package/.next/standalone/.next/server/app/profiles/page.js +0 -2
  256. package/.next/standalone/.next/server/app/profiles/page.js.nft.json +0 -1
  257. package/.next/standalone/.next/server/app/profiles/page_client-reference-manifest.js +0 -1
  258. package/.next/standalone/.next/server/app/settings/approvals/page.js +0 -2
  259. package/.next/standalone/.next/server/app/settings/approvals/page.js.nft.json +0 -1
  260. package/.next/standalone/.next/server/app/settings/approvals/page_client-reference-manifest.js +0 -1
  261. package/.next/standalone/.next/server/app/settings/artifacts/page.js +0 -2
  262. package/.next/standalone/.next/server/app/settings/artifacts/page.js.nft.json +0 -1
  263. package/.next/standalone/.next/server/app/settings/artifacts/page_client-reference-manifest.js +0 -1
  264. package/.next/standalone/.next/server/app/settings/audit/page.js +0 -2
  265. package/.next/standalone/.next/server/app/settings/audit/page.js.nft.json +0 -1
  266. package/.next/standalone/.next/server/app/settings/audit/page_client-reference-manifest.js +0 -1
  267. package/.next/standalone/.next/server/app/settings/health/page.js +0 -2
  268. package/.next/standalone/.next/server/app/settings/health/page.js.nft.json +0 -1
  269. package/.next/standalone/.next/server/app/settings/health/page_client-reference-manifest.js +0 -1
  270. package/.next/standalone/.next/server/app/settings/mcp-diagnostics/page.js +0 -2
  271. package/.next/standalone/.next/server/app/settings/mcp-diagnostics/page.js.nft.json +0 -1
  272. package/.next/standalone/.next/server/app/settings/mcp-diagnostics/page_client-reference-manifest.js +0 -1
  273. package/.next/standalone/.next/server/app/settings/page.js +0 -2
  274. package/.next/standalone/.next/server/app/settings/page.js.nft.json +0 -1
  275. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +0 -1
  276. package/.next/standalone/.next/server/app/settings/runs/[id]/page.js +0 -2
  277. package/.next/standalone/.next/server/app/settings/runs/[id]/page.js.nft.json +0 -1
  278. package/.next/standalone/.next/server/app/settings/runs/[id]/page_client-reference-manifest.js +0 -1
  279. package/.next/standalone/.next/server/app/settings/runs/page.js +0 -2
  280. package/.next/standalone/.next/server/app/settings/runs/page.js.nft.json +0 -1
  281. package/.next/standalone/.next/server/app/settings/runs/page_client-reference-manifest.js +0 -1
  282. package/.next/standalone/.next/server/app/settings/telemetry/page.js +0 -2
  283. package/.next/standalone/.next/server/app/settings/telemetry/page.js.nft.json +0 -1
  284. package/.next/standalone/.next/server/app/settings/telemetry/page_client-reference-manifest.js +0 -1
  285. package/.next/standalone/.next/server/app/skills/[id]/page.js +0 -2
  286. package/.next/standalone/.next/server/app/skills/[id]/page.js.nft.json +0 -1
  287. package/.next/standalone/.next/server/app/skills/[id]/page_client-reference-manifest.js +0 -1
  288. package/.next/standalone/.next/server/app/skills/page.js +0 -2
  289. package/.next/standalone/.next/server/app/skills/page.js.nft.json +0 -1
  290. package/.next/standalone/.next/server/app/skills/page_client-reference-manifest.js +0 -1
  291. package/.next/standalone/.next/server/app-paths-manifest.json +0 -67
  292. package/.next/standalone/.next/server/chunks/1331.js +0 -22
  293. package/.next/standalone/.next/server/chunks/1692.js +0 -1
  294. package/.next/standalone/.next/server/chunks/2043.js +0 -1
  295. package/.next/standalone/.next/server/chunks/4337.js +0 -143
  296. package/.next/standalone/.next/server/chunks/4561.js +0 -1
  297. package/.next/standalone/.next/server/chunks/4689.js +0 -25
  298. package/.next/standalone/.next/server/chunks/5611.js +0 -6
  299. package/.next/standalone/.next/server/chunks/6111.js +0 -1
  300. package/.next/standalone/.next/server/chunks/6143.js +0 -9
  301. package/.next/standalone/.next/server/chunks/6516.js +0 -143
  302. package/.next/standalone/.next/server/chunks/6802.js +0 -1
  303. package/.next/standalone/.next/server/chunks/9546.js +0 -1
  304. package/.next/standalone/.next/server/functions-config-manifest.json +0 -4
  305. package/.next/standalone/.next/server/middleware-build-manifest.js +0 -1
  306. package/.next/standalone/.next/server/middleware-manifest.json +0 -6
  307. package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +0 -1
  308. package/.next/standalone/.next/server/next-font-manifest.js +0 -1
  309. package/.next/standalone/.next/server/next-font-manifest.json +0 -1
  310. package/.next/standalone/.next/server/pages/404.html +0 -1
  311. package/.next/standalone/.next/server/pages/500.html +0 -1
  312. package/.next/standalone/.next/server/pages/_app.js +0 -1
  313. package/.next/standalone/.next/server/pages/_app.js.nft.json +0 -1
  314. package/.next/standalone/.next/server/pages/_document.js +0 -1
  315. package/.next/standalone/.next/server/pages/_document.js.nft.json +0 -1
  316. package/.next/standalone/.next/server/pages/_error.js +0 -19
  317. package/.next/standalone/.next/server/pages/_error.js.nft.json +0 -1
  318. package/.next/standalone/.next/server/pages-manifest.json +0 -6
  319. package/.next/standalone/.next/server/server-reference-manifest.js +0 -1
  320. package/.next/standalone/.next/server/server-reference-manifest.json +0 -1
  321. package/.next/standalone/.next/server/webpack-runtime.js +0 -1
  322. package/.next/standalone/.next/static/Pqhqpl3ZPqKI0qfvpIPeN/_buildManifest.js +0 -1
  323. package/.next/standalone/.next/static/chunks/1255-aadf393aa3a56bfa.js +0 -1
  324. package/.next/standalone/.next/static/chunks/1309-d826505bfad78fd1.js +0 -1
  325. package/.next/standalone/.next/static/chunks/2231-e0d8768bfce5fe57.js +0 -1
  326. package/.next/standalone/.next/static/chunks/4879-36321f505e9ce82a.js +0 -1
  327. package/.next/standalone/.next/static/chunks/4bd1b696-f785427dddbba9fb.js +0 -1
  328. package/.next/standalone/.next/static/chunks/9657-3ff4bf56070f324f.js +0 -1
  329. package/.next/standalone/.next/static/chunks/app/api/chat/sessions/[id]/route-bb3f5b9060cdc631.js +0 -1
  330. package/.next/standalone/.next/static/chunks/app/api/chat/sessions/route-bb3f5b9060cdc631.js +0 -1
  331. package/.next/standalone/.next/static/chunks/app/api/chat/stream/route-bb3f5b9060cdc631.js +0 -1
  332. package/.next/standalone/.next/static/chunks/app/api/extensions/[id]/capabilities/[capabilityId]/route-bb3f5b9060cdc631.js +0 -1
  333. package/.next/standalone/.next/static/chunks/app/api/extensions/[id]/route-bb3f5b9060cdc631.js +0 -1
  334. package/.next/standalone/.next/static/chunks/app/api/extensions/[id]/test/route-bb3f5b9060cdc631.js +0 -1
  335. package/.next/standalone/.next/static/chunks/app/api/extensions/mcp/route-bb3f5b9060cdc631.js +0 -1
  336. package/.next/standalone/.next/static/chunks/app/api/extensions/route-bb3f5b9060cdc631.js +0 -1
  337. package/.next/standalone/.next/static/chunks/app/api/memory/agent/route-bb3f5b9060cdc631.js +0 -1
  338. package/.next/standalone/.next/static/chunks/app/api/memory/context-inspector/route-bb3f5b9060cdc631.js +0 -1
  339. package/.next/standalone/.next/static/chunks/app/api/memory/session-search/route-bb3f5b9060cdc631.js +0 -1
  340. package/.next/standalone/.next/static/chunks/app/api/memory/user/route-bb3f5b9060cdc631.js +0 -1
  341. package/.next/standalone/.next/static/chunks/app/api/profiles/[id]/config/route-bb3f5b9060cdc631.js +0 -1
  342. package/.next/standalone/.next/static/chunks/app/api/profiles/[id]/route-bb3f5b9060cdc631.js +0 -1
  343. package/.next/standalone/.next/static/chunks/app/api/profiles/route-bb3f5b9060cdc631.js +0 -1
  344. package/.next/standalone/.next/static/chunks/app/api/runtime/approvals/[toolCallId]/route-bb3f5b9060cdc631.js +0 -1
  345. package/.next/standalone/.next/static/chunks/app/api/runtime/approvals/route-bb3f5b9060cdc631.js +0 -1
  346. package/.next/standalone/.next/static/chunks/app/api/runtime/artifacts/download/route-bb3f5b9060cdc631.js +0 -1
  347. package/.next/standalone/.next/static/chunks/app/api/runtime/artifacts/route-bb3f5b9060cdc631.js +0 -1
  348. package/.next/standalone/.next/static/chunks/app/api/runtime/export/route-bb3f5b9060cdc631.js +0 -1
  349. package/.next/standalone/.next/static/chunks/app/api/runtime/health/route-bb3f5b9060cdc631.js +0 -1
  350. package/.next/standalone/.next/static/chunks/app/api/runtime/mcp-probes/route-bb3f5b9060cdc631.js +0 -1
  351. package/.next/standalone/.next/static/chunks/app/api/runtime/runs/[id]/route-bb3f5b9060cdc631.js +0 -1
  352. package/.next/standalone/.next/static/chunks/app/api/runtime/runs/route-bb3f5b9060cdc631.js +0 -1
  353. package/.next/standalone/.next/static/chunks/app/api/runtime/status/route-bb3f5b9060cdc631.js +0 -1
  354. package/.next/standalone/.next/static/chunks/app/api/runtime/telemetry/route-bb3f5b9060cdc631.js +0 -1
  355. package/.next/standalone/.next/static/chunks/app/api/runtime/timeline/route-bb3f5b9060cdc631.js +0 -1
  356. package/.next/standalone/.next/static/chunks/app/api/skills/[id]/disable/route-bb3f5b9060cdc631.js +0 -1
  357. package/.next/standalone/.next/static/chunks/app/api/skills/[id]/enable/route-bb3f5b9060cdc631.js +0 -1
  358. package/.next/standalone/.next/static/chunks/app/api/skills/[id]/files/route-bb3f5b9060cdc631.js +0 -1
  359. package/.next/standalone/.next/static/chunks/app/api/skills/[id]/install/route-bb3f5b9060cdc631.js +0 -1
  360. package/.next/standalone/.next/static/chunks/app/api/skills/[id]/load/route-bb3f5b9060cdc631.js +0 -1
  361. package/.next/standalone/.next/static/chunks/app/api/skills/[id]/route-bb3f5b9060cdc631.js +0 -1
  362. package/.next/standalone/.next/static/chunks/app/api/skills/catalog/route-bb3f5b9060cdc631.js +0 -1
  363. package/.next/standalone/.next/static/chunks/app/api/skills/categories/route-bb3f5b9060cdc631.js +0 -1
  364. package/.next/standalone/.next/static/chunks/app/api/skills/hub/install/route-bb3f5b9060cdc631.js +0 -1
  365. package/.next/standalone/.next/static/chunks/app/api/skills/hub/route-bb3f5b9060cdc631.js +0 -1
  366. package/.next/standalone/.next/static/chunks/app/api/skills/route-bb3f5b9060cdc631.js +0 -1
  367. package/.next/standalone/.next/static/chunks/app/api/telemetry/route-bb3f5b9060cdc631.js +0 -1
  368. package/.next/standalone/.next/static/chunks/app/api/uploads/route-bb3f5b9060cdc631.js +0 -1
  369. package/.next/standalone/.next/static/chunks/app/chat/page-117a5b54aee7eae4.js +0 -1
  370. package/.next/standalone/.next/static/chunks/app/extensions/[id]/page-cca6df1771ec04d2.js +0 -1
  371. package/.next/standalone/.next/static/chunks/app/extensions/page-c0fbb8efa9a3700c.js +0 -1
  372. package/.next/standalone/.next/static/chunks/app/layout-0bc970399be389b5.js +0 -1
  373. package/.next/standalone/.next/static/chunks/app/login/page-984e33272681e1e0.js +0 -1
  374. package/.next/standalone/.next/static/chunks/app/memory/page-0684ff3ce6888ae7.js +0 -1
  375. package/.next/standalone/.next/static/chunks/app/page-bb3f5b9060cdc631.js +0 -1
  376. package/.next/standalone/.next/static/chunks/app/profiles/page-46a0ad35feda9741.js +0 -1
  377. package/.next/standalone/.next/static/chunks/app/settings/approvals/page-6843c585791e4db7.js +0 -1
  378. package/.next/standalone/.next/static/chunks/app/settings/artifacts/page-d3fddd43ac1243af.js +0 -1
  379. package/.next/standalone/.next/static/chunks/app/settings/health/page-d34eadc11bc90af5.js +0 -1
  380. package/.next/standalone/.next/static/chunks/app/settings/mcp-diagnostics/page-3778d2842d5bdd79.js +0 -1
  381. package/.next/standalone/.next/static/chunks/app/settings/runs/[id]/page-7837ec57d531ef2b.js +0 -1
  382. package/.next/standalone/.next/static/chunks/app/settings/runs/page-cb4d1617e199c38e.js +0 -1
  383. package/.next/standalone/.next/static/chunks/app/skills/[id]/page-88bc62488ddf6c10.js +0 -1
  384. package/.next/standalone/.next/static/chunks/app/skills/page-e47c6a5f9559edc1.js +0 -1
  385. package/.next/standalone/.next/static/chunks/framework-f31701c9d93f12a4.js +0 -1
  386. package/.next/standalone/.next/static/chunks/main-1ac9e0711a0eb944.js +0 -1
  387. package/.next/standalone/.next/static/chunks/pages/_app-6c8c2371b16a04b8.js +0 -1
  388. package/.next/standalone/.next/static/chunks/pages/_error-94812ad32cad7365.js +0 -1
  389. package/.next/standalone/.next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  390. package/.next/standalone/.next/static/chunks/webpack-0100acb42ec0d4c7.js +0 -1
  391. package/.next/standalone/.next/static/css/f5a43afa8024b892.css +0 -3
  392. package/.next/static/Pqhqpl3ZPqKI0qfvpIPeN/_buildManifest.js +0 -1
  393. package/.next/static/Pqhqpl3ZPqKI0qfvpIPeN/_ssgManifest.js +0 -1
  394. package/.next/static/chunks/5449-aba2dafba76d4508.js +0 -1
  395. package/.next/static/chunks/9657-3ff4bf56070f324f.js +0 -1
  396. package/.next/static/chunks/app/_not-found/page-9c90a6b39424f003.js +0 -1
  397. package/.next/static/chunks/app/api/audit/route-bb3f5b9060cdc631.js +0 -1
  398. package/.next/static/chunks/app/api/auth/login/route-bb3f5b9060cdc631.js +0 -1
  399. package/.next/static/chunks/app/api/auth/logout/route-bb3f5b9060cdc631.js +0 -1
  400. package/.next/static/chunks/app/api/chat/sessions/[id]/fork/route-bb3f5b9060cdc631.js +0 -1
  401. package/.next/static/chunks/app/api/chat/sessions/[id]/route-bb3f5b9060cdc631.js +0 -1
  402. package/.next/static/chunks/app/api/chat/sessions/route-bb3f5b9060cdc631.js +0 -1
  403. package/.next/static/chunks/app/api/chat/stream/route-bb3f5b9060cdc631.js +0 -1
  404. package/.next/static/chunks/app/api/extensions/[id]/capabilities/[capabilityId]/route-bb3f5b9060cdc631.js +0 -1
  405. package/.next/static/chunks/app/api/extensions/[id]/route-bb3f5b9060cdc631.js +0 -1
  406. package/.next/static/chunks/app/api/extensions/[id]/test/route-bb3f5b9060cdc631.js +0 -1
  407. package/.next/static/chunks/app/api/extensions/mcp/route-bb3f5b9060cdc631.js +0 -1
  408. package/.next/static/chunks/app/api/extensions/route-bb3f5b9060cdc631.js +0 -1
  409. package/.next/static/chunks/app/api/memory/agent/route-bb3f5b9060cdc631.js +0 -1
  410. package/.next/static/chunks/app/api/memory/context-inspector/route-bb3f5b9060cdc631.js +0 -1
  411. package/.next/static/chunks/app/api/memory/session-search/route-bb3f5b9060cdc631.js +0 -1
  412. package/.next/static/chunks/app/api/memory/user/route-bb3f5b9060cdc631.js +0 -1
  413. package/.next/static/chunks/app/api/profiles/[id]/config/route-bb3f5b9060cdc631.js +0 -1
  414. package/.next/static/chunks/app/api/profiles/[id]/route-bb3f5b9060cdc631.js +0 -1
  415. package/.next/static/chunks/app/api/profiles/route-bb3f5b9060cdc631.js +0 -1
  416. package/.next/static/chunks/app/api/runtime/approvals/[toolCallId]/route-bb3f5b9060cdc631.js +0 -1
  417. package/.next/static/chunks/app/api/runtime/approvals/route-bb3f5b9060cdc631.js +0 -1
  418. package/.next/static/chunks/app/api/runtime/artifacts/download/route-bb3f5b9060cdc631.js +0 -1
  419. package/.next/static/chunks/app/api/runtime/artifacts/route-bb3f5b9060cdc631.js +0 -1
  420. package/.next/static/chunks/app/api/runtime/export/route-bb3f5b9060cdc631.js +0 -1
  421. package/.next/static/chunks/app/api/runtime/health/route-bb3f5b9060cdc631.js +0 -1
  422. package/.next/static/chunks/app/api/runtime/mcp-probes/route-bb3f5b9060cdc631.js +0 -1
  423. package/.next/static/chunks/app/api/runtime/runs/[id]/route-bb3f5b9060cdc631.js +0 -1
  424. package/.next/static/chunks/app/api/runtime/runs/route-bb3f5b9060cdc631.js +0 -1
  425. package/.next/static/chunks/app/api/runtime/status/route-bb3f5b9060cdc631.js +0 -1
  426. package/.next/static/chunks/app/api/runtime/telemetry/route-bb3f5b9060cdc631.js +0 -1
  427. package/.next/static/chunks/app/api/runtime/timeline/route-bb3f5b9060cdc631.js +0 -1
  428. package/.next/static/chunks/app/api/skills/[id]/disable/route-bb3f5b9060cdc631.js +0 -1
  429. package/.next/static/chunks/app/api/skills/[id]/enable/route-bb3f5b9060cdc631.js +0 -1
  430. package/.next/static/chunks/app/api/skills/[id]/files/route-bb3f5b9060cdc631.js +0 -1
  431. package/.next/static/chunks/app/api/skills/[id]/install/route-bb3f5b9060cdc631.js +0 -1
  432. package/.next/static/chunks/app/api/skills/[id]/load/route-bb3f5b9060cdc631.js +0 -1
  433. package/.next/static/chunks/app/api/skills/[id]/route-bb3f5b9060cdc631.js +0 -1
  434. package/.next/static/chunks/app/api/skills/catalog/route-bb3f5b9060cdc631.js +0 -1
  435. package/.next/static/chunks/app/api/skills/categories/route-bb3f5b9060cdc631.js +0 -1
  436. package/.next/static/chunks/app/api/skills/hub/install/route-bb3f5b9060cdc631.js +0 -1
  437. package/.next/static/chunks/app/api/skills/hub/route-bb3f5b9060cdc631.js +0 -1
  438. package/.next/static/chunks/app/api/skills/route-bb3f5b9060cdc631.js +0 -1
  439. package/.next/static/chunks/app/api/telemetry/route-bb3f5b9060cdc631.js +0 -1
  440. package/.next/static/chunks/app/api/uploads/route-bb3f5b9060cdc631.js +0 -1
  441. package/.next/static/chunks/app/chat/page-117a5b54aee7eae4.js +0 -1
  442. package/.next/static/chunks/app/extensions/[id]/page-cca6df1771ec04d2.js +0 -1
  443. package/.next/static/chunks/app/layout-0bc970399be389b5.js +0 -1
  444. package/.next/static/chunks/app/login/page-984e33272681e1e0.js +0 -1
  445. package/.next/static/chunks/app/memory/page-0684ff3ce6888ae7.js +0 -1
  446. package/.next/static/chunks/app/page-bb3f5b9060cdc631.js +0 -1
  447. package/.next/static/chunks/app/profiles/page-46a0ad35feda9741.js +0 -1
  448. package/.next/static/chunks/app/settings/artifacts/page-d3fddd43ac1243af.js +0 -1
  449. package/.next/static/chunks/app/settings/audit/page-378bee43dd7c4903.js +0 -1
  450. package/.next/static/chunks/app/settings/health/page-d34eadc11bc90af5.js +0 -1
  451. package/.next/static/chunks/app/settings/mcp-diagnostics/page-3778d2842d5bdd79.js +0 -1
  452. package/.next/static/chunks/app/settings/page-8a40bdf895f43430.js +0 -1
  453. package/.next/static/chunks/app/settings/runs/[id]/page-7837ec57d531ef2b.js +0 -1
  454. package/.next/static/chunks/app/settings/runs/page-cb4d1617e199c38e.js +0 -1
  455. package/.next/static/chunks/app/settings/telemetry/page-c0446baefa5496cb.js +0 -1
  456. package/.next/static/chunks/app/skills/[id]/page-88bc62488ddf6c10.js +0 -1
  457. package/.next/static/chunks/app/skills/page-e47c6a5f9559edc1.js +0 -1
  458. package/.next/static/chunks/main-app-a9e2c007d433eaf9.js +0 -1
  459. package/.next/static/css/f5a43afa8024b892.css +0 -3
  460. /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
- * 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
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: npx pan-ui setup',
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
- const hermesBin = detectHermesBinary();
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 binary not found in PATH`);
270
- console.log(` ${dim('Install: curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash')}`);
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
- console.log(` ${yellow('!')} config.yaml not found run ${cyan('hermes setup')} first`);
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('npx pan-ui setup')}`);
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('npx pan-ui stop')}`);
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('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')}`);
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('npx pan-ui --daemon')}`);
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('npx pan-ui --daemon')} ${dim('instead.')}`);
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(`npx pan-ui service remove`)}`);
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('npx pan-ui service install')}`);
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 --port flag
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
- // Parse --daemon / -d flag
744
- const isDaemon = args.includes('--daemon') || args.includes('-d');
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('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`);
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('npx pan-ui')}`);
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
- console.log('');
813
- console.log(bold(' pan-ui') + dim(' — Beautiful WebUI for Hermes Agent'));
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
- // ── Default: setup if first time, then start ──────────────────────────
1295
+ // ── Start (explicit or default) ───────────────────────────────────────
841
1296
 
842
- const env = await setup(false);
843
- rl.close();
1297
+ if (command === 'start' || !command || command.startsWith('-')) {
1298
+ const env = await setup(false);
1299
+ rl.close();
844
1300
 
845
- if (isDaemon) {
846
- await startDaemon(env, portOverride);
847
- process.exit(0);
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
- startServer(env, portOverride);
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) => {