@adecore/agents-react 0.31.12 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/dist/agents/AccountDot.js +57 -6
  2. package/dist/agents/AgentIcon.js +88 -12
  3. package/dist/agents/ModelOptionControl.js +153 -18
  4. package/dist/agents/ProviderLogo.js +49 -4
  5. package/dist/agents/account-limits.js +17 -14
  6. package/dist/agents/accounts.js +99 -67
  7. package/dist/agents/agent-marks.js +5 -3
  8. package/dist/agents/model-name.js +42 -31
  9. package/dist/agents/model-options.js +8 -8
  10. package/dist/agents/model-requirement.js +17 -14
  11. package/dist/agents/option-words.d.ts +7 -0
  12. package/dist/agents/option-words.js +35 -0
  13. package/dist/agents/provider-paths.js +6 -6
  14. package/dist/agents/status-look.js +32 -12
  15. package/dist/chat/account-choice.d.ts +13 -0
  16. package/dist/chat/account-choice.js +90 -20
  17. package/dist/chat/actions.js +126 -59
  18. package/dist/chat/activity.js +5 -5
  19. package/dist/chat/attachments.js +74 -53
  20. package/dist/chat/bookmarks.js +58 -48
  21. package/dist/chat/chat-client.js +344 -263
  22. package/dist/chat/chat-references.js +3 -3
  23. package/dist/chat/composer-effort.d.ts +5 -0
  24. package/dist/chat/composer-effort.js +26 -0
  25. package/dist/chat/composer-send.js +13 -13
  26. package/dist/chat/drafts.js +115 -79
  27. package/dist/chat/forks.js +81 -24
  28. package/dist/chat/guards.js +15 -43
  29. package/dist/chat/index.d.ts +3 -1
  30. package/dist/chat/index.js +3 -2
  31. package/dist/chat/logic/ansi.js +170 -167
  32. package/dist/chat/logic/answers.js +2 -2
  33. package/dist/chat/logic/bookmarks.js +19 -19
  34. package/dist/chat/logic/command-looks.js +138 -96
  35. package/dist/chat/logic/context-usage.js +13 -9
  36. package/dist/chat/logic/continue-after-stop.js +15 -19
  37. package/dist/chat/logic/effort.d.ts +14 -0
  38. package/dist/chat/logic/effort.js +34 -0
  39. package/dist/chat/logic/embedded-code.js +387 -326
  40. package/dist/chat/logic/fork.js +134 -110
  41. package/dist/chat/logic/generated-image.js +54 -23
  42. package/dist/chat/logic/goal.js +28 -20
  43. package/dist/chat/logic/handback.js +6 -6
  44. package/dist/chat/logic/json.js +2 -2
  45. package/dist/chat/logic/limit.js +46 -30
  46. package/dist/chat/logic/picker-entries.d.ts +5 -3
  47. package/dist/chat/logic/picker-entries.js +83 -43
  48. package/dist/chat/logic/resume-compaction.d.ts +14 -1
  49. package/dist/chat/logic/resume-compaction.js +93 -24
  50. package/dist/chat/logic/scrubber.js +188 -136
  51. package/dist/chat/logic/thought.js +13 -16
  52. package/dist/chat/logic/thread-cards.js +60 -48
  53. package/dist/chat/logic/timeline-copy.js +30 -38
  54. package/dist/chat/logic/timeline-target.js +92 -63
  55. package/dist/chat/logic/timeline.js +499 -355
  56. package/dist/chat/logic/tool-catalog.js +54 -34
  57. package/dist/chat/logic/tools.js +106 -82
  58. package/dist/chat/logic/visual-height.js +18 -18
  59. package/dist/chat/logic/visual-viewport.js +6 -3
  60. package/dist/chat/logic/welcome.js +9 -9
  61. package/dist/chat/logic/workflow.js +45 -34
  62. package/dist/chat/mentions.js +149 -109
  63. package/dist/chat/persisted-json.js +51 -54
  64. package/dist/chat/preferences.d.ts +4 -0
  65. package/dist/chat/preferences.js +162 -84
  66. package/dist/chat/prompt-hold.js +9 -9
  67. package/dist/chat/quote.js +21 -30
  68. package/dist/chat/reading-width.js +12 -10
  69. package/dist/chat/recent-messages.js +34 -21
  70. package/dist/chat/resume-compaction-dismissals.js +25 -5
  71. package/dist/chat/runtime-modes.js +3 -3
  72. package/dist/chat/send-key.js +11 -7
  73. package/dist/chat/stash.js +89 -69
  74. package/dist/chat/subagent-conversation.js +181 -139
  75. package/dist/chat/subagent-list.js +65 -67
  76. package/dist/chat/subagent-support.js +12 -7
  77. package/dist/chat/subagent-view.js +132 -44
  78. package/dist/chat/thumbnails.js +88 -60
  79. package/dist/chat/timeline-flash.js +24 -12
  80. package/dist/chat/timeline-scroll.js +116 -86
  81. package/dist/chat/ui/AccountPill.js +126 -15
  82. package/dist/chat/ui/AnsiOutput.js +62 -6
  83. package/dist/chat/ui/BookmarkMarker.js +231 -41
  84. package/dist/chat/ui/BookmarkSubmenu.js +165 -18
  85. package/dist/chat/ui/ChatActivity.js +649 -70
  86. package/dist/chat/ui/ChatReferenceChip.js +104 -9
  87. package/dist/chat/ui/CodeBlock.js +132 -58
  88. package/dist/chat/ui/Composer.js +866 -132
  89. package/dist/chat/ui/ComposerInput.js +309 -120
  90. package/dist/chat/ui/DiffPool.js +75 -14
  91. package/dist/chat/ui/EditDiff.js +160 -21
  92. package/dist/chat/ui/FadingWords.js +32 -3
  93. package/dist/chat/ui/GoalDock.js +235 -42
  94. package/dist/chat/ui/ImageView.js +617 -61
  95. package/dist/chat/ui/LimitState.js +446 -72
  96. package/dist/chat/ui/Markdown.js +991 -173
  97. package/dist/chat/ui/MermaidBlock.js +238 -68
  98. package/dist/chat/ui/MessageActions.js +251 -39
  99. package/dist/chat/ui/ModelMarks.js +55 -5
  100. package/dist/chat/ui/Pickers.js +664 -113
  101. package/dist/chat/ui/PromptComposer.js +281 -51
  102. package/dist/chat/ui/QuoteButton.js +151 -57
  103. package/dist/chat/ui/ResumeCompactionDock.d.ts +6 -2
  104. package/dist/chat/ui/ResumeCompactionDock.js +141 -6
  105. package/dist/chat/ui/RowTime.js +59 -5
  106. package/dist/chat/ui/RunSettings.js +1744 -154
  107. package/dist/chat/ui/Scrubber.js +517 -88
  108. package/dist/chat/ui/ShellCommand.js +183 -107
  109. package/dist/chat/ui/SubagentControls.js +212 -24
  110. package/dist/chat/ui/SubagentInfo.js +170 -13
  111. package/dist/chat/ui/SubagentStopButton.js +115 -24
  112. package/dist/chat/ui/SubagentTimeline.js +357 -91
  113. package/dist/chat/ui/Timeline.js +988 -476
  114. package/dist/chat/ui/TimelineMenu.js +552 -37
  115. package/dist/chat/ui/UnifiedDiff.js +234 -27
  116. package/dist/chat/ui/UploadThumb.js +37 -7
  117. package/dist/chat/ui/VisualDialogs.js +251 -20
  118. package/dist/chat/ui/VisualFrame.js +321 -95
  119. package/dist/chat/ui/Welcome.js +72 -7
  120. package/dist/chat/ui/chips.js +1 -1
  121. package/dist/chat/ui/code-lines.js +36 -36
  122. package/dist/chat/ui/code-streaming.js +1 -1
  123. package/dist/chat/ui/code-theme.js +7 -7
  124. package/dist/chat/ui/composer/ComposerControls.js +329 -21
  125. package/dist/chat/ui/composer/ComposerMenu.js +358 -30
  126. package/dist/chat/ui/composer/DraftParts.js +185 -11
  127. package/dist/chat/ui/composer/QueuedMessages.js +138 -13
  128. package/dist/chat/ui/composer/chips.js +29 -19
  129. package/dist/chat/ui/composer/editor.js +79 -63
  130. package/dist/chat/ui/composer/insert.js +26 -12
  131. package/dist/chat/ui/composer/key-handler.js +180 -127
  132. package/dist/chat/ui/composer/keys.js +90 -73
  133. package/dist/chat/ui/composer/menu-aria.js +18 -9
  134. package/dist/chat/ui/composer/placeholder.js +78 -31
  135. package/dist/chat/ui/composer/surface.js +13 -37
  136. package/dist/chat/ui/composer/use-chat-controls.js +230 -90
  137. package/dist/chat/ui/composer/use-compaction-offer.js +50 -18
  138. package/dist/chat/ui/composer/use-composer-draft.js +65 -34
  139. package/dist/chat/ui/composer/use-composer-menus.js +478 -193
  140. package/dist/chat/ui/composer/use-composer-submit.js +251 -109
  141. package/dist/chat/ui/composer/use-continuable-turn.js +33 -6
  142. package/dist/chat/ui/composer/use-draft-files.js +245 -93
  143. package/dist/chat/ui/composer/use-effort-stepper.d.ts +13 -0
  144. package/dist/chat/ui/composer/use-effort-stepper.js +88 -0
  145. package/dist/chat/ui/composer/use-notice.js +61 -16
  146. package/dist/chat/ui/composer/use-pending-requests.js +38 -17
  147. package/dist/chat/ui/composer/use-prompt-history.js +117 -45
  148. package/dist/chat/ui/composer/use-prompt-hold.js +119 -35
  149. package/dist/chat/ui/composer/use-take-back.js +94 -72
  150. package/dist/chat/ui/diff/ApprovalReview.js +101 -23
  151. package/dist/chat/ui/diff/DiffFallbackBoundary.js +21 -13
  152. package/dist/chat/ui/diff/DiffOmitted.js +56 -6
  153. package/dist/chat/ui/diff/DiffStack.js +92 -8
  154. package/dist/chat/ui/diff/DiffUnavailable.js +56 -6
  155. package/dist/chat/ui/diff/EditorEditDiff.js +263 -51
  156. package/dist/chat/ui/diff/EditorPatchDiff.js +39 -14
  157. package/dist/chat/ui/diff/LegacyDiffPool.js +27 -10
  158. package/dist/chat/ui/diff/LegacyEditDiff.js +97 -20
  159. package/dist/chat/ui/diff/LegacyUnifiedDiff.js +172 -42
  160. package/dist/chat/ui/diff/RawDiff.js +65 -5
  161. package/dist/chat/ui/diff/ReviewDiff.js +77 -5
  162. package/dist/chat/ui/diff/diff-props.js +1 -1
  163. package/dist/chat/ui/diff/diff-source-budget.js +46 -35
  164. package/dist/chat/ui/diff/editor-edit-model.js +18 -14
  165. package/dist/chat/ui/diff/review-plan.js +63 -40
  166. package/dist/chat/ui/diff/review-settle.js +24 -9
  167. package/dist/chat/ui/diff/syntax-runtime.js +236 -201
  168. package/dist/chat/ui/diff/use-review-stack.js +146 -25
  169. package/dist/chat/ui/diff-syntax.js +70 -58
  170. package/dist/chat/ui/diff-theme.js +31 -12
  171. package/dist/chat/ui/file-links.js +39 -10
  172. package/dist/chat/ui/find-reveal.js +29 -8
  173. package/dist/chat/ui/full-diff.js +17 -12
  174. package/dist/chat/ui/highlighter.js +143 -113
  175. package/dist/chat/ui/icons.js +16 -7
  176. package/dist/chat/ui/index.js +1 -1
  177. package/dist/chat/ui/intelligent-ui/UiBlockFrame.js +556 -82
  178. package/dist/chat/ui/intelligent-ui/UiFallbackPart.js +73 -5
  179. package/dist/chat/ui/intelligent-ui/UiReply.js +666 -262
  180. package/dist/chat/ui/intelligent-ui/block-local.js +59 -31
  181. package/dist/chat/ui/intelligent-ui/chart-data.js +77 -67
  182. package/dist/chat/ui/intelligent-ui/node-text.js +77 -91
  183. package/dist/chat/ui/intelligent-ui/registry.js +46 -46
  184. package/dist/chat/ui/intelligent-ui/render-context.js +1 -1
  185. package/dist/chat/ui/intelligent-ui/renderers/base-land.js +1 -1
  186. package/dist/chat/ui/intelligent-ui/renderers/binding.js +3 -3
  187. package/dist/chat/ui/intelligent-ui/renderers/chart.js +1223 -123
  188. package/dist/chat/ui/intelligent-ui/renderers/choices.js +312 -34
  189. package/dist/chat/ui/intelligent-ui/renderers/content.js +1241 -86
  190. package/dist/chat/ui/intelligent-ui/renderers/data.js +619 -54
  191. package/dist/chat/ui/intelligent-ui/renderers/inputs.js +868 -67
  192. package/dist/chat/ui/intelligent-ui/renderers/links.js +366 -62
  193. package/dist/chat/ui/intelligent-ui/renderers/map-slots.js +118 -60
  194. package/dist/chat/ui/intelligent-ui/renderers/map-style.js +85 -78
  195. package/dist/chat/ui/intelligent-ui/renderers/map-view.js +282 -217
  196. package/dist/chat/ui/intelligent-ui/renderers/map.js +621 -69
  197. package/dist/chat/ui/intelligent-ui/renderers/place-point.js +15 -8
  198. package/dist/chat/ui/intelligent-ui/renderers/structure.js +262 -20
  199. package/dist/chat/ui/intelligent-ui/renderers/text.js +674 -49
  200. package/dist/chat/ui/intelligent-ui/reply-parts.js +24 -15
  201. package/dist/chat/ui/intelligent-ui/table-data.js +97 -57
  202. package/dist/chat/ui/intelligent-ui/tones.js +31 -31
  203. package/dist/chat/ui/intelligent-ui/use-in-view.js +30 -12
  204. package/dist/chat/ui/intelligent-ui/use-later.js +28 -13
  205. package/dist/chat/ui/intelligent-ui/use-truncated.js +45 -21
  206. package/dist/chat/ui/intelligent-ui/use-ui-links.js +296 -109
  207. package/dist/chat/ui/intelligent-ui/use-ui-queries.js +256 -246
  208. package/dist/chat/ui/markdown-blocks.js +296 -262
  209. package/dist/chat/ui/mermaid.js +60 -72
  210. package/dist/chat/ui/quote-selection.js +32 -29
  211. package/dist/chat/ui/rehype-chips.js +35 -23
  212. package/dist/chat/ui/rehype-fade.js +28 -17
  213. package/dist/chat/ui/remark-html-as-text.js +22 -15
  214. package/dist/chat/ui/reply-context.js +1 -1
  215. package/dist/chat/ui/reveal.js +161 -72
  216. package/dist/chat/ui/rows/ForksRow.js +226 -24
  217. package/dist/chat/ui/rows/GeneratedImageRow.js +541 -87
  218. package/dist/chat/ui/rows/MessageRows.js +1706 -159
  219. package/dist/chat/ui/rows/RowContainer.js +57 -7
  220. package/dist/chat/ui/rows/Rows.js +463 -54
  221. package/dist/chat/ui/rows/SubagentRow.js +577 -60
  222. package/dist/chat/ui/rows/TaskRow.js +359 -40
  223. package/dist/chat/ui/rows/VisualRow.js +233 -11
  224. package/dist/chat/ui/rows/WorkRows.js +1945 -164
  225. package/dist/chat/ui/rows/WorkflowRow.js +293 -34
  226. package/dist/chat/ui/rows/row-rhythm.js +27 -17
  227. package/dist/chat/ui/theme-watch.js +26 -23
  228. package/dist/chat/ui/timestamp-format.js +4 -1
  229. package/dist/chat/ui/use-diff-source-tokens.js +70 -34
  230. package/dist/chat/ui/useToggleSet.js +51 -19
  231. package/dist/chat/ui/visual-theme.js +153 -128
  232. package/dist/chat/visual-bridge.js +123 -123
  233. package/dist/chat/visual-viewport.js +94 -83
  234. package/dist/chat/visuals.js +13 -5
  235. package/dist/host-hooks.d.ts +29 -0
  236. package/dist/host-hooks.js +78 -0
  237. package/dist/host.js +120 -48
  238. package/dist/index.js +1 -1
  239. package/dist/lazy.js +38 -32
  240. package/dist/locales/en/agent-chat.d.ts +34 -0
  241. package/dist/locales/en/agent-chat.js +747 -713
  242. package/dist/locales/en/agent-prompts.js +42 -42
  243. package/dist/locales/en/agent-providers.d.ts +1 -0
  244. package/dist/locales/en/agent-providers.js +166 -165
  245. package/dist/locales/en/agent-usage.d.ts +6 -0
  246. package/dist/locales/en/agent-usage.js +129 -123
  247. package/dist/locales/nl/agent-chat.d.ts +34 -0
  248. package/dist/locales/nl/agent-chat.js +747 -713
  249. package/dist/locales/nl/agent-prompts.js +42 -42
  250. package/dist/locales/nl/agent-providers.d.ts +1 -0
  251. package/dist/locales/nl/agent-providers.js +166 -165
  252. package/dist/locales/nl/agent-usage.d.ts +6 -0
  253. package/dist/locales/nl/agent-usage.js +129 -123
  254. package/dist/locales.js +14 -14
  255. package/dist/mounted-registry.js +31 -30
  256. package/dist/port-transport.js +122 -111
  257. package/dist/prompts/index.js +1 -1
  258. package/dist/prompts/logic/focus.js +15 -14
  259. package/dist/prompts/logic/keys.js +93 -59
  260. package/dist/prompts/logic/prompts.js +27 -14
  261. package/dist/prompts/logic/subjects.js +60 -46
  262. package/dist/prompts/logic/useFocusAfterAnswer.js +60 -20
  263. package/dist/prompts/logic/usePromptSession.js +88 -77
  264. package/dist/prompts/ui/ApprovalBody.js +246 -27
  265. package/dist/prompts/ui/PromptActions.js +215 -9
  266. package/dist/prompts/ui/PromptCard.js +215 -36
  267. package/dist/prompts/ui/PromptView.js +372 -34
  268. package/dist/prompts/ui/QuestionBody.js +269 -73
  269. package/dist/providers/AccountColors.js +36 -5
  270. package/dist/providers/AccountDetail.js +683 -50
  271. package/dist/providers/AccountVariables.js +139 -32
  272. package/dist/providers/AddAccountForm.js +125 -38
  273. package/dist/providers/CliDetail.js +343 -36
  274. package/dist/providers/InstallPage.js +644 -59
  275. package/dist/providers/ProviderList.d.ts +2 -1
  276. package/dist/providers/ProviderList.js +215 -23
  277. package/dist/providers/ProvidersPane.d.ts +4 -2
  278. package/dist/providers/ProvidersPane.js +244 -64
  279. package/dist/providers/account-actions.js +54 -30
  280. package/dist/providers/index.js +1 -1
  281. package/dist/providers/install-steps.js +12 -9
  282. package/dist/providers/pane-target.d.ts +3 -0
  283. package/dist/providers/pane-target.js +34 -13
  284. package/dist/providers/parts.js +62 -12
  285. package/dist/providers/provider-abilities.js +5 -5
  286. package/dist/providers/provider-groups.js +75 -40
  287. package/dist/providers/variables.js +73 -39
  288. package/dist/scope.js +6 -6
  289. package/dist/settings/sections.js +18 -18
  290. package/dist/state/chats.js +404 -192
  291. package/dist/state/index.js +1 -1
  292. package/dist/state/provider-accounts.js +70 -47
  293. package/dist/state/providers.js +45 -16
  294. package/dist/state/usage.js +154 -77
  295. package/dist/storage.js +69 -68
  296. package/dist/testing/index.js +1 -1
  297. package/dist/testing/prompts.js +105 -67
  298. package/dist/transport.js +10 -10
  299. package/dist/ui/PlainTextarea.js +27 -3
  300. package/dist/usage/LimitsList.js +646 -40
  301. package/dist/usage/UsageBreakdown.js +879 -38
  302. package/dist/usage/UsageChart.js +311 -32
  303. package/dist/usage/UsageDialog.js +46 -4
  304. package/dist/usage/UsageLimits.js +467 -34
  305. package/dist/usage/UsageLimitsCard.js +95 -11
  306. package/dist/usage/UsagePage.js +817 -96
  307. package/dist/usage/UsagePane.js +164 -10
  308. package/dist/usage/UsageSummary.js +151 -6
  309. package/dist/usage/UsageTiles.js +164 -14
  310. package/dist/usage/format.js +32 -32
  311. package/dist/usage/index.d.ts +1 -1
  312. package/dist/usage/index.js +2 -1
  313. package/dist/usage/limit-groups.d.ts +2 -0
  314. package/dist/usage/limit-groups.js +77 -59
  315. package/dist/usage/limits.js +78 -43
  316. package/dist/usage/money.js +20 -4
  317. package/dist/usage/summary.js +85 -64
  318. package/package.json +8 -8
  319. package/src/agents/ModelOptionControl.tsx +3 -1
  320. package/src/agents/option-words.ts +27 -0
  321. package/src/chat/account-choice.ts +41 -1
  322. package/src/chat/composer-effort.ts +32 -0
  323. package/src/chat/forks.ts +4 -5
  324. package/src/chat/index.ts +3 -1
  325. package/src/chat/logic/effort.ts +32 -0
  326. package/src/chat/logic/picker-entries.ts +45 -10
  327. package/src/chat/logic/resume-compaction.ts +95 -17
  328. package/src/chat/logic/timeline.ts +11 -3
  329. package/src/chat/preferences.ts +35 -0
  330. package/src/chat/subagent-view.ts +2 -3
  331. package/src/chat/ui/AnsiOutput.tsx +1 -2
  332. package/src/chat/ui/BookmarkSubmenu.tsx +3 -3
  333. package/src/chat/ui/ChatActivity.tsx +14 -22
  334. package/src/chat/ui/ChatReferenceChip.tsx +2 -3
  335. package/src/chat/ui/Composer.tsx +15 -7
  336. package/src/chat/ui/EditDiff.tsx +2 -3
  337. package/src/chat/ui/LimitState.tsx +2 -2
  338. package/src/chat/ui/Markdown.tsx +10 -8
  339. package/src/chat/ui/MermaidBlock.tsx +2 -3
  340. package/src/chat/ui/Pickers.tsx +49 -29
  341. package/src/chat/ui/PromptComposer.tsx +7 -9
  342. package/src/chat/ui/ResumeCompactionDock.tsx +16 -4
  343. package/src/chat/ui/RunSettings.tsx +67 -28
  344. package/src/chat/ui/Scrubber.tsx +3 -3
  345. package/src/chat/ui/ShellCommand.tsx +2 -0
  346. package/src/chat/ui/SubagentInfo.tsx +2 -3
  347. package/src/chat/ui/SubagentTimeline.tsx +12 -16
  348. package/src/chat/ui/Timeline.tsx +6 -6
  349. package/src/chat/ui/UnifiedDiff.tsx +3 -4
  350. package/src/chat/ui/VisualFrame.tsx +5 -8
  351. package/src/chat/ui/code-theme.ts +4 -4
  352. package/src/chat/ui/composer/placeholder.ts +2 -2
  353. package/src/chat/ui/composer/use-compaction-offer.ts +36 -16
  354. package/src/chat/ui/composer/use-composer-menus.ts +4 -9
  355. package/src/chat/ui/composer/use-composer-submit.ts +2 -1
  356. package/src/chat/ui/composer/use-effort-stepper.ts +56 -0
  357. package/src/chat/ui/composer/use-notice.ts +2 -2
  358. package/src/chat/ui/diff/EditorEditDiff.tsx +9 -13
  359. package/src/chat/ui/diff/LegacyEditDiff.tsx +12 -17
  360. package/src/chat/ui/diff/LegacyUnifiedDiff.tsx +13 -21
  361. package/src/chat/ui/diff/use-review-stack.ts +4 -4
  362. package/src/chat/ui/diff-theme.ts +3 -3
  363. package/src/chat/ui/file-links.ts +2 -2
  364. package/src/chat/ui/intelligent-ui/UiReply.tsx +2 -0
  365. package/src/chat/ui/intelligent-ui/renderers/chart.tsx +3 -3
  366. package/src/chat/ui/intelligent-ui/renderers/content.tsx +5 -6
  367. package/src/chat/ui/intelligent-ui/renderers/map-view.tsx +2 -1
  368. package/src/chat/ui/intelligent-ui/renderers/map.tsx +2 -1
  369. package/src/chat/ui/intelligent-ui/use-truncated.ts +16 -19
  370. package/src/chat/ui/intelligent-ui/use-ui-links.ts +3 -3
  371. package/src/chat/ui/rows/ForksRow.tsx +3 -5
  372. package/src/chat/ui/rows/GeneratedImageRow.tsx +2 -1
  373. package/src/chat/ui/rows/MessageRows.tsx +12 -21
  374. package/src/chat/ui/rows/SubagentRow.tsx +3 -3
  375. package/src/chat/ui/rows/TaskRow.tsx +1 -1
  376. package/src/chat/ui/rows/WorkRows.tsx +10 -5
  377. package/src/chat/ui/useToggleSet.ts +15 -18
  378. package/src/chat/ui/visual-theme.ts +2 -3
  379. package/src/host-hooks.ts +113 -0
  380. package/src/lazy.tsx +2 -0
  381. package/src/locales/en/agent-chat.ts +134 -108
  382. package/src/locales/en/agent-prompts.ts +7 -7
  383. package/src/locales/en/agent-providers.ts +35 -34
  384. package/src/locales/en/agent-usage.ts +26 -20
  385. package/src/locales/nl/agent-chat.ts +126 -100
  386. package/src/locales/nl/agent-prompts.ts +5 -5
  387. package/src/locales/nl/agent-providers.ts +33 -32
  388. package/src/locales/nl/agent-usage.ts +25 -20
  389. package/src/providers/CliDetail.tsx +2 -1
  390. package/src/providers/InstallPage.tsx +2 -4
  391. package/src/providers/ProviderList.tsx +12 -2
  392. package/src/providers/ProvidersPane.tsx +45 -15
  393. package/src/providers/pane-target.ts +20 -4
  394. package/src/state/chats.ts +2 -2
  395. package/src/usage/LimitsList.tsx +12 -13
  396. package/src/usage/UsageBreakdown.tsx +17 -6
  397. package/src/usage/UsageLimits.tsx +2 -1
  398. package/src/usage/UsagePage.tsx +3 -3
  399. package/src/usage/index.ts +1 -1
  400. package/src/usage/limit-groups.ts +12 -0
  401. package/src/usage/limits.ts +2 -2
  402. package/src/usage/money.ts +1 -2
