@adecore/agents-react 0.31.12 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/README.md +1 -1
  2. package/dist/agents/AccountDot.js +57 -6
  3. package/dist/agents/AgentIcon.js +88 -12
  4. package/dist/agents/ModelOptionControl.js +153 -18
  5. package/dist/agents/ProviderLogo.js +49 -4
  6. package/dist/agents/account-limits.js +17 -14
  7. package/dist/agents/accounts.js +99 -67
  8. package/dist/agents/agent-marks.js +5 -3
  9. package/dist/agents/model-name.js +42 -31
  10. package/dist/agents/model-options.js +8 -8
  11. package/dist/agents/model-requirement.js +17 -14
  12. package/dist/agents/option-words.d.ts +7 -0
  13. package/dist/agents/option-words.js +35 -0
  14. package/dist/agents/provider-paths.js +6 -6
  15. package/dist/agents/status-look.js +32 -12
  16. package/dist/chat/account-choice.d.ts +13 -0
  17. package/dist/chat/account-choice.js +90 -20
  18. package/dist/chat/actions.js +126 -59
  19. package/dist/chat/activity.js +5 -5
  20. package/dist/chat/attachments.js +74 -53
  21. package/dist/chat/bookmarks.js +58 -48
  22. package/dist/chat/chat-client.js +344 -263
  23. package/dist/chat/chat-references.js +3 -3
  24. package/dist/chat/composer-effort.d.ts +5 -0
  25. package/dist/chat/composer-effort.js +26 -0
  26. package/dist/chat/composer-send.js +13 -13
  27. package/dist/chat/drafts.js +115 -79
  28. package/dist/chat/forks.js +81 -24
  29. package/dist/chat/guards.js +15 -43
  30. package/dist/chat/index.d.ts +3 -1
  31. package/dist/chat/index.js +3 -2
  32. package/dist/chat/logic/ansi.js +170 -167
  33. package/dist/chat/logic/answers.js +2 -2
  34. package/dist/chat/logic/bookmarks.js +19 -19
  35. package/dist/chat/logic/command-looks.js +138 -96
  36. package/dist/chat/logic/context-usage.js +13 -9
  37. package/dist/chat/logic/continue-after-stop.js +15 -19
  38. package/dist/chat/logic/effort.d.ts +14 -0
  39. package/dist/chat/logic/effort.js +34 -0
  40. package/dist/chat/logic/embedded-code.js +387 -326
  41. package/dist/chat/logic/fork.js +134 -110
  42. package/dist/chat/logic/generated-image.js +54 -23
  43. package/dist/chat/logic/goal.js +28 -20
  44. package/dist/chat/logic/handback.js +6 -6
  45. package/dist/chat/logic/json.js +2 -2
  46. package/dist/chat/logic/limit.js +46 -30
  47. package/dist/chat/logic/picker-entries.d.ts +5 -3
  48. package/dist/chat/logic/picker-entries.js +83 -43
  49. package/dist/chat/logic/resume-compaction.d.ts +14 -1
  50. package/dist/chat/logic/resume-compaction.js +93 -24
  51. package/dist/chat/logic/scrubber.js +188 -136
  52. package/dist/chat/logic/thought.js +13 -16
  53. package/dist/chat/logic/thread-cards.js +60 -48
  54. package/dist/chat/logic/timeline-copy.js +30 -38
  55. package/dist/chat/logic/timeline-target.js +92 -63
  56. package/dist/chat/logic/timeline.js +499 -355
  57. package/dist/chat/logic/tool-catalog.js +54 -34
  58. package/dist/chat/logic/tools.js +106 -82
  59. package/dist/chat/logic/visual-height.js +18 -18
  60. package/dist/chat/logic/visual-viewport.js +6 -3
  61. package/dist/chat/logic/welcome.js +9 -9
  62. package/dist/chat/logic/workflow.d.ts +10 -0
  63. package/dist/chat/logic/workflow.js +130 -32
  64. package/dist/chat/mentions.js +149 -109
  65. package/dist/chat/persisted-json.js +51 -54
  66. package/dist/chat/preferences.d.ts +4 -0
  67. package/dist/chat/preferences.js +162 -84
  68. package/dist/chat/prompt-hold.js +9 -9
  69. package/dist/chat/quote.js +21 -30
  70. package/dist/chat/reading-width.js +12 -10
  71. package/dist/chat/recent-messages.js +34 -21
  72. package/dist/chat/resume-compaction-dismissals.js +25 -5
  73. package/dist/chat/runtime-modes.js +3 -3
  74. package/dist/chat/send-key.js +11 -7
  75. package/dist/chat/stash.js +89 -69
  76. package/dist/chat/subagent-conversation.js +181 -139
  77. package/dist/chat/subagent-list.js +65 -67
  78. package/dist/chat/subagent-support.js +12 -7
  79. package/dist/chat/subagent-view.js +132 -44
  80. package/dist/chat/thumbnails.js +88 -60
  81. package/dist/chat/timeline-flash.js +24 -12
  82. package/dist/chat/timeline-scroll.js +116 -86
  83. package/dist/chat/ui/AccountPill.js +126 -15
  84. package/dist/chat/ui/AnsiOutput.js +62 -6
  85. package/dist/chat/ui/BookmarkMarker.js +231 -41
  86. package/dist/chat/ui/BookmarkSubmenu.js +165 -18
  87. package/dist/chat/ui/ChatActivity.js +649 -70
  88. package/dist/chat/ui/ChatReferenceChip.js +104 -9
  89. package/dist/chat/ui/CodeBlock.js +132 -58
  90. package/dist/chat/ui/Composer.js +866 -132
  91. package/dist/chat/ui/ComposerInput.js +309 -120
  92. package/dist/chat/ui/DiffPool.js +75 -14
  93. package/dist/chat/ui/EditDiff.js +160 -21
  94. package/dist/chat/ui/FadingWords.js +32 -3
  95. package/dist/chat/ui/GoalDock.js +235 -42
  96. package/dist/chat/ui/ImageView.js +617 -61
  97. package/dist/chat/ui/LimitState.js +446 -72
  98. package/dist/chat/ui/Markdown.js +991 -173
  99. package/dist/chat/ui/MermaidBlock.js +285 -79
  100. package/dist/chat/ui/MessageActions.js +251 -39
  101. package/dist/chat/ui/ModelMarks.js +55 -5
  102. package/dist/chat/ui/Pickers.js +664 -113
  103. package/dist/chat/ui/PromptComposer.js +281 -51
  104. package/dist/chat/ui/QuoteButton.js +151 -57
  105. package/dist/chat/ui/ResumeCompactionDock.d.ts +6 -2
  106. package/dist/chat/ui/ResumeCompactionDock.js +141 -6
  107. package/dist/chat/ui/RowTime.js +59 -5
  108. package/dist/chat/ui/RunSettings.js +1744 -154
  109. package/dist/chat/ui/Scrubber.js +517 -88
  110. package/dist/chat/ui/ShellCommand.js +183 -107
  111. package/dist/chat/ui/SubagentControls.js +212 -24
  112. package/dist/chat/ui/SubagentInfo.js +170 -13
  113. package/dist/chat/ui/SubagentStopButton.js +115 -24
  114. package/dist/chat/ui/SubagentTimeline.js +357 -91
  115. package/dist/chat/ui/Timeline.js +988 -476
  116. package/dist/chat/ui/TimelineMenu.js +552 -37
  117. package/dist/chat/ui/UnifiedDiff.js +234 -27
  118. package/dist/chat/ui/UploadThumb.js +37 -7
  119. package/dist/chat/ui/VisualDialogs.js +251 -20
  120. package/dist/chat/ui/VisualFrame.js +321 -95
  121. package/dist/chat/ui/Welcome.js +72 -7
  122. package/dist/chat/ui/chips.js +1 -1
  123. package/dist/chat/ui/code-lines.js +36 -36
  124. package/dist/chat/ui/code-streaming.js +1 -1
  125. package/dist/chat/ui/code-theme.js +7 -7
  126. package/dist/chat/ui/composer/ComposerControls.js +329 -21
  127. package/dist/chat/ui/composer/ComposerMenu.js +358 -30
  128. package/dist/chat/ui/composer/DraftParts.js +185 -11
  129. package/dist/chat/ui/composer/QueuedMessages.js +138 -13
  130. package/dist/chat/ui/composer/chips.js +29 -19
  131. package/dist/chat/ui/composer/editor.js +79 -63
  132. package/dist/chat/ui/composer/insert.js +26 -12
  133. package/dist/chat/ui/composer/key-handler.js +180 -127
  134. package/dist/chat/ui/composer/keys.js +90 -73
  135. package/dist/chat/ui/composer/menu-aria.js +18 -9
  136. package/dist/chat/ui/composer/placeholder.js +78 -31
  137. package/dist/chat/ui/composer/surface.js +13 -37
  138. package/dist/chat/ui/composer/use-chat-controls.js +230 -90
  139. package/dist/chat/ui/composer/use-compaction-offer.js +50 -18
  140. package/dist/chat/ui/composer/use-composer-draft.js +65 -34
  141. package/dist/chat/ui/composer/use-composer-menus.js +478 -193
  142. package/dist/chat/ui/composer/use-composer-submit.js +251 -109
  143. package/dist/chat/ui/composer/use-continuable-turn.js +33 -6
  144. package/dist/chat/ui/composer/use-draft-files.js +245 -93
  145. package/dist/chat/ui/composer/use-effort-stepper.d.ts +13 -0
  146. package/dist/chat/ui/composer/use-effort-stepper.js +88 -0
  147. package/dist/chat/ui/composer/use-notice.js +61 -16
  148. package/dist/chat/ui/composer/use-pending-requests.js +38 -17
  149. package/dist/chat/ui/composer/use-prompt-history.js +117 -45
  150. package/dist/chat/ui/composer/use-prompt-hold.js +119 -35
  151. package/dist/chat/ui/composer/use-take-back.js +94 -72
  152. package/dist/chat/ui/diff/ApprovalReview.js +101 -23
  153. package/dist/chat/ui/diff/DiffFallbackBoundary.js +21 -13
  154. package/dist/chat/ui/diff/DiffOmitted.js +56 -6
  155. package/dist/chat/ui/diff/DiffStack.js +92 -8
  156. package/dist/chat/ui/diff/DiffUnavailable.js +56 -6
  157. package/dist/chat/ui/diff/EditorEditDiff.js +263 -51
  158. package/dist/chat/ui/diff/EditorPatchDiff.js +39 -14
  159. package/dist/chat/ui/diff/LegacyDiffPool.js +27 -10
  160. package/dist/chat/ui/diff/LegacyEditDiff.js +97 -20
  161. package/dist/chat/ui/diff/LegacyUnifiedDiff.js +172 -42
  162. package/dist/chat/ui/diff/RawDiff.js +65 -5
  163. package/dist/chat/ui/diff/ReviewDiff.js +77 -5
  164. package/dist/chat/ui/diff/diff-props.js +1 -1
  165. package/dist/chat/ui/diff/diff-source-budget.js +46 -35
  166. package/dist/chat/ui/diff/editor-edit-model.js +18 -14
  167. package/dist/chat/ui/diff/review-plan.js +63 -40
  168. package/dist/chat/ui/diff/review-settle.js +24 -9
  169. package/dist/chat/ui/diff/syntax-runtime.js +236 -201
  170. package/dist/chat/ui/diff/use-review-stack.js +146 -25
  171. package/dist/chat/ui/diff-syntax.js +70 -58
  172. package/dist/chat/ui/diff-theme.js +31 -12
  173. package/dist/chat/ui/file-links.js +39 -10
  174. package/dist/chat/ui/find-reveal.js +29 -8
  175. package/dist/chat/ui/full-diff.js +17 -12
  176. package/dist/chat/ui/highlighter.js +143 -113
  177. package/dist/chat/ui/icons.js +16 -7
  178. package/dist/chat/ui/index.js +1 -1
  179. package/dist/chat/ui/intelligent-ui/UiBlockFrame.js +556 -82
  180. package/dist/chat/ui/intelligent-ui/UiFallbackPart.js +73 -5
  181. package/dist/chat/ui/intelligent-ui/UiReply.js +666 -262
  182. package/dist/chat/ui/intelligent-ui/block-local.js +59 -31
  183. package/dist/chat/ui/intelligent-ui/chart-data.js +77 -67
  184. package/dist/chat/ui/intelligent-ui/node-text.js +77 -91
  185. package/dist/chat/ui/intelligent-ui/registry.js +46 -46
  186. package/dist/chat/ui/intelligent-ui/render-context.js +1 -1
  187. package/dist/chat/ui/intelligent-ui/renderers/base-land.js +1 -1
  188. package/dist/chat/ui/intelligent-ui/renderers/binding.js +3 -3
  189. package/dist/chat/ui/intelligent-ui/renderers/chart.js +1223 -123
  190. package/dist/chat/ui/intelligent-ui/renderers/choices.js +312 -34
  191. package/dist/chat/ui/intelligent-ui/renderers/content.js +1241 -86
  192. package/dist/chat/ui/intelligent-ui/renderers/data.js +619 -54
  193. package/dist/chat/ui/intelligent-ui/renderers/inputs.js +868 -67
  194. package/dist/chat/ui/intelligent-ui/renderers/links.js +366 -62
  195. package/dist/chat/ui/intelligent-ui/renderers/map-slots.js +118 -60
  196. package/dist/chat/ui/intelligent-ui/renderers/map-style.js +85 -78
  197. package/dist/chat/ui/intelligent-ui/renderers/map-view.js +282 -217
  198. package/dist/chat/ui/intelligent-ui/renderers/map.js +621 -69
  199. package/dist/chat/ui/intelligent-ui/renderers/place-point.js +15 -8
  200. package/dist/chat/ui/intelligent-ui/renderers/structure.js +262 -20
  201. package/dist/chat/ui/intelligent-ui/renderers/text.js +674 -49
  202. package/dist/chat/ui/intelligent-ui/reply-parts.js +24 -15
  203. package/dist/chat/ui/intelligent-ui/table-data.js +97 -57
  204. package/dist/chat/ui/intelligent-ui/tones.js +31 -31
  205. package/dist/chat/ui/intelligent-ui/use-in-view.js +30 -12
  206. package/dist/chat/ui/intelligent-ui/use-later.js +28 -13
  207. package/dist/chat/ui/intelligent-ui/use-truncated.js +45 -21
  208. package/dist/chat/ui/intelligent-ui/use-ui-links.js +296 -109
  209. package/dist/chat/ui/intelligent-ui/use-ui-queries.js +256 -246
  210. package/dist/chat/ui/markdown-blocks.js +296 -262
  211. package/dist/chat/ui/mermaid.d.ts +8 -20
  212. package/dist/chat/ui/mermaid.js +47 -84
  213. package/dist/chat/ui/quote-selection.js +32 -29
  214. package/dist/chat/ui/rehype-chips.js +35 -23
  215. package/dist/chat/ui/rehype-fade.js +28 -17
  216. package/dist/chat/ui/remark-html-as-text.js +22 -15
  217. package/dist/chat/ui/reply-context.js +1 -1
  218. package/dist/chat/ui/reveal.js +161 -72
  219. package/dist/chat/ui/rows/ForksRow.js +226 -24
  220. package/dist/chat/ui/rows/GeneratedImageRow.js +541 -87
  221. package/dist/chat/ui/rows/MessageRows.js +1706 -159
  222. package/dist/chat/ui/rows/RowContainer.js +57 -7
  223. package/dist/chat/ui/rows/Rows.js +463 -54
  224. package/dist/chat/ui/rows/SubagentRow.js +577 -60
  225. package/dist/chat/ui/rows/TaskRow.js +359 -40
  226. package/dist/chat/ui/rows/VisualRow.js +233 -11
  227. package/dist/chat/ui/rows/WorkRows.d.ts +3 -0
  228. package/dist/chat/ui/rows/WorkRows.js +1945 -164
  229. package/dist/chat/ui/rows/WorkflowRow.js +756 -37
  230. package/dist/chat/ui/rows/row-rhythm.js +27 -17
  231. package/dist/chat/ui/theme-watch.js +26 -23
  232. package/dist/chat/ui/timestamp-format.js +4 -1
  233. package/dist/chat/ui/use-diff-source-tokens.js +70 -34
  234. package/dist/chat/ui/useToggleSet.js +51 -19
  235. package/dist/chat/ui/visual-theme.js +153 -128
  236. package/dist/chat/visual-bridge.js +123 -123
  237. package/dist/chat/visual-viewport.js +94 -83
  238. package/dist/chat/visuals.js +13 -5
  239. package/dist/host-hooks.d.ts +29 -0
  240. package/dist/host-hooks.js +78 -0
  241. package/dist/host.js +120 -48
  242. package/dist/index.js +1 -1
  243. package/dist/lazy.js +38 -32
  244. package/dist/locales/en/agent-chat.d.ts +42 -0
  245. package/dist/locales/en/agent-chat.js +755 -713
  246. package/dist/locales/en/agent-prompts.js +42 -42
  247. package/dist/locales/en/agent-providers.d.ts +1 -0
  248. package/dist/locales/en/agent-providers.js +166 -165
  249. package/dist/locales/en/agent-usage.d.ts +6 -0
  250. package/dist/locales/en/agent-usage.js +129 -123
  251. package/dist/locales/nl/agent-chat.d.ts +42 -0
  252. package/dist/locales/nl/agent-chat.js +755 -713
  253. package/dist/locales/nl/agent-prompts.js +42 -42
  254. package/dist/locales/nl/agent-providers.d.ts +1 -0
  255. package/dist/locales/nl/agent-providers.js +166 -165
  256. package/dist/locales/nl/agent-usage.d.ts +6 -0
  257. package/dist/locales/nl/agent-usage.js +129 -123
  258. package/dist/locales.js +14 -14
  259. package/dist/mounted-registry.js +31 -30
  260. package/dist/port-transport.js +122 -111
  261. package/dist/prompts/index.js +1 -1
  262. package/dist/prompts/logic/focus.js +15 -14
  263. package/dist/prompts/logic/keys.js +93 -59
  264. package/dist/prompts/logic/prompts.js +27 -14
  265. package/dist/prompts/logic/subjects.js +60 -46
  266. package/dist/prompts/logic/useFocusAfterAnswer.js +60 -20
  267. package/dist/prompts/logic/usePromptSession.js +88 -77
  268. package/dist/prompts/ui/ApprovalBody.js +246 -27
  269. package/dist/prompts/ui/PromptActions.js +215 -9
  270. package/dist/prompts/ui/PromptCard.js +215 -36
  271. package/dist/prompts/ui/PromptView.js +372 -34
  272. package/dist/prompts/ui/QuestionBody.js +269 -73
  273. package/dist/providers/AccountColors.js +36 -5
  274. package/dist/providers/AccountDetail.js +683 -50
  275. package/dist/providers/AccountVariables.js +139 -32
  276. package/dist/providers/AddAccountForm.js +125 -38
  277. package/dist/providers/CliDetail.js +343 -36
  278. package/dist/providers/InstallPage.js +644 -59
  279. package/dist/providers/ProviderList.d.ts +2 -1
  280. package/dist/providers/ProviderList.js +215 -23
  281. package/dist/providers/ProvidersPane.d.ts +4 -2
  282. package/dist/providers/ProvidersPane.js +244 -64
  283. package/dist/providers/account-actions.js +54 -30
  284. package/dist/providers/index.js +1 -1
  285. package/dist/providers/install-steps.js +12 -9
  286. package/dist/providers/pane-target.d.ts +3 -0
  287. package/dist/providers/pane-target.js +34 -13
  288. package/dist/providers/parts.js +62 -12
  289. package/dist/providers/provider-abilities.js +5 -5
  290. package/dist/providers/provider-groups.js +75 -40
  291. package/dist/providers/variables.js +73 -39
  292. package/dist/scope.js +6 -6
  293. package/dist/settings/sections.js +18 -18
  294. package/dist/state/chats.js +404 -192
  295. package/dist/state/index.js +1 -1
  296. package/dist/state/provider-accounts.js +70 -47
  297. package/dist/state/providers.js +45 -16
  298. package/dist/state/usage.js +154 -77
  299. package/dist/storage.js +69 -68
  300. package/dist/testing/index.js +1 -1
  301. package/dist/testing/prompts.js +105 -67
  302. package/dist/transport.js +10 -10
  303. package/dist/ui/PlainTextarea.js +27 -3
  304. package/dist/usage/LimitsList.js +646 -40
  305. package/dist/usage/UsageBreakdown.js +879 -38
  306. package/dist/usage/UsageChart.js +311 -32
  307. package/dist/usage/UsageDialog.js +46 -4
  308. package/dist/usage/UsageLimits.js +467 -34
  309. package/dist/usage/UsageLimitsCard.js +95 -11
  310. package/dist/usage/UsagePage.js +817 -96
  311. package/dist/usage/UsagePane.js +164 -10
  312. package/dist/usage/UsageSummary.js +151 -6
  313. package/dist/usage/UsageTiles.js +164 -14
  314. package/dist/usage/format.js +32 -32
  315. package/dist/usage/index.d.ts +1 -1
  316. package/dist/usage/index.js +2 -1
  317. package/dist/usage/limit-groups.d.ts +2 -0
  318. package/dist/usage/limit-groups.js +77 -59
  319. package/dist/usage/limits.js +78 -43
  320. package/dist/usage/money.js +20 -4
  321. package/dist/usage/summary.js +85 -64
  322. package/package.json +9 -9
  323. package/src/agents/ModelOptionControl.tsx +3 -1
  324. package/src/agents/option-words.ts +27 -0
  325. package/src/chat/account-choice.ts +41 -1
  326. package/src/chat/composer-effort.ts +32 -0
  327. package/src/chat/forks.ts +4 -5
  328. package/src/chat/index.ts +3 -1
  329. package/src/chat/logic/effort.ts +32 -0
  330. package/src/chat/logic/picker-entries.ts +45 -10
  331. package/src/chat/logic/resume-compaction.ts +95 -17
  332. package/src/chat/logic/timeline.ts +11 -3
  333. package/src/chat/logic/workflow.ts +86 -4
  334. package/src/chat/preferences.ts +35 -0
  335. package/src/chat/subagent-view.ts +2 -3
  336. package/src/chat/ui/AnsiOutput.tsx +1 -2
  337. package/src/chat/ui/BookmarkSubmenu.tsx +3 -3
  338. package/src/chat/ui/ChatActivity.tsx +14 -22
  339. package/src/chat/ui/ChatReferenceChip.tsx +2 -3
  340. package/src/chat/ui/Composer.tsx +15 -7
  341. package/src/chat/ui/EditDiff.tsx +2 -3
  342. package/src/chat/ui/LimitState.tsx +2 -2
  343. package/src/chat/ui/Markdown.tsx +10 -8
  344. package/src/chat/ui/MermaidBlock.tsx +57 -49
  345. package/src/chat/ui/Pickers.tsx +49 -29
  346. package/src/chat/ui/PromptComposer.tsx +7 -9
  347. package/src/chat/ui/ResumeCompactionDock.tsx +16 -4
  348. package/src/chat/ui/RunSettings.tsx +67 -28
  349. package/src/chat/ui/Scrubber.tsx +3 -3
  350. package/src/chat/ui/ShellCommand.tsx +2 -0
  351. package/src/chat/ui/SubagentInfo.tsx +2 -3
  352. package/src/chat/ui/SubagentTimeline.tsx +12 -16
  353. package/src/chat/ui/Timeline.tsx +6 -6
  354. package/src/chat/ui/UnifiedDiff.tsx +3 -4
  355. package/src/chat/ui/VisualFrame.tsx +5 -8
  356. package/src/chat/ui/code-theme.ts +4 -4
  357. package/src/chat/ui/composer/placeholder.ts +2 -2
  358. package/src/chat/ui/composer/use-compaction-offer.ts +36 -16
  359. package/src/chat/ui/composer/use-composer-menus.ts +4 -9
  360. package/src/chat/ui/composer/use-composer-submit.ts +2 -1
  361. package/src/chat/ui/composer/use-effort-stepper.ts +56 -0
  362. package/src/chat/ui/composer/use-notice.ts +2 -2
  363. package/src/chat/ui/diff/EditorEditDiff.tsx +9 -13
  364. package/src/chat/ui/diff/LegacyEditDiff.tsx +12 -17
  365. package/src/chat/ui/diff/LegacyUnifiedDiff.tsx +13 -21
  366. package/src/chat/ui/diff/use-review-stack.ts +4 -4
  367. package/src/chat/ui/diff-theme.ts +3 -3
  368. package/src/chat/ui/file-links.ts +2 -2
  369. package/src/chat/ui/intelligent-ui/UiReply.tsx +2 -0
  370. package/src/chat/ui/intelligent-ui/renderers/chart.tsx +3 -3
  371. package/src/chat/ui/intelligent-ui/renderers/content.tsx +5 -6
  372. package/src/chat/ui/intelligent-ui/renderers/map-view.tsx +2 -1
  373. package/src/chat/ui/intelligent-ui/renderers/map.tsx +2 -1
  374. package/src/chat/ui/intelligent-ui/use-truncated.ts +16 -19
  375. package/src/chat/ui/intelligent-ui/use-ui-links.ts +3 -3
  376. package/src/chat/ui/mermaid.ts +52 -96
  377. package/src/chat/ui/rows/ForksRow.tsx +3 -5
  378. package/src/chat/ui/rows/GeneratedImageRow.tsx +2 -1
  379. package/src/chat/ui/rows/MessageRows.tsx +12 -21
  380. package/src/chat/ui/rows/SubagentRow.tsx +3 -3
  381. package/src/chat/ui/rows/TaskRow.tsx +1 -1
  382. package/src/chat/ui/rows/WorkRows.tsx +11 -6
  383. package/src/chat/ui/rows/WorkflowRow.tsx +144 -54
  384. package/src/chat/ui/useToggleSet.ts +15 -18
  385. package/src/chat/ui/visual-theme.ts +2 -3
  386. package/src/host-hooks.ts +113 -0
  387. package/src/lazy.tsx +2 -0
  388. package/src/locales/en/agent-chat.ts +142 -108
  389. package/src/locales/en/agent-prompts.ts +7 -7
  390. package/src/locales/en/agent-providers.ts +35 -34
  391. package/src/locales/en/agent-usage.ts +26 -20
  392. package/src/locales/nl/agent-chat.ts +134 -100
  393. package/src/locales/nl/agent-prompts.ts +5 -5
  394. package/src/locales/nl/agent-providers.ts +33 -32
  395. package/src/locales/nl/agent-usage.ts +25 -20
  396. package/src/providers/CliDetail.tsx +2 -1
  397. package/src/providers/InstallPage.tsx +2 -4
  398. package/src/providers/ProviderList.tsx +12 -2
  399. package/src/providers/ProvidersPane.tsx +45 -15
  400. package/src/providers/pane-target.ts +20 -4
  401. package/src/state/chats.ts +2 -2
  402. package/src/usage/LimitsList.tsx +12 -13
  403. package/src/usage/UsageBreakdown.tsx +17 -6
  404. package/src/usage/UsageLimits.tsx +2 -1
  405. package/src/usage/UsagePage.tsx +3 -3
  406. package/src/usage/index.ts +1 -1
  407. package/src/usage/limit-groups.ts +12 -0
  408. package/src/usage/limits.ts +2 -2
  409. package/src/usage/money.ts +1 -2
