@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,5 +1,5 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { useEffect, useLayoutEffect, useRef, useState } from 'react';
3
3
  import { useTranslation } from 'react-i18next';
4
4
  import clsx from 'clsx';
5
5
  import { visualThemeFragment } from '@adecore/agent-contracts/visual';
@@ -15,105 +15,331 @@ import { useVisualTheme } from './visual-theme.js';
15
15
  * click or a key in it is recent. A page can take the focus by script, so this stops a link opened as
16
16
  * the page loads, and not one opened while a person works in the frame.
17
17
  */
18
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
18
19
  function personActsIn(frame) {
19
- return frame.ownerDocument.activeElement === frame && navigator.userActivation?.isActive !== false;
20
+ return frame.ownerDocument.activeElement === frame && navigator.userActivation?.isActive !== false;
20
21
  }
21
22
  /*
22
23
  * One visual's page in a frame that loads the app's sandbox host page; the bridge hands it the page and
23
24
  * the theme. The frame never gets `allow-same-origin`, which keeps the page on an opaque origin even
24
25
  * when the host page is served on the app's own. Its box keeps one height while it loads or fails.
25
26
  */
26
- export function VisualFrame({ chatId, visual, fill = false, className }) {
27
- const { visuals, attachments } = useChatHost();
28
- const { t } = useTranslation('agent-chat');
29
- const scope = useChatScope();
30
- const frameUrl = visuals?.frameUrl ?? null;
31
- const boxRef = useRef(null);
32
- const frameRef = useRef(null);
33
- const bridgeRef = useRef(null);
34
- const viewportRef = useRef(null);
35
- const controllerRef = useRef(null);
36
- const [viewportReady, setViewportReady] = useState(false);
37
- const [measure, width] = useMeasuredWidth();
38
- const setBox = useCallback((node) => {
39
- boxRef.current = node;
40
- measure(node);
41
- }, [measure]);
42
- const theme = useVisualTheme(boxRef);
43
- const widthRef = useRef(width);
44
- const [reported, setReported] = useState(null);
45
- // The appearance the page is drawn in once it runs; until then the frame matches the sandbox host page, which declares none.
46
- const [drawn, setDrawn] = useState(null);
47
- const [failed, setFailed] = useState(false);
48
- // The frame keeps the address it opened with: a later theme goes over the bridge, since a new address would load the page again.
49
- const [opening, setOpening] = useState(null);
50
- if (opening === null && frameUrl !== null && theme !== null && width > 0) {
51
- setOpening({ src: frameUrl + visualThemeFragment(theme), theme });
52
- }
53
- const height = fill || width === 0 ? undefined : (reported ?? initialVisualContentHeight(visual, width));
54
- useLayoutEffect(() => {
55
- widthRef.current = width;
56
- }, [width]);
57
- useLayoutEffect(() => {
58
- const frame = frameRef.current;
59
- if (opening === null || frame === null) {
60
- return;
61
- }
62
- const bridge = new VisualBridge({
63
- frame: () => frame.contentWindow,
64
- visual: { maxHeight: visual.maxHeight },
65
- page: attachments.read(scope.id, chatId, visual.id).then((blob) => blob.text()),
66
- theme: opening.theme,
67
- mayOpenLink: () => personActsIn(frame),
68
- openLink: (url) => visuals?.openLink(url),
69
- onHeight: (next) => {
70
- if (fill) {
71
- return;
72
- }
73
- setReported(next);
74
- rememberVisualHeight(visual.id, widthRef.current, next);
75
- },
76
- ...(!fill
77
- ? {
78
- onViewportReady: () => setViewportReady(true),
79
- onScroll: (request) => controllerRef.current?.scroll(request)
80
- }
81
- : {}),
82
- onAppearance: setDrawn,
83
- onFailure: () => setFailed(true)
84
- });
85
- bridgeRef.current = bridge;
86
- const view = frame.ownerDocument.defaultView ?? window;
87
- const listen = (event) => bridge.receive(event);
88
- view.addEventListener('message', listen);
89
- return () => {
90
- view.removeEventListener('message', listen);
91
- bridge.dispose();
92
- bridgeRef.current = null;
93
- };
94
- }, [opening, scope.id, chatId, visual.id, visual.maxHeight, fill, visuals, attachments]);
95
- useLayoutEffect(() => {
96
- const box = boxRef.current;
97
- const viewport = viewportRef.current;
98
- const bridge = bridgeRef.current;
99
- const scroller = box?.closest('.chat-scroll');
100
- if (fill || !viewportReady || !box || !viewport || !bridge || !scroller) {
27
+ export function VisualFrame(t0) {
28
+ const $ = _c(65);
29
+ const {
30
+ chatId,
31
+ visual,
32
+ fill: t1,
33
+ className
34
+ } = t0;
35
+ const fill = t1 === undefined ? false : t1;
36
+ const {
37
+ visuals,
38
+ attachments
39
+ } = useChatHost();
40
+ const {
41
+ t
42
+ } = useTranslation("agent-chat");
43
+ const scope = useChatScope();
44
+ const frameUrl = visuals?.frameUrl ?? null;
45
+ const boxRef = useRef(null);
46
+ const frameRef = useRef(null);
47
+ const bridgeRef = useRef(null);
48
+ const viewportRef = useRef(null);
49
+ const controllerRef = useRef(null);
50
+ const [viewportReady, setViewportReady] = useState(false);
51
+ const [measure, width] = useMeasuredWidth();
52
+ let t2;
53
+ if ($[0] !== measure) {
54
+ t2 = node => {
55
+ boxRef.current = node;
56
+ measure(node);
57
+ };
58
+ $[0] = measure;
59
+ $[1] = t2;
60
+ } else {
61
+ t2 = $[1];
62
+ }
63
+ const setBox = t2;
64
+ const theme = useVisualTheme(boxRef);
65
+ const widthRef = useRef(width);
66
+ const [reported, setReported] = useState(null);
67
+ const [drawn, setDrawn] = useState(null);
68
+ const [failed, setFailed] = useState(false);
69
+ const [opening, setOpening] = useState(null);
70
+ if (opening === null && frameUrl !== null && theme !== null && width > 0) {
71
+ setOpening({
72
+ src: frameUrl + visualThemeFragment(theme),
73
+ theme
74
+ });
75
+ }
76
+ let t3;
77
+ if ($[2] !== fill || $[3] !== reported || $[4] !== visual || $[5] !== width) {
78
+ t3 = fill || width === 0 ? undefined : reported ?? initialVisualContentHeight(visual, width);
79
+ $[2] = fill;
80
+ $[3] = reported;
81
+ $[4] = visual;
82
+ $[5] = width;
83
+ $[6] = t3;
84
+ } else {
85
+ t3 = $[6];
86
+ }
87
+ const height = t3;
88
+ let t4;
89
+ let t5;
90
+ if ($[7] !== width) {
91
+ t4 = () => {
92
+ widthRef.current = width;
93
+ };
94
+ t5 = [width];
95
+ $[7] = width;
96
+ $[8] = t4;
97
+ $[9] = t5;
98
+ } else {
99
+ t4 = $[8];
100
+ t5 = $[9];
101
+ }
102
+ useLayoutEffect(t4, t5);
103
+ let t6;
104
+ let t7;
105
+ if ($[10] !== attachments || $[11] !== chatId || $[12] !== fill || $[13] !== opening || $[14] !== scope.id || $[15] !== visual.id || $[16] !== visual.maxHeight || $[17] !== visuals) {
106
+ t6 = () => {
107
+ const frame = frameRef.current;
108
+ if (opening === null || frame === null) {
109
+ return;
110
+ }
111
+ const bridge = new VisualBridge({
112
+ frame: () => frame.contentWindow,
113
+ visual: {
114
+ maxHeight: visual.maxHeight
115
+ },
116
+ page: attachments.read(scope.id, chatId, visual.id).then(_temp),
117
+ theme: opening.theme,
118
+ mayOpenLink: () => personActsIn(frame),
119
+ openLink: url => visuals?.openLink(url),
120
+ onHeight: next => {
121
+ if (fill) {
101
122
  return;
102
- }
103
- const controller = new VisualViewportController(box, viewport, scroller, bridge);
104
- controllerRef.current = controller;
105
- return () => {
106
- controller.dispose();
107
- controllerRef.current = null;
108
- };
109
- }, [fill, viewportReady, opening, scope.id, chatId, visual.id, visual.maxHeight]);
110
- useLayoutEffect(() => controllerRef.current?.refresh(), [height, width]);
111
- useEffect(() => {
112
- if (theme !== null) {
113
- bridgeRef.current?.setTheme(theme);
114
- }
115
- }, [theme]);
116
- return (_jsx("div", { ref: setBox, className: clsx(fill ? 'absolute inset-0' : 'relative w-full', className), style: { height }, children: _jsxs("div", { ref: viewportRef, className: fill ? 'absolute inset-0' : 'sticky top-0 w-full', style: fill ? undefined : { height: '100%' }, children: [opening !== null && (_jsx("iframe", { ref: frameRef, src: opening.src, title: visual.title, loading: "lazy", sandbox: "allow-scripts allow-forms", className: clsx('block size-full border-0', failed && 'invisible'),
117
- // A frame whose color scheme differs from its document's paints an opaque ground behind it.
118
- style: { colorScheme: drawn ?? 'normal' }, onLoad: () => bridgeRef.current?.loaded() })), failed ? (_jsx("p", { className: "absolute inset-0 grid place-items-center px-4 text-center text-xs text-text-muted", children: t('visuals.failed', { title: visual.title }) })) : (drawn === null && (_jsx("span", { className: "chat-visual-wait pointer-events-none absolute inset-0 grid place-items-center text-text-faint", children: _jsx(Spinner, { size: 16, label: t('visuals.loading', { title: visual.title }) }) })))] }) }));
123
+ }
124
+ setReported(next);
125
+ rememberVisualHeight(visual.id, widthRef.current, next);
126
+ },
127
+ ...(!fill ? {
128
+ onViewportReady: () => setViewportReady(true),
129
+ onScroll: request => controllerRef.current?.scroll(request)
130
+ } : {}),
131
+ onAppearance: setDrawn,
132
+ onFailure: () => setFailed(true)
133
+ });
134
+ bridgeRef.current = bridge;
135
+ const view = frame.ownerDocument.defaultView ?? window;
136
+ const listen = event => bridge.receive(event);
137
+ view.addEventListener("message", listen);
138
+ return () => {
139
+ view.removeEventListener("message", listen);
140
+ bridge.dispose();
141
+ bridgeRef.current = null;
142
+ };
143
+ };
144
+ t7 = [opening, scope.id, chatId, visual.id, visual.maxHeight, fill, visuals, attachments];
145
+ $[10] = attachments;
146
+ $[11] = chatId;
147
+ $[12] = fill;
148
+ $[13] = opening;
149
+ $[14] = scope.id;
150
+ $[15] = visual.id;
151
+ $[16] = visual.maxHeight;
152
+ $[17] = visuals;
153
+ $[18] = t6;
154
+ $[19] = t7;
155
+ } else {
156
+ t6 = $[18];
157
+ t7 = $[19];
158
+ }
159
+ useLayoutEffect(t6, t7);
160
+ let t8;
161
+ if ($[20] !== fill || $[21] !== viewportReady) {
162
+ t8 = () => {
163
+ const box = boxRef.current;
164
+ const viewport = viewportRef.current;
165
+ const bridge_0 = bridgeRef.current;
166
+ const scroller = box?.closest(".chat-scroll");
167
+ if (fill || !viewportReady || !box || !viewport || !bridge_0 || !scroller) {
168
+ return;
169
+ }
170
+ const controller = new VisualViewportController(box, viewport, scroller, bridge_0);
171
+ controllerRef.current = controller;
172
+ return () => {
173
+ controller.dispose();
174
+ controllerRef.current = null;
175
+ };
176
+ };
177
+ $[20] = fill;
178
+ $[21] = viewportReady;
179
+ $[22] = t8;
180
+ } else {
181
+ t8 = $[22];
182
+ }
183
+ let t9;
184
+ if ($[23] !== chatId || $[24] !== fill || $[25] !== opening || $[26] !== scope.id || $[27] !== viewportReady || $[28] !== visual.id || $[29] !== visual.maxHeight) {
185
+ t9 = [fill, viewportReady, opening, scope.id, chatId, visual.id, visual.maxHeight];
186
+ $[23] = chatId;
187
+ $[24] = fill;
188
+ $[25] = opening;
189
+ $[26] = scope.id;
190
+ $[27] = viewportReady;
191
+ $[28] = visual.id;
192
+ $[29] = visual.maxHeight;
193
+ $[30] = t9;
194
+ } else {
195
+ t9 = $[30];
196
+ }
197
+ useLayoutEffect(t8, t9);
198
+ let t10;
199
+ if ($[31] === Symbol.for("react.memo_cache_sentinel")) {
200
+ t10 = () => controllerRef.current?.refresh();
201
+ $[31] = t10;
202
+ } else {
203
+ t10 = $[31];
204
+ }
205
+ let t11;
206
+ if ($[32] !== height || $[33] !== width) {
207
+ t11 = [height, width];
208
+ $[32] = height;
209
+ $[33] = width;
210
+ $[34] = t11;
211
+ } else {
212
+ t11 = $[34];
213
+ }
214
+ useLayoutEffect(t10, t11);
215
+ let t12;
216
+ let t13;
217
+ if ($[35] !== theme) {
218
+ t12 = () => {
219
+ if (theme !== null) {
220
+ bridgeRef.current?.setTheme(theme);
221
+ }
222
+ };
223
+ t13 = [theme];
224
+ $[35] = theme;
225
+ $[36] = t12;
226
+ $[37] = t13;
227
+ } else {
228
+ t12 = $[36];
229
+ t13 = $[37];
230
+ }
231
+ useEffect(t12, t13);
232
+ const t14 = fill ? "absolute inset-0" : "relative w-full";
233
+ let t15;
234
+ if ($[38] !== className || $[39] !== t14) {
235
+ t15 = clsx(t14, className);
236
+ $[38] = className;
237
+ $[39] = t14;
238
+ $[40] = t15;
239
+ } else {
240
+ t15 = $[40];
241
+ }
242
+ let t16;
243
+ if ($[41] !== height) {
244
+ t16 = {
245
+ height
246
+ };
247
+ $[41] = height;
248
+ $[42] = t16;
249
+ } else {
250
+ t16 = $[42];
251
+ }
252
+ const t17 = fill ? "absolute inset-0" : "sticky top-0 w-full";
253
+ let t18;
254
+ if ($[43] !== fill) {
255
+ t18 = fill ? undefined : {
256
+ height: "100%"
257
+ };
258
+ $[43] = fill;
259
+ $[44] = t18;
260
+ } else {
261
+ t18 = $[44];
262
+ }
263
+ let t19;
264
+ if ($[45] !== drawn || $[46] !== failed || $[47] !== opening || $[48] !== visual.title) {
265
+ t19 = opening !== null && /*#__PURE__*/_jsx("iframe", {
266
+ ref: frameRef,
267
+ src: opening.src,
268
+ title: visual.title,
269
+ loading: "lazy",
270
+ sandbox: "allow-scripts allow-forms",
271
+ className: clsx("block size-full border-0", failed && "invisible"),
272
+ style: {
273
+ colorScheme: drawn ?? "normal"
274
+ },
275
+ onLoad: () => bridgeRef.current?.loaded()
276
+ });
277
+ $[45] = drawn;
278
+ $[46] = failed;
279
+ $[47] = opening;
280
+ $[48] = visual.title;
281
+ $[49] = t19;
282
+ } else {
283
+ t19 = $[49];
284
+ }
285
+ let t20;
286
+ if ($[50] !== drawn || $[51] !== failed || $[52] !== t || $[53] !== visual.title) {
287
+ t20 = failed ? /*#__PURE__*/_jsx("p", {
288
+ className: "absolute inset-0 grid place-items-center px-4 text-center text-xs text-text-muted",
289
+ children: t("visuals.failed", {
290
+ title: visual.title
291
+ })
292
+ }) : drawn === null && /*#__PURE__*/_jsx("span", {
293
+ className: "chat-visual-wait pointer-events-none absolute inset-0 grid place-items-center text-text-faint",
294
+ children: /*#__PURE__*/_jsx(Spinner, {
295
+ size: 16,
296
+ label: t("visuals.loading", {
297
+ title: visual.title
298
+ })
299
+ })
300
+ });
301
+ $[50] = drawn;
302
+ $[51] = failed;
303
+ $[52] = t;
304
+ $[53] = visual.title;
305
+ $[54] = t20;
306
+ } else {
307
+ t20 = $[54];
308
+ }
309
+ let t21;
310
+ if ($[55] !== t17 || $[56] !== t18 || $[57] !== t19 || $[58] !== t20) {
311
+ t21 = /*#__PURE__*/_jsxs("div", {
312
+ ref: viewportRef,
313
+ className: t17,
314
+ style: t18,
315
+ children: [t19, t20]
316
+ });
317
+ $[55] = t17;
318
+ $[56] = t18;
319
+ $[57] = t19;
320
+ $[58] = t20;
321
+ $[59] = t21;
322
+ } else {
323
+ t21 = $[59];
324
+ }
325
+ let t22;
326
+ if ($[60] !== setBox || $[61] !== t15 || $[62] !== t16 || $[63] !== t21) {
327
+ t22 = /*#__PURE__*/_jsx("div", {
328
+ ref: setBox,
329
+ className: t15,
330
+ style: t16,
331
+ children: t21
332
+ });
333
+ $[60] = setBox;
334
+ $[61] = t15;
335
+ $[62] = t16;
336
+ $[63] = t21;
337
+ $[64] = t22;
338
+ } else {
339
+ t22 = $[64];
340
+ }
341
+ return t22;
119
342
  }
343
+ function _temp(blob) {
344
+ return blob.text();
345
+ }
@@ -1,16 +1,81 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { c as _c } from "react/compiler-runtime";
2
2
  import { useState } from 'react';
3
3
  import { useTranslation } from 'react-i18next';
4
4
  import { AgentIcon } from '../../agents/AgentIcon.js';
5
5
  import { useChatRow } from '../../state/chats.js';
6
6
  import { dayPartOf } from '../logic/welcome.js';
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
8
  function localClock() {
8
- return new Date();
9
+ return new Date();
9
10
  }
10
11
  /* What stands over the composer of a chat nobody wrote in yet. The part of the day is read once, when the chat opens. */
11
- export function WelcomeGreeting({ chatId, now = localClock }) {
12
- const { t } = useTranslation('agent-chat');
13
- const provider = useChatRow(chatId, (row) => row?.info.provider ?? null);
14
- const [part] = useState(() => dayPartOf(now()));
15
- return (_jsxs("div", { className: "flex items-center justify-center gap-3 px-3 pb-2 text-text", children: [provider && _jsx(AgentIcon, { kind: provider, size: 32, className: "shrink-0" }), _jsx("h2", { className: "text-4xl font-semibold tracking-tight text-balance", children: t(`timeline.welcome.${part}`) })] }));
12
+ export function WelcomeGreeting(t0) {
13
+ const $ = _c(12);
14
+ const {
15
+ chatId,
16
+ now: t1
17
+ } = t0;
18
+ const now = t1 === undefined ? localClock : t1;
19
+ const {
20
+ t
21
+ } = useTranslation("agent-chat");
22
+ const provider = useChatRow(chatId, _temp);
23
+ let t2;
24
+ if ($[0] !== now) {
25
+ t2 = () => dayPartOf(now());
26
+ $[0] = now;
27
+ $[1] = t2;
28
+ } else {
29
+ t2 = $[1];
30
+ }
31
+ const [part] = useState(t2);
32
+ let t3;
33
+ if ($[2] !== provider) {
34
+ t3 = provider && /*#__PURE__*/_jsx(AgentIcon, {
35
+ kind: provider,
36
+ size: 32,
37
+ className: "shrink-0"
38
+ });
39
+ $[2] = provider;
40
+ $[3] = t3;
41
+ } else {
42
+ t3 = $[3];
43
+ }
44
+ const t4 = `timeline.welcome.${part}`;
45
+ let t5;
46
+ if ($[4] !== t || $[5] !== t4) {
47
+ t5 = t(t4);
48
+ $[4] = t;
49
+ $[5] = t4;
50
+ $[6] = t5;
51
+ } else {
52
+ t5 = $[6];
53
+ }
54
+ let t6;
55
+ if ($[7] !== t5) {
56
+ t6 = /*#__PURE__*/_jsx("h2", {
57
+ className: "text-4xl font-semibold tracking-tight text-balance",
58
+ children: t5
59
+ });
60
+ $[7] = t5;
61
+ $[8] = t6;
62
+ } else {
63
+ t6 = $[8];
64
+ }
65
+ let t7;
66
+ if ($[9] !== t3 || $[10] !== t6) {
67
+ t7 = /*#__PURE__*/_jsxs("div", {
68
+ className: "flex items-center justify-center gap-3 px-3 pb-2 text-text",
69
+ children: [t3, t6]
70
+ });
71
+ $[9] = t3;
72
+ $[10] = t6;
73
+ $[11] = t7;
74
+ } else {
75
+ t7 = $[11];
76
+ }
77
+ return t7;
16
78
  }
79
+ function _temp(row) {
80
+ return row?.info.provider ?? null;
81
+ }
@@ -8,4 +8,4 @@ export const SKILL_TONE = 'bg-skill-soft text-skill shadow-[inset_0_0_0_1px_colo
8
8
  export const CHIP_IN_EDITOR = 'box-decoration-clone rounded-md px-1 py-0.5';
9
9
  /* The same pill in the transcript: a real inline box a shade smaller than the text around it, with
10
10
  the icon in place of the sigil. */
11
- export const CHIP_IN_MESSAGE = 'inline-flex h-5 max-w-full items-center gap-1 rounded-md px-1.5 align-[-3px] text-xs/none font-medium';
11
+ export const CHIP_IN_MESSAGE = 'inline-flex h-5 max-w-full items-center gap-1 rounded-md px-1.5 align-[-3px] text-xs/none font-medium';
@@ -5,42 +5,42 @@
5
5
  * tokenized again, since the next delta may turn it into anything (the start of a comment, a string).
6
6
  */
7
7
  export class IncrementalLines {
8
- tokenize;
9
- // The text of the lines that are kept: empty, or ending in a newline while the block grows.
10
- source = '';
11
- lines = [];
12
- state = undefined;
13
- constructor(tokenize) {
14
- this.tokenize = tokenize;
8
+ tokenize;
9
+ // The text of the lines that are kept: empty, or ending in a newline while the block grows.
10
+ source = '';
11
+ lines = [];
12
+ state = undefined;
13
+ constructor(tokenize) {
14
+ this.tokenize = tokenize;
15
+ }
16
+ /* The tokens of every line of `code`; `complete` says nothing more arrives, so the last line is kept too. */
17
+ update(code, complete) {
18
+ // A carriage return splits lines in ways a cut at newlines does not see, so that code starts over every time.
19
+ if (code.includes('\r')) {
20
+ this.reset();
21
+ return this.tokenize(code, undefined).lines;
15
22
  }
16
- /* The tokens of every line of `code`; `complete` says nothing more arrives, so the last line is kept too. */
17
- update(code, complete) {
18
- // A carriage return splits lines in ways a cut at newlines does not see, so that code starts over every time.
19
- if (code.includes('\r')) {
20
- this.reset();
21
- return this.tokenize(code, undefined).lines;
22
- }
23
- const end = complete ? code.length : code.lastIndexOf('\n') + 1;
24
- const stable = code.slice(0, end);
25
- const continues = (this.source === '' || this.source.endsWith('\n')) && stable.startsWith(this.source);
26
- if (!continues) {
27
- this.reset();
28
- }
29
- const added = stable.slice(this.source.length);
30
- if (added !== '') {
31
- const result = this.tokenize(added.endsWith('\n') ? added.slice(0, -1) : added, this.state);
32
- this.lines = [...this.lines, ...result.lines];
33
- this.state = result.state;
34
- this.source = stable;
35
- }
36
- if (complete) {
37
- return this.lines;
38
- }
39
- return [...this.lines, ...this.tokenize(code.slice(end), this.state).lines];
23
+ const end = complete ? code.length : code.lastIndexOf('\n') + 1;
24
+ const stable = code.slice(0, end);
25
+ const continues = (this.source === '' || this.source.endsWith('\n')) && stable.startsWith(this.source);
26
+ if (!continues) {
27
+ this.reset();
40
28
  }
41
- reset() {
42
- this.source = '';
43
- this.lines = [];
44
- this.state = undefined;
29
+ const added = stable.slice(this.source.length);
30
+ if (added !== '') {
31
+ const result = this.tokenize(added.endsWith('\n') ? added.slice(0, -1) : added, this.state);
32
+ this.lines = [...this.lines, ...result.lines];
33
+ this.state = result.state;
34
+ this.source = stable;
45
35
  }
46
- }
36
+ if (complete) {
37
+ return this.lines;
38
+ }
39
+ return [...this.lines, ...this.tokenize(code.slice(end), this.state).lines];
40
+ }
41
+ reset() {
42
+ this.source = '';
43
+ this.lines = [];
44
+ this.state = undefined;
45
+ }
46
+ }
@@ -1,3 +1,3 @@
1
1
  import { createContext } from 'react';
2
2
  /* Whether the code blocks below are still being written, which a reply says for the fence that has not closed. */
3
- export const CodeStreamingContext = createContext(false);
3
+ export const CodeStreamingContext = createContext(false);
@@ -1,12 +1,12 @@
1
- import { useChatHost } from '../../host.js';
1
+ import '../../host.js';
2
+ import { useHostCodeMode, useHostCodeThemes } from '../../host-hooks.js';
2
3
  /* The Shiki theme code is drawn in under the app's current light or dark. */
3
4
  export function useCodeTheme() {
4
- const { code } = useChatHost();
5
- const mode = code.useMode();
6
- const themes = code.useThemes();
7
- return mode === 'dark' ? themes.dark : themes.light;
5
+ const mode = useHostCodeMode();
6
+ const themes = useHostCodeThemes();
7
+ return mode === "dark" ? themes.dark : themes.light;
8
8
  }
9
9
  /* What to hand Shiki for a theme id: a theme the app ships itself, or the id of a bundled one for Shiki to load. */
10
10
  export function shikiThemeOf(id, custom) {
11
- return custom.find((theme) => theme.name === id) ?? id;
12
- }
11
+ return custom.find(theme => theme.name === id) ?? id;
12
+ }