@adecore/agents-react 0.31.11 → 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 (404) 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 +1946 -163
  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 +35 -0
  241. package/dist/locales/en/agent-chat.js +747 -712
  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 +35 -0
  248. package/dist/locales/nl/agent-chat.js +747 -712
  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 -25
  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.d.ts +1 -0
  291. package/dist/state/chats.js +408 -192
  292. package/dist/state/index.js +1 -1
  293. package/dist/state/provider-accounts.js +70 -47
  294. package/dist/state/providers.js +45 -16
  295. package/dist/state/usage.js +154 -77
  296. package/dist/storage.js +69 -68
  297. package/dist/testing/index.js +1 -1
  298. package/dist/testing/prompts.js +105 -67
  299. package/dist/transport.js +10 -10
  300. package/dist/ui/PlainTextarea.js +27 -3
  301. package/dist/usage/LimitsList.js +646 -40
  302. package/dist/usage/UsageBreakdown.js +879 -38
  303. package/dist/usage/UsageChart.js +311 -32
  304. package/dist/usage/UsageDialog.js +46 -4
  305. package/dist/usage/UsageLimits.js +467 -34
  306. package/dist/usage/UsageLimitsCard.js +95 -11
  307. package/dist/usage/UsagePage.js +817 -96
  308. package/dist/usage/UsagePane.js +164 -10
  309. package/dist/usage/UsageSummary.js +151 -6
  310. package/dist/usage/UsageTiles.js +164 -14
  311. package/dist/usage/format.js +32 -32
  312. package/dist/usage/index.d.ts +1 -1
  313. package/dist/usage/index.js +2 -1
  314. package/dist/usage/limit-groups.d.ts +2 -0
  315. package/dist/usage/limit-groups.js +77 -59
  316. package/dist/usage/limits.js +78 -43
  317. package/dist/usage/money.js +20 -4
  318. package/dist/usage/summary.js +85 -64
  319. package/package.json +8 -8
  320. package/src/agents/ModelOptionControl.tsx +3 -1
  321. package/src/agents/option-words.ts +27 -0
  322. package/src/chat/account-choice.ts +41 -1
  323. package/src/chat/composer-effort.ts +32 -0
  324. package/src/chat/forks.ts +4 -5
  325. package/src/chat/index.ts +3 -1
  326. package/src/chat/logic/effort.ts +32 -0
  327. package/src/chat/logic/picker-entries.ts +45 -10
  328. package/src/chat/logic/resume-compaction.ts +95 -17
  329. package/src/chat/logic/timeline.ts +11 -3
  330. package/src/chat/preferences.ts +35 -0
  331. package/src/chat/subagent-view.ts +2 -3
  332. package/src/chat/ui/AnsiOutput.tsx +1 -2
  333. package/src/chat/ui/BookmarkSubmenu.tsx +3 -3
  334. package/src/chat/ui/ChatActivity.tsx +14 -22
  335. package/src/chat/ui/ChatReferenceChip.tsx +2 -3
  336. package/src/chat/ui/Composer.tsx +15 -7
  337. package/src/chat/ui/EditDiff.tsx +2 -3
  338. package/src/chat/ui/LimitState.tsx +2 -2
  339. package/src/chat/ui/Markdown.tsx +10 -8
  340. package/src/chat/ui/MermaidBlock.tsx +2 -3
  341. package/src/chat/ui/Pickers.tsx +49 -29
  342. package/src/chat/ui/PromptComposer.tsx +7 -9
  343. package/src/chat/ui/ResumeCompactionDock.tsx +16 -4
  344. package/src/chat/ui/RunSettings.tsx +67 -28
  345. package/src/chat/ui/Scrubber.tsx +3 -3
  346. package/src/chat/ui/ShellCommand.tsx +2 -0
  347. package/src/chat/ui/SubagentInfo.tsx +2 -3
  348. package/src/chat/ui/SubagentTimeline.tsx +12 -16
  349. package/src/chat/ui/Timeline.tsx +6 -6
  350. package/src/chat/ui/UnifiedDiff.tsx +3 -4
  351. package/src/chat/ui/VisualFrame.tsx +5 -8
  352. package/src/chat/ui/code-theme.ts +4 -4
  353. package/src/chat/ui/composer/placeholder.ts +2 -2
  354. package/src/chat/ui/composer/use-compaction-offer.ts +36 -16
  355. package/src/chat/ui/composer/use-composer-menus.ts +4 -9
  356. package/src/chat/ui/composer/use-composer-submit.ts +2 -1
  357. package/src/chat/ui/composer/use-effort-stepper.ts +56 -0
  358. package/src/chat/ui/composer/use-notice.ts +2 -2
  359. package/src/chat/ui/diff/EditorEditDiff.tsx +9 -13
  360. package/src/chat/ui/diff/LegacyEditDiff.tsx +12 -17
  361. package/src/chat/ui/diff/LegacyUnifiedDiff.tsx +13 -21
  362. package/src/chat/ui/diff/use-review-stack.ts +4 -4
  363. package/src/chat/ui/diff-theme.ts +3 -3
  364. package/src/chat/ui/file-links.ts +2 -2
  365. package/src/chat/ui/intelligent-ui/UiReply.tsx +2 -0
  366. package/src/chat/ui/intelligent-ui/renderers/chart.tsx +3 -3
  367. package/src/chat/ui/intelligent-ui/renderers/content.tsx +5 -6
  368. package/src/chat/ui/intelligent-ui/renderers/map-view.tsx +2 -1
  369. package/src/chat/ui/intelligent-ui/renderers/map.tsx +2 -1
  370. package/src/chat/ui/intelligent-ui/use-truncated.ts +16 -19
  371. package/src/chat/ui/intelligent-ui/use-ui-links.ts +3 -3
  372. package/src/chat/ui/rows/ForksRow.tsx +3 -5
  373. package/src/chat/ui/rows/GeneratedImageRow.tsx +2 -1
  374. package/src/chat/ui/rows/MessageRows.tsx +12 -21
  375. package/src/chat/ui/rows/SubagentRow.tsx +3 -3
  376. package/src/chat/ui/rows/TaskRow.tsx +1 -1
  377. package/src/chat/ui/rows/WorkRows.tsx +20 -7
  378. package/src/chat/ui/useToggleSet.ts +15 -18
  379. package/src/chat/ui/visual-theme.ts +2 -3
  380. package/src/host-hooks.ts +113 -0
  381. package/src/lazy.tsx +2 -0
  382. package/src/locales/en/agent-chat.ts +135 -108
  383. package/src/locales/en/agent-prompts.ts +7 -7
  384. package/src/locales/en/agent-providers.ts +35 -34
  385. package/src/locales/en/agent-usage.ts +26 -20
  386. package/src/locales/nl/agent-chat.ts +127 -100
  387. package/src/locales/nl/agent-prompts.ts +5 -5
  388. package/src/locales/nl/agent-providers.ts +33 -32
  389. package/src/locales/nl/agent-usage.ts +25 -20
  390. package/src/prompts/ui/ApprovalBody.tsx +3 -1
  391. package/src/providers/CliDetail.tsx +2 -1
  392. package/src/providers/InstallPage.tsx +2 -4
  393. package/src/providers/ProviderList.tsx +12 -2
  394. package/src/providers/ProvidersPane.tsx +45 -15
  395. package/src/providers/pane-target.ts +20 -4
  396. package/src/state/chats.ts +7 -2
  397. package/src/usage/LimitsList.tsx +12 -13
  398. package/src/usage/UsageBreakdown.tsx +17 -6
  399. package/src/usage/UsageLimits.tsx +2 -1
  400. package/src/usage/UsagePage.tsx +3 -3
  401. package/src/usage/index.ts +1 -1
  402. package/src/usage/limit-groups.ts +12 -0
  403. package/src/usage/limits.ts +2 -2
  404. package/src/usage/money.ts +1 -2