@@ -9,9 +9,9 @@ export const FOLLOW_THRESHOLD_PX = 40;
9
9
  * already carries the gap before it, and the row after one is the answer, so neither takes a seam.
10
10
  */
11
11
  export function rowRhythm(row, previous) {
12
- const question = row.kind === 'user';
13
- const seam = !question && previous !== null && previous.kind !== 'user' && (isBlock(row) !== isBlock(previous) || previous.kind === 'visual');
14
- return clsx(question && 'pb-(--chat-answer-gap)', seam && 'pt-(--chat-block-gap)');
12
+ const question = row.kind === 'user';
13
+ const seam = !question && previous !== null && previous.kind !== 'user' && (isBlock(row) !== isBlock(previous) || previous.kind === 'visual');
14
+ return clsx(question && 'pb-(--chat-answer-gap)', seam && 'pt-(--chat-block-gap)');
15
15
  }
16
16
  /*
17
17
  * Whether a reply's header goes over this row, and the time it shows: the first row after the question
@@ -19,21 +19,31 @@ export function rowRhythm(row, previous) {
19
19
  * starts halfway through a reply has no time to show.
20
20
  */
21
21
  export function replyHeader(row, previous) {
22
- if (row.kind === 'user' || row.kind === 'turn-start') {
23
- return null;
24
- }
25
- if (previous === null) {
26
- return { at: null };
27
- }
28
- if (previous.kind === 'user') {
29
- return { at: previous.item.createdAt };
30
- }
31
- if (previous.kind === 'turn-start') {
32
- return { at: previous.turn.createdAt };
33
- }
22
+ if (row.kind === 'user' || row.kind === 'turn-start') {
34
23
  return null;
24
+ }
25
+ if (previous === null) {
26
+ return {
27
+ at: null
28
+ };
29
+ }
30
+ if (previous.kind === 'user') {
31
+ return {
32
+ at: previous.item.createdAt
33
+ };
34
+ }
35
+ if (previous.kind === 'turn-start') {
36
+ return {
37
+ at: previous.turn.createdAt
38
+ };
39
+ }
40
+ return null;
35
41
  }