@@ -1,66 +1,53 @@
1
1
  /* The token each color reads. Borders carry an alpha, so they are resolved over the ground. */
2
2
  export const MERMAID_TOKENS = {
3
- ground: '--chat-code-bg',
4
- node: '--surface-raised',
5
- nodeBorder: '--border-strong',
6
- text: '--text',
7
- line: '--text-muted',
8
- cluster: '--surface',
9
- clusterBorder: '--border',
10
- note: '--accent-soft'
3
+ ground: '--chat-code-bg',
4
+ node: '--surface-raised',
5
+ nodeBorder: '--border-strong',
6
+ text: '--text',
7
+ line: '--text-muted',
8
+ cluster: '--surface',
9
+ clusterBorder: '--border',
10
+ note: '--accent-soft'
11
11
  };
12
12
  // Mermaid's own list plus what keeps a diagram in the theme and out of HTML: a directive in the text cannot change these.
13
- const SECURE_KEYS = [
14
- 'secure',
15
- 'securityLevel',
16
- 'startOnLoad',
17
- 'maxTextSize',
18
- 'maxEdges',
19
- 'suppressErrorRendering',
20
- 'htmlLabels',
21
- 'theme',
22
- 'themeVariables',
23
- 'themeCSS',
24
- 'darkMode',
25
- 'fontFamily'
26
- ];
13
+ const SECURE_KEYS = ['secure', 'securityLevel', 'startOnLoad', 'maxTextSize', 'maxEdges', 'suppressErrorRendering', 'htmlLabels', 'theme', 'themeVariables', 'themeCSS', 'darkMode', 'fontFamily'];
27
14
  /*
28
15
  * Strict: no HTML in labels, no click handlers, no links that run script. What comes out is drawn as an
29
16
  * image as well, which never runs script and loads nothing, whatever the text of the diagram says.
30
17
  */
