@adecore/agents-react 0.31.12 → 0.33.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 (409) hide show
  1. package/README.md +1 -1
  2. package/dist/agents/AccountDot.js +57 -6
  3. package/dist/agents/AgentIcon.js +88 -12
  4. package/dist/agents/ModelOptionControl.js +153 -18
  5. package/dist/agents/ProviderLogo.js +49 -4
  6. package/dist/agents/account-limits.js +17 -14
  7. package/dist/agents/accounts.js +99 -67
  8. package/dist/agents/agent-marks.js +5 -3
  9. package/dist/agents/model-name.js +42 -31
  10. package/dist/agents/model-options.js +8 -8
  11. package/dist/agents/model-requirement.js +17 -14
  12. package/dist/agents/option-words.d.ts +7 -0
  13. package/dist/agents/option-words.js +35 -0
  14. package/dist/agents/provider-paths.js +6 -6
  15. package/dist/agents/status-look.js +32 -12
  16. package/dist/chat/account-choice.d.ts +13 -0
  17. package/dist/chat/account-choice.js +90 -20
  18. package/dist/chat/actions.js +126 -59
  19. package/dist/chat/activity.js +5 -5
  20. package/dist/chat/attachments.js +74 -53
  21. package/dist/chat/bookmarks.js +58 -48
  22. package/dist/chat/chat-client.js +344 -263
  23. package/dist/chat/chat-references.js +3 -3
  24. package/dist/chat/composer-effort.d.ts +5 -0
  25. package/dist/chat/composer-effort.js +26 -0
  26. package/dist/chat/composer-send.js +13 -13
  27. package/dist/chat/drafts.js +115 -79
  28. package/dist/chat/forks.js +81 -24
  29. package/dist/chat/guards.js +15 -43
  30. package/dist/chat/index.d.ts +3 -1
  31. package/dist/chat/index.js +3 -2
  32. package/dist/chat/logic/ansi.js +170 -167
  33. package/dist/chat/logic/answers.js +2 -2
  34. package/dist/chat/logic/bookmarks.js +19 -19
  35. package/dist/chat/logic/command-looks.js +138 -96
  36. package/dist/chat/logic/context-usage.js +13 -9
  37. package/dist/chat/logic/continue-after-stop.js +15 -19
  38. package/dist/chat/logic/effort.d.ts +14 -0
  39. package/dist/chat/logic/effort.js +34 -0
  40. package/dist/chat/logic/embedded-code.js +387 -326
  41. package/dist/chat/logic/fork.js +134 -110
  42. package/dist/chat/logic/generated-image.js +54 -23
  43. package/dist/chat/logic/goal.js +28 -20
  44. package/dist/chat/logic/handback.js +6 -6
  45. package/dist/chat/logic/json.js +2 -2
  46. package/dist/chat/logic/limit.js +46 -30
  47. package/dist/chat/logic/picker-entries.d.ts +5 -3
  48. package/dist/chat/logic/picker-entries.js +83 -43
  49. package/dist/chat/logic/resume-compaction.d.ts +14 -1
  50. package/dist/chat/logic/resume-compaction.js +93 -24
  51. package/dist/chat/logic/scrubber.js +188 -136
  52. package/dist/chat/logic/thought.js +13 -16
  53. package/dist/chat/logic/thread-cards.js +60 -48
  54. package/dist/chat/logic/timeline-copy.js +30 -38
  55. package/dist/chat/logic/timeline-target.js +92 -63
  56. package/dist/chat/logic/timeline.js +499 -355
  57. package/dist/chat/logic/tool-catalog.js +54 -34
  58. package/dist/chat/logic/tools.js +106 -82
  59. package/dist/chat/logic/visual-height.js +18 -18
  60. package/dist/chat/logic/visual-viewport.js +6 -3
  61. package/dist/chat/logic/welcome.js +9 -9
  62. package/dist/chat/logic/workflow.d.ts +10 -0
  63. package/dist/chat/logic/workflow.js +130 -32
  64. package/dist/chat/mentions.js +149 -109
  65. package/dist/chat/persisted-json.js +51 -54
  66. package/dist/chat/preferences.d.ts +4 -0
  67. package/dist/chat/preferences.js +162 -84
  68. package/dist/chat/prompt-hold.js +9 -9
  69. package/dist/chat/quote.js +21 -30
  70. package/dist/chat/reading-width.js +12 -10
  71. package/dist/chat/recent-messages.js +34 -21
  72. package/dist/chat/resume-compaction-dismissals.js +25 -5
  73. package/dist/chat/runtime-modes.js +3 -3
  74. package/dist/chat/send-key.js +11 -7
  75. package/dist/chat/stash.js +89 -69
  76. package/dist/chat/subagent-conversation.js +181 -139
  77. package/dist/chat/subagent-list.js +65 -67
  78. package/dist/chat/subagent-support.js +12 -7
  79. package/dist/chat/subagent-view.js +132 -44
  80. package/dist/chat/thumbnails.js +88 -60
  81. package/dist/chat/timeline-flash.js +24 -12
  82. package/dist/chat/timeline-scroll.js +116 -86
  83. package/dist/chat/ui/AccountPill.js +126 -15
  84. package/dist/chat/ui/AnsiOutput.js +62 -6
  85. package/dist/chat/ui/BookmarkMarker.js +231 -41
  86. package/dist/chat/ui/BookmarkSubmenu.js +165 -18
  87. package/dist/chat/ui/ChatActivity.js +649 -70
  88. package/dist/chat/ui/ChatReferenceChip.js +104 -9
  89. package/dist/chat/ui/CodeBlock.js +132 -58
  90. package/dist/chat/ui/Composer.js +866 -132
  91. package/dist/chat/ui/ComposerInput.js +309 -120
  92. package/dist/chat/ui/DiffPool.js +75 -14
  93. package/dist/chat/ui/EditDiff.js +160 -21
  94. package/dist/chat/ui/FadingWords.js +32 -3
  95. package/dist/chat/ui/GoalDock.js +235 -42
  96. package/dist/chat/ui/ImageView.js +617 -61
  97. package/dist/chat/ui/LimitState.js +446 -72
  98. package/dist/chat/ui/Markdown.js +991 -173
  99. package/dist/chat/ui/MermaidBlock.js +285 -79
  100. package/dist/chat/ui/MessageActions.js +251 -39
  101. package/dist/chat/ui/ModelMarks.js +55 -5
  102. package/dist/chat/ui/Pickers.js +664 -113
  103. package/dist/chat/ui/PromptComposer.js +281 -51
  104. package/dist/chat/ui/QuoteButton.js +151 -57
  105. package/dist/chat/ui/ResumeCompactionDock.d.ts +6 -2
  106. package/dist/chat/ui/ResumeCompactionDock.js +141 -6
  107. package/dist/chat/ui/RowTime.js +59 -5
  108. package/dist/chat/ui/RunSettings.js +1744 -154
  109. package/dist/chat/ui/Scrubber.js +517 -88
  110. package/dist/chat/ui/ShellCommand.js +183 -107
  111. package/dist/chat/ui/SubagentControls.js +212 -24
  112. package/dist/chat/ui/SubagentInfo.js +170 -13
  113. package/dist/chat/ui/SubagentStopButton.js +115 -24
  114. package/dist/chat/ui/SubagentTimeline.js +357 -91
  115. package/dist/chat/ui/Timeline.js +988 -476
  116. package/dist/chat/ui/TimelineMenu.js +552 -37
  117. package/dist/chat/ui/UnifiedDiff.js +234 -27
  118. package/dist/chat/ui/UploadThumb.js +37 -7
  119. package/dist/chat/ui/VisualDialogs.js +251 -20
  120. package/dist/chat/ui/VisualFrame.js +321 -95
  121. package/dist/chat/ui/Welcome.js +72 -7
  122. package/dist/chat/ui/chips.js +1 -1
  123. package/dist/chat/ui/code-lines.js +36 -36
  124. package/dist/chat/ui/code-streaming.js +1 -1
  125. package/dist/chat/ui/code-theme.js +7 -7
  126. package/dist/chat/ui/composer/ComposerControls.js +329 -21
  127. package/dist/chat/ui/composer/ComposerMenu.js +358 -30
  128. package/dist/chat/ui/composer/DraftParts.js +185 -11
  129. package/dist/chat/ui/composer/QueuedMessages.js +138 -13
  130. package/dist/chat/ui/composer/chips.js +29 -19
  131. package/dist/chat/ui/composer/editor.js +79 -63
  132. package/dist/chat/ui/composer/insert.js +26 -12
  133. package/dist/chat/ui/composer/key-handler.js +180 -127
  134. package/dist/chat/ui/composer/keys.js +90 -73
  135. package/dist/chat/ui/composer/menu-aria.js +18 -9
  136. package/dist/chat/ui/composer/placeholder.js +78 -31
  137. package/dist/chat/ui/composer/surface.js +13 -37
  138. package/dist/chat/ui/composer/use-chat-controls.js +230 -90
  139. package/dist/chat/ui/composer/use-compaction-offer.js +50 -18
  140. package/dist/chat/ui/composer/use-composer-draft.js +65 -34
  141. package/dist/chat/ui/composer/use-composer-menus.js +478 -193
  142. package/dist/chat/ui/composer/use-composer-submit.js +251 -109
  143. package/dist/chat/ui/composer/use-continuable-turn.js +33 -6
  144. package/dist/chat/ui/composer/use-draft-files.js +245 -93
  145. package/dist/chat/ui/composer/use-effort-stepper.d.ts +13 -0
  146. package/dist/chat/ui/composer/use-effort-stepper.js +88 -0
  147. package/dist/chat/ui/composer/use-notice.js +61 -16
  148. package/dist/chat/ui/composer/use-pending-requests.js +38 -17
  149. package/dist/chat/ui/composer/use-prompt-history.js +117 -45
  150. package/dist/chat/ui/composer/use-prompt-hold.js +119 -35
  151. package/dist/chat/ui/composer/use-take-back.js +94 -72
  152. package/dist/chat/ui/diff/ApprovalReview.js +101 -23
  153. package/dist/chat/ui/diff/DiffFallbackBoundary.js +21 -13
  154. package/dist/chat/ui/diff/DiffOmitted.js +56 -6
  155. package/dist/chat/ui/diff/DiffStack.js +92 -8
  156. package/dist/chat/ui/diff/DiffUnavailable.js +56 -6
  157. package/dist/chat/ui/diff/EditorEditDiff.js +263 -51
  158. package/dist/chat/ui/diff/EditorPatchDiff.js +39 -14
  159. package/dist/chat/ui/diff/LegacyDiffPool.js +27 -10
  160. package/dist/chat/ui/diff/LegacyEditDiff.js +97 -20
  161. package/dist/chat/ui/diff/LegacyUnifiedDiff.js +172 -42
  162. package/dist/chat/ui/diff/RawDiff.js +65 -5
  163. package/dist/chat/ui/diff/ReviewDiff.js +77 -5
  164. package/dist/chat/ui/diff/diff-props.js +1 -1
  165. package/dist/chat/ui/diff/diff-source-budget.js +46 -35
  166. package/dist/chat/ui/diff/editor-edit-model.js +18 -14
  167. package/dist/chat/ui/diff/review-plan.js +63 -40
  168. package/dist/chat/ui/diff/review-settle.js +24 -9
  169. package/dist/chat/ui/diff/syntax-runtime.js +236 -201
  170. package/dist/chat/ui/diff/use-review-stack.js +146 -25
  171. package/dist/chat/ui/diff-syntax.js +70 -58
  172. package/dist/chat/ui/diff-theme.js +31 -12
  173. package/dist/chat/ui/file-links.js +39 -10
  174. package/dist/chat/ui/find-reveal.js +29 -8
  175. package/dist/chat/ui/full-diff.js +17 -12
  176. package/dist/chat/ui/highlighter.js +143 -113
  177. package/dist/chat/ui/icons.js +16 -7
  178. package/dist/chat/ui/index.js +1 -1
  179. package/dist/chat/ui/intelligent-ui/UiBlockFrame.js +556 -82
  180. package/dist/chat/ui/intelligent-ui/UiFallbackPart.js +73 -5
  181. package/dist/chat/ui/intelligent-ui/UiReply.js +666 -262
  182. package/dist/chat/ui/intelligent-ui/block-local.js +59 -31
  183. package/dist/chat/ui/intelligent-ui/chart-data.js +77 -67
  184. package/dist/chat/ui/intelligent-ui/node-text.js +77 -91
  185. package/dist/chat/ui/intelligent-ui/registry.js +46 -46
  186. package/dist/chat/ui/intelligent-ui/render-context.js +1 -1
  187. package/dist/chat/ui/intelligent-ui/renderers/base-land.js +1 -1
  188. package/dist/chat/ui/intelligent-ui/renderers/binding.js +3 -3
  189. package/dist/chat/ui/intelligent-ui/renderers/chart.js +1223 -123
  190. package/dist/chat/ui/intelligent-ui/renderers/choices.js +312 -34
  191. package/dist/chat/ui/intelligent-ui/renderers/content.js +1241 -86
  192. package/dist/chat/ui/intelligent-ui/renderers/data.js +619 -54
  193. package/dist/chat/ui/intelligent-ui/renderers/inputs.js +868 -67
  194. package/dist/chat/ui/intelligent-ui/renderers/links.js +366 -62
  195. package/dist/chat/ui/intelligent-ui/renderers/map-slots.js +118 -60
  196. package/dist/chat/ui/intelligent-ui/renderers/map-style.js +85 -78
  197. package/dist/chat/ui/intelligent-ui/renderers/map-view.js +282 -217
  198. package/dist/chat/ui/intelligent-ui/renderers/map.js +621 -69
  199. package/dist/chat/ui/intelligent-ui/renderers/place-point.js +15 -8
  200. package/dist/chat/ui/intelligent-ui/renderers/structure.js +262 -20
  201. package/dist/chat/ui/intelligent-ui/renderers/text.js +674 -49
  202. package/dist/chat/ui/intelligent-ui/reply-parts.js +24 -15
  203. package/dist/chat/ui/intelligent-ui/table-data.js +97 -57
  204. package/dist/chat/ui/intelligent-ui/tones.js +31 -31
  205. package/dist/chat/ui/intelligent-ui/use-in-view.js +30 -12
  206. package/dist/chat/ui/intelligent-ui/use-later.js +28 -13
  207. package/dist/chat/ui/intelligent-ui/use-truncated.js +45 -21
  208. package/dist/chat/ui/intelligent-ui/use-ui-links.js +296 -109
  209. package/dist/chat/ui/intelligent-ui/use-ui-queries.js +256 -246
  210. package/dist/chat/ui/markdown-blocks.js +296 -262
  211. package/dist/chat/ui/mermaid.d.ts +8 -20
  212. package/dist/chat/ui/mermaid.js +47 -84
  213. package/dist/chat/ui/quote-selection.js +32 -29
  214. package/dist/chat/ui/rehype-chips.js +35 -23
  215. package/dist/chat/ui/rehype-fade.js +28 -17
  216. package/dist/chat/ui/remark-html-as-text.js +22 -15
  217. package/dist/chat/ui/reply-context.js +1 -1
  218. package/dist/chat/ui/reveal.js +161 -72
  219. package/dist/chat/ui/rows/ForksRow.js +226 -24
  220. package/dist/chat/ui/rows/GeneratedImageRow.js +541 -87
  221. package/dist/chat/ui/rows/MessageRows.js +1706 -159
  222. package/dist/chat/ui/rows/RowContainer.js +57 -7
  223. package/dist/chat/ui/rows/Rows.js +463 -54
  224. package/dist/chat/ui/rows/SubagentRow.js +577 -60
  225. package/dist/chat/ui/rows/TaskRow.js +359 -40
  226. package/dist/chat/ui/rows/VisualRow.js +233 -11
  227. package/dist/chat/ui/rows/WorkRows.d.ts +3 -0
  228. package/dist/chat/ui/rows/WorkRows.js +1945 -164
  229. package/dist/chat/ui/rows/WorkflowRow.js +756 -37
  230. package/dist/chat/ui/rows/row-rhythm.js +27 -17
  231. package/dist/chat/ui/theme-watch.js +26 -23
  232. package/dist/chat/ui/timestamp-format.js +4 -1
  233. package/dist/chat/ui/use-diff-source-tokens.js +70 -34
  234. package/dist/chat/ui/useToggleSet.js +51 -19
  235. package/dist/chat/ui/visual-theme.js +153 -128
  236. package/dist/chat/visual-bridge.js +123 -123
  237. package/dist/chat/visual-viewport.js +94 -83
  238. package/dist/chat/visuals.js +13 -5
  239. package/dist/host-hooks.d.ts +29 -0
  240. package/dist/host-hooks.js +78 -0
  241. package/dist/host.js +120 -48
  242. package/dist/index.js +1 -1
  243. package/dist/lazy.js +38 -32
  244. package/dist/locales/en/agent-chat.d.ts +42 -0
  245. package/dist/locales/en/agent-chat.js +755 -713
  246. package/dist/locales/en/agent-prompts.js +42 -42
  247. package/dist/locales/en/agent-providers.d.ts +1 -0
  248. package/dist/locales/en/agent-providers.js +166 -165
  249. package/dist/locales/en/agent-usage.d.ts +6 -0
  250. package/dist/locales/en/agent-usage.js +129 -123
  251. package/dist/locales/nl/agent-chat.d.ts +42 -0
  252. package/dist/locales/nl/agent-chat.js +755 -713
  253. package/dist/locales/nl/agent-prompts.js +42 -42
  254. package/dist/locales/nl/agent-providers.d.ts +1 -0
  255. package/dist/locales/nl/agent-providers.js +166 -165
  256. package/dist/locales/nl/agent-usage.d.ts +6 -0
  257. package/dist/locales/nl/agent-usage.js +129 -123
  258. package/dist/locales.js +14 -14
  259. package/dist/mounted-registry.js +31 -30
  260. package/dist/port-transport.js +122 -111
  261. package/dist/prompts/index.js +1 -1
  262. package/dist/prompts/logic/focus.js +15 -14
  263. package/dist/prompts/logic/keys.js +93 -59
  264. package/dist/prompts/logic/prompts.js +27 -14
  265. package/dist/prompts/logic/subjects.js +60 -46
  266. package/dist/prompts/logic/useFocusAfterAnswer.js +60 -20
  267. package/dist/prompts/logic/usePromptSession.js +88 -77
  268. package/dist/prompts/ui/ApprovalBody.js +246 -27
  269. package/dist/prompts/ui/PromptActions.js +215 -9
  270. package/dist/prompts/ui/PromptCard.js +215 -36
  271. package/dist/prompts/ui/PromptView.js +372 -34
  272. package/dist/prompts/ui/QuestionBody.js +269 -73
  273. package/dist/providers/AccountColors.js +36 -5
  274. package/dist/providers/AccountDetail.js +683 -50
  275. package/dist/providers/AccountVariables.js +139 -32
  276. package/dist/providers/AddAccountForm.js +125 -38
  277. package/dist/providers/CliDetail.js +343 -36
  278. package/dist/providers/InstallPage.js +644 -59
  279. package/dist/providers/ProviderList.d.ts +2 -1
  280. package/dist/providers/ProviderList.js +215 -23
  281. package/dist/providers/ProvidersPane.d.ts +4 -2
  282. package/dist/providers/ProvidersPane.js +244 -64
  283. package/dist/providers/account-actions.js +54 -30
  284. package/dist/providers/index.js +1 -1
  285. package/dist/providers/install-steps.js +12 -9
  286. package/dist/providers/pane-target.d.ts +3 -0
  287. package/dist/providers/pane-target.js +34 -13
  288. package/dist/providers/parts.js +62 -12
  289. package/dist/providers/provider-abilities.js +5 -5
  290. package/dist/providers/provider-groups.js +75 -40
  291. package/dist/providers/variables.js +73 -39
  292. package/dist/scope.js +6 -6
  293. package/dist/settings/sections.js +18 -18
  294. package/dist/state/chats.js +404 -192
  295. package/dist/state/index.js +1 -1
  296. package/dist/state/provider-accounts.js +70 -47
  297. package/dist/state/providers.js +45 -16
  298. package/dist/state/usage.js +154 -77
  299. package/dist/storage.js +69 -68
  300. package/dist/testing/index.js +1 -1
  301. package/dist/testing/prompts.js +105 -67
  302. package/dist/transport.js +10 -10
  303. package/dist/ui/PlainTextarea.js +27 -3
  304. package/dist/usage/LimitsList.js +646 -40
  305. package/dist/usage/UsageBreakdown.js +879 -38
  306. package/dist/usage/UsageChart.js +311 -32
  307. package/dist/usage/UsageDialog.js +46 -4
  308. package/dist/usage/UsageLimits.js +467 -34
  309. package/dist/usage/UsageLimitsCard.js +95 -11
  310. package/dist/usage/UsagePage.js +817 -96
  311. package/dist/usage/UsagePane.js +164 -10
  312. package/dist/usage/UsageSummary.js +151 -6
  313. package/dist/usage/UsageTiles.js +164 -14
  314. package/dist/usage/format.js +32 -32
  315. package/dist/usage/index.d.ts +1 -1
  316. package/dist/usage/index.js +2 -1
  317. package/dist/usage/limit-groups.d.ts +2 -0
  318. package/dist/usage/limit-groups.js +77 -59
  319. package/dist/usage/limits.js +78 -43
  320. package/dist/usage/money.js +20 -4
  321. package/dist/usage/summary.js +85 -64
  322. package/package.json +9 -9
  323. package/src/agents/ModelOptionControl.tsx +3 -1
  324. package/src/agents/option-words.ts +27 -0
  325. package/src/chat/account-choice.ts +41 -1
  326. package/src/chat/composer-effort.ts +32 -0
  327. package/src/chat/forks.ts +4 -5
  328. package/src/chat/index.ts +3 -1
  329. package/src/chat/logic/effort.ts +32 -0
  330. package/src/chat/logic/picker-entries.ts +45 -10
  331. package/src/chat/logic/resume-compaction.ts +95 -17
  332. package/src/chat/logic/timeline.ts +11 -3
  333. package/src/chat/logic/workflow.ts +86 -4
  334. package/src/chat/preferences.ts +35 -0
  335. package/src/chat/subagent-view.ts +2 -3
  336. package/src/chat/ui/AnsiOutput.tsx +1 -2
  337. package/src/chat/ui/BookmarkSubmenu.tsx +3 -3
  338. package/src/chat/ui/ChatActivity.tsx +14 -22
  339. package/src/chat/ui/ChatReferenceChip.tsx +2 -3
  340. package/src/chat/ui/Composer.tsx +15 -7
  341. package/src/chat/ui/EditDiff.tsx +2 -3
  342. package/src/chat/ui/LimitState.tsx +2 -2
  343. package/src/chat/ui/Markdown.tsx +10 -8
  344. package/src/chat/ui/MermaidBlock.tsx +57 -49
  345. package/src/chat/ui/Pickers.tsx +49 -29
  346. package/src/chat/ui/PromptComposer.tsx +7 -9
  347. package/src/chat/ui/ResumeCompactionDock.tsx +16 -4
  348. package/src/chat/ui/RunSettings.tsx +67 -28
  349. package/src/chat/ui/Scrubber.tsx +3 -3
  350. package/src/chat/ui/ShellCommand.tsx +2 -0
  351. package/src/chat/ui/SubagentInfo.tsx +2 -3
  352. package/src/chat/ui/SubagentTimeline.tsx +12 -16
  353. package/src/chat/ui/Timeline.tsx +6 -6
  354. package/src/chat/ui/UnifiedDiff.tsx +3 -4
  355. package/src/chat/ui/VisualFrame.tsx +5 -8
  356. package/src/chat/ui/code-theme.ts +4 -4
  357. package/src/chat/ui/composer/placeholder.ts +2 -2
  358. package/src/chat/ui/composer/use-compaction-offer.ts +36 -16
  359. package/src/chat/ui/composer/use-composer-menus.ts +4 -9
  360. package/src/chat/ui/composer/use-composer-submit.ts +2 -1
  361. package/src/chat/ui/composer/use-effort-stepper.ts +56 -0
  362. package/src/chat/ui/composer/use-notice.ts +2 -2
  363. package/src/chat/ui/diff/EditorEditDiff.tsx +9 -13
  364. package/src/chat/ui/diff/LegacyEditDiff.tsx +12 -17
  365. package/src/chat/ui/diff/LegacyUnifiedDiff.tsx +13 -21
  366. package/src/chat/ui/diff/use-review-stack.ts +4 -4
  367. package/src/chat/ui/diff-theme.ts +3 -3
  368. package/src/chat/ui/file-links.ts +2 -2
  369. package/src/chat/ui/intelligent-ui/UiReply.tsx +2 -0
  370. package/src/chat/ui/intelligent-ui/renderers/chart.tsx +3 -3
  371. package/src/chat/ui/intelligent-ui/renderers/content.tsx +5 -6
  372. package/src/chat/ui/intelligent-ui/renderers/map-view.tsx +2 -1
  373. package/src/chat/ui/intelligent-ui/renderers/map.tsx +2 -1
  374. package/src/chat/ui/intelligent-ui/use-truncated.ts +16 -19
  375. package/src/chat/ui/intelligent-ui/use-ui-links.ts +3 -3
  376. package/src/chat/ui/mermaid.ts +52 -96
  377. package/src/chat/ui/rows/ForksRow.tsx +3 -5
  378. package/src/chat/ui/rows/GeneratedImageRow.tsx +2 -1
  379. package/src/chat/ui/rows/MessageRows.tsx +12 -21
  380. package/src/chat/ui/rows/SubagentRow.tsx +3 -3
  381. package/src/chat/ui/rows/TaskRow.tsx +1 -1
  382. package/src/chat/ui/rows/WorkRows.tsx +11 -6
  383. package/src/chat/ui/rows/WorkflowRow.tsx +144 -54
  384. package/src/chat/ui/useToggleSet.ts +15 -18
  385. package/src/chat/ui/visual-theme.ts +2 -3
  386. package/src/host-hooks.ts +113 -0
  387. package/src/lazy.tsx +2 -0
  388. package/src/locales/en/agent-chat.ts +142 -108
  389. package/src/locales/en/agent-prompts.ts +7 -7
  390. package/src/locales/en/agent-providers.ts +35 -34
  391. package/src/locales/en/agent-usage.ts +26 -20
  392. package/src/locales/nl/agent-chat.ts +134 -100
  393. package/src/locales/nl/agent-prompts.ts +5 -5
  394. package/src/locales/nl/agent-providers.ts +33 -32
  395. package/src/locales/nl/agent-usage.ts +25 -20
  396. package/src/providers/CliDetail.tsx +2 -1
  397. package/src/providers/InstallPage.tsx +2 -4
  398. package/src/providers/ProviderList.tsx +12 -2
  399. package/src/providers/ProvidersPane.tsx +45 -15
  400. package/src/providers/pane-target.ts +20 -4
  401. package/src/state/chats.ts +2 -2
  402. package/src/usage/LimitsList.tsx +12 -13
  403. package/src/usage/UsageBreakdown.tsx +17 -6
  404. package/src/usage/UsageLimits.tsx +2 -1
  405. package/src/usage/UsagePage.tsx +3 -3
  406. package/src/usage/index.ts +1 -1
  407. package/src/usage/limit-groups.ts +12 -0
  408. package/src/usage/limits.ts +2 -2
  409. package/src/usage/money.ts +1 -2