36
42
  // A transform also shifts a descendant's sticky position after it was resolved against the scrollport.
37
43
  export function rowPosition(kind, top) {
38
- return kind === 'visual' ? { top } : { transform: `translateY(${top}px)` };
39
- }
44
+ return kind === 'visual' ? {
45
+ top
46
+ } : {
47
+ transform: `translateY(${top}px)`
48
+ };
49
+ }
@@ -10,27 +10,30 @@ const THEME_ATTRIBUTES = ['class', 'style', 'data-theme'];
10
10
  * locks the scroll writes the root's `style`), so a caller compares what it reads with what it drew.
11
11
  */
12
12
  export function watchTheme(owner, changed) {
13
- const view = owner.defaultView ?? window;
14
- let frame = 0;
15
- const schedule = () => {
16
- if (frame === 0) {
17
- frame = view.requestAnimationFrame(() => {
18
- frame = 0;
19
- changed();
20
- });
21
- }
22
- };
23
- const observer = new view.MutationObserver(schedule);
24
- for (const root of [owner.documentElement, owner.body]) {
25
- if (root !== null) {
26
- observer.observe(root, { attributes: true, attributeFilter: THEME_ATTRIBUTES });
27
- }
13
+ const view = owner.defaultView ?? window;
14
+ let frame = 0;
15
+ const schedule = () => {
16
+ if (frame === 0) {
17
+ frame = view.requestAnimationFrame(() => {
18
+ frame = 0;
19
+ changed();
20
+ });
28
21
  }
29
- return () => {
30
- observer.disconnect();
31
- if (frame !== 0) {
32
- view.cancelAnimationFrame(frame);
33
- frame = 0;
34
- }
35
- };
36
- }
22
+ };
23
+ const observer = new view.MutationObserver(schedule);
24
+ for (const root of [owner.documentElement, owner.body]) {
25
+ if (root !== null) {
26
+ observer.observe(root, {
27
+ attributes: true,
28
+ attributeFilter: THEME_ATTRIBUTES
29
+ });
30
+ }
31
+ }
32
+ return () => {
33
+ observer.disconnect();
34
+ if (frame !== 0) {
35
+ view.cancelAnimationFrame(frame);
36
+ frame = 0;
37
+ }
38
+ };
39
+ }
@@ -1,2 +1,5 @@
1
1
  /* The full date and time a row's time names on its tooltip. */