31
18
  export function mermaidConfig(colors, dark, font) {
32
- return {
33
- startOnLoad: false,
34
- securityLevel: 'strict',
35
- htmlLabels: false,
36
- suppressErrorRendering: true,
37
- secure: SECURE_KEYS,
38
- theme: 'base',
39
- darkMode: dark,
40
- fontFamily: font.family,
41
- themeVariables: {
42
- darkMode: dark,
43
- fontFamily: font.family,
44
- fontSize: font.size,
45
- background: colors.ground,
46
- primaryColor: colors.node,
47
- primaryTextColor: colors.text,
48
- primaryBorderColor: colors.nodeBorder,
49
- secondaryColor: colors.note,
50
- tertiaryColor: colors.cluster,
51
- mainBkg: colors.node,
52
- nodeBorder: colors.nodeBorder,
53
- textColor: colors.text,
54
- titleColor: colors.text,
55
- lineColor: colors.line,
56
- clusterBkg: colors.cluster,
57
- clusterBorder: colors.clusterBorder,
58
- edgeLabelBackground: colors.ground,
59
- noteBkgColor: colors.note,
60
- noteTextColor: colors.text,
61
- noteBorderColor: colors.nodeBorder
62
- }
63
- };
19
+ return {
20
+ startOnLoad: false,
21
+ securityLevel: 'strict',
22
+ htmlLabels: false,
23
+ suppressErrorRendering: true,
24
+ secure: SECURE_KEYS,
25
+ theme: 'base',
26
+ darkMode: dark,
27
+ fontFamily: font.family,
28
+ themeVariables: {
29
+ darkMode: dark,
30
+ fontFamily: font.family,
31
+ fontSize: font.size,
32
+ background: colors.ground,
33
+ primaryColor: colors.node,
34
+ primaryTextColor: colors.text,
35
+ primaryBorderColor: colors.nodeBorder,
36
+ secondaryColor: colors.note,
37
+ tertiaryColor: colors.cluster,
38
+ mainBkg: colors.node,
39
+ nodeBorder: colors.nodeBorder,
40
+ textColor: colors.text,
41
+ titleColor: colors.text,
42
+ lineColor: colors.line,
43
+ clusterBkg: colors.cluster,
44
+ clusterBorder: colors.clusterBorder,
45
+ edgeLabelBackground: colors.ground,
46
+ noteBkgColor: colors.note,
47
+ noteTextColor: colors.text,
48
+ noteBorderColor: colors.nodeBorder
49
+ }
50
+ };
64
51
  }
