@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
@@ -1,256 +1,468 @@
1
- import { useContext, useMemo } from 'react';
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { useContext } from 'react';
2
3
  import { create } from 'zustand';
3
4
  import { appendToolOutput } from '@adecore/agent-contracts/text';
4
5
  import { ChatScopeContext, useChatScope } from '../scope.js';
5
6
  function isWaiting(item) {
6
- return (item?.kind === 'approval' && item.decision === 'pending') || (item?.kind === 'question' && item.state === 'pending');
7
+ return item?.kind === 'approval' && item.decision === 'pending' || item?.kind === 'question' && item.state === 'pending';
7
8
  }
8
9
  function stateOf(info, items, page) {
9
- const byId = Object.fromEntries(items.map((item) => [item.id, item]));
10
- const order = items.map((item) => item.id);
11
- if (page === undefined || page.history.cursor === null) {
12
- return { info, items: byId, structure: byId, order };
13
- }
14
- const before = page.pending.filter((item) => !(item.id in byId));
15
- const subagents = (page.subagents ?? []).filter((item) => !(item.id in byId));
16
- for (const item of [...before, ...subagents]) {
17
- byId[item.id] = item;
18
- }
10
+ const byId = Object.fromEntries(items.map(item => [item.id, item]));
11
+ const order = items.map(item => item.id);
12
+ if (page === undefined || page.history.cursor === null) {
19
13
  return {
20
- info,
21
- items: byId,
22
- structure: byId,
23
- order,
24
- history: page.history,
25
- waitingBefore: before.map((item) => item.id),
26
- subagentsBefore: subagents.map((item) => item.id)
14
+ info,
15
+ items: byId,
16
+ structure: byId,
17
+ order
27
18
  };
19
+ }
20
+ const before = page.pending.filter(item => !(item.id in byId));
21
+ const subagents = (page.subagents ?? []).filter(item => !(item.id in byId));
22
+ for (const item of [...before, ...subagents]) {
23
+ byId[item.id] = item;
24
+ }
25
+ return {
26
+ info,
27
+ items: byId,
28
+ structure: byId,
29
+ order,
30
+ history: page.history,
31
+ waitingBefore: before.map(item => item.id),
32
+ subagentsBefore: subagents.map(item => item.id)
33
+ };
28
34
  }
29
35
  /* An older host names no place in the thread, and it always hands over the whole of it. */
30
36
  function isBeforePage(state, historyIndex) {
31
- return state.history !== undefined && historyIndex !== undefined && historyIndex < state.history.start;
37
+ return state.history !== undefined && historyIndex !== undefined && historyIndex < state.history.start;
32
38
  }
33
39
  /* An item from before the page this client holds matters only as a sub-agent, a request that waits, or one that stopped waiting. */
34
40
  function withEarlierItem(state, item) {
35
- if (item.kind === 'subagent') {
36
- const subagents = state.subagentsBefore ?? [];
37
- return { ...withItem(state, item), subagentsBefore: subagents.includes(item.id) ? subagents : [...subagents, item.id] };
38
- }
39
- const waiting = state.waitingBefore ?? [];
40
- const held = waiting.includes(item.id);
41
- if (isWaiting(item)) {
42
- return { ...withItem(state, item), waitingBefore: held ? waiting : [...waiting, item.id] };
43
- }
44
- return held ? { ...withItem(state, item), waitingBefore: waiting.filter((id) => id !== item.id) } : state;
41
+ if (item.kind === 'subagent') {
42
+ const subagents = state.subagentsBefore ?? [];
43
+ return {
44
+ ...withItem(state, item),
45
+ subagentsBefore: subagents.includes(item.id) ? subagents : [...subagents, item.id]
46
+ };
47
+ }
48
+ const waiting = state.waitingBefore ?? [];
49
+ const held = waiting.includes(item.id);
50
+ if (isWaiting(item)) {
51
+ return {
52
+ ...withItem(state, item),
53
+ waitingBefore: held ? waiting : [...waiting, item.id]
54
+ };
55
+ }
56
+ return held ? {
57
+ ...withItem(state, item),
58
+ waitingBefore: waiting.filter(id => id !== item.id)
59
+ } : state;
45
60
  }
