@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
@@ -0,0 +1,165 @@
1
+ // @vitest-environment jsdom
2
+ import { flushPromises } from "@vue/test-utils";
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ import { nextTick } from "vue";
5
+ import {
6
+ buttonWithText,
7
+ CONVERSATION_ID,
8
+ createHarness,
9
+ deliver,
10
+ openPanel,
11
+ sendMessage,
12
+ sentOfType,
13
+ unmountPanel,
14
+ } from "./support/panel-harness";
15
+ import { CHANGE_SET, DIFF_REQUEST } from "./support/panel-fixtures";
16
+
17
+ beforeEach(() => {
18
+ localStorage.setItem("dms-ai-conversation-id", CONVERSATION_ID);
19
+ });
20
+
21
+ afterEach(() => {
22
+ unmountPanel();
23
+ localStorage.clear();
24
+ vi.useRealTimers();
25
+ });
26
+
27
+ describe("tool rows and change sets", () => {
28
+ it("draws each call with the lexicon's words and its state", async () => {
29
+ const harness = createHarness();
30
+ const panel = await openPanel(harness);
31
+ await sendMessage(panel, "go");
32
+ deliver(harness, {
33
+ type: "tool_call_start",
34
+ callId: "c0",
35
+ toolName: "Read",
36
+ args: { file_path: "/a/customer.form.ts" },
37
+ });
38
+ deliver(harness, {
39
+ type: "tool_call_end",
40
+ callId: "c0",
41
+ status: "success",
42
+ result: "",
43
+ outcome: "done",
44
+ });
45
+ deliver(harness, {
46
+ type: "tool_call_start",
47
+ callId: "c9",
48
+ toolName: "Bash",
49
+ args: { command: "pnpm add dayjs" },
50
+ });
51
+ deliver(harness, {
52
+ type: "tool_call_end",
53
+ callId: "c9",
54
+ status: "error",
55
+ result: "",
56
+ outcome: "denied",
57
+ });
58
+ deliver(harness, {
59
+ type: "tool_call_start",
60
+ callId: "c1",
61
+ toolName: "Edit",
62
+ args: { file_path: "/repo/crm/customers/customer.form.ts" },
63
+ });
64
+ deliver(harness, DIFF_REQUEST);
65
+ await nextTick();
66
+ const rows = panel.findAll(".cb-tool");
67
+ expect(
68
+ rows.map((row) => row.classes().find((name) => name.startsWith("is-"))),
69
+ ).toEqual(["is-done", "is-denied", "is-waiting"]);
70
+ expect(rows[0].text()).toContain("Read file");
71
+ expect(rows[0].text()).toContain("customer.form.ts");
72
+ expect(rows[2].text()).toContain("1 of 1 · below");
73
+ expect(panel.find(".cb-tools__head").text()).toContain("Used 3 tools");
74
+ });
75
+
76
+ it("shows the raw JSON of a call on demand", async () => {
77
+ const harness = createHarness();
78
+ const panel = await openPanel(harness);
79
+ await sendMessage(panel, "go");
80
+ deliver(harness, {
81
+ type: "tool_call_start",
82
+ callId: "c0",
83
+ toolName: "mcp__dms-ai__BuilderAddBlock",
84
+ args: { name: "Top customers", type: "TopListCard" },
85
+ });
86
+ deliver(harness, {
87
+ type: "tool_call_end",
88
+ callId: "c0",
89
+ status: "success",
90
+ result: "ok",
91
+ outcome: "done",
92
+ });
93
+ await nextTick();
94
+ await panel.find(".cb-tool").trigger("click");
95
+ expect(panel.find(".cb-kv").text()).toContain("TopListCard");
96
+ await buttonWithText(panel, "Raw JSON").trigger("click");
97
+ expect(panel.find(".cb-raw").text()).toContain('"type": "TopListCard"');
98
+ });
99
+
100
+ it("ends a turn with its change set: undo, review, then redo", async () => {
101
+ const harness = createHarness();
102
+ const panel = await openPanel(harness);
103
+ await sendMessage(panel, "go");
104
+ deliver(harness, { type: "change_set", changeSet: CHANGE_SET });
105
+ deliver(harness, { type: "run_done" });
106
+ await nextTick();
107
+ const card = panel.find(".cb-change");
108
+ expect(card.text()).toContain("Applied · checkpoint 14");
109
+ expect(card.text()).toContain("2 files changed · 2 Builder operations");
110
+ expect(card.text()).toContain("new");
111
+ await buttonWithText(card, "Review diff").trigger("click");
112
+ expect(harness.navigate).toHaveBeenCalledWith(
113
+ "/modules/ai/changes?set=cs-14",
114
+ );
115
+ await buttonWithText(card, "Undo").trigger("click");
116
+ await flushPromises();
117
+ expect(sentOfType(harness, "change_set_action")).toEqual([
118
+ {
119
+ type: "change_set_action",
120
+ conversationId: CONVERSATION_ID,
121
+ changeSetId: "cs-14",
122
+ action: "undo",
123
+ },
124
+ ]);
125
+ deliver(harness, {
126
+ type: "change_set",
127
+ changeSet: { ...CHANGE_SET, state: "undone", stateChangedBy: "Camille" },
128
+ });
129
+ await nextTick();
130
+ expect(panel.find(".cb-change").text()).toContain(
131
+ "Undone · checkpoint 14 restored",
132
+ );
133
+ expect(panel.find(".cb-change").text()).toContain("by Camille");
134
+ await buttonWithText(panel.find(".cb-change"), "Redo").trigger("click");
135
+ expect(sentOfType(harness, "change_set_action").at(-1)).toMatchObject({
136
+ action: "redo",
137
+ });
138
+ });
139
+
140
+ it("asks before undoing a set later ones build on", async () => {
141
+ const harness = createHarness();
142
+ vi.mocked(harness.api.get).mockResolvedValueOnce({
143
+ conflicts: [
144
+ {
145
+ changeSetId: "cs-15",
146
+ number: 15,
147
+ title: "Refund rate",
148
+ files: ["sales/overview.page.ts"],
149
+ },
150
+ ],
151
+ });
152
+ const panel = await openPanel(harness);
153
+ deliver(harness, { type: "change_set", changeSet: CHANGE_SET });
154
+ await nextTick();
155
+ await buttonWithText(panel.find(".cb-change"), "Undo").trigger("click");
156
+ await flushPromises();
157
+ expect(panel.find(".u-modal").text()).toContain("#15 Refund rate");
158
+ await buttonWithText(panel.find(".u-modal"), "Undo them together").trigger(
159
+ "click",
160
+ );
161
+ expect(sentOfType(harness, "change_set_action")[0]).toMatchObject({
162
+ includeLater: true,
163
+ });
164
+ });
165
+ });
@@ -1,15 +1,11 @@
1
- import { readFileSync } from "node:fs";
2
- import { resolve } from "node:path";
3
- import ts from "typescript";
4
- import * as vue from "vue";
1
+ import { afterEach, expect, it, vi } from "vitest";
5
2
  import { nextTick, ref, type Ref } from "vue";