65
52
  const ROOT = /<svg\b[^>]*>/;
66
53
  const VIEW_BOX = /\sviewBox="([^"]*)"/;
@@ -71,23 +58,24 @@ const SIZE_ATTRIBUTES = /\s(?:width|height|style)="[^"]*"/g;
71
58
  * without one.
72
59
  */
73
60
  export function sizedSvg(svg) {
74
- const root = ROOT.exec(svg);
75
- const viewBox = root === null ? null : VIEW_BOX.exec(root[0]);
76
- if (root === null || viewBox === null) {
77
- return null;
78
- }
79
- const [, , boxWidth, boxHeight] = viewBox[1]
80
- .trim()
81
- .split(/[\s,]+/)
82
- .map(Number);
83
- if (!Number.isFinite(boxWidth) || !Number.isFinite(boxHeight) || boxWidth <= 0 || boxHeight <= 0) {
84
- return null;
85
- }
86
- const width = Math.ceil(boxWidth);
87
- const height = Math.ceil(boxHeight);
88
- const tag = root[0].replace(SIZE_ATTRIBUTES, '').replace(/^<svg\b/, `<svg width="${width}" height="${height}"`);
89
- return { svg: svg.slice(0, root.index) + tag + svg.slice(root.index + root[0].length), width, height };
61
+ const root = ROOT.exec(svg);
62
+ const viewBox = root === null ? null : VIEW_BOX.exec(root[0]);
63
+ if (root === null || viewBox === null) {
64
+ return null;
65
+ }
66
+ const [,, boxWidth, boxHeight] = viewBox[1].trim().split(/[\s,]+/).map(Number);
67
+ if (!Number.isFinite(boxWidth) || !Number.isFinite(boxHeight) || boxWidth <= 0 || boxHeight <= 0) {
68
+ return null;
69
+ }
70
+ const width = Math.ceil(boxWidth);
71
+ const height = Math.ceil(boxHeight);
72
+ const tag = root[0].replace(SIZE_ATTRIBUTES, '').replace(/^<svg\b/, `<svg width="${width}" height="${height}"`);
73
+ return {
74
+ svg: svg.slice(0, root.index) + tag + svg.slice(root.index + root[0].length),
75
+ width,
76
+ height
77
+ };
90
78
  }
