@adecore/agents-react 0.31.12 → 0.32.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 (402) hide show
  1. package/dist/agents/AccountDot.js +57 -6
  2. package/dist/agents/AgentIcon.js +88 -12
  3. package/dist/agents/ModelOptionControl.js +153 -18
  4. package/dist/agents/ProviderLogo.js +49 -4
  5. package/dist/agents/account-limits.js +17 -14
  6. package/dist/agents/accounts.js +99 -67
  7. package/dist/agents/agent-marks.js +5 -3
  8. package/dist/agents/model-name.js +42 -31
  9. package/dist/agents/model-options.js +8 -8
  10. package/dist/agents/model-requirement.js +17 -14
  11. package/dist/agents/option-words.d.ts +7 -0
  12. package/dist/agents/option-words.js +35 -0
  13. package/dist/agents/provider-paths.js +6 -6
  14. package/dist/agents/status-look.js +32 -12
  15. package/dist/chat/account-choice.d.ts +13 -0
  16. package/dist/chat/account-choice.js +90 -20
  17. package/dist/chat/actions.js +126 -59
  18. package/dist/chat/activity.js +5 -5
  19. package/dist/chat/attachments.js +74 -53
  20. package/dist/chat/bookmarks.js +58 -48
  21. package/dist/chat/chat-client.js +344 -263
  22. package/dist/chat/chat-references.js +3 -3
  23. package/dist/chat/composer-effort.d.ts +5 -0
  24. package/dist/chat/composer-effort.js +26 -0
  25. package/dist/chat/composer-send.js +13 -13
  26. package/dist/chat/drafts.js +115 -79
  27. package/dist/chat/forks.js +81 -24
  28. package/dist/chat/guards.js +15 -43
  29. package/dist/chat/index.d.ts +3 -1
  30. package/dist/chat/index.js +3 -2
  31. package/dist/chat/logic/ansi.js +170 -167
  32. package/dist/chat/logic/answers.js +2 -2
  33. package/dist/chat/logic/bookmarks.js +19 -19
  34. package/dist/chat/logic/command-looks.js +138 -96
  35. package/dist/chat/logic/context-usage.js +13 -9
  36. package/dist/chat/logic/continue-after-stop.js +15 -19
  37. package/dist/chat/logic/effort.d.ts +14 -0
  38. package/dist/chat/logic/effort.js +34 -0
  39. package/dist/chat/logic/embedded-code.js +387 -326
  40. package/dist/chat/logic/fork.js +134 -110
  41. package/dist/chat/logic/generated-image.js +54 -23
  42. package/dist/chat/logic/goal.js +28 -20
  43. package/dist/chat/logic/handback.js +6 -6
  44. package/dist/chat/logic/json.js +2 -2
  45. package/dist/chat/logic/limit.js +46 -30
  46. package/dist/chat/logic/picker-entries.d.ts +5 -3
  47. package/dist/chat/logic/picker-entries.js +83 -43
  48. package/dist/chat/logic/resume-compaction.d.ts +14 -1
  49. package/dist/chat/logic/resume-compaction.js +93 -24
  50. package/dist/chat/logic/scrubber.js +188 -136
  51. package/dist/chat/logic/thought.js +13 -16
  52. package/dist/chat/logic/thread-cards.js +60 -48
  53. package/dist/chat/logic/timeline-copy.js +30 -38
  54. package/dist/chat/logic/timeline-target.js +92 -63
  55. package/dist/chat/logic/timeline.js +499 -355
  56. package/dist/chat/logic/tool-catalog.js +54 -34
  57. package/dist/chat/logic/tools.js +106 -82
  58. package/dist/chat/logic/visual-height.js +18 -18
  59. package/dist/chat/logic/visual-viewport.js +6 -3
  60. package/dist/chat/logic/welcome.js +9 -9
  61. package/dist/chat/logic/workflow.js +45 -34
  62. package/dist/chat/mentions.js +149 -109
  63. package/dist/chat/persisted-json.js +51 -54
  64. package/dist/chat/preferences.d.ts +4 -0
  65. package/dist/chat/preferences.js +162 -84
  66. package/dist/chat/prompt-hold.js +9 -9
  67. package/dist/chat/quote.js +21 -30
  68. package/dist/chat/reading-width.js +12 -10
  69. package/dist/chat/recent-messages.js +34 -21
  70. package/dist/chat/resume-compaction-dismissals.js +25 -5
  71. package/dist/chat/runtime-modes.js +3 -3
  72. package/dist/chat/send-key.js +11 -7
  73. package/dist/chat/stash.js +89 -69
  74. package/dist/chat/subagent-conversation.js +181 -139
  75. package/dist/chat/subagent-list.js +65 -67
  76. package/dist/chat/subagent-support.js +12 -7
  77. package/dist/chat/subagent-view.js +132 -44
  78. package/dist/chat/thumbnails.js +88 -60
  79. package/dist/chat/timeline-flash.js +24 -12
  80. package/dist/chat/timeline-scroll.js +116 -86
  81. package/dist/chat/ui/AccountPill.js +126 -15
  82. package/dist/chat/ui/AnsiOutput.js +62 -6
  83. package/dist/chat/ui/BookmarkMarker.js +231 -41
  84. package/dist/chat/ui/BookmarkSubmenu.js +165 -18
  85. package/dist/chat/ui/ChatActivity.js +649 -70
  86. package/dist/chat/ui/ChatReferenceChip.js +104 -9
  87. package/dist/chat/ui/CodeBlock.js +132 -58
  88. package/dist/chat/ui/Composer.js +866 -132
  89. package/dist/chat/ui/ComposerInput.js +309 -120
  90. package/dist/chat/ui/DiffPool.js +75 -14
  91. package/dist/chat/ui/EditDiff.js +160 -21
  92. package/dist/chat/ui/FadingWords.js +32 -3
  93. package/dist/chat/ui/GoalDock.js +235 -42
  94. package/dist/chat/ui/ImageView.js +617 -61
  95. package/dist/chat/ui/LimitState.js +446 -72
  96. package/dist/chat/ui/Markdown.js +991 -173
  97. package/dist/chat/ui/MermaidBlock.js +238 -68
  98. package/dist/chat/ui/MessageActions.js +251 -39
  99. package/dist/chat/ui/ModelMarks.js +55 -5
  100. package/dist/chat/ui/Pickers.js +664 -113
  101. package/dist/chat/ui/PromptComposer.js +281 -51
  102. package/dist/chat/ui/QuoteButton.js +151 -57
  103. package/dist/chat/ui/ResumeCompactionDock.d.ts +6 -2
  104. package/dist/chat/ui/ResumeCompactionDock.js +141 -6
  105. package/dist/chat/ui/RowTime.js +59 -5
  106. package/dist/chat/ui/RunSettings.js +1744 -154
  107. package/dist/chat/ui/Scrubber.js +517 -88
  108. package/dist/chat/ui/ShellCommand.js +183 -107
  109. package/dist/chat/ui/SubagentControls.js +212 -24
  110. package/dist/chat/ui/SubagentInfo.js +170 -13
  111. package/dist/chat/ui/SubagentStopButton.js +115 -24
  112. package/dist/chat/ui/SubagentTimeline.js +357 -91
  113. package/dist/chat/ui/Timeline.js +988 -476
  114. package/dist/chat/ui/TimelineMenu.js +552 -37
  115. package/dist/chat/ui/UnifiedDiff.js +234 -27
  116. package/dist/chat/ui/UploadThumb.js +37 -7
  117. package/dist/chat/ui/VisualDialogs.js +251 -20
  118. package/dist/chat/ui/VisualFrame.js +321 -95
  119. package/dist/chat/ui/Welcome.js +72 -7
  120. package/dist/chat/ui/chips.js +1 -1
  121. package/dist/chat/ui/code-lines.js +36 -36
  122. package/dist/chat/ui/code-streaming.js +1 -1
  123. package/dist/chat/ui/code-theme.js +7 -7
  124. package/dist/chat/ui/composer/ComposerControls.js +329 -21
  125. package/dist/chat/ui/composer/ComposerMenu.js +358 -30
  126. package/dist/chat/ui/composer/DraftParts.js +185 -11
  127. package/dist/chat/ui/composer/QueuedMessages.js +138 -13
  128. package/dist/chat/ui/composer/chips.js +29 -19
  129. package/dist/chat/ui/composer/editor.js +79 -63
  130. package/dist/chat/ui/composer/insert.js +26 -12
  131. package/dist/chat/ui/composer/key-handler.js +180 -127
  132. package/dist/chat/ui/composer/keys.js +90 -73
  133. package/dist/chat/ui/composer/menu-aria.js +18 -9
  134. package/dist/chat/ui/composer/placeholder.js +78 -31
  135. package/dist/chat/ui/composer/surface.js +13 -37
  136. package/dist/chat/ui/composer/use-chat-controls.js +230 -90
  137. package/dist/chat/ui/composer/use-compaction-offer.js +50 -18
  138. package/dist/chat/ui/composer/use-composer-draft.js +65 -34
  139. package/dist/chat/ui/composer/use-composer-menus.js +478 -193
  140. package/dist/chat/ui/composer/use-composer-submit.js +251 -109
  141. package/dist/chat/ui/composer/use-continuable-turn.js +33 -6
  142. package/dist/chat/ui/composer/use-draft-files.js +245 -93
  143. package/dist/chat/ui/composer/use-effort-stepper.d.ts +13 -0
  144. package/dist/chat/ui/composer/use-effort-stepper.js +88 -0
  145. package/dist/chat/ui/composer/use-notice.js +61 -16
  146. package/dist/chat/ui/composer/use-pending-requests.js +38 -17
  147. package/dist/chat/ui/composer/use-prompt-history.js +117 -45
  148. package/dist/chat/ui/composer/use-prompt-hold.js +119 -35
  149. package/dist/chat/ui/composer/use-take-back.js +94 -72
  150. package/dist/chat/ui/diff/ApprovalReview.js +101 -23
  151. package/dist/chat/ui/diff/DiffFallbackBoundary.js +21 -13
  152. package/dist/chat/ui/diff/DiffOmitted.js +56 -6
  153. package/dist/chat/ui/diff/DiffStack.js +92 -8
  154. package/dist/chat/ui/diff/DiffUnavailable.js +56 -6
  155. package/dist/chat/ui/diff/EditorEditDiff.js +263 -51
  156. package/dist/chat/ui/diff/EditorPatchDiff.js +39 -14
  157. package/dist/chat/ui/diff/LegacyDiffPool.js +27 -10
  158. package/dist/chat/ui/diff/LegacyEditDiff.js +97 -20
  159. package/dist/chat/ui/diff/LegacyUnifiedDiff.js +172 -42
  160. package/dist/chat/ui/diff/RawDiff.js +65 -5
  161. package/dist/chat/ui/diff/ReviewDiff.js +77 -5
  162. package/dist/chat/ui/diff/diff-props.js +1 -1
  163. package/dist/chat/ui/diff/diff-source-budget.js +46 -35
  164. package/dist/chat/ui/diff/editor-edit-model.js +18 -14
  165. package/dist/chat/ui/diff/review-plan.js +63 -40
  166. package/dist/chat/ui/diff/review-settle.js +24 -9
  167. package/dist/chat/ui/diff/syntax-runtime.js +236 -201
  168. package/dist/chat/ui/diff/use-review-stack.js +146 -25
  169. package/dist/chat/ui/diff-syntax.js +70 -58
  170. package/dist/chat/ui/diff-theme.js +31 -12
  171. package/dist/chat/ui/file-links.js +39 -10
  172. package/dist/chat/ui/find-reveal.js +29 -8
  173. package/dist/chat/ui/full-diff.js +17 -12
  174. package/dist/chat/ui/highlighter.js +143 -113
  175. package/dist/chat/ui/icons.js +16 -7
  176. package/dist/chat/ui/index.js +1 -1
  177. package/dist/chat/ui/intelligent-ui/UiBlockFrame.js +556 -82
  178. package/dist/chat/ui/intelligent-ui/UiFallbackPart.js +73 -5
  179. package/dist/chat/ui/intelligent-ui/UiReply.js +666 -262
  180. package/dist/chat/ui/intelligent-ui/block-local.js +59 -31
  181. package/dist/chat/ui/intelligent-ui/chart-data.js +77 -67
  182. package/dist/chat/ui/intelligent-ui/node-text.js +77 -91
  183. package/dist/chat/ui/intelligent-ui/registry.js +46 -46
  184. package/dist/chat/ui/intelligent-ui/render-context.js +1 -1
  185. package/dist/chat/ui/intelligent-ui/renderers/base-land.js +1 -1
  186. package/dist/chat/ui/intelligent-ui/renderers/binding.js +3 -3
  187. package/dist/chat/ui/intelligent-ui/renderers/chart.js +1223 -123
  188. package/dist/chat/ui/intelligent-ui/renderers/choices.js +312 -34
  189. package/dist/chat/ui/intelligent-ui/renderers/content.js +1241 -86
  190. package/dist/chat/ui/intelligent-ui/renderers/data.js +619 -54
  191. package/dist/chat/ui/intelligent-ui/renderers/inputs.js +868 -67
  192. package/dist/chat/ui/intelligent-ui/renderers/links.js +366 -62
  193. package/dist/chat/ui/intelligent-ui/renderers/map-slots.js +118 -60
  194. package/dist/chat/ui/intelligent-ui/renderers/map-style.js +85 -78
  195. package/dist/chat/ui/intelligent-ui/renderers/map-view.js +282 -217
  196. package/dist/chat/ui/intelligent-ui/renderers/map.js +621 -69
  197. package/dist/chat/ui/intelligent-ui/renderers/place-point.js +15 -8
  198. package/dist/chat/ui/intelligent-ui/renderers/structure.js +262 -20
  199. package/dist/chat/ui/intelligent-ui/renderers/text.js +674 -49
  200. package/dist/chat/ui/intelligent-ui/reply-parts.js +24 -15
  201. package/dist/chat/ui/intelligent-ui/table-data.js +97 -57
  202. package/dist/chat/ui/intelligent-ui/tones.js +31 -31
  203. package/dist/chat/ui/intelligent-ui/use-in-view.js +30 -12
  204. package/dist/chat/ui/intelligent-ui/use-later.js +28 -13
  205. package/dist/chat/ui/intelligent-ui/use-truncated.js +45 -21
  206. package/dist/chat/ui/intelligent-ui/use-ui-links.js +296 -109
  207. package/dist/chat/ui/intelligent-ui/use-ui-queries.js +256 -246
  208. package/dist/chat/ui/markdown-blocks.js +296 -262
  209. package/dist/chat/ui/mermaid.js +60 -72
  210. package/dist/chat/ui/quote-selection.js +32 -29
  211. package/dist/chat/ui/rehype-chips.js +35 -23
  212. package/dist/chat/ui/rehype-fade.js +28 -17
  213. package/dist/chat/ui/remark-html-as-text.js +22 -15
  214. package/dist/chat/ui/reply-context.js +1 -1
  215. package/dist/chat/ui/reveal.js +161 -72
  216. package/dist/chat/ui/rows/ForksRow.js +226 -24
  217. package/dist/chat/ui/rows/GeneratedImageRow.js +541 -87
  218. package/dist/chat/ui/rows/MessageRows.js +1706 -159
  219. package/dist/chat/ui/rows/RowContainer.js +57 -7
  220. package/dist/chat/ui/rows/Rows.js +463 -54
  221. package/dist/chat/ui/rows/SubagentRow.js +577 -60
  222. package/dist/chat/ui/rows/TaskRow.js +359 -40
  223. package/dist/chat/ui/rows/VisualRow.js +233 -11
  224. package/dist/chat/ui/rows/WorkRows.js +1945 -164
  225. package/dist/chat/ui/rows/WorkflowRow.js +293 -34
  226. package/dist/chat/ui/rows/row-rhythm.js +27 -17
  227. package/dist/chat/ui/theme-watch.js +26 -23
  228. package/dist/chat/ui/timestamp-format.js +4 -1
  229. package/dist/chat/ui/use-diff-source-tokens.js +70 -34
  230. package/dist/chat/ui/useToggleSet.js +51 -19
  231. package/dist/chat/ui/visual-theme.js +153 -128
  232. package/dist/chat/visual-bridge.js +123 -123
  233. package/dist/chat/visual-viewport.js +94 -83
  234. package/dist/chat/visuals.js +13 -5
  235. package/dist/host-hooks.d.ts +29 -0
  236. package/dist/host-hooks.js +78 -0
  237. package/dist/host.js +120 -48
  238. package/dist/index.js +1 -1
  239. package/dist/lazy.js +38 -32
  240. package/dist/locales/en/agent-chat.d.ts +34 -0
  241. package/dist/locales/en/agent-chat.js +747 -713
  242. package/dist/locales/en/agent-prompts.js +42 -42
  243. package/dist/locales/en/agent-providers.d.ts +1 -0
  244. package/dist/locales/en/agent-providers.js +166 -165
  245. package/dist/locales/en/agent-usage.d.ts +6 -0
  246. package/dist/locales/en/agent-usage.js +129 -123
  247. package/dist/locales/nl/agent-chat.d.ts +34 -0
  248. package/dist/locales/nl/agent-chat.js +747 -713
  249. package/dist/locales/nl/agent-prompts.js +42 -42
  250. package/dist/locales/nl/agent-providers.d.ts +1 -0
  251. package/dist/locales/nl/agent-providers.js +166 -165
  252. package/dist/locales/nl/agent-usage.d.ts +6 -0
  253. package/dist/locales/nl/agent-usage.js +129 -123
  254. package/dist/locales.js +14 -14
  255. package/dist/mounted-registry.js +31 -30
  256. package/dist/port-transport.js +122 -111
  257. package/dist/prompts/index.js +1 -1
  258. package/dist/prompts/logic/focus.js +15 -14
  259. package/dist/prompts/logic/keys.js +93 -59
  260. package/dist/prompts/logic/prompts.js +27 -14
  261. package/dist/prompts/logic/subjects.js +60 -46
  262. package/dist/prompts/logic/useFocusAfterAnswer.js +60 -20
  263. package/dist/prompts/logic/usePromptSession.js +88 -77
  264. package/dist/prompts/ui/ApprovalBody.js +246 -27
  265. package/dist/prompts/ui/PromptActions.js +215 -9
  266. package/dist/prompts/ui/PromptCard.js +215 -36
  267. package/dist/prompts/ui/PromptView.js +372 -34
  268. package/dist/prompts/ui/QuestionBody.js +269 -73
  269. package/dist/providers/AccountColors.js +36 -5
  270. package/dist/providers/AccountDetail.js +683 -50
  271. package/dist/providers/AccountVariables.js +139 -32
  272. package/dist/providers/AddAccountForm.js +125 -38
  273. package/dist/providers/CliDetail.js +343 -36
  274. package/dist/providers/InstallPage.js +644 -59
  275. package/dist/providers/ProviderList.d.ts +2 -1
  276. package/dist/providers/ProviderList.js +215 -23
  277. package/dist/providers/ProvidersPane.d.ts +4 -2
  278. package/dist/providers/ProvidersPane.js +244 -64
  279. package/dist/providers/account-actions.js +54 -30
  280. package/dist/providers/index.js +1 -1
  281. package/dist/providers/install-steps.js +12 -9
  282. package/dist/providers/pane-target.d.ts +3 -0
  283. package/dist/providers/pane-target.js +34 -13
  284. package/dist/providers/parts.js +62 -12
  285. package/dist/providers/provider-abilities.js +5 -5
  286. package/dist/providers/provider-groups.js +75 -40
  287. package/dist/providers/variables.js +73 -39
  288. package/dist/scope.js +6 -6
  289. package/dist/settings/sections.js +18 -18
  290. package/dist/state/chats.js +404 -192
  291. package/dist/state/index.js +1 -1
  292. package/dist/state/provider-accounts.js +70 -47
  293. package/dist/state/providers.js +45 -16
  294. package/dist/state/usage.js +154 -77
  295. package/dist/storage.js +69 -68
  296. package/dist/testing/index.js +1 -1
  297. package/dist/testing/prompts.js +105 -67
  298. package/dist/transport.js +10 -10
  299. package/dist/ui/PlainTextarea.js +27 -3
  300. package/dist/usage/LimitsList.js +646 -40
  301. package/dist/usage/UsageBreakdown.js +879 -38
  302. package/dist/usage/UsageChart.js +311 -32
  303. package/dist/usage/UsageDialog.js +46 -4
  304. package/dist/usage/UsageLimits.js +467 -34
  305. package/dist/usage/UsageLimitsCard.js +95 -11
  306. package/dist/usage/UsagePage.js +817 -96
  307. package/dist/usage/UsagePane.js +164 -10
  308. package/dist/usage/UsageSummary.js +151 -6
  309. package/dist/usage/UsageTiles.js +164 -14
  310. package/dist/usage/format.js +32 -32
  311. package/dist/usage/index.d.ts +1 -1
  312. package/dist/usage/index.js +2 -1
  313. package/dist/usage/limit-groups.d.ts +2 -0
  314. package/dist/usage/limit-groups.js +77 -59
  315. package/dist/usage/limits.js +78 -43
  316. package/dist/usage/money.js +20 -4
  317. package/dist/usage/summary.js +85 -64
  318. package/package.json +8 -8
  319. package/src/agents/ModelOptionControl.tsx +3 -1
  320. package/src/agents/option-words.ts +27 -0
  321. package/src/chat/account-choice.ts +41 -1
  322. package/src/chat/composer-effort.ts +32 -0
  323. package/src/chat/forks.ts +4 -5
  324. package/src/chat/index.ts +3 -1
  325. package/src/chat/logic/effort.ts +32 -0
  326. package/src/chat/logic/picker-entries.ts +45 -10
  327. package/src/chat/logic/resume-compaction.ts +95 -17
  328. package/src/chat/logic/timeline.ts +11 -3
  329. package/src/chat/preferences.ts +35 -0
  330. package/src/chat/subagent-view.ts +2 -3
  331. package/src/chat/ui/AnsiOutput.tsx +1 -2
  332. package/src/chat/ui/BookmarkSubmenu.tsx +3 -3
  333. package/src/chat/ui/ChatActivity.tsx +14 -22
  334. package/src/chat/ui/ChatReferenceChip.tsx +2 -3
  335. package/src/chat/ui/Composer.tsx +15 -7
  336. package/src/chat/ui/EditDiff.tsx +2 -3
  337. package/src/chat/ui/LimitState.tsx +2 -2
  338. package/src/chat/ui/Markdown.tsx +10 -8
  339. package/src/chat/ui/MermaidBlock.tsx +2 -3
  340. package/src/chat/ui/Pickers.tsx +49 -29
  341. package/src/chat/ui/PromptComposer.tsx +7 -9
  342. package/src/chat/ui/ResumeCompactionDock.tsx +16 -4
  343. package/src/chat/ui/RunSettings.tsx +67 -28
  344. package/src/chat/ui/Scrubber.tsx +3 -3
  345. package/src/chat/ui/ShellCommand.tsx +2 -0
  346. package/src/chat/ui/SubagentInfo.tsx +2 -3
  347. package/src/chat/ui/SubagentTimeline.tsx +12 -16
  348. package/src/chat/ui/Timeline.tsx +6 -6
  349. package/src/chat/ui/UnifiedDiff.tsx +3 -4
  350. package/src/chat/ui/VisualFrame.tsx +5 -8
  351. package/src/chat/ui/code-theme.ts +4 -4
  352. package/src/chat/ui/composer/placeholder.ts +2 -2
  353. package/src/chat/ui/composer/use-compaction-offer.ts +36 -16
  354. package/src/chat/ui/composer/use-composer-menus.ts +4 -9
  355. package/src/chat/ui/composer/use-composer-submit.ts +2 -1
  356. package/src/chat/ui/composer/use-effort-stepper.ts +56 -0
  357. package/src/chat/ui/composer/use-notice.ts +2 -2
  358. package/src/chat/ui/diff/EditorEditDiff.tsx +9 -13
  359. package/src/chat/ui/diff/LegacyEditDiff.tsx +12 -17
  360. package/src/chat/ui/diff/LegacyUnifiedDiff.tsx +13 -21
  361. package/src/chat/ui/diff/use-review-stack.ts +4 -4
  362. package/src/chat/ui/diff-theme.ts +3 -3
  363. package/src/chat/ui/file-links.ts +2 -2
  364. package/src/chat/ui/intelligent-ui/UiReply.tsx +2 -0
  365. package/src/chat/ui/intelligent-ui/renderers/chart.tsx +3 -3
  366. package/src/chat/ui/intelligent-ui/renderers/content.tsx +5 -6
  367. package/src/chat/ui/intelligent-ui/renderers/map-view.tsx +2 -1
  368. package/src/chat/ui/intelligent-ui/renderers/map.tsx +2 -1
  369. package/src/chat/ui/intelligent-ui/use-truncated.ts +16 -19
  370. package/src/chat/ui/intelligent-ui/use-ui-links.ts +3 -3
  371. package/src/chat/ui/rows/ForksRow.tsx +3 -5
  372. package/src/chat/ui/rows/GeneratedImageRow.tsx +2 -1
  373. package/src/chat/ui/rows/MessageRows.tsx +12 -21
  374. package/src/chat/ui/rows/SubagentRow.tsx +3 -3
  375. package/src/chat/ui/rows/TaskRow.tsx +1 -1
  376. package/src/chat/ui/rows/WorkRows.tsx +10 -5
  377. package/src/chat/ui/useToggleSet.ts +15 -18
  378. package/src/chat/ui/visual-theme.ts +2 -3
  379. package/src/host-hooks.ts +113 -0
  380. package/src/lazy.tsx +2 -0
  381. package/src/locales/en/agent-chat.ts +134 -108
  382. package/src/locales/en/agent-prompts.ts +7 -7
  383. package/src/locales/en/agent-providers.ts +35 -34
  384. package/src/locales/en/agent-usage.ts +26 -20
  385. package/src/locales/nl/agent-chat.ts +126 -100
  386. package/src/locales/nl/agent-prompts.ts +5 -5
  387. package/src/locales/nl/agent-providers.ts +33 -32
  388. package/src/locales/nl/agent-usage.ts +25 -20
  389. package/src/providers/CliDetail.tsx +2 -1
  390. package/src/providers/InstallPage.tsx +2 -4
  391. package/src/providers/ProviderList.tsx +12 -2
  392. package/src/providers/ProvidersPane.tsx +45 -15
  393. package/src/providers/pane-target.ts +20 -4
  394. package/src/state/chats.ts +2 -2
  395. package/src/usage/LimitsList.tsx +12 -13
  396. package/src/usage/UsageBreakdown.tsx +17 -6
  397. package/src/usage/UsageLimits.tsx +2 -1
  398. package/src/usage/UsagePage.tsx +3 -3
  399. package/src/usage/index.ts +1 -1
  400. package/src/usage/limit-groups.ts +12 -0
  401. package/src/usage/limits.ts +2 -2
  402. package/src/usage/money.ts +1 -2