2
- export const TIMESTAMP_FORMAT = { dateStyle: 'full', timeStyle: 'medium' };
2
+ export const TIMESTAMP_FORMAT = {
3
+ dateStyle: 'full',
4
+ timeStyle: 'medium'
5
+ };
@@ -1,43 +1,79 @@
1
+ import { c as _c } from "react/compiler-runtime";
1
2
  import { useLayoutEffect, useMemo } from 'react';
2
3
  import { diffSyntaxDocument } from '@adecore/editor-react';
3
4
  import { useChatHost } from '../../host.js';
4
5
  import { diffSourceTokens, diffSyntaxRuntime } from './diff-syntax.js';
5
6
  function createSourceBinding(document, language, theme, runtime) {
6
- const mapping = diffSyntaxDocument(document, language, theme);
7
- const listeners = new Set();
8
- let source;
9
- const current = () => {
10
- if (source === undefined) {
11
- source = diffSourceTokens(document, mapping, runtime());
12
- source.subscribe(() => {
13
- for (const listener of [...listeners]) {
14
- listener();
15
- }
16
- });
7
+ const mapping = diffSyntaxDocument(document, language, theme);
8
+ const listeners = new Set();
9
+ let source;
10
+ const current = () => {
11
+ if (source === undefined) {
12
+ source = diffSourceTokens(document, mapping, runtime());
13
+ source.subscribe(() => {
14
+ for (const listener of [...listeners]) {
15
+ listener();
17
16
  }
18
- return source;
19
- };
20
- return {
21
- tokens: {
22
- get: (side, index) => (mapping.locate(side, index) === undefined ? null : current().get(side, index)),
23
- subscribe(listener) {
24
- listeners.add(listener);
25
- return () => {
26
- listeners.delete(listener);
27
- };
28
- }
29
- },
30
- release() {
31
- // StrictMode replays effects with the same memo; the next read opens fresh sessions.
32
- source?.dispose();
33
- source = undefined;
34
- }
35
- };
17
+ });
18
+ }
19
+ return source;
20
+ };
21
+ return {
22
+ tokens: {
23
+ get: (side, index) => mapping.locate(side, index) === undefined ? null : current().get(side, index),
24
+ subscribe(listener) {
25
+ listeners.add(listener);
26
+ return () => {
27
+ listeners.delete(listener);
28
+ };
29
+ }
30
+ },
31
+ release() {
32
+ // StrictMode replays effects with the same memo; the next read opens fresh sessions.
33
+ source?.dispose();
34
+ source = undefined;
35
+ }
36
+ };
36
37
  }
37
38
  /* Without a `runtime`, the shared one of the host's `code`. */
38
39
  export function useDiffSourceTokens(document, language, theme, runtime) {
39
- const { code } = useChatHost();
40
- const binding = useMemo(() => createSourceBinding(document, language, theme, () => runtime ?? diffSyntaxRuntime(code)), [document, language, theme, runtime, code]);
41
- useLayoutEffect(() => () => binding.release(), [binding]);
42
- return binding.tokens;
43
- }
40
+ const $ = _c(11);
41
+ const {
42
+ code
43
+ } = useChatHost();
44
+ let t0;
45
+ if ($[0] !== code || $[1] !== runtime) {
46
+ t0 = () => runtime ?? diffSyntaxRuntime(code);
47
+ $[0] = code;
48
+ $[1] = runtime;
49
+ $[2] = t0;
50
+ } else {
51
+ t0 = $[2];
52
+ }
53
+ let t1;
54
+ if ($[3] !== document || $[4] !== language || $[5] !== t0 || $[6] !== theme) {
55
+ t1 = createSourceBinding(document, language, theme, t0);
56
+ $[3] = document;
57
+ $[4] = language;
58
+ $[5] = t0;
59
+ $[6] = theme;
60
+ $[7] = t1;
61
+ } else {
62
+ t1 = $[7];
63
+ }
64
+ const binding = t1;
65
+ let t2;
66
+ let t3;
67
+ if ($[8] !== binding) {
68
+ t2 = () => () => binding.release();
69
+ t3 = [binding];
70
+ $[8] = binding;
71
+ $[9] = t2;
72
+ $[10] = t3;
73
+ } else {
74
+ t2 = $[9];
75
+ t3 = $[10];
76
+ }
77
+ useLayoutEffect(t2, t3);
78
+ return binding.tokens;
79
+ }
@@ -1,25 +1,57 @@
1
- import { useCallback, useState } from 'react';
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { useState } from 'react';
2
3
  /*
3
4
  * The ids of the folds a thread has open. `onToggle` is what a thread does about a person opening
4
5
  * one, which is to stop following the end: a fold is a deliberate look back, not a reason to jump.
5
6
  */