91
79
  export function svgDataUrl(svg) {
92
- return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
93
- }
80
+ return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
81
+ }
@@ -5,7 +5,7 @@ const ANSWER = '[data-quote-answer]';
5
5
  /* Registers the composer below a thread as the one its quote button hands a quote to, until the returned call. */
6
6
  export const QuoteTakerContext = createContext(null);
7
7
  function answerAt(node) {
8
- return (node instanceof Element ? node : node.parentElement)?.closest(ANSWER) ?? null;
8
+ return (node instanceof Element ? node : node.parentElement)?.closest(ANSWER) ?? null;
9
9
  }
10
10
  /*
11
11
  * Whether the range selects text a person can see outside the answer. A triple-click on a paragraph
@@ -13,35 +13,38 @@ function answerAt(node) {
13
13
  * paragraph alone.
14
14
  */
15
15
  function selectsOutside(range, answer) {
16
- const walker = document.createTreeWalker(range.commonAncestorContainer, NodeFilter.SHOW_TEXT);
17
- for (let node = walker.nextNode(); node !== null; node = walker.nextNode()) {
18
- if (!range.intersectsNode(node) || answer.contains(node)) {
19
- continue;
20
- }
21
- const text = node.textContent ?? '';
22
- const start = node === range.startContainer ? range.startOffset : 0;
23
- const end = node === range.endContainer ? range.endOffset : text.length;
24
- const parent = node.parentElement;
25
- if (text.slice(start, end).trim() !== '' && parent !== null && getComputedStyle(parent).userSelect !== 'none') {
26
- return true;
27
- }
16
+ const walker = document.createTreeWalker(range.commonAncestorContainer, NodeFilter.SHOW_TEXT);
17
+ for (let node = walker.nextNode(); node !== null; node = walker.nextNode()) {
18
+ if (!range.intersectsNode(node) || answer.contains(node)) {
19
+ continue;
28
20
  }
29
- return false;
21
+ const text = node.textContent ?? '';
22
+ const start = node === range.startContainer ? range.startOffset : 0;
23
+ const end = node === range.endContainer ? range.endOffset : text.length;
24
+ const parent = node.parentElement;
25
+ if (text.slice(start, end).trim() !== '' && parent !== null && getComputedStyle(parent).userSelect !== 'none') {
26
+ return true;
27
+ }
28
+ }
29
+ return false;
30
30
  }
31
31
  /* The quote the selection makes, when it lies in one answer of this thread, and the reply it was taken from. */
32
32
  export function selectedAnswerQuote(selection, thread) {
33
- if (thread === null || selection === null || selection.isCollapsed || selection.rangeCount === 0) {
34
- return null;
35
- }
36
- const range = selection.getRangeAt(0);
37
- const answer = answerAt(range.startContainer) ?? answerAt(range.endContainer);
38
- if (answer === null || !thread.contains(answer)) {
39
- return null;
40
- }
41
- const inside = answer.contains(range.startContainer) && answer.contains(range.endContainer);
42
- if (!inside && selectsOutside(range, answer)) {
43
- return null;
44
- }
45
- const text = quoteOf(selection.toString());
46
- return text === null ? null : { text, itemId: answer.closest('[data-find-item]')?.getAttribute('data-find-item') ?? null };
47
- }
33
+ if (thread === null || selection === null || selection.isCollapsed || selection.rangeCount === 0) {
34
+ return null;
35
+ }
36
+ const range = selection.getRangeAt(0);
37
+ const answer = answerAt(range.startContainer) ?? answerAt(range.endContainer);
38
+ if (answer === null || !thread.contains(answer)) {
39
+ return null;
40
+ }
41
+ const inside = answer.contains(range.startContainer) && answer.contains(range.endContainer);
42
+ if (!inside && selectsOutside(range, answer)) {
43
+ return null;
44
+ }
45
+ const text = quoteOf(selection.toString());
46
+ return text === null ? null : {
47
+ text,
48
+ itemId: answer.closest('[data-find-item]')?.getAttribute('data-find-item') ?? null
49
+ };
50
+ }
@@ -3,30 +3,42 @@ import { chipText, tokenizeChips } from '../mentions.js';
3
3
  const SKIPPED = new Set(['code', 'pre']);
