@antelopejs/dms-ai 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/README.md +17 -7
  2. package/dist/builder/presence.js.map +1 -1
  3. package/dist/channels/bridge.js +4 -2
  4. package/dist/channels/bridge.js.map +1 -1
  5. package/dist/channels/sse-stream.d.ts +1 -1
  6. package/dist/config.d.ts +6 -1
  7. package/dist/config.js +9 -21
  8. package/dist/config.js.map +1 -1
  9. package/dist/constants/channels.d.ts +5 -1
  10. package/dist/constants/channels.js.map +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/lifecycle/build-id.js +1 -1
  14. package/dist/lifecycle/build-id.js.map +1 -1
  15. package/dist/lifecycle/module-roots.js +12 -14
  16. package/dist/lifecycle/module-roots.js.map +1 -1
  17. package/dist/lifecycle/sidecar-owner.js.map +1 -1
  18. package/dist/lifecycle/skill-sources.js +45 -32
  19. package/dist/lifecycle/skill-sources.js.map +1 -1
  20. package/dist/lifecycle/spawn-sidecar.js +11 -6
  21. package/dist/lifecycle/spawn-sidecar.js.map +1 -1
  22. package/dist/logging/log-buffer.js +6 -2
  23. package/dist/logging/log-buffer.js.map +1 -1
  24. package/dist/pages/activity/columns.d.ts +66 -2
  25. package/dist/pages/activity/columns.js.map +1 -1
  26. package/dist/pages/activity/page.js.map +1 -1
  27. package/dist/pages/index.js.map +1 -1
  28. package/dist/pages/overview/page.js.map +1 -1
  29. package/dist/pages/overview/recent-changes.js.map +1 -1
  30. package/dist/pages/settings/availability.js.map +1 -1
  31. package/dist/pages/skills/page.js.map +1 -1
  32. package/dist/pages-registry.js +9 -10
  33. package/dist/pages-registry.js.map +1 -1
  34. package/dist/routes/activity.d.ts +5 -4
  35. package/dist/routes/activity.js.map +1 -1
  36. package/dist/routes/builder.d.ts +7 -1
  37. package/dist/routes/builder.js.map +1 -1
  38. package/dist/routes/changes.d.ts +11 -8
  39. package/dist/routes/changes.js.map +1 -1
  40. package/dist/routes/codex-account.d.ts +7 -2
  41. package/dist/routes/codex-account.js +2 -2
  42. package/dist/routes/codex-account.js.map +1 -1
  43. package/dist/routes/database.d.ts +21 -4
  44. package/dist/routes/database.js.map +1 -1
  45. package/dist/routes/metric-shapes.js +8 -5
  46. package/dist/routes/metric-shapes.js.map +1 -1
  47. package/dist/routes/metrics.d.ts +4 -2
  48. package/dist/routes/metrics.js +2 -2
  49. package/dist/routes/metrics.js.map +1 -1
  50. package/dist/routes/pages-registry.js.map +1 -1
  51. package/dist/routes/settings.d.ts +3 -2
  52. package/dist/routes/settings.js.map +1 -1
  53. package/dist/routes/sidecar-info.js.map +1 -1
  54. package/dist/routes/sidecar-results.d.ts +4 -4
  55. package/dist/routes/sidecar-results.js +10 -10
  56. package/dist/routes/sidecar-results.js.map +1 -1
  57. package/dist/routes/skills.d.ts +2 -1
  58. package/dist/routes/skills.js +6 -4
  59. package/dist/routes/skills.js.map +1 -1
  60. package/dist/routes/status-shapes.js +12 -12
  61. package/dist/routes/status-shapes.js.map +1 -1
  62. package/dist/routes/status.js.map +1 -1
  63. package/dist/routes/undo-confirm.js.map +1 -1
  64. package/dist/sidecar/http-client.js +3 -1
  65. package/dist/sidecar/http-client.js.map +1 -1
  66. package/dist/sidecar/index.d.ts +1 -0
  67. package/dist/sidecar/index.js +1 -0
  68. package/dist/sidecar/index.js.map +1 -1
  69. package/dist/sidecar/json-body.d.ts +4 -0
  70. package/dist/sidecar/json-body.js +33 -0
  71. package/dist/sidecar/json-body.js.map +1 -0
  72. package/dist/sidecar/settings-values.d.ts +5 -2
  73. package/dist/sidecar/settings-values.js.map +1 -1
  74. package/dist/vocabulary/tools.js.map +1 -1
  75. package/frontend-vue/app/chat/components/ChatView.vue +33 -133
  76. package/frontend-vue/app/chat/components/ProviderNotice.vue +77 -0
  77. package/frontend-vue/app/chat/components/UndoConflictModal.vue +98 -0
  78. package/frontend-vue/app/chat/composables/useChangeSetActions.ts +1 -1
  79. package/frontend-vue/app/components/SkillDetail.vue +1 -1
  80. package/frontend-vue/app/plugins/ai.client.ts +10 -2
  81. package/frontend-vue/app/runtime/assistant-actions.ts +41 -0
  82. package/frontend-vue/app/runtime/assistant-session.ts +8 -2
  83. package/frontend-vue/app/runtime/panel-intents.ts +3 -1
  84. package/frontend-vue/app/views/ChangeSetPanel.vue +1 -1
  85. package/frontend-vue/app/views/composables/useAiData.ts +10 -18
  86. package/frontend-vue/app/views/composables/useChangeSetActions.ts +5 -15
  87. package/frontend-vue/app/views/constants.ts +1 -1
  88. package/frontend-vue/app/views/types.ts +1 -1
  89. package/frontend-vue/build/backend-boundary.ts +122 -0
  90. package/frontend-vue/dms.frontend.build.ts +6 -0
  91. package/frontend-vue/package.json +2 -1
  92. package/frontend-vue/pnpm-lock.yaml +3 -0
  93. package/frontend-vue/tests/assistant-actions.test.ts +72 -0
  94. package/frontend-vue/tests/backend-boundary.test.ts +130 -0
  95. package/frontend-vue/tests/panel-approvals.test.ts +190 -0
  96. package/frontend-vue/tests/panel-questions.test.ts +169 -0
  97. package/frontend-vue/tests/panel-states.test.ts +1 -556
  98. package/frontend-vue/tests/panel-tools.test.ts +165 -0
  99. package/frontend-vue/tests/sidecar-guest.test.ts +39 -71
  100. package/frontend-vue/tests/support/api-error-presenter.ts +28 -0
  101. package/frontend-vue/tests/support/panel-fixtures.ts +110 -0
  102. package/frontend-vue/tests/support/panel-harness.ts +2 -2
  103. package/frontend-vue/tests/views/api-data-reads.test.ts +2 -0
  104. package/frontend-vue/tests/views/api-error-presentation.test.ts +89 -0
  105. package/frontend-vue/vitest.config.ts +2 -1
  106. package/package.json +21 -9
  107. package/sidecar/dist/agent/attachment-files.js.map +1 -1
  108. package/sidecar/dist/agent/call-ledger.d.ts +3 -2
  109. package/sidecar/dist/agent/call-ledger.js +1 -1
  110. package/sidecar/dist/agent/call-ledger.js.map +1 -1
  111. package/sidecar/dist/agent/command-analysis.js +13 -14
  112. package/sidecar/dist/agent/command-analysis.js.map +1 -1
  113. package/sidecar/dist/agent/conversation-modes.js.map +1 -1
  114. package/sidecar/dist/agent/edit-targets.d.ts +5 -1
  115. package/sidecar/dist/agent/edit-targets.js +8 -6
  116. package/sidecar/dist/agent/edit-targets.js.map +1 -1
  117. package/sidecar/dist/agent/edit-tracker.d.ts +2 -1
  118. package/sidecar/dist/agent/edit-tracker.js +3 -4
  119. package/sidecar/dist/agent/edit-tracker.js.map +1 -1
  120. package/sidecar/dist/agent/effective-mode.js.map +1 -1
  121. package/sidecar/dist/agent/line-diff.js +10 -8
  122. package/sidecar/dist/agent/line-diff.js.map +1 -1
  123. package/sidecar/dist/agent/permission-bus.js +2 -1
  124. package/sidecar/dist/agent/permission-bus.js.map +1 -1
  125. package/sidecar/dist/agent/permission-preview.d.ts +1 -1
  126. package/sidecar/dist/agent/permission-preview.js +54 -37
  127. package/sidecar/dist/agent/permission-preview.js.map +1 -1
  128. package/sidecar/dist/agent/permission-rules.js +4 -6
  129. package/sidecar/dist/agent/permission-rules.js.map +1 -1
  130. package/sidecar/dist/agent/provider.d.ts +2 -1
  131. package/sidecar/dist/agent/question-bus.js.map +1 -1
  132. package/sidecar/dist/agent/read-access.d.ts +2 -1
  133. package/sidecar/dist/agent/read-access.js +4 -7
  134. package/sidecar/dist/agent/read-access.js.map +1 -1
  135. package/sidecar/dist/agent/runner.js.map +1 -1
  136. package/sidecar/dist/agent/session.js +2 -6
  137. package/sidecar/dist/agent/session.js.map +1 -1
  138. package/sidecar/dist/agent/switching-runner.js.map +1 -1
  139. package/sidecar/dist/agent/system-prompt.js.map +1 -1
  140. package/sidecar/dist/agent/tool-summary.d.ts +2 -1
  141. package/sidecar/dist/agent/tool-summary.js +26 -13
  142. package/sidecar/dist/agent/tool-summary.js.map +1 -1
  143. package/sidecar/dist/agent/typecheck.d.ts +1 -4
  144. package/sidecar/dist/agent/typecheck.js +3 -2
  145. package/sidecar/dist/agent/typecheck.js.map +1 -1
  146. package/sidecar/dist/audit/activity-query.js +4 -8
  147. package/sidecar/dist/audit/activity-query.js.map +1 -1
  148. package/sidecar/dist/audit/activity-target.d.ts +4 -2
  149. package/sidecar/dist/audit/activity-target.js +10 -9
  150. package/sidecar/dist/audit/activity-target.js.map +1 -1
  151. package/sidecar/dist/audit/activity.js +4 -3
  152. package/sidecar/dist/audit/activity.js.map +1 -1
  153. package/sidecar/dist/audit/call-audit.js.map +1 -1
  154. package/sidecar/dist/builder/builder-client.d.ts +2 -1
  155. package/sidecar/dist/builder/builder-client.js +6 -8
  156. package/sidecar/dist/builder/builder-client.js.map +1 -1
  157. package/sidecar/dist/builder/capability.js.map +1 -1
  158. package/sidecar/dist/checkpoints/checkpoints.js.map +1 -1
  159. package/sidecar/dist/checkpoints/shadow-git.js +6 -2
  160. package/sidecar/dist/checkpoints/shadow-git.js.map +1 -1
  161. package/sidecar/dist/constants/agent.js.map +1 -1
  162. package/sidecar/dist/constants/attachments.js.map +1 -1
  163. package/sidecar/dist/constants/builder.js.map +1 -1
  164. package/sidecar/dist/constants/chatgpt.js.map +1 -1
  165. package/sidecar/dist/constants/checkpoints.d.ts +1 -1
  166. package/sidecar/dist/constants/checkpoints.js +6 -6
  167. package/sidecar/dist/constants/checkpoints.js.map +1 -1
  168. package/sidecar/dist/constants/claude.d.ts +3 -4
  169. package/sidecar/dist/constants/claude.js +16 -16
  170. package/sidecar/dist/constants/claude.js.map +1 -1
  171. package/sidecar/dist/constants/cli.js.map +1 -1
  172. package/sidecar/dist/constants/codex.d.ts +4 -5
  173. package/sidecar/dist/constants/codex.js +25 -25
  174. package/sidecar/dist/constants/codex.js.map +1 -1
  175. package/sidecar/dist/constants/database.js.map +1 -1
  176. package/sidecar/dist/constants/mcp.js.map +1 -1
  177. package/sidecar/dist/constants/paths.js.map +1 -1
  178. package/sidecar/dist/constants/project.d.ts +1 -1
  179. package/sidecar/dist/constants/project.js.map +1 -1
  180. package/sidecar/dist/constants/providers.js.map +1 -1
  181. package/sidecar/dist/constants/questions.js.map +1 -1
  182. package/sidecar/dist/constants/read-access.d.ts +1 -1
  183. package/sidecar/dist/constants/read-access.js +7 -7
  184. package/sidecar/dist/constants/read-access.js.map +1 -1
  185. package/sidecar/dist/constants/timing.js.map +1 -1
  186. package/sidecar/dist/database/database-client.d.ts +3 -2
  187. package/sidecar/dist/database/database-client.js +13 -9
  188. package/sidecar/dist/database/database-client.js.map +1 -1
  189. package/sidecar/dist/host/project-info.js +13 -7
  190. package/sidecar/dist/host/project-info.js.map +1 -1
  191. package/sidecar/dist/index.d.ts +1 -1
  192. package/sidecar/dist/index.js +60 -34
  193. package/sidecar/dist/index.js.map +1 -1
  194. package/sidecar/dist/logs/logs-client.js +13 -2
  195. package/sidecar/dist/logs/logs-client.js.map +1 -1
  196. package/sidecar/dist/logs/types.d.ts +2 -1
  197. package/sidecar/dist/mcp/define-tool.d.ts +9 -8
  198. package/sidecar/dist/mcp/define-tool.js.map +1 -1
  199. package/sidecar/dist/mcp/http-binding.js.map +1 -1
  200. package/sidecar/dist/mcp/tools/ask-user.js.map +1 -1
  201. package/sidecar/dist/mcp/tools/builder-catalog.d.ts +6 -1
  202. package/sidecar/dist/mcp/tools/builder-catalog.js +32 -24
  203. package/sidecar/dist/mcp/tools/builder-catalog.js.map +1 -1
  204. package/sidecar/dist/mcp/tools/builder-expr.d.ts +5 -0
  205. package/sidecar/dist/mcp/tools/builder-expr.js +25 -0
  206. package/sidecar/dist/mcp/tools/builder-expr.js.map +1 -0
  207. package/sidecar/dist/mcp/tools/builder-gate.js +2 -2
  208. package/sidecar/dist/mcp/tools/builder-gate.js.map +1 -1
  209. package/sidecar/dist/mcp/tools/builder-project.d.ts +2 -1
  210. package/sidecar/dist/mcp/tools/builder-project.js +60 -43
  211. package/sidecar/dist/mcp/tools/builder-project.js.map +1 -1
  212. package/sidecar/dist/mcp/tools/builder-queries.d.ts +34 -0
  213. package/sidecar/dist/mcp/tools/builder-queries.js +56 -0
  214. package/sidecar/dist/mcp/tools/builder-queries.js.map +1 -0
  215. package/sidecar/dist/mcp/tools/builder.d.ts +31 -19
  216. package/sidecar/dist/mcp/tools/builder.js +5 -72
  217. package/sidecar/dist/mcp/tools/builder.js.map +1 -1
  218. package/sidecar/dist/mcp/tools/database.js +5 -9
  219. package/sidecar/dist/mcp/tools/database.js.map +1 -1
  220. package/sidecar/dist/mcp/tools/find-pages-using.js.map +1 -1
  221. package/sidecar/dist/mcp/tools/get-current-page.js.map +1 -1
  222. package/sidecar/dist/mcp/tools/list-pages.js.map +1 -1
  223. package/sidecar/dist/mcp/tools/navigate-to-page.js +6 -6
  224. package/sidecar/dist/mcp/tools/navigate-to-page.js.map +1 -1
  225. package/sidecar/dist/mcp/tools/preview-blocks.js +15 -11
  226. package/sidecar/dist/mcp/tools/preview-blocks.js.map +1 -1
  227. package/sidecar/dist/mcp/tools/query-logs.js.map +1 -1
  228. package/sidecar/dist/mcp/tools/typecheck.js.map +1 -1
  229. package/sidecar/dist/mcp/types.d.ts +2 -1
  230. package/sidecar/dist/metrics/aggregate.js.map +1 -1
  231. package/sidecar/dist/metrics/types.js.map +1 -1
  232. package/sidecar/dist/pages/registry-client.js +14 -5
  233. package/sidecar/dist/pages/registry-client.js.map +1 -1
  234. package/sidecar/dist/pages/route-match.js.map +1 -1
  235. package/sidecar/dist/protocol/events.d.ts +7 -7
  236. package/sidecar/dist/protocol/events.js.map +1 -1
  237. package/sidecar/dist/protocol/json.d.ts +9 -0
  238. package/sidecar/dist/protocol/json.js +32 -0
  239. package/sidecar/dist/protocol/json.js.map +1 -0
  240. package/sidecar/dist/protocol/messages.d.ts +4 -4
  241. package/sidecar/dist/protocol/messages.js +3 -3
  242. package/sidecar/dist/protocol/messages.js.map +1 -1
  243. package/sidecar/dist/providers/claude/activity.d.ts +4 -2
  244. package/sidecar/dist/providers/claude/activity.js +29 -38
  245. package/sidecar/dist/providers/claude/activity.js.map +1 -1
  246. package/sidecar/dist/providers/claude/adapter.js +62 -91
  247. package/sidecar/dist/providers/claude/adapter.js.map +1 -1
  248. package/sidecar/dist/providers/claude/attachments.js +4 -4
  249. package/sidecar/dist/providers/claude/attachments.js.map +1 -1
  250. package/sidecar/dist/providers/claude/config.d.ts +4 -1
  251. package/sidecar/dist/providers/claude/config.js.map +1 -1
  252. package/sidecar/dist/providers/claude/module.js.map +1 -1
  253. package/sidecar/dist/providers/claude/provider.d.ts +4 -2
  254. package/sidecar/dist/providers/claude/provider.js.map +1 -1
  255. package/sidecar/dist/providers/claude/resolve-binary.js +6 -4
  256. package/sidecar/dist/providers/claude/resolve-binary.js.map +1 -1
  257. package/sidecar/dist/providers/claude/safe-mode.js +14 -3
  258. package/sidecar/dist/providers/claude/safe-mode.js.map +1 -1
  259. package/sidecar/dist/providers/codex/adapter.js +124 -46
  260. package/sidecar/dist/providers/codex/adapter.js.map +1 -1
  261. package/sidecar/dist/providers/codex/attachments.js +1 -1
  262. package/sidecar/dist/providers/codex/attachments.js.map +1 -1
  263. package/sidecar/dist/providers/codex/chatgpt/credentials.js.map +1 -1
  264. package/sidecar/dist/providers/codex/chatgpt/http.js +8 -5
  265. package/sidecar/dist/providers/codex/chatgpt/http.js.map +1 -1
  266. package/sidecar/dist/providers/codex/chatgpt/lock.js +3 -3
  267. package/sidecar/dist/providers/codex/chatgpt/lock.js.map +1 -1
  268. package/sidecar/dist/providers/codex/chatgpt/login.js.map +1 -1
  269. package/sidecar/dist/providers/codex/chatgpt/oauth.js +51 -8
  270. package/sidecar/dist/providers/codex/chatgpt/oauth.js.map +1 -1
  271. package/sidecar/dist/providers/codex/chatgpt/store.js +23 -23
  272. package/sidecar/dist/providers/codex/chatgpt/store.js.map +1 -1
  273. package/sidecar/dist/providers/codex/client.d.ts +4 -3
  274. package/sidecar/dist/providers/codex/client.js +10 -3
  275. package/sidecar/dist/providers/codex/client.js.map +1 -1
  276. package/sidecar/dist/providers/codex/config.js.map +1 -1
  277. package/sidecar/dist/providers/codex/module.js.map +1 -1
  278. package/sidecar/dist/providers/codex/permissions.d.ts +2 -2
  279. package/sidecar/dist/providers/codex/permissions.js +20 -6
  280. package/sidecar/dist/providers/codex/permissions.js.map +1 -1
  281. package/sidecar/dist/providers/codex/process.d.ts +3 -1
  282. package/sidecar/dist/providers/codex/process.js +35 -36
  283. package/sidecar/dist/providers/codex/process.js.map +1 -1
  284. package/sidecar/dist/providers/codex/provider.d.ts +2 -0
  285. package/sidecar/dist/providers/codex/provider.js +23 -7
  286. package/sidecar/dist/providers/codex/provider.js.map +1 -1
  287. package/sidecar/dist/providers/codex/resolve-binary.js +2 -2
  288. package/sidecar/dist/providers/codex/resolve-binary.js.map +1 -1
  289. package/sidecar/dist/providers/codex/stop.d.ts +6 -1
  290. package/sidecar/dist/providers/codex/stop.js +29 -22
  291. package/sidecar/dist/providers/codex/stop.js.map +1 -1
  292. package/sidecar/dist/providers/registry.js +4 -5
  293. package/sidecar/dist/providers/registry.js.map +1 -1
  294. package/sidecar/dist/server/chat-events.d.ts +16 -3
  295. package/sidecar/dist/server/chat-events.js.map +1 -1
  296. package/sidecar/dist/server/chat-socket-registry.d.ts +6 -6
  297. package/sidecar/dist/server/chat-socket-registry.js.map +1 -1
  298. package/sidecar/dist/server/conversation-runs.d.ts +1 -1
  299. package/sidecar/dist/server/conversation-runs.js +4 -5
  300. package/sidecar/dist/server/conversation-runs.js.map +1 -1
  301. package/sidecar/dist/server/host-socket-registry.d.ts +4 -3
  302. package/sidecar/dist/server/host-socket-registry.js.map +1 -1
  303. package/sidecar/dist/server/http-io.d.ts +3 -2
  304. package/sidecar/dist/server/http-io.js +2 -3
  305. package/sidecar/dist/server/http-io.js.map +1 -1
  306. package/sidecar/dist/server/http-params.js.map +1 -1
  307. package/sidecar/dist/server/http-routes.d.ts +9 -2
  308. package/sidecar/dist/server/http-routes.js +19 -15
  309. package/sidecar/dist/server/http-routes.js.map +1 -1
  310. package/sidecar/dist/server/http.js +19 -10
  311. package/sidecar/dist/server/http.js.map +1 -1
  312. package/sidecar/dist/server/pending-queue.js +4 -1
  313. package/sidecar/dist/server/pending-queue.js.map +1 -1
  314. package/sidecar/dist/server/permission-events.d.ts +8 -4
  315. package/sidecar/dist/server/permission-events.js.map +1 -1
  316. package/sidecar/dist/server/raw-data.js +2 -1
  317. package/sidecar/dist/server/raw-data.js.map +1 -1
  318. package/sidecar/dist/server/routing.js +5 -2
  319. package/sidecar/dist/server/routing.js.map +1 -1
  320. package/sidecar/dist/server/safety-net.js +20 -9
  321. package/sidecar/dist/server/safety-net.js.map +1 -1
  322. package/sidecar/dist/server/tool-calls.d.ts +13 -4
  323. package/sidecar/dist/server/tool-calls.js +7 -5
  324. package/sidecar/dist/server/tool-calls.js.map +1 -1
  325. package/sidecar/dist/server/turns.d.ts +16 -2
  326. package/sidecar/dist/server/turns.js +7 -4
  327. package/sidecar/dist/server/turns.js.map +1 -1
  328. package/sidecar/dist/server/ws.js +2 -6
  329. package/sidecar/dist/server/ws.js.map +1 -1
  330. package/sidecar/dist/skills/build-catalog.js.map +1 -1
  331. package/sidecar/dist/skills/frontmatter.js.map +1 -1
  332. package/sidecar/dist/skills/plugin-wrapper.js.map +1 -1
  333. package/sidecar/dist/skills/resolve-sources.js.map +1 -1
  334. package/sidecar/dist/skills/skill-usage.js +18 -12
  335. package/sidecar/dist/skills/skill-usage.js.map +1 -1
  336. package/sidecar/dist/state/change-sets.js +4 -1
  337. package/sidecar/dist/state/change-sets.js.map +1 -1
  338. package/sidecar/dist/state/conversations.js.map +1 -1
  339. package/sidecar/dist/state/lock.js +6 -2
  340. package/sidecar/dist/state/lock.js.map +1 -1
  341. package/sidecar/dist/state/settings-store.d.ts +31 -1
  342. package/sidecar/dist/state/settings-store.js +23 -24
  343. package/sidecar/dist/state/settings-store.js.map +1 -1
  344. package/sidecar/dist/state/settings-types.js.map +1 -1
  345. package/sidecar/dist/state/sidecar-version.js +3 -1
  346. package/sidecar/dist/state/sidecar-version.js.map +1 -1
  347. package/sidecar/dist/state/store.js +9 -3
  348. package/sidecar/dist/state/store.js.map +1 -1
  349. package/sidecar/dist/state/types.js.map +1 -1
  350. package/sidecar/package.json +1 -7
  351. package/skills/dms-ai/SKILL.md +1 -1
  352. package/skills/dms-ai/cases.json +47 -0
  353. package/skills/dms-ai-code-mode/cases.json +38 -0
  354. package/skills/dms-builder-safe/cases.json +67 -0
  355. package/skills/dms-external-database/REFERENCE.md +34 -9
  356. package/skills/dms-external-database/SKILL.md +24 -11
  357. package/skills/dms-external-database/cases.json +47 -0
  358. package/frontend-vue/tests/i18n-panel.test.ts +0 -118
  359. package/frontend-vue/tests/i18n-views.test.ts +0 -63
  360. package/frontend-vue/tests/panel-header-height.test.ts +0 -40