6
7
  export function useToggleSet(onToggle) {
7
- const [ids, setIds] = useState(() => new Set());
8
- const toggle = useCallback((id) => {
9
- setIds((current) => {
10
- const next = new Set(current);
11
- if (next.has(id)) {
12
- next.delete(id);
13
- }
14
- else {
15
- next.add(id);
16
- }
17
- return next;
18
- });
19
- onToggle?.();
20
- }, [onToggle]);
21
- const add = useCallback((id) => {
22
- setIds((current) => new Set(current).add(id));
23
- }, []);
24
- return { ids, toggle, add };
8
+ const $ = _c(6);
9
+ const [ids, setIds] = useState(_temp);
10
+ let t0;
11
+ if ($[0] !== onToggle) {
12
+ t0 = id => {
13
+ setIds(current => {
14
+ const next = new Set(current);
15
+ if (next.has(id)) {
16
+ next.delete(id);
17
+ } else {
18
+ next.add(id);
19
+ }
20
+ return next;
21
+ });
22
+ onToggle?.();
23
+ };
24
+ $[0] = onToggle;
25
+ $[1] = t0;
26
+ } else {
27
+ t0 = $[1];
28
+ }
29
+ const toggle = t0;
30
+ let t1;
31
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
32
+ t1 = id_0 => {
33
+ setIds(current_0 => new Set(current_0).add(id_0));
34
+ };
35
+ $[2] = t1;
36
+ } else {
37
+ t1 = $[2];
38
+ }
39
+ const add = t1;
40
+ let t2;
41
+ if ($[3] !== ids || $[4] !== toggle) {
42
+ t2 = {
43
+ ids,
44
+ toggle,
45
+ add
46
+ };
47
+ $[3] = ids;
48
+ $[4] = toggle;
49
+ $[5] = t2;
50
+ } else {
51
+ t2 = $[5];
52
+ }
53
+ return t2;
25
54
  }
