@euraika-labs/pan-ui 0.2.3 → 0.4.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 (366) hide show
  1. package/.next/standalone/node_modules/next/node_modules/postcss/package.json +0 -0
  2. package/.next/standalone/package.json +7 -2
  3. package/.next/standalone/server.js +1 -1
  4. package/.next/{standalone/.next/static/chunks/app/_not-found/page-9c90a6b39424f003.js → static/chunks/app/_not-found/page-c4591bba1afe868d.js} +1 -1
  5. package/.next/static/chunks/app/chat/page-49d2aa1477960093.js +1 -0
  6. package/.next/{standalone/.next/static/chunks/app/extensions/[id]/page-cca6df1771ec04d2.js → static/chunks/app/extensions/[id]/page-18e579a71a9d93c3.js} +1 -1
  7. package/.next/static/chunks/app/extensions/{page-c0fbb8efa9a3700c.js → page-82f358e2fcabc6a3.js} +1 -1
  8. package/.next/static/chunks/app/layout-f3c578dd4202f2f5.js +1 -0
  9. package/.next/static/chunks/app/login/page-a3820386479beb5e.js +1 -0
  10. package/.next/{standalone/.next/static/chunks/app/memory/page-0684ff3ce6888ae7.js → static/chunks/app/memory/page-a90ea51b004acc94.js} +1 -1
  11. package/.next/static/chunks/app/profiles/page-7b5924f80e882d7e.js +1 -0
  12. package/.next/{standalone/.next/static/chunks/app/settings/approvals/page-6843c585791e4db7.js → static/chunks/app/settings/approvals/page-1fd1b90371c02705.js} +1 -1
  13. package/.next/static/chunks/app/settings/artifacts/page-35ee6c14a4836aad.js +1 -0
  14. package/.next/static/chunks/app/settings/audit/page-a11b23ffa1e40949.js +1 -0
  15. package/.next/static/chunks/app/settings/health/page-9b7914bfd7bf665b.js +1 -0
  16. package/.next/static/chunks/app/settings/mcp-diagnostics/page-102367ef8b2cc105.js +1 -0
  17. package/.next/{standalone/.next/static/chunks/app/settings/page-8a40bdf895f43430.js → static/chunks/app/settings/page-5f9f8ba836ac9b7e.js} +1 -1
  18. package/.next/static/chunks/app/settings/runs/[id]/page-d0184e7e90f5867c.js +1 -0
  19. package/.next/{standalone/.next/static/chunks/app/settings/runs/page-cb4d1617e199c38e.js → static/chunks/app/settings/runs/page-312bdcd82b1f3a64.js} +1 -1
  20. package/.next/{standalone/.next/static/chunks/app/settings/telemetry/page-c0446baefa5496cb.js → static/chunks/app/settings/telemetry/page-e61a1efd390b87a4.js} +1 -1
  21. package/.next/static/chunks/app/skills/[id]/page-9dccad9f9e4b356e.js +1 -0
  22. package/.next/static/chunks/app/skills/page-d480e9f5081fd9b6.js +1 -0
  23. package/.next/{standalone/.next/static/chunks/main-app-a9e2c007d433eaf9.js → static/chunks/main-app-f0e3f2828aa879c4.js} +1 -1
  24. package/.next/static/css/ecc1661163318581.css +3 -0
  25. package/README.md +161 -143
  26. package/bin/pan-ui.mjs +410 -11
  27. package/package.json +6 -1
  28. package/.env.example +0 -30
  29. package/.next/standalone/.next/BUILD_ID +0 -1
  30. package/.next/standalone/.next/app-build-manifest.json +0 -508
  31. package/.next/standalone/.next/app-path-routes-manifest.json +0 -67
  32. package/.next/standalone/.next/build-manifest.json +0 -33
  33. package/.next/standalone/.next/package.json +0 -1
  34. package/.next/standalone/.next/prerender-manifest.json +0 -119
  35. package/.next/standalone/.next/react-loadable-manifest.json +0 -1
  36. package/.next/standalone/.next/required-server-files.json +0 -321
  37. package/.next/standalone/.next/routes-manifest.json +0 -295
  38. package/.next/standalone/.next/server/app/_not-found/page.js +0 -2
  39. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +0 -1
  40. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +0 -1
  41. package/.next/standalone/.next/server/app/_not-found.html +0 -1
  42. package/.next/standalone/.next/server/app/_not-found.meta +0 -8
  43. package/.next/standalone/.next/server/app/_not-found.rsc +0 -18
  44. package/.next/standalone/.next/server/app/api/audit/route.js +0 -36
  45. package/.next/standalone/.next/server/app/api/audit/route.js.nft.json +0 -1
  46. package/.next/standalone/.next/server/app/api/audit/route_client-reference-manifest.js +0 -1
  47. package/.next/standalone/.next/server/app/api/auth/login/route.js +0 -1
  48. package/.next/standalone/.next/server/app/api/auth/login/route.js.nft.json +0 -1
  49. package/.next/standalone/.next/server/app/api/auth/login/route_client-reference-manifest.js +0 -1
  50. package/.next/standalone/.next/server/app/api/auth/logout/route.js +0 -1
  51. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +0 -1
  52. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +0 -1
  53. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/fork/route.js +0 -1
  54. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/fork/route.js.nft.json +0 -1
  55. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/fork/route_client-reference-manifest.js +0 -1
  56. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route.js +0 -1
  57. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route.js.nft.json +0 -1
  58. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route_client-reference-manifest.js +0 -1
  59. package/.next/standalone/.next/server/app/api/chat/sessions/route.js +0 -1
  60. package/.next/standalone/.next/server/app/api/chat/sessions/route.js.nft.json +0 -1
  61. package/.next/standalone/.next/server/app/api/chat/sessions/route_client-reference-manifest.js +0 -1
  62. package/.next/standalone/.next/server/app/api/chat/stream/route.js +0 -170
  63. package/.next/standalone/.next/server/app/api/chat/stream/route.js.nft.json +0 -1
  64. package/.next/standalone/.next/server/app/api/chat/stream/route_client-reference-manifest.js +0 -1
  65. package/.next/standalone/.next/server/app/api/extensions/[id]/capabilities/[capabilityId]/route.js +0 -1
  66. package/.next/standalone/.next/server/app/api/extensions/[id]/capabilities/[capabilityId]/route.js.nft.json +0 -1
  67. package/.next/standalone/.next/server/app/api/extensions/[id]/capabilities/[capabilityId]/route_client-reference-manifest.js +0 -1
  68. package/.next/standalone/.next/server/app/api/extensions/[id]/route.js +0 -1
  69. package/.next/standalone/.next/server/app/api/extensions/[id]/route.js.nft.json +0 -1
  70. package/.next/standalone/.next/server/app/api/extensions/[id]/route_client-reference-manifest.js +0 -1
  71. package/.next/standalone/.next/server/app/api/extensions/[id]/test/route.js +0 -1
  72. package/.next/standalone/.next/server/app/api/extensions/[id]/test/route.js.nft.json +0 -1
  73. package/.next/standalone/.next/server/app/api/extensions/[id]/test/route_client-reference-manifest.js +0 -1
  74. package/.next/standalone/.next/server/app/api/extensions/mcp/route.js +0 -11
  75. package/.next/standalone/.next/server/app/api/extensions/mcp/route.js.nft.json +0 -1
  76. package/.next/standalone/.next/server/app/api/extensions/mcp/route_client-reference-manifest.js +0 -1
  77. package/.next/standalone/.next/server/app/api/extensions/route.js +0 -1
  78. package/.next/standalone/.next/server/app/api/extensions/route.js.nft.json +0 -1
  79. package/.next/standalone/.next/server/app/api/extensions/route_client-reference-manifest.js +0 -1
  80. package/.next/standalone/.next/server/app/api/memory/agent/route.js +0 -36
  81. package/.next/standalone/.next/server/app/api/memory/agent/route.js.nft.json +0 -1
  82. package/.next/standalone/.next/server/app/api/memory/agent/route_client-reference-manifest.js +0 -1
  83. package/.next/standalone/.next/server/app/api/memory/context-inspector/route.js +0 -1
  84. package/.next/standalone/.next/server/app/api/memory/context-inspector/route.js.nft.json +0 -1
  85. package/.next/standalone/.next/server/app/api/memory/context-inspector/route_client-reference-manifest.js +0 -1
  86. package/.next/standalone/.next/server/app/api/memory/session-search/route.js +0 -1
  87. package/.next/standalone/.next/server/app/api/memory/session-search/route.js.nft.json +0 -1
  88. package/.next/standalone/.next/server/app/api/memory/session-search/route_client-reference-manifest.js +0 -1
  89. package/.next/standalone/.next/server/app/api/memory/user/route.js +0 -36
  90. package/.next/standalone/.next/server/app/api/memory/user/route.js.nft.json +0 -1
  91. package/.next/standalone/.next/server/app/api/memory/user/route_client-reference-manifest.js +0 -1
  92. package/.next/standalone/.next/server/app/api/profiles/[id]/config/route.js +0 -92
  93. package/.next/standalone/.next/server/app/api/profiles/[id]/config/route.js.nft.json +0 -1
  94. package/.next/standalone/.next/server/app/api/profiles/[id]/config/route_client-reference-manifest.js +0 -1
  95. package/.next/standalone/.next/server/app/api/profiles/[id]/route.js +0 -31
  96. package/.next/standalone/.next/server/app/api/profiles/[id]/route.js.nft.json +0 -1
  97. package/.next/standalone/.next/server/app/api/profiles/[id]/route_client-reference-manifest.js +0 -1
  98. package/.next/standalone/.next/server/app/api/profiles/route.js +0 -31
  99. package/.next/standalone/.next/server/app/api/profiles/route.js.nft.json +0 -1
  100. package/.next/standalone/.next/server/app/api/profiles/route_client-reference-manifest.js +0 -1
  101. package/.next/standalone/.next/server/app/api/runtime/approvals/[toolCallId]/route.js +0 -133
  102. package/.next/standalone/.next/server/app/api/runtime/approvals/[toolCallId]/route.js.nft.json +0 -1
  103. package/.next/standalone/.next/server/app/api/runtime/approvals/[toolCallId]/route_client-reference-manifest.js +0 -1
  104. package/.next/standalone/.next/server/app/api/runtime/approvals/route.js +0 -133
  105. package/.next/standalone/.next/server/app/api/runtime/approvals/route.js.nft.json +0 -1
  106. package/.next/standalone/.next/server/app/api/runtime/approvals/route_client-reference-manifest.js +0 -1
  107. package/.next/standalone/.next/server/app/api/runtime/artifacts/download/route.js +0 -133
  108. package/.next/standalone/.next/server/app/api/runtime/artifacts/download/route.js.nft.json +0 -1
  109. package/.next/standalone/.next/server/app/api/runtime/artifacts/download/route_client-reference-manifest.js +0 -1
  110. package/.next/standalone/.next/server/app/api/runtime/artifacts/route.js +0 -133
  111. package/.next/standalone/.next/server/app/api/runtime/artifacts/route.js.nft.json +0 -1
  112. package/.next/standalone/.next/server/app/api/runtime/artifacts/route_client-reference-manifest.js +0 -1
  113. package/.next/standalone/.next/server/app/api/runtime/export/route.js +0 -143
  114. package/.next/standalone/.next/server/app/api/runtime/export/route.js.nft.json +0 -1
  115. package/.next/standalone/.next/server/app/api/runtime/export/route_client-reference-manifest.js +0 -1
  116. package/.next/standalone/.next/server/app/api/runtime/health/route.js +0 -18
  117. package/.next/standalone/.next/server/app/api/runtime/health/route.js.nft.json +0 -1
  118. package/.next/standalone/.next/server/app/api/runtime/health/route_client-reference-manifest.js +0 -1
  119. package/.next/standalone/.next/server/app/api/runtime/mcp-probes/route.js +0 -133
  120. package/.next/standalone/.next/server/app/api/runtime/mcp-probes/route.js.nft.json +0 -1
  121. package/.next/standalone/.next/server/app/api/runtime/mcp-probes/route_client-reference-manifest.js +0 -1
  122. package/.next/standalone/.next/server/app/api/runtime/runs/[id]/route.js +0 -51
  123. package/.next/standalone/.next/server/app/api/runtime/runs/[id]/route.js.nft.json +0 -1
  124. package/.next/standalone/.next/server/app/api/runtime/runs/[id]/route_client-reference-manifest.js +0 -1
  125. package/.next/standalone/.next/server/app/api/runtime/runs/route.js +0 -51
  126. package/.next/standalone/.next/server/app/api/runtime/runs/route.js.nft.json +0 -1
  127. package/.next/standalone/.next/server/app/api/runtime/runs/route_client-reference-manifest.js +0 -1
  128. package/.next/standalone/.next/server/app/api/runtime/status/route.js +0 -18
  129. package/.next/standalone/.next/server/app/api/runtime/status/route.js.nft.json +0 -1
  130. package/.next/standalone/.next/server/app/api/runtime/status/route_client-reference-manifest.js +0 -1
  131. package/.next/standalone/.next/server/app/api/runtime/telemetry/route.js +0 -133
  132. package/.next/standalone/.next/server/app/api/runtime/telemetry/route.js.nft.json +0 -1
  133. package/.next/standalone/.next/server/app/api/runtime/telemetry/route_client-reference-manifest.js +0 -1
  134. package/.next/standalone/.next/server/app/api/runtime/timeline/route.js +0 -133
  135. package/.next/standalone/.next/server/app/api/runtime/timeline/route.js.nft.json +0 -1
  136. package/.next/standalone/.next/server/app/api/runtime/timeline/route_client-reference-manifest.js +0 -1
  137. package/.next/standalone/.next/server/app/api/skills/[id]/disable/route.js +0 -1
  138. package/.next/standalone/.next/server/app/api/skills/[id]/disable/route.js.nft.json +0 -1
  139. package/.next/standalone/.next/server/app/api/skills/[id]/disable/route_client-reference-manifest.js +0 -1
  140. package/.next/standalone/.next/server/app/api/skills/[id]/enable/route.js +0 -21
  141. package/.next/standalone/.next/server/app/api/skills/[id]/enable/route.js.nft.json +0 -1
  142. package/.next/standalone/.next/server/app/api/skills/[id]/enable/route_client-reference-manifest.js +0 -1
  143. package/.next/standalone/.next/server/app/api/skills/[id]/files/route.js +0 -21
  144. package/.next/standalone/.next/server/app/api/skills/[id]/files/route.js.nft.json +0 -1
  145. package/.next/standalone/.next/server/app/api/skills/[id]/files/route_client-reference-manifest.js +0 -1
  146. package/.next/standalone/.next/server/app/api/skills/[id]/install/route.js +0 -56
  147. package/.next/standalone/.next/server/app/api/skills/[id]/install/route.js.nft.json +0 -1
  148. package/.next/standalone/.next/server/app/api/skills/[id]/install/route_client-reference-manifest.js +0 -1
  149. package/.next/standalone/.next/server/app/api/skills/[id]/load/route.js +0 -17
  150. package/.next/standalone/.next/server/app/api/skills/[id]/load/route.js.nft.json +0 -1
  151. package/.next/standalone/.next/server/app/api/skills/[id]/load/route_client-reference-manifest.js +0 -1
  152. package/.next/standalone/.next/server/app/api/skills/[id]/route.js +0 -21
  153. package/.next/standalone/.next/server/app/api/skills/[id]/route.js.nft.json +0 -1
  154. package/.next/standalone/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +0 -1
  155. package/.next/standalone/.next/server/app/api/skills/catalog/route.js +0 -1
  156. package/.next/standalone/.next/server/app/api/skills/catalog/route.js.nft.json +0 -1
  157. package/.next/standalone/.next/server/app/api/skills/catalog/route_client-reference-manifest.js +0 -1
  158. package/.next/standalone/.next/server/app/api/skills/categories/route.js +0 -21
  159. package/.next/standalone/.next/server/app/api/skills/categories/route.js.nft.json +0 -1
  160. package/.next/standalone/.next/server/app/api/skills/categories/route_client-reference-manifest.js +0 -1
  161. package/.next/standalone/.next/server/app/api/skills/hub/install/route.js +0 -1
  162. package/.next/standalone/.next/server/app/api/skills/hub/install/route.js.nft.json +0 -1
  163. package/.next/standalone/.next/server/app/api/skills/hub/install/route_client-reference-manifest.js +0 -1
  164. package/.next/standalone/.next/server/app/api/skills/hub/route.js +0 -21
  165. package/.next/standalone/.next/server/app/api/skills/hub/route.js.nft.json +0 -1
  166. package/.next/standalone/.next/server/app/api/skills/hub/route_client-reference-manifest.js +0 -1
  167. package/.next/standalone/.next/server/app/api/skills/route.js +0 -21
  168. package/.next/standalone/.next/server/app/api/skills/route.js.nft.json +0 -1
  169. package/.next/standalone/.next/server/app/api/skills/route_client-reference-manifest.js +0 -1
  170. package/.next/standalone/.next/server/app/api/telemetry/route.js +0 -133
  171. package/.next/standalone/.next/server/app/api/telemetry/route.js.nft.json +0 -1
  172. package/.next/standalone/.next/server/app/api/telemetry/route_client-reference-manifest.js +0 -1
  173. package/.next/standalone/.next/server/app/api/uploads/route.js +0 -36
  174. package/.next/standalone/.next/server/app/api/uploads/route.js.nft.json +0 -1
  175. package/.next/standalone/.next/server/app/api/uploads/route_client-reference-manifest.js +0 -1
  176. package/.next/standalone/.next/server/app/chat/page.js +0 -4
  177. package/.next/standalone/.next/server/app/chat/page.js.nft.json +0 -1
  178. package/.next/standalone/.next/server/app/chat/page_client-reference-manifest.js +0 -1
  179. package/.next/standalone/.next/server/app/extensions/[id]/page.js +0 -2
  180. package/.next/standalone/.next/server/app/extensions/[id]/page.js.nft.json +0 -1
  181. package/.next/standalone/.next/server/app/extensions/[id]/page_client-reference-manifest.js +0 -1
  182. package/.next/standalone/.next/server/app/extensions/page.js +0 -2
  183. package/.next/standalone/.next/server/app/extensions/page.js.nft.json +0 -1
  184. package/.next/standalone/.next/server/app/extensions/page_client-reference-manifest.js +0 -1
  185. package/.next/standalone/.next/server/app/favicon.ico/route.js +0 -1
  186. package/.next/standalone/.next/server/app/favicon.ico/route.js.nft.json +0 -1
  187. package/.next/standalone/.next/server/app/favicon.ico.body +0 -0
  188. package/.next/standalone/.next/server/app/favicon.ico.meta +0 -1
  189. package/.next/standalone/.next/server/app/icon.svg/route.js +0 -1
  190. package/.next/standalone/.next/server/app/icon.svg/route.js.nft.json +0 -1
  191. package/.next/standalone/.next/server/app/icon.svg.body +0 -10
  192. package/.next/standalone/.next/server/app/icon.svg.meta +0 -1
  193. package/.next/standalone/.next/server/app/index.html +0 -1
  194. package/.next/standalone/.next/server/app/index.meta +0 -9
  195. package/.next/standalone/.next/server/app/index.rsc +0 -19
  196. package/.next/standalone/.next/server/app/login/page.js +0 -2
  197. package/.next/standalone/.next/server/app/login/page.js.nft.json +0 -1
  198. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +0 -1
  199. package/.next/standalone/.next/server/app/memory/page.js +0 -2
  200. package/.next/standalone/.next/server/app/memory/page.js.nft.json +0 -1
  201. package/.next/standalone/.next/server/app/memory/page_client-reference-manifest.js +0 -1
  202. package/.next/standalone/.next/server/app/page.js +0 -2
  203. package/.next/standalone/.next/server/app/page.js.nft.json +0 -1
  204. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +0 -1
  205. package/.next/standalone/.next/server/app/profiles/page.js +0 -2
  206. package/.next/standalone/.next/server/app/profiles/page.js.nft.json +0 -1
  207. package/.next/standalone/.next/server/app/profiles/page_client-reference-manifest.js +0 -1
  208. package/.next/standalone/.next/server/app/settings/approvals/page.js +0 -2
  209. package/.next/standalone/.next/server/app/settings/approvals/page.js.nft.json +0 -1
  210. package/.next/standalone/.next/server/app/settings/approvals/page_client-reference-manifest.js +0 -1
  211. package/.next/standalone/.next/server/app/settings/artifacts/page.js +0 -2
  212. package/.next/standalone/.next/server/app/settings/artifacts/page.js.nft.json +0 -1
  213. package/.next/standalone/.next/server/app/settings/artifacts/page_client-reference-manifest.js +0 -1
  214. package/.next/standalone/.next/server/app/settings/audit/page.js +0 -2
  215. package/.next/standalone/.next/server/app/settings/audit/page.js.nft.json +0 -1
  216. package/.next/standalone/.next/server/app/settings/audit/page_client-reference-manifest.js +0 -1
  217. package/.next/standalone/.next/server/app/settings/health/page.js +0 -2
  218. package/.next/standalone/.next/server/app/settings/health/page.js.nft.json +0 -1
  219. package/.next/standalone/.next/server/app/settings/health/page_client-reference-manifest.js +0 -1
  220. package/.next/standalone/.next/server/app/settings/mcp-diagnostics/page.js +0 -2
  221. package/.next/standalone/.next/server/app/settings/mcp-diagnostics/page.js.nft.json +0 -1
  222. package/.next/standalone/.next/server/app/settings/mcp-diagnostics/page_client-reference-manifest.js +0 -1
  223. package/.next/standalone/.next/server/app/settings/page.js +0 -2
  224. package/.next/standalone/.next/server/app/settings/page.js.nft.json +0 -1
  225. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +0 -1
  226. package/.next/standalone/.next/server/app/settings/runs/[id]/page.js +0 -2
  227. package/.next/standalone/.next/server/app/settings/runs/[id]/page.js.nft.json +0 -1
  228. package/.next/standalone/.next/server/app/settings/runs/[id]/page_client-reference-manifest.js +0 -1
  229. package/.next/standalone/.next/server/app/settings/runs/page.js +0 -2
  230. package/.next/standalone/.next/server/app/settings/runs/page.js.nft.json +0 -1
  231. package/.next/standalone/.next/server/app/settings/runs/page_client-reference-manifest.js +0 -1
  232. package/.next/standalone/.next/server/app/settings/telemetry/page.js +0 -2
  233. package/.next/standalone/.next/server/app/settings/telemetry/page.js.nft.json +0 -1
  234. package/.next/standalone/.next/server/app/settings/telemetry/page_client-reference-manifest.js +0 -1
  235. package/.next/standalone/.next/server/app/skills/[id]/page.js +0 -2
  236. package/.next/standalone/.next/server/app/skills/[id]/page.js.nft.json +0 -1
  237. package/.next/standalone/.next/server/app/skills/[id]/page_client-reference-manifest.js +0 -1
  238. package/.next/standalone/.next/server/app/skills/page.js +0 -2
  239. package/.next/standalone/.next/server/app/skills/page.js.nft.json +0 -1
  240. package/.next/standalone/.next/server/app/skills/page_client-reference-manifest.js +0 -1
  241. package/.next/standalone/.next/server/app-paths-manifest.json +0 -67
  242. package/.next/standalone/.next/server/chunks/1331.js +0 -22
  243. package/.next/standalone/.next/server/chunks/1692.js +0 -1
  244. package/.next/standalone/.next/server/chunks/2043.js +0 -1
  245. package/.next/standalone/.next/server/chunks/4337.js +0 -143
  246. package/.next/standalone/.next/server/chunks/4561.js +0 -1
  247. package/.next/standalone/.next/server/chunks/4689.js +0 -25
  248. package/.next/standalone/.next/server/chunks/5611.js +0 -6
  249. package/.next/standalone/.next/server/chunks/6111.js +0 -1
  250. package/.next/standalone/.next/server/chunks/6143.js +0 -9
  251. package/.next/standalone/.next/server/chunks/6516.js +0 -143
  252. package/.next/standalone/.next/server/chunks/6802.js +0 -1
  253. package/.next/standalone/.next/server/chunks/9546.js +0 -1
  254. package/.next/standalone/.next/server/functions-config-manifest.json +0 -4
  255. package/.next/standalone/.next/server/middleware-build-manifest.js +0 -1
  256. package/.next/standalone/.next/server/middleware-manifest.json +0 -6
  257. package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +0 -1
  258. package/.next/standalone/.next/server/next-font-manifest.js +0 -1
  259. package/.next/standalone/.next/server/next-font-manifest.json +0 -1
  260. package/.next/standalone/.next/server/pages/404.html +0 -1
  261. package/.next/standalone/.next/server/pages/500.html +0 -1
  262. package/.next/standalone/.next/server/pages/_app.js +0 -1
  263. package/.next/standalone/.next/server/pages/_app.js.nft.json +0 -1
  264. package/.next/standalone/.next/server/pages/_document.js +0 -1
  265. package/.next/standalone/.next/server/pages/_document.js.nft.json +0 -1
  266. package/.next/standalone/.next/server/pages/_error.js +0 -19
  267. package/.next/standalone/.next/server/pages/_error.js.nft.json +0 -1
  268. package/.next/standalone/.next/server/pages-manifest.json +0 -6
  269. package/.next/standalone/.next/server/server-reference-manifest.js +0 -1
  270. package/.next/standalone/.next/server/server-reference-manifest.json +0 -1
  271. package/.next/standalone/.next/server/webpack-runtime.js +0 -1
  272. package/.next/standalone/.next/static/chunks/1255-aadf393aa3a56bfa.js +0 -1
  273. package/.next/standalone/.next/static/chunks/1309-d826505bfad78fd1.js +0 -1
  274. package/.next/standalone/.next/static/chunks/2231-e0d8768bfce5fe57.js +0 -1
  275. package/.next/standalone/.next/static/chunks/4879-36321f505e9ce82a.js +0 -1
  276. package/.next/standalone/.next/static/chunks/4bd1b696-f785427dddbba9fb.js +0 -1
  277. package/.next/standalone/.next/static/chunks/5449-aba2dafba76d4508.js +0 -1
  278. package/.next/standalone/.next/static/chunks/9657-3ff4bf56070f324f.js +0 -1
  279. package/.next/standalone/.next/static/chunks/app/api/audit/route-bb3f5b9060cdc631.js +0 -1
  280. package/.next/standalone/.next/static/chunks/app/api/auth/login/route-bb3f5b9060cdc631.js +0 -1
  281. package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-bb3f5b9060cdc631.js +0 -1
  282. package/.next/standalone/.next/static/chunks/app/api/chat/sessions/[id]/fork/route-bb3f5b9060cdc631.js +0 -1
  283. package/.next/standalone/.next/static/chunks/app/api/chat/sessions/[id]/route-bb3f5b9060cdc631.js +0 -1
  284. package/.next/standalone/.next/static/chunks/app/api/chat/sessions/route-bb3f5b9060cdc631.js +0 -1
  285. package/.next/standalone/.next/static/chunks/app/api/chat/stream/route-bb3f5b9060cdc631.js +0 -1
  286. package/.next/standalone/.next/static/chunks/app/api/extensions/[id]/capabilities/[capabilityId]/route-bb3f5b9060cdc631.js +0 -1
  287. package/.next/standalone/.next/static/chunks/app/api/extensions/[id]/route-bb3f5b9060cdc631.js +0 -1
  288. package/.next/standalone/.next/static/chunks/app/api/extensions/[id]/test/route-bb3f5b9060cdc631.js +0 -1
  289. package/.next/standalone/.next/static/chunks/app/api/extensions/mcp/route-bb3f5b9060cdc631.js +0 -1
  290. package/.next/standalone/.next/static/chunks/app/api/extensions/route-bb3f5b9060cdc631.js +0 -1
  291. package/.next/standalone/.next/static/chunks/app/api/memory/agent/route-bb3f5b9060cdc631.js +0 -1
  292. package/.next/standalone/.next/static/chunks/app/api/memory/context-inspector/route-bb3f5b9060cdc631.js +0 -1
  293. package/.next/standalone/.next/static/chunks/app/api/memory/session-search/route-bb3f5b9060cdc631.js +0 -1
  294. package/.next/standalone/.next/static/chunks/app/api/memory/user/route-bb3f5b9060cdc631.js +0 -1
  295. package/.next/standalone/.next/static/chunks/app/api/profiles/[id]/config/route-bb3f5b9060cdc631.js +0 -1
  296. package/.next/standalone/.next/static/chunks/app/api/profiles/[id]/route-bb3f5b9060cdc631.js +0 -1
  297. package/.next/standalone/.next/static/chunks/app/api/profiles/route-bb3f5b9060cdc631.js +0 -1
  298. package/.next/standalone/.next/static/chunks/app/api/runtime/approvals/[toolCallId]/route-bb3f5b9060cdc631.js +0 -1
  299. package/.next/standalone/.next/static/chunks/app/api/runtime/approvals/route-bb3f5b9060cdc631.js +0 -1
  300. package/.next/standalone/.next/static/chunks/app/api/runtime/artifacts/download/route-bb3f5b9060cdc631.js +0 -1
  301. package/.next/standalone/.next/static/chunks/app/api/runtime/artifacts/route-bb3f5b9060cdc631.js +0 -1
  302. package/.next/standalone/.next/static/chunks/app/api/runtime/export/route-bb3f5b9060cdc631.js +0 -1
  303. package/.next/standalone/.next/static/chunks/app/api/runtime/health/route-bb3f5b9060cdc631.js +0 -1
  304. package/.next/standalone/.next/static/chunks/app/api/runtime/mcp-probes/route-bb3f5b9060cdc631.js +0 -1
  305. package/.next/standalone/.next/static/chunks/app/api/runtime/runs/[id]/route-bb3f5b9060cdc631.js +0 -1
  306. package/.next/standalone/.next/static/chunks/app/api/runtime/runs/route-bb3f5b9060cdc631.js +0 -1
  307. package/.next/standalone/.next/static/chunks/app/api/runtime/status/route-bb3f5b9060cdc631.js +0 -1
  308. package/.next/standalone/.next/static/chunks/app/api/runtime/telemetry/route-bb3f5b9060cdc631.js +0 -1
  309. package/.next/standalone/.next/static/chunks/app/api/runtime/timeline/route-bb3f5b9060cdc631.js +0 -1
  310. package/.next/standalone/.next/static/chunks/app/api/skills/[id]/disable/route-bb3f5b9060cdc631.js +0 -1
  311. package/.next/standalone/.next/static/chunks/app/api/skills/[id]/enable/route-bb3f5b9060cdc631.js +0 -1
  312. package/.next/standalone/.next/static/chunks/app/api/skills/[id]/files/route-bb3f5b9060cdc631.js +0 -1
  313. package/.next/standalone/.next/static/chunks/app/api/skills/[id]/install/route-bb3f5b9060cdc631.js +0 -1
  314. package/.next/standalone/.next/static/chunks/app/api/skills/[id]/load/route-bb3f5b9060cdc631.js +0 -1
  315. package/.next/standalone/.next/static/chunks/app/api/skills/[id]/route-bb3f5b9060cdc631.js +0 -1
  316. package/.next/standalone/.next/static/chunks/app/api/skills/catalog/route-bb3f5b9060cdc631.js +0 -1
  317. package/.next/standalone/.next/static/chunks/app/api/skills/categories/route-bb3f5b9060cdc631.js +0 -1
  318. package/.next/standalone/.next/static/chunks/app/api/skills/hub/install/route-bb3f5b9060cdc631.js +0 -1
  319. package/.next/standalone/.next/static/chunks/app/api/skills/hub/route-bb3f5b9060cdc631.js +0 -1
  320. package/.next/standalone/.next/static/chunks/app/api/skills/route-bb3f5b9060cdc631.js +0 -1
  321. package/.next/standalone/.next/static/chunks/app/api/telemetry/route-bb3f5b9060cdc631.js +0 -1
  322. package/.next/standalone/.next/static/chunks/app/api/uploads/route-bb3f5b9060cdc631.js +0 -1
  323. package/.next/standalone/.next/static/chunks/app/chat/page-117a5b54aee7eae4.js +0 -1
  324. package/.next/standalone/.next/static/chunks/app/extensions/page-c0fbb8efa9a3700c.js +0 -1
  325. package/.next/standalone/.next/static/chunks/app/layout-0bc970399be389b5.js +0 -1
  326. package/.next/standalone/.next/static/chunks/app/login/page-984e33272681e1e0.js +0 -1
  327. package/.next/standalone/.next/static/chunks/app/page-bb3f5b9060cdc631.js +0 -1
  328. package/.next/standalone/.next/static/chunks/app/profiles/page-46a0ad35feda9741.js +0 -1
  329. package/.next/standalone/.next/static/chunks/app/settings/artifacts/page-d3fddd43ac1243af.js +0 -1
  330. package/.next/standalone/.next/static/chunks/app/settings/audit/page-378bee43dd7c4903.js +0 -1
  331. package/.next/standalone/.next/static/chunks/app/settings/health/page-d34eadc11bc90af5.js +0 -1
  332. package/.next/standalone/.next/static/chunks/app/settings/mcp-diagnostics/page-3778d2842d5bdd79.js +0 -1
  333. package/.next/standalone/.next/static/chunks/app/settings/runs/[id]/page-7837ec57d531ef2b.js +0 -1
  334. package/.next/standalone/.next/static/chunks/app/skills/[id]/page-88bc62488ddf6c10.js +0 -1
  335. package/.next/standalone/.next/static/chunks/app/skills/page-e47c6a5f9559edc1.js +0 -1
  336. package/.next/standalone/.next/static/chunks/framework-f31701c9d93f12a4.js +0 -1
  337. package/.next/standalone/.next/static/chunks/main-1ac9e0711a0eb944.js +0 -1
  338. package/.next/standalone/.next/static/chunks/pages/_app-6c8c2371b16a04b8.js +0 -1
  339. package/.next/standalone/.next/static/chunks/pages/_error-94812ad32cad7365.js +0 -1
  340. package/.next/standalone/.next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  341. package/.next/standalone/.next/static/chunks/webpack-0100acb42ec0d4c7.js +0 -1
  342. package/.next/standalone/.next/static/css/f5a43afa8024b892.css +0 -3
  343. package/.next/static/9GQlyWupf2ogNOh-EUSPL/_buildManifest.js +0 -1
  344. package/.next/static/9GQlyWupf2ogNOh-EUSPL/_ssgManifest.js +0 -1
  345. package/.next/static/chunks/app/_not-found/page-9c90a6b39424f003.js +0 -1
  346. package/.next/static/chunks/app/chat/page-117a5b54aee7eae4.js +0 -1
  347. package/.next/static/chunks/app/extensions/[id]/page-cca6df1771ec04d2.js +0 -1
  348. package/.next/static/chunks/app/layout-0bc970399be389b5.js +0 -1
  349. package/.next/static/chunks/app/login/page-984e33272681e1e0.js +0 -1
  350. package/.next/static/chunks/app/memory/page-0684ff3ce6888ae7.js +0 -1
  351. package/.next/static/chunks/app/profiles/page-46a0ad35feda9741.js +0 -1
  352. package/.next/static/chunks/app/settings/approvals/page-6843c585791e4db7.js +0 -1
  353. package/.next/static/chunks/app/settings/artifacts/page-d3fddd43ac1243af.js +0 -1
  354. package/.next/static/chunks/app/settings/audit/page-378bee43dd7c4903.js +0 -1
  355. package/.next/static/chunks/app/settings/health/page-d34eadc11bc90af5.js +0 -1
  356. package/.next/static/chunks/app/settings/mcp-diagnostics/page-3778d2842d5bdd79.js +0 -1
  357. package/.next/static/chunks/app/settings/page-8a40bdf895f43430.js +0 -1
  358. package/.next/static/chunks/app/settings/runs/[id]/page-7837ec57d531ef2b.js +0 -1
  359. package/.next/static/chunks/app/settings/runs/page-cb4d1617e199c38e.js +0 -1
  360. package/.next/static/chunks/app/settings/telemetry/page-c0446baefa5496cb.js +0 -1
  361. package/.next/static/chunks/app/skills/[id]/page-88bc62488ddf6c10.js +0 -1
  362. package/.next/static/chunks/app/skills/page-e47c6a5f9559edc1.js +0 -1
  363. package/.next/static/chunks/main-app-a9e2c007d433eaf9.js +0 -1
  364. package/.next/static/css/f5a43afa8024b892.css +0 -3
  365. /package/.next/{standalone/.next/static/9GQlyWupf2ogNOh-EUSPL → static/GRY0Lg42m80lHYHfaVVa0}/_buildManifest.js +0 -0
  366. /package/.next/{standalone/.next/static/9GQlyWupf2ogNOh-EUSPL → static/GRY0Lg42m80lHYHfaVVa0}/_ssgManifest.js +0 -0
