@euraika-labs/pan-ui 0.2.2 → 0.2.4

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