55
+ function _temp() {
56
+ return new Set();
57
+ }
@@ -1,7 +1,8 @@
1
+ import { c as _c } from "react/compiler-runtime";
1
2
  import { useLayoutEffect, useState } from 'react';
2
3
  import { cleanVisualVariables } from '@adecore/agent-contracts/visual';
3
- import { useChatHost } from '../../host.js';
4
4
  import { watchTheme } from './theme-watch.js';
5
+ import { useHostCodeMode } from '../../host-hooks.js';
5
6
  /*
6
7
  * A page's theme from the app's tokens. The names follow common component themes, where `--accent`
7
8
  * is a quiet hover ground and `--primary` the color that stands out, so the app's accent is the
@@ -9,60 +10,68 @@ import { watchTheme } from './theme-watch.js';
9
10
  * token the app does not set, keeps the page's default for this appearance.
10
11
  */
11
12
  export function visualThemeOf(tokens, appearance, background) {
12
- const text = tokens.color('--text');
13
- const quiet = tokens.color('--surface-hover');
14
- const raised = tokens.color('--surface-raised');
15
- const accent = tokens.color('--accent');
16
- const onAccent = tokens.color('--accent-text');
17
- const variables = {
18
- '--background': background,
19
- '--foreground': text,
20
- '--muted': quiet,
21
- '--muted-foreground': tokens.color('--text-muted'),
22
- '--card': raised,
23
- '--card-foreground': text,
24
- '--popover': raised,
25
- '--popover-foreground': text,
26
- '--secondary': quiet,
27
- '--secondary-foreground': text,
28
- '--border': tokens.color('--border'),
29
- '--input': tokens.color('--border-strong'),
30
- '--ring': accent,
31
- '--primary': accent,
32
- '--primary-foreground': onAccent,
33
- '--accent': quiet,
34
- '--accent-foreground': text,
35
- '--destructive': tokens.color('--status-error'),
36
- '--destructive-foreground': onAccent,
37
- '--warning': tokens.color('--status-needs-you'),
38
- '--success': tokens.color('--positive'),
39
- '--success-foreground': tokens.color('--positive-text'),
40
- '--info': tokens.color('--status-running'),
41
- '--code-background': tokens.color('--chat-code-bg'),
42
- '--code-foreground': tokens.color('--chat-output'),
43
- '--chart-1': tokens.color('--chart-1') || accent,
44
- '--chart-2': tokens.color('--chart-2'),
45
- '--chart-3': tokens.color('--chart-3'),
46
- '--chart-4': tokens.color('--chart-4'),
47
- '--chart-5': tokens.color('--chart-5'),
48
- '--chart-6': tokens.color('--chart-6'),
49
- '--radius': tokens.length('--radius-lg'),
50
- '--font-sans': tokens.value('--font-sans'),
51
- '--font-mono': tokens.value('--font-mono')
52
- };
53
- return { appearance, variables: cleanVisualVariables(variables) };
13
+ const text = tokens.color('--text');
14
+ const quiet = tokens.color('--surface-hover');
15
+ const raised = tokens.color('--surface-raised');
16
+ const accent = tokens.color('--accent');
17
+ const onAccent = tokens.color('--accent-text');
18
+ const variables = {
19
+ '--background': background,
20
+ '--foreground': text,
21
+ '--muted': quiet,
22
+ '--muted-foreground': tokens.color('--text-muted'),
23
+ '--card': raised,
24
+ '--card-foreground': text,
25
+ '--popover': raised,
26
+ '--popover-foreground': text,
27
+ '--secondary': quiet,
28
+ '--secondary-foreground': text,
29
+ '--border': tokens.color('--border'),
30
+ '--input': tokens.color('--border-strong'),
31
+ '--ring': accent,
32
+ '--primary': accent,
33
+ '--primary-foreground': onAccent,
34
+ '--accent': quiet,
35
+ '--accent-foreground': text,
36
+ '--destructive': tokens.color('--status-error'),
37
+ '--destructive-foreground': onAccent,
38
+ '--warning': tokens.color('--status-needs-you'),
39
+ '--success': tokens.color('--positive'),
40
+ '--success-foreground': tokens.color('--positive-text'),
41
+ '--info': tokens.color('--status-running'),
42
+ '--code-background': tokens.color('--chat-code-bg'),
43
+ '--code-foreground': tokens.color('--chat-output'),
44
+ '--chart-1': tokens.color('--chart-1') || accent,
45
+ '--chart-2': tokens.color('--chart-2'),
46
+ '--chart-3': tokens.color('--chart-3'),
47
+ '--chart-4': tokens.color('--chart-4'),
48
+ '--chart-5': tokens.color('--chart-5'),
49
+ '--chart-6': tokens.color('--chart-6'),
50
+ '--radius': tokens.length('--radius-lg'),
51
+ '--font-sans': tokens.value('--font-sans'),
52
+ '--font-mono': tokens.value('--font-mono')
53
+ };
54
+ return {
55
+ appearance,
56
+ variables: cleanVisualVariables(variables)
57
+ };
54
58
  }
