@antelopejs/dms-ai 0.0.1

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 (416) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +46 -0
  3. package/dist/builder/presence.d.ts +1 -0
  4. package/dist/builder/presence.js +22 -0
  5. package/dist/builder/presence.js.map +1 -0
  6. package/dist/constants/builder.d.ts +7 -0
  7. package/dist/constants/builder.js +11 -0
  8. package/dist/constants/builder.js.map +1 -0
  9. package/dist/constants/frontend-module.d.ts +3 -0
  10. package/dist/constants/frontend-module.js +7 -0
  11. package/dist/constants/frontend-module.js.map +1 -0
  12. package/dist/constants/logs.d.ts +3 -0
  13. package/dist/constants/logs.js +7 -0
  14. package/dist/constants/logs.js.map +1 -0
  15. package/dist/constants/module.d.ts +3 -0
  16. package/dist/constants/module.js +7 -0
  17. package/dist/constants/module.js.map +1 -0
  18. package/dist/constants/pages-registry.d.ts +2 -0
  19. package/dist/constants/pages-registry.js +6 -0
  20. package/dist/constants/pages-registry.js.map +1 -0
  21. package/dist/constants/sidecar.d.ts +24 -0
  22. package/dist/constants/sidecar.js +32 -0
  23. package/dist/constants/sidecar.js.map +1 -0
  24. package/dist/index.d.ts +3 -0
  25. package/dist/index.js +41 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/lifecycle/module-roots.d.ts +1 -0
  28. package/dist/lifecycle/module-roots.js +52 -0
  29. package/dist/lifecycle/module-roots.js.map +1 -0
  30. package/dist/lifecycle/respawn-tracker.d.ts +5 -0
  31. package/dist/lifecycle/respawn-tracker.js +20 -0
  32. package/dist/lifecycle/respawn-tracker.js.map +1 -0
  33. package/dist/lifecycle/skill-sources.d.ts +5 -0
  34. package/dist/lifecycle/skill-sources.js +181 -0
  35. package/dist/lifecycle/skill-sources.js.map +1 -0
  36. package/dist/lifecycle/spawn-sidecar.d.ts +17 -0
  37. package/dist/lifecycle/spawn-sidecar.js +299 -0
  38. package/dist/lifecycle/spawn-sidecar.js.map +1 -0
  39. package/dist/logging/log-buffer.d.ts +9 -0
  40. package/dist/logging/log-buffer.js +76 -0
  41. package/dist/logging/log-buffer.js.map +1 -0
  42. package/dist/pages/activity/page.d.ts +10 -0
  43. package/dist/pages/activity/page.js +62 -0
  44. package/dist/pages/activity/page.js.map +1 -0
  45. package/dist/pages/all.d.ts +4 -0
  46. package/dist/pages/all.js +21 -0
  47. package/dist/pages/all.js.map +1 -0
  48. package/dist/pages/index.d.ts +4 -0
  49. package/dist/pages/index.js +21 -0
  50. package/dist/pages/index.js.map +1 -0
  51. package/dist/pages/module.d.ts +1 -0
  52. package/dist/pages/module.js +11 -0
  53. package/dist/pages/module.js.map +1 -0
  54. package/dist/pages/overview/page.d.ts +11 -0
  55. package/dist/pages/overview/page.js +82 -0
  56. package/dist/pages/overview/page.js.map +1 -0
  57. package/dist/pages/settings/page.d.ts +9 -0
  58. package/dist/pages/settings/page.js +29 -0
  59. package/dist/pages/settings/page.js.map +1 -0
  60. package/dist/pages/skills/page.d.ts +9 -0
  61. package/dist/pages/skills/page.js +29 -0
  62. package/dist/pages/skills/page.js.map +1 -0
  63. package/dist/pages-registry.d.ts +2 -0
  64. package/dist/pages-registry.js +41 -0
  65. package/dist/pages-registry.js.map +1 -0
  66. package/dist/routes/builder.d.ts +11 -0
  67. package/dist/routes/builder.js +135 -0
  68. package/dist/routes/builder.js.map +1 -0
  69. package/dist/routes/health.d.ts +8 -0
  70. package/dist/routes/health.js +27 -0
  71. package/dist/routes/health.js.map +1 -0
  72. package/dist/routes/index.d.ts +8 -0
  73. package/dist/routes/index.js +25 -0
  74. package/dist/routes/index.js.map +1 -0
  75. package/dist/routes/logs.d.ts +7 -0
  76. package/dist/routes/logs.js +51 -0
  77. package/dist/routes/logs.js.map +1 -0
  78. package/dist/routes/metrics.d.ts +54 -0
  79. package/dist/routes/metrics.js +104 -0
  80. package/dist/routes/metrics.js.map +1 -0
  81. package/dist/routes/pages-registry.d.ts +7 -0
  82. package/dist/routes/pages-registry.js +86 -0
  83. package/dist/routes/pages-registry.js.map +1 -0
  84. package/dist/routes/proxy.d.ts +4 -0
  85. package/dist/routes/proxy.js +55 -0
  86. package/dist/routes/proxy.js.map +1 -0
  87. package/dist/routes/settings.d.ts +13 -0
  88. package/dist/routes/settings.js +52 -0
  89. package/dist/routes/settings.js.map +1 -0
  90. package/dist/routes/sidecar-auth.d.ts +3 -0
  91. package/dist/routes/sidecar-auth.js +27 -0
  92. package/dist/routes/sidecar-auth.js.map +1 -0
  93. package/dist/routes/sidecar-info.d.ts +6 -0
  94. package/dist/routes/sidecar-info.js +39 -0
  95. package/dist/routes/sidecar-info.js.map +1 -0
  96. package/dist/routes/skills.d.ts +18 -0
  97. package/dist/routes/skills.js +33 -0
  98. package/dist/routes/skills.js.map +1 -0
  99. package/dist/types/index.d.ts +2 -0
  100. package/dist/types/index.js +19 -0
  101. package/dist/types/index.js.map +1 -0
  102. package/dist/types/logs.d.ts +12 -0
  103. package/dist/types/logs.js +3 -0
  104. package/dist/types/logs.js.map +1 -0
  105. package/dist/types/pages-registry.d.ts +6 -0
  106. package/dist/types/pages-registry.js +3 -0
  107. package/dist/types/pages-registry.js.map +1 -0
  108. package/frontend-vue/.editorconfig +12 -0
  109. package/frontend-vue/app/components/ActivityView.vue +94 -0
  110. package/frontend-vue/app/components/SettingsView.vue +300 -0
  111. package/frontend-vue/app/components/SkillsView.vue +228 -0
  112. package/frontend-vue/app/plugins/ai.client.ts +109 -0
  113. package/frontend-vue/app/runtime/backoff.ts +30 -0
  114. package/frontend-vue/app/runtime/constants.ts +66 -0
  115. package/frontend-vue/app/runtime/current-page.ts +28 -0
  116. package/frontend-vue/app/runtime/header-action.ts +64 -0
  117. package/frontend-vue/app/runtime/host-commands.ts +127 -0
  118. package/frontend-vue/app/runtime/navigation-complete.ts +22 -0
  119. package/frontend-vue/app/runtime/overlay-prefs.ts +89 -0
  120. package/frontend-vue/app/runtime/overlay.ts +383 -0
  121. package/frontend-vue/app/runtime/shortcuts.ts +28 -0
  122. package/frontend-vue/app/runtime/sidecar-status.ts +163 -0
  123. package/frontend-vue/app/runtime/theme-bridge.ts +177 -0
  124. package/frontend-vue/app/runtime/ws-client.ts +196 -0
  125. package/frontend-vue/dms.frontend.ts +26 -0
  126. package/frontend-vue/eslint.config.mjs +24 -0
  127. package/frontend-vue/package.json +33 -0
  128. package/frontend-vue/pnpm-lock.yaml +2723 -0
  129. package/frontend-vue/tests/backoff.test.ts +44 -0
  130. package/frontend-vue/tests/host-commands.test.ts +142 -0
  131. package/frontend-vue/tests/navigation.test.ts +45 -0
  132. package/frontend-vue/tests/overlay-prefs.test.ts +91 -0
  133. package/frontend-vue/tests/sidecar-auth.test.ts +87 -0
  134. package/frontend-vue/tests/sidecar-guest.test.ts +45 -0
  135. package/frontend-vue/vitest.config.ts +8 -0
  136. package/package.json +79 -0
  137. package/sidecar/chatbox/dist/assets/index-Cy2BwTG0.js +50 -0
  138. package/sidecar/chatbox/dist/assets/index-pP_KOHIn.css +1 -0
  139. package/sidecar/chatbox/dist/index.html +13 -0
  140. package/sidecar/dist/agent/attachments.d.ts +8 -0
  141. package/sidecar/dist/agent/attachments.js +85 -0
  142. package/sidecar/dist/agent/attachments.js.map +1 -0
  143. package/sidecar/dist/agent/claude-runner.d.ts +33 -0
  144. package/sidecar/dist/agent/claude-runner.js +264 -0
  145. package/sidecar/dist/agent/claude-runner.js.map +1 -0
  146. package/sidecar/dist/agent/claude-session.d.ts +18 -0
  147. package/sidecar/dist/agent/claude-session.js +155 -0
  148. package/sidecar/dist/agent/claude-session.js.map +1 -0
  149. package/sidecar/dist/agent/edit-tracker.d.ts +9 -0
  150. package/sidecar/dist/agent/edit-tracker.js +34 -0
  151. package/sidecar/dist/agent/edit-tracker.js.map +1 -0
  152. package/sidecar/dist/agent/host-context.d.ts +4 -0
  153. package/sidecar/dist/agent/host-context.js +16 -0
  154. package/sidecar/dist/agent/host-context.js.map +1 -0
  155. package/sidecar/dist/agent/input-queue.d.ts +7 -0
  156. package/sidecar/dist/agent/input-queue.js +39 -0
  157. package/sidecar/dist/agent/input-queue.js.map +1 -0
  158. package/sidecar/dist/agent/permission-bus.d.ts +26 -0
  159. package/sidecar/dist/agent/permission-bus.js +138 -0
  160. package/sidecar/dist/agent/permission-bus.js.map +1 -0
  161. package/sidecar/dist/agent/question-bus.d.ts +22 -0
  162. package/sidecar/dist/agent/question-bus.js +91 -0
  163. package/sidecar/dist/agent/question-bus.js.map +1 -0
  164. package/sidecar/dist/agent/read-access.d.ts +2 -0
  165. package/sidecar/dist/agent/read-access.js +33 -0
  166. package/sidecar/dist/agent/read-access.js.map +1 -0
  167. package/sidecar/dist/agent/resolve-claude-binary.d.ts +1 -0
  168. package/sidecar/dist/agent/resolve-claude-binary.js +43 -0
  169. package/sidecar/dist/agent/resolve-claude-binary.js.map +1 -0
  170. package/sidecar/dist/agent/runner-events.d.ts +28 -0
  171. package/sidecar/dist/agent/runner-events.js +2 -0
  172. package/sidecar/dist/agent/runner-events.js.map +1 -0
  173. package/sidecar/dist/agent/sdk-adapter.d.ts +3 -0
  174. package/sidecar/dist/agent/sdk-adapter.js +106 -0
  175. package/sidecar/dist/agent/sdk-adapter.js.map +1 -0
  176. package/sidecar/dist/agent/sdk-loader.d.ts +5 -0
  177. package/sidecar/dist/agent/sdk-loader.js +14 -0
  178. package/sidecar/dist/agent/sdk-loader.js.map +1 -0
  179. package/sidecar/dist/agent/system-prompt.d.ts +6 -0
  180. package/sidecar/dist/agent/system-prompt.js +29 -0
  181. package/sidecar/dist/agent/system-prompt.js.map +1 -0
  182. package/sidecar/dist/agent/tool-summary.d.ts +1 -0
  183. package/sidecar/dist/agent/tool-summary.js +46 -0
  184. package/sidecar/dist/agent/tool-summary.js.map +1 -0
  185. package/sidecar/dist/agent/typecheck.d.ts +36 -0
  186. package/sidecar/dist/agent/typecheck.js +104 -0
  187. package/sidecar/dist/agent/typecheck.js.map +1 -0
  188. package/sidecar/dist/builder/builder-client.d.ts +10 -0
  189. package/sidecar/dist/builder/builder-client.js +52 -0
  190. package/sidecar/dist/builder/builder-client.js.map +1 -0
  191. package/sidecar/dist/builder/capability.d.ts +4 -0
  192. package/sidecar/dist/builder/capability.js +11 -0
  193. package/sidecar/dist/builder/capability.js.map +1 -0
  194. package/sidecar/dist/constants/agent.d.ts +25 -0
  195. package/sidecar/dist/constants/agent.js +25 -0
  196. package/sidecar/dist/constants/agent.js.map +1 -0
  197. package/sidecar/dist/constants/attachments.d.ts +7 -0
  198. package/sidecar/dist/constants/attachments.js +12 -0
  199. package/sidecar/dist/constants/attachments.js.map +1 -0
  200. package/sidecar/dist/constants/builder.d.ts +5 -0
  201. package/sidecar/dist/constants/builder.js +32 -0
  202. package/sidecar/dist/constants/builder.js.map +1 -0
  203. package/sidecar/dist/constants/daemon.d.ts +7 -0
  204. package/sidecar/dist/constants/daemon.js +8 -0
  205. package/sidecar/dist/constants/daemon.js.map +1 -0
  206. package/sidecar/dist/constants/env.d.ts +3 -0
  207. package/sidecar/dist/constants/env.js +4 -0
  208. package/sidecar/dist/constants/env.js.map +1 -0
  209. package/sidecar/dist/constants/host-state.d.ts +1 -0
  210. package/sidecar/dist/constants/host-state.js +2 -0
  211. package/sidecar/dist/constants/host-state.js.map +1 -0
  212. package/sidecar/dist/constants/http.d.ts +20 -0
  213. package/sidecar/dist/constants/http.js +31 -0
  214. package/sidecar/dist/constants/http.js.map +1 -0
  215. package/sidecar/dist/constants/logs.d.ts +11 -0
  216. package/sidecar/dist/constants/logs.js +16 -0
  217. package/sidecar/dist/constants/logs.js.map +1 -0
  218. package/sidecar/dist/constants/mcp.d.ts +24 -0
  219. package/sidecar/dist/constants/mcp.js +38 -0
  220. package/sidecar/dist/constants/mcp.js.map +1 -0
  221. package/sidecar/dist/constants/native-binary.d.ts +4 -0
  222. package/sidecar/dist/constants/native-binary.js +5 -0
  223. package/sidecar/dist/constants/native-binary.js.map +1 -0
  224. package/sidecar/dist/constants/pages.d.ts +16 -0
  225. package/sidecar/dist/constants/pages.js +24 -0
  226. package/sidecar/dist/constants/pages.js.map +1 -0
  227. package/sidecar/dist/constants/paths.d.ts +3 -0
  228. package/sidecar/dist/constants/paths.js +7 -0
  229. package/sidecar/dist/constants/paths.js.map +1 -0
  230. package/sidecar/dist/constants/permissions.d.ts +15 -0
  231. package/sidecar/dist/constants/permissions.js +15 -0
  232. package/sidecar/dist/constants/permissions.js.map +1 -0
  233. package/sidecar/dist/constants/ports.d.ts +3 -0
  234. package/sidecar/dist/constants/ports.js +4 -0
  235. package/sidecar/dist/constants/ports.js.map +1 -0
  236. package/sidecar/dist/constants/project.d.ts +8 -0
  237. package/sidecar/dist/constants/project.js +12 -0
  238. package/sidecar/dist/constants/project.js.map +1 -0
  239. package/sidecar/dist/constants/questions.d.ts +4 -0
  240. package/sidecar/dist/constants/questions.js +5 -0
  241. package/sidecar/dist/constants/questions.js.map +1 -0
  242. package/sidecar/dist/constants/read-access.d.ts +1 -0
  243. package/sidecar/dist/constants/read-access.js +8 -0
  244. package/sidecar/dist/constants/read-access.js.map +1 -0
  245. package/sidecar/dist/constants/safety-net.d.ts +5 -0
  246. package/sidecar/dist/constants/safety-net.js +6 -0
  247. package/sidecar/dist/constants/safety-net.js.map +1 -0
  248. package/sidecar/dist/constants/settings.d.ts +9 -0
  249. package/sidecar/dist/constants/settings.js +29 -0
  250. package/sidecar/dist/constants/settings.js.map +1 -0
  251. package/sidecar/dist/constants/state.d.ts +7 -0
  252. package/sidecar/dist/constants/state.js +7 -0
  253. package/sidecar/dist/constants/state.js.map +1 -0
  254. package/sidecar/dist/constants/timing.d.ts +1 -0
  255. package/sidecar/dist/constants/timing.js +2 -0
  256. package/sidecar/dist/constants/timing.js.map +1 -0
  257. package/sidecar/dist/constants/tool-summary.d.ts +20 -0
  258. package/sidecar/dist/constants/tool-summary.js +21 -0
  259. package/sidecar/dist/constants/tool-summary.js.map +1 -0
  260. package/sidecar/dist/constants/typecheck.d.ts +16 -0
  261. package/sidecar/dist/constants/typecheck.js +23 -0
  262. package/sidecar/dist/constants/typecheck.js.map +1 -0
  263. package/sidecar/dist/constants/ws.d.ts +5 -0
  264. package/sidecar/dist/constants/ws.js +6 -0
  265. package/sidecar/dist/constants/ws.js.map +1 -0
  266. package/sidecar/dist/host/project-info.d.ts +6 -0
  267. package/sidecar/dist/host/project-info.js +51 -0
  268. package/sidecar/dist/host/project-info.js.map +1 -0
  269. package/sidecar/dist/index.d.ts +3 -0
  270. package/sidecar/dist/index.js +280 -0
  271. package/sidecar/dist/index.js.map +1 -0
  272. package/sidecar/dist/logs/logs-client.d.ts +11 -0
  273. package/sidecar/dist/logs/logs-client.js +52 -0
  274. package/sidecar/dist/logs/logs-client.js.map +1 -0
  275. package/sidecar/dist/logs/types.d.ts +12 -0
  276. package/sidecar/dist/logs/types.js +2 -0
  277. package/sidecar/dist/logs/types.js.map +1 -0
  278. package/sidecar/dist/mcp/server.d.ts +2 -0
  279. package/sidecar/dist/mcp/server.js +50 -0
  280. package/sidecar/dist/mcp/server.js.map +1 -0
  281. package/sidecar/dist/mcp/tools/ask-user.d.ts +41 -0
  282. package/sidecar/dist/mcp/tools/ask-user.js +29 -0
  283. package/sidecar/dist/mcp/tools/ask-user.js.map +1 -0
  284. package/sidecar/dist/mcp/tools/builder.d.ts +259 -0
  285. package/sidecar/dist/mcp/tools/builder.js +216 -0
  286. package/sidecar/dist/mcp/tools/builder.js.map +1 -0
  287. package/sidecar/dist/mcp/tools/find-pages-using.d.ts +15 -0
  288. package/sidecar/dist/mcp/tools/find-pages-using.js +108 -0
  289. package/sidecar/dist/mcp/tools/find-pages-using.js.map +1 -0
  290. package/sidecar/dist/mcp/tools/get-current-page.d.ts +4 -0
  291. package/sidecar/dist/mcp/tools/get-current-page.js +12 -0
  292. package/sidecar/dist/mcp/tools/get-current-page.js.map +1 -0
  293. package/sidecar/dist/mcp/tools/list-pages.d.ts +8 -0
  294. package/sidecar/dist/mcp/tools/list-pages.js +29 -0
  295. package/sidecar/dist/mcp/tools/list-pages.js.map +1 -0
  296. package/sidecar/dist/mcp/tools/navigate-to-page.d.ts +14 -0
  297. package/sidecar/dist/mcp/tools/navigate-to-page.js +66 -0
  298. package/sidecar/dist/mcp/tools/navigate-to-page.js.map +1 -0
  299. package/sidecar/dist/mcp/tools/query-logs.d.ts +11 -0
  300. package/sidecar/dist/mcp/tools/query-logs.js +32 -0
  301. package/sidecar/dist/mcp/tools/query-logs.js.map +1 -0
  302. package/sidecar/dist/mcp/tools/typecheck.d.ts +9 -0
  303. package/sidecar/dist/mcp/tools/typecheck.js +20 -0
  304. package/sidecar/dist/mcp/tools/typecheck.js.map +1 -0
  305. package/sidecar/dist/mcp/types.d.ts +27 -0
  306. package/sidecar/dist/mcp/types.js +2 -0
  307. package/sidecar/dist/mcp/types.js.map +1 -0
  308. package/sidecar/dist/metrics/aggregate.d.ts +11 -0
  309. package/sidecar/dist/metrics/aggregate.js +189 -0
  310. package/sidecar/dist/metrics/aggregate.js.map +1 -0
  311. package/sidecar/dist/metrics/types.d.ts +53 -0
  312. package/sidecar/dist/metrics/types.js +8 -0
  313. package/sidecar/dist/metrics/types.js.map +1 -0
  314. package/sidecar/dist/pages/imports-scanner.d.ts +9 -0
  315. package/sidecar/dist/pages/imports-scanner.js +143 -0
  316. package/sidecar/dist/pages/imports-scanner.js.map +1 -0
  317. package/sidecar/dist/pages/registry-client.d.ts +15 -0
  318. package/sidecar/dist/pages/registry-client.js +83 -0
  319. package/sidecar/dist/pages/registry-client.js.map +1 -0
  320. package/sidecar/dist/pages/route-match.d.ts +2 -0
  321. package/sidecar/dist/pages/route-match.js +10 -0
  322. package/sidecar/dist/pages/route-match.js.map +1 -0
  323. package/sidecar/dist/pages/types.d.ts +11 -0
  324. package/sidecar/dist/pages/types.js +2 -0
  325. package/sidecar/dist/pages/types.js.map +1 -0
  326. package/sidecar/dist/prompts/agent.d.ts +3 -0
  327. package/sidecar/dist/prompts/agent.js +40 -0
  328. package/sidecar/dist/prompts/agent.js.map +1 -0
  329. package/sidecar/dist/prompts/builder.d.ts +3 -0
  330. package/sidecar/dist/prompts/builder.js +4 -0
  331. package/sidecar/dist/prompts/builder.js.map +1 -0
  332. package/sidecar/dist/protocol/events.d.ts +1050 -0
  333. package/sidecar/dist/protocol/events.js +154 -0
  334. package/sidecar/dist/protocol/events.js.map +1 -0
  335. package/sidecar/dist/protocol/messages.d.ts +644 -0
  336. package/sidecar/dist/protocol/messages.js +139 -0
  337. package/sidecar/dist/protocol/messages.js.map +1 -0
  338. package/sidecar/dist/server/client-auth.d.ts +2 -0
  339. package/sidecar/dist/server/client-auth.js +25 -0
  340. package/sidecar/dist/server/client-auth.js.map +1 -0
  341. package/sidecar/dist/server/host-socket-registry.d.ts +9 -0
  342. package/sidecar/dist/server/host-socket-registry.js +42 -0
  343. package/sidecar/dist/server/host-socket-registry.js.map +1 -0
  344. package/sidecar/dist/server/http.d.ts +25 -0
  345. package/sidecar/dist/server/http.js +263 -0
  346. package/sidecar/dist/server/http.js.map +1 -0
  347. package/sidecar/dist/server/idle-shutdown.d.ts +10 -0
  348. package/sidecar/dist/server/idle-shutdown.js +35 -0
  349. package/sidecar/dist/server/idle-shutdown.js.map +1 -0
  350. package/sidecar/dist/server/iframe-socket-registry.d.ts +10 -0
  351. package/sidecar/dist/server/iframe-socket-registry.js +57 -0
  352. package/sidecar/dist/server/iframe-socket-registry.js.map +1 -0
  353. package/sidecar/dist/server/live-turns.d.ts +8 -0
  354. package/sidecar/dist/server/live-turns.js +16 -0
  355. package/sidecar/dist/server/live-turns.js.map +1 -0
  356. package/sidecar/dist/server/navigation-completer.d.ts +5 -0
  357. package/sidecar/dist/server/navigation-completer.js +49 -0
  358. package/sidecar/dist/server/navigation-completer.js.map +1 -0
  359. package/sidecar/dist/server/pending-queue.d.ts +11 -0
  360. package/sidecar/dist/server/pending-queue.js +54 -0
  361. package/sidecar/dist/server/pending-queue.js.map +1 -0
  362. package/sidecar/dist/server/raw-data.d.ts +2 -0
  363. package/sidecar/dist/server/raw-data.js +13 -0
  364. package/sidecar/dist/server/raw-data.js.map +1 -0
  365. package/sidecar/dist/server/routing.d.ts +64 -0
  366. package/sidecar/dist/server/routing.js +571 -0
  367. package/sidecar/dist/server/routing.js.map +1 -0
  368. package/sidecar/dist/server/safety-net.d.ts +16 -0
  369. package/sidecar/dist/server/safety-net.js +76 -0
  370. package/sidecar/dist/server/safety-net.js.map +1 -0
  371. package/sidecar/dist/server/ws.d.ts +33 -0
  372. package/sidecar/dist/server/ws.js +182 -0
  373. package/sidecar/dist/server/ws.js.map +1 -0
  374. package/sidecar/dist/skills/build-catalog.d.ts +15 -0
  375. package/sidecar/dist/skills/build-catalog.js +39 -0
  376. package/sidecar/dist/skills/build-catalog.js.map +1 -0
  377. package/sidecar/dist/skills/frontmatter.d.ts +9 -0
  378. package/sidecar/dist/skills/frontmatter.js +50 -0
  379. package/sidecar/dist/skills/frontmatter.js.map +1 -0
  380. package/sidecar/dist/skills/plugin-wrapper.d.ts +6 -0
  381. package/sidecar/dist/skills/plugin-wrapper.js +37 -0
  382. package/sidecar/dist/skills/plugin-wrapper.js.map +1 -0
  383. package/sidecar/dist/skills/resolve-sources.d.ts +3 -0
  384. package/sidecar/dist/skills/resolve-sources.js +14 -0
  385. package/sidecar/dist/skills/resolve-sources.js.map +1 -0
  386. package/sidecar/dist/skills/types.d.ts +4 -0
  387. package/sidecar/dist/skills/types.js +2 -0
  388. package/sidecar/dist/skills/types.js.map +1 -0
  389. package/sidecar/dist/state/conversations.d.ts +20 -0
  390. package/sidecar/dist/state/conversations.js +93 -0
  391. package/sidecar/dist/state/conversations.js.map +1 -0
  392. package/sidecar/dist/state/host-state.d.ts +10 -0
  393. package/sidecar/dist/state/host-state.js +14 -0
  394. package/sidecar/dist/state/host-state.js.map +1 -0
  395. package/sidecar/dist/state/lock.d.ts +12 -0
  396. package/sidecar/dist/state/lock.js +43 -0
  397. package/sidecar/dist/state/lock.js.map +1 -0
  398. package/sidecar/dist/state/settings-store.d.ts +12 -0
  399. package/sidecar/dist/state/settings-store.js +82 -0
  400. package/sidecar/dist/state/settings-store.js.map +1 -0
  401. package/sidecar/dist/state/settings-types.d.ts +12 -0
  402. package/sidecar/dist/state/settings-types.js +4 -0
  403. package/sidecar/dist/state/settings-types.js.map +1 -0
  404. package/sidecar/dist/state/sidecar-version.d.ts +1 -0
  405. package/sidecar/dist/state/sidecar-version.js +14 -0
  406. package/sidecar/dist/state/sidecar-version.js.map +1 -0
  407. package/sidecar/dist/state/store.d.ts +11 -0
  408. package/sidecar/dist/state/store.js +89 -0
  409. package/sidecar/dist/state/store.js.map +1 -0
  410. package/sidecar/dist/state/types.d.ts +36 -0
  411. package/sidecar/dist/state/types.js +10 -0
  412. package/sidecar/dist/state/types.js.map +1 -0
  413. package/sidecar/package.json +42 -0
  414. package/skills/dms-builder-page/SKILL.md +80 -0
  415. package/skills/dms-builder-safe/REFERENCE.md +111 -0
  416. package/skills/dms-builder-safe/SKILL.md +118 -0
