@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,589 @@
1
+ <script setup lang="ts">
2
+ import { computed, nextTick, ref, watch } from "vue";
3
+ import {
4
+ NEWLINE_HOTKEY_MODIFIER,
5
+ SEND_HOTKEY,
6
+ } from "../constants/conversation";
7
+ import { useChatI18n } from "../composables/useChatI18n";
8
+ import { useComposerAttachments } from "../composables/useComposerAttachments";
9
+ import type { CurrentPage } from "../types/conversation";
10
+ import type {
11
+ ApprovalMode,
12
+ ConversationModeState,
13
+ FullAutoDuration,
14
+ Scope,
15
+ } from "../types/protocol";
16
+ import {
17
+ formatBytes,
18
+ isInlineImage,
19
+ type PendingAttachment,
20
+ } from "../utils/attachments";
21
+ import { shortcutLabel } from "../utils/platform";
22
+ import { pageChipLabel } from "../utils/suggestions";
23
+ import FullAutoDialog from "./FullAutoDialog.vue";
24
+
25
+ interface Props {
26
+ isDisabled: boolean;
27
+ isRunning: boolean;
28
+ mode: ConversationModeState;
29
+ builderAvailable: boolean;
30
+ page: CurrentPage | null;
31
+ /** "9.6k tokens · this chat", "new chat", "offline". */
32
+ usageLabel: string;
33
+ placeholder: string;
34
+ }
35
+
36
+ interface Emits {
37
+ submit: [
38
+ content: string,
39
+ attachments: PendingAttachment[],
40
+ includePage: boolean,
41
+ ];
42
+ stop: [];
43
+ setScope: [scope: Scope];
44
+ setMode: [mode: ApprovalMode];
45
+ startFullAuto: [duration: FullAutoDuration];
46
+ openSettings: [];
47
+ }
48
+
49
+ interface ModeLook {
50
+ icon: string;
51
+ labelKey: string;
52
+ descriptionKey: string;
53
+ }
54
+
55
+ const props = defineProps<Props>();
56
+ const emit = defineEmits<Emits>();
57
+ const { t } = useChatI18n();
58
+
59
+ const MAX_HEIGHT_PX = 160;
60
+ const SCOPES: readonly Scope[] = ["safe", "vibe"];
61
+ const MODES: readonly ApprovalMode[] = ["normal", "acceptEdits", "plan"];
62
+ const MODE_LOOKS: Record<ApprovalMode, ModeLook> = {
63
+ normal: {
64
+ icon: "i-ph-hand-palm",
65
+ labelKey: "dms_ai.common.mode.normal",
66
+ descriptionKey: "dms_ai.panel.composer.mode_desc.normal",
67
+ },
68
+ acceptEdits: {
69
+ icon: "i-ph-pencil-simple-line",
70
+ labelKey: "dms_ai.common.mode.acceptEdits",
71
+ descriptionKey: "dms_ai.panel.composer.mode_desc.acceptEdits",
72
+ },
73
+ plan: {
74
+ icon: "i-ph-list-checks",
75
+ labelKey: "dms_ai.common.mode.plan",
76
+ descriptionKey: "dms_ai.panel.composer.mode_desc.plan",
77
+ },
78
+ };
79
+ const SCOPE_ICONS: Record<Scope, string> = {
80
+ safe: "i-ph-shield-check",
81
+ vibe: "i-ph-code",
82
+ };
83
+ const HISTORY_KEY = "j";
84
+ const historyKbd = shortcutLabel(HISTORY_KEY);
85
+
86
+ const draft = ref("");
87
+ const isPageIncluded = ref(true);
88
+ const isFullAutoOpen = ref(false);
89
+ const isFocused = ref(false);
90
+ const textareaRef = ref<HTMLTextAreaElement | null>(null);
91
+ const fileInputRef = ref<HTMLInputElement | null>(null);
92
+ const files = useComposerAttachments(t, () => props.isDisabled);
93
+
94
+ const pageLabel = computed(() => pageChipLabel(props.page));
95
+ const isSendDisabled = computed(
96
+ () =>
97
+ props.isDisabled ||
98
+ (draft.value.trim() === "" && files.attachments.value.length === 0),
99
+ );
100
+ const modeLook = computed(
101
+ () => MODE_LOOKS[props.mode.mode] ?? MODE_LOOKS.normal,
102
+ );
103
+ const isFullAuto = computed(() => props.mode.fullAuto !== null);
104
+
105
+ watch(
106
+ () => props.page?.path,
107
+ () => (isPageIncluded.value = true),
108
+ );
109
+
110
+ const scopeItems = computed(() =>
111
+ SCOPES.map((scope) => ({
112
+ label: t(`dms_ai.common.scope.${scope}`),
113
+ description: t(
114
+ scope === "safe" && !props.builderAvailable
115
+ ? "dms_ai.panel.composer.scope_desc.safe_unavailable"
116
+ : `dms_ai.panel.composer.scope_desc.${scope}`,
117
+ ),
118
+ icon: SCOPE_ICONS[scope],
119
+ type: "checkbox" as const,
120
+ checked: props.mode.generationMode === scope,
121
+ disabled: scope === "safe" && !props.builderAvailable,
122
+ onSelect: (): void => emit("setScope", scope),
123
+ })),
124
+ );
125
+
126
+ const modeItems = computed(() => [
127
+ [{ type: "label" as const, label: t("dms_ai.panel.composer.mode_menu") }],
128
+ MODES.map((mode) => ({
129
+ label: t(MODE_LOOKS[mode].labelKey),
130
+ description: t(MODE_LOOKS[mode].descriptionKey),
131
+ icon: MODE_LOOKS[mode].icon,
132
+ type: "checkbox" as const,
133
+ checked: !isFullAuto.value && props.mode.mode === mode,
134
+ onSelect: (): void => emit("setMode", mode),
135
+ })),
136
+ [
137
+ {
138
+ label: t("dms_ai.panel.composer.full_auto_item"),
139
+ description: t("dms_ai.panel.composer.mode_desc.auto"),
140
+ icon: "i-ph-lightning",
141
+ color: "error" as const,
142
+ onSelect: (): void => {
143
+ isFullAutoOpen.value = true;
144
+ },
145
+ },
146
+ ],
147
+ [
148
+ {
149
+ label: t("dms_ai.panel.composer.default_mode"),
150
+ icon: "i-ph-gear-six",
151
+ onSelect: (): void => emit("openSettings"),
152
+ },
153
+ ],
154
+ ]);
155
+
156
+ function autoGrow(): void {
157
+ const el = textareaRef.value;
158
+ if (el === null) return;
159
+ el.style.height = "auto";
160
+ el.style.height = `${Math.min(el.scrollHeight, MAX_HEIGHT_PX)}px`;
161
+ }
162
+
163
+ function submitDraft(): void {
164
+ if (isSendDisabled.value) return;
165
+ emit("submit", draft.value, files.attachments.value, isPageIncluded.value);
166
+ draft.value = "";
167
+ files.clear();
168
+ void nextTick(autoGrow);
169
+ }
170
+
171
+ function onKeydown(event: KeyboardEvent): void {
172
+ if (event.key !== SEND_HOTKEY || event[NEWLINE_HOTKEY_MODIFIER]) return;
173
+ if (event.isComposing) return;
174
+ event.preventDefault();
175
+ submitDraft();
176
+ }
177
+
178
+ function onPaste(event: ClipboardEvent): void {
179
+ const pasted = event.clipboardData?.files;
180
+ if (pasted === undefined || pasted.length === 0) return;
181
+ event.preventDefault();
182
+ void files.add(pasted);
183
+ }
184
+
185
+ function onFileChange(event: Event): void {
186
+ const input = event.target as HTMLInputElement;
187
+ if (input.files !== null) void files.add(input.files);
188
+ input.value = "";
189
+ }
190
+
191
+ function setDraft(text: string): void {
192
+ draft.value = text;
193
+ void nextTick(() => {
194
+ autoGrow();
195
+ textareaRef.value?.focus();
196
+ });
197
+ }
198
+
199
+ defineExpose({
200
+ focus: () => textareaRef.value?.focus(),
201
+ setDraft,
202
+ });
203
+ </script>
204
+
205
+ <template>
206
+ <form
207
+ class="cb-composer composer"
208
+ @submit.prevent="submitDraft"
209
+ @dragenter="files.onDragEnter"
210
+ @dragover="files.onDragOver"
211
+ @dragleave="files.onDragLeave"
212
+ @drop="files.onDrop"
213
+ >
214
+ <div
215
+ class="cb-input"
216
+ :class="{ 'is-focus': isFocused, 'is-drop': files.isDragging.value }"
217
+ >
218
+ <div
219
+ v-if="
220
+ (page && pageLabel && isPageIncluded) ||
221
+ files.attachments.value.length > 0
222
+ "
223
+ class="cb-input__chips"
224
+ >
225
+ <span
226
+ v-if="page && pageLabel && isPageIncluded"
227
+ class="att is-page"
228
+ :title="t('dms_ai.panel.composer.page_chip_hint')"
229
+ >
230
+ <UIcon name="i-ph-browser" />
231
+ {{ pageLabel }}
232
+ <button
233
+ type="button"
234
+ :aria-label="t('dms_ai.panel.composer.remove_page')"
235
+ @click="isPageIncluded = false"
236
+ >
237
+ <UIcon name="i-ph-x" />
238
+ </button>
239
+ </span>
240
+ <span v-for="att in files.attachments.value" :key="att.id" class="att">
241
+ <img
242
+ v-if="isInlineImage(att.mimeType) && att.dataUrl"
243
+ :src="att.dataUrl"
244
+ :alt="att.name"
245
+ class="att__thumb"
246
+ />
247
+ <UIcon v-else name="i-ph-file" />
248
+ <span class="att__name">{{ att.name }}</span>
249
+ <span class="att__size">{{ formatBytes(att.size) }}</span>
250
+ <button
251
+ type="button"
252
+ :aria-label="
253
+ t('dms_ai.panel.composer.remove_file', { name: att.name })
254
+ "
255
+ @click="files.remove(att.id)"
256
+ >
257
+ <UIcon name="i-ph-x" />
258
+ </button>
259
+ </span>
260
+ </div>
261
+ <p v-if="files.error.value" class="cb-input__error" role="alert">
262
+ {{ files.error.value }}
263
+ </p>
264
+ <p v-if="files.isDragging.value" class="cb-input__drop">
265
+ {{ t("dms_ai.panel.composer.drop_files") }}
266
+ </p>
267
+ <textarea
268
+ ref="textareaRef"
269
+ v-model="draft"
270
+ rows="1"
271
+ :placeholder="placeholder"
272
+ :aria-label="t('dms_ai.panel.composer.aria')"
273
+ :disabled="isDisabled"
274
+ @keydown="onKeydown"
275
+ @input="autoGrow"
276
+ @paste="onPaste"
277
+ @focus="isFocused = true"
278
+ @blur="isFocused = false"
279
+ />
280
+ <div class="cb-input__bar">
281
+ <UButton
282
+ size="sm"
283
+ color="neutral"
284
+ variant="ghost"
285
+ square
286
+ icon="i-ph-paperclip"
287
+ :disabled="isDisabled"
288
+ :aria-label="t('dms_ai.panel.composer.attach')"
289
+ :title="t('dms_ai.panel.composer.attach')"
290
+ @click="fileInputRef?.click()"
291
+ />
292
+ <UDropdownMenu
293
+ :items="scopeItems"
294
+ :content="{ side: 'top', align: 'start' }"
295
+ >
296
+ <button
297
+ type="button"
298
+ class="cb-mode-btn"
299
+ :class="{ 'is-safe': mode.generationMode === 'safe' }"
300
+ :title="
301
+ t(`dms_ai.panel.composer.scope_desc.${mode.generationMode}`)
302
+ "
303
+ >
304
+ <UIcon :name="SCOPE_ICONS[mode.generationMode]" />
305
+ {{ t(`dms_ai.common.scope.${mode.generationMode}`) }}
306
+ <UIcon name="i-ph-caret-down" />
307
+ </button>
308
+ </UDropdownMenu>
309
+ <UDropdownMenu
310
+ :items="modeItems"
311
+ :content="{ side: 'top', align: 'start' }"
312
+ >
313
+ <button
314
+ type="button"
315
+ class="cb-mode-btn"
316
+ :class="{ 'is-danger': isFullAuto }"
317
+ >
318
+ <UIcon :name="isFullAuto ? 'i-ph-lightning' : modeLook.icon" />
319
+ {{
320
+ isFullAuto ? t("dms_ai.common.mode.auto") : t(modeLook.labelKey)
321
+ }}
322
+ <UIcon name="i-ph-caret-down" />
323
+ </button>
324
+ </UDropdownMenu>
325
+ <span class="cb-input__spacer" />
326
+ <UButton
327
+ v-if="isRunning"
328
+ size="sm"
329
+ color="neutral"
330
+ variant="outline"
331
+ square
332
+ icon="i-ph-stop"
333
+ class="cb-send composer-stop"
334
+ :aria-label="t('dms_ai.panel.composer.stop')"
335
+ :title="t('dms_ai.panel.composer.stop_hint')"
336
+ @click="emit('stop')"
337
+ />
338
+ <UButton
339
+ type="submit"
340
+ size="sm"
341
+ color="secondary"
342
+ square
343
+ :icon="isRunning ? 'i-ph-queue' : 'i-ph-arrow-up'"
344
+ class="cb-send composer-send"
345
+ :disabled="isSendDisabled"
346
+ :aria-label="t('dms_ai.panel.composer.send')"
347
+ :title="
348
+ t(
349
+ isRunning
350
+ ? 'dms_ai.panel.composer.queue_hint'
351
+ : 'dms_ai.panel.composer.send',
352
+ )
353
+ "
354
+ />
355
+ </div>
356
+ </div>
357
+ <input
358
+ ref="fileInputRef"
359
+ type="file"
360
+ multiple
361
+ class="cb-composer__file"
362
+ aria-hidden="true"
363
+ tabindex="-1"
364
+ @change="onFileChange"
365
+ />
366
+ <div class="cb-composer__hint">
367
+ <span>
368
+ <UKbd value="↵" size="sm" />
369
+ {{
370
+ t(
371
+ isRunning
372
+ ? "dms_ai.panel.composer.hint_queue"
373
+ : "dms_ai.panel.composer.hint_send",
374
+ )
375
+ }}
376
+ </span>
377
+ <span>
378
+ <UKbd value="⇧↵" size="sm" />
379
+ {{ t("dms_ai.panel.composer.hint_newline") }}
380
+ </span>
381
+ <span v-if="isRunning">
382
+ <UKbd value="esc" size="sm" />
383
+ {{ t("dms_ai.panel.composer.hint_stop") }}
384
+ </span>
385
+ <span v-else>
386
+ <UKbd :value="historyKbd" size="sm" />
387
+ {{ t("dms_ai.panel.composer.hint_history") }}
388
+ </span>
389
+ <span class="cb-composer__usage">{{ usageLabel }}</span>
390
+ </div>
391
+ <FullAutoDialog
392
+ v-model:open="isFullAutoOpen"
393
+ @confirm="(duration) => emit('startFullAuto', duration)"
394
+ />
395
+ </form>
396
+ </template>
397
+
398
+ <style scoped>
399
+ .cb-composer {
400
+ padding: 10px 12px 12px;
401
+ }
402
+
403
+ .cb-input {
404
+ border: 1px solid var(--ui-border-accented);
405
+ border-radius: 12px;
406
+ background: var(--dms-bg-field);
407
+ transition:
408
+ border-color 150ms,
409
+ box-shadow 150ms;
410
+ }
411
+
412
+ .cb-input.is-focus {
413
+ border-color: var(--ai-line);
414
+ box-shadow: 0 0 0 3px var(--ai-tint);
415
+ }
416
+
417
+ .cb-input.is-drop {
418
+ border-style: dashed;
419
+ border-color: var(--ai);
420
+ background: var(--ai-tint);
421
+ }
422
+
423
+ .cb-input__chips {
424
+ display: flex;
425
+ flex-wrap: wrap;
426
+ gap: 6px;
427
+ padding: 8px 8px 0;
428
+ }
429
+
430
+ .att {
431
+ display: inline-flex;
432
+ align-items: center;
433
+ gap: 6px;
434
+ max-width: 100%;
435
+ height: 26px;
436
+ padding: 0 4px 0 6px;
437
+ border: 1px solid var(--ui-border);
438
+ border-radius: 7px;
439
+ background: var(--dms-surface-card);
440
+ font-size: 12px;
441
+ color: var(--ui-text-toned);
442
+ }
443
+
444
+ .att > button {
445
+ display: grid;
446
+ place-items: center;
447
+ width: 18px;
448
+ height: 18px;
449
+ padding: 0;
450
+ border: 0;
451
+ border-radius: 4px;
452
+ background: transparent;
453
+ color: var(--ui-text-dimmed);
454
+ cursor: pointer;
455
+ }
456
+
457
+ .att > button:hover {
458
+ background: var(--ai-bg-hover);
459
+ color: var(--ui-text-highlighted);
460
+ }
461
+
462
+ .att.is-page {
463
+ border-color: var(--dms-accent-line);
464
+ background: var(--dms-accent-tint);
465
+ color: var(--dms-accent);
466
+ font: 500 11px var(--ai-font-mono);
467
+ }
468
+
469
+ .att__thumb {
470
+ width: 18px;
471
+ height: 18px;
472
+ border-radius: 4px;
473
+ object-fit: cover;
474
+ }
475
+
476
+ .att__name {
477
+ max-width: 160px;
478
+ overflow: hidden;
479
+ text-overflow: ellipsis;
480
+ white-space: nowrap;
481
+ }
482
+
483
+ .att__size {
484
+ font: 500 10.5px var(--ai-font-mono);
485
+ color: var(--ui-text-dimmed);
486
+ }
487
+
488
+ .cb-input__error,
489
+ .cb-input__drop {
490
+ margin: 6px 10px 0;
491
+ font-size: 12px;
492
+ }
493
+
494
+ .cb-input__error {
495
+ color: var(--ui-error);
496
+ }
497
+
498
+ .cb-input__drop {
499
+ color: var(--ai);
500
+ font-weight: 600;
501
+ }
502
+
503
+ .cb-input textarea {
504
+ display: block;
505
+ width: 100%;
506
+ min-height: 44px;
507
+ max-height: 160px;
508
+ padding: 10px 12px 4px;
509
+ border: 0;
510
+ outline: 0;
511
+ resize: none;
512
+ background: transparent;
513
+ color: var(--ui-text-highlighted);
514
+ font: inherit;
515
+ font-size: 13.5px;
516
+ line-height: 1.5;
517
+ }
518
+
519
+ .cb-input textarea::placeholder {
520
+ color: var(--ui-text-dimmed);
521
+ }
522
+
523
+ .cb-input__bar {
524
+ display: flex;
525
+ align-items: center;
526
+ gap: 4px;
527
+ padding: 4px 6px 6px;
528
+ }
529
+
530
+ .cb-input__spacer {
531
+ flex: 1;
532
+ }
533
+
534
+ .cb-mode-btn {
535
+ display: inline-flex;
536
+ align-items: center;
537
+ gap: 5px;
538
+ height: 26px;
539
+ padding: 0 8px;
540
+ border: 1px solid transparent;
541
+ border-radius: 7px;
542
+ background: transparent;
543
+ color: var(--ui-text-muted);
544
+ font-size: 12px;
545
+ font-weight: 550;
546
+ white-space: nowrap;
547
+ cursor: pointer;
548
+ }
549
+
550
+ .cb-mode-btn:hover {
551
+ background: var(--ai-bg-hover);
552
+ color: var(--ui-text-highlighted);
553
+ }
554
+
555
+ .cb-mode-btn.is-safe {
556
+ color: var(--ui-success);
557
+ }
558
+
559
+ .cb-mode-btn.is-danger {
560
+ border-color: var(--dms-error-line);
561
+ background: var(--dms-error-tint);
562
+ color: var(--ui-error);
563
+ }
564
+
565
+ .cb-composer__file {
566
+ display: none;
567
+ }
568
+
569
+ .cb-composer__hint {
570
+ display: flex;
571
+ flex-wrap: wrap;
572
+ align-items: center;
573
+ gap: 4px 10px;
574
+ margin-top: 7px;
575
+ padding: 0 2px;
576
+ font: 500 10.5px var(--ai-font-mono);
577
+ color: var(--ui-text-dimmed);
578
+ }
579
+
580
+ .cb-composer__hint > span {
581
+ display: inline-flex;
582
+ align-items: center;
583
+ gap: 3px;
584
+ }
585
+
586
+ .cb-composer__usage {
587
+ margin-left: auto;
588
+ }
589
+ </style>