@@ -9,286 +9,367 @@ const HISTORY_PAGE = 90;
9
9
  * reattach stays on the host these chats run on.
10
10
  */
11
11
  export class ChatClient {
12
- transport;
13
- sink;
14
- providers;
15
- mounted = new MountedRegistry();
16
- unsubscribe = [];
17
- earlier = new Map();
18
- inspections = new Map();
19
- preferences = null;
20
- constructor(transport, sink, providers = null) {
21
- this.transport = transport;
22
- this.sink = sink;
23
- this.providers = providers;
24
- this.unsubscribe.push(transport.on('chat.event', ({ chatId, event, seq }) => {
25
- this.sink.apply(chatId, event);
26
- const entry = this.mounted.get(chatId);
27
- if (entry && seq !== undefined) {
28
- entry.seq = seq;
29
- }
30
- }),
31
- // Every chat on the machine, attached or not, so a node waiting on a person says so on a view nobody has open.
32
- transport.on('chat.status', ({ chatId, info }) => this.sink.status(chatId, info)), transport.on('chat.bookmarks', ({ chatId, bookmarks }) => this.sink.bookmarks(chatId, bookmarks)), transport.on('chat.visuals', ({ chatId, visuals }) => this.sink.visuals(chatId, visuals)), transport.subscribeStatus((status) => this.onStatus(status)));
33
- if (transport.status === 'open') {
34
- void this.loadProviders();
35
- void this.loadStatuses();
36
- }
12
+ transport;
13
+ sink;
14
+ providers;
15
+ mounted = new MountedRegistry();
16
+ unsubscribe = [];
17
+ earlier = new Map();
18
+ inspections = new Map();
19
+ preferences = null;
20
+ constructor(transport, sink, providers = null) {
21
+ this.transport = transport;
22
+ this.sink = sink;
23
+ this.providers = providers;
24
+ this.unsubscribe.push(transport.on('chat.event', ({
25
+ chatId,
26
+ event,
27
+ seq
28
+ }) => {
29
+ this.sink.apply(chatId, event);
30
+ const entry = this.mounted.get(chatId);
31
+ if (entry && seq !== undefined) {
32
+ entry.seq = seq;
33
+ }
34
+ }),
35
+ // Every chat on the machine, attached or not, so a node waiting on a person says so on a view nobody has open.
36
+ transport.on('chat.status', ({
37
+ chatId,
38
+ info
39
+ }) => this.sink.status(chatId, info)), transport.on('chat.bookmarks', ({
40
+ chatId,
41
+ bookmarks
42
+ }) => this.sink.bookmarks(chatId, bookmarks)), transport.on('chat.visuals', ({
43
+ chatId,
44
+ visuals
45
+ }) => this.sink.visuals(chatId, visuals)), transport.subscribeStatus(status => this.onStatus(status)));
46
+ if (transport.status === 'open') {
47
+ void this.loadProviders();
48
+ void this.loadStatuses();
37
49
  }
38
- inspect(chatId) {
39
- const pending = this.inspections.get(chatId);
40
- if (pending) {
41
- return pending;
42
- }
43
- const read = this.transport.request('chat.attach', { chatId, historyLimit: 100 }).finally(async () => {
44
- this.inspections.delete(chatId);
45
- // A visible chat owns its attachment; an inspection must never release it.
46
- if (!this.mounted.get(chatId)) {
47
- await this.transport.request('chat.detach', { chatId }).catch(() => undefined);
48
- }
49
- });
50
- this.inspections.set(chatId, read);
51
- return read;
50
+ }
51
+ inspect(chatId) {
52
+ const pending = this.inspections.get(chatId);
53
+ if (pending) {
54
+ return pending;
52
55
  }
53
- /* Answers false when the transport is not connected; the chat opens once it is. */
54
- async open(chatId, options) {
55
- this.mounted.set(chatId, { ...options, attached: false });
56
- try {
57
- await this.attach(chatId);
58
- return true;
59
- }
60
- catch (e) {
61
- if (isConnectionError(e)) {
62
- return false;
63
- }
64
- throw e;
65
- }
56
+ const read = this.transport.request('chat.attach', {
57
+ chatId,
58
+ historyLimit: 100
59
+ }).finally(async () => {
60
+ this.inspections.delete(chatId);
61
+ // A visible chat owns its attachment; an inspection must never release it.
62
+ if (!this.mounted.get(chatId)) {
63
+ await this.transport.request('chat.detach', {
64
+ chatId
65
+ }).catch(() => undefined);
66
+ }
67
+ });
68
+ this.inspections.set(chatId, read);
69
+ return read;
70
+ }
71
+ /* Answers false when the transport is not connected; the chat opens once it is. */
72
+ async open(chatId, options) {
73
+ this.mounted.set(chatId, {
74
+ ...options,
75
+ attached: false
76
+ });
77
+ try {
78
+ await this.attach(chatId);
79
+ return true;
80
+ } catch (e) {
81
+ if (isConnectionError(e)) {
82
+ return false;
83
+ }
84
+ throw e;
66
85
  }
67
- /*
68
- * Points a chat that has not spoken yet at another CLI. The host fixes a chat's provider when
69
- * it registers the chat, so the only way over is to drop the empty one and register it again.
70
- * The row stays until the attach of the new one replaces it, so a view keeps what it drew.
71
- */
72
- async retarget(chatId, provider, selection) {
73
- const entry = this.mounted.get(chatId);
74
- if (!entry) {
75
- return;
76
- }
77
- // The account belonged to the CLI the chat leaves, and the seq to its stream: the new chat's
78
- // stream starts over, so offering it the old seq would read as nothing missed and reset nothing.
79
- const { attached: _attached, account: _account, seq: _seq, ...options } = entry;
80
- this.mounted.delete(chatId);
81
- await this.transport.request('chat.kill', { chatId });
82
- try {
83
- await this.open(chatId, { ...options, provider, selection });
84
- }
85
- catch (e) {
86
- this.sink.forget(chatId);
87
- throw e;
88
- }
86
+ }
87
+ /*
88
+ * Points a chat that has not spoken yet at another CLI. The host fixes a chat's provider when
89
+ * it registers the chat, so the only way over is to drop the empty one and register it again.
90
+ * The row stays until the attach of the new one replaces it, so a view keeps what it drew.
91
+ */
92
+ async retarget(chatId, provider, selection) {
93
+ const entry = this.mounted.get(chatId);
94
+ if (!entry) {
95
+ return;
89
96
  }
90
- /*
91
- * Tells the host what a chat it starts on its own is made with while this socket is connected,
92
- * since no client mounting that chat sends a composer preference. Said again on every fresh socket.
93
- */
94
- setPreferences(preferences) {
95
- this.preferences = preferences;
96
- this.sendPreferences();
97
+ // The account belonged to the CLI the chat leaves, and the seq to its stream: the new chat's
98
+ // stream starts over, so offering it the old seq would read as nothing missed and reset nothing.
99
+ const {
100
+ attached: _attached,
101
+ account: _account,
102
+ seq: _seq,
103
+ ...options
104
+ } = entry;
105
+ this.mounted.delete(chatId);
106
+ await this.transport.request('chat.kill', {
107
+ chatId
108
+ });
109
+ try {
110
+ await this.open(chatId, {
111
+ ...options,
112
+ provider,
113
+ selection
114
+ });
115
+ } catch (e) {
116
+ this.sink.forget(chatId);
117
+ throw e;
97
118
  }
98
- async detach(chatId) {
99
- const entry = this.mounted.get(chatId);
100
- this.mounted.delete(chatId);
101
- if (!entry?.attached) {
102
- return;
103
- }
104
- try {
105
- await this.transport.request('chat.detach', { chatId });
106
- }
107
- catch {
108
- // The socket closing detaches every chat server-side anyway.
109
- }
119
+ }
120
+ /*
121
+ * Tells the host what a chat it starts on its own is made with while this socket is connected,
122
+ * since no client mounting that chat sends a composer preference. Said again on every fresh socket.
123
+ */
124
+ setPreferences(preferences) {
125
+ this.preferences = preferences;
126
+ this.sendPreferences();
127
+ }
128
+ async detach(chatId) {
129
+ const entry = this.mounted.get(chatId);
130
+ this.mounted.delete(chatId);
131
+ if (!entry?.attached) {
132
+ return;
110
133
  }
111
- /* Current hosts return the stable turn id; older compatible ones only report whether the message queued. */
112
- async send(chatId, text, extras = {}) {
113
- return this.transport.request('chat.send', {
114
- chatId,
115
- text,
116
- delivery: extras.delivery,
117
- mentions: extras.mentions,
118
- skills: extras.skills,
119
- chats: extras.chats,
120
- quoteSource: extras.quoteSource,
121
- attachments: extras.attachments
122
- });
134
+ try {
135
+ await this.transport.request('chat.detach', {
136
+ chatId
137
+ });
138
+ } catch {
139
+ // The socket closing detaches every chat server-side anyway.
123
140
  }
124
- /* Marks a message; the list every client of the chat holds comes back as `chat.bookmarks`. */
125
- async addBookmark(chatId, itemId, name) {
126
- const { bookmarks } = await this.transport.request('chat.addBookmark', { chatId, itemId, ...(name === undefined ? {} : { name }) });
127
- return bookmarks;
141
+ }
142
+ /* Current hosts return the stable turn id; older compatible ones only report whether the message queued. */
143
+ async send(chatId, text, extras = {}) {
144
+ return this.transport.request('chat.send', {
145
+ chatId,
146
+ text,
147
+ delivery: extras.delivery,
148
+ mentions: extras.mentions,
149
+ skills: extras.skills,
150
+ chats: extras.chats,
151
+ quoteSource: extras.quoteSource,
152
+ attachments: extras.attachments
153
+ });
154
+ }
155
+ /* Marks a message; the list every client of the chat holds comes back as `chat.bookmarks`. */
156
+ async addBookmark(chatId, itemId, name) {
157
+ const {
158
+ bookmarks
159
+ } = await this.transport.request('chat.addBookmark', {
160
+ chatId,
161
+ itemId,
162
+ ...(name === undefined ? {} : {
163
+ name
164
+ })
165
+ });
166
+ return bookmarks;
167
+ }
168
+ /* An empty name takes the name away. */
169
+ async renameBookmark(chatId, itemId, name) {
170
+ const {
171
+ bookmarks
172
+ } = await this.transport.request('chat.renameBookmark', {
173
+ chatId,
174
+ itemId,
175
+ name
176
+ });
177
+ return bookmarks;
178
+ }
179
+ async removeBookmark(chatId, itemId) {
180
+ const {
181
+ bookmarks
182
+ } = await this.transport.request('chat.removeBookmark', {
183
+ chatId,
184
+ itemId
185
+ });
186
+ return bookmarks;
187
+ }
188
+ /* Takes a visual and its page out of the chat for good; the list every client of the chat holds comes back as `chat.visuals`. */
189
+ async removeVisual(chatId, visualId) {
190
+ const {
191
+ visuals
192
+ } = await this.transport.request('chat.removeVisual', {
193
+ chatId,
194
+ visualId
195
+ });
196
+ return visuals;
197
+ }
198
+ /* What this chat's CLI would run as a skill, for the composer's `$` picker. */
199
+ async listSkills(chatId) {
200
+ const {
201
+ skills
202
+ } = await this.transport.request('skills.list', {
203
+ chatId
204
+ });
205
+ return skills;
206
+ }
207
+ /* Starts the chat over; refused with `chat-busy` while a turn runs, unless `force` stops that turn. */
208
+ async clear(chatId, force = false) {
209
+ await this.transport.request('chat.clear', {
210
+ chatId,
211
+ ...(force ? {
212
+ force: true
213
+ } : {})
214
+ });
215
+ }
216
+ /*
217
+ * Ends the chat's CLI and keeps its conversation, which the next message resumes in a fresh process
218
+ * that reads its skills, plugins and servers again; refused with `chat-busy` while the chat works.
219
+ */
220
+ async restart(chatId) {
221
+ await this.transport.request('chat.restart', {
222
+ chatId
223
+ });
224
+ }
225
+ async kill(chatId) {
226
+ this.mounted.delete(chatId);
227
+ this.sink.forget(chatId);
228
+ await this.transport.request('chat.kill', {
229
+ chatId
230
+ });
231
+ }
232
+ /*
233
+ * What every chat on this machine is doing right now. `chat.status` only carries a change, so a
234
+ * window that just opened or came back from a lost socket asks for the standing answer.
235
+ */
236
+ async loadStatuses() {
237
+ try {
238
+ const {
239
+ chats
240
+ } = await this.transport.request('chat.list', {});
241
+ for (const info of chats) {
242
+ this.sink.status(info.chatId, info);
243
+ }
244
+ } catch {
245
+ // The next status event says it instead; an older host never answers this at all.
128
246
  }
129
- /* An empty name takes the name away. */
130
- async renameBookmark(chatId, itemId, name) {
131
- const { bookmarks } = await this.transport.request('chat.renameBookmark', { chatId, itemId, name });
132
- return bookmarks;
247
+ }
248
+ async loadProviders() {
249
+ if (!this.providers) {
250
+ return;
133
251
  }
134
- async removeBookmark(chatId, itemId) {
135
- const { bookmarks } = await this.transport.request('chat.removeBookmark', { chatId, itemId });
136
- return bookmarks;
252
+ try {
253
+ const {
254
+ providers
255
+ } = await this.transport.request('provider.list', {});
256
+ this.providers.setProviders(providers);
257
+ } catch {
258
+ // The list comes with the next connection; pickers show what they had.
137
259
  }
138
- /* Takes a visual and its page out of the chat for good; the list every client of the chat holds comes back as `chat.visuals`. */
139
- async removeVisual(chatId, visualId) {
140
- const { visuals } = await this.transport.request('chat.removeVisual', { chatId, visualId });
141
- return visuals;
260
+ }
261
+ /*
262
+ * The page before the oldest one this chat holds, one request per chat at a time. A cursor the
263
+ * host no longer knows means the thread changed under it, so the chat is read again from its end.
264
+ */
265
+ loadEarlier(chatId, cursor) {
266
+ const running = this.earlier.get(chatId);
267
+ if (running) {
268
+ return running;
142
269
  }
143
- /* What this chat's CLI would run as a skill, for the composer's `$` picker. */
144
- async listSkills(chatId) {
145
- const { skills } = await this.transport.request('skills.list', { chatId });
146
- return skills;
270
+ const read = this.transport.request('chat.history', {
271
+ chatId,
272
+ cursor,
273
+ limit: HISTORY_PAGE
274
+ }).then(page => this.sink.prepend(chatId, cursor, page)).catch(async e => {
275
+ const entry = this.mounted.get(chatId);
276
+ if (errorCode(e) !== 'history-expired' || !entry) {
277
+ throw e;
278
+ }
279
+ delete entry.seq;
280
+ await this.attach(chatId);
281
+ }).finally(() => this.earlier.delete(chatId));
282
+ this.earlier.set(chatId, read);
283
+ return read;
284
+ }
285
+ isMounted(chatId) {
286
+ return this.mounted.has(chatId);
287
+ }
288
+ /* Lets go of the machine; the chats keep running there, the host only stops streaming them here. */
289
+ dispose() {
290
+ for (const off of this.unsubscribe) {
291
+ off();
147
292
  }
148
- /* Starts the chat over; refused with `chat-busy` while a turn runs, unless `force` stops that turn. */
149
- async clear(chatId, force = false) {
150
- await this.transport.request('chat.clear', { chatId, ...(force ? { force: true } : {}) });
293
+ this.unsubscribe.length = 0;
294
+ for (const chatId of [...this.mounted.keys()]) {
295
+ void this.detach(chatId);
151
296
  }
152
- /*
153
- * Ends the chat's CLI and keeps its conversation, which the next message resumes in a fresh process
154
- * that reads its skills, plugins and servers again; refused with `chat-busy` while the chat works.
155
- */
156
- async restart(chatId) {
157
- await this.transport.request('chat.restart', { chatId });
297
+ }
298
+ /*
299
+ * A reattach offers the last seq the store holds. The host answers only what came after it when
300
+ * it still has all of that, and the newest page of the thread otherwise, so a short drop costs a
301
+ * few events.
302
+ */
303
+ async attach(chatId) {
304
+ const entry = this.mounted.get(chatId);
305
+ if (!entry) {
306
+ return;
158
307
  }
159
- async kill(chatId) {
160
- this.mounted.delete(chatId);
161
- this.sink.forget(chatId);
162
- await this.transport.request('chat.kill', { chatId });
308
+ await this.transport.request('chat.create', {
309
+ chatId,
310
+ provider: entry.provider,
311
+ account: entry.account,
312
+ cwd: entry.cwd,
313
+ resume: entry.resume,
314
+ selection: entry.selection,
315
+ runtimeMode: entry.runtimeMode
316
+ });
317
+ // Closed or opened again in the meantime: an opening that is still there attaches itself.
318
+ if (this.mounted.get(chatId) !== entry) {
319
+ return;
163
320
  }
164
- /*
165
- * What every chat on this machine is doing right now. `chat.status` only carries a change, so a
166
- * window that just opened or came back from a lost socket asks for the standing answer.
167
- */
168
- async loadStatuses() {
169
- try {
170
- const { chats } = await this.transport.request('chat.list', {});
171
- for (const info of chats) {
172
- this.sink.status(info.chatId, info);
173
- }
174
- }
175
- catch {
176
- // The next status event says it instead; an older host never answers this at all.
177
- }
321
+ const since = entry.seq;
322
+ const result = await this.transport.request('chat.attach', {
323
+ chatId,
324
+ historyLimit: HISTORY_PAGE,
325
+ ...(since === undefined ? {} : {
326
+ since
327
+ })
328
+ });
329
+ const current = this.mounted.get(chatId);
330
+ if (current !== entry) {
331
+ // Its detach found nothing attached yet, and the host would stream this chat here until the socket closes.
332
+ if (!current) {
333
+ await this.transport.request('chat.detach', {
334
+ chatId
335
+ }).catch(() => undefined);
336
+ }
337
+ return;
178
338
  }
179
- async loadProviders() {
180
- if (!this.providers) {
181
- return;
182
- }
183
- try {
184
- const { providers } = await this.transport.request('provider.list', {});
185
- this.providers.setProviders(providers);
186
- }
187
- catch {
188
- // The list comes with the next connection; pickers show what they had.
189
- }
339
+ entry.attached = true;
340
+ if (result.seq !== undefined) {
341
+ entry.seq = result.seq;
190
342
  }
191
- /*
192
- * The page before the oldest one this chat holds, one request per chat at a time. A cursor the
193
- * host no longer knows means the thread changed under it, so the chat is read again from its end.
194
- */
195
- loadEarlier(chatId, cursor) {
196
- const running = this.earlier.get(chatId);
197
- if (running) {
198
- return running;
199
- }
200
- const read = this.transport
201
- .request('chat.history', { chatId, cursor, limit: HISTORY_PAGE })
202
- .then((page) => this.sink.prepend(chatId, cursor, page))
203
- .catch(async (e) => {
204
- const entry = this.mounted.get(chatId);
205
- if (errorCode(e) !== 'history-expired' || !entry) {
206
- throw e;
207
- }
208
- delete entry.seq;
209
- await this.attach(chatId);
210
- })
211
- .finally(() => this.earlier.delete(chatId));
212
- this.earlier.set(chatId, read);
213
- return read;
343
+ if (result.events && since !== undefined) {
344
+ for (const event of result.events) {
345
+ this.sink.apply(chatId, event);
346
+ }
347
+ } else {
348
+ const page = result.history === undefined ? undefined : {
349
+ history: result.history,
350
+ pending: result.pending ?? [],
351
+ subagents: result.subagents ?? []
352
+ };
353
+ this.sink.reset(chatId, result.info, result.items, page);
214
354
  }
215
- isMounted(chatId) {
216
- return this.mounted.has(chatId);
355
+ // A host without bookmarks or visuals sends none, and then this chat has none.
356
+ this.sink.bookmarks(chatId, result.bookmarks ?? []);
357
+ this.sink.visuals(chatId, result.visuals ?? []);
358
+ }
359
+ sendPreferences() {
360
+ if (this.preferences === null) {
361
+ return;
217
362
  }
218
- /* Lets go of the machine; the chats keep running there, the host only stops streaming them here. */
219
- dispose() {
220
- for (const off of this.unsubscribe) {
221
- off();
222
- }
223
- this.unsubscribe.length = 0;
224
- for (const chatId of [...this.mounted.keys()]) {
225
- void this.detach(chatId);
226
- }
363
+ void this.transport.request('chat.setPreferences', this.preferences).catch(() => undefined);
364
+ }
365
+ onStatus(status) {
366
+ if (status === 'open') {
367
+ this.sendPreferences();
368
+ void this.loadProviders();
369
+ void this.loadStatuses();
370
+ void this.mounted.reattachAll(chatId => this.attach(chatId));
371
+ return;
227
372
  }
228
- /*
229
- * A reattach offers the last seq the store holds. The host answers only what came after it when
230
- * it still has all of that, and the newest page of the thread otherwise, so a short drop costs a
231
- * few events.
232
- */
233
- async attach(chatId) {
234
- const entry = this.mounted.get(chatId);
235
- if (!entry) {
236
- return;
237
- }
238
- await this.transport.request('chat.create', {
239
- chatId,
240
- provider: entry.provider,
241
- account: entry.account,
242
- cwd: entry.cwd,
243
- resume: entry.resume,
244
- selection: entry.selection,
245
- runtimeMode: entry.runtimeMode
246
- });
247
- // Closed or opened again in the meantime: an opening that is still there attaches itself.
248
- if (this.mounted.get(chatId) !== entry) {
249
- return;
250
- }
251
- const since = entry.seq;
252
- const result = await this.transport.request('chat.attach', { chatId, historyLimit: HISTORY_PAGE, ...(since === undefined ? {} : { since }) });
253
- const current = this.mounted.get(chatId);
254
- if (current !== entry) {
255
- // Its detach found nothing attached yet, and the host would stream this chat here until the socket closes.
256
- if (!current) {
257
- await this.transport.request('chat.detach', { chatId }).catch(() => undefined);
258
- }
259
- return;
260
- }
261
- entry.attached = true;
262
- if (result.seq !== undefined) {
263
- entry.seq = result.seq;
264
- }
265
- if (result.events && since !== undefined) {
266
- for (const event of result.events) {
267
- this.sink.apply(chatId, event);
268
- }
269
- }
270
- else {
271
- const page = result.history === undefined ? undefined : { history: result.history, pending: result.pending ?? [], subagents: result.subagents ?? [] };
272
- this.sink.reset(chatId, result.info, result.items, page);
273
- }
274
- // A host without bookmarks or visuals sends none, and then this chat has none.
275
- this.sink.bookmarks(chatId, result.bookmarks ?? []);
276
- this.sink.visuals(chatId, result.visuals ?? []);
277
- }
278
- sendPreferences() {
279
- if (this.preferences === null) {
280
- return;
281
- }
282
- void this.transport.request('chat.setPreferences', this.preferences).catch(() => undefined);
283
- }
284
- onStatus(status) {
285
- if (status === 'open') {
286
- this.sendPreferences();
287
- void this.loadProviders();
288
- void this.loadStatuses();
289
- void this.mounted.reattachAll((chatId) => this.attach(chatId));
290
- return;
291
- }
292
- this.mounted.detachAll();
293
- }
294
- }
373
+ this.mounted.detachAll();
374
+ }
375
+ }
@@ -1,5 +1,5 @@
1
1
  /* The chats an `@query` offers: never the chat typing it or one already attached. */
2
2
  export function chatSuggestions(chats, query, exclude, limit) {
3
- const needle = query.toLowerCase();
4
- return chats.filter((chat) => !exclude.includes(chat.id) && chat.title.toLowerCase().includes(needle)).slice(0, limit);
5
- }
3
+ const needle = query.toLowerCase();
4
+ return chats.filter(chat => !exclude.includes(chat.id) && chat.title.toLowerCase().includes(needle)).slice(0, limit);
5
+ }
@@ -0,0 +1,5 @@
1
+ import type { EffortStep } from './logic/effort.js';
2
+ type Stepper = (step: EffortStep) => void;
3
+ export declare function registerEffortStepper(key: string, stepper: Stepper): () => void;
4
+ export declare function stepEffortFromComposer(key: string, step: EffortStep): boolean;
5
+ export {};