@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
@@ -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
+ }
@@ -7,8 +7,8 @@ import { clampVisualHeight, visualContentHeight } from './logic/visual-height.js
7
7
  */
8
8
  const SILENCE_MS = 3000;
9
9
  function timeout(ms, run) {
10
- const timer = setTimeout(run, ms);
11
- return () => clearTimeout(timer);
10
+ const timer = setTimeout(run, ms);
11
+ return () => clearTimeout(timer);
12
12
  }
13
13
  /*
14
14
  * Talks to the frame of one visual. It hands the sandbox host page the visual's page when it says it
@@ -17,135 +17,135 @@ function timeout(ms, run) {
17
17
  * messages that come from the page count only once the page was sent.
18
18
  */
19
19
  export class VisualBridge {
20
- options;
21
- theme;
22
- html = null;
23
- /* Whether the sandbox host page ever said it listens, which is what tells it from an error page. */
24
- heard = false;
25
- /* The sandbox host page listens and has not been sent the page yet. */
26
- waiting = false;
27
- /* The theme the page was last sent, from the moment it was sent; null before that. */
28
- sent = null;
29
- /* Whether the page reported a size since it was sent, which says it runs and is drawn. */
30
- live = false;
31
- viewportReady = false;
32
- viewport = null;
33
- disposed = false;
34
- cancelSilence = () => undefined;
35
- constructor(options) {
36
- this.options = options;
37
- this.theme = options.theme;
38
- options.page.then((html) => {
39
- this.html = html;
40
- this.sendPage();
41
- }, () => {
42
- if (!this.disposed) {
43
- options.onFailure();
44
- }
45
- });
20
+ options;
21
+ theme;
22
+ html = null;
23
+ /* Whether the sandbox host page ever said it listens, which is what tells it from an error page. */
24
+ heard = false;
25
+ /* The sandbox host page listens and has not been sent the page yet. */
26
+ waiting = false;
27
+ /* The theme the page was last sent, from the moment it was sent; null before that. */
28
+ sent = null;
29
+ /* Whether the page reported a size since it was sent, which says it runs and is drawn. */
30
+ live = false;
31
+ viewportReady = false;
32
+ viewport = null;
33
+ disposed = false;
34
+ cancelSilence = () => undefined;
35
+ constructor(options) {
36
+ this.options = options;
37
+ this.theme = options.theme;
38
+ options.page.then(html => {
39
+ this.html = html;
40
+ this.sendPage();
41
+ }, () => {
42
+ if (!this.disposed) {
43
+ options.onFailure();
44
+ }
45
+ });
46
+ }
47
+ /* A `message` event of the window the frame is in. */
48
+ receive(event) {
49
+ const frame = this.options.frame();
50
+ if (this.disposed || frame === null || event.source !== frame) {
51
+ return;
46
52
  }
47
- /* A `message` event of the window the frame is in. */
48
- receive(event) {
49
- const frame = this.options.frame();
50
- if (this.disposed || frame === null || event.source !== frame) {
51
- return;
53
+ const message = parseVisualMessage(event.data);
54
+ switch (message?.method) {
55
+ case VISUAL_BRIDGE_METHODS.sandboxProxyReady:
56
+ // A frame that loads again starts over from the sandbox host page.
57
+ this.heard = true;
58
+ this.waiting = true;
59
+ this.sent = null;
60
+ this.live = false;
61
+ this.viewportReady = false;
62
+ this.cancelSilence();
63
+ this.sendPage();
64
+ return;
65
+ case VISUAL_BRIDGE_METHODS.sizeChanged:
66
+ if (this.sent === null) {
67
+ return;
52
68
  }
53
- const message = parseVisualMessage(event.data);
54
- switch (message?.method) {
55
- case VISUAL_BRIDGE_METHODS.sandboxProxyReady:
56
- // A frame that loads again starts over from the sandbox host page.
57
- this.heard = true;
58
- this.waiting = true;
59
- this.sent = null;
60
- this.live = false;
61
- this.viewportReady = false;
62
- this.cancelSilence();
63
- this.sendPage();
64
- return;
65
- case VISUAL_BRIDGE_METHODS.sizeChanged:
66
- if (this.sent === null) {
67
- return;
68
- }
69
- if (!this.live) {
70
- this.live = true;
71
- this.options.onAppearance(this.sent.appearance);
72
- }
73
- this.options.onHeight(this.options.onViewportReady ? visualContentHeight(message.height) : clampVisualHeight(this.options.visual, message.height));
74
- return;
75
- case VISUAL_BRIDGE_METHODS.viewportReady:
76
- if (this.sent === null) {
77
- return;
78
- }
79
- this.viewportReady = true;
80
- this.options.onViewportReady?.();
81
- this.setViewport(this.viewport);
82
- return;
83
- case VISUAL_BRIDGE_METHODS.scrollRequest:
84
- if (this.sent !== null && this.viewportReady && this.viewport !== null) {
85
- this.options.onScroll?.(message.request);
86
- }
87
- return;
88
- case VISUAL_BRIDGE_METHODS.openLink:
89
- if (this.sent === null) {
90
- return;
91
- }
92
- if (this.options.mayOpenLink()) {
93
- this.options.openLink(message.url);
94
- }
95
- frame.postMessage(visualOpenLinkResult(message.id), '*');
96
- return;
97
- default:
98
- return;
69
+ if (!this.live) {
70
+ this.live = true;
71
+ this.options.onAppearance(this.sent.appearance);
99
72
  }
100
- }
101
- setViewport(viewport) {
102
- this.viewport = viewport;
103
- if (!this.disposed && this.sent !== null && this.viewportReady) {
104
- this.options.frame()?.postMessage(visualViewportMessage(viewport), '*');
73
+ this.options.onHeight(this.options.onViewportReady ? visualContentHeight(message.height) : clampVisualHeight(this.options.visual, message.height));
74
+ return;
75
+ case VISUAL_BRIDGE_METHODS.viewportReady:
76
+ if (this.sent === null) {
77
+ return;
105
78
  }
106
- }
107
- /* The app's theme changed; a page that was sent follows it at once, without loading again. */
108
- setTheme(theme) {
109
- this.theme = theme;
110
- const frame = this.options.frame();
111
- if (this.disposed || this.sent === null || frame === null) {
112
- return;
79
+ this.viewportReady = true;
80
+ this.options.onViewportReady?.();
81
+ this.setViewport(this.viewport);
82
+ return;
83
+ case VISUAL_BRIDGE_METHODS.scrollRequest:
84
+ if (this.sent !== null && this.viewportReady && this.viewport !== null) {
85
+ this.options.onScroll?.(message.request);
113
86
  }
114
- this.postTheme(frame);
115
- if (this.live) {
116
- this.options.onAppearance(theme.appearance);
87
+ return;
88
+ case VISUAL_BRIDGE_METHODS.openLink:
89
+ if (this.sent === null) {
90
+ return;
117
91
  }
118
- }
119
- /* The frame fired `load`. */
120
- loaded() {
121
- if (this.heard || this.disposed) {
122
- return;
92
+ if (this.options.mayOpenLink()) {
93
+ this.options.openLink(message.url);
123
94
  }
124
- this.cancelSilence();
125
- this.cancelSilence = (this.options.after ?? timeout)(SILENCE_MS, () => {
126
- if (!this.heard && !this.disposed) {
127
- this.options.onFailure();
128
- }
129
- });
95
+ frame.postMessage(visualOpenLinkResult(message.id), '*');
96
+ return;
97
+ default:
98
+ return;
130
99
  }
131
- dispose() {
132
- this.disposed = true;
133
- this.cancelSilence();
100
+ }
101
+ setViewport(viewport) {
102
+ this.viewport = viewport;
103
+ if (!this.disposed && this.sent !== null && this.viewportReady) {
104
+ this.options.frame()?.postMessage(visualViewportMessage(viewport), '*');
134
105
  }
135
- sendPage() {
136
- const frame = this.options.frame();
137
- if (this.disposed || !this.waiting || this.html === null || frame === null) {
138
- return;
139
- }
140
- this.waiting = false;
141
- // Any origin, since the frame's own is opaque; `receive` checks every answer's source instead.
142
- frame.postMessage(visualResourceReadyMessage(this.html), '*');
143
- // The page writes itself as that message arrives and listens before the next one, so a theme
144
- // that changed since the frame's address was set follows right after it.
145
- this.postTheme(frame);
106
+ }
107
+ /* The app's theme changed; a page that was sent follows it at once, without loading again. */
108
+ setTheme(theme) {
109
+ this.theme = theme;
110
+ const frame = this.options.frame();
111
+ if (this.disposed || this.sent === null || frame === null) {
112
+ return;
146
113
  }
147
- postTheme(frame) {
148
- this.sent = this.theme;
149
- frame.postMessage(visualHostContextMessage(this.theme), '*');
114
+ this.postTheme(frame);
115
+ if (this.live) {
116
+ this.options.onAppearance(theme.appearance);
150
117
  }
151
- }
118
+ }
119
+ /* The frame fired `load`. */
120
+ loaded() {
121
+ if (this.heard || this.disposed) {
122
+ return;
123
+ }
124
+ this.cancelSilence();
125
+ this.cancelSilence = (this.options.after ?? timeout)(SILENCE_MS, () => {
126
+ if (!this.heard && !this.disposed) {
127
+ this.options.onFailure();
128
+ }
129
+ });
130
+ }
131
+ dispose() {
132
+ this.disposed = true;
133
+ this.cancelSilence();
134
+ }
135
+ sendPage() {
136
+ const frame = this.options.frame();
137
+ if (this.disposed || !this.waiting || this.html === null || frame === null) {
138
+ return;
139
+ }
140
+ this.waiting = false;
141
+ // Any origin, since the frame's own is opaque; `receive` checks every answer's source instead.
142
+ frame.postMessage(visualResourceReadyMessage(this.html), '*');
143
+ // The page writes itself as that message arrives and listens before the next one, so a theme
144
+ // that changed since the frame's address was set follows right after it.
145
+ this.postTheme(frame);
146
+ }
147
+ postTheme(frame) {
148
+ this.sent = this.theme;
149
+ frame.postMessage(visualHostContextMessage(this.theme), '*');
150
+ }
151
+ }