46
61
  /* The page before the one a chat holds, unless the thread was read again since that page was asked for. */
47
62
  export function prependPage(state, cursor, page) {
48
- if (state.history?.cursor !== cursor) {
49
- return state;
50
- }
51
- const held = new Set(state.order);
52
- const older = page.items.filter((item) => !held.has(item.id));
53
- const olderIds = new Set(older.map((item) => item.id));
54
- const items = { ...state.items };
55
- for (const item of older) {
56
- // A request from before the page that this client already holds came in live, which is never older than the page.
57
- items[item.id] = state.items[item.id] ?? item;
58
- }
59
- const order = [...olderIds, ...state.order];
60
- if (page.history.cursor === null) {
61
- const { history: _history, waitingBefore: _waitingBefore, subagentsBefore: _subagentsBefore, ...rest } = state;
62
- return { ...rest, items, structure: items, order };
63
- }
64
- const waitingBefore = (state.waitingBefore ?? []).filter((id) => !olderIds.has(id));
65
- const subagentsBefore = (state.subagentsBefore ?? []).filter((id) => !olderIds.has(id));
66
- return { ...state, items, structure: items, order, history: page.history, waitingBefore, subagentsBefore };
63
+ if (state.history?.cursor !== cursor) {
64
+ return state;
65
+ }
66
+ const held = new Set(state.order);
67
+ const older = page.items.filter(item => !held.has(item.id));
68
+ const olderIds = new Set(older.map(item => item.id));
69
+ const items = {
70
+ ...state.items
71
+ };
72
+ for (const item of older) {
73
+ // A request from before the page that this client already holds came in live, which is never older than the page.
74
+ items[item.id] = state.items[item.id] ?? item;
75
+ }
76
+ const order = [...olderIds, ...state.order];
77
+ if (page.history.cursor === null) {
78
+ const {
79
+ history: _history,
80
+ waitingBefore: _waitingBefore,
81
+ subagentsBefore: _subagentsBefore,
82
+ ...rest
83
+ } = state;
84
+ return {
85
+ ...rest,
86
+ items,
87
+ structure: items,
88
+ order
89
+ };
90
+ }
91
+ const waitingBefore = (state.waitingBefore ?? []).filter(id => !olderIds.has(id));
92
+ const subagentsBefore = (state.subagentsBefore ?? []).filter(id => !olderIds.has(id));
93
+ return {
94
+ ...state,
95
+ items,
96
+ structure: items,
97
+ order,
98
+ history: page.history,
99
+ waitingBefore,
100
+ subagentsBefore
101
+ };
67
102
  }
68
103
  /* The requests that still wait, oldest first: those from before the page this client holds, then the thread's own. */
69
104
  export function waitingRequestsOf(chat) {
70
- return [...(chat?.waitingBefore ?? []), ...(chat?.order ?? [])].map((id) => chat?.structure[id]).filter(isWaiting);
105
+ return [...(chat?.waitingBefore ?? []), ...(chat?.order ?? [])].map(id => chat?.structure[id]).filter(isWaiting);
71
106
  }
72
107
  /* The state with one item replaced, in the thread and in the structure the rows come from. */
73
108
  function withItem(state, item) {
74
- const items = { ...state.items, [item.id]: item };
75
- return { ...state, items, structure: items };
109
+ const items = {
110
+ ...state.items,
111
+ [item.id]: item
112
+ };
113
+ return {
114
+ ...state,
115
+ items,
116
+ structure: items
117
+ };
76
118
  }
77
119
  /* Cheap enough, since a status only arrives when the host saw one change, never on a streamed word. */