55
59
  const RGB = /^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)\s*(?:[,/]\s*([\d.]+)(%?)\s*)?\)$/;
56
60
  function rgbaOf(color) {
57
- const match = RGB.exec(color.trim());
58
- if (match === null) {
59
- return null;
60
- }
61
- const alpha = match[4] === undefined ? 1 : Number(match[4]) / (match[5] === '%' ? 100 : 1);
62
- return { red: Number(match[1]), green: Number(match[2]), blue: Number(match[3]), alpha };
61
+ const match = RGB.exec(color.trim());
62
+ if (match === null) {
63
+ return null;
64
+ }
65
+ const alpha = match[4] === undefined ? 1 : Number(match[4]) / (match[5] === '%' ? 100 : 1);
66
+ return {
67
+ red: Number(match[1]),
68
+ green: Number(match[2]),
69
+ blue: Number(match[3]),
70
+ alpha
71
+ };
63
72
  }
64
73
  function isTransparent(color) {
65
- return color === 'transparent' || rgbaOf(color)?.alpha === 0;
74
+ return color === 'transparent' || rgbaOf(color)?.alpha === 0;
66
75
  }
67
76
  /*
68
77
  * What lies behind an element, from the computed backgrounds of it and its ancestors, nearest first:
@@ -70,70 +79,73 @@ function isTransparent(color) {
70
79
  * Null when none of them paints.
71
80
  */