4
4
  /* A chip as an element: the renderer reads `data-chip` and `data-value`, the text keeps the sigil. */
5
5
  function chipElement(segment) {
6
- return {
7
- type: 'element',
8
- tagName: 'span',
9
- properties: { dataChip: segment.kind, dataValue: segment.kind === 'mention' ? segment.path : segment.name },
10
- children: [{ type: 'text', value: chipText(segment) }]
11
- };
6
+ return {
7
+ type: 'element',
8
+ tagName: 'span',
9
+ properties: {
10
+ dataChip: segment.kind,
11
+ dataValue: segment.kind === 'mention' ? segment.path : segment.name
12
+ },
13
+ children: [{
14
+ type: 'text',
15
+ value: chipText(segment)
16
+ }]
17
+ };
12
18
  }
13
19
  function split(parent, mentions, skills) {
14
- parent.children = parent.children.flatMap((child) => {
15
- if (child.type === 'text') {
16
- return tokenizeChips(child.value, mentions, skills).map((segment) => segment.kind === 'text' ? { type: 'text', value: segment.text } : chipElement(segment));
17
- }
18
- if (child.type === 'element' && !SKIPPED.has(child.tagName)) {
19
- split(child, mentions, skills);
20
- }
21
- return [child];
22
- });
20
+ parent.children = parent.children.flatMap(child => {
21
+ if (child.type === 'text') {
22
+ return tokenizeChips(child.value, mentions, skills).map(segment => segment.kind === 'text' ? {
23
+ type: 'text',
24
+ value: segment.text
25
+ } : chipElement(segment));
26
+ }
27
+ if (child.type === 'element' && !SKIPPED.has(child.tagName)) {
28
+ split(child, mentions, skills);
29
+ }
30
+ return [child];
31
+ });
23
32
  }