78
120
  function sameInfo(left, right) {
79
- return JSON.stringify(left) === JSON.stringify(right);
121
+ return JSON.stringify(left) === JSON.stringify(right);
80
122
  }
81
123
  /* The statuses with this chat's info in them, the same object when that info is already there. */
82
124
  function withStatus(statuses, key, info) {
83
- return statuses[key]?.info === info ? statuses : { ...statuses, [key]: { info } };
125
+ return statuses[key]?.info === info ? statuses : {
126
+ ...statuses,
127
+ [key]: {
128
+ info
129
+ }
130
+ };
84
131
  }
85
132
  function without(rows, matches) {
86
- return Object.fromEntries(Object.entries(rows).filter(([key]) => !matches(key)));
133
+ return Object.fromEntries(Object.entries(rows).filter(([key]) => !matches(key)));
87
134
  }
88
135
  export function applyEvent(state, event) {
89
- switch (event.type) {
90
- case 'item': {
91
- if (isBeforePage(state, event.historyIndex)) {
92
- return withEarlierItem(state, event.item);
93
- }
94
- const known = event.item.id in state.items;
95
- return { ...withItem(state, event.item), order: known ? state.order : [...state.order, event.item.id] };
136
+ switch (event.type) {
137
+ case 'item':
138
+ {
139
+ if (isBeforePage(state, event.historyIndex)) {
140
+ return withEarlierItem(state, event.item);
96
141
  }
97
- case 'delta': {
98
- const item = state.items[event.itemId];
99
- if (event.uiQueries && item?.kind === 'assistant') {
100
- // The text first, as the daemon's thread applies it, then the metadata on what it grew into.
101
- const { uiQueries, ...text } = event;
102
- const grown = event.text === '' ? state : applyEvent(state, text);
103
- const reply = grown.items[event.itemId] ?? item;
104
- return { ...grown, items: { ...grown.items, [event.itemId]: { ...reply, uiQueries } } };
142
+ const known = event.item.id in state.items;
143
+ return {
144
+ ...withItem(state, event.item),
145
+ order: known ? state.order : [...state.order, event.item.id]
146
+ };
147
+ }
148
+ case 'delta':
149
+ {
150
+ const item = state.items[event.itemId];
151
+ if (event.uiQueries && item?.kind === 'assistant') {
152
+ // The text first, as the daemon's thread applies it, then the metadata on what it grew into.
153
+ const {
154
+ uiQueries,
155
+ ...text
156
+ } = event;
157
+ const grown = event.text === '' ? state : applyEvent(state, text);
158
+ const reply = grown.items[event.itemId] ?? item;
159
+ return {
160
+ ...grown,
161
+ items: {
162
+ ...grown.items,
163
+ [event.itemId]: {
164
+ ...reply,
165
+ uiQueries
166
+ }
105
167
  }
106
- if (event.ui !== undefined && event.text === '') {
107
- if (item?.kind === 'assistant' && item.streaming && event.textLength === item.text.length) {
108
- return { ...state, items: { ...state.items, [event.itemId]: { ...item, ui: event.ui } } };
168
+ };
169
+ }
170
+ if (event.ui !== undefined && event.text === '') {
171
+ if (item?.kind === 'assistant' && item.streaming && event.textLength === item.text.length) {
172
+ return {
173
+ ...state,
174
+ items: {
175
+ ...state.items,
176
+ [event.itemId]: {
177
+ ...item,
178
+ ui: event.ui
109
179
  }
110
- return state;
180
+ }
181
+ };
182
+ }
183
+ return state;
184
+ }
185
+ if (item?.kind === 'assistant' || item?.kind === 'thinking') {
186
+ const grown = {
187
+ ...item,
188
+ text: item.text + event.text
189
+ };
190
+ // The first text is structure after all, since an empty reply that is not streaming has no row.
191
+ if (item.text === '') {
192
+ return withItem(state, grown);
193
+ }
194
+ return {
195
+ ...state,
196
+ items: {
197
+ ...state.items,
198
+ [event.itemId]: grown
111
199
  }
112
- if (item?.kind === 'assistant' || item?.kind === 'thinking') {
113
- const grown = { ...item, text: item.text + event.text };
114
- // The first text is structure after all, since an empty reply that is not streaming has no row.
115
- if (item.text === '') {
116
- return withItem(state, grown);
117
- }
118
- return { ...state, items: { ...state.items, [event.itemId]: grown } };
200
+ };
201
+ }
202
+ if (item?.kind === 'tool' && item.state === 'running') {
203
+ const progress = item.progress ?? {
204
+ startedAt: null,
205
+ description: null,
206
+ output: null
207
+ };
208
+ const grown = {
209
+ ...item,
210
+ progress: {
211
+ ...progress,
212
+ output: appendToolOutput(progress.output, event.text)
119
213
  }
120
- if (item?.kind === 'tool' && item.state === 'running') {
121
- const progress = item.progress ?? { startedAt: null, description: null, output: null };
122
- const grown = { ...item, progress: { ...progress, output: appendToolOutput(progress.output, event.text) } };
123
- return { ...state, items: { ...state.items, [event.itemId]: grown } };
214
+ };
215
+ return {
216
+ ...state,
217
+ items: {
218
+ ...state.items,
219
+ [event.itemId]: grown
124
220
  }
125
- return state;
221
+ };
126
222
  }
127
- case 'info':
128
- return { ...state, info: event.info };
129
- case 'reset':
130
- return stateOf(event.info, event.items);
131
- }
223
+ return state;
224
+ }
225
+ case 'info':
226
+ return {
227
+ ...state,
228
+ info: event.info
229
+ };
230
+ case 'reset':
231
+ return stateOf(event.info, event.items);
232
+ }
132
233
  }
133
234
  /* Fields of a held chat that are not part of its thread; a chat this client does not hold stays as it is. */
134
235
  function withFields(store, key, fields) {
135
- const current = store.byKey[key];
136
- if (!current) {
137
- return {};
236
+ const current = store.byKey[key];
237
+ if (!current) {
238
+ return {};
239
+ }
240
+ return {
241
+ byKey: {
242
+ ...store.byKey,
243
+ [key]: {
244
+ ...current,
245
+ ...fields
246
+ }
138
247
  }
139
- return { byKey: { ...store.byKey, [key]: { ...current, ...fields } } };
248
+ };
140
249
  }
141
- export const useChats = create((set) => ({
142
- byKey: {},
143
- statusByKey: {},
144
- reset(key, info, items, page) {
145
- set((s) => {
146
- // The bookmarks and the visuals are not part of the thread; they come in on their own and outlive a reset of it.
147
- const { bookmarks, visuals } = s.byKey[key] ?? {};
148
- const next = { ...stateOf(info, items, page), ...(bookmarks === undefined ? {} : { bookmarks }), ...(visuals === undefined ? {} : { visuals }) };
149
- return {
150
- byKey: { ...s.byKey, [key]: next },
151
- statusByKey: withStatus(s.statusByKey, key, info)
152
- };
153
- });
154
- },
155
- prepend(key, cursor, page) {
156
- set((s) => {
157
- const current = s.byKey[key];
158
- if (!current) {
159
- return {};
160
- }
161
- const next = prependPage(current, cursor, page);
162
- return next === current ? {} : { byKey: { ...s.byKey, [key]: next } };
163
- });
164
- },
165
- apply(key, event) {
166
- set((s) => {
167
- const current = s.byKey[key];
168
- if (!current) {
169
- return {};
170
- }
171
- const next = applyEvent(current, event);
172
- return { byKey: { ...s.byKey, [key]: next }, statusByKey: withStatus(s.statusByKey, key, next.info) };
173
- });
174
- },
175
- /*
176
- * The status of a chat this window is not reading, which the host sends for every chat it has
177
- * loaded. The thread stays empty until somebody attaches, since this is what a header, a list and
178
- * the counters need, and they ask the info and never the items.
179
- */
180
- status(key, info) {
181
- set((s) => {
182
- const current = s.byKey[key];
183
- if (!current) {
184
- return { byKey: { ...s.byKey, [key]: stateOf(info, []) }, statusByKey: withStatus(s.statusByKey, key, info) };
185
- }
186
- // An attached client already had this on `chat.event`; writing it again would redraw the thread.
187
- if (sameInfo(current.info, info)) {
188
- return {};
189
- }
190
- return { byKey: { ...s.byKey, [key]: { ...current, info } }, statusByKey: withStatus(s.statusByKey, key, info) };
191
- });
192
- },
193
- bookmarks(key, bookmarks) {
194
- set((s) => withFields(s, key, { bookmarks }));
195
- },
196
- visuals(key, visuals) {
197
- set((s) => withFields(s, key, { visuals }));
198
- },
199
- forget(key) {
200
- set((s) => {
201
- const next = { ...s.byKey };
202
- delete next[key];
203
- const statuses = { ...s.statusByKey };
204
- delete statuses[key];
205
- return { byKey: next, statusByKey: statuses };
206
- });
207
- },
208
- forgetWhere(matches) {
209
- set((s) => ({ byKey: without(s.byKey, matches), statusByKey: without(s.statusByKey, matches) }));
210
- }
250
+ export const useChats = create(set => ({
251
+ byKey: {},
252
+ statusByKey: {},
253
+ reset(key, info, items, page) {
254
+ set(s => {
255
+ // The bookmarks and the visuals are not part of the thread; they come in on their own and outlive a reset of it.
256
+ const {
257
+ bookmarks,
258
+ visuals
259
+ } = s.byKey[key] ?? {};
260
+ const next = {
261
+ ...stateOf(info, items, page),
262
+ ...(bookmarks === undefined ? {} : {
263
+ bookmarks
264
+ }),
265
+ ...(visuals === undefined ? {} : {
266
+ visuals
267
+ })
268
+ };
269
+ return {
270
+ byKey: {
271
+ ...s.byKey,
272
+ [key]: next
273
+ },
274
+ statusByKey: withStatus(s.statusByKey, key, info)
275
+ };
276
+ });
277
+ },
278
+ prepend(key, cursor, page) {
279
+ set(s => {
280
+ const current = s.byKey[key];
281
+ if (!current) {
282
+ return {};
283
+ }
284
+ const next = prependPage(current, cursor, page);
285
+ return next === current ? {} : {
286
+ byKey: {
287
+ ...s.byKey,
288
+ [key]: next
289
+ }
290
+ };
291
+ });
292
+ },
293
+ apply(key, event) {
294
+ set(s => {
295
+ const current = s.byKey[key];
296
+ if (!current) {
297
+ return {};
298
+ }
299
+ const next = applyEvent(current, event);
300
+ return {
301
+ byKey: {
302
+ ...s.byKey,
303
+ [key]: next
304
+ },
305
+ statusByKey: withStatus(s.statusByKey, key, next.info)
306
+ };
307
+ });
308
+ },
309
+ /*
310
+ * The status of a chat this window is not reading, which the host sends for every chat it has
311
+ * loaded. The thread stays empty until somebody attaches, since this is what a header, a list and
312
+ * the counters need, and they ask the info and never the items.
313
+ */
314
+ status(key, info) {
315
+ set(s => {
316
+ const current = s.byKey[key];
317
+ if (!current) {
318
+ return {
319
+ byKey: {
320
+ ...s.byKey,
321
+ [key]: stateOf(info, [])
322
+ },
323
+ statusByKey: withStatus(s.statusByKey, key, info)
324
+ };
325
+ }
326
+ // An attached client already had this on `chat.event`; writing it again would redraw the thread.
327
+ if (sameInfo(current.info, info)) {
328
+ return {};
329
+ }
330
+ return {
331
+ byKey: {
332
+ ...s.byKey,
333
+ [key]: {
334
+ ...current,
335
+ info
336
+ }
337
+ },
338
+ statusByKey: withStatus(s.statusByKey, key, info)
339
+ };
340
+ });
341
+ },
342
+ bookmarks(key, bookmarks) {
343
+ set(s => withFields(s, key, {
344
+ bookmarks
345
+ }));
346
+ },
347
+ visuals(key, visuals) {
348
+ set(s => withFields(s, key, {
349
+ visuals
350
+ }));
351
+ },
352
+ forget(key) {
353
+ set(s => {
354
+ const next = {
355
+ ...s.byKey
356
+ };
357
+ delete next[key];
358
+ const statuses = {
359
+ ...s.statusByKey
360
+ };
361
+ delete statuses[key];
362
+ return {
363
+ byKey: next,
364
+ statusByKey: statuses
365
+ };
366
+ });
367
+ },
368
+ forgetWhere(matches) {
369
+ set(s => ({
370
+ byKey: without(s.byKey, matches),
371
+ statusByKey: without(s.statusByKey, matches)
372
+ }));
373
+ }
211
374
  }));
212
375
  /* The sink of one host's chat client: it hands over chat ids, this puts them under the keys of its scope. */
213
376
  export function chatSink(keyOf) {
214
- return {
215
- reset: (chatId, info, items, page) => useChats.getState().reset(keyOf(chatId), info, items, page),
216
- prepend: (chatId, cursor, page) => useChats.getState().prepend(keyOf(chatId), cursor, page),
217
- apply: (chatId, event) => useChats.getState().apply(keyOf(chatId), event),
218
- status: (chatId, info) => useChats.getState().status(keyOf(chatId), info),
219
- bookmarks: (chatId, bookmarks) => useChats.getState().bookmarks(keyOf(chatId), bookmarks),
220
- visuals: (chatId, visuals) => useChats.getState().visuals(keyOf(chatId), visuals),
221
- forget: (chatId) => useChats.getState().forget(keyOf(chatId))
222
- };
377
+ return {
378
+ reset: (chatId, info, items, page) => useChats.getState().reset(keyOf(chatId), info, items, page),
379
+ prepend: (chatId, cursor, page) => useChats.getState().prepend(keyOf(chatId), cursor, page),
380
+ apply: (chatId, event) => useChats.getState().apply(keyOf(chatId), event),
381
+ status: (chatId, info) => useChats.getState().status(keyOf(chatId), info),
382
+ bookmarks: (chatId, bookmarks) => useChats.getState().bookmarks(keyOf(chatId), bookmarks),
383
+ visuals: (chatId, visuals) => useChats.getState().visuals(keyOf(chatId), visuals),
384
+ forget: chatId => useChats.getState().forget(keyOf(chatId))
385
+ };
223
386
  }
224
387
  /* One chat's thread in the scope this is rendered in. The selector keeps a render tied to the field it reads. */
225
388
  export function useChatRow(chatId, select) {
226
- const { keyOf } = useChatScope();
227
- return useChats((s) => select(s.byKey[keyOf(chatId)]));
389
+ const $ = _c(4);
390
+ const {
391
+ keyOf
392
+ } = useChatScope();
393
+ let t0;
394
+ if ($[0] !== chatId || $[1] !== keyOf || $[2] !== select) {
395
+ t0 = s => select(s.byKey[keyOf(chatId)]);
396
+ $[0] = chatId;
397
+ $[1] = keyOf;
398
+ $[2] = select;
399
+ $[3] = t0;
400
+ } else {
401
+ t0 = $[3];
402
+ }
403
+ return useChats(t0);
228
404
  }
229
405
  /*
230
406
  * The models the CLI of this provider reported running in the chats this client holds of the host.
231
407
  * A model it ran is proof the CLI offers it, whatever the version says. Outside a scope there is none.
232
408
  */
233
409
  export function useReportedModels(provider) {
234
- const scope = useContext(ChatScopeContext);
235
- const joined = useChats((s) => {
236
- const names = new Set();
237
- for (const [key, state] of Object.entries(s.statusByKey)) {
238
- if (scope?.owns(key) === true && state.info.provider === provider && state.info.model !== null) {
239
- names.add(state.info.model);
240
- }
410
+ const $ = _c(5);
411
+ const scope = useContext(ChatScopeContext);
412
+ let t0;
413
+ if ($[0] !== provider || $[1] !== scope) {
414
+ t0 = s => {
415
+ const names = new Set();
416
+ for (const [key, state] of Object.entries(s.statusByKey)) {
417
+ if (scope?.owns(key) === true && state.info.provider === provider && state.info.model !== null) {
418
+ names.add(state.info.model);
241
419
  }
242
- return [...names].sort().join('\n');
243
- });
244
- return useMemo(() => new Set(joined === '' ? [] : joined.split('\n')), [joined]);
420
+ }
421
+ return [...names].sort().join("\n");
422
+ };
423
+ $[0] = provider;
424
+ $[1] = scope;
425
+ $[2] = t0;
426
+ } else {
427
+ t0 = $[2];
428
+ }
429
+ const joined = useChats(t0);
430
+ let t1;
431
+ if ($[3] !== joined) {
432
+ t1 = new Set(joined === "" ? [] : joined.split("\n"));
433
+ $[3] = joined;
434
+ $[4] = t1;
435
+ } else {
436
+ t1 = $[4];
437
+ }
438
+ return t1;
245
439
  }
246
440
  /* Whether a call still waits on the person's answer to an approval of it, when its clock is not running yet. */
247
441
  export function useAwaitsApproval(chatId, toolUseId) {
248
- return useChatRow(chatId, (row) => waitingRequestsOf(row).some((request) => request.kind === 'approval' && request.toolUseId === toolUseId));
442
+ const $ = _c(2);
443
+ let t0;
444
+ if ($[0] !== toolUseId) {
445
+ t0 = row => waitingRequestsOf(row).some(request => request.kind === "approval" && request.toolUseId === toolUseId);
446
+ $[0] = toolUseId;
447
+ $[1] = t0;
448
+ } else {
449
+ t0 = $[1];
450
+ }
451
+ return useChatRow(chatId, t0);
249
452
  }
250
453
  /* The item as the thread holds it now, for a row derived from the structure, which a delta leaves alone. */
251
454
  export function useCurrentItem(chatId, derived) {
252
- return useChatRow(chatId, (row) => {
253
- const item = row?.items[derived.id];
254
- return item?.kind === derived.kind ? item : derived;
255
- });
256
- }
455
+ const $ = _c(2);
456
+ let t0;
457
+ if ($[0] !== derived) {
458
+ t0 = row => {
459
+ const item = row?.items[derived.id];
460
+ return item?.kind === derived.kind ? item : derived;
461
+ };
462
+ $[0] = derived;
463
+ $[1] = t0;
464
+ } else {
465
+ t0 = $[1];
466
+ }
467
+ return useChatRow(chatId, t0);
468
+ }
@@ -2,4 +2,4 @@
2
2
  export { waitingRequestsOf, applyEvent, useChats, chatSink, useChatRow } from './chats.js';
3
3
  export { useProviderAccountsStore, useProviderAccounts, providerAccountsOf, knownAccounts, watchProviderAccounts } from './provider-accounts.js';
4
4
  export { useProvidersStore, useProviders, providersOf, providerSinkFor } from './providers.js';
5
- export { USAGE_PREFERENCES_KEY, dayOf, windowFor, reloadUsagePreferences, useUsageStore } from './usage.js';
5
+ export { USAGE_PREFERENCES_KEY, dayOf, windowFor, reloadUsagePreferences, useUsageStore } from './usage.js';