@@ -12,115 +12,7 @@ import {
12
12
  sentOfType,
13
13
  unmountPanel,
14
14
  } from "./support/panel-harness";
15
-
16
- const DIFF_REQUEST = {
17
- type: "permission_request",
18
- requestId: "r1",
19
- callId: "c1",
20
- toolName: "Edit",
21
- args: { file_path: "/repo/crm/customers/customer.form.ts" },
22
- summary: "Edit customer.form.ts",
23
- kind: "edit",
24
- alwaysAsk: false,
25
- preview: {
26
- type: "diff",
27
- path: "/repo/crm/customers/customer.form.ts",
28
- relativePath: "crm/customers/customer.form.ts",
29
- isNewFile: false,
30
- added: 1,
31
- removed: 1,
32
- hunks: [
33
- {
34
- oldStart: 42,
35
- newStart: 42,
36
- lines: [
37
- { kind: "remove", text: 'label: "VAT",' },
38
- { kind: "add", text: 'label: "VAT number",' },
39
- ],
40
- },
41
- ],
42
- },
43
- ruleOptions: [
44
- { kind: "file", value: "crm/customers/customer.form.ts" },
45
- { kind: "directory", value: "crm/customers/" },
46
- ],
47
- createdAtMs: Date.now(),
48
- expiresAtMs: Date.now() + 252_000,
49
- };
50
-
51
- const COMMAND_REQUEST = {
52
- ...DIFF_REQUEST,
53
- requestId: "r2",
54
- callId: "c2",
55
- toolName: "Bash",
56
- args: { command: "pnpm add jsvat" },
57
- summary: "Run pnpm add jsvat",
58
- kind: "command",
59
- preview: {
60
- type: "command",
61
- command: "pnpm add jsvat",
62
- cwd: "/repo",
63
- effect: "adds_dependency",
64
- touches: ["package.json", "pnpm-lock.yaml"],
65
- },
66
- ruleOptions: [{ kind: "command", value: "pnpm add" }],
67
- };
68
-
69
- const DELETE_REQUEST = {
70
- ...DIFF_REQUEST,
71
- requestId: "r3",
72
- callId: "c3",
73
- toolName: "mcp__dms-ai__BuilderDeleteResource",
74
- args: { ref: "legacy_coupons" },
75
- summary: "Delete the table legacy_coupons",
76
- kind: "destructive",
77
- alwaysAsk: true,
78
- preview: {
79
- type: "destructive",
80
- operation: "resource · API routes",
81
- target: "legacy_coupons",
82
- consequence: "deletes_data",
83
- confirmText: "legacy_coupons",
84
- canKeepData: true,
85
- },
86
- ruleOptions: [],
87
- };
88
-
89
- const CHANGE_SET = {
90
- id: "cs-14",
91
- number: 14,
92
- conversationId: CONVERSATION_ID,
93
- title: "Top customers",
94
- createdAtMs: Date.now(),
95
- agent: "claude",
96
- scope: "safe",
97
- isAutoFix: false,
98
- overlapped: false,
99
- files: [
100
- {
101
- path: "sales/overview.page.ts",
102
- status: "modified",
103
- added: 14,
104
- removed: 1,
105
- },
106
- {
107
- path: "sales/queries/top-customers.ts",
108
- status: "added",
109
- added: 22,
110
- removed: 0,
111
- },
112
- ],
113
- added: 36,
114
- removed: 1,
115
- typecheck: "passed",
116
- state: "applied",
117
- approvalsNeeded: 0,
118
- builderOps: 2,
119
- };
120
-
121
- function keydown(target: Element, key: string): void {
122
- target.dispatchEvent(new KeyboardEvent("keydown", { key, bubbles: true }));
123
- }
15
+ import { DIFF_REQUEST, keydown } from "./support/panel-fixtures";
124
16
 
