@antelopejs/dms-ai 0.1.5 → 0.2.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 (564) hide show
  1. package/README.md +54 -11
  2. package/dist/channels/bridge.d.ts +6 -1
  3. package/dist/channels/bridge.js +29 -1
  4. package/dist/channels/bridge.js.map +1 -1
  5. package/dist/channels/channel-service.d.ts +2 -1
  6. package/dist/channels/channel-service.js +3 -2
  7. package/dist/channels/channel-service.js.map +1 -1
  8. package/dist/channels/sse-stream.d.ts +3 -2
  9. package/dist/config.d.ts +0 -2
  10. package/dist/config.js +0 -7
  11. package/dist/config.js.map +1 -1
  12. package/dist/constants/http.d.ts +9 -0
  13. package/dist/constants/http.js +14 -0
  14. package/dist/constants/http.js.map +1 -0
  15. package/dist/constants/i18n.d.ts +11 -0
  16. package/dist/constants/i18n.js +15 -0
  17. package/dist/constants/i18n.js.map +1 -0
  18. package/dist/constants/pages.d.ts +50 -0
  19. package/dist/constants/pages.js +58 -0
  20. package/dist/constants/pages.js.map +1 -0
  21. package/dist/constants/sidecar.d.ts +3 -1
  22. package/dist/constants/sidecar.js +4 -2
  23. package/dist/constants/sidecar.js.map +1 -1
  24. package/dist/index.js +0 -8
  25. package/dist/index.js.map +1 -1
  26. package/dist/lifecycle/sidecar-owner.d.ts +14 -0
  27. package/dist/lifecycle/sidecar-owner.js +102 -0
  28. package/dist/lifecycle/sidecar-owner.js.map +1 -0
  29. package/dist/lifecycle/spawn-sidecar.d.ts +1 -0
  30. package/dist/lifecycle/spawn-sidecar.js +59 -145
  31. package/dist/lifecycle/spawn-sidecar.js.map +1 -1
  32. package/dist/lifecycle/terminate-process.d.ts +1 -0
  33. package/dist/lifecycle/terminate-process.js +34 -0
  34. package/dist/lifecycle/terminate-process.js.map +1 -0
  35. package/dist/logging/log-buffer.d.ts +0 -6
  36. package/dist/logging/log-buffer.js +0 -1
  37. package/dist/logging/log-buffer.js.map +1 -1
  38. package/dist/pages/activity/columns.d.ts +2 -0
  39. package/dist/pages/activity/columns.js +103 -0
  40. package/dist/pages/activity/columns.js.map +1 -0
  41. package/dist/pages/activity/page.d.ts +1 -2
  42. package/dist/pages/activity/page.js +79 -44
  43. package/dist/pages/activity/page.js.map +1 -1
  44. package/dist/pages/all.d.ts +1 -0
  45. package/dist/pages/all.js +1 -0
  46. package/dist/pages/all.js.map +1 -1
  47. package/dist/pages/changes/page.d.ts +9 -0
  48. package/dist/pages/changes/page.js +22 -0
  49. package/dist/pages/changes/page.js.map +1 -0
  50. package/dist/pages/meta.d.ts +9 -0
  51. package/dist/pages/meta.js +31 -0
  52. package/dist/pages/meta.js.map +1 -0
  53. package/dist/pages/module.js +9 -5
  54. package/dist/pages/module.js.map +1 -1
  55. package/dist/pages/overview/insights.d.ts +3 -0
  56. package/dist/pages/overview/insights.js +77 -0
  57. package/dist/pages/overview/insights.js.map +1 -0
  58. package/dist/pages/overview/kpis.d.ts +2 -0
  59. package/dist/pages/overview/kpis.js +39 -0
  60. package/dist/pages/overview/kpis.js.map +1 -0
  61. package/dist/pages/overview/page.d.ts +6 -3
  62. package/dist/pages/overview/page.js +19 -62
  63. package/dist/pages/overview/page.js.map +1 -1
  64. package/dist/pages/overview/recent-changes.d.ts +2 -0
  65. package/dist/pages/overview/recent-changes.js +144 -0
  66. package/dist/pages/overview/recent-changes.js.map +1 -0
  67. package/dist/pages/overview/status.d.ts +3 -0
  68. package/dist/pages/overview/status.js +36 -0
  69. package/dist/pages/overview/status.js.map +1 -0
  70. package/dist/pages/settings/availability.d.ts +2 -0
  71. package/dist/pages/settings/availability.js +46 -0
  72. package/dist/pages/settings/availability.js.map +1 -0
  73. package/dist/pages/settings/options.d.ts +10 -0
  74. package/dist/pages/settings/options.js +58 -0
  75. package/dist/pages/settings/options.js.map +1 -0
  76. package/dist/pages/settings/page.d.ts +2 -1
  77. package/dist/pages/settings/page.js +39 -13
  78. package/dist/pages/settings/page.js.map +1 -1
  79. package/dist/pages/settings/sections.d.ts +2 -0
  80. package/dist/pages/settings/sections.js +164 -0
  81. package/dist/pages/settings/sections.js.map +1 -0
  82. package/dist/pages/skills/page.d.ts +2 -1
  83. package/dist/pages/skills/page.js +122 -12
  84. package/dist/pages/skills/page.js.map +1 -1
  85. package/dist/routes/activity-csv.d.ts +2 -0
  86. package/dist/routes/activity-csv.js +42 -0
  87. package/dist/routes/activity-csv.js.map +1 -0
  88. package/dist/routes/activity.d.ts +8 -0
  89. package/dist/routes/activity.js +105 -0
  90. package/dist/routes/activity.js.map +1 -0
  91. package/dist/routes/actor.d.ts +2 -0
  92. package/dist/routes/actor.js +8 -0
  93. package/dist/routes/actor.js.map +1 -0
  94. package/dist/routes/banner.d.ts +3 -0
  95. package/dist/routes/banner.js +9 -0
  96. package/dist/routes/banner.js.map +1 -0
  97. package/dist/routes/builder.js +1 -5
  98. package/dist/routes/builder.js.map +1 -1
  99. package/dist/routes/changes.d.ts +17 -0
  100. package/dist/routes/changes.js +152 -0
  101. package/dist/routes/changes.js.map +1 -0
  102. package/dist/routes/channels.js +2 -1
  103. package/dist/routes/channels.js.map +1 -1
  104. package/dist/routes/index.d.ts +3 -0
  105. package/dist/routes/index.js +3 -0
  106. package/dist/routes/index.js.map +1 -1
  107. package/dist/routes/list-query.d.ts +9 -0
  108. package/dist/routes/list-query.js +34 -0
  109. package/dist/routes/list-query.js.map +1 -0
  110. package/dist/routes/metric-shapes.d.ts +8 -0
  111. package/dist/routes/metric-shapes.js +107 -0
  112. package/dist/routes/metric-shapes.js.map +1 -0
  113. package/dist/routes/metrics.d.ts +5 -48
  114. package/dist/routes/metrics.js +52 -42
  115. package/dist/routes/metrics.js.map +1 -1
  116. package/dist/routes/settings.d.ts +3 -16
  117. package/dist/routes/settings.js +40 -14
  118. package/dist/routes/settings.js.map +1 -1
  119. package/dist/routes/sidecar-results.d.ts +6 -0
  120. package/dist/routes/sidecar-results.js +44 -0
  121. package/dist/routes/sidecar-results.js.map +1 -0
  122. package/dist/routes/skills.d.ts +4 -14
  123. package/dist/routes/skills.js +91 -6
  124. package/dist/routes/skills.js.map +1 -1
  125. package/dist/routes/status-shapes.d.ts +5 -0
  126. package/dist/routes/status-shapes.js +176 -0
  127. package/dist/routes/status-shapes.js.map +1 -0
  128. package/dist/routes/status.d.ts +9 -0
  129. package/dist/routes/status.js +92 -0
  130. package/dist/routes/status.js.map +1 -0
  131. package/dist/routes/undo-confirm.d.ts +3 -0
  132. package/dist/routes/undo-confirm.js +51 -0
  133. package/dist/routes/undo-confirm.js.map +1 -0
  134. package/dist/sidecar/http-client.d.ts +11 -0
  135. package/dist/sidecar/http-client.js +59 -0
  136. package/dist/sidecar/http-client.js.map +1 -0
  137. package/dist/sidecar/index.d.ts +2 -0
  138. package/dist/sidecar/index.js +19 -0
  139. package/dist/sidecar/index.js.map +1 -0
  140. package/dist/sidecar/query.d.ts +3 -0
  141. package/dist/sidecar/query.js +25 -0
  142. package/dist/sidecar/query.js.map +1 -0
  143. package/dist/types/activity.d.ts +31 -0
  144. package/dist/types/activity.js +3 -0
  145. package/dist/types/activity.js.map +1 -0
  146. package/dist/types/changes.d.ts +45 -0
  147. package/dist/types/changes.js +3 -0
  148. package/dist/types/changes.js.map +1 -0
  149. package/dist/types/index.d.ts +5 -0
  150. package/dist/types/index.js +5 -0
  151. package/dist/types/index.js.map +1 -1
  152. package/dist/types/metrics.d.ts +76 -0
  153. package/dist/types/metrics.js +3 -0
  154. package/dist/types/metrics.js.map +1 -0
  155. package/dist/types/skills.d.ts +51 -0
  156. package/dist/types/skills.js +3 -0
  157. package/dist/types/skills.js.map +1 -0
  158. package/dist/types/status.d.ts +16 -0
  159. package/dist/types/status.js +3 -0
  160. package/dist/types/status.js.map +1 -0
  161. package/dist/vocabulary/enumerations.d.ts +9 -0
  162. package/dist/vocabulary/enumerations.js +52 -0
  163. package/dist/vocabulary/enumerations.js.map +1 -0
  164. package/dist/vocabulary/index.d.ts +5 -0
  165. package/dist/vocabulary/index.js +22 -0
  166. package/dist/vocabulary/index.js.map +1 -0
  167. package/dist/vocabulary/keys.d.ts +1 -0
  168. package/dist/vocabulary/keys.js +8 -0
  169. package/dist/vocabulary/keys.js.map +1 -0
  170. package/dist/vocabulary/options.d.ts +7 -0
  171. package/dist/vocabulary/options.js +33 -0
  172. package/dist/vocabulary/options.js.map +1 -0
  173. package/dist/vocabulary/tools.d.ts +7 -0
  174. package/dist/vocabulary/tools.js +99 -0
  175. package/dist/vocabulary/tools.js.map +1 -0
  176. package/dist/vocabulary/types.d.ts +20 -0
  177. package/dist/vocabulary/types.js +3 -0
  178. package/dist/vocabulary/types.js.map +1 -0
  179. package/frontend-vue/app/chat/components/AnswerRecord.vue +95 -0
  180. package/frontend-vue/app/chat/components/ApprovalDock.vue +371 -0
  181. package/frontend-vue/app/chat/components/ChangeSetCard.vue +297 -0
  182. package/frontend-vue/app/chat/components/ChatEmpty.vue +142 -0
  183. package/frontend-vue/app/chat/components/ChatView.vue +664 -406
  184. package/frontend-vue/app/chat/components/Composer.vue +589 -0
  185. package/frontend-vue/app/chat/components/ConnectionBanner.vue +41 -65
  186. package/frontend-vue/app/chat/components/ConversationDrawer.vue +387 -177
  187. package/frontend-vue/app/chat/components/DiffView.vue +131 -0
  188. package/frontend-vue/app/chat/components/FullAutoBanner.vue +76 -0
  189. package/frontend-vue/app/chat/components/FullAutoDialog.vue +103 -0
  190. package/frontend-vue/app/chat/components/MarkdownContent.vue +15 -15
  191. package/frontend-vue/app/chat/components/MessageList.vue +389 -295
  192. package/frontend-vue/app/chat/components/NoticeCard.vue +193 -0
  193. package/frontend-vue/app/chat/components/PanelHeader.vue +242 -0
  194. package/frontend-vue/app/chat/components/PermissionCard.vue +470 -0
  195. package/frontend-vue/app/chat/components/PlanCard.vue +115 -0
  196. package/frontend-vue/app/chat/components/QuestionDock.vue +407 -0
  197. package/frontend-vue/app/chat/components/QueueDock.vue +310 -0
  198. package/frontend-vue/app/chat/components/RulesList.vue +97 -0
  199. package/frontend-vue/app/chat/components/StepsDock.vue +181 -0
  200. package/frontend-vue/app/chat/components/ToolCluster.vue +186 -178
  201. package/frontend-vue/app/chat/components/ToolRow.vue +251 -0
  202. package/frontend-vue/app/chat/components/TurnErrorCard.vue +135 -0
  203. package/frontend-vue/app/chat/composables/conversation-events.ts +404 -0
  204. package/frontend-vue/app/chat/composables/useChangeSetActions.ts +135 -0
  205. package/frontend-vue/app/chat/composables/useChatChannel.ts +11 -3
  206. package/frontend-vue/app/chat/composables/useChatI18n.ts +35 -0
  207. package/frontend-vue/app/chat/composables/useComposerAttachments.ts +111 -0
  208. package/frontend-vue/app/chat/composables/useConversation.ts +149 -651
  209. package/frontend-vue/app/chat/composables/useConversationId.ts +2 -10
  210. package/frontend-vue/app/chat/composables/useConversationList.ts +77 -21
  211. package/frontend-vue/app/chat/composables/useConversationMode.ts +73 -0
  212. package/frontend-vue/app/chat/composables/usePaletteTurn.ts +124 -0
  213. package/frontend-vue/app/chat/composables/usePermissionQueue.ts +211 -34
  214. package/frontend-vue/app/chat/composables/useQuestionQueue.ts +103 -21
  215. package/frontend-vue/app/chat/composables/useQueueActions.ts +55 -0
  216. package/frontend-vue/app/chat/composables/useSettings.ts +17 -34
  217. package/frontend-vue/app/chat/constants/attachments.ts +2 -1
  218. package/frontend-vue/app/chat/constants/conversation.ts +18 -32
  219. package/frontend-vue/app/chat/constants/protocol.ts +25 -2
  220. package/frontend-vue/app/chat/constants/run-status.ts +8 -14
  221. package/frontend-vue/app/chat/constants/settings.ts +5 -47
  222. package/frontend-vue/app/chat/types/conversation.ts +72 -2
  223. package/frontend-vue/app/chat/types/permission.ts +31 -0
  224. package/frontend-vue/app/chat/types/protocol.ts +226 -0
  225. package/frontend-vue/app/chat/types/question.ts +10 -1
  226. package/frontend-vue/app/chat/types/settings.ts +9 -5
  227. package/frontend-vue/app/chat/utils/approval-keyboard.ts +49 -0
  228. package/frontend-vue/app/chat/utils/arrays.ts +10 -0
  229. package/frontend-vue/app/chat/utils/conversation-groups.ts +96 -0
  230. package/frontend-vue/app/chat/utils/conversation-messages.ts +251 -0
  231. package/frontend-vue/app/chat/utils/diff.ts +78 -0
  232. package/frontend-vue/app/chat/utils/format.ts +43 -0
  233. package/frontend-vue/app/chat/utils/markdown.ts +1 -1
  234. package/frontend-vue/app/chat/utils/permission-view.ts +159 -0
  235. package/frontend-vue/app/chat/utils/platform.ts +34 -0
  236. package/frontend-vue/app/chat/utils/queue.ts +18 -0
  237. package/frontend-vue/app/chat/utils/render-items.ts +164 -0
  238. package/frontend-vue/app/chat/utils/run-status.ts +19 -23
  239. package/frontend-vue/app/chat/utils/suggestions.ts +101 -0
  240. package/frontend-vue/app/chat/utils/todos.ts +2 -2
  241. package/frontend-vue/app/chat/utils/tool-lexicon.ts +540 -0
  242. package/frontend-vue/app/chat/utils/tool-state.ts +60 -0
  243. package/frontend-vue/app/components/ActivityDetail.vue +235 -0
  244. package/frontend-vue/app/components/ChangesView.vue +249 -0
  245. package/frontend-vue/app/components/ChatPanel.vue +141 -196
  246. package/frontend-vue/app/components/PaletteAnswer.vue +185 -0
  247. package/frontend-vue/app/components/SkillCard.vue +77 -0
  248. package/frontend-vue/app/components/SkillDetail.vue +188 -0
  249. package/frontend-vue/app/plugins/ai.client.ts +349 -57
  250. package/frontend-vue/app/plugins/side-panel.ts +13 -0
  251. package/frontend-vue/app/runtime/assistant-activity.ts +105 -0
  252. package/frontend-vue/app/runtime/assistant-commands.ts +210 -0
  253. package/frontend-vue/app/runtime/assistant-notifications.ts +181 -0
  254. package/frontend-vue/app/runtime/assistant-session.ts +49 -6
  255. package/frontend-vue/app/runtime/channel-client.ts +3 -6
  256. package/frontend-vue/app/runtime/constants.ts +29 -35
  257. package/frontend-vue/app/runtime/host-commands.ts +4 -4
  258. package/frontend-vue/app/runtime/listeners.ts +1 -1
  259. package/frontend-vue/app/runtime/navigation-complete.ts +1 -1
  260. package/frontend-vue/app/runtime/panel-intents.ts +55 -0
  261. package/frontend-vue/app/runtime/shortcuts.ts +3 -1
  262. package/frontend-vue/app/runtime/sidecar-status.ts +9 -1
  263. package/frontend-vue/app/runtime/stream-holds.ts +24 -0
  264. package/frontend-vue/app/views/ChangeSetPanel.vue +222 -0
  265. package/frontend-vue/app/views/DecisionLabel.vue +30 -0
  266. package/frontend-vue/app/views/DiffView.vue +215 -0
  267. package/frontend-vue/app/views/ResultPill.vue +32 -0
  268. package/frontend-vue/app/views/RowStepper.vue +48 -0
  269. package/frontend-vue/app/views/UnavailableState.vue +66 -0
  270. package/frontend-vue/app/views/composables/useAiRequest.ts +89 -0
  271. package/frontend-vue/app/views/composables/useAssistant.ts +33 -0
  272. package/frontend-vue/app/views/composables/useChangeSetActions.ts +102 -0
  273. package/frontend-vue/app/views/composables/useViewFormat.ts +55 -0
  274. package/frontend-vue/app/views/constants.ts +43 -0
  275. package/frontend-vue/app/views/types.ts +189 -0
  276. package/frontend-vue/app/views/utils/activity.ts +77 -0
  277. package/frontend-vue/app/views/utils/change-sets.ts +44 -0
  278. package/frontend-vue/app/views/utils/diff.ts +98 -0
  279. package/frontend-vue/app/views/utils/moment.ts +92 -0
  280. package/frontend-vue/app/views/utils/skills.ts +27 -0
  281. package/frontend-vue/app/views/utils/tools.ts +73 -0
  282. package/frontend-vue/dms.frontend.ts +17 -5
  283. package/frontend-vue/i18n/locales/dms-ai-pages-en-GB.json +607 -0
  284. package/frontend-vue/i18n/locales/dms-ai-pages-fr-FR.json +607 -0
  285. package/frontend-vue/i18n/locales/dms-ai-panel-en-GB.json +425 -0
  286. package/frontend-vue/i18n/locales/dms-ai-panel-fr-FR.json +425 -0
  287. package/frontend-vue/i18n/locales/dms-ai-views-en-GB.json +142 -0
  288. package/frontend-vue/i18n/locales/dms-ai-views-fr-FR.json +142 -0
  289. package/frontend-vue/package.json +1 -1
  290. package/frontend-vue/tests/chat/conversation-events.test.ts +590 -0
  291. package/frontend-vue/tests/chat/diff-and-keys.test.ts +178 -0
  292. package/frontend-vue/tests/chat/tool-lexicon.test.ts +188 -0
  293. package/frontend-vue/tests/chat/useConversation.test.ts +36 -33
  294. package/frontend-vue/tests/chat-panel.test.ts +78 -131
  295. package/frontend-vue/tests/i18n-panel.test.ts +118 -0
  296. package/frontend-vue/tests/palette-assistant.test.ts +220 -0
  297. package/frontend-vue/tests/panel-states.test.ts +806 -0
  298. package/frontend-vue/tests/sidecar-guest.test.ts +35 -3
  299. package/frontend-vue/tests/support/i18n.ts +49 -0
  300. package/frontend-vue/tests/support/panel-harness.ts +198 -0
  301. package/frontend-vue/tests/support/stubs.ts +201 -0
  302. package/frontend-vue/tests/views/diff-view.test.ts +149 -0
  303. package/frontend-vue/tests/views/view-format.test.ts +59 -0
  304. package/package.json +5 -3
  305. package/sidecar/dist/agent/attachment-files.d.ts +0 -1
  306. package/sidecar/dist/agent/attachment-files.js +1 -1
  307. package/sidecar/dist/agent/attachment-files.js.map +1 -1
  308. package/sidecar/dist/agent/call-ledger.d.ts +6 -0
  309. package/sidecar/dist/agent/call-ledger.js +41 -0
  310. package/sidecar/dist/agent/call-ledger.js.map +1 -0
  311. package/sidecar/dist/agent/command-analysis.d.ts +9 -0
  312. package/sidecar/dist/agent/command-analysis.js +104 -0
  313. package/sidecar/dist/agent/command-analysis.js.map +1 -0
  314. package/sidecar/dist/agent/conversation-modes.d.ts +32 -0
  315. package/sidecar/dist/agent/conversation-modes.js +122 -0
  316. package/sidecar/dist/agent/conversation-modes.js.map +1 -0
  317. package/sidecar/dist/agent/edit-targets.d.ts +5 -0
  318. package/sidecar/dist/agent/edit-targets.js +41 -0
  319. package/sidecar/dist/agent/edit-targets.js.map +1 -0
  320. package/sidecar/dist/agent/effective-mode.d.ts +9 -2
  321. package/sidecar/dist/agent/effective-mode.js +14 -16
  322. package/sidecar/dist/agent/effective-mode.js.map +1 -1
  323. package/sidecar/dist/agent/host-context.js +2 -2
  324. package/sidecar/dist/agent/host-context.js.map +1 -1
  325. package/sidecar/dist/agent/line-diff.d.ts +8 -0
  326. package/sidecar/dist/agent/line-diff.js +204 -0
  327. package/sidecar/dist/agent/line-diff.js.map +1 -0
  328. package/sidecar/dist/agent/permission-bus.d.ts +55 -10
  329. package/sidecar/dist/agent/permission-bus.js +130 -100
  330. package/sidecar/dist/agent/permission-bus.js.map +1 -1
  331. package/sidecar/dist/agent/permission-preview.d.ts +20 -0
  332. package/sidecar/dist/agent/permission-preview.js +203 -0
  333. package/sidecar/dist/agent/permission-preview.js.map +1 -0
  334. package/sidecar/dist/agent/permission-rules.d.ts +17 -0
  335. package/sidecar/dist/agent/permission-rules.js +95 -0
  336. package/sidecar/dist/agent/permission-rules.js.map +1 -0
  337. package/sidecar/dist/agent/provider.d.ts +12 -4
  338. package/sidecar/dist/agent/question-bus.d.ts +14 -2
  339. package/sidecar/dist/agent/question-bus.js +30 -11
  340. package/sidecar/dist/agent/question-bus.js.map +1 -1
  341. package/sidecar/dist/agent/runner-events.d.ts +3 -1
  342. package/sidecar/dist/agent/runner.d.ts +6 -4
  343. package/sidecar/dist/agent/runner.js +24 -7
  344. package/sidecar/dist/agent/runner.js.map +1 -1
  345. package/sidecar/dist/agent/switching-runner.js +1 -0
  346. package/sidecar/dist/agent/switching-runner.js.map +1 -1
  347. package/sidecar/dist/agent/tool-kinds.d.ts +12 -0
  348. package/sidecar/dist/agent/tool-kinds.js +50 -0
  349. package/sidecar/dist/agent/tool-kinds.js.map +1 -0
  350. package/sidecar/dist/agent/typecheck.d.ts +2 -6
  351. package/sidecar/dist/audit/activity-query.d.ts +37 -0
  352. package/sidecar/dist/audit/activity-query.js +111 -0
  353. package/sidecar/dist/audit/activity-query.js.map +1 -0
  354. package/sidecar/dist/audit/activity-target.d.ts +2 -0
  355. package/sidecar/dist/audit/activity-target.js +46 -0
  356. package/sidecar/dist/audit/activity-target.js.map +1 -0
  357. package/sidecar/dist/audit/activity.d.ts +45 -0
  358. package/sidecar/dist/audit/activity.js +255 -0
  359. package/sidecar/dist/audit/activity.js.map +1 -0
  360. package/sidecar/dist/audit/call-audit.d.ts +11 -0
  361. package/sidecar/dist/audit/call-audit.js +23 -0
  362. package/sidecar/dist/audit/call-audit.js.map +1 -0
  363. package/sidecar/dist/checkpoints/checkpoints.d.ts +69 -0
  364. package/sidecar/dist/checkpoints/checkpoints.js +244 -0
  365. package/sidecar/dist/checkpoints/checkpoints.js.map +1 -0
  366. package/sidecar/dist/checkpoints/shadow-git.d.ts +23 -0
  367. package/sidecar/dist/checkpoints/shadow-git.js +173 -0
  368. package/sidecar/dist/checkpoints/shadow-git.js.map +1 -0
  369. package/sidecar/dist/constants/agent.d.ts +2 -0
  370. package/sidecar/dist/constants/agent.js +4 -0
  371. package/sidecar/dist/constants/agent.js.map +1 -1
  372. package/sidecar/dist/constants/audit.d.ts +22 -0
  373. package/sidecar/dist/constants/audit.js +49 -0
  374. package/sidecar/dist/constants/audit.js.map +1 -0
  375. package/sidecar/dist/constants/builder.d.ts +3 -0
  376. package/sidecar/dist/constants/builder.js +2 -0
  377. package/sidecar/dist/constants/builder.js.map +1 -1
  378. package/sidecar/dist/constants/checkpoints.d.ts +15 -0
  379. package/sidecar/dist/constants/checkpoints.js +26 -0
  380. package/sidecar/dist/constants/checkpoints.js.map +1 -0
  381. package/sidecar/dist/constants/claude.d.ts +1 -0
  382. package/sidecar/dist/constants/claude.js +1 -0
  383. package/sidecar/dist/constants/claude.js.map +1 -1
  384. package/sidecar/dist/constants/codex.d.ts +2 -4
  385. package/sidecar/dist/constants/codex.js +2 -4
  386. package/sidecar/dist/constants/codex.js.map +1 -1
  387. package/sidecar/dist/constants/http.d.ts +1 -0
  388. package/sidecar/dist/constants/http.js +1 -0
  389. package/sidecar/dist/constants/http.js.map +1 -1
  390. package/sidecar/dist/constants/mcp.d.ts +3 -0
  391. package/sidecar/dist/constants/mcp.js +9 -0
  392. package/sidecar/dist/constants/mcp.js.map +1 -1
  393. package/sidecar/dist/constants/permissions.d.ts +9 -3
  394. package/sidecar/dist/constants/permissions.js +9 -2
  395. package/sidecar/dist/constants/permissions.js.map +1 -1
  396. package/sidecar/dist/constants/settings.d.ts +2 -1
  397. package/sidecar/dist/constants/settings.js +7 -1
  398. package/sidecar/dist/constants/settings.js.map +1 -1
  399. package/sidecar/dist/constants/tool-kinds.d.ts +14 -0
  400. package/sidecar/dist/constants/tool-kinds.js +65 -0
  401. package/sidecar/dist/constants/tool-kinds.js.map +1 -0
  402. package/sidecar/dist/index.d.ts +4 -0
  403. package/sidecar/dist/index.js +35 -5
  404. package/sidecar/dist/index.js.map +1 -1
  405. package/sidecar/dist/mcp/define-tool.d.ts +3 -2
  406. package/sidecar/dist/mcp/tool-definitions.js +4 -1
  407. package/sidecar/dist/mcp/tool-definitions.js.map +1 -1
  408. package/sidecar/dist/mcp/tools/ask-user.d.ts +2 -2
  409. package/sidecar/dist/mcp/tools/ask-user.js +7 -4
  410. package/sidecar/dist/mcp/tools/ask-user.js.map +1 -1
  411. package/sidecar/dist/mcp/tools/builder-catalog.d.ts +3 -0
  412. package/sidecar/dist/mcp/tools/builder-catalog.js +86 -0
  413. package/sidecar/dist/mcp/tools/builder-catalog.js.map +1 -0
  414. package/sidecar/dist/mcp/tools/builder-gate.d.ts +8 -0
  415. package/sidecar/dist/mcp/tools/builder-gate.js +22 -0
  416. package/sidecar/dist/mcp/tools/builder-gate.js.map +1 -0
  417. package/sidecar/dist/mcp/tools/builder.d.ts +7 -2
  418. package/sidecar/dist/mcp/tools/builder.js +48 -7
  419. package/sidecar/dist/mcp/tools/builder.js.map +1 -1
  420. package/sidecar/dist/mcp/types.d.ts +2 -0
  421. package/sidecar/dist/metrics/aggregate.d.ts +13 -10
  422. package/sidecar/dist/metrics/aggregate.js +140 -143
  423. package/sidecar/dist/metrics/aggregate.js.map +1 -1
  424. package/sidecar/dist/metrics/types.d.ts +36 -23
  425. package/sidecar/dist/metrics/types.js +3 -1
  426. package/sidecar/dist/metrics/types.js.map +1 -1
  427. package/sidecar/dist/pages/imports-scanner.d.ts +1 -1
  428. package/sidecar/dist/pages/imports-scanner.js +2 -5
  429. package/sidecar/dist/pages/imports-scanner.js.map +1 -1
  430. package/sidecar/dist/prompts/agent.d.ts +1 -3
  431. package/sidecar/dist/prompts/agent.js +4 -4
  432. package/sidecar/dist/prompts/agent.js.map +1 -1
  433. package/sidecar/dist/prompts/builder.d.ts +2 -2
  434. package/sidecar/dist/prompts/builder.js +2 -2
  435. package/sidecar/dist/protocol/events.d.ts +1084 -18
  436. package/sidecar/dist/protocol/events.js +239 -5
  437. package/sidecar/dist/protocol/events.js.map +1 -1
  438. package/sidecar/dist/protocol/messages.d.ts +273 -19
  439. package/sidecar/dist/protocol/messages.js +107 -7
  440. package/sidecar/dist/protocol/messages.js.map +1 -1
  441. package/sidecar/dist/providers/claude/config.d.ts +3 -2
  442. package/sidecar/dist/providers/claude/config.js +10 -4
  443. package/sidecar/dist/providers/claude/config.js.map +1 -1
  444. package/sidecar/dist/providers/claude/provider.d.ts +2 -8
  445. package/sidecar/dist/providers/claude/provider.js +37 -35
  446. package/sidecar/dist/providers/claude/provider.js.map +1 -1
  447. package/sidecar/dist/providers/claude/safe-mode.d.ts +6 -1
  448. package/sidecar/dist/providers/claude/safe-mode.js +13 -5
  449. package/sidecar/dist/providers/claude/safe-mode.js.map +1 -1
  450. package/sidecar/dist/providers/codex/adapter.d.ts +6 -0
  451. package/sidecar/dist/providers/codex/adapter.js +14 -4
  452. package/sidecar/dist/providers/codex/adapter.js.map +1 -1
  453. package/sidecar/dist/providers/codex/client.d.ts +0 -11
  454. package/sidecar/dist/providers/codex/config.d.ts +1 -3
  455. package/sidecar/dist/providers/codex/config.js +5 -11
  456. package/sidecar/dist/providers/codex/config.js.map +1 -1
  457. package/sidecar/dist/providers/codex/permissions.d.ts +7 -4
  458. package/sidecar/dist/providers/codex/permissions.js +32 -16
  459. package/sidecar/dist/providers/codex/permissions.js.map +1 -1
  460. package/sidecar/dist/providers/codex/process.js +1 -5
  461. package/sidecar/dist/providers/codex/process.js.map +1 -1
  462. package/sidecar/dist/providers/codex/provider.js +14 -3
  463. package/sidecar/dist/providers/codex/provider.js.map +1 -1
  464. package/sidecar/dist/providers/codex/skills.d.ts +0 -1
  465. package/sidecar/dist/providers/codex/skills.js +1 -1
  466. package/sidecar/dist/providers/codex/skills.js.map +1 -1
  467. package/sidecar/dist/providers/codex/stop.js +1 -10
  468. package/sidecar/dist/providers/codex/stop.js.map +1 -1
  469. package/sidecar/dist/server/change-set-actions.d.ts +10 -0
  470. package/sidecar/dist/server/change-set-actions.js +14 -0
  471. package/sidecar/dist/server/change-set-actions.js.map +1 -0
  472. package/sidecar/dist/server/chat-events.d.ts +15 -0
  473. package/sidecar/dist/server/chat-events.js +115 -0
  474. package/sidecar/dist/server/chat-events.js.map +1 -0
  475. package/sidecar/dist/server/chat-socket-registry.d.ts +2 -0
  476. package/sidecar/dist/server/chat-socket-registry.js +48 -37
  477. package/sidecar/dist/server/chat-socket-registry.js.map +1 -1
  478. package/sidecar/dist/server/conversation-runs.d.ts +13 -0
  479. package/sidecar/dist/server/conversation-runs.js +114 -0
  480. package/sidecar/dist/server/conversation-runs.js.map +1 -0
  481. package/sidecar/dist/server/http-io.d.ts +4 -0
  482. package/sidecar/dist/server/http-io.js +31 -0
  483. package/sidecar/dist/server/http-io.js.map +1 -0
  484. package/sidecar/dist/server/http-params.d.ts +9 -0
  485. package/sidecar/dist/server/http-params.js +79 -0
  486. package/sidecar/dist/server/http-params.js.map +1 -0
  487. package/sidecar/dist/server/http-routes.d.ts +27 -0
  488. package/sidecar/dist/server/http-routes.js +281 -0
  489. package/sidecar/dist/server/http-routes.js.map +1 -0
  490. package/sidecar/dist/server/http.d.ts +6 -1
  491. package/sidecar/dist/server/http.js +76 -164
  492. package/sidecar/dist/server/http.js.map +1 -1
  493. package/sidecar/dist/server/pending-queue.d.ts +2 -0
  494. package/sidecar/dist/server/pending-queue.js +16 -0
  495. package/sidecar/dist/server/pending-queue.js.map +1 -1
  496. package/sidecar/dist/server/permission-events.d.ts +15 -0
  497. package/sidecar/dist/server/permission-events.js +163 -0
  498. package/sidecar/dist/server/permission-events.js.map +1 -0
  499. package/sidecar/dist/server/routing.d.ts +4 -52
  500. package/sidecar/dist/server/routing.js +190 -501
  501. package/sidecar/dist/server/routing.js.map +1 -1
  502. package/sidecar/dist/server/safety-net.d.ts +7 -0
  503. package/sidecar/dist/server/safety-net.js +34 -6
  504. package/sidecar/dist/server/safety-net.js.map +1 -1
  505. package/sidecar/dist/server/services.d.ts +55 -0
  506. package/sidecar/dist/server/services.js +2 -0
  507. package/sidecar/dist/server/services.js.map +1 -0
  508. package/sidecar/dist/server/tool-calls.d.ts +6 -0
  509. package/sidecar/dist/server/tool-calls.js +134 -0
  510. package/sidecar/dist/server/tool-calls.js.map +1 -0
  511. package/sidecar/dist/server/turn-registry.d.ts +44 -0
  512. package/sidecar/dist/server/turn-registry.js +40 -0
  513. package/sidecar/dist/server/turn-registry.js.map +1 -0
  514. package/sidecar/dist/server/turns.d.ts +17 -0
  515. package/sidecar/dist/server/turns.js +335 -0
  516. package/sidecar/dist/server/turns.js.map +1 -0
  517. package/sidecar/dist/server/ws.d.ts +4 -1
  518. package/sidecar/dist/server/ws.js +102 -62
  519. package/sidecar/dist/server/ws.js.map +1 -1
  520. package/sidecar/dist/skills/build-catalog.d.ts +1 -0
  521. package/sidecar/dist/skills/build-catalog.js +14 -1
  522. package/sidecar/dist/skills/build-catalog.js.map +1 -1
  523. package/sidecar/dist/skills/skill-usage.d.ts +22 -0
  524. package/sidecar/dist/skills/skill-usage.js +97 -0
  525. package/sidecar/dist/skills/skill-usage.js.map +1 -0
  526. package/sidecar/dist/state/change-sets.d.ts +12 -0
  527. package/sidecar/dist/state/change-sets.js +77 -0
  528. package/sidecar/dist/state/change-sets.js.map +1 -0
  529. package/sidecar/dist/state/conversations.d.ts +19 -7
  530. package/sidecar/dist/state/conversations.js +61 -20
  531. package/sidecar/dist/state/conversations.js.map +1 -1
  532. package/sidecar/dist/state/host-state.d.ts +2 -1
  533. package/sidecar/dist/state/settings-store.d.ts +1 -0
  534. package/sidecar/dist/state/settings-store.js +27 -26
  535. package/sidecar/dist/state/settings-store.js.map +1 -1
  536. package/sidecar/dist/state/settings-types.d.ts +11 -1
  537. package/sidecar/dist/state/settings-types.js +3 -1
  538. package/sidecar/dist/state/settings-types.js.map +1 -1
  539. package/sidecar/dist/state/types.d.ts +114 -8
  540. package/sidecar/dist/state/types.js +6 -3
  541. package/sidecar/dist/state/types.js.map +1 -1
  542. package/skills/dms-builder-safe/REFERENCE.md +1 -1
  543. package/skills/dms-builder-safe/SKILL.md +12 -7
  544. package/dist/routes/proxy.d.ts +0 -4
  545. package/dist/routes/proxy.js +0 -55
  546. package/dist/routes/proxy.js.map +0 -1
  547. package/frontend-vue/app/chat/components/ComposerInput.vue +0 -742
  548. package/frontend-vue/app/chat/components/PermissionRequests.vue +0 -323
  549. package/frontend-vue/app/chat/components/QuestionPrompt.vue +0 -275
  550. package/frontend-vue/app/chat/components/QueuedMessages.vue +0 -109
  551. package/frontend-vue/app/chat/components/TodoList.vue +0 -291
  552. package/frontend-vue/app/chat/components/ToolCallEntry.vue +0 -218
  553. package/frontend-vue/app/chat/constants/connection-banner.ts +0 -7
  554. package/frontend-vue/app/chat/constants/conversation-drawer.ts +0 -13
  555. package/frontend-vue/app/chat/constants/permissions.ts +0 -50
  556. package/frontend-vue/app/chat/utils/tool-summary.ts +0 -53
  557. package/frontend-vue/app/components/ActivityView.vue +0 -94
  558. package/frontend-vue/app/components/SettingsView.vue +0 -387
  559. package/frontend-vue/app/components/SkillsView.vue +0 -230
  560. package/frontend-vue/app/runtime/header-action.ts +0 -64
  561. package/frontend-vue/app/runtime/overlay-prefs.ts +0 -89
  562. package/frontend-vue/app/runtime/panel-state.ts +0 -88
  563. package/frontend-vue/tests/overlay-prefs.test.ts +0 -91
  564. package/frontend-vue/tests/panel-state.test.ts +0 -58