package/bin/pan-ui.mjs CHANGED
@@ -4,17 +4,23 @@
4
4
  * pan-ui — CLI launcher with interactive setup wizard.
5
5
  *
6
6
  * Usage:
7
- * npx pan-ui # start (runs setup on first launch)
8
- * npx pan-ui setup # re-run setup wizard
9
- * npx pan-ui --port 8080 # custom port
7
+ * npx pan-ui # start foreground (runs setup on first launch)
8
+ * npx pan-ui --daemon # start in background (daemonize)
9
+ * npx pan-ui stop # stop background daemon
10
+ * npx pan-ui status # check if daemon is running
11
+ * npx pan-ui logs # tail daemon log output
12
+ * npx pan-ui setup # re-run setup wizard
13
+ * npx pan-ui service install # install systemd user service
14
+ * npx pan-ui service remove # remove systemd user service
15
+ * npx pan-ui --port 8080 # custom port
10
16
  */
11
17
 
12
18
  import { createInterface } from 'node:readline';
13
- import { existsSync, readFileSync, writeFileSync, mkdirSync, statSync, readdirSync } from 'node:fs';
19
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, statSync, readdirSync, unlinkSync, openSync } from 'node:fs';
14
20
  import { resolve, join, dirname } from 'node:path';
15
21
  import { execSync, spawn, execFileSync } from 'node:child_process';