125
17
  beforeEach(() => {
126
18
  localStorage.setItem("dms-ai-conversation-id", CONVERSATION_ID);
@@ -193,453 +85,6 @@ describe("the panel's header and empty chat", () => {
193
85
  });
194
86
  });
195
87
 
196
- describe("tool rows and change sets", () => {
197
- it("draws each call with the lexicon's words and its state", async () => {
198
- const harness = createHarness();
199
- const panel = await openPanel(harness);
200
- await sendMessage(panel, "go");
201
- deliver(harness, {
202
- type: "tool_call_start",
203
- callId: "c0",
204
- toolName: "Read",
205
- args: { file_path: "/a/customer.form.ts" },
206
- });
207
- deliver(harness, {
208
- type: "tool_call_end",
209
- callId: "c0",
210
- status: "success",
211
- result: "",
212
- outcome: "done",
213
- });
214
- deliver(harness, {
215
- type: "tool_call_start",
216
- callId: "c9",
217
- toolName: "Bash",
218
- args: { command: "pnpm add dayjs" },
219
- });
220
- deliver(harness, {
221
- type: "tool_call_end",
222
- callId: "c9",
223
- status: "error",
224
- result: "",
225
- outcome: "denied",
226
- });
227
- deliver(harness, {
228
- type: "tool_call_start",
229
- callId: "c1",
230
- toolName: "Edit",
231
- args: { file_path: "/repo/crm/customers/customer.form.ts" },
232
- });
233
- deliver(harness, DIFF_REQUEST);
234
- await nextTick();
235
- const rows = panel.findAll(".cb-tool");
236
- expect(
237
- rows.map((row) => row.classes().find((name) => name.startsWith("is-"))),
238
- ).toEqual(["is-done", "is-denied", "is-waiting"]);
239
- expect(rows[0].text()).toContain("Read file");
240
- expect(rows[0].text()).toContain("customer.form.ts");
241
- expect(rows[2].text()).toContain("1 of 1 · below");
242
- expect(panel.find(".cb-tools__head").text()).toContain("Used 3 tools");
243
- });
244
-
245
- it("shows the raw JSON of a call on demand", async () => {
246
- const harness = createHarness();
247
- const panel = await openPanel(harness);
248
- await sendMessage(panel, "go");
249
- deliver(harness, {
250
- type: "tool_call_start",
251
- callId: "c0",
252
- toolName: "mcp__dms-ai__BuilderAddBlock",
253
- args: { name: "Top customers", type: "TopListCard" },
254
- });
255
- deliver(harness, {
256
- type: "tool_call_end",
257
- callId: "c0",
258
- status: "success",
259
- result: "ok",
260
- outcome: "done",
261
- });
262
- await nextTick();
263
- await panel.find(".cb-tool").trigger("click");
264
- expect(panel.find(".cb-kv").text()).toContain("TopListCard");
265
- await buttonWithText(panel, "Raw JSON").trigger("click");
266
- expect(panel.find(".cb-raw").text()).toContain('"type": "TopListCard"');
267
- });
268
-
269
- it("ends a turn with its change set: undo, review, then redo", async () => {
270
- const harness = createHarness();
271
- const panel = await openPanel(harness);
272
- await sendMessage(panel, "go");
273
- deliver(harness, { type: "change_set", changeSet: CHANGE_SET });
274
- deliver(harness, { type: "run_done" });
275
- await nextTick();
276
- const card = panel.find(".cb-change");
277
- expect(card.text()).toContain("Applied · checkpoint 14");
278
- expect(card.text()).toContain("2 files changed · 2 Builder operations");
279
- expect(card.text()).toContain("new");
280
- await buttonWithText(card, "Review diff").trigger("click");
281
- expect(harness.navigate).toHaveBeenCalledWith(
282
- "/modules/ai/changes?set=cs-14",
283
- );
284
- await buttonWithText(card, "Undo").trigger("click");
285
- await flushPromises();
286
- expect(sentOfType(harness, "change_set_action")).toEqual([
287
- {
288
- type: "change_set_action",
289
- conversationId: CONVERSATION_ID,
290
- changeSetId: "cs-14",
291
- action: "undo",
292
- },
293
- ]);
294
- deliver(harness, {
295
- type: "change_set",
296
- changeSet: { ...CHANGE_SET, state: "undone", stateChangedBy: "Camille" },
297
- });
298
- await nextTick();
299
- expect(panel.find(".cb-change").text()).toContain(
300
- "Undone · checkpoint 14 restored",
301
- );
302
- expect(panel.find(".cb-change").text()).toContain("by Camille");
303
- await buttonWithText(panel.find(".cb-change"), "Redo").trigger("click");
304
- expect(sentOfType(harness, "change_set_action").at(-1)).toMatchObject({
305
- action: "redo",
306
- });
307
- });
308
-
309
- it("asks before undoing a set later ones build on", async () => {
310
- const harness = createHarness();
311
- vi.mocked(harness.api.get).mockResolvedValueOnce({
312
- conflicts: [
313
- {
314
- changeSetId: "cs-15",
315
- number: 15,
316
- title: "Refund rate",
317
- files: ["sales/overview.page.ts"],
318
- },
319
- ],
320
- });
321
- const panel = await openPanel(harness);
322
- deliver(harness, { type: "change_set", changeSet: CHANGE_SET });
323
- await nextTick();
324
- await buttonWithText(panel.find(".cb-change"), "Undo").trigger("click");
325
- await flushPromises();
326
- expect(panel.find(".u-modal").text()).toContain("#15 Refund rate");
327
- await buttonWithText(panel.find(".u-modal"), "Undo them together").trigger(
328
- "click",
329
- );
330
- expect(sentOfType(harness, "change_set_action")[0]).toMatchObject({
331
- includeLater: true,
332
- });
333
- });
334
- });
335
-
336
- describe("the approvals dock", () => {
337
- it("previews a diff with line numbers and allows a scope with ↵", async () => {
338
- // The countdown reads the clock: frozen at the request's creation, it
339
- // shows the full grace period however slow the run is.
340
- vi.useFakeTimers({ toFake: ["Date"] });
341
- vi.setSystemTime(DIFF_REQUEST.createdAtMs);
342
- const harness = createHarness();
343
- const panel = await openPanel(harness);
344
- deliver(harness, DIFF_REQUEST);
345
- deliver(harness, COMMAND_REQUEST);
346
- await nextTick();
347
- const dock = panel.find(".cb-approve");
348
- expect(dock.attributes("role")).toBe("alertdialog");
349
- expect(dock.text()).toContain("Needs your approval · 1 of 2");
350
- expect(dock.text()).toContain("denies in 4:12");
351
- expect(panel.find(".perm.is-focused .perm__title").text()).toBe(
352
- "Edit customer.form.ts",
353
- );
354
- expect(panel.findAll(".ln").map((row) => row.text())).toEqual([
355
- "@@ −42 +42 @@",
356
- '42−label: "VAT",',
357
- '42+label: "VAT number",',
358
- ]);
359
- expect(dock.text()).toContain("Every edit under crm/customers/");
360
- await panel.findAll(".perm.is-focused .scope-opt input")[2].setValue(true);
361
- keydown(dock.element, "Enter");
362
- await nextTick();
363
- expect(sentOfType(harness, "permission_response")[0]).toEqual({
364
- type: "permission_response",
365
- conversationId: CONVERSATION_ID,
366
- requestId: "r1",
367
- decision: "allow_rule",
368
- rule: { kind: "directory", value: "crm/customers/" },
369
- });
370
- expect(panel.find(".perm.is-focused .perm__title").text()).toBe(
371
- "Run pnpm add jsvat",
372
- );
373
- expect(panel.find(".perm.is-focused").text()).toContain(
374
- "adds a dependency · package.json, pnpm-lock.yaml",
375
- );
376
- });
377
-
378
- it("moves with J and K, denies with N, and denies everything at once", async () => {
379
- const harness = createHarness();
380
- const panel = await openPanel(harness);
381
- deliver(harness, DIFF_REQUEST);
382
- deliver(harness, COMMAND_REQUEST);
383
- await nextTick();
384
- const dock = panel.find(".cb-approve");
385
- keydown(dock.element, "j");
386
- await nextTick();
387
- expect(dock.text()).toContain("2 of 2");
388
- keydown(dock.element, "k");
389
- await nextTick();
390
- expect(dock.text()).toContain("1 of 2");
391
- keydown(dock.element, "n");
392
- await nextTick();
393
- expect(sentOfType(harness, "permission_response")[0]).toMatchObject({
394
- requestId: "r1",
395
- decision: "deny",
396
- });
397
- deliver(harness, DIFF_REQUEST);
398
- await nextTick();
399
- await buttonWithText(
400
- panel.find(".cb-approve"),
401
- "Deny both and stop",
402
- ).trigger("click");
403
- expect(sentOfType(harness, "permission_response").at(-1)).toMatchObject({
404
- decision: "deny_all",
405
- });
406
- });
407
-
408
- it("denies with the user's suggestion", async () => {
409
- const harness = createHarness();
410
- const panel = await openPanel(harness);
411
- deliver(harness, DIFF_REQUEST);
412
- await nextTick();
413
- await buttonWithText(panel, "Suggest a change").trigger("click");
414
- await panel
415
- .find(".u-textarea")
416
- .setValue("Use the Builder's validation instead");
417
- await buttonWithText(panel, "Deny and send").trigger("click");
418
- expect(sentOfType(harness, "permission_response")[0]).toMatchObject({
419
- decision: "deny",
420
- feedback: "Use the Builder's validation instead",
421
- });
422
- });
423
-
424
- it("makes a data loss typed, offers to keep the data, and never a chat-wide rule", async () => {
425
- const harness = createHarness();
426
- const panel = await openPanel(harness);
427
- deliver(harness, DELETE_REQUEST);
428
- await nextTick();
429
- const card = panel.find(".perm.is-danger");
430
- expect(card.text()).toContain("Data loss");
431
- expect(card.text()).not.toContain("this chat");
432
- const confirm = buttonWithText(card, "Delete");
433
- expect(confirm.attributes("disabled")).toBeDefined();
434
- await card.find(".perm__confirm input").setValue("legacy_coupons");
435
- expect(
436
- buttonWithText(card, "Delete").attributes("disabled"),
437
- ).toBeUndefined();
438
- await card.find('input[type="checkbox"]').setValue(true);
439
- await buttonWithText(card, "Remove the code only").trigger("click");
440
- expect(sentOfType(harness, "permission_response")[0]).toMatchObject({
441
- decision: "allow_once",
442
- keepData: true,
443
- });
444
- });
445
-
446
- it("turns an expired request into a card that asks again", async () => {
447
- const harness = createHarness();
448
- const panel = await openPanel(harness);
449
- deliver(harness, DIFF_REQUEST);
450
- deliver(harness, {
451
- type: "permission_expired",
452
- requestId: "r1",
453
- toolName: "Edit",
454
- summary: "Edit customer.form.ts",
455
- expiredAtMs: Date.now(),
456
- });
457
- await nextTick();
458
- expect(panel.find(".cb-approve").exists()).toBe(false);
459
- const card = panel.find(".cb-expired");
460
- expect(card.text()).toContain("Edit file request expired");
461
- await buttonWithText(card, "Ask again").trigger("click");
462
- expect(sentOfType(harness, "user_message")[0].content).toContain(
463
- "Edit customer.form.ts",
464
- );
465
- expect(panel.find(".cb-expired").exists()).toBe(false);
466
- });
467
-
468
- it("lists the rules allowed in this chat and revokes one", async () => {
469
- const harness = createHarness();
470
- const panel = await openPanel(harness);
471
- deliver(harness, DIFF_REQUEST);
472
- deliver(harness, {
473
- type: "rules_state",
474
- rules: [
475
- {
476
- id: "rule-1",
477
- kind: "command",
478
- value: "pnpm test",
479
- label: "Commands starting pnpm test",
480
- createdAtMs: 1,
481
- },
482
- ],
483
- });
484
- await nextTick();
485
- const rules = panel.find(".cb-approve .cb-rules");
486
- expect(rules.text()).toContain("Commands starting pnpm test");
487
- await buttonWithText(rules, "Revoke").trigger("click");
488
- expect(sentOfType(harness, "revoke_rule")).toEqual([
489
- {
490
- type: "revoke_rule",
491
- conversationId: CONVERSATION_ID,
492
- ruleId: "rule-1",
493
- },
494
- ]);
495
- });
496
- });
497
-
498
- describe("questions, queue and modes", () => {
499
- const QUESTIONS = {
500
- type: "ask_question",
501
- requestId: "q1",
502
- questions: [
503
- {
504
- question: "Where should the page live?",
505
- header: "Placement",
506
- options: [
507
- {
508
- label: "Finance › Overdue invoices",
509
- description: "Next to Invoices",
510
- },
511
- { label: "A tab on Invoices", description: "" },
512
- ],
513
- },
514
- {
515
- question: "Default sort?",
516
- header: "Sort",
517
- options: [
518
- { label: "Days overdue", description: "" },
519
- { label: "Amount", description: "" },
520
- ],
521
- },
522
- ],
523
- };
524
-
525
- it("pages through questions with numbers, Other… and Skip, then keeps the answers", async () => {
526
- const harness = createHarness();
527
- const panel = await openPanel(harness);
528
- deliver(harness, QUESTIONS);
529
- await nextTick();
530
- const dock = panel.find(".cb-ask");
531
- expect(dock.text()).toContain("Question 1 of 2 · Placement");
532
- expect(dock.find(".opt-card.is-selected").text()).toContain("Suggested");
533
- keydown(dock.element, "3");
534
- await nextTick();
535
- await dock.find(".cb-ask__custom").setValue("Under Finance, as a tab");
536
- await buttonWithText(dock.find(".cb-ask__foot"), "Next").trigger("click");
537
- expect(dock.text()).toContain("Question 2 of 2 · Sort");
538
- await buttonWithText(dock, "Skip, you decide").trigger("click");
539
- expect(sentOfType(harness, "question_response")[0]).toEqual({
540
- type: "question_response",
541
- conversationId: CONVERSATION_ID,
542
- requestId: "q1",
543
- answers: ["Under Finance, as a tab", ""],
544
- skipped: [false, true],
545
- });
546
- await nextTick();
547
- const record = panel.find(".cb-answers");
548
- expect(record.text()).toContain("“Under Finance, as a tab”");
549
- expect(record.text()).toContain("Skipped: the assistant decides");
550
- });
551
-
552
- it("edits, reorders and clears the queue", async () => {
553
- const harness = createHarness();
554
- const panel = await openPanel(harness);
555
- deliver(harness, {
556
- type: "queue_state",
557
- items: [
558
- { id: "a", content: "Sort by order count" },
559
- { id: "b", content: "Limit to 3 orders" },
560
- ],
561
- });
562
- await nextTick();
563
- await panel
564
- .find('button[aria-label="Edit queued message"]')
565
- .trigger("click");
566
- await panel.find(".cb-queued__editor").setValue("Sort by revenue");
567
- await buttonWithText(panel.find(".cb-queue"), "Save").trigger("click");
568
- keydown(panel.findAll(".cb-queued__handle")[1].element, "ArrowUp");
569
- await nextTick();
570
- expect(panel.findAll(".cb-queued__txt").map((item) => item.text())).toEqual(
571
- ["Limit to 3 orders", "Sort by revenue"],
572
- );
573
- await buttonWithText(panel.find(".cb-queue"), "Clear").trigger("click");
574
- expect(
575
- harness.sent
576
- .map((msg) => msg.type)
577
- .filter((type) => String(type).startsWith("queue_")),
578
- ).toEqual(["queue_update", "queue_move", "queue_clear"]);
579
- });
580
-
581
- it("switches the chat's mode and scope, and confirms Full auto with a duration", async () => {
582
- const harness = createHarness();
583
- const panel = await openPanel(harness);
584
- await buttonWithText(panel, "Plan only").trigger("click");
585
- await buttonWithText(panel, "Full auto…").trigger("click");
586
- await nextTick();
587
- const modal = panel.find(".u-modal");
588
- expect(modal.text()).toContain("Turn on Full auto?");
589
- await buttonWithText(modal, "30 minutes").trigger("click");
590
- await buttonWithText(modal, "Turn on Full auto").trigger("click");
591
- expect(sentOfType(harness, "set_conversation_mode")).toEqual([
592
- {
593
- type: "set_conversation_mode",
594
- conversationId: CONVERSATION_ID,
595
- mode: "plan",
596
- },
597
- {
598
- type: "set_conversation_mode",
599
- conversationId: CONVERSATION_ID,
600
- fullAuto: { duration: "30m" },
601
- },
602
- ]);
603
- await nextTick();
604
- const banner = panel.find(".cb-banner-auto");
605
- expect(banner.text()).toContain("Full auto · for 30 minutes");
606
- await buttonWithText(banner, "Turn off").trigger("click");
607
- expect(sentOfType(harness, "set_conversation_mode").at(-1)).toMatchObject({
608
- fullAuto: null,
609
- });
610
- });
611
-
612
- it("runs a proposed plan in Ask first", async () => {
613
- const harness = createHarness();
614
- const panel = await openPanel(harness);
615
- await sendMessage(panel, "plan a customer health page");
616
- deliver(harness, {
617
- type: "tool_call_start",
618
- callId: "p1",
619
- toolName: "ExitPlanMode",
620
- args: { plan: "1. Create the page\n2. Add a query" },
621
- });
622
- deliver(harness, {
623
- type: "tool_call_end",
624
- callId: "p1",
625
- status: "success",
626
- result: "",
627
- outcome: "done",
628
- });
629
- deliver(harness, { type: "run_done" });
630
- await nextTick();
631
- const plan = panel.find(".cb-plan");
632
- expect(plan.text()).toContain("Proposed plan · 2 steps");
633
- await buttonWithText(plan, "Run with Ask first").trigger("click");
634
- expect(sentOfType(harness, "set_conversation_mode")[0]).toMatchObject({
635
- mode: "normal",
636
- });
637
- expect(sentOfType(harness, "user_message").at(-1)).toMatchObject({
638
- content: "Go ahead with the plan.",
639
- });
640
- });
641
- });
642
-
643
88
  describe("notices and errors", () => {
644
89
  it("shows an auto-fix turn that can be stopped", async () => {
645
90
  const harness = createHarness();