@@ -0,0 +1,12 @@
1
+ export interface BufferedLog {
2
+ time: number;
3
+ channel: string;
4
+ levelId: number;
5
+ args: unknown[];
6
+ }
7
+ export interface LogQuery {
8
+ since?: number;
9
+ level?: number;
10
+ channel?: string;
11
+ limit?: number;
12
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/types/logs.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export interface PagesRegistryEntry {
2
+ id: string;
3
+ path: string;
4
+ filepath?: string;
5
+ moduleId: string;
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=pages-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages-registry.js","sourceRoot":"","sources":["../../src/types/pages-registry.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ root = true
2
+
3
+ [*]
4
+ indent_size = 2
5
+ indent_style = tab
6
+ end_of_line = lf
7
+ charset = utf-8
8
+ trim_trailing_whitespace = true
9
+ insert_final_newline = true
10
+
11
+ [*.md]
12
+ trim_trailing_whitespace = false
@@ -0,0 +1,94 @@
1
+ <script setup lang="ts">
2
+ import { onMounted, ref } from 'vue'
3
+
4
+ interface ActivityItem {
5
+ id: string
6
+ timestampMs: number
7
+ toolName: string
8
+ status: 'success' | 'error' | 'pending'
9
+ conversationId: string
10
+ conversationTitle: string
11
+ summary: string
12
+ }
13
+
14
+ const { $authFetch } = useAuthFetch()
15
+
16
+ const items = ref<ActivityItem[]>([])
17
+ const loading = ref(false)
18
+ const error = ref<string | null>(null)
19
+
20
+ async function load(): Promise<void> {
21
+ loading.value = true
22
+ error.value = null
23
+ try {
24
+ const activity = await $authFetch<{ items: ActivityItem[] }>(
25
+ '/ai/activity?limit=50',
26
+ )
27
+ items.value = activity.items ?? []
28
+ } catch (e) {
29
+ error.value = e instanceof Error ? e.message : String(e)
30
+ } finally {
31
+ loading.value = false
32
+ }
33
+ }
34
+
35
+ onMounted(load)
36
+
37
+ const STATUS_COLOR: Record<ActivityItem['status'], string> = {
38
+ success: 'success',
39
+ error: 'error',
40
+ pending: 'warning',
41
+ }
42
+
43
+ function formatTime(ms: number): string {
44
+ return new Date(ms).toLocaleString()
45
+ }
46
+ </script>
47
+
48
+ <template>
49
+ <div class="flex w-full flex-col gap-4 pb-10">
50
+ <div
51
+ v-if="error"
52
+ class="rounded border border-error bg-error/10 p-4 text-sm text-error"
53
+ >
54
+ {{ error }}
55
+ </div>
56
+
57
+ <div v-else class="rounded border border-default">
58
+ <div v-if="loading" class="p-4 text-sm text-dimmed">
59
+ Loading activity…
60
+ </div>
61
+ <div
62
+ v-else-if="items.length === 0"
63
+ class="p-6 text-center text-sm text-dimmed"
64
+ >
65
+ No AI actions recorded yet.
66
+ </div>
67
+ <ul v-else class="divide-y divide-default">
68
+ <li
69
+ v-for="item in items"
70
+ :key="item.id"
71
+ class="flex items-start gap-3 p-3"
72
+ >
73
+ <UIcon name="i-ph-wrench" class="mt-1 text-dimmed" />
74
+ <div class="min-w-0 flex-1">
75
+ <div class="flex items-center gap-2">
76
+ <span class="font-medium">{{ item.toolName }}</span>
77
+ <UBadge
78
+ :color="STATUS_COLOR[item.status]"
79
+ variant="subtle"
80
+ size="sm"
81
+ >
82
+ {{ item.status }}
83
+ </UBadge>
84
+ </div>
85
+ <p class="truncate text-sm text-muted">{{ item.summary }}</p>
86
+ <p class="text-xs text-dimmed">
87
+ {{ item.conversationTitle }} · {{ formatTime(item.timestampMs) }}
88
+ </p>
89
+ </div>
90
+ </li>
91
+ </ul>
92
+ </div>
93
+ </div>
94
+ </template>
@@ -0,0 +1,300 @@
1
+ <script setup lang="ts">
2
+ import { computed, onMounted, ref } from 'vue'
3
+
4
+ type Mode = 'normal' | 'acceptEdits' | 'plan' | 'auto'
5
+ type Thinking = 'off' | 'low' | 'medium' | 'high'
6
+ type GenerationMode = 'safe' | 'vibe'
7
+
8
+ interface AiSettings {
9
+ mode: Mode
10
+ thinking: Thinking
11
+ generationMode: GenerationMode
12
+ allowLocalSkills: boolean
13
+ builderAvailable: boolean
14
+ }
15
+
16
+ const { $authFetch } = useAuthFetch()
17
+
18
+ const settings = ref<AiSettings>({
19
+ mode: 'normal',
20
+ thinking: 'medium',
21
+ generationMode: 'safe',
22
+ allowLocalSkills: false,
23
+ builderAvailable: false,
24
+ })
25
+ const loading = ref(false)
26
+ const saving = ref(false)
27
+ const error = ref<string | null>(null)
28
+
29
+ const MODE_OPTIONS: Array<{ value: Mode; label: string; hint: string }> = [
30
+ { value: 'normal', label: 'Normal', hint: 'Ask before each tool action' },
31
+ {
32
+ value: 'acceptEdits',
33
+ label: 'Accept edits',
34
+ hint: 'Auto-accept file edits, ask for the rest',
35
+ },
36
+ { value: 'plan', label: 'Plan', hint: 'Plan only — propose without changes' },
37
+ { value: 'auto', label: 'Auto', hint: 'Auto-approve every tool action' },
38
+ ]
39
+
40
+ const THINKING_OPTIONS: Array<{ value: Thinking; label: string }> = [
41
+ { value: 'off', label: 'Off' },
42
+ { value: 'low', label: 'Low' },
43
+ { value: 'medium', label: 'Medium' },
44
+ { value: 'high', label: 'High' },
45
+ ]
46
+
47
+ async function load(): Promise<void> {
48
+ loading.value = true
49
+ error.value = null
50
+ try {
51
+ settings.value = await $authFetch<AiSettings>('/ai/settings')
52
+ } catch (e) {
53
+ error.value = e instanceof Error ? e.message : String(e)
54
+ } finally {
55
+ loading.value = false
56
+ }
57
+ }
58
+
59
+ async function persist(): Promise<void> {
60
+ saving.value = true
61
+ error.value = null
62
+ try {
63
+ settings.value = await $authFetch<AiSettings>('/ai/settings', {
64
+ method: 'PUT',
65
+ body: settings.value,
66
+ })
67
+ } catch (e) {
68
+ error.value = e instanceof Error ? e.message : String(e)
69
+ } finally {
70
+ saving.value = false
71
+ }
72
+ }
73
+
74
+ function onMode(event: Event): void {
75
+ settings.value.mode = (event.target as HTMLSelectElement).value as Mode
76
+ void persist()
77
+ }
78
+
79
+ function onThinking(event: Event): void {
80
+ settings.value.thinking = (event.target as HTMLSelectElement).value as Thinking
81
+ void persist()
82
+ }
83
+
84
+ function onAllowLocalSkills(event: Event): void {
85
+ settings.value.allowLocalSkills = (event.target as HTMLInputElement).checked
86
+ void persist()
87
+ }
88
+
89
+ const activeMode = computed<GenerationMode>(() =>
90
+ settings.value.generationMode === 'safe' && settings.value.builderAvailable
91
+ ? 'safe'
92
+ : 'vibe',
93
+ )
94
+
95
+ function onGenerationMode(mode: GenerationMode): void {
96
+ if (mode === 'safe' && !settings.value.builderAvailable) return
97
+ if (mode === settings.value.generationMode) return
98
+ settings.value.generationMode = mode
99
+ void persist()
100
+ }
101
+
102
+ onMounted(load)
103
+
104
+ const SELECT_CLASS =
105
+ 'w-full rounded-md border border-default bg-elevated px-3 py-2 text-sm'
106
+ </script>
107
+
108
+ <template>
109
+ <div class="flex w-full flex-col gap-5 pb-10">
110
+ <div
111
+ v-if="error"
112
+ class="rounded-lg border border-error bg-error/10 p-4 text-sm text-error"
113
+ >
114
+ {{ error }}
115
+ </div>
116
+
117
+ <!-- Row 1: Model (left) · Default behavior (right) -->
118
+ <div class="grid gap-5 lg:grid-cols-2">
119
+ <section class="rounded-xl border border-default bg-elevated/30">
120
+ <header class="border-b border-default px-5 py-4">
121
+ <h2 class="text-sm font-semibold text-highlighted">Model</h2>
122
+ </header>
123
+ <div class="flex flex-col gap-4 p-5">
124
+ <div>
125
+ <label class="mb-1.5 block text-xs font-medium text-toned">Provider</label>
126
+ <select :class="SELECT_CLASS" disabled>
127
+ <option>Anthropic (Claude)</option>
128
+ </select>
129
+ </div>
130
+ <div>
131
+ <label class="mb-1.5 block text-xs font-medium text-toned">Model</label>
132
+ <select :class="SELECT_CLASS" disabled>
133
+ <option>Claude Opus 4.x</option>
134
+ </select>
135
+ </div>
136
+ </div>
137
+ </section>
138
+
139
+ <section class="rounded-xl border border-default bg-elevated/30">
140
+ <header class="border-b border-default px-5 py-4">
141
+ <h2 class="text-sm font-semibold text-highlighted">Default behavior</h2>
142
+ </header>
143
+ <div class="flex flex-col gap-4 p-5">
144
+ <div>
145
+ <label class="mb-1.5 block text-xs font-medium text-toned">
146
+ Operating mode
147
+ </label>
148
+ <select
149
+ :class="SELECT_CLASS"
150
+ :value="settings.mode"
151
+ :disabled="loading || saving"
152
+ @change="onMode"
153
+ >
154
+ <option
155
+ v-for="option in MODE_OPTIONS"
156
+ :key="option.value"
157
+ :value="option.value"
158
+ >
159
+ {{ option.label }}
160
+ </option>
161
+ </select>
162
+ <p class="mt-1.5 text-xs text-dimmed">
163
+ {{ MODE_OPTIONS.find((o) => o.value === settings.mode)?.hint }}
164
+ </p>
165
+ </div>
166
+ <div>
167
+ <label class="mb-1.5 block text-xs font-medium text-toned">
168
+ Thinking
169
+ </label>
170
+ <select
171
+ :class="SELECT_CLASS"
172
+ :value="settings.thinking"
173
+ :disabled="loading || saving"
174
+ @change="onThinking"
175
+ >
176
+ <option
177
+ v-for="option in THINKING_OPTIONS"
178
+ :key="option.value"
179
+ :value="option.value"
180
+ >
181
+ {{ option.label }}
182
+ </option>
183
+ </select>
184
+ </div>
185
+ <div>
186
+ <label class="flex items-start gap-3">
187
+ <input
188
+ type="checkbox"
189
+ class="mt-0.5 size-4 rounded border-default"
190
+ :checked="settings.allowLocalSkills"
191
+ :disabled="loading || saving"
192
+ @change="onAllowLocalSkills"
193
+ >
194
+ <span>
195
+ <span class="block text-xs font-medium text-toned">
196
+ Use machine-local skills (~/.claude/skills)
197
+ </span>
198
+ <span class="mt-0.5 block text-xs text-dimmed">
199
+ Adds the skills from your machine
200
+ (<code>~/.claude/skills</code>) on top of the ones bundled by
201
+ modules. Machine-local, so not shared with other environments.
202
+ Off by default.
203
+ </span>
204
+ </span>
205
+ </label>
206
+ </div>
207
+ </div>
208
+ </section>
209
+ </div>
210
+
211
+ <!-- Row 2: Generation mode (full width) -->
212
+ <section class="rounded-xl border border-default bg-elevated/30">
213
+ <header class="border-b border-default px-5 py-4">
214
+ <h2 class="text-sm font-semibold text-highlighted">Generation mode</h2>
215
+ <p class="mt-0.5 text-xs text-dimmed">Default mode applied to new prompts</p>
216
+ </header>
217
+ <div class="grid gap-4 p-5 sm:grid-cols-2">
218
+ <button
219
+ type="button"
220
+ :disabled="!settings.builderAvailable || loading || saving"
221
+ class="rounded-lg border p-4 text-left transition"
222
+ :class="[
223
+ activeMode === 'safe'
224
+ ? 'border-primary bg-primary/10'
225
+ : 'border-default',
226
+ settings.builderAvailable
227
+ ? 'cursor-pointer hover:border-primary/60'
228
+ : 'cursor-not-allowed opacity-60',
229
+ ]"
230
+ @click="onGenerationMode('safe')"
231
+ >
232
+ <div class="mb-2 flex items-center gap-2">
233
+ <UIcon
234
+ name="i-ph-shield"
235
+ :class="activeMode === 'safe' ? 'text-primary' : 'text-muted'"
236
+ />
237
+ <b class="text-highlighted">Safe code</b>
238
+ <UBadge
239
+ v-if="activeMode === 'safe'"
240
+ class="ml-auto"
241
+ color="primary"
242
+ variant="subtle"
243
+ size="sm"
244
+ >
245
+ Active
246
+ </UBadge>
247
+ <UBadge
248
+ v-else-if="!settings.builderAvailable"
249
+ class="ml-auto"
250
+ color="neutral"
251
+ variant="subtle"
252
+ size="sm"
253
+ >
254
+ Unavailable
255
+ </UBadge>
256
+ </div>
257
+ <p class="text-xs leading-relaxed text-dimmed">
258
+ Acts only through the Builder (MCP) — emits accepted configurations,
259
+ never raw code.
260
+ <template v-if="!settings.builderAvailable">
261
+ Available once the Builder module is loaded.
262
+ </template>
263
+ </p>
264
+ </button>
265
+ <button
266
+ type="button"
267
+ :disabled="loading || saving"
268
+ class="rounded-lg border p-4 text-left transition"
269
+ :class="
270
+ activeMode === 'vibe'
271
+ ? 'border-primary bg-primary/10'
272
+ : 'cursor-pointer border-default hover:border-primary/60'
273
+ "
274
+ @click="onGenerationMode('vibe')"
275
+ >
276
+ <div class="mb-2 flex items-center gap-2">
277
+ <UIcon
278
+ name="i-ph-magic-wand"
279
+ :class="activeMode === 'vibe' ? 'text-primary' : 'text-muted'"
280
+ />
281
+ <b class="text-highlighted">Vibe code</b>
282
+ <UBadge
283
+ v-if="activeMode === 'vibe'"
284
+ class="ml-auto"
285
+ color="primary"
286
+ variant="subtle"
287
+ size="sm"
288
+ >
289
+ Active
290
+ </UBadge>
291
+ </div>
292
+ <p class="text-xs leading-relaxed text-dimmed">
293
+ Free to write custom code and bespoke pages beyond the Builder
294
+ blocks — full creative range.
295
+ </p>
296
+ </button>
297
+ </div>
298
+ </section>
299
+ </div>
300
+ </template>
@@ -0,0 +1,228 @@
1
+ <script setup lang="ts">
2
+ import { computed, onMounted, ref } from 'vue'
3
+
4
+ interface SkillItem {
5
+ id: string
6
+ name: string
7
+ description: string
8
+ icon?: string
9
+ category?: string
10
+ tags: string[]
11
+ provenance: string
12
+ body: string
13
+ }
14
+
15
+ const LOCAL_PROVENANCE = 'local'
16
+
17
+ const { $authFetch } = useAuthFetch()
18
+
19
+ const items = ref<SkillItem[]>([])
20
+ const loading = ref(false)
21
+ const error = ref<string | null>(null)
22
+ const search = ref('')
23
+ const selected = ref<SkillItem | null>(null)
24
+
25
+ async function load(): Promise<void> {
26
+ loading.value = true
27
+ error.value = null
28
+ try {
29
+ const res = await $authFetch<{ items: SkillItem[] }>('/ai/skills')
30
+ items.value = res.items
31
+ } catch (e) {
32
+ error.value = e instanceof Error ? e.message : String(e)
33
+ } finally {
34
+ loading.value = false
35
+ }
36
+ }
37
+
38
+ onMounted(load)
39
+
40
+ // Flat list, sorted by provenance then name so skills from the same package
41
+ // stay adjacent without a grouping layer.
42
+ const filtered = computed(() => {
43
+ const q = search.value.trim().toLowerCase()
44
+ return items.value
45
+ .filter((s) => {
46
+ if (q.length === 0) return true
47
+ const haystack = [s.name, s.description, s.category ?? '', ...s.tags]
48
+ .join(' ')
49
+ .toLowerCase()
50
+ return haystack.includes(q)
51
+ })
52
+ .sort(
53
+ (a, b) =>
54
+ a.provenance.localeCompare(b.provenance) ||
55
+ a.name.localeCompare(b.name),
56
+ )
57
+ })
58
+
59
+ function isLocal(provenance: string): boolean {
60
+ return provenance === LOCAL_PROVENANCE
61
+ }
62
+
63
+ function open(skill: SkillItem): void {
64
+ selected.value = skill
65
+ }
66
+
67
+ function close(): void {
68
+ selected.value = null
69
+ }
70
+
71
+ const CARD_CLASS =
72
+ 'flex flex-col gap-2 rounded-xl border border-default bg-elevated/30 p-4 text-left transition-colors hover:border-primary'
73
+ </script>
74
+
75
+ <template>
76
+ <div class="flex w-full flex-col gap-5 pb-10">
77
+ <div
78
+ v-if="error"
79
+ class="rounded-lg border border-error bg-error/10 p-4 text-sm text-error"
80
+ >
81
+ {{ error }}
82
+ </div>
83
+
84
+ <!-- Stat row -->
85
+ <div class="grid gap-4 sm:grid-cols-2">
86
+ <div class="rounded-xl border border-default bg-elevated/30 p-4">
87
+ <p class="text-xs font-medium text-toned">Total skills</p>
88
+ <p class="mt-1 text-2xl font-semibold text-highlighted">
89
+ {{ items.length }}
90
+ </p>
91
+ </div>
92
+ </div>
93
+
94
+ <!-- Controls -->
95
+ <div class="flex flex-wrap items-center gap-3">
96
+ <input
97
+ v-model="search"
98
+ type="search"
99
+ placeholder="Search skills…"
100
+ class="w-full max-w-xs rounded-md border border-default bg-elevated px-3 py-2 text-sm"
101
+ >
102
+ </div>
103
+
104
+ <p
105
+ v-if="!loading && items.length === 0"
106
+ class="rounded-lg border border-default bg-elevated/30 p-6 text-center text-sm text-dimmed"
107
+ >
108
+ No skills are loaded. Module-contributed skills appear here, plus
109
+ machine-local skills when enabled in Settings.
110
+ </p>
111
+
112
+ <!-- Skill cards -->
113
+ <div class="grid gap-3 sm:grid-cols-2 lg:grid-cols-3">
114
+ <button
115
+ v-for="skill in filtered"
116
+ :key="skill.id"
117
+ type="button"
118
+ :class="CARD_CLASS"
119
+ @click="open(skill)"
120
+ >
121
+ <div class="flex items-start gap-2">
122
+ <UIcon
123
+ :name="skill.icon || 'i-ph-sparkle'"
124
+ class="mt-0.5 shrink-0 text-primary"
125
+ />
126
+ <div class="min-w-0">
127
+ <p class="truncate text-sm font-semibold text-highlighted">
128
+ {{ skill.name }}
129
+ </p>
130
+ <p class="truncate text-xs text-dimmed">
131
+ {{ skill.provenance }}
132
+ </p>
133
+ </div>
134
+ <UBadge
135
+ v-if="isLocal(skill.provenance)"
136
+ class="ml-auto shrink-0"
137
+ color="warning"
138
+ variant="subtle"
139
+ size="sm"
140
+ >
141
+ Local
142
+ </UBadge>
143
+ </div>
144
+ <p class="line-clamp-3 text-xs leading-relaxed text-toned">
145
+ {{ skill.description }}
146
+ </p>
147
+ <div v-if="skill.tags.length" class="mt-auto flex flex-wrap gap-1">
148
+ <UBadge
149
+ v-for="tag in skill.tags"
150
+ :key="tag"
151
+ color="neutral"
152
+ variant="soft"
153
+ size="sm"
154
+ >
155
+ {{ tag }}
156
+ </UBadge>
157
+ </div>
158
+ </button>
159
+ </div>
160
+
161
+ <!-- Detail drawer -->
162
+ <div
163
+ v-if="selected"
164
+ class="fixed inset-0 z-50 flex justify-end bg-black/40"
165
+ @click.self="close"
166
+ >
167
+ <div
168
+ class="flex h-full w-full max-w-lg flex-col overflow-y-auto border-l border-default bg-default p-6 shadow-xl"
169
+ >
170
+ <div class="mb-4 flex items-start gap-3">
171
+ <UIcon
172
+ :name="selected.icon || 'i-ph-sparkle'"
173
+ class="mt-1 shrink-0 text-xl text-primary"
174
+ />
175
+ <div class="min-w-0 flex-1">
176
+ <h2 class="text-lg font-semibold text-highlighted">
177
+ {{ selected.name }}
178
+ </h2>
179
+ <p class="text-xs text-dimmed">{{ selected.id }}</p>
180
+ </div>
181
+ <UButton
182
+ icon="i-ph-x"
183
+ color="neutral"
184
+ variant="ghost"
185
+ size="sm"
186
+ square
187
+ @click="close"
188
+ />
189
+ </div>
190
+
191
+ <div class="mb-4 flex flex-wrap items-center gap-2">
192
+ <UBadge color="primary" variant="subtle" size="sm">
193
+ {{ selected.provenance }}
194
+ </UBadge>
195
+ <UBadge
196
+ v-if="isLocal(selected.provenance)"
197
+ color="warning"
198
+ variant="subtle"
199
+ size="sm"
200
+ >
201
+ Local — this machine
202
+ </UBadge>
203
+ <UBadge
204
+ v-for="tag in selected.tags"
205
+ :key="tag"
206
+ color="neutral"
207
+ variant="soft"
208
+ size="sm"
209
+ >
210
+ {{ tag }}
211
+ </UBadge>
212
+ </div>
213
+
214
+ <p class="mb-4 text-sm leading-relaxed text-toned">
215
+ {{ selected.description }}
216
+ </p>
217
+
218
+ <h3 class="mb-2 text-xs font-semibold uppercase tracking-wide text-dimmed">
219
+ Instructions (SKILL.md)
220
+ </h3>
221
+ <pre
222
+ class="whitespace-pre-wrap rounded-lg border border-default bg-elevated/40 p-4 text-xs leading-relaxed text-toned"
223
+ >{{ selected.body }}</pre
224
+ >
225
+ </div>
226
+ </div>
227
+ </div>
228
+ </template>