16
22
  import { fileURLToPath } from 'node:url';
17
- import { homedir } from 'node:os';
23
+ import { homedir, platform } from 'node:os';
18
24
  import crypto from 'node:crypto';
19
25
 
20
26
  // ─── Paths ──────────────────────────────────────────────────────────────────
@@ -23,6 +29,9 @@ const __filename = fileURLToPath(import.meta.url);
23
29
  const __dirname = dirname(__filename);
24
30
  const PKG_ROOT = resolve(__dirname, '..');
25
31
  const ENV_PATH = join(PKG_ROOT, '.env.local');
32
+ const RUN_DIR = join(homedir(), '.pan-ui');
33
+ const PID_FILE = join(RUN_DIR, 'pan-ui.pid');
34
+ const LOG_FILE = join(RUN_DIR, 'pan-ui.log');
26
35
 
27
36
  // ─── Helpers ────────────────────────────────────────────────────────────────
28
37
 
@@ -396,6 +405,324 @@ function startServer(env, portOverride) {
396
405
  }
397
406
  }
398
407
 
408
+ // ─── Daemon management ───────────────────────────────────────────────────────
409
+
410
+ function ensureRunDir() {
411
+ if (!existsSync(RUN_DIR)) mkdirSync(RUN_DIR, { recursive: true });
412
+ }
413
+
414
+ function readPid() {
415
+ if (!existsSync(PID_FILE)) return null;
416
+ const pid = parseInt(readFileSync(PID_FILE, 'utf-8').trim(), 10);
417
+ if (isNaN(pid)) return null;
418
+ return pid;
419
+ }
420
+
421
+ function isProcessRunning(pid) {
422
+ try {
423
+ process.kill(pid, 0); // signal 0 = check existence
424
+ return true;
425
+ } catch {
426
+ return false;
427
+ }
428
+ }
429
+
430
+ function getDaemonStatus() {
431
+ const pid = readPid();
432
+ if (!pid) return { running: false, pid: null };
433
+ if (isProcessRunning(pid)) return { running: true, pid };
434
+ // Stale PID file
435
+ try { unlinkSync(PID_FILE); } catch {}
436
+ return { running: false, pid: null };
437
+ }
438
+
439
+ function startDaemon(env, portOverride) {
440
+ const { running, pid: existingPid } = getDaemonStatus();
441
+ if (running) {
442
+ console.log(` ${yellow('!')} Pan UI is already running (PID ${existingPid})`);
443
+ console.log(` ${dim('Stop with:')} ${cyan('npx pan-ui stop')}`);
444
+ process.exit(0);
445
+ }
446
+
447
+ ensureRunDir();
448
+
449
+ const port = portOverride || env.PORT || '3199';
450
+ const serverEnv = {
451
+ ...process.env,
452
+ ...env,
453
+ PORT: port,
454
+ NODE_ENV: 'production',
455
+ HOSTNAME: '0.0.0.0',
456
+ };
457
+
458
+ const standaloneServer = findStandaloneServer();
459
+ let cmd, cmdArgs, cwd;
460
+
461
+ if (standaloneServer) {
462
+ patchStandalonePaths();
463
+ cmd = process.execPath; // node
464
+ cmdArgs = [standaloneServer];
465
+ cwd = join(PKG_ROOT, '.next', 'standalone');
466
+ } else {
467
+ const hasProductionBuild = existsSync(join(PKG_ROOT, '.next', 'BUILD_ID'));
468
+ const nextCmd = hasProductionBuild ? 'start' : 'dev';
469
+ cmd = 'npx';
470
+ cmdArgs = ['next', nextCmd, '-p', port];
471
+ cwd = PKG_ROOT;
472
+ }
473
+
474
+ // Open log file for stdout/stderr
475
+ const logFd = openSync(LOG_FILE, 'a');
476
+
477
+ const child = spawn(cmd, cmdArgs, {
478
+ cwd,
479
+ env: serverEnv,
480
+ detached: true,
481
+ stdio: ['ignore', logFd, logFd],
482
+ });
483
+
484
+ child.unref();
485
+
486
+ writeFileSync(PID_FILE, String(child.pid), 'utf-8');
487
+
488
+ console.log('');
489
+ console.log(bold(' ╔══════════════════════════════════════════╗'));
490
+ console.log(bold(' ║') + green(' ⚡ Pan UI started (daemon) ') + bold('║'));
491
+ console.log(bold(' ╚══════════════════════════════════════════╝'));
492
+ console.log('');
493
+ console.log(` ${dim('PID:')} ${cyan(String(child.pid))}`);
494
+ console.log(` ${dim('Local:')} ${cyan(`http://localhost:${port}`)}`);
495
+ console.log(` ${dim('Log:')} ${cyan(LOG_FILE)}`);
496
+ console.log('');
497
+ console.log(` ${dim('Stop with:')} ${cyan('npx pan-ui stop')}`);
498
+ console.log(` ${dim('View logs:')} ${cyan('npx pan-ui logs')}`);
499
+ console.log(` ${dim('Check status:')} ${cyan('npx pan-ui status')}`);
500
+ console.log('');
501
+ }
502
+
503
+ function stopDaemon() {
504
+ const { running, pid } = getDaemonStatus();
505
+ if (!running) {
506
+ console.log(` ${dim('Pan UI is not running.')}`);
507
+ process.exit(0);
508
+ }
509
+
510
+ try {
511
+ process.kill(pid, 'SIGTERM');
512
+ console.log(` ${green('✓')} Pan UI stopped (PID ${pid})`);
513
+ } catch (err) {
514
+ console.log(` ${red('✗')} Failed to stop PID ${pid}: ${err.message}`);
515
+ }
516
+
517
+ try { unlinkSync(PID_FILE); } catch {}
518
+ }
519
+
520
+ function showStatus() {
521
+ const { running, pid } = getDaemonStatus();
522
+ const env = loadEnv(ENV_PATH);
523
+ const port = env.PORT || '3199';
524
+
525
+ if (running) {
526
+ console.log('');
527
+ console.log(` ${green('●')} Pan UI is ${green('running')}`);
528
+ console.log(` ${dim('PID:')} ${cyan(String(pid))}`);
529
+ console.log(` ${dim('Local:')} ${cyan(`http://localhost:${port}`)}`);
530
+ console.log(` ${dim('Log:')} ${cyan(LOG_FILE)}`);
531
+ console.log('');
532
+ } else {
533
+ console.log('');
534
+ console.log(` ${red('●')} Pan UI is ${red('stopped')}`);
535
+ console.log(` ${dim('Start with:')} ${cyan('npx pan-ui --daemon')}`);
536
+ console.log('');
537
+ }
538
+ }
539
+
540
+ function showLogs() {
541
+ if (!existsSync(LOG_FILE)) {
542
+ console.log(` ${dim('No log file found. Start the daemon first.')}`);
543
+ process.exit(0);
544
+ }
545
+
546
+ // Tail the last 50 lines, then follow
547
+ const child = spawn('tail', ['-n', '50', '-f', LOG_FILE], {
548
+ stdio: 'inherit',
549
+ });
550
+ process.on('SIGINT', () => { child.kill('SIGINT'); process.exit(0); });
551
+ child.on('exit', (code) => process.exit(code ?? 0));
552
+ }
553
+
554
+ // ─── Systemd service management ─────────────────────────────────────────────
555
+
556
+ function getServiceDir() {
557
+ return join(homedir(), '.config', 'systemd', 'user');
558
+ }
559
+
560
+ const SERVICE_NAME = 'pan-ui';
561
+
562
+ function getServicePath() {
563
+ return join(getServiceDir(), `${SERVICE_NAME}.service`);
564
+ }
565
+
566
+ function generateServiceUnit(env) {
567
+ const port = env.PORT || '3199';
568
+ const nodePath = process.execPath;
569
+ const binPath = resolve(__dirname, 'pan-ui.mjs');
570
+
571
+ // Build environment lines (skip PORT — we add it explicitly below)
572
+ const envLines = [];
573
+ for (const [key, value] of Object.entries(env)) {
574
+ if (key && value && key !== 'PORT') envLines.push(`Environment=${key}=${value}`);
575
+ }
576
+ envLines.push(`Environment=NODE_ENV=production`);
577
+ envLines.push(`Environment=PORT=${port}`);
578
+ envLines.push(`Environment=HOSTNAME=0.0.0.0`);
579
+
580
+ return `[Unit]
581
+ Description=Pan UI — WebUI for Hermes Agent
582
+ After=network.target
583
+
584
+ [Service]
585
+ Type=simple
586
+ ExecStart=${nodePath} ${binPath}
587
+ WorkingDirectory=${PKG_ROOT}
588
+ Restart=on-failure
589
+ RestartSec=5
590
+ ${envLines.join('\n')}
591
+
592
+ # Logging
593
+ StandardOutput=journal
594
+ StandardError=journal
595
+ SyslogIdentifier=pan-ui
596
+
597
+ [Install]
598
+ WantedBy=default.target
599
+ `;
600
+ }
601
+
602
+ async function serviceInstall() {
603
+ if (platform() !== 'linux') {
604
+ console.log(` ${red('✗')} Systemd services are only supported on Linux.`);
605
+ console.log(` ${dim('Use')} ${cyan('npx pan-ui --daemon')} ${dim('instead.')}`);
606
+ process.exit(1);
607
+ }
608
+
609
+ // Ensure setup has been run
610
+ const env = loadEnv(ENV_PATH);
611
+ if (Object.keys(env).length === 0) {
612
+ console.log(` ${yellow('!')} No configuration found. Running setup first...`);
613
+ console.log('');
614
+ const newEnv = await setup(true);
615
+ rl.close();
616
+ return doServiceInstall(newEnv);
617
+ }
618
+ rl.close();
619
+ return doServiceInstall(env);
620
+ }
621
+
622
+ function doServiceInstall(env) {
623
+ const serviceDir = getServiceDir();
624
+ const servicePath = getServicePath();
625
+
626
+ mkdirSync(serviceDir, { recursive: true });
627
+
628
+ const unit = generateServiceUnit(env);
629
+ writeFileSync(servicePath, unit, 'utf-8');
630
+
631
+ console.log('');
632
+ console.log(` ${green('✓')} Service file written to ${cyan(servicePath)}`);
633
+
634
+ // Reload and enable
635
+ try {
636
+ execSync('systemctl --user daemon-reload', { stdio: 'ignore' });
637
+ console.log(` ${green('✓')} Systemd daemon reloaded`);
638
+ } catch {
639
+ console.log(` ${yellow('!')} Could not reload systemd daemon (are you in a user session?)`);
640
+ }
641
+
642
+ try {
643
+ execSync(`systemctl --user enable ${SERVICE_NAME}`, { stdio: 'ignore' });
644
+ console.log(` ${green('✓')} Service enabled (starts on login)`);
645
+ } catch {
646
+ console.log(` ${yellow('!')} Could not enable service`);
647
+ }
648
+
649
+ try {
650
+ execSync(`systemctl --user start ${SERVICE_NAME}`, { stdio: 'ignore' });
651
+ console.log(` ${green('✓')} Service started`);
652
+ } catch {
653
+ console.log(` ${yellow('!')} Could not start service — try: systemctl --user start ${SERVICE_NAME}`);
654
+ }
655
+
656
+ // Enable lingering so service runs even when not logged in
657
+ try {
658
+ execSync(`loginctl enable-linger ${process.env.USER || ''}`, { stdio: 'ignore' });
659
+ console.log(` ${green('✓')} Lingering enabled (survives logout)`);
660
+ } catch {
661
+ console.log(` ${dim('Tip: run')} ${cyan(`loginctl enable-linger`)} ${dim('so the service survives logout')}`);
662
+ }
663
+
664
+ const port = env.PORT || '3199';
665
+ console.log('');
666
+ console.log(` ${dim('Local:')} ${cyan(`http://localhost:${port}`)}`);
667
+ console.log('');
668
+ console.log(` ${dim('Manage with:')}`);
669
+ console.log(` ${cyan(`systemctl --user status ${SERVICE_NAME}`)}`);
670
+ console.log(` ${cyan(`systemctl --user restart ${SERVICE_NAME}`)}`);
671
+ console.log(` ${cyan(`journalctl --user -u ${SERVICE_NAME} -f`)}`);
672
+ console.log(` ${cyan(`npx pan-ui service remove`)}`);
673
+ console.log('');
674
+ }
675
+
676
+ function serviceRemove() {
677
+ if (platform() !== 'linux') {
678
+ console.log(` ${red('✗')} Systemd services are only supported on Linux.`);
679
+ process.exit(1);
680
+ }
681
+
682
+ const servicePath = getServicePath();
683
+
684
+ // Stop and disable
685
+ try {
686
+ execSync(`systemctl --user stop ${SERVICE_NAME}`, { stdio: 'ignore' });
687
+ console.log(` ${green('✓')} Service stopped`);
688
+ } catch {}
689
+
690
+ try {
691
+ execSync(`systemctl --user disable ${SERVICE_NAME}`, { stdio: 'ignore' });
692
+ console.log(` ${green('✓')} Service disabled`);
693
+ } catch {}
694
+
695
+ if (existsSync(servicePath)) {
696
+ unlinkSync(servicePath);
697
+ console.log(` ${green('✓')} Removed ${servicePath}`);
698
+ }
699
+
700
+ try {
701
+ execSync('systemctl --user daemon-reload', { stdio: 'ignore' });
702
+ console.log(` ${green('✓')} Systemd daemon reloaded`);
703
+ } catch {}
704
+
705
+ console.log('');
706
+ console.log(` ${dim('Pan UI service has been fully removed.')}`);
707
+ console.log('');
708
+ }
709
+
710
+ function serviceStatus() {
711
+ if (platform() !== 'linux') {
712
+ console.log(` ${red('✗')} Systemd services are only supported on Linux.`);
713
+ process.exit(1);
714
+ }
715
+
716
+ try {
717
+ const output = execSync(`systemctl --user status ${SERVICE_NAME} 2>&1`, { encoding: 'utf-8' });
718
+ console.log(output);
719
+ } catch (err) {
720
+ // systemctl returns non-zero for inactive services
721
+ if (err.stdout) console.log(err.stdout);
722
+ else console.log(` ${dim('Service not installed. Run:')} ${cyan('npx pan-ui service install')}`);
723
+ }
724
+ }
725
+
399
726
  // ─── CLI entry point ────────────────────────────────────────────────────────
400
727
 
401
728
  async function main() {
@@ -413,8 +740,65 @@ async function main() {
413
740
  portOverride = args[shortPortIdx + 1];
414
741
  }
415
742
 
743
+ // Parse --daemon / -d flag
744
+ const isDaemon = args.includes('--daemon') || args.includes('-d');
745
+
746
+ // ── Stop ──────────────────────────────────────────────────────────────
747
+
748
+ if (command === 'stop') {
749
+ rl.close();
750
+ stopDaemon();
751
+ process.exit(0);
752
+ }
753
+
754
+ // ── Status ────────────────────────────────────────────────────────────
755
+
756
+ if (command === 'status') {
757
+ rl.close();
758
+ showStatus();
759
+ process.exit(0);
760
+ }
761
+
762
+ // ── Logs ──────────────────────────────────────────────────────────────
763
+
764
+ if (command === 'logs') {
765
+ rl.close();
766
+ showLogs();
767
+ return; // showLogs takes over the process
768
+ }
769
+
770
+ // ── Service management ────────────────────────────────────────────────
771
+
772
+ if (command === 'service') {
773
+ const subcommand = args[1];
774
+ if (subcommand === 'install') {
775
+ await serviceInstall();
776
+ process.exit(0);
777
+ }
778
+ if (subcommand === 'remove' || subcommand === 'uninstall') {
779
+ rl.close();
780
+ serviceRemove();
781
+ process.exit(0);
782
+ }
783
+ if (subcommand === 'status') {
784
+ rl.close();
785
+ serviceStatus();
786
+ process.exit(0);
787
+ }
788
+ // Unknown subcommand
789
+ rl.close();
790
+ console.log('');
791
+ console.log(` ${dim('Usage:')}`);
792
+ console.log(` ${cyan('npx pan-ui service install')} Install systemd user service`);
793
+ console.log(` ${cyan('npx pan-ui service remove')} Remove systemd user service`);
794
+ console.log(` ${cyan('npx pan-ui service status')} Show service status`);
795
+ console.log('');
796
+ process.exit(1);
797
+ }
798
+
799
+ // ── Setup ─────────────────────────────────────────────────────────────
800
+
416
801
  if (command === 'setup') {
417
- // Explicit setup
418
802
  const env = await setup(true);
419
803
  rl.close();
420
804
  console.log(` ${dim('Start with:')} ${cyan('npx pan-ui')}`);
@@ -422,15 +806,23 @@ async function main() {
422
806
  process.exit(0);
423
807
  }
424
808
 
809
+ // ── Help ──────────────────────────────────────────────────────────────
810
+
425
811
  if (command === '--help' || command === '-h') {
426
812
  console.log('');
427
813
  console.log(bold(' pan-ui') + dim(' — Beautiful WebUI for Hermes Agent'));
428
814
  console.log('');
429
815
  console.log(' Usage:');
430
- console.log(` ${cyan('npx pan-ui')} Start the workspace`);
431
- console.log(` ${cyan('npx pan-ui setup')} Run setup wizard`);
432
- console.log(` ${cyan('npx pan-ui --port 8080')} Custom port`);
433
- console.log(` ${cyan('npx pan-ui --help')} Show this help`);
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`);
434
826
  console.log('');
435
827
  console.log(' Environment variables:');
436
828
  console.log(` ${dim('HERMES_HOME')} Path to Hermes home (default: ~/.hermes)`);
@@ -445,9 +837,16 @@ async function main() {
445
837
  process.exit(0);
446
838
  }
447
839
 
448
- // Default: run setup if first time, then start
840
+ // ── Default: setup if first time, then start ──────────────────────────
841
+
449
842
  const env = await setup(false);
450
843
  rl.close();
844
+
845
+ if (isDaemon) {
846
+ await startDaemon(env, portOverride);
847
+ process.exit(0);
848
+ }
849
+
451
850
  startServer(env, portOverride);
452
851
  }
453
852
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@euraika-labs/pan-ui",
3
- "version": "0.2.3",
3
+ "version": "0.4.0",
4
4
  "description": "Beautiful WebUI for Hermes Agent — chat, skills, plugins, memory, profiles, and runtime diagnostics in one workspace.",
5
5
  "keywords": [
6
6
  "hermes",
@@ -79,6 +79,11 @@
79
79
  "typescript": "^5.6.3",
80
80
  "vitest": "^4.1.2"
81
81
  },
82
+ "prettier": {
83
+ "semi": true,
84
+ "singleQuote": true,
85
+ "trailingComma": "all"
86
+ },
82
87
  "engines": {
83
88
  "node": ">=18.18.0"
84
89
  }
package/.env.example DELETED
@@ -1,30 +0,0 @@
1
- # Pan UI configuration
2
- # Copy to .env.local and customize, or run: npx pan-ui setup
3
-
4
- # ── Hermes Runtime ───────────────────────────────────────────────────────────
5
- # Path to Hermes home directory (auto-detected if omitted)
6
- # HERMES_HOME=~/.hermes
7
-
8
- # Hermes API server URL (started with: hermes acp or hermes gateway)
9
- HERMES_API_BASE_URL=http://127.0.0.1:8642
10
-
11
- # Optional API key for the Hermes API server
12
- # HERMES_API_KEY=
13
-
14
- # API request timeout in milliseconds
15
- # HERMES_API_TIMEOUT_MS=30000
16
-
17
- # ── Workspace Auth ───────────────────────────────────────────────────────────
18
- # Login credentials for the web UI
19
- HERMES_WORKSPACE_USERNAME=admin
20
- HERMES_WORKSPACE_PASSWORD=changeme
21
-
22
- # Session signing secret (auto-generated by setup wizard if empty)
23
- # HERMES_WORKSPACE_SECRET=
24
-
25
- # ── Server ───────────────────────────────────────────────────────────────────
26
- # Port for the workspace UI
27
- PORT=3199
28
-
29
- # Enable mock data when Hermes runtime is unavailable (true/false)
30
- HERMES_MOCK_MODE=false
@@ -1 +0,0 @@
1
- 9GQlyWupf2ogNOh-EUSPL