6
- import { expect, it, vi } from "vitest";
7
- import * as constants from "../app/runtime/constants";
8
- import { runWhenLoggedIn } from "../app/runtime/session-gate";
3
+ import plugin from "../app/plugins/ai.client";
9
4
 
10
- interface PluginExports {
11
- default: (context: unknown) => void | Promise<void>;
12
- }
5
+ vi.mock("#dms/frontend-module", () => ({
6
+ defineDmsPlugin: (definition: unknown) => definition,
7
+ useDmsRouter: () => ({ push: vi.fn() }),
8
+ }));
13
9
 
14
10
  interface PluginHarness {
15
11
  useAuthFetch: ReturnType<typeof vi.fn>;
@@ -17,66 +13,32 @@ interface PluginHarness {
17
13
  run: () => void | Promise<void>;
18
14
  }
19
15
 
20
- const SESSION_GATE_MODULE = "../runtime/session-gate";
21
- const SIDECAR_STATUS_MODULE = "../runtime/sidecar-status";
22
- const CONSTANTS_MODULE = "../runtime/constants";
23
-
24
- // A first probe reporting "no assistant here" stops the startup right after the
16
+ // A first probe reporting a disabled sidecar stops the startup right after the
25
17
  // authenticated fetch, which is all these tests need to observe.
26
- const silentController = {
27
- createSidecarStatusController: () => ({ init: async () => false }),
28
- };
18
+ function disabledSidecarRead() {
19
+ return {
20
+ data: ref({ disabled: true }),
21
+ error: ref(null),
22
+ pending: ref(false),
23
+ execute: async () => undefined,
24
+ refresh: async () => undefined,
25
+ };
26
+ }
29
27
 
30
28
  function loadPlugin(loggedIn: Ref<boolean>): PluginHarness {
31
- const source = readFileSync(
32
- resolve(__dirname, "../app/plugins/ai.client.ts"),
33
- "utf8",
34
- );
35
- const compiled = ts.transpileModule(
36
- source
37
- .replace("import.meta.env.DEV", "true")
38
- .replace("import.meta.hot", "undefined"),
39
- { compilerOptions: { module: ts.ModuleKind.CommonJS } },
40
- );
41
- const exports = {} as PluginExports;
42
29
  const useAuthFetch = vi.fn(() => ({ $authFetch: vi.fn() }));
43
30
  const unregisterSidePanel = vi.fn();
44
- const requireModule = (name: string) => {
45
- if (name === "#dms/frontend-module") {
46
- return {
47
- defineDmsPlugin: (plugin: unknown) => plugin,
48
- useDmsRouter: () => ({ push: vi.fn() }),
49
- };
50
- }
51
- if (name === "vue") return vue;
52
- if (name === CONSTANTS_MODULE) return constants;
53
- if (name === SESSION_GATE_MODULE) return { runWhenLoggedIn };
54
- if (name === SIDECAR_STATUS_MODULE) return silentController;
55
- return {};
56
- };
57
- new Function(
58
- "require",
59
- "exports",
60
- "useDmsUserSession",
61
- "useAuthFetch",
62
- "useToast",
63
- "useDevReload",
64
- "unregisterSidePanel",
65
- compiled.outputText,
66
- )(
67
- requireModule,
68
- exports,
69
- () => ({ loggedIn }),
70
- useAuthFetch,
71
- () => ({ add: vi.fn() }),
72
- () => ({ awaitRoute: vi.fn() }),
73
- unregisterSidePanel,
74
- );
31
+ vi.stubGlobal("useDmsUserSession", () => ({ loggedIn }));
32
+ vi.stubGlobal("useAuthFetch", useAuthFetch);
33
+ vi.stubGlobal("useToast", () => ({ add: vi.fn() }));
34
+ vi.stubGlobal("useDevReload", () => ({ awaitRoute: vi.fn() }));
35
+ vi.stubGlobal("useApiData", disabledSidecarRead);
36
+ vi.stubGlobal("unregisterSidePanel", unregisterSidePanel);
75
37
  return {
76
38
  useAuthFetch,
77
39
  unregisterSidePanel,
78
40
  run: () =>
79
- exports.default({
41
+ plugin({
80
42
  vueApp: { onUnmount: vi.fn(), provide: vi.fn() },
81
43
  $i18n: { t: (key: string) => key, locale: ref("en-GB") },
82
44
  hook: vi.fn(),
@@ -85,27 +47,33 @@ function loadPlugin(loggedIn: Ref<boolean>): PluginHarness {
85
47
  };
86
48
  }
87
49
 
50
+ afterEach(() => {
51
+ vi.unstubAllGlobals();
52
+ });
53
+
88
54
  it("does not invoke authenticated fetching or inject the assistant for a guest", async () => {
89
- const plugin = loadPlugin(ref(false));
90
- await plugin.run();
91
- expect(plugin.useAuthFetch).not.toHaveBeenCalled();
55
+ const harness = loadPlugin(ref(false));
56
+ await harness.run();
57
+ expect(harness.useAuthFetch).not.toHaveBeenCalled();
92
58
  });
93
59
 
94
60
  it("starts the assistant when a guest signs in without reloading the page", async () => {
95
61
  const loggedIn = ref(false);
96
- const plugin = loadPlugin(loggedIn);
97
- await plugin.run();
98
- expect(plugin.useAuthFetch).not.toHaveBeenCalled();
62
+ const harness = loadPlugin(loggedIn);
63
+ await harness.run();
64
+ expect(harness.useAuthFetch).not.toHaveBeenCalled();
99
65
 
100
66
  loggedIn.value = true;
101
67
  await nextTick();
102
- expect(plugin.useAuthFetch).toHaveBeenCalledTimes(1);
68
+ expect(harness.useAuthFetch).toHaveBeenCalledTimes(1);
103
69
  });
104
70
 
105
71
  it("withdraws the docked panel when the first probe finds no assistant", async () => {
106
- const plugin = loadPlugin(ref(true));
107
- await plugin.run();
72
+ const harness = loadPlugin(ref(true));
73
+ await harness.run();
108
74
  await vi.waitFor(() =>
109
- expect(plugin.unregisterSidePanel).toHaveBeenCalledWith("dms-ai:assistant"),
75
+ expect(harness.unregisterSidePanel).toHaveBeenCalledWith(
76
+ "dms-ai:assistant",
77
+ ),
110
78
  );
111
79
  });
@@ -0,0 +1,28 @@
1
+ import { ref } from "vue";
2
+ import { afterEach, vi } from "vitest";
3
+ import { useApiErrorPresenter } from "../../../node_modules/@antelopejs/dms/frontend-vue/layers/dms-core/app/composables/useApiErrorPresenter";
4
+
5
+ afterEach(() => vi.unstubAllEnvs());
6
+
7
+ export function installApiErrorPresenter() {
8
+ vi.stubEnv("SSR", false);
9
+ const add = vi.fn(() => ({ id: "notice" }));
10
+ const messages: Record<string, string> = {
11
+ "error.read_only_demo": "This demo is read-only.",
12
+ "error.500.description": "Something went wrong.",
13
+ "dms_ai.views.error.description": "Could not load the assistant's data.",
14
+ "dms_ai.views.unavailable.description": "The assistant is not running.",
15
+ };
16
+ vi.stubGlobal("useToast", () => ({ add }));
17
+ vi.stubGlobal("getPluginI18n", () => ({
18
+ i18n: {
19
+ tm: (key: string) =>
20
+ Object.hasOwn(messages, key) ? messages[key] : null,
21
+ rt: (message: string) => message,
22
+ },
23
+ }));
24
+ const presented = ref(new WeakMap<object, string | number | null>());
25
+ vi.stubGlobal("useDmsState", () => presented);
26
+ vi.stubGlobal("useApiErrorPresenter", useApiErrorPresenter);
27
+ return { add };
28
+ }
@@ -0,0 +1,110 @@
1
+ import { CONVERSATION_ID } from "./panel-harness";
2
+
3
+ export const DIFF_REQUEST = {
4
+ type: "permission_request",
5
+ requestId: "r1",
6
+ callId: "c1",
7
+ toolName: "Edit",
8
+ args: { file_path: "/repo/crm/customers/customer.form.ts" },
9
+ summary: "Edit customer.form.ts",
10
+ kind: "edit",
11
+ alwaysAsk: false,
12
+ preview: {
13
+ type: "diff",
14
+ path: "/repo/crm/customers/customer.form.ts",
15
+ relativePath: "crm/customers/customer.form.ts",
16
+ isNewFile: false,
17
+ added: 1,
18
+ removed: 1,
19
+ hunks: [
20
+ {
21
+ oldStart: 42,
22
+ newStart: 42,
23
+ lines: [
24
+ { kind: "remove", text: 'label: "VAT",' },
25
+ { kind: "add", text: 'label: "VAT number",' },
26
+ ],
27
+ },
28
+ ],
29
+ },
30
+ ruleOptions: [
31
+ { kind: "file", value: "crm/customers/customer.form.ts" },
32
+ { kind: "directory", value: "crm/customers/" },
33
+ ],
34
+ createdAtMs: Date.now(),
35
+ expiresAtMs: Date.now() + 252_000,
36
+ };
37
+
38
+ export const COMMAND_REQUEST = {
39
+ ...DIFF_REQUEST,
40
+ requestId: "r2",
41
+ callId: "c2",
42
+ toolName: "Bash",
43
+ args: { command: "pnpm add jsvat" },
44
+ summary: "Run pnpm add jsvat",
45
+ kind: "command",
46
+ preview: {
47
+ type: "command",
48
+ command: "pnpm add jsvat",
49
+ cwd: "/repo",
50
+ effect: "adds_dependency",
51
+ touches: ["package.json", "pnpm-lock.yaml"],
52
+ },
53
+ ruleOptions: [{ kind: "command", value: "pnpm add" }],
54
+ };
55
+
56
+ export const DELETE_REQUEST = {
57
+ ...DIFF_REQUEST,
58
+ requestId: "r3",
59
+ callId: "c3",
60
+ toolName: "mcp__dms-ai__BuilderDeleteResource",
61
+ args: { ref: "legacy_coupons" },
62
+ summary: "Delete the table legacy_coupons",
63
+ kind: "destructive",
64
+ alwaysAsk: true,
65
+ preview: {
66
+ type: "destructive",
67
+ operation: "resource · API routes",
68
+ target: "legacy_coupons",
69
+ consequence: "deletes_data",
70
+ confirmText: "legacy_coupons",
71
+ canKeepData: true,
72
+ },
73
+ ruleOptions: [],
74
+ };
75
+
76
+ export const CHANGE_SET = {
77
+ id: "cs-14",
78
+ number: 14,
79
+ conversationId: CONVERSATION_ID,
80
+ title: "Top customers",
81
+ createdAtMs: Date.now(),
82
+ agent: "claude",
83
+ scope: "safe",
84
+ isAutoFix: false,
85
+ overlapped: false,
86
+ files: [
87
+ {
88
+ path: "sales/overview.page.ts",
89
+ status: "modified",
90
+ added: 14,
91
+ removed: 1,
92
+ },
93
+ {
94
+ path: "sales/queries/top-customers.ts",
95
+ status: "added",
96
+ added: 22,
97
+ removed: 0,
98
+ },
99
+ ],
100
+ added: 36,
101
+ removed: 1,
102
+ typecheck: "passed",
103
+ state: "applied",
104
+ approvalsNeeded: 0,
105
+ builderOps: 2,
106
+ };
107
+
108
+ export function keydown(target: Element, key: string): void {
109
+ target.dispatchEvent(new KeyboardEvent("keydown", { key, bubbles: true }));
110
+ }
@@ -94,8 +94,8 @@ export function createHarness(): Harness {
94
94
  intents.push({ kind: "open", conversationId });
95
95
  panel.open();
96
96
  },
97
- startConversation: (prompt) => {
98
- intents.push({ kind: "start", prompt });
97
+ startConversation: (prompt, mode) => {
98
+ intents.push({ kind: "start", prompt, mode });
99
99
  panel.open();
100
100
  },
101
101
  holdStream: () => {
@@ -15,6 +15,7 @@ import ActivityDetail from "../../app/components/ActivityDetail.vue";
15
15
  import ChangesView from "../../app/components/ChangesView.vue";
16
16
  import ChangeSetPanel from "../../app/views/ChangeSetPanel.vue";
17
17
  import UnavailableState from "../../app/views/UnavailableState.vue";
18
+ import { installApiErrorPresenter } from "../support/api-error-presenter";
18
19
 
19
20
  // The views read what they render with the DMS's `useApiData`, which a server
20
21
  // render hands to the browser (this repository has no renderer to run it:
@@ -241,6 +242,7 @@ beforeEach(() => {
241
242
  vi.stubGlobal("useApiPagedData", useApiPagedData);
242
243
  vi.stubGlobal("refreshPageBlocks", refreshPageBlocks);
243
244
  vi.stubGlobal("useAuthFetch", () => ({ $authFetch: authFetch }));
245
+ installApiErrorPresenter();
244
246
  vi.stubGlobal("useI18n", () => ({
245
247
  t: (key: string) => key,
246
248
  te: () => false,
@@ -0,0 +1,89 @@
1
+ import { afterEach, expect, it, vi } from "vitest";
2
+ import { ref } from "vue";
3
+ import { useAiData } from "../../app/views/composables/useAiData";
4
+ import { useChangeSetActions } from "../../app/views/composables/useChangeSetActions";
5
+ import { installApiErrorPresenter } from "../support/api-error-presenter";
6
+
7
+ afterEach(() => vi.unstubAllGlobals());
8
+
9
+ it.each([
10
+ {
11
+ status: 403,
12
+ data: { message: "error.read_only_demo", severity: "warning" },
13
+ title: "This demo is read-only.",
14
+ color: "warning",
15
+ },
16
+ {
17
+ status: 403,
18
+ data: { message: "unknown.server.key" },
19
+ title: "Could not load the assistant's data.",
20
+ color: "warning",
21
+ },
22
+ {
23
+ status: 503,
24
+ data: { message: "unknown.server.key" },
25
+ title: "The assistant is not running.",
26
+ color: "error",
27
+ },
28
+ ])(
29
+ "presents redo failure $status once with server or fallback copy",
30
+ async ({ status, data, title, color }) => {
31
+ const { add } = installApiErrorPresenter();
32
+ const error = Object.assign(new Error("Request failed"), {
33
+ response: new Response(JSON.stringify(data), {
34
+ status,
35
+ headers: { "content-type": "application/json" },
36
+ }),
37
+ data,
38
+ });
39
+ vi.stubGlobal("useI18n", () => ({ t: (key: string) => key }));
40
+ vi.stubGlobal("useConfirmFrom", () => ({}));
41
+ vi.stubGlobal("useAuthFetch", () => ({
42
+ $authFetch: async () => {
43
+ throw error;
44
+ },
45
+ }));
46
+ const actions = useChangeSetActions();
47
+ const changeSet = {
48
+ id: "change-1",
49
+ number: 1,
50
+ conversationId: "conversation-1",
51
+ title: "Rename page",
52
+ createdAtMs: 1,
53
+ agent: "claude",
54
+ scope: "safe",
55
+ isAutoFix: false,
56
+ overlapped: false,
57
+ files: [],
58
+ added: 1,
59
+ removed: 0,
60
+ typecheck: "passed",
61
+ state: "applied",
62
+ approvalsNeeded: 0,
63
+ builderOps: 0,
64
+ } satisfies Parameters<typeof actions.redo>[0];
65
+ await actions.redo(changeSet);
66
+ await actions.redo(changeSet);
67
+ expect(add.mock.calls).toEqual([
68
+ [expect.objectContaining({ title, color })],
69
+ ]);
70
+ expect(actions.isBusy.value).toBe(false);
71
+ },
72
+ );
73
+
74
+ it("resolves a JSON read refusal as translated inline copy without a toast", () => {
75
+ const { add } = installApiErrorPresenter();
76
+ const data = { message: "error.read_only_demo", severity: "warning" };
77
+ const error = Object.assign(new Error("Forbidden"), {
78
+ response: new Response(JSON.stringify(data), { status: 403 }),
79
+ data,
80
+ });
81
+ vi.stubGlobal("useApiData", () => ({
82
+ error: ref(error),
83
+ status: ref("error"),
84
+ }));
85
+ const read = useAiData("/ai/changes");
86
+ expect(read.failure.value).toBe("error");
87
+ expect(read.message.value).toBe("This demo is read-only.");
88
+ expect(add).not.toHaveBeenCalled();
89
+ });
@@ -1,9 +1,10 @@
1
1
  import { resolve } from "node:path";
2
2
  import vue from "@vitejs/plugin-vue";
3
3
  import { defineConfig } from "vitest/config";
4
+ import { backendBoundary } from "./build/backend-boundary.ts";
4
5
 
5
6
  export default defineConfig({
6
- plugins: [vue()],
7
+ plugins: [backendBoundary(), vue()],
7
8
  resolve: {
8
9
  alias: {
9
10
  // The renderer's runtime exists in the generated application only.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antelopejs/dms-ai",
3
- "version": "0.6.1",
3
+ "version": "0.8.0",
4
4
  "description": "AI development assistant for the AntelopeJS DMS: a chat panel next to every page and a coding agent that edits the project in reviewable, undoable change sets.",
5
5
  "keywords": [
6
6
  "ai",
@@ -47,10 +47,10 @@
47
47
  "prepack": "pnpm run build && pnpm run build:sidecar",
48
48
  "frontend:dev": "cd playground && pnpm frontend:dev",
49
49
  "dev": "cd playground && pnpm dev",
50
- "lint": "oxlint --disable-nested-config && oxfmt --disable-nested-config --check . && cd frontend-vue && pnpm lint && cd ../sidecar && pnpm lint && antelopejs-check-interface-ranges",
51
- "lint:fix": "oxlint --disable-nested-config --fix --max-warnings=1000000 && oxfmt --disable-nested-config . && cd frontend-vue && pnpm lint:fix && cd ../sidecar && pnpm lint:fix",
52
- "typecheck": "tsc --noEmit && cd frontend-vue && pnpm typecheck:chat && pnpm typecheck && cd ../sidecar && pnpm typecheck",
53
- "test": "cd sidecar && pnpm test && cd ../frontend-vue && pnpm test",
50
+ "lint": "oxlint && pnpm --dir frontend-vue lint && node node_modules/@antelopejs/dms/frontend-vue/scripts/check-api-error-presentation.mjs frontend-vue/app && antelopejs-check-interface-ranges && node scripts/check-playground-install.mjs && node scripts/check-i18n.mjs",
51
+ "lint:fix": "oxlint --fix && oxfmt . && pnpm --dir frontend-vue lint:fix",
52
+ "typecheck": "tsc --noEmit && pnpm --dir frontend-vue typecheck:chat && pnpm --dir sidecar typecheck",
53
+ "test": "pnpm run test:node",
54
54
  "test:node": "([ -n \"$DMS_PREBUILT\" ] || pnpm run build) && node --test \"tests/!(sidecar-build).test.cjs\"",
55
55
  "test:sidecar-smoke": "pnpm run build:sidecar && node --test tests/sidecar-build.test.cjs",
56
56
  "test:frontend-registration": "pnpm run build && node --test tests/frontend-registration.test.cjs",
@@ -61,9 +61,19 @@
61
61
  "test:build-id": "node --test tests/build-id.test.cjs",
62
62
  "test:e2e": "cd sidecar && pnpm test:e2e",
63
63
  "release": "pnpm install --frozen-lockfile && release-it",
64
- "format": "oxfmt --disable-nested-config . && cd frontend-vue && pnpm format",
65
- "knip": "knip --dependencies",
66
- "knip:all": "knip"
64
+ "format": "oxfmt . && pnpm --dir frontend-vue format",
65
+ "knip": "knip --dependencies && pnpm --dir sidecar knip",
66
+ "knip:all": "knip",
67
+ "prepare": "if git rev-parse --is-inside-work-tree >/dev/null 2>&1 && command -v lefthook >/dev/null 2>&1; then lefthook install; fi",
68
+ "checks": "antelopejs-checks",
69
+ "size": "antelopejs-check-size",
70
+ "ratchet": "antelopejs-ratchet",
71
+ "sync": "antelopejs-sync",
72
+ "ratchet:update": "antelopejs-ratchet --update",
73
+ "sync:check": "antelopejs-sync --check",
74
+ "format:check": "oxfmt --check .",
75
+ "suppressions": "antelopejs-suppressions",
76
+ "suppressions:update": "antelopejs-suppressions --update"
67
77
  },
68
78
  "dependencies": {
69
79
  "@antelopejs/interface-api": ">=0.0.15 <1.0.0",
@@ -76,10 +86,12 @@
76
86
  "zod": "^4.0.0"
77
87
  },
78
88
  "devDependencies": {
79
- "@antelopejs/tooling-configs": ">=0.0.9 <1.0.0",
89
+ "@antelopejs/dms": ">=0.13.1 <1.0.0",
90
+ "@antelopejs/tooling-configs": "^0.2.17",
80
91
  "@types/node": "^24.0.0",
81
92
  "@types/ws": "^8.5.12",
82
93
  "knip": "^6.34.0",
94
+ "lefthook": "^2.2.2",
83
95
  "oxfmt": "^0.66.0",
84
96
  "oxlint": "1.81.0",
85
97
  "oxlint-tsgolint": "^7.0.2001",
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-files.js","sourceRoot":"","sources":["../../src/agent/attachment-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAIlC,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,IAAI,GAAG,IAAI;SACd,QAAQ,CAAC,IAAI,CAAC;SACd,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,IAAI,EAAE,CAAC;IACV,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,eAAuB,EACvB,cAAsB;IAEtB,OAAO,IAAI,CAAC,IAAI,CACd,eAAe,EACf,GAAG,kBAAkB,EACrB,mBAAmB,EACnB,cAAc,CAAC,cAAc,CAAC,CAC/B,CAAC;AACJ,CAAC;AAID,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAmB,EACnB,KAAa,EACb,GAAW;IAEX,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;IACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,SAAmB;IAChE,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClE,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"attachment-files.js","sourceRoot":"","sources":["../../src/agent/attachment-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAMlC,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,IAAI,GAAG,IAAI;SACd,QAAQ,CAAC,IAAI,CAAC;SACd,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,IAAI,EAAE,CAAC;IACV,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,eAAuB,EACvB,cAAsB;IAEtB,OAAO,IAAI,CAAC,IAAI,CACd,eAAe,EACf,GAAG,kBAAkB,EACrB,mBAAmB,EACnB,cAAc,CAAC,cAAc,CAAC,CAC/B,CAAC;AACJ,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAmB,EACnB,KAAa,EACb,GAAW;IAEX,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;IACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,SAAmB;IAChE,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClE,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
@@ -1,6 +1,7 @@
1
+ import type { ToolArgs } from "./edit-targets.js";
1
2
  export interface CallLedger {
2
- announce(conversationId: string, callId: string, toolName: string, args: unknown): void;
3
- claim(conversationId: string, toolName: string, args: unknown): string | undefined;
3
+ announce(conversationId: string, callId: string, toolName: string, args: ToolArgs): void;
4
+ claim(conversationId: string, toolName: string, args: ToolArgs): string | undefined;
4
5
  forget(conversationId: string): void;
5
6
  }
6
7
  export declare function createCallLedger(): CallLedger;
@@ -2,7 +2,7 @@ import { bareToolName } from "./tool-kinds.js";
2
2
  const MAX_ANNOUNCED_CALLS = 100;
3
3
  function argsKey(args) {
4
4
  try {
5
- return JSON.stringify(args ?? null);
5
+ return JSON.stringify(args);
6
6
  }
7
7
  catch {
8
8
  return "";