24
33
  /* The `@path` and `$name` tokens a person picked in the composer, cut out of the text as chips. */
25
- export function rehypeChips({ mentions = [], skills = [] } = {}) {
26
- return (tree) => {
27
- if (mentions.length === 0 && skills.length === 0) {
28
- return;
29
- }
30
- split(tree, mentions, skills);
31
- };
32
- }
34
+ export function rehypeChips({
35
+ mentions = [],
36
+ skills = []
37
+ } = {}) {
38
+ return tree => {
39
+ if (mentions.length === 0 && skills.length === 0) {
40
+ return;
41
+ }
42
+ split(tree, mentions, skills);
43
+ };
44
+ }
@@ -6,23 +6,34 @@ const SKIPPED = new Set(['code', 'pre']);
6
6
  const WHITESPACE = /^\s+$/;
7
7
  /* A text cut into its words and the whitespace between them, in order. */
8
8
  export function wordSegments(text) {
9
- return text.split(/(\s+)/).filter((segment) => segment !== '');
9
+ return text.split(/(\s+)/).filter(segment => segment !== '');
10
10
  }
11
11
  export function isWhitespace(segment) {
12
- return WHITESPACE.test(segment);
12
+ return WHITESPACE.test(segment);
13
13
  }
14
14
  function wrap(parent) {
15
- parent.children = parent.children.flatMap((child) => {
16
- if (child.type === 'text') {
17
- return wordSegments(child.value).map((segment) => isWhitespace(segment)
18
- ? { type: 'text', value: segment }
19
- : { type: 'element', tagName: 'span', properties: { className: [FADE_CLASS] }, children: [{ type: 'text', value: segment }] });
20
- }
21
- if (child.type === 'element' && !SKIPPED.has(child.tagName)) {
22
- wrap(child);
23
- }
24
- return [child];
25
- });
15
+ parent.children = parent.children.flatMap(child => {
16
+ if (child.type === 'text') {
17
+ return wordSegments(child.value).map(segment => isWhitespace(segment) ? {
18
+ type: 'text',
19
+ value: segment
20
+ } : {
21
+ type: 'element',
22
+ tagName: 'span',
23
+ properties: {
24
+ className: [FADE_CLASS]
25
+ },
26
+ children: [{
27
+ type: 'text',
28
+ value: segment
29
+ }]
30
+ });
31
+ }
32
+ if (child.type === 'element' && !SKIPPED.has(child.tagName)) {
33
+ wrap(child);
34
+ }
35
+ return [child];
36
+ });
26
37
  }