@@ -0,0 +1,89 @@
1
+ import { ref, shallowRef, type Ref, type ShallowRef } from "vue";
2
+ import { HTTP_SERVICE_UNAVAILABLE } from "../constants";
3
+
4
+ /** Why a request failed: the sidecar is down (503), or anything else. */
5
+ export type RequestFailure = "unavailable" | "error";
6
+
7
+ export interface AiRequest<T> {
8
+ data: ShallowRef<T | null>;
9
+ isLoading: Ref<boolean>;
10
+ failure: Ref<RequestFailure | null>;
11
+ message: Ref<string>;
12
+ /**
13
+ * Runs `fetcher`, keeping the previous data while it loads; a run that a
14
+ * later one overtook is dropped.
15
+ */
16
+ run: (fetcher: () => Promise<T>) => Promise<T | null>;
17
+ }
18
+
19
+ interface FetchErrorResponse {
20
+ status?: number;
21
+ }
22
+
23
+ interface FetchErrorBody {
24
+ message?: unknown;
25
+ }
26
+
27
+ interface FetchErrorLike {
28
+ status?: number;
29
+ statusCode?: number;
30
+ response?: FetchErrorResponse;
31
+ data?: FetchErrorBody;
32
+ message?: string;
33
+ }
34
+
35
+ /** The HTTP status of a `$authFetch` rejection, if it got an answer. */
36
+ function errorStatus(error: unknown): number | undefined {
37
+ const candidate = error as FetchErrorLike | null;
38
+ return (
39
+ candidate?.status ?? candidate?.statusCode ?? candidate?.response?.status
40
+ );
41
+ }
42
+
43
+ /** The server's `{ message }`, else the error's own text. */
44
+ export function errorMessage(error: unknown): string {
45
+ const candidate = error as FetchErrorLike | null;
46
+ const serverMessage = candidate?.data?.message;
47
+ if (typeof serverMessage === "string") return serverMessage;
48
+ return candidate?.message ?? String(error);
49
+ }
50
+
51
+ export function classifyFailure(error: unknown): RequestFailure {
52
+ return errorStatus(error) === HTTP_SERVICE_UNAVAILABLE
53
+ ? "unavailable"
54
+ : "error";
55
+ }
56
+
57
+ /**
58
+ * One request's state for a view: its data, whether it loads, and whether a
59
+ * failure means "the assistant isn't running" (503) rather than an error.
60
+ */
61
+ export function useAiRequest<T>(): AiRequest<T> {
62
+ const data = shallowRef<T | null>(null);
63
+ const isLoading = ref(false);
64
+ const failure = ref<RequestFailure | null>(null);
65
+ const message = ref("");
66
+ let latestRun = 0;
67
+
68
+ async function run(fetcher: () => Promise<T>): Promise<T | null> {
69
+ latestRun += 1;
70
+ const runId = latestRun;
71
+ isLoading.value = true;
72
+ try {
73
+ const result = await fetcher();
74
+ if (runId !== latestRun) return null;
75
+ data.value = result;
76
+ failure.value = null;
77
+ return result;
78
+ } catch (error) {
79
+ if (runId !== latestRun) return null;
80
+ failure.value = classifyFailure(error);
81
+ message.value = errorMessage(error);
82
+ return null;
83
+ } finally {
84
+ if (runId === latestRun) isLoading.value = false;
85
+ }
86
+ }
87
+
88
+ return { data, isLoading, failure, message, run };
89
+ }
@@ -0,0 +1,33 @@
1
+ import { inject } from "vue";
2
+ import { useDmsRouter } from "#dms/frontend-module";
3
+ import { ASSISTANT_SESSION_KEY } from "../../runtime/assistant-session";
4
+
5
+ export interface AssistantActions {
6
+ /** The assistant runs in this tab: its buttons can be offered. Reactive. */
7
+ readonly isAvailable: boolean;
8
+ openPanel: () => void;
9
+ openConversation: (conversationId: string) => void;
10
+ startConversation: (prompt?: string) => void;
11
+ /** Opens a dashboard page, as its own links do. */
12
+ goTo: (path: string) => void;
13
+ }
14
+
15
+ /**
16
+ * The tab's assistant session as the workspace views use it. Until it runs
17
+ * (its first probe pending) and without one (production, sidecar disabled) the
18
+ * actions do nothing and `isAvailable` hides the buttons that need them.
19
+ */
20
+ export function useAssistant(): AssistantActions {
21
+ const session = inject(ASSISTANT_SESSION_KEY, null);
22
+ const router = useDmsRouter();
23
+ return {
24
+ get isAvailable() {
25
+ return (session?.value ?? null) !== null;
26
+ },
27
+ openPanel: () => session?.value?.panel.open(),
28
+ openConversation: (conversationId) =>
29
+ session?.value?.openConversation(conversationId),
30
+ startConversation: (prompt) => session?.value?.startConversation(prompt),
31
+ goTo: (path) => void router.push(path),
32
+ };
33
+ }
@@ -0,0 +1,102 @@
1
+ import { ref, type Ref } from "vue";
2
+ import { AI_ROUTES } from "../constants";
3
+ import type { ChangeSetSummary } from "../types";
4
+ import { classifyFailure, errorMessage } from "./useAiRequest";
5
+
6
+ export interface ChangeSetActions {
7
+ isBusy: Ref<boolean>;
8
+ /** Asks the undo dialog the server words, then undoes from inside it. */
9
+ undo: (changeSet: ChangeSetSummary) => Promise<void>;
10
+ redo: (changeSet: ChangeSetSummary) => Promise<void>;
11
+ }
12
+
13
+ const AI_COLOR = "secondary";
14
+
15
+ interface UndoResult {
16
+ undone: string[];
17
+ }
18
+
19
+ function changeSetPath(changeSetId: string, action: string): string {
20
+ return `${AI_ROUTES.changes}/${encodeURIComponent(changeSetId)}/${action}`;
21
+ }
22
+
23
+ /**
24
+ * Undo and redo of a change set, each confirmed by a toast; `onChanged` runs
25
+ * once the sidecar has restored the files.
26
+ */
27
+ export function useChangeSetActions(onChanged: () => void): ChangeSetActions {
28
+ const { t } = useI18n();
29
+ const toast = useToast();
30
+ const { $authFetch } = useAuthFetch();
31
+ const { confirmFrom } = useConfirmFrom();
32
+ const isBusy = ref(false);
33
+
34
+ function failureToast(error: unknown): void {
35
+ const failure = classifyFailure(error);
36
+ toast.add({
37
+ title: t(`dms_ai.views.${failure}.title`),
38
+ description:
39
+ failure === "error"
40
+ ? errorMessage(error)
41
+ : t("dms_ai.views.unavailable.description"),
42
+ color: "error",
43
+ icon: "i-ph-warning-circle",
44
+ });
45
+ }
46
+
47
+ async function redo(changeSet: ChangeSetSummary): Promise<void> {
48
+ isBusy.value = true;
49
+ try {
50
+ await $authFetch(changeSetPath(changeSet.id, "redo"), {
51
+ method: "POST",
52
+ body: {},
53
+ });
54
+ toast.add({
55
+ title: t("dms_ai.views.toast.redone", { number: changeSet.number }),
56
+ color: AI_COLOR,
57
+ icon: "i-ph-arrow-clockwise",
58
+ });
59
+ onChanged();
60
+ } catch (error) {
61
+ failureToast(error);
62
+ } finally {
63
+ isBusy.value = false;
64
+ }
65
+ }
66
+
67
+ async function sendUndo(
68
+ changeSet: ChangeSetSummary,
69
+ values: Record<string, unknown>,
70
+ ): Promise<void> {
71
+ const result = await $authFetch<UndoResult>(
72
+ changeSetPath(changeSet.id, "undo"),
73
+ { method: "POST", body: values },
74
+ );
75
+ const count = result.undone.length;
76
+ toast.add({
77
+ title: t("dms_ai.views.toast.undone", { number: changeSet.number }),
78
+ description: t("dms_ai.views.toast.undone_description", { count }, count),
79
+ color: AI_COLOR,
80
+ icon: "i-ph-arrow-counter-clockwise",
81
+ actions: [
82
+ {
83
+ label: t("dms_ai.views.changes.redo"),
84
+ icon: "i-ph-arrow-clockwise",
85
+ color: "neutral",
86
+ variant: "outline",
87
+ onClick: () => void redo(changeSet),
88
+ },
89
+ ],
90
+ });
91
+ onChanged();
92
+ }
93
+
94
+ async function undo(changeSet: ChangeSetSummary): Promise<void> {
95
+ await confirmFrom(AI_ROUTES.changeUndoConfirm, {
96
+ params: { id: changeSet.id, number: changeSet.number },
97
+ onConfirm: (values) => sendUndo(changeSet, values),
98
+ });
99
+ }
100
+
101
+ return { isBusy, undo, redo };
102
+ }
@@ -0,0 +1,55 @@
1
+ import { formatClock, formatMoment, type MomentOptions } from "../utils/moment";
2
+ import { bareToolName, readableToolName } from "../utils/tools";
3
+
4
+ const TOOL_LEXICON_PREFIX = "dms_ai.tools";
5
+ const I18N_PATH_SEPARATOR = ".";
6
+ const I18N_KEY_SIGIL = "$";
7
+
8
+ export interface ViewFormat {
9
+ /** "Today 14:02", "Mon 17:20", "Sep 24". */
10
+ moment: (ms: number, withSeconds?: boolean) => string;
11
+ /** "09:58". */
12
+ clock: (ms: number) => string;
13
+ /** The tool's name in the panel's lexicon, else a readable form of it. */
14
+ toolLabel: (tool: string) => string;
15
+ /** A server message, translated when it is an i18n key (`$` or bare). */
16
+ serverMessage: (message: string) => string;
17
+ }
18
+
19
+ /**
20
+ * The formatters every workspace view shares, bound to the user's language
21
+ * and regional preferences.
22
+ */
23
+ export function useViewFormat(): ViewFormat {
24
+ const { t, te } = useI18n();
25
+ const regional = useRegionalFormat();
26
+
27
+ function momentOptions(withSeconds: boolean): MomentOptions {
28
+ return {
29
+ format: (options) => regional.dateTimeFormat(options),
30
+ t: (key, params) => t(key, params ?? {}),
31
+ nowMs: Date.now(),
32
+ withSeconds,
33
+ };
34
+ }
35
+
36
+ function toolLabel(tool: string): string {
37
+ const name = bareToolName(tool);
38
+ if (name.includes(I18N_PATH_SEPARATOR)) return readableToolName(tool);
39
+ const key = `${TOOL_LEXICON_PREFIX}.${name}.label`;
40
+ return te(key) ? t(key) : readableToolName(tool);
41
+ }
42
+
43
+ function serverMessage(message: string): string {
44
+ const key = message.startsWith(I18N_KEY_SIGIL) ? message.slice(1) : message;
45
+ return te(key) ? t(key) : message;
46
+ }
47
+
48
+ return {
49
+ serverMessage,
50
+ moment: (ms, withSeconds = false) =>
51
+ formatMoment(ms, momentOptions(withSeconds)),
52
+ clock: (ms) => formatClock(ms, momentOptions(false)),
53
+ toolLabel,
54
+ };
55
+ }
@@ -0,0 +1,43 @@
1
+ import type { ActivityResult, AllowedBy } from "./types";
2
+ import type { Tone } from "#dms-ui/app/types/tone";
3
+
4
+ export const AI_ROUTES = {
5
+ status: "/ai/status",
6
+ changes: "/ai/changes",
7
+ changeUndoConfirm: "/ai/changes/{id}/undo-confirm",
8
+ activity: "/ai/activity",
9
+ } as const;
10
+
11
+ export const AI_PAGES = {
12
+ changes: "/modules/ai/changes",
13
+ } as const;
14
+
15
+ export const CHANGE_SET_QUERY_KEY = "set";
16
+ export const CHANGES_PAGE_SIZE = 30;
17
+ export const HTTP_SERVICE_UNAVAILABLE = 503;
18
+
19
+ export interface DecisionStyle {
20
+ icon: string;
21
+ iconClass: string;
22
+ }
23
+
24
+ export const DECISION_STYLES: Record<AllowedBy, DecisionStyle> = {
25
+ read_auto: { icon: "i-ph-eye", iconClass: "text-dimmed" },
26
+ builder_auto: { icon: "i-ph-hammer", iconClass: "text-dimmed" },
27
+ approved: { icon: "i-ph-check-circle", iconClass: "text-success" },
28
+ rule: { icon: "i-ph-key", iconClass: "text-secondary" },
29
+ full_auto: { icon: "i-ph-lightning", iconClass: "text-secondary" },
30
+ blocked: { icon: "i-ph-shield-warning", iconClass: "text-warning" },
31
+ denied: { icon: "i-ph-prohibit", iconClass: "text-error" },
32
+ expired: { icon: "i-ph-hourglass-simple", iconClass: "text-warning" },
33
+ };
34
+
35
+ export const RESULT_TONES: Record<ActivityResult, Tone> = {
36
+ done: "success",
37
+ failed: "error",
38
+ denied: "neutral",
39
+ blocked: "warning",
40
+ stopped: "neutral",
41
+ pending: "warning",
42
+ expired: "neutral",
43
+ };
@@ -0,0 +1,189 @@
1
+ import type { Tone } from "#dms-ui/app/types/tone";
2
+
3
+ type AgentId = "claude" | "codex";
4
+ export type ScopeId = "safe" | "vibe";
5
+ export type ApprovalMode = "normal" | "acceptEdits" | "plan";
6
+ type AssistantState = "ready" | "working" | "waiting";
7
+ export type TypecheckOutcome = "passed" | "failed" | "skipped";
8
+ export type ChangeSetState = "applied" | "undone";
9
+ export type ChangeFileStatus = "added" | "modified" | "deleted";
10
+ export type DiffLineKind = "context" | "add" | "remove";
11
+ export type SkillSource = "module" | "local";
12
+
13
+ export type AllowedBy =
14
+ | "read_auto"
15
+ | "builder_auto"
16
+ | "approved"
17
+ | "rule"
18
+ | "full_auto"
19
+ | "blocked"
20
+ | "denied"
21
+ | "expired";
22
+
23
+ export type ActivityResult =
24
+ | "done"
25
+ | "failed"
26
+ | "denied"
27
+ | "blocked"
28
+ | "stopped"
29
+ | "pending"
30
+ | "expired";
31
+
32
+ export interface DiffLine {
33
+ kind: DiffLineKind;
34
+ text: string;
35
+ oldLine?: number;
36
+ newLine?: number;
37
+ }
38
+
39
+ export interface DiffHunk {
40
+ oldStart: number;
41
+ newStart: number;
42
+ lines: DiffLine[];
43
+ }
44
+
45
+ /** One file of a diff, as DiffView draws it. */
46
+ export interface DiffFile {
47
+ path: string;
48
+ status?: ChangeFileStatus;
49
+ added?: number;
50
+ removed?: number;
51
+ hunks: DiffHunk[];
52
+ isBinary?: boolean;
53
+ }
54
+
55
+ export interface ChangeSetFile {
56
+ path: string;
57
+ status: ChangeFileStatus;
58
+ added: number;
59
+ removed: number;
60
+ }
61
+
62
+ export interface ChangeSetSummary {
63
+ id: string;
64
+ number: number;
65
+ conversationId: string;
66
+ title: string;
67
+ createdAtMs: number;
68
+ agent: AgentId;
69
+ scope: ScopeId;
70
+ isAutoFix: boolean;
71
+ overlapped: boolean;
72
+ files: ChangeSetFile[];
73
+ added: number;
74
+ removed: number;
75
+ typecheck: TypecheckOutcome;
76
+ state: ChangeSetState;
77
+ stateChangedAtMs?: number;
78
+ stateChangedBy?: string;
79
+ askedBy?: string;
80
+ approvalsNeeded: number;
81
+ builderOps: number;
82
+ }
83
+
84
+ export interface ChangeSetDetail {
85
+ changeSet: ChangeSetSummary;
86
+ files: DiffFile[];
87
+ conversationTitle: string;
88
+ pagePath?: string;
89
+ }
90
+
91
+ export interface ListPayload<T> {
92
+ results: T[];
93
+ total: number;
94
+ }
95
+
96
+ export interface ActivityRow {
97
+ _id?: string;
98
+ id: string;
99
+ timestampMs: number;
100
+ tool: string;
101
+ target: string;
102
+ agent: AgentId;
103
+ allowedBy: AllowedBy;
104
+ result: ActivityResult;
105
+ resultDetail?: string;
106
+ changeSetId?: string;
107
+ changeSetNumber?: number;
108
+ conversationId: string;
109
+ conversationTitle: string;
110
+ durationMs?: number;
111
+ isReadOnly: boolean;
112
+ isAutoFix: boolean;
113
+ added?: number;
114
+ removed?: number;
115
+ expiresAtMs?: number;
116
+ }
117
+
118
+ export interface DecisionStep {
119
+ atMs: number;
120
+ label: string;
121
+ }
122
+
123
+ export interface ActivityDiffFile {
124
+ path: string;
125
+ hunks: DiffHunk[];
126
+ }
127
+
128
+ /**
129
+ * `GET /ai/activity/:id`. The contract names the call's (truncated) output
130
+ * `result`, the same key as the row's outcome: both readings are accepted.
131
+ */
132
+ export interface ActivityDetailPayload extends Omit<ActivityRow, "result"> {
133
+ args?: Record<string, unknown>;
134
+ result?: string;
135
+ output?: string;
136
+ diff?: ActivityDiffFile[];
137
+ decisionTrail?: DecisionStep[];
138
+ }
139
+
140
+ export interface AssistantStatus {
141
+ status: AssistantState;
142
+ provider: AgentId;
143
+ providers?: unknown;
144
+ builderAvailable: boolean;
145
+ mode: ApprovalMode;
146
+ generationMode: ScopeId;
147
+ workingConversations: number;
148
+ pendingApprovals: number;
149
+ pendingQuestions: number;
150
+ port: number;
151
+ version?: string;
152
+ lastError?: string;
153
+ checkpointsAvailable: boolean;
154
+ }
155
+
156
+ export interface SkillRow {
157
+ _id: string;
158
+ name: string;
159
+ description: string;
160
+ source: SkillSource;
161
+ origin: string;
162
+ tags: string[];
163
+ uses30d: number;
164
+ lastUsedAtMs?: number;
165
+ lastConversationId?: string;
166
+ isShadowed: boolean;
167
+ shadowedBy?: string;
168
+ body: string;
169
+ qualifiedName: string;
170
+ icon?: string;
171
+ }
172
+
173
+ /** What a DMS row drawer hands its component to step through the rows. */
174
+ export interface RowNavigation {
175
+ index: number;
176
+ total: number;
177
+ hasPrev: boolean;
178
+ hasNext: boolean;
179
+ prev: () => void;
180
+ next: () => void;
181
+ }
182
+
183
+ /** One fact of a change set, a row of a DmsKeyValueList. */
184
+ export interface Fact {
185
+ id: string;
186
+ label: string;
187
+ value: string;
188
+ tone?: Tone;
189
+ }
@@ -0,0 +1,77 @@
1
+ import type {
2
+ ActivityDetailPayload,
3
+ ActivityResult,
4
+ ActivityRow,
5
+ } from "../types";
6
+
7
+ /** A named argument as DmsKeyValueList draws it. */
8
+ export interface ArgumentItem {
9
+ id: string;
10
+ label: string;
11
+ value: string;
12
+ type: "mono";
13
+ /** The whole value, which the row's copy button copies. */
14
+ copyValue: string;
15
+ }
16
+
17
+ const MAX_ARGUMENT_CHARS = 240;
18
+ const ELLIPSIS = "…";
19
+ const JSON_INDENT = 2;
20
+ const OUTCOMES: ReadonlySet<string> = new Set<ActivityResult>([
21
+ "done",
22
+ "failed",
23
+ "denied",
24
+ "blocked",
25
+ "stopped",
26
+ "pending",
27
+ "expired",
28
+ ]);
29
+
30
+ function shorten(text: string): string {
31
+ if (text.length <= MAX_ARGUMENT_CHARS) return text;
32
+ return `${text.slice(0, MAX_ARGUMENT_CHARS - ELLIPSIS.length)}${ELLIPSIS}`;
33
+ }
34
+
35
+ function stringifyArgument(value: unknown): string {
36
+ if (typeof value === "string") return value;
37
+ if (value === undefined) return "";
38
+ try {
39
+ return JSON.stringify(value) ?? String(value);
40
+ } catch {
41
+ return String(value);
42
+ }
43
+ }
44
+
45
+ /** A call's arguments, one row per name, long values cut short but copied whole. */
46
+ export function argumentItems(
47
+ args: Record<string, unknown> | undefined,
48
+ ): ArgumentItem[] {
49
+ return Object.entries(args ?? {}).map(([name, value]) => {
50
+ const text = stringifyArgument(value);
51
+ return {
52
+ id: name,
53
+ label: name,
54
+ value: shorten(text),
55
+ type: "mono",
56
+ copyValue: text,
57
+ };
58
+ });
59
+ }
60
+
61
+ /** The call's output text, whichever key the route sent it under. */
62
+ export function activityOutput(
63
+ detail: ActivityDetailPayload | null,
64
+ ): string | undefined {
65
+ if (!detail) return undefined;
66
+ if (detail.output) return detail.output;
67
+ const result = detail.result;
68
+ return result && !OUTCOMES.has(result) ? result : undefined;
69
+ }
70
+
71
+ /** Everything known about the call, for the raw JSON toggle. */
72
+ export function rawActivityJson(
73
+ row: ActivityRow | undefined,
74
+ detail: ActivityDetailPayload | null,
75
+ ): string {
76
+ return JSON.stringify({ ...row, ...detail }, null, JSON_INDENT);
77
+ }
@@ -0,0 +1,44 @@
1
+ import { CHANGE_SET_QUERY_KEY } from "../constants";
2
+ import type { ChangeSetSummary } from "../types";
3
+
4
+ const UNDONE_ICON = "i-ph-arrow-counter-clockwise";
5
+ const AUTO_FIX_ICON = "i-ph-wrench";
6
+ const SCOPE_NODE_ICONS: Record<ChangeSetSummary["scope"], string> = {
7
+ safe: "i-ph-sparkle",
8
+ vibe: "i-ph-code",
9
+ };
10
+
11
+ /** The list node of a set: undone, auto-fix, else its scope. */
12
+ export function changeSetIcon(changeSet: ChangeSetSummary): string {
13
+ if (changeSet.state === "undone") return UNDONE_ICON;
14
+ if (changeSet.isAutoFix) return AUTO_FIX_ICON;
15
+ return SCOPE_NODE_ICONS[changeSet.scope];
16
+ }
17
+
18
+ /** The set's title or one of its files contains the search, case aside. */
19
+ export function matchesSearch(
20
+ changeSet: ChangeSetSummary,
21
+ search: string,
22
+ ): boolean {
23
+ const needle = search.trim().toLowerCase();
24
+ if (needle === "") return true;
25
+ const haystack = [changeSet.title, ...changeSet.files.map((f) => f.path)];
26
+ return haystack.some((text) => text.toLowerCase().includes(needle));
27
+ }
28
+
29
+ /** The `?set=<id>` deep link of the page, if any. */
30
+ export function readSelectedSet(): string | undefined {
31
+ if (typeof window === "undefined") return undefined;
32
+ const params = new URLSearchParams(window.location.search);
33
+ return params.get(CHANGE_SET_QUERY_KEY) ?? undefined;
34
+ }
35
+
36
+ /**
37
+ * Keeps the selected set in the URL without a visit, so a reload or a shared
38
+ * link opens it again.
39
+ */
40
+ export function writeSelectedSet(changeSetId: string): void {
41
+ const url = new URL(window.location.href);
42
+ url.searchParams.set(CHANGE_SET_QUERY_KEY, changeSetId);
43
+ window.history.replaceState(window.history.state, "", url);
44
+ }