@@ -6,268 +6,278 @@ const NO_READINGS = {};
6
6
  const INPUT_SETTLE_MS = 300;
7
7
  /* The reading that holds for these inputs: this view's own read of them, or the frozen first one for the inputs the block starts with. */
8
8
  function successfulReading(local, initial, identity, signature, defaultInputs) {
9
- if (local?.identity === identity && local.successful?.inputs === signature) {
10
- return local.successful.reading;
11
- }
12
- return signature === defaultInputs && initial?.state === 'fresh' ? initial : undefined;
9
+ if (local?.identity === identity && local.successful?.inputs === signature) {
10
+ return local.successful.reading;
11
+ }
12
+ return signature === defaultInputs && initial?.state === 'fresh' ? initial : undefined;
13
13
  }
14
14
  function settleDeadline() {
15
- return Date.now() + INPUT_SETTLE_MS;
15
+ return Date.now() + INPUT_SETTLE_MS;
16
16
  }
17
17
  function documentVisible() {
18
- return document.visibilityState !== 'hidden';
18
+ return document.visibilityState !== 'hidden';
19
19
  }
20
20
  export function useUiQueries(block, state, context, element, frozen) {
21
- const host = useChatHost();
22
- const [readings, setReadings] = useState({});
23
- const [busyInput, setBusyInput] = useState(null);
24
- const lastRead = useRef({ inputKey: '', at: 0 });
25
- const names = Object.keys(block.queries);
26
- const inputs = JSON.stringify(uiInputValues(block, state));
27
- const identity = JSON.stringify([context.scopeId, context.chatId, context.itemId, block.id, block.revision]);
28
- const inputKey = JSON.stringify([identity, inputs]);
29
- const reading = busyInput === inputKey;
30
- const defaultInputs = useMemo(() => JSON.stringify(uiInputValues(block, new UiState(block))), [block]);
31
- const initial = frozen && frozen.revision === block.revision ? frozen.readings : NO_READINGS;
32
- const successfulFor = (name, signature) => successfulReading(readings[name], initial[name], identity, signature, defaultInputs);
33
- const readsFor = (values) => {
34
- const signature = JSON.stringify(values);
35
- const reads = {};
36
- for (const name of names) {
37
- const local = readings[name];
38
- const successful = successfulFor(name, signature);
39
- if (!successful?.readId || (local?.identity === identity && local.reading.state === 'refused')) {
40
- return null;
41
- }
42
- reads[name] = successful.readId;
43
- }
44
- return reads;
45
- };
46
- const reads = readsFor(JSON.parse(inputs));
47
- const ready = reads !== null;
48
- const query = host.intelligentUi?.query;
49
- const subscribe = host.intelligentUi?.subscribe;
50
- useEffect(() => {
51
- const scope = state.scope();
52
- for (const name of Object.keys(block.queries)) {
53
- const successful = successfulReading(readings[name], initial[name], identity, inputs, defaultInputs);
54
- if (successful && JSON.stringify(scope[name]) !== JSON.stringify(successful.value)) {
55
- state.setQuery(name, successful.value, block);
56
- }
57
- }
58
- }, [state, block, readings, identity, inputs, defaultInputs, initial]);
59
- useEffect(() => {
60
- if (!query ||
61
- !element ||
62
- !block.complete ||
63
- block.catalogVersion !== UI_CATALOG_VERSION ||
64
- !block.revision ||
65
- !Object.keys(block.queries).length ||
66
- context.phase !== 'final') {
21
+ const host = useChatHost();
22
+ const [readings, setReadings] = useState({});
23
+ const [busyInput, setBusyInput] = useState(null);
24
+ const lastRead = useRef({
25
+ inputKey: '',
26
+ at: 0
27
+ });
28
+ const names = Object.keys(block.queries);
29
+ const inputs = JSON.stringify(uiInputValues(block, state));
30
+ const identity = JSON.stringify([context.scopeId, context.chatId, context.itemId, block.id, block.revision]);
31
+ const inputKey = JSON.stringify([identity, inputs]);
32
+ const reading = busyInput === inputKey;
33
+ const defaultInputs = useMemo(() => JSON.stringify(uiInputValues(block, new UiState(block))), [block]);
34
+ const initial = frozen && frozen.revision === block.revision ? frozen.readings : NO_READINGS;
35
+ const successfulFor = (name, signature) => successfulReading(readings[name], initial[name], identity, signature, defaultInputs);
36
+ const readsFor = values => {
37
+ const signature_0 = JSON.stringify(values);
38
+ const reads = {};
39
+ for (const name_0 of names) {
40
+ const local = readings[name_0];
41
+ const successful = successfulFor(name_0, signature_0);
42
+ if (!successful?.readId || local?.identity === identity && local.reading.state === 'refused') {
43
+ return null;
44
+ }
45
+ reads[name_0] = successful.readId;
46
+ }
47
+ return reads;
48
+ };
49
+ const reads_0 = readsFor(JSON.parse(inputs));
50
+ const ready = reads_0 !== null;
51
+ const query = host.intelligentUi?.query;
52
+ const subscribe = host.intelligentUi?.subscribe;
53
+ useEffect(() => {
54
+ const scope = state.scope();
55
+ for (const name_1 of Object.keys(block.queries)) {
56
+ const successful_0 = successfulReading(readings[name_1], initial[name_1], identity, inputs, defaultInputs);
57
+ if (successful_0 && JSON.stringify(scope[name_1]) !== JSON.stringify(successful_0.value)) {
58
+ state.setQuery(name_1, successful_0.value, block);
59
+ }
60
+ }
61
+ }, [state, block, readings, identity, inputs, defaultInputs, initial]);
62
+ useEffect(() => {
63
+ if (!query || !element || !block.complete || block.catalogVersion !== UI_CATALOG_VERSION || !block.revision || !Object.keys(block.queries).length || context.phase !== 'final') {
64
+ return;
65
+ }
66
+ let stopped = false;
67
+ let visible = typeof IntersectionObserver === 'undefined';
68
+ let busy = false;
69
+ let timer = null;
70
+ // The first read of this block reads at once; a changed input waits until it rests.
71
+ const changed = lastRead.current.inputKey !== '' && lastRead.current.inputKey !== inputKey;
72
+ const settledAt = changed ? settleDeadline() : 0;
73
+ const refresh = async () => {
74
+ if (stopped || !visible || !documentVisible() || busy) {
75
+ return;
76
+ }
77
+ const wait = Math.max(settledAt - Date.now(), lastRead.current.inputKey === inputKey ? UI_HOST_LIMITS.refreshMilliseconds - (Date.now() - lastRead.current.at) : 0);
78
+ if (wait > 0) {
79
+ if (timer === null) {
80
+ if (!visible || !documentVisible()) {
67
81
  return;
68
- }
69
- let stopped = false;
70
- let visible = typeof IntersectionObserver === 'undefined';
71
- let busy = false;
72
- let timer = null;
73
- // The first read of this block reads at once; a changed input waits until it rests.
74
- const changed = lastRead.current.inputKey !== '' && lastRead.current.inputKey !== inputKey;
75
- const settledAt = changed ? settleDeadline() : 0;
76
- const refresh = async () => {
77
- if (stopped || !visible || !documentVisible() || busy) {
78
- return;
79
- }
80
- const wait = Math.max(settledAt - Date.now(), lastRead.current.inputKey === inputKey ? UI_HOST_LIMITS.refreshMilliseconds - (Date.now() - lastRead.current.at) : 0);
81
- if (wait > 0) {
82
- if (timer === null) {
83
- if (!visible || !documentVisible()) {
84
- return;
85
- }
86
- timer = setTimeout(() => {
87
- timer = null;
88
- void refresh();
89
- }, wait);
90
- }
91
- return;
92
- }
93
- busy = true;
94
- lastRead.current = { inputKey, at: Date.now() };
95
- setBusyInput(inputKey);
96
- for (const name of Object.keys(block.queries).slice(0, UI_HOST_LIMITS.queries)) {
97
- if (!visible || !documentVisible()) {
98
- break;
99
- }
100
- try {
101
- const reading = await query(context.scopeId, {
102
- chatId: context.chatId,
103
- itemId: context.itemId,
104
- blockId: block.id,
105
- revision: block.revision,
106
- query: name,
107
- values: JSON.parse(inputs)
108
- });
109
- if (stopped) {
110
- return;
111
- }
112
- if (reading.state === 'fresh') {
113
- state.setQuery(name, reading.value, block);
114
- }
115
- setReadings((previous) => ({
116
- ...previous,
117
- [name]: {
118
- identity,
119
- reading,
120
- successful: reading.state === 'fresh' ? { inputs, reading } : previous[name]?.identity === identity ? previous[name].successful : undefined
121
- }
122
- }));
123
- }
124
- catch (error) {
125
- if (stopped) {
126
- return;
127
- }
128
- setReadings((previous) => ({
129
- ...previous,
130
- [name]: {
131
- identity,
132
- reading: { state: 'failed', readAt: Date.now(), code: 'unreadable', reason: error instanceof Error ? error.message : undefined },
133
- successful: previous[name]?.identity === identity ? previous[name].successful : undefined
134
- }
135
- }));
136
- }
137
- }
138
- busy = false;
139
- if (stopped) {
140
- return;
141
- }
142
- setBusyInput(null);
143
- timer = setTimeout(() => {
144
- timer = null;
145
- void refresh();
146
- }, UI_HOST_LIMITS.refreshMilliseconds);
147
- };
148
- const observer = typeof IntersectionObserver === 'undefined'
149
- ? null
150
- : new IntersectionObserver((entries) => {
151
- visible = entries.some((entry) => entry.isIntersecting);
152
- if (visible) {
153
- void refresh();
154
- }
155
- else if (timer !== null) {
156
- clearTimeout(timer);
157
- timer = null;
158
- }
159
- });
160
- if (element) {
161
- observer?.observe(element);
162
- }
163
- const focus = () => {
82
+ }
83
+ timer = setTimeout(() => {
84
+ timer = null;
164
85
  void refresh();
165
- };
166
- document.addEventListener('visibilitychange', focus);
167
- const unsubscribe = subscribe?.(context.scopeId, context.chatId, focus);
168
- void refresh();
169
- return () => {
170
- stopped = true;
171
- // A read cut short by this cleanup never reaches its own reset, which would leave the choices closed.
172
- setBusyInput((current) => (current === inputKey ? null : current));
173
- observer?.disconnect();
174
- unsubscribe?.();
175
- document.removeEventListener('visibilitychange', focus);
176
- if (timer !== null) {
177
- clearTimeout(timer);
178
- }
179
- };
180
- }, [block, state, context.scopeId, context.chatId, context.itemId, context.phase, inputs, query, subscribe, element, identity, inputKey]);
181
- const currentReadings = Object.fromEntries(names.flatMap((name) => {
182
- const local = readings[name];
183
- const reading = local?.identity === identity ? local.reading : initial[name];
184
- return reading ? [[name, reading]] : [];
185
- }));
186
- const failed = Object.entries(currentReadings).find(([, value]) => value.state !== 'fresh');
187
- const live = names.length
188
- ? {
189
- state: reading || (!ready && !failed) ? 'reading' : (failed?.[1].state ?? 'fresh'),
190
- sources: names.map((name) => block.queries[name].source),
191
- readAt: Object.values(currentReadings)
192
- .filter((reading) => reading.state === 'fresh')
193
- .reduce((at, value) => (at === null ? value.readAt : Math.min(at, value.readAt)), null),
194
- source: failed ? block.queries[failed[0]]?.source : undefined,
195
- reason: failed?.[1].reason,
196
- code: failed?.[1].code
86
+ }, wait);
197
87
  }
198
- : undefined;
199
- return { live, reads: reads ?? {}, reading, ready, readsFor, currentReadings };
200
- }
201
- export function useUiLiveValues(block, nodes, readings) {
202
- const [committed, setCommitted] = useState({
203
- token: '',
204
- values: new Map(),
205
- previous: new Map()
206
- });
207
- const dependencies = new Map();
208
- const names = new Set(Object.keys(block.queries));
209
- const references = (value, into) => {
210
- if (!value || typeof value !== 'object') {
211
- return;
88
+ return;
89
+ }
90
+ busy = true;
91
+ lastRead.current = {
92
+ inputKey,
93
+ at: Date.now()
94
+ };
95
+ setBusyInput(inputKey);
96
+ for (const name_2 of Object.keys(block.queries).slice(0, UI_HOST_LIMITS.queries)) {
97
+ if (!visible || !documentVisible()) {
98
+ break;
212
99
  }
213
- const expression = value;
214
- if (expression.kind === 'reference' && names.has(String(expression.name))) {
215
- into.add(String(expression.name));
216
- }
217
- for (const child of Object.values(expression)) {
218
- if (Array.isArray(child)) {
219
- child.forEach((item) => references(item, into));
100
+ try {
101
+ const reading_0 = await query(context.scopeId, {
102
+ chatId: context.chatId,
103
+ itemId: context.itemId,
104
+ blockId: block.id,
105
+ revision: block.revision,
106
+ query: name_2,
107
+ values: JSON.parse(inputs)
108
+ });
109
+ if (stopped) {
110
+ return;
111
+ }
112
+ if (reading_0.state === 'fresh') {
113
+ state.setQuery(name_2, reading_0.value, block);
114
+ }
115
+ setReadings(previous_0 => ({
116
+ ...previous_0,
117
+ [name_2]: {
118
+ identity,
119
+ reading: reading_0,
120
+ successful: reading_0.state === 'fresh' ? {
121
+ inputs,
122
+ reading: reading_0
123
+ } : previous_0[name_2]?.identity === identity ? previous_0[name_2].successful : undefined
220
124
  }
221
- else if (typeof child === 'object') {
222
- references(child, into);
125
+ }));
126
+ } catch (error) {
127
+ if (stopped) {
128
+ return;
129
+ }
130
+ setReadings(previous => ({
131
+ ...previous,
132
+ [name_2]: {
133
+ identity,
134
+ reading: {
135
+ state: 'failed',
136
+ readAt: Date.now(),
137
+ code: 'unreadable',
138
+ reason: error instanceof Error ? error.message : undefined
139
+ },
140
+ successful: previous[name_2]?.identity === identity ? previous[name_2].successful : undefined
223
141
  }
142
+ }));
224
143
  }
144
+ }
145
+ busy = false;
146
+ if (stopped) {
147
+ return;
148
+ }
149
+ setBusyInput(null);
150
+ timer = setTimeout(() => {
151
+ timer = null;
152
+ void refresh();
153
+ }, UI_HOST_LIMITS.refreshMilliseconds);
225
154
  };
226
- const written = (nodes, inherited = new Set()) => {
227
- for (const node of nodes) {
228
- const related = new Set(inherited);
229
- references(node.expressions, related);
230
- dependencies.set(node.id, related);
231
- written(node.children, node.type === 'Each' ? related : inherited);
232
- }
155
+ const observer = typeof IntersectionObserver === 'undefined' ? null : new IntersectionObserver(entries => {
156
+ visible = entries.some(entry => entry.isIntersecting);
157
+ if (visible) {
158
+ void refresh();
159
+ } else if (timer !== null) {
160
+ clearTimeout(timer);
161
+ timer = null;
162
+ }
163
+ });
164
+ if (element) {
165
+ observer?.observe(element);
166
+ }
167
+ const focus = () => {
168
+ void refresh();
233
169
  };
234
- written(block.nodes);
235
- const values = new Map();
236
- const sources = new Map();
237
- const collect = (nodes) => {
238
- for (const node of nodes) {
239
- const related = dependencies.get(node.sourceId ?? node.id);
240
- if (related?.size && !node.error) {
241
- values.set(node.id, node.props);
242
- sources.set(node.id, related);
243
- }
244
- collect(node.children);
245
- }
170
+ document.addEventListener('visibilitychange', focus);
171
+ const unsubscribe = subscribe?.(context.scopeId, context.chatId, focus);
172
+ void refresh();
173
+ return () => {
174
+ stopped = true;
175
+ // A read cut short by this cleanup never reaches its own reset, which would leave the choices closed.
176
+ setBusyInput(current => current === inputKey ? null : current);
177
+ observer?.disconnect();
178
+ unsubscribe?.();
179
+ document.removeEventListener('visibilitychange', focus);
180
+ if (timer !== null) {
181
+ clearTimeout(timer);
182
+ }
246
183
  };
247
- collect(nodes);
248
- const token = JSON.stringify([block.revision, Object.entries(readings).map(([name, reading]) => [name, reading.state, reading.readId, reading.readAt])]);
249
- const previous = committed.token === token ? committed.previous : committed.values;
250
- if (committed.token !== token) {
251
- setCommitted({ token, values, previous });
184
+ }, [block, state, context.scopeId, context.chatId, context.itemId, context.phase, inputs, query, subscribe, element, identity, inputKey]);
185
+ const currentReadings = Object.fromEntries(names.flatMap(name_3 => {
186
+ const local_0 = readings[name_3];
187
+ const reading_1 = local_0?.identity === identity ? local_0.reading : initial[name_3];
188
+ return reading_1 ? [[name_3, reading_1]] : [];
189
+ }));
190
+ const failed = Object.entries(currentReadings).find(([, value]) => value.state !== 'fresh');
191
+ const live = names.length ? {
192
+ state: reading || !ready && !failed ? 'reading' : failed?.[1].state ?? 'fresh',
193
+ sources: names.map(name_4 => block.queries[name_4].source),
194
+ readAt: Object.values(currentReadings).filter(reading_2 => reading_2.state === 'fresh').reduce((at, value_0) => at === null ? value_0.readAt : Math.min(at, value_0.readAt), null),
195
+ source: failed ? block.queries[failed[0]]?.source : undefined,
196
+ reason: failed?.[1].reason,
197
+ code: failed?.[1].code
198
+ } : undefined;
199
+ return {
200
+ live,
201
+ reads: reads_0 ?? {},
202
+ reading,
203
+ ready,
204
+ readsFor,
205
+ currentReadings
206
+ };
207
+ }
208
+ export function useUiLiveValues(block, nodes, readings) {
209
+ const [committed, setCommitted] = useState({
210
+ token: '',
211
+ values: new Map(),
212
+ previous: new Map()
213
+ });
214
+ const dependencies = new Map();
215
+ const names = new Set(Object.keys(block.queries));
216
+ const references = (value, into) => {
217
+ if (!value || typeof value !== 'object') {
218
+ return;
252
219
  }
253
- if (!names.size) {
254
- return undefined;
220
+ const expression = value;
221
+ if (expression.kind === 'reference' && names.has(String(expression.name))) {
222
+ into.add(String(expression.name));
255
223
  }
256
- return (id, prop, path) => {
257
- const related = sources.get(id);
258
- if (!related) {
259
- return undefined;
260
- }
261
- const get = (props) => {
262
- const value = props?.[prop];
263
- return path && Array.isArray(value) ? value[path[0]]?.[path[1]] : value;
264
- };
265
- const before = get(previous.get(id));
266
- const value = get(values.get(id));
267
- return {
268
- previous: before,
269
- changed: before !== undefined && JSON.stringify(before) !== JSON.stringify(value),
270
- stale: [...related].some((name) => readings[name]?.state === 'failed' || readings[name]?.state === 'refused')
271
- };
224
+ for (const child of Object.values(expression)) {
225
+ if (Array.isArray(child)) {
226
+ child.forEach(item => references(item, into));
227
+ } else if (typeof child === 'object') {
228
+ references(child, into);
229
+ }
230
+ }
231
+ };
232
+ const written = (nodes_0, inherited = new Set()) => {
233
+ for (const node of nodes_0) {
234
+ const related = new Set(inherited);
235
+ references(node.expressions, related);
236
+ dependencies.set(node.id, related);
237
+ written(node.children, node.type === 'Each' ? related : inherited);
238
+ }
239
+ };
240
+ written(block.nodes);
241
+ const values = new Map();
242
+ const sources = new Map();
243
+ const collect = nodes_1 => {
244
+ for (const node_0 of nodes_1) {
245
+ const related_0 = dependencies.get(node_0.sourceId ?? node_0.id);
246
+ if (related_0?.size && !node_0.error) {
247
+ values.set(node_0.id, node_0.props);
248
+ sources.set(node_0.id, related_0);
249
+ }
250
+ collect(node_0.children);
251
+ }
252
+ };
253
+ collect(nodes);
254
+ const token = JSON.stringify([block.revision, Object.entries(readings).map(([name, reading]) => [name, reading.state, reading.readId, reading.readAt])]);
255
+ const previous = committed.token === token ? committed.previous : committed.values;
256
+ if (committed.token !== token) {
257
+ setCommitted({
258
+ token,
259
+ values,
260
+ previous
261
+ });
262
+ }
263
+ if (!names.size) {
264
+ return undefined;
265
+ }
266
+ return (id, prop, path) => {
267
+ const related_1 = sources.get(id);
268
+ if (!related_1) {
269
+ return undefined;
270
+ }
271
+ const get = props => {
272
+ const value_0 = props?.[prop];
273
+ return path && Array.isArray(value_0) ? value_0[path[0]]?.[path[1]] : value_0;
272
274
  };
273
- }
275
+ const before = get(previous.get(id));
276
+ const value_1 = get(values.get(id));
277
+ return {
278
+ previous: before,
279
+ changed: before !== undefined && JSON.stringify(before) !== JSON.stringify(value_1),
280
+ stale: [...related_1].some(name_0 => readings[name_0]?.state === 'failed' || readings[name_0]?.state === 'refused')
281
+ };
282
+ };
283
+ }