72
81
  export function backgroundBehind(layers) {
73
- const translucent = [];
74
- for (const layer of layers) {
75
- if (layer === '' || isTransparent(layer)) {
76
- continue;
77
- }
78
- const color = rgbaOf(layer);
79
- if (color !== null && color.alpha < 1) {
80
- translucent.push(color);
81
- continue;
82
- }
83
- if (color === null || translucent.length === 0) {
84
- // A color in a space other than sRGB stays as the engine wrote it, since there is no laying another over it here.
85
- return color === null ? layer : `rgb(${color.red}, ${color.green}, ${color.blue})`;
86
- }
87
- let { red, green, blue } = color;
88
- for (const over of translucent.reverse()) {
89
- red = over.red * over.alpha + red * (1 - over.alpha);
90
- green = over.green * over.alpha + green * (1 - over.alpha);
91
- blue = over.blue * over.alpha + blue * (1 - over.alpha);
92
- }
93
- return `rgb(${Math.round(red)}, ${Math.round(green)}, ${Math.round(blue)})`;
82
+ const translucent = [];
83
+ for (const layer of layers) {
84
+ if (layer === '' || isTransparent(layer)) {
85
+ continue;
94
86
  }
95
- return null;
87
+ const color = rgbaOf(layer);
88
+ if (color !== null && color.alpha < 1) {
89
+ translucent.push(color);
90
+ continue;
91
+ }
92
+ if (color === null || translucent.length === 0) {
93
+ // A color in a space other than sRGB stays as the engine wrote it, since there is no laying another over it here.
94
+ return color === null ? layer : `rgb(${color.red}, ${color.green}, ${color.blue})`;
95
+ }
96
+ let {
97
+ red,
98
+ green,
99
+ blue
100
+ } = color;
101
+ for (const over of translucent.reverse()) {
102
+ red = over.red * over.alpha + red * (1 - over.alpha);
103
+ green = over.green * over.alpha + green * (1 - over.alpha);
104
+ blue = over.blue * over.alpha + blue * (1 - over.alpha);
105
+ }
106
+ return `rgb(${Math.round(red)}, ${Math.round(green)}, ${Math.round(blue)})`;
107
+ }
108
+ return null;
96
109
  }
97
110
  function sameTheme(left, right) {
98
- return left.appearance === right.appearance && JSON.stringify(left.variables) === JSON.stringify(right.variables);
111
+ return left.appearance === right.appearance && JSON.stringify(left.variables) === JSON.stringify(right.variables);
99
112
  }
100
113
  /*
101
114
  * The theme where `element` stands. Colors and lengths are read off a probe in that very place, so a
102
115
  * nested theme answers for itself and every value comes out the way the engine computes it.
103
116
  */
104
117
  function readTheme(element, mode) {
105
- const view = element.ownerDocument.defaultView ?? window;
106
- const style = view.getComputedStyle(element);
107
- const probe = element.ownerDocument.createElement('span');
108
- probe.style.position = 'absolute';
109
- probe.style.visibility = 'hidden';
110
- element.append(probe);
111
- try {
112
- const probed = view.getComputedStyle(probe);
113
- const declared = (token) => style.getPropertyValue(token).trim();
114
- const computed = (property, token) => {
115
- if (declared(token) === '') {
116
- return '';
117
- }
118
- probe.style[property] = `var(${token})`;
119
- return probed[property];
120
- };
121
- const tokens = {
122
- color: (token) => computed('color', token),
123
- length: (token) => computed('borderTopLeftRadius', token),
124
- value: declared
125
- };
126
- const layers = [];
127
- for (let node = element; node !== null; node = node.parentElement) {
128
- layers.push(view.getComputedStyle(node).backgroundColor);
129
- }
130
- const scheme = style.colorScheme.trim();
131
- const appearance = scheme === 'light' || scheme === 'dark' ? scheme : mode;
132
- return visualThemeOf(tokens, appearance, backgroundBehind(layers) ?? tokens.color('--surface'));
133
- }
134
- finally {
135
- probe.remove();
118
+ const view = element.ownerDocument.defaultView ?? window;
119
+ const style = view.getComputedStyle(element);
120
+ const probe = element.ownerDocument.createElement('span');
121
+ probe.style.position = 'absolute';
122
+ probe.style.visibility = 'hidden';
123
+ element.append(probe);
124
+ try {
125
+ const probed = view.getComputedStyle(probe);
126
+ const declared = token => style.getPropertyValue(token).trim();
127
+ const computed = (property, token) => {
128
+ if (declared(token) === '') {
129
+ return '';
130
+ }
131
+ probe.style[property] = `var(${token})`;
132
+ return probed[property];
133
+ };
134
+ const tokens = {
135
+ color: token => computed('color', token),
136
+ length: token => computed('borderTopLeftRadius', token),
137
+ value: declared
138
+ };
139
+ const layers = [];
140
+ for (let node = element; node !== null; node = node.parentElement) {
141
+ layers.push(view.getComputedStyle(node).backgroundColor);
136
142
  }
143
+ const scheme = style.colorScheme.trim();
144
+ const appearance = scheme === 'light' || scheme === 'dark' ? scheme : mode;
145
+ return visualThemeOf(tokens, appearance, backgroundBehind(layers) ?? tokens.color('--surface'));
146
+ } finally {
147
+ probe.remove();
148
+ }
137
149
  }
138
150
  /*
139
151
  * The app's theme for a visual drawn in `ref`, null until the element is there. It is read again when
@@ -141,27 +153,40 @@ function readTheme(element, mode) {
141
153
  * accent or a font a person picks reaches every frame as well.
142
154
  */
143
155
  export function useVisualTheme(ref) {
144
- const host = useChatHost();
145
- const mode = host.code.useMode();
146
- const [theme, setTheme] = useState(null);
147
- useLayoutEffect(() => {
148
- const element = ref.current;
149
- if (element === null) {
150
- return;
151
- }
152
- const read = () => {
153
- const next = readTheme(element, mode);
154
- setTheme((current) => (current !== null && sameTheme(current, next) ? current : next));
155
- };
156
- read();
157
- const owner = element.ownerDocument;
158
- const stopWatching = watchTheme(owner, read);
159
- const scheme = owner.defaultView?.matchMedia?.('(prefers-color-scheme: dark)') ?? null;
160
- scheme?.addEventListener('change', read);
161
- return () => {
162
- stopWatching();
163
- scheme?.removeEventListener('change', read);
164
- };
165
- }, [ref, mode]);
166
- return theme;
167
- }
156
+ const $ = _c(4);
157
+ const mode = useHostCodeMode();
158
+ const [theme, setTheme] = useState(null);
159
+ let t0;
160
+ let t1;
161
+ if ($[0] !== mode || $[1] !== ref) {
162
+ t0 = () => {
163
+ const element = ref.current;
164
+ if (element === null) {
165
+ return;
166
+ }
167
+ const read = () => {
168
+ const next = readTheme(element, mode);
169
+ setTheme(current => current !== null && sameTheme(current, next) ? current : next);
170
+ };
171
+ read();
172
+ const owner = element.ownerDocument;
173
+ const stopWatching = watchTheme(owner, read);
174
+ const scheme = owner.defaultView?.matchMedia?.("(prefers-color-scheme: dark)") ?? null;
175
+ scheme?.addEventListener("change", read);
176
+ return () => {
177
+ stopWatching();
178
+ scheme?.removeEventListener("change", read);
179
+ };
180
+ };
181
+ t1 = [ref, mode];
182
+ $[0] = mode;
183
+ $[1] = ref;
184
+ $[2] = t0;
185
+ $[3] = t1;
186
+ } else {
187
+ t0 = $[2];
188
+ t1 = $[3];
189
+ }
190
+ useLayoutEffect(t0, t1);
191
+ return theme;
192
+ }