27
38
  /*
28
39
  * Every word of a reply that is still streaming in a span that fades in. Words only ever arrive at
@@ -30,7 +41,7 @@ function wrap(parent) {
30
41
  * on screen keep their element and their fade does not start again.
31
42
  */
32
43
  export function rehypeFadeWords() {
33
- return (tree) => {
34
- wrap(tree);
35
- };
36
- }
44
+ return tree => {
45
+ wrap(tree);
46
+ };
47
+ }
@@ -1,18 +1,25 @@
1
1
  // Parents whose children are blocks, where a bare text node would stand outside any paragraph.
2
2
  const FLOW_PARENTS = new Set(['root', 'blockquote', 'listItem', 'footnoteDefinition']);
3
3
  function literal(parent) {
4
- if (parent.children === undefined) {
5
- return;
4
+ if (parent.children === undefined) {
5
+ return;
6
+ }
7
+ const flow = FLOW_PARENTS.has(parent.type);
8
+ parent.children = parent.children.map(child => {
9
+ if (child.type !== 'html') {
10
+ literal(child);
11
+ return child;
6
12
  }
7
- const flow = FLOW_PARENTS.has(parent.type);
8
- parent.children = parent.children.map((child) => {
9
- if (child.type !== 'html') {
10
- literal(child);
11
- return child;
12
- }
13
- const text = { ...child, type: 'text' };
14
- return flow ? { type: 'paragraph', position: child.position, children: [text] } : text;
15
- });
13
+ const text = {
14
+ ...child,
15
+ type: 'text'
16
+ };
17
+ return flow ? {
18
+ type: 'paragraph',
19
+ position: child.position,
20
+ children: [text]
21
+ } : text;
22
+ });
16
23
  }
17
24
  /*
18
25
  * Raw HTML in a message as the characters a person typed. react-markdown drops an `html` node, so
@@ -20,7 +27,7 @@ function literal(parent) {
20
27
  * newlines of an HTML block still become line breaks.
21
28
  */
22
29
  export function remarkHtmlAsText() {
23
- return (tree) => {
24
- literal(tree);
25
- };
26
- }
30
+ return tree => {
31
+ literal(tree);
32
+ };
33
+ }
@@ -1,3 +1,3 @@
1
1
  import { createContext } from 'react';
2
2
  export const ReplyContext = createContext(null);
3
- export const UiReplyNavigationContext = createContext(null);
3
+ export const UiReplyNavigationContext = createContext(null);