@@ -1,131 +1,137 @@
1
1
  export default {
2
- limits: {
3
- title: 'Limieten',
4
- explain: 'Het streepje op een balk laat zien hoeveel van het venster voorbij is. Een balk voorbij dat streepje verbruikt sneller dan het venster teruggeeft.',
5
- loading: 'Limieten laden…',
6
- used: '{{percent}}% gebruikt',
7
- bar: '{{window}}, {{percent}}% gebruikt',
8
- windowPassed: '{{percent}}% van het venster voorbij',
9
- faster: 'Verbruikt sneller dan het venster teruggeeft.',
10
- slower: 'Verbruikt langzamer dan het venster teruggeeft.',
11
- resets: 'Reset {{at}}',
12
- none: 'Nog geen limieten gemeld.',
13
- notInstalled: 'Niet geïnstalleerd op deze machine.',
14
- noSubscription: 'Dit account gebruikt een API-sleutel en kent geen abonnementslimieten.',
15
- unreachable: 'De CLI was niet bereikbaar.',
16
- filter: 'Accounts waarvan je de limieten ziet',
17
- signedOut: 'Niet ingelogd',
18
- signedOutDetail: 'Niet ingelogd. Log in om de limieten te zien.',
19
- logIn: 'Inloggen',
20
- nextReset: '{{window}} reset {{at}}',
21
- checked: {
22
- now: 'nu',
23
- ago: '{{duration}} geleden',
24
- fromTurn: 'Uit een turn · {{when}}'
25
- }
2
+ limits: {
3
+ title: 'Limieten',
4
+ explain: 'De markering toont waar het verbruik bij een gelijk tempo zou staan. Voorbij de markering verbruik je sneller dan het weer vrijkomt.',
5
+ loading: 'Limieten laden…',
6
+ used: '{{percent}}% gebruikt',
7
+ bar: '{{window}}, {{percent}}% gebruikt',
8
+ windowPassed: '{{percent}}% van het venster voorbij',
9
+ faster: 'Sneller verbruikt dan het weer vrijkomt.',
10
+ slower: 'Langzamer verbruikt dan het weer vrijkomt.',
11
+ pace: {
12
+ ahead: '{{percent}}% gebruikt, voor op een gelijkmatig tempo van {{pace}}%',
13
+ behind: '{{percent}}% gebruikt, achter op een gelijkmatig tempo van {{pace}}%',
14
+ even: '{{percent}}% gebruikt, op een gelijkmatig tempo'
26
15
  },
27
- settings: {
28
- currency: {
29
- label: 'Valuta',
30
- dollars: 'Prijzen zoals gepubliceerd, in dollars.',
31
- noRate: 'Nog geen wisselkoers. De pagina toont dollars zolang die er niet is.',
32
- converted: 'Omgerekend met de ECB-referentiekoers van {{date}}.',
33
- options: {
34
- USD: 'Dollars',
35
- EUR: "Euro's"
36
- }
37
- },
38
- page: {
39
- label: 'Verbruikspagina',
40
- description: 'Kosten, tokens en planlimieten, per account.',
41
- open: 'Verbruik openen'
42
- }
43
- },
44
- section: {
45
- label: 'Verbruik',
46
- description: 'De valuta van de verbruikspagina.'
47
- },
48
- dialog: {
49
- title: 'Verbruik',
50
- description: 'Kosten, tokens en limieten van je abonnement',
51
- close: 'Verbruik sluiten',
52
- rescan: 'Opnieuw scannen',
53
- period: 'Periode',
54
- metric: 'Eenheid',
55
- failed: 'Verbruik kon niet worden getekend',
56
- periods: {
57
- today: 'Vandaag',
58
- '7d': '7 dagen',
59
- '30d': '30 dagen',
60
- '90d': '90 dagen'
61
- },
62
- metrics: {
63
- cost: 'Kosten',
64
- tokens: 'Tokens'
65
- },
66
- accounts: {
67
- label: 'Account',
68
- all: 'Alle accounts'
69
- }
70
- },
71
- empty: {
72
- noTranscripts: 'Geen transcripts van Claude of Codex gevonden. De machine leest ~/.claude/projects en ~/.codex/sessions.',
73
- noUsage: 'Nog geen verbruik op deze machine.'
74
- },
75
- agents: {
76
- none: 'Op deze machine staat geen agent-CLI.',
77
- installed: 'Deze machine heeft {{list}}.',
78
- settings: 'Agent-instellingen'
16
+ even: 'Even snel verbruikt als het vrijkomt.',
17
+ resets: 'Reset {{at}}',
18
+ none: 'Nog geen limieten gemeld.',
19
+ notInstalled: 'Niet geïnstalleerd op deze machine.',
20
+ noSubscription: 'API-sleutel, geen abonnementslimieten.',
21
+ unreachable: 'Kon de limieten niet ophalen.',
22
+ filter: 'Getoonde accounts',
23
+ signedOut: 'Niet ingelogd',
24
+ signedOutDetail: 'Niet ingelogd. Log in om limieten te zien.',
25
+ logIn: 'Inloggen',
26
+ nextReset: '{{window}} reset {{at}}',
27
+ checked: {
28
+ now: 'nu',
29
+ ago: '{{duration}} geleden',
30
+ fromTurn: 'Uit een turn · {{when}}'
31
+ }
32
+ },
33
+ settings: {
34
+ currency: {
35
+ label: 'Valuta',
36
+ dollars: 'Prijzen zoals gepubliceerd, in dollars.',
37
+ noRate: 'Nog geen wisselkoers. Bedragen in dollars.',
38
+ converted: 'Omgerekend met de ECB-koers van {{date}}.',
39
+ options: {
40
+ USD: 'Dollars',
41
+ EUR: "Euro's"
42
+ }
79
43
  },
80
- provenance: {
81
- failed: 'Kon de transcripts niet lezen. Dit is de laatste scan die wel lukte.',
82
- scanned_one: 'Gescand om {{time}}, {{files}} bestand',
83
- scanned_other: 'Gescand om {{time}}, {{files}} bestanden',
84
- bundledPrices: 'Prijzen uit de meegeleverde tabel',
85
- fetchedPrices: 'Prijzen van LiteLLM, {{date}}',
86
- rate: '{{currency}} tegen de ECB-koers van {{date}}'
44
+ page: {
45
+ label: 'Verbruikspagina',
46
+ description: 'Kosten, tokens en planlimieten, per account.',
47
+ open: 'Verbruik openen'
48
+ }
49
+ },
50
+ section: {
51
+ label: 'Verbruik',
52
+ description: 'Valuta van de verbruikspagina.'
53
+ },
54
+ dialog: {
55
+ title: 'Verbruik',
56
+ description: 'Kosten, tokens en limieten van je abonnement',
57
+ close: 'Verbruik sluiten',
58
+ rescan: 'Opnieuw scannen',
59
+ period: 'Periode',
60
+ metric: 'Eenheid',
61
+ failed: 'Kon het verbruik niet tonen',
62
+ periods: {
63
+ today: 'Vandaag',
64
+ '7d': '7 dagen',
65
+ '30d': '30 dagen',
66
+ '90d': '90 dagen'
87
67
  },
88
- summary: {
89
- sessions_one: '{{sessions}} sessie',
90
- sessions_other: '{{sessions}} sessies',
91
- calls_one: '{{calls}} aanroep',
92
- calls_other: '{{calls}} aanroepen',
93
- apiRates: 'tegen API-tarieven'
68
+ metrics: {
69
+ cost: 'Kosten',
70
+ tokens: 'Tokens'
94
71
  },
95
- tiles: {
96
- processed: 'Verwerkt',
97
- uncachedInput: 'Input zonder cache',
98
- cachedInput: 'Input uit cache',
99
- cacheWrites: 'Naar cache geschreven',
100
- output: 'Output',
101
- cacheSavings: 'Bespaard met cache'
72
+ accounts: {
73
+ label: 'Account',
74
+ all: 'Alle accounts'
75
+ }
76
+ },
77
+ empty: {
78
+ noTranscripts: 'Nog geen chats van Claude of Codex gevonden op deze machine.',
79
+ noUsage: 'Nog geen verbruik.'
80
+ },
81
+ agents: {
82
+ none: 'Geen agent-CLI geïnstalleerd.',
83
+ installed: 'Geïnstalleerd: {{list}}.',
84
+ settings: 'Agent-instellingen'
85
+ },
86
+ provenance: {
87
+ failed: 'Kon het laatste verbruik niet lezen. Dit zijn de vorige resultaten.',
88
+ scanned_one: 'Gescand om {{time}}, {{files}} bestand',
89
+ scanned_other: 'Gescand om {{time}}, {{files}} bestanden',
90
+ bundledPrices: 'Ingebouwde prijzen',
91
+ fetchedPrices: 'Prijzen van {{date}}',
92
+ rate: '{{currency}} tegen de ECB-koers van {{date}}'
93
+ },
94
+ summary: {
95
+ sessions_one: '{{sessions}} sessie',
96
+ sessions_other: '{{sessions}} sessies',
97
+ calls_one: '{{calls}} aanroep',
98
+ calls_other: '{{calls}} aanroepen',
99
+ apiRates: 'tegen API-tarieven'
100
+ },
101
+ tiles: {
102
+ processed: 'Verwerkt',
103
+ uncachedInput: 'Input zonder cache',
104
+ cachedInput: 'Input uit cache',
105
+ cacheWrites: 'Naar cache geschreven',
106
+ output: 'Output',
107
+ cacheSavings: 'Bespaard met cache'
108
+ },
109
+ chart: {
110
+ total: 'Totaal'
111
+ },
112
+ breakdown: {
113
+ title: 'Uitsplitsing',
114
+ tabs: {
115
+ models: 'Modellen',
116
+ projects: 'Projecten',
117
+ day: 'Dag'
102
118
  },
103
- chart: {
104
- total: 'Totaal'
119
+ models: {
120
+ model: 'Model',
121
+ calls: 'Aanroepen',
122
+ input: 'Input',
123
+ output: 'Output',
124
+ cache: 'Cache R/W',
125
+ cost: 'Kosten',
126
+ share: 'Aandeel',
127
+ pricedAs: 'Geprijsd als {{model}}',
128
+ noPrice: 'Geen prijs bekend'
105
129
  },
106
- breakdown: {
107
- title: 'Uitsplitsing',
108
- tabs: {
109
- models: 'Modellen',
110
- projects: 'Projecten',
111
- day: 'Dag'
112
- },
113
- models: {
114
- model: 'Model',
115
- calls: 'Aanroepen',
116
- input: 'Input',
117
- output: 'Output',
118
- cache: 'Cache R/W',
119
- cost: 'Kosten',
120
- share: 'Aandeel',
121
- pricedAs: 'Geprijsd als {{model}}',
122
- noPrice: 'Geen prijs bekend voor dit model'
123
- },
124
- days: {
125
- day: 'Dag',
126
- total: 'Totaal',
127
- tokens: 'Tokens',
128
- empty: 'Geen activiteit in deze periode.'
129
- }
130
+ days: {
131
+ day: 'Dag',
132
+ total: 'Totaal',
133
+ tokens: 'Tokens',
134
+ empty: 'Geen activiteit in deze periode.'
130
135
  }
131
- };
136
+ }
137
+ };
package/dist/locales.js CHANGED
@@ -1,21 +1,21 @@
1
1
  /* The words of this package, a namespace per surface, which the app adds to its i18next beside its own namespaces. */
2
2
  export const AGENTS_NAMESPACES = ['agent-chat', 'agent-prompts', 'agent-providers', 'agent-usage'];
3
3
  async function open(files) {
4
- return Object.fromEntries(await Promise.all(Object.entries(files).map(async ([namespace, file]) => [namespace, (await file()).default])));
4
+ return Object.fromEntries(await Promise.all(Object.entries(files).map(async ([namespace, file]) => [namespace, (await file()).default])));
5
5
  }
6
6
  /* The words are modules, not JSON: Node needs `with { type: 'json' }` on a JSON import, and a browser refuses it on the JavaScript Vite serves. */
7
7
  /* One loader per language that answers every namespace of it, so a bundler splits them and a window only downloads the language it shows. */
8
8
  export const AGENTS_LOCALES = {
9
- en: () => open({
10
- 'agent-chat': () => import('./locales/en/agent-chat.js'),
11
- 'agent-prompts': () => import('./locales/en/agent-prompts.js'),
12
- 'agent-providers': () => import('./locales/en/agent-providers.js'),
13
- 'agent-usage': () => import('./locales/en/agent-usage.js')
14
- }),
15
- nl: () => open({
16
- 'agent-chat': () => import('./locales/nl/agent-chat.js'),
17
- 'agent-prompts': () => import('./locales/nl/agent-prompts.js'),
18
- 'agent-providers': () => import('./locales/nl/agent-providers.js'),
19
- 'agent-usage': () => import('./locales/nl/agent-usage.js')
20
- })
21
- };
9
+ en: () => open({
10
+ 'agent-chat': () => import('./locales/en/agent-chat.js'),
11
+ 'agent-prompts': () => import('./locales/en/agent-prompts.js'),
12
+ 'agent-providers': () => import('./locales/en/agent-providers.js'),
13
+ 'agent-usage': () => import('./locales/en/agent-usage.js')
14
+ }),
15
+ nl: () => open({
16
+ 'agent-chat': () => import('./locales/nl/agent-chat.js'),
17
+ 'agent-prompts': () => import('./locales/nl/agent-prompts.js'),
18
+ 'agent-providers': () => import('./locales/nl/agent-providers.js'),
19
+ 'agent-usage': () => import('./locales/nl/agent-usage.js')
20
+ })
21
+ };
@@ -6,34 +6,35 @@ const REATTACH_CONCURRENCY = 4;
6
6
  * The host on the other side is a fresh one as far as this client knows, so nothing is assumed.
7
7
  */
8
8
  export class MountedRegistry extends Map {
9
- /* Nothing is attached over a link that is gone; `report` is how a store hears about it. */
10
- detachAll(report) {
11
- for (const [id, entry] of this) {
12
- entry.attached = false;
13
- report?.(id, entry);
14
- }
15
- }
16
- /*
17
- * One pass over what is mounted but not attached, in mount order, a few at a time. It works on a
18
- * copy, because attaching mounts and unmounts as it goes. An entry that left in the meantime is
19
- * skipped, since a node may leave the canvas while its attach is on the wire.
20
- */
21
- async reattachAll(reattach) {
22
- const queue = [...this];
23
- const work = async () => {
24
- for (let next = queue.shift(); next !== undefined; next = queue.shift()) {
25
- const [id, entry] = next;
26
- if (entry.attached || this.get(id) !== entry) {
27
- continue;
28
- }
29
- try {
30
- await reattach(id, entry);
31
- }
32
- catch {
33
- // A socket that dropped again brings the next pass; anything else surfaces on the next mount.
34
- }
35
- }
36
- };
37
- await Promise.all(Array.from({ length: REATTACH_CONCURRENCY }, work));
9
+ /* Nothing is attached over a link that is gone; `report` is how a store hears about it. */
10
+ detachAll(report) {
11
+ for (const [id, entry] of this) {
12
+ entry.attached = false;
13
+ report?.(id, entry);
38
14
  }
39
- }
15
+ }
16
+ /*
17
+ * One pass over what is mounted but not attached, in mount order, a few at a time. It works on a
18
+ * copy, because attaching mounts and unmounts as it goes. An entry that left in the meantime is
19
+ * skipped, since a node may leave the canvas while its attach is on the wire.
20
+ */
21
+ async reattachAll(reattach) {
22
+ const queue = [...this];
23
+ const work = async () => {
24
+ for (let next = queue.shift(); next !== undefined; next = queue.shift()) {
25
+ const [id, entry] = next;
26
+ if (entry.attached || this.get(id) !== entry) {
27
+ continue;
28
+ }
29
+ try {
30
+ await reattach(id, entry);
31
+ } catch {
32
+ // A socket that dropped again brings the next pass; anything else surfaces on the next mount.
33
+ }
34
+ }
35
+ };
36
+ await Promise.all(Array.from({
37
+ length: REATTACH_CONCURRENCY
38
+ }, work));
39
+ }
40
+ }
@@ -3,7 +3,7 @@ import { parseServerFrame } from '@adecore/agent-contracts/envelope';
3
3
  import { AGENT_EVENT_SCHEMAS, AGENT_REQUEST_SCHEMAS } from '@adecore/agent-contracts/protocol';
4
4
  import { ChatTransportError } from './transport.js';
5
5
  function isEventType(event) {
6
- return Object.hasOwn(AGENT_EVENT_SCHEMAS, event);
6
+ return Object.hasOwn(AGENT_EVENT_SCHEMAS, event);
7
7
  }
8
8
  /*
9
9
  * A chat host at the other end of a port, such as a process that runs the chats beside the window.
@@ -12,114 +12,125 @@ function isEventType(event) {
12
12
  * with a warning, the way the socket transport of an app drops one.
13
13
  */
14
14
  export function portTransport(port) {
15
- let status = 'open';
16
- let nextId = 1;
17
- const pending = new Map();
18
- const eventHandlers = new Map();
19
- const statusHandlers = new Set();
20
- const answer = (id, frame) => {
21
- const entry = pending.get(id);
22
- if (!entry) {
23
- return;
24
- }
15
+ let status = 'open';
16
+ let nextId = 1;
17
+ const pending = new Map();
18
+ const eventHandlers = new Map();
19
+ const statusHandlers = new Set();
20
+ const answer = (id, frame) => {
21
+ const entry = pending.get(id);
22
+ if (!entry) {
23
+ return;
24
+ }
25
+ pending.delete(id);
26
+ if (!frame.ok) {
27
+ entry.reject(new ChatTransportError(frame.error.code, frame.error.message));
28
+ return;
29
+ }
30
+ const result = AGENT_REQUEST_SCHEMAS[entry.type].result.safeParse(frame.result);
31
+ if (!result.success) {
32
+ entry.reject(new ChatTransportError('bad-reply', i18next.t('agent-chat:transport.badReply', {
33
+ type: entry.type
34
+ })));
35
+ return;
36
+ }
37
+ entry.resolve(result.data);
38
+ };
39
+ const dispatch = (event, payload) => {
40
+ if (!isEventType(event)) {
41
+ console.warn('Dropped an unknown event', event);
42
+ return;
43
+ }
44
+ const parsed = AGENT_EVENT_SCHEMAS[event].safeParse(payload);
45
+ if (!parsed.success) {
46
+ console.warn(`Dropped a malformed ${event} event`);
47
+ return;
48
+ }
49
+ // A copy, so a handler that unsubscribes while it runs does not change the set being walked.
50
+ for (const handler of [...(eventHandlers.get(event) ?? [])]) {
51
+ handler(parsed.data);
52
+ }
53
+ };
54
+ const stopListening = port.onFrame(raw => {
55
+ if (status === 'closed') {
56
+ return;
57
+ }
58
+ const parsed = parseServerFrame(raw);
59
+ if (!parsed.ok) {
60
+ console.warn('Dropped a malformed frame', parsed.message);
61
+ return;
62
+ }
63
+ const frame = parsed.value;
64
+ if ('event' in frame) {
65
+ dispatch(frame.event, frame.payload);
66
+ return;
67
+ }
68
+ if (frame.id === null) {
69
+ // An answer without an id is about a frame the host could not read; nothing waits for it.
70
+ console.warn('The chat host refused a frame', frame);
71
+ return;
72
+ }
73
+ answer(frame.id, frame);
74
+ });
75
+ return {
76
+ get status() {
77
+ return status;
78
+ },
79
+ request(type, payload) {
80
+ if (status !== 'open') {
81
+ return Promise.reject(new ChatTransportError('not-connected', i18next.t('agent-chat:transport.notConnected')));
82
+ }
83
+ const id = String(nextId++);
84
+ const promise = new Promise((resolve, reject) => {
85
+ pending.set(id, {
86
+ type,
87
+ resolve: resolve,
88
+ reject
89
+ });
90
+ });
91
+ try {
92
+ port.send({
93
+ id,
94
+ type,
95
+ payload
96
+ });
97
+ } catch {
98
+ // A payload the port cannot clone throws here, and the caller only listens to the promise.
25
99
  pending.delete(id);
26
- if (!frame.ok) {
27
- entry.reject(new ChatTransportError(frame.error.code, frame.error.message));
28
- return;
29
- }
30
- const result = AGENT_REQUEST_SCHEMAS[entry.type].result.safeParse(frame.result);
31
- if (!result.success) {
32
- entry.reject(new ChatTransportError('bad-reply', i18next.t('agent-chat:transport.badReply', { type: entry.type })));
33
- return;
34
- }
35
- entry.resolve(result.data);
36
- };
37
- const dispatch = (event, payload) => {
38
- if (!isEventType(event)) {
39
- console.warn('Dropped an unknown event', event);
40
- return;
41
- }
42
- const parsed = AGENT_EVENT_SCHEMAS[event].safeParse(payload);
43
- if (!parsed.success) {
44
- console.warn(`Dropped a malformed ${event} event`);
45
- return;
46
- }
47
- // A copy, so a handler that unsubscribes while it runs does not change the set being walked.
48
- for (const handler of [...(eventHandlers.get(event) ?? [])]) {
49
- handler(parsed.data);
50
- }
51
- };
52
- const stopListening = port.onFrame((raw) => {
53
- if (status === 'closed') {
54
- return;
55
- }
56
- const parsed = parseServerFrame(raw);
57
- if (!parsed.ok) {
58
- console.warn('Dropped a malformed frame', parsed.message);
59
- return;
60
- }
61
- const frame = parsed.value;
62
- if ('event' in frame) {
63
- dispatch(frame.event, frame.payload);
64
- return;
65
- }
66
- if (frame.id === null) {
67
- // An answer without an id is about a frame the host could not read; nothing waits for it.
68
- console.warn('The chat host refused a frame', frame);
69
- return;
70
- }
71
- answer(frame.id, frame);
72
- });
73
- return {
74
- get status() {
75
- return status;
76
- },
77
- request(type, payload) {
78
- if (status !== 'open') {
79
- return Promise.reject(new ChatTransportError('not-connected', i18next.t('agent-chat:transport.notConnected')));
80
- }
81
- const id = String(nextId++);
82
- const promise = new Promise((resolve, reject) => {
83
- pending.set(id, { type, resolve: resolve, reject });
84
- });
85
- try {
86
- port.send({ id, type, payload });
87
- }
88
- catch {
89
- // A payload the port cannot clone throws here, and the caller only listens to the promise.
90
- pending.delete(id);
91
- return Promise.reject(new ChatTransportError('not-sent', i18next.t('agent-chat:transport.notSent', { type })));
92
- }
93
- return promise;
94
- },
95
- on(event, handler) {
96
- const handlers = eventHandlers.get(event) ?? new Set();
97
- eventHandlers.set(event, handlers);
98
- handlers.add(handler);
99
- return () => {
100
- handlers.delete(handler);
101
- };
102
- },
103
- subscribeStatus(handler) {
104
- statusHandlers.add(handler);
105
- return () => {
106
- statusHandlers.delete(handler);
107
- };
108
- },
109
- close() {
110
- if (status === 'closed') {
111
- return;
112
- }
113
- status = 'closed';
114
- stopListening();
115
- const waiting = [...pending.values()];
116
- pending.clear();
117
- for (const entry of waiting) {
118
- entry.reject(new ChatTransportError('disconnected', i18next.t('agent-chat:transport.closedBeforeAnswer')));
119
- }
120
- for (const handler of [...statusHandlers]) {
121
- handler(status);
122
- }
123
- }
124
- };
125
- }
100
+ return Promise.reject(new ChatTransportError('not-sent', i18next.t('agent-chat:transport.notSent', {
101
+ type
102
+ })));
103
+ }
104
+ return promise;
105
+ },
106
+ on(event, handler) {
107
+ const handlers = eventHandlers.get(event) ?? new Set();
108
+ eventHandlers.set(event, handlers);
109
+ handlers.add(handler);
110
+ return () => {
111
+ handlers.delete(handler);
112
+ };
113
+ },
114
+ subscribeStatus(handler) {
115
+ statusHandlers.add(handler);
116
+ return () => {
117
+ statusHandlers.delete(handler);
118
+ };
119
+ },
120
+ close() {
121
+ if (status === 'closed') {
122
+ return;
123
+ }
124
+ status = 'closed';
125
+ stopListening();
126
+ const waiting = [...pending.values()];
127
+ pending.clear();
128
+ for (const entry of waiting) {
129
+ entry.reject(new ChatTransportError('disconnected', i18next.t('agent-chat:transport.closedBeforeAnswer')));
130
+ }
131
+ for (const handler of [...statusHandlers]) {
132
+ handler(status);
133
+ }
134
+ }
135
+ };
136
+ }
@@ -7,4 +7,4 @@ export { useFocusAfterAnswer } from './logic/useFocusAfterAnswer.js';
7
7
  export { usePromptSession } from './logic/usePromptSession.js';
8
8
  export { PromptPrimary, ApprovalActions } from './ui/PromptActions.js';
9
9
  export { PROMPT_SURFACE, PromptCard } from './ui/PromptCard.js';
10
- export { PromptView } from './ui/PromptView.js';
10
+ export { PromptView } from './ui/PromptView.js';
@@ -4,20 +4,21 @@
4
4
  * keyboard when it stands alone, and a stray Enter never grants anything. False when `root` holds no card.
5
5
  */
6
6
  export function focusPromptStart(root) {
7
- const card = root?.querySelector('.prompt-card');
8
- if (!card) {
9
- return false;
10
- }
11
- const start = card.querySelector('[data-prompt-entry]:not(:disabled)') ??
12
- card.querySelector('[role="toolbar"] button:not(:disabled):not([data-prompt-primary]):not([data-prompt-lasting])') ??
13
- card.querySelector('[data-prompt-primary]:not(:disabled)') ??
14
- card.querySelector('.prompt-heading');
15
- start?.focus({ preventScroll: true });
16
- return start !== null;
7
+ const card = root?.querySelector('.prompt-card');
8
+ if (!card) {
9
+ return false;
10
+ }
11
+ const start = card.querySelector('[data-prompt-entry]:not(:disabled)') ?? card.querySelector('[role="toolbar"] button:not(:disabled):not([data-prompt-primary]):not([data-prompt-lasting])') ?? card.querySelector('[data-prompt-primary]:not(:disabled)') ?? card.querySelector('.prompt-heading');
12
+ start?.focus({
13
+ preventScroll: true
14
+ });
15
+ return start !== null;
17
16
  }
18
17
  /* Puts the keyboard on a card's heading, where keys typed for something else answer nothing. False when `root` holds no card. */
19
18
  export function focusPromptHeading(root) {
20
- const heading = root?.querySelector('.prompt-card .prompt-heading');
21
- heading?.focus({ preventScroll: true });
22
- return !!heading;
23
- }
19
+ const heading = root?.querySelector('.prompt-card .prompt-heading');
20
+ heading?.focus({
21
+ preventScroll: true
22
+ });
23
+ return !!heading;
24
+ }