@adecore/agents-react 0.31.12 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/dist/agents/AccountDot.js +57 -6
  2. package/dist/agents/AgentIcon.js +88 -12
  3. package/dist/agents/ModelOptionControl.js +153 -18
  4. package/dist/agents/ProviderLogo.js +49 -4
  5. package/dist/agents/account-limits.js +17 -14
  6. package/dist/agents/accounts.js +99 -67
  7. package/dist/agents/agent-marks.js +5 -3
  8. package/dist/agents/model-name.js +42 -31
  9. package/dist/agents/model-options.js +8 -8
  10. package/dist/agents/model-requirement.js +17 -14
  11. package/dist/agents/option-words.d.ts +7 -0
  12. package/dist/agents/option-words.js +35 -0
  13. package/dist/agents/provider-paths.js +6 -6
  14. package/dist/agents/status-look.js +32 -12
  15. package/dist/chat/account-choice.d.ts +13 -0
  16. package/dist/chat/account-choice.js +90 -20
  17. package/dist/chat/actions.js +126 -59
  18. package/dist/chat/activity.js +5 -5
  19. package/dist/chat/attachments.js +74 -53
  20. package/dist/chat/bookmarks.js +58 -48
  21. package/dist/chat/chat-client.js +344 -263
  22. package/dist/chat/chat-references.js +3 -3
  23. package/dist/chat/composer-effort.d.ts +5 -0
  24. package/dist/chat/composer-effort.js +26 -0
  25. package/dist/chat/composer-send.js +13 -13
  26. package/dist/chat/drafts.js +115 -79
  27. package/dist/chat/forks.js +81 -24
  28. package/dist/chat/guards.js +15 -43
  29. package/dist/chat/index.d.ts +3 -1
  30. package/dist/chat/index.js +3 -2
  31. package/dist/chat/logic/ansi.js +170 -167
  32. package/dist/chat/logic/answers.js +2 -2
  33. package/dist/chat/logic/bookmarks.js +19 -19
  34. package/dist/chat/logic/command-looks.js +138 -96
  35. package/dist/chat/logic/context-usage.js +13 -9
  36. package/dist/chat/logic/continue-after-stop.js +15 -19
  37. package/dist/chat/logic/effort.d.ts +14 -0
  38. package/dist/chat/logic/effort.js +34 -0
  39. package/dist/chat/logic/embedded-code.js +387 -326
  40. package/dist/chat/logic/fork.js +134 -110
  41. package/dist/chat/logic/generated-image.js +54 -23
  42. package/dist/chat/logic/goal.js +28 -20
  43. package/dist/chat/logic/handback.js +6 -6
  44. package/dist/chat/logic/json.js +2 -2
  45. package/dist/chat/logic/limit.js +46 -30
  46. package/dist/chat/logic/picker-entries.d.ts +5 -3
  47. package/dist/chat/logic/picker-entries.js +83 -43
  48. package/dist/chat/logic/resume-compaction.d.ts +14 -1
  49. package/dist/chat/logic/resume-compaction.js +93 -24
  50. package/dist/chat/logic/scrubber.js +188 -136
  51. package/dist/chat/logic/thought.js +13 -16
  52. package/dist/chat/logic/thread-cards.js +60 -48
  53. package/dist/chat/logic/timeline-copy.js +30 -38
  54. package/dist/chat/logic/timeline-target.js +92 -63
  55. package/dist/chat/logic/timeline.js +499 -355
  56. package/dist/chat/logic/tool-catalog.js +54 -34
  57. package/dist/chat/logic/tools.js +106 -82
  58. package/dist/chat/logic/visual-height.js +18 -18
  59. package/dist/chat/logic/visual-viewport.js +6 -3
  60. package/dist/chat/logic/welcome.js +9 -9
  61. package/dist/chat/logic/workflow.js +45 -34
  62. package/dist/chat/mentions.js +149 -109
  63. package/dist/chat/persisted-json.js +51 -54
  64. package/dist/chat/preferences.d.ts +4 -0
  65. package/dist/chat/preferences.js +162 -84
  66. package/dist/chat/prompt-hold.js +9 -9
  67. package/dist/chat/quote.js +21 -30
  68. package/dist/chat/reading-width.js +12 -10
  69. package/dist/chat/recent-messages.js +34 -21
  70. package/dist/chat/resume-compaction-dismissals.js +25 -5
  71. package/dist/chat/runtime-modes.js +3 -3
  72. package/dist/chat/send-key.js +11 -7
  73. package/dist/chat/stash.js +89 -69
  74. package/dist/chat/subagent-conversation.js +181 -139
  75. package/dist/chat/subagent-list.js +65 -67
  76. package/dist/chat/subagent-support.js +12 -7
  77. package/dist/chat/subagent-view.js +132 -44
  78. package/dist/chat/thumbnails.js +88 -60
  79. package/dist/chat/timeline-flash.js +24 -12
  80. package/dist/chat/timeline-scroll.js +116 -86
  81. package/dist/chat/ui/AccountPill.js +126 -15
  82. package/dist/chat/ui/AnsiOutput.js +62 -6
  83. package/dist/chat/ui/BookmarkMarker.js +231 -41
  84. package/dist/chat/ui/BookmarkSubmenu.js +165 -18
  85. package/dist/chat/ui/ChatActivity.js +649 -70
  86. package/dist/chat/ui/ChatReferenceChip.js +104 -9
  87. package/dist/chat/ui/CodeBlock.js +132 -58
  88. package/dist/chat/ui/Composer.js +866 -132
  89. package/dist/chat/ui/ComposerInput.js +309 -120
  90. package/dist/chat/ui/DiffPool.js +75 -14
  91. package/dist/chat/ui/EditDiff.js +160 -21
  92. package/dist/chat/ui/FadingWords.js +32 -3
  93. package/dist/chat/ui/GoalDock.js +235 -42
  94. package/dist/chat/ui/ImageView.js +617 -61
  95. package/dist/chat/ui/LimitState.js +446 -72
  96. package/dist/chat/ui/Markdown.js +991 -173
  97. package/dist/chat/ui/MermaidBlock.js +238 -68
  98. package/dist/chat/ui/MessageActions.js +251 -39
  99. package/dist/chat/ui/ModelMarks.js +55 -5
  100. package/dist/chat/ui/Pickers.js +664 -113
  101. package/dist/chat/ui/PromptComposer.js +281 -51
  102. package/dist/chat/ui/QuoteButton.js +151 -57
  103. package/dist/chat/ui/ResumeCompactionDock.d.ts +6 -2
  104. package/dist/chat/ui/ResumeCompactionDock.js +141 -6
  105. package/dist/chat/ui/RowTime.js +59 -5
  106. package/dist/chat/ui/RunSettings.js +1744 -154
  107. package/dist/chat/ui/Scrubber.js +517 -88
  108. package/dist/chat/ui/ShellCommand.js +183 -107
  109. package/dist/chat/ui/SubagentControls.js +212 -24
  110. package/dist/chat/ui/SubagentInfo.js +170 -13
  111. package/dist/chat/ui/SubagentStopButton.js +115 -24
  112. package/dist/chat/ui/SubagentTimeline.js +357 -91
  113. package/dist/chat/ui/Timeline.js +988 -476
  114. package/dist/chat/ui/TimelineMenu.js +552 -37
  115. package/dist/chat/ui/UnifiedDiff.js +234 -27
  116. package/dist/chat/ui/UploadThumb.js +37 -7
  117. package/dist/chat/ui/VisualDialogs.js +251 -20
  118. package/dist/chat/ui/VisualFrame.js +321 -95
  119. package/dist/chat/ui/Welcome.js +72 -7
  120. package/dist/chat/ui/chips.js +1 -1
  121. package/dist/chat/ui/code-lines.js +36 -36
  122. package/dist/chat/ui/code-streaming.js +1 -1
  123. package/dist/chat/ui/code-theme.js +7 -7
  124. package/dist/chat/ui/composer/ComposerControls.js +329 -21
  125. package/dist/chat/ui/composer/ComposerMenu.js +358 -30
  126. package/dist/chat/ui/composer/DraftParts.js +185 -11
  127. package/dist/chat/ui/composer/QueuedMessages.js +138 -13
  128. package/dist/chat/ui/composer/chips.js +29 -19
  129. package/dist/chat/ui/composer/editor.js +79 -63
  130. package/dist/chat/ui/composer/insert.js +26 -12
  131. package/dist/chat/ui/composer/key-handler.js +180 -127
  132. package/dist/chat/ui/composer/keys.js +90 -73
  133. package/dist/chat/ui/composer/menu-aria.js +18 -9
  134. package/dist/chat/ui/composer/placeholder.js +78 -31
  135. package/dist/chat/ui/composer/surface.js +13 -37
  136. package/dist/chat/ui/composer/use-chat-controls.js +230 -90
  137. package/dist/chat/ui/composer/use-compaction-offer.js +50 -18
  138. package/dist/chat/ui/composer/use-composer-draft.js +65 -34
  139. package/dist/chat/ui/composer/use-composer-menus.js +478 -193
  140. package/dist/chat/ui/composer/use-composer-submit.js +251 -109
  141. package/dist/chat/ui/composer/use-continuable-turn.js +33 -6
  142. package/dist/chat/ui/composer/use-draft-files.js +245 -93
  143. package/dist/chat/ui/composer/use-effort-stepper.d.ts +13 -0
  144. package/dist/chat/ui/composer/use-effort-stepper.js +88 -0
  145. package/dist/chat/ui/composer/use-notice.js +61 -16
  146. package/dist/chat/ui/composer/use-pending-requests.js +38 -17
  147. package/dist/chat/ui/composer/use-prompt-history.js +117 -45
  148. package/dist/chat/ui/composer/use-prompt-hold.js +119 -35
  149. package/dist/chat/ui/composer/use-take-back.js +94 -72
  150. package/dist/chat/ui/diff/ApprovalReview.js +101 -23
  151. package/dist/chat/ui/diff/DiffFallbackBoundary.js +21 -13
  152. package/dist/chat/ui/diff/DiffOmitted.js +56 -6
  153. package/dist/chat/ui/diff/DiffStack.js +92 -8
  154. package/dist/chat/ui/diff/DiffUnavailable.js +56 -6
  155. package/dist/chat/ui/diff/EditorEditDiff.js +263 -51
  156. package/dist/chat/ui/diff/EditorPatchDiff.js +39 -14
  157. package/dist/chat/ui/diff/LegacyDiffPool.js +27 -10
  158. package/dist/chat/ui/diff/LegacyEditDiff.js +97 -20
  159. package/dist/chat/ui/diff/LegacyUnifiedDiff.js +172 -42
  160. package/dist/chat/ui/diff/RawDiff.js +65 -5
  161. package/dist/chat/ui/diff/ReviewDiff.js +77 -5
  162. package/dist/chat/ui/diff/diff-props.js +1 -1
  163. package/dist/chat/ui/diff/diff-source-budget.js +46 -35
  164. package/dist/chat/ui/diff/editor-edit-model.js +18 -14
  165. package/dist/chat/ui/diff/review-plan.js +63 -40
  166. package/dist/chat/ui/diff/review-settle.js +24 -9
  167. package/dist/chat/ui/diff/syntax-runtime.js +236 -201
  168. package/dist/chat/ui/diff/use-review-stack.js +146 -25
  169. package/dist/chat/ui/diff-syntax.js +70 -58
  170. package/dist/chat/ui/diff-theme.js +31 -12
  171. package/dist/chat/ui/file-links.js +39 -10
  172. package/dist/chat/ui/find-reveal.js +29 -8
  173. package/dist/chat/ui/full-diff.js +17 -12
  174. package/dist/chat/ui/highlighter.js +143 -113
  175. package/dist/chat/ui/icons.js +16 -7
  176. package/dist/chat/ui/index.js +1 -1
  177. package/dist/chat/ui/intelligent-ui/UiBlockFrame.js +556 -82
  178. package/dist/chat/ui/intelligent-ui/UiFallbackPart.js +73 -5
  179. package/dist/chat/ui/intelligent-ui/UiReply.js +666 -262
  180. package/dist/chat/ui/intelligent-ui/block-local.js +59 -31
  181. package/dist/chat/ui/intelligent-ui/chart-data.js +77 -67
  182. package/dist/chat/ui/intelligent-ui/node-text.js +77 -91
  183. package/dist/chat/ui/intelligent-ui/registry.js +46 -46
  184. package/dist/chat/ui/intelligent-ui/render-context.js +1 -1
  185. package/dist/chat/ui/intelligent-ui/renderers/base-land.js +1 -1
  186. package/dist/chat/ui/intelligent-ui/renderers/binding.js +3 -3
  187. package/dist/chat/ui/intelligent-ui/renderers/chart.js +1223 -123
  188. package/dist/chat/ui/intelligent-ui/renderers/choices.js +312 -34
  189. package/dist/chat/ui/intelligent-ui/renderers/content.js +1241 -86
  190. package/dist/chat/ui/intelligent-ui/renderers/data.js +619 -54
  191. package/dist/chat/ui/intelligent-ui/renderers/inputs.js +868 -67
  192. package/dist/chat/ui/intelligent-ui/renderers/links.js +366 -62
  193. package/dist/chat/ui/intelligent-ui/renderers/map-slots.js +118 -60
  194. package/dist/chat/ui/intelligent-ui/renderers/map-style.js +85 -78
  195. package/dist/chat/ui/intelligent-ui/renderers/map-view.js +282 -217
  196. package/dist/chat/ui/intelligent-ui/renderers/map.js +621 -69
  197. package/dist/chat/ui/intelligent-ui/renderers/place-point.js +15 -8
  198. package/dist/chat/ui/intelligent-ui/renderers/structure.js +262 -20
  199. package/dist/chat/ui/intelligent-ui/renderers/text.js +674 -49
  200. package/dist/chat/ui/intelligent-ui/reply-parts.js +24 -15
  201. package/dist/chat/ui/intelligent-ui/table-data.js +97 -57
  202. package/dist/chat/ui/intelligent-ui/tones.js +31 -31
  203. package/dist/chat/ui/intelligent-ui/use-in-view.js +30 -12
  204. package/dist/chat/ui/intelligent-ui/use-later.js +28 -13
  205. package/dist/chat/ui/intelligent-ui/use-truncated.js +45 -21
  206. package/dist/chat/ui/intelligent-ui/use-ui-links.js +296 -109
  207. package/dist/chat/ui/intelligent-ui/use-ui-queries.js +256 -246
  208. package/dist/chat/ui/markdown-blocks.js +296 -262
  209. package/dist/chat/ui/mermaid.js +60 -72
  210. package/dist/chat/ui/quote-selection.js +32 -29
  211. package/dist/chat/ui/rehype-chips.js +35 -23
  212. package/dist/chat/ui/rehype-fade.js +28 -17
  213. package/dist/chat/ui/remark-html-as-text.js +22 -15
  214. package/dist/chat/ui/reply-context.js +1 -1
  215. package/dist/chat/ui/reveal.js +161 -72
  216. package/dist/chat/ui/rows/ForksRow.js +226 -24
  217. package/dist/chat/ui/rows/GeneratedImageRow.js +541 -87
  218. package/dist/chat/ui/rows/MessageRows.js +1706 -159
  219. package/dist/chat/ui/rows/RowContainer.js +57 -7
  220. package/dist/chat/ui/rows/Rows.js +463 -54
  221. package/dist/chat/ui/rows/SubagentRow.js +577 -60
  222. package/dist/chat/ui/rows/TaskRow.js +359 -40
  223. package/dist/chat/ui/rows/VisualRow.js +233 -11
  224. package/dist/chat/ui/rows/WorkRows.js +1945 -164
  225. package/dist/chat/ui/rows/WorkflowRow.js +293 -34
  226. package/dist/chat/ui/rows/row-rhythm.js +27 -17
  227. package/dist/chat/ui/theme-watch.js +26 -23
  228. package/dist/chat/ui/timestamp-format.js +4 -1
  229. package/dist/chat/ui/use-diff-source-tokens.js +70 -34
  230. package/dist/chat/ui/useToggleSet.js +51 -19
  231. package/dist/chat/ui/visual-theme.js +153 -128
  232. package/dist/chat/visual-bridge.js +123 -123
  233. package/dist/chat/visual-viewport.js +94 -83
  234. package/dist/chat/visuals.js +13 -5
  235. package/dist/host-hooks.d.ts +29 -0
  236. package/dist/host-hooks.js +78 -0
  237. package/dist/host.js +120 -48
  238. package/dist/index.js +1 -1
  239. package/dist/lazy.js +38 -32
  240. package/dist/locales/en/agent-chat.d.ts +34 -0
  241. package/dist/locales/en/agent-chat.js +747 -713
  242. package/dist/locales/en/agent-prompts.js +42 -42
  243. package/dist/locales/en/agent-providers.d.ts +1 -0
  244. package/dist/locales/en/agent-providers.js +166 -165
  245. package/dist/locales/en/agent-usage.d.ts +6 -0
  246. package/dist/locales/en/agent-usage.js +129 -123
  247. package/dist/locales/nl/agent-chat.d.ts +34 -0
  248. package/dist/locales/nl/agent-chat.js +747 -713
  249. package/dist/locales/nl/agent-prompts.js +42 -42
  250. package/dist/locales/nl/agent-providers.d.ts +1 -0
  251. package/dist/locales/nl/agent-providers.js +166 -165
  252. package/dist/locales/nl/agent-usage.d.ts +6 -0
  253. package/dist/locales/nl/agent-usage.js +129 -123
  254. package/dist/locales.js +14 -14
  255. package/dist/mounted-registry.js +31 -30
  256. package/dist/port-transport.js +122 -111
  257. package/dist/prompts/index.js +1 -1
  258. package/dist/prompts/logic/focus.js +15 -14
  259. package/dist/prompts/logic/keys.js +93 -59
  260. package/dist/prompts/logic/prompts.js +27 -14
  261. package/dist/prompts/logic/subjects.js +60 -46
  262. package/dist/prompts/logic/useFocusAfterAnswer.js +60 -20
  263. package/dist/prompts/logic/usePromptSession.js +88 -77
  264. package/dist/prompts/ui/ApprovalBody.js +246 -27
  265. package/dist/prompts/ui/PromptActions.js +215 -9
  266. package/dist/prompts/ui/PromptCard.js +215 -36
  267. package/dist/prompts/ui/PromptView.js +372 -34
  268. package/dist/prompts/ui/QuestionBody.js +269 -73
  269. package/dist/providers/AccountColors.js +36 -5
  270. package/dist/providers/AccountDetail.js +683 -50
  271. package/dist/providers/AccountVariables.js +139 -32
  272. package/dist/providers/AddAccountForm.js +125 -38
  273. package/dist/providers/CliDetail.js +343 -36
  274. package/dist/providers/InstallPage.js +644 -59
  275. package/dist/providers/ProviderList.d.ts +2 -1
  276. package/dist/providers/ProviderList.js +215 -23
  277. package/dist/providers/ProvidersPane.d.ts +4 -2
  278. package/dist/providers/ProvidersPane.js +244 -64
  279. package/dist/providers/account-actions.js +54 -30
  280. package/dist/providers/index.js +1 -1
  281. package/dist/providers/install-steps.js +12 -9
  282. package/dist/providers/pane-target.d.ts +3 -0
  283. package/dist/providers/pane-target.js +34 -13
  284. package/dist/providers/parts.js +62 -12
  285. package/dist/providers/provider-abilities.js +5 -5
  286. package/dist/providers/provider-groups.js +75 -40
  287. package/dist/providers/variables.js +73 -39
  288. package/dist/scope.js +6 -6
  289. package/dist/settings/sections.js +18 -18
  290. package/dist/state/chats.js +404 -192
  291. package/dist/state/index.js +1 -1
  292. package/dist/state/provider-accounts.js +70 -47
  293. package/dist/state/providers.js +45 -16
  294. package/dist/state/usage.js +154 -77
  295. package/dist/storage.js +69 -68
  296. package/dist/testing/index.js +1 -1
  297. package/dist/testing/prompts.js +105 -67
  298. package/dist/transport.js +10 -10
  299. package/dist/ui/PlainTextarea.js +27 -3
  300. package/dist/usage/LimitsList.js +646 -40
  301. package/dist/usage/UsageBreakdown.js +879 -38
  302. package/dist/usage/UsageChart.js +311 -32
  303. package/dist/usage/UsageDialog.js +46 -4
  304. package/dist/usage/UsageLimits.js +467 -34
  305. package/dist/usage/UsageLimitsCard.js +95 -11
  306. package/dist/usage/UsagePage.js +817 -96
  307. package/dist/usage/UsagePane.js +164 -10
  308. package/dist/usage/UsageSummary.js +151 -6
  309. package/dist/usage/UsageTiles.js +164 -14
  310. package/dist/usage/format.js +32 -32
  311. package/dist/usage/index.d.ts +1 -1
  312. package/dist/usage/index.js +2 -1
  313. package/dist/usage/limit-groups.d.ts +2 -0
  314. package/dist/usage/limit-groups.js +77 -59
  315. package/dist/usage/limits.js +78 -43
  316. package/dist/usage/money.js +20 -4
  317. package/dist/usage/summary.js +85 -64
  318. package/package.json +8 -8
  319. package/src/agents/ModelOptionControl.tsx +3 -1
  320. package/src/agents/option-words.ts +27 -0
  321. package/src/chat/account-choice.ts +41 -1
  322. package/src/chat/composer-effort.ts +32 -0
  323. package/src/chat/forks.ts +4 -5
  324. package/src/chat/index.ts +3 -1
  325. package/src/chat/logic/effort.ts +32 -0
  326. package/src/chat/logic/picker-entries.ts +45 -10
  327. package/src/chat/logic/resume-compaction.ts +95 -17
  328. package/src/chat/logic/timeline.ts +11 -3
  329. package/src/chat/preferences.ts +35 -0
  330. package/src/chat/subagent-view.ts +2 -3
  331. package/src/chat/ui/AnsiOutput.tsx +1 -2
  332. package/src/chat/ui/BookmarkSubmenu.tsx +3 -3
  333. package/src/chat/ui/ChatActivity.tsx +14 -22
  334. package/src/chat/ui/ChatReferenceChip.tsx +2 -3
  335. package/src/chat/ui/Composer.tsx +15 -7
  336. package/src/chat/ui/EditDiff.tsx +2 -3
  337. package/src/chat/ui/LimitState.tsx +2 -2
  338. package/src/chat/ui/Markdown.tsx +10 -8
  339. package/src/chat/ui/MermaidBlock.tsx +2 -3
  340. package/src/chat/ui/Pickers.tsx +49 -29
  341. package/src/chat/ui/PromptComposer.tsx +7 -9
  342. package/src/chat/ui/ResumeCompactionDock.tsx +16 -4
  343. package/src/chat/ui/RunSettings.tsx +67 -28
  344. package/src/chat/ui/Scrubber.tsx +3 -3
  345. package/src/chat/ui/ShellCommand.tsx +2 -0
  346. package/src/chat/ui/SubagentInfo.tsx +2 -3
  347. package/src/chat/ui/SubagentTimeline.tsx +12 -16
  348. package/src/chat/ui/Timeline.tsx +6 -6
  349. package/src/chat/ui/UnifiedDiff.tsx +3 -4
  350. package/src/chat/ui/VisualFrame.tsx +5 -8
  351. package/src/chat/ui/code-theme.ts +4 -4
  352. package/src/chat/ui/composer/placeholder.ts +2 -2
  353. package/src/chat/ui/composer/use-compaction-offer.ts +36 -16
  354. package/src/chat/ui/composer/use-composer-menus.ts +4 -9
  355. package/src/chat/ui/composer/use-composer-submit.ts +2 -1
  356. package/src/chat/ui/composer/use-effort-stepper.ts +56 -0
  357. package/src/chat/ui/composer/use-notice.ts +2 -2
  358. package/src/chat/ui/diff/EditorEditDiff.tsx +9 -13
  359. package/src/chat/ui/diff/LegacyEditDiff.tsx +12 -17
  360. package/src/chat/ui/diff/LegacyUnifiedDiff.tsx +13 -21
  361. package/src/chat/ui/diff/use-review-stack.ts +4 -4
  362. package/src/chat/ui/diff-theme.ts +3 -3
  363. package/src/chat/ui/file-links.ts +2 -2
  364. package/src/chat/ui/intelligent-ui/UiReply.tsx +2 -0
  365. package/src/chat/ui/intelligent-ui/renderers/chart.tsx +3 -3
  366. package/src/chat/ui/intelligent-ui/renderers/content.tsx +5 -6
  367. package/src/chat/ui/intelligent-ui/renderers/map-view.tsx +2 -1
  368. package/src/chat/ui/intelligent-ui/renderers/map.tsx +2 -1
  369. package/src/chat/ui/intelligent-ui/use-truncated.ts +16 -19
  370. package/src/chat/ui/intelligent-ui/use-ui-links.ts +3 -3
  371. package/src/chat/ui/rows/ForksRow.tsx +3 -5
  372. package/src/chat/ui/rows/GeneratedImageRow.tsx +2 -1
  373. package/src/chat/ui/rows/MessageRows.tsx +12 -21
  374. package/src/chat/ui/rows/SubagentRow.tsx +3 -3
  375. package/src/chat/ui/rows/TaskRow.tsx +1 -1
  376. package/src/chat/ui/rows/WorkRows.tsx +10 -5
  377. package/src/chat/ui/useToggleSet.ts +15 -18
  378. package/src/chat/ui/visual-theme.ts +2 -3
  379. package/src/host-hooks.ts +113 -0
  380. package/src/lazy.tsx +2 -0
  381. package/src/locales/en/agent-chat.ts +134 -108
  382. package/src/locales/en/agent-prompts.ts +7 -7
  383. package/src/locales/en/agent-providers.ts +35 -34
  384. package/src/locales/en/agent-usage.ts +26 -20
  385. package/src/locales/nl/agent-chat.ts +126 -100
  386. package/src/locales/nl/agent-prompts.ts +5 -5
  387. package/src/locales/nl/agent-providers.ts +33 -32
  388. package/src/locales/nl/agent-usage.ts +25 -20
  389. package/src/providers/CliDetail.tsx +2 -1
  390. package/src/providers/InstallPage.tsx +2 -4
  391. package/src/providers/ProviderList.tsx +12 -2
  392. package/src/providers/ProvidersPane.tsx +45 -15
  393. package/src/providers/pane-target.ts +20 -4
  394. package/src/state/chats.ts +2 -2
  395. package/src/usage/LimitsList.tsx +12 -13
  396. package/src/usage/UsageBreakdown.tsx +17 -6
  397. package/src/usage/UsageLimits.tsx +2 -1
  398. package/src/usage/UsagePage.tsx +3 -3
  399. package/src/usage/index.ts +1 -1
  400. package/src/usage/limit-groups.ts +12 -0
  401. package/src/usage/limits.ts +2 -2
  402. package/src/usage/money.ts +1 -2
@@ -0,0 +1,26 @@
1
+ /*
2
+ * A command outside the composer, such as a menu row or a shortcut of the app, steps the reasoning effort
3
+ * of a chat whose composer is on screen. Keyed with the scope's `keyOf`, like `sendFromComposer`. One chat can
4
+ * have two composers on screen; the one that came last steps, and the one before takes over when it goes.
5
+ */
6
+ const steppers = new Map();
7
+ export function registerEffortStepper(key, stepper) {
8
+ steppers.set(key, [...(steppers.get(key) ?? []), stepper]);
9
+ return () => {
10
+ const left = (steppers.get(key) ?? []).filter(entry => entry !== stepper);
11
+ if (left.length > 0) {
12
+ steppers.set(key, left);
13
+ } else {
14
+ steppers.delete(key);
15
+ }
16
+ };
17
+ }
18
+ /* False when that chat has no composer on screen. At either end of the model's efforts the composer says so and nothing changes. */
19
+ export function stepEffortFromComposer(key, step) {
20
+ const stepper = steppers.get(key)?.at(-1);
21
+ if (stepper === undefined) {
22
+ return false;
23
+ }
24
+ stepper(step);
25
+ return true;
26
+ }
@@ -4,19 +4,19 @@
4
4
  */
5
5
  const senders = new Map();
6
6
  export function registerComposerSender(key, send) {
7
- senders.set(key, send);
8
- return () => {
9
- if (senders.get(key) === send) {
10
- senders.delete(key);
11
- }
12
- };
7
+ senders.set(key, send);
8
+ return () => {
9
+ if (senders.get(key) === send) {
10
+ senders.delete(key);
11
+ }
12
+ };
13
13
  }
14
14
  /* False when that chat has no composer on screen. An empty or unsendable draft sends nothing, as with the keys. */
15
15
  export function sendFromComposer(key, how = 'default') {
16
- const send = senders.get(key);
17
- if (send === undefined) {
18
- return false;
19
- }
20
- send(how);
21
- return true;
22
- }
16
+ const send = senders.get(key);
17
+ if (send === undefined) {
18
+ return false;
19
+ }
20
+ send(how);
21
+ return true;
22
+ }
@@ -1,79 +1,107 @@
1
+ import { c as _c } from "react/compiler-runtime";
1
2
  import { chatStorageKey, chatStorageLegacyKeys, createChatStore } from '../storage.js';
2
3
  import { checkAttachmentLimits, uploadBytes } from './attachments.js';
3
4
  import { persistedJson } from './persisted-json.js';
4
5
  const storageKey = () => chatStorageKey('drafts');
5
- export const EMPTY_DRAFT = { text: '', mentions: [], skills: [], chats: [], attachments: [], quote: '', quoteSource: null };
6
- const storage = persistedJson(storageKey, (raw) => (raw ? JSON.parse(raw) : {}), {}, () => chatStorageLegacyKeys('drafts'));
6
+ export const EMPTY_DRAFT = {
7
+ text: '',
8
+ mentions: [],
9
+ skills: [],
10
+ chats: [],
11
+ attachments: [],
12
+ quote: '',
13
+ quoteSource: null
14
+ };
15
+ const storage = persistedJson(storageKey, raw => raw ? JSON.parse(raw) : {}, {}, () => chatStorageLegacyKeys('drafts'));
7
16
  export function isEmptyDraft(draft) {
8
- return draft.text.trim() === '' && draft.attachments.length === 0 && draft.quote === '';
17
+ return draft.text.trim() === '' && draft.attachments.length === 0 && draft.quote === '';
9
18
  }
10
19
  /*
11
20
  * Which chats hold an unsent prompt, for a dot beside them in a list of chats. The drafts themselves
12
21
  * stay in storage: a node that is not on screen has no composer, and this is all anyone else needs.
13
22
  */
14
- export const useDrafts = createChatStore(() => ({ ids: [] }), (store) => store.setState({ ids: Object.keys(storage.read()) }));
23
+ export const useDrafts = createChatStore(() => ({
24
+ ids: []
25
+ }), store => store.setState({
26
+ ids: Object.keys(storage.read())
27
+ }));
15
28
  export function useHasDraft(chatId) {
16
- return useDrafts((s) => s.ids.includes(chatId));
29
+ const $ = _c(2);
30
+ let t0;
31
+ if ($[0] !== chatId) {
32
+ t0 = s => s.ids.includes(chatId);
33
+ $[0] = chatId;
34
+ $[1] = t0;
35
+ } else {
36
+ t0 = $[1];
37
+ }
38
+ return useDrafts(t0);
17
39
  }
18
40
  function trackDraft(chatId, held) {
19
- const { ids } = useDrafts.getState();
20
- if (ids.includes(chatId) === held) {
21
- return;
22
- }
23
- useDrafts.setState({ ids: held ? [...ids, chatId] : ids.filter((id) => id !== chatId) });
41
+ const {
42
+ ids
43
+ } = useDrafts.getState();
44
+ if (ids.includes(chatId) === held) {
45
+ return;
46
+ }
47
+ useDrafts.setState({
48
+ ids: held ? [...ids, chatId] : ids.filter(id => id !== chatId)
49
+ });
24
50
  }
25
51
  /* An unsent prompt per chat node, kept across reloads so a half-written message is never lost. */
26
52
  export function readDraft(chatId) {
27
- const record = storage.read()[chatId];
28
- return record
29
- ? {
30
- text: record.text,
31
- mentions: record.mentions ?? [],
32
- skills: record.skills ?? [],
33
- chats: record.chats ?? [],
34
- attachments: record.attachments ?? [],
35
- quote: record.quote ?? '',
36
- quoteSource: record.quoteSource ?? null
37
- }
38
- : EMPTY_DRAFT;
53
+ const record = storage.read()[chatId];
54
+ return record ? {
55
+ text: record.text,
56
+ mentions: record.mentions ?? [],
57
+ skills: record.skills ?? [],
58
+ chats: record.chats ?? [],
59
+ attachments: record.attachments ?? [],
60
+ quote: record.quote ?? '',
61
+ quoteSource: record.quoteSource ?? null
62
+ } : EMPTY_DRAFT;
39
63
  }
40
64
  export function writeDraft(chatId, draft) {
41
- const drafts = storage.read();
42
- trackDraft(chatId, !isEmptyDraft(draft));
43
- if (isEmptyDraft(draft)) {
44
- delete drafts[chatId];
45
- storage.write(drafts);
46
- return;
47
- }
48
- drafts[chatId] = {
49
- text: draft.text,
50
- mentions: draft.mentions,
51
- skills: draft.skills,
52
- chats: draft.chats,
53
- attachments: draft.attachments,
54
- quote: draft.quote,
55
- ...(draft.quoteSource === null ? {} : { quoteSource: draft.quoteSource })
56
- };
57
- if (storage.write(drafts)) {
58
- return;
59
- }
60
- // A file can outgrow the storage quota; the text is the part worth keeping then.
61
- drafts[chatId] = {
62
- text: draft.text,
63
- mentions: draft.mentions,
64
- skills: draft.skills,
65
- chats: draft.chats,
66
- quote: draft.quote,
67
- ...(draft.quoteSource === null ? {} : { quoteSource: draft.quoteSource })
68
- };
65
+ const drafts = storage.read();
66
+ trackDraft(chatId, !isEmptyDraft(draft));
67
+ if (isEmptyDraft(draft)) {
68
+ delete drafts[chatId];
69
69
  storage.write(drafts);
70
+ return;
71
+ }
72
+ drafts[chatId] = {
73
+ text: draft.text,
74
+ mentions: draft.mentions,
75
+ skills: draft.skills,
76
+ chats: draft.chats,
77
+ attachments: draft.attachments,
78
+ quote: draft.quote,
79
+ ...(draft.quoteSource === null ? {} : {
80
+ quoteSource: draft.quoteSource
81
+ })
82
+ };
83
+ if (storage.write(drafts)) {
84
+ return;
85
+ }
86
+ // A file can outgrow the storage quota; the text is the part worth keeping then.
87
+ drafts[chatId] = {
88
+ text: draft.text,
89
+ mentions: draft.mentions,
90
+ skills: draft.skills,
91
+ chats: draft.chats,
92
+ quote: draft.quote,
93
+ ...(draft.quoteSource === null ? {} : {
94
+ quoteSource: draft.quoteSource
95
+ })
96
+ };
97
+ storage.write(drafts);
70
98
  }
71
99
  /* Text handed to a draft from outside the composer goes under what was already typed, never over it. */
72
100
  export function joinDraftText(current, added) {
73
- return current.trim() === '' ? added : `${current.replace(/\s+$/, '')}\n\n${added}`;
101
+ return current.trim() === '' ? added : `${current.replace(/\s+$/, '')}\n\n${added}`;
74
102
  }
75
103
  function union(first, second) {
76
- return [...first, ...second.filter((entry) => !first.includes(entry))];
104
+ return [...first, ...second.filter(entry => !first.includes(entry))];
77
105
  }
78
106
  /*
79
107
  * A queued message taken back to edit goes above what was typed since. Its files join the draft's as
@@ -81,40 +109,48 @@ function union(first, second) {
81
109
  * it was sent with is part of its text; the draft keeps the one it holds.
82
110
  */
83
111
  export function takeBackIntoDraft(current, taken) {
84
- const checked = checkAttachmentLimits(current.attachments.length, taken.attachments.map((upload) => ({ name: upload.name, mime: upload.mime, bytes: uploadBytes(upload), upload })), current.attachments.reduce((bytes, upload) => bytes + uploadBytes(upload), 0));
85
- return {
86
- draft: {
87
- text: current.text.trim() === '' ? taken.text : joinDraftText(taken.text, current.text),
88
- mentions: union(taken.mentions, current.mentions),
89
- skills: union(taken.skills, current.skills),
90
- chats: union(taken.chats, current.chats),
91
- attachments: [...checked.accepted.map((entry) => entry.upload), ...current.attachments],
92
- quote: current.quote,
93
- quoteSource: current.quoteSource
94
- },
95
- rejected: checked.rejected
96
- };
112
+ const checked = checkAttachmentLimits(current.attachments.length, taken.attachments.map(upload => ({
113
+ name: upload.name,
114
+ mime: upload.mime,
115
+ bytes: uploadBytes(upload),
116
+ upload
117
+ })), current.attachments.reduce((bytes, upload) => bytes + uploadBytes(upload), 0));
118
+ return {
119
+ draft: {
120
+ text: current.text.trim() === '' ? taken.text : joinDraftText(taken.text, current.text),
121
+ mentions: union(taken.mentions, current.mentions),
122
+ skills: union(taken.skills, current.skills),
123
+ chats: union(taken.chats, current.chats),
124
+ attachments: [...checked.accepted.map(entry => entry.upload), ...current.attachments],
125
+ quote: current.quote,
126
+ quoteSource: current.quoteSource
127
+ },
128
+ rejected: checked.rejected
129
+ };
97
130
  }
98
131
  /* The composers on screen, by chat. One that is not mounted reads what was offered from storage when it is. */
99
132
  const takers = new Map();
100
133
  export function takeDraftOffers(chatId, take) {
101
- takers.set(chatId, take);
102
- return () => {
103
- if (takers.get(chatId) === take) {
104
- takers.delete(chatId);
105
- }
106
- };
134
+ takers.set(chatId, take);
135
+ return () => {
136
+ if (takers.get(chatId) === take) {
137
+ takers.delete(chatId);
138
+ }
139
+ };
107
140
  }
108
141
  /*
109
142
  * Puts text in a chat's prompt without sending it: the person reads it and presses Enter. A mounted
110
143
  * composer owns its draft and writes it back to storage itself, so it has to be the one to take it.
111
144
  */
112
145
  export function offerDraft(chatId, text) {
113
- const take = takers.get(chatId);
114
- if (take) {
115
- take(text);
116
- return;
117
- }
118
- const current = readDraft(chatId);
119
- writeDraft(chatId, { ...current, text: joinDraftText(current.text, text) });
120
- }
146
+ const take = takers.get(chatId);
147
+ if (take) {
148
+ take(text);
149
+ return;
150
+ }
151
+ const current = readDraft(chatId);
152
+ writeDraft(chatId, {
153
+ ...current,
154
+ text: joinDraftText(current.text, text)
155
+ });
156
+ }
@@ -1,14 +1,14 @@
1
- import { useMemo } from 'react';
1
+ import { c as _c } from "react/compiler-runtime";
2
2
  import { forkIdsAfter, forkedTurnIds } from './logic/fork.js';
3
3
  import { useChatScope } from '../scope.js';
4
4
  import { useChats } from '../state/chats.js';
5
5
  /* The chats this client holds of one host, which is where the forks it knows of are. */
6
6
  function* forkInfosOn(statuses, owns) {
7
- for (const [key, state] of Object.entries(statuses)) {
8
- if (state.info.forkOf !== undefined && owns(key)) {
9
- yield state.info;
10
- }
7
+ for (const [key, state] of Object.entries(statuses)) {
8
+ if (state.info.forkOf !== undefined && owns(key)) {
9
+ yield state.info;
11
10
  }
11
+ }
12
12
  }
13
13
  /*
14
14
  * Selectors answer a joined string, never a new array or set, and split it again in a memo. One runs on
@@ -16,30 +16,87 @@ function* forkInfosOn(statuses, owns) {
16
16
  * statuses, which change with an info alone, are others.
17
17
  */
18
18
  function joinedForks(owns, collect) {
19
- let statuses = null;
20
- let joined = '';
21
- return (state) => {
22
- if (state.statusByKey !== statuses) {
23
- statuses = state.statusByKey;
24
- joined = [...collect(forkInfosOn(statuses, owns))].join('\n');
25
- }
26
- return joined;
27
- };
19
+ let statuses = null;
20
+ let joined = '';
21
+ return state => {
22
+ if (state.statusByKey !== statuses) {
23
+ statuses = state.statusByKey;
24
+ joined = [...collect(forkInfosOn(statuses, owns))].join('\n');
25
+ }
26
+ return joined;
27
+ };
28
28
  }
29
29
  function splitIds(joined) {
30
- return joined === '' ? [] : joined.split('\n');
30
+ return joined === '' ? [] : joined.split('\n');
31
31
  }
32
32
  /* The turns of this chat a fork went on after, for the thread to put a line under. */
33
33
  export function useForkedTurns(chatId) {
34
- const { owns } = useChatScope();
35
- const select = useMemo(() => joinedForks(owns, (infos) => forkedTurnIds(infos, chatId)), [owns, chatId]);
36
- const joined = useChats(select);
37
- return useMemo(() => new Set(splitIds(joined)), [joined]);
34
+ const $ = _c(7);
35
+ const {
36
+ owns
37
+ } = useChatScope();
38
+ let t0;
39
+ if ($[0] !== chatId) {
40
+ t0 = infos => forkedTurnIds(infos, chatId);
41
+ $[0] = chatId;
42
+ $[1] = t0;
43
+ } else {
44
+ t0 = $[1];
45
+ }
46
+ let t1;
47
+ if ($[2] !== owns || $[3] !== t0) {
48
+ t1 = joinedForks(owns, t0);
49
+ $[2] = owns;
50
+ $[3] = t0;
51
+ $[4] = t1;
52
+ } else {
53
+ t1 = $[4];
54
+ }
55
+ const select = t1;
56
+ const joined = useChats(select);
57
+ let t2;
58
+ if ($[5] !== joined) {
59
+ t2 = new Set(splitIds(joined));
60
+ $[5] = joined;
61
+ $[6] = t2;
62
+ } else {
63
+ t2 = $[6];
64
+ }
65
+ return t2;
38
66
  }
39
67
  /* The forks that went on after this turn of this chat. */
40
68
  export function useForkIdsAfter(chatId, turnId) {
41
- const { owns } = useChatScope();
42
- const select = useMemo(() => joinedForks(owns, (infos) => forkIdsAfter(infos, chatId, turnId)), [owns, chatId, turnId]);
43
- const joined = useChats(select);
44
- return useMemo(() => splitIds(joined), [joined]);
45
- }
69
+ const $ = _c(8);
70
+ const {
71
+ owns
72
+ } = useChatScope();
73
+ let t0;
74
+ if ($[0] !== chatId || $[1] !== turnId) {
75
+ t0 = infos => forkIdsAfter(infos, chatId, turnId);
76
+ $[0] = chatId;
77
+ $[1] = turnId;
78
+ $[2] = t0;
79
+ } else {
80
+ t0 = $[2];
81
+ }
82
+ let t1;
83
+ if ($[3] !== owns || $[4] !== t0) {
84
+ t1 = joinedForks(owns, t0);
85
+ $[3] = owns;
86
+ $[4] = t0;
87
+ $[5] = t1;
88
+ } else {
89
+ t1 = $[5];
90
+ }
91
+ const select = t1;
92
+ const joined = useChats(select);
93
+ let t2;
94
+ if ($[6] !== joined) {
95
+ t2 = splitIds(joined);
96
+ $[6] = joined;
97
+ $[7] = t2;
98
+ } else {
99
+ t2 = $[7];
100
+ }
101
+ return t2;
102
+ }
@@ -12,58 +12,30 @@ export const PASTE_ATTACHMENT_FROM_BYTES = 32 * 1024;
12
12
  const encoder = new TextEncoder();
13
13
  /* Whether pasted text is large enough to go in as an attachment. Bytes, since that is what the file weighs. */
14
14
  export function pasteBecomesAttachment(text) {
15
- return text.length * 3 >= PASTE_ATTACHMENT_FROM_BYTES && encoder.encode(text).length >= PASTE_ATTACHMENT_FROM_BYTES;
15
+ return text.length * 3 >= PASTE_ATTACHMENT_FROM_BYTES && encoder.encode(text).length >= PASTE_ATTACHMENT_FROM_BYTES;
16
16
  }
17
17
  /* A name for pasted text that no attachment of the draft has yet: paste-1.txt, paste-2.txt, ... */
18
18
  export function pastedTextName(taken) {
19
- const names = new Set(taken);
20
- let index = 1;
21
- while (names.has(`paste-${index}.txt`)) {
22
- index += 1;
23
- }
24
- return `paste-${index}.txt`;
19
+ const names = new Set(taken);
20
+ let index = 1;
21
+ while (names.has(`paste-${index}.txt`)) {
22
+ index += 1;
23
+ }
24
+ return `paste-${index}.txt`;
25
25
  }
26
26
  export function promptGuard(text) {
27
- return {
28
- count: text.length,
29
- visible: text.length >= PROMPT_COUNTER_FROM,
30
- tooLong: text.length > PROMPT_MAX_CHARS
31
- };
27
+ return {
28
+ count: text.length,
29
+ visible: text.length >= PROMPT_COUNTER_FROM,
30
+ tooLong: text.length > PROMPT_MAX_CHARS
31
+ };
32
32
  }
33
33
  /*
34
34
  * Commands the CLI lists because its own terminal has them: they change the terminal, the login or
35
35
  * the config, or they end a session the chat node does not own.
36
36
  */
37
- const TUI_ONLY = new Set([
38
- 'bug',
39
- 'color',
40
- 'config',
41
- 'doctor',
42
- 'exit',
43
- 'heapdump',
44
- 'help',
45
- 'hooks',
46
- 'ide',
47
- 'install-github-app',
48
- 'keybindings',
49
- 'login',
50
- 'logout',
51
- 'migrate-installer',
52
- 'privacy-settings',
53
- 'quit',
54
- 'release-notes',
55
- 'reload-plugins',
56
- 'reload-skills',
57
- 'rename',
58
- 'resume',
59
- 'status',
60
- 'statusline',
61
- 'terminal-setup',
62
- 'theme',
63
- 'upgrade',
64
- 'vim'
65
- ]);
37
+ const TUI_ONLY = new Set(['bug', 'color', 'config', 'doctor', 'exit', 'heapdump', 'help', 'hooks', 'ide', 'install-github-app', 'keybindings', 'login', 'logout', 'migrate-installer', 'privacy-settings', 'quit', 'release-notes', 'reload-plugins', 'reload-skills', 'rename', 'resume', 'status', 'statusline', 'terminal-setup', 'theme', 'upgrade', 'vim']);
66
38
  /* The commands of the CLI's list that mean something in a chat node. */
67
39
  export function usableSlashCommands(names) {
68
- return names.filter((name) => !TUI_ONLY.has(name));
69
- }
40
+ return names.filter(name => !TUI_ONLY.has(name));
41
+ }
@@ -1,8 +1,10 @@
1
- export { type AccountChoice, useAccountChoice } from './account-choice.js';
1
+ export { type AccountChoice, useAccountChoice, type NewAccountChoice, useNewAccountChoice } from './account-choice.js';
2
2
  export { transportActions, actionsOf, useChatActions } from './actions.js';
3
3
  export { type ChatSendExtras, ChatClient } from './chat-client.js';
4
4
  export type { ProjectChat } from './chat-references.js';
5
5
  export { sendFromComposer, type ComposerSend } from './composer-send.js';
6
+ export { stepEffortFromComposer } from './composer-effort.js';
7
+ export type { EffortStep } from './logic/effort.js';
6
8
  export { EMPTY_DRAFT, useDrafts, readDraft, writeDraft, offerDraft, type ChatDraft } from './drafts.js';
7
9
  export { stripAnsi } from './logic/ansi.js';
8
10
  export { FORKABLE_PROVIDERS, forkRefusal, summaryRefusal, lastSettledTurn, forkPointOf, forkPointLabel, type ForkShape, forkShapes, type ForkCliChoice, forkPayload, branchRefusal, type ForkPoint, type ForkWorktreeChoice } from './logic/fork.js';
@@ -1,8 +1,9 @@
1
1
  // Public API: exports.test.ts snapshots this list, so a name added or dropped here is an API change.
2
- export { useAccountChoice } from './account-choice.js';
2
+ export { useAccountChoice, useNewAccountChoice } from './account-choice.js';
3
3
  export { transportActions, actionsOf, useChatActions } from './actions.js';
4
4
  export { ChatClient } from './chat-client.js';
5
5
  export { sendFromComposer } from './composer-send.js';
6
+ export { stepEffortFromComposer } from './composer-effort.js';
6
7
  export { EMPTY_DRAFT, useDrafts, readDraft, writeDraft, offerDraft } from './drafts.js';
7
8
  export { stripAnsi } from './logic/ansi.js';
8
9
  export { FORKABLE_PROVIDERS, forkRefusal, summaryRefusal, lastSettledTurn, forkPointOf, forkPointLabel, forkShapes, forkPayload, branchRefusal } from './logic/fork.js';
@@ -23,4 +24,4 @@ export { subagentTitle, summaryWordOf, stopOf } from './subagent-list.js';
23
24
  export { useSubagentSupport } from './subagent-support.js';
24
25
  export { crumbOf, openFromMain, composerWrites, canOpenSubagent, useSubagentView, useSubagentTrail, useSubagentItem } from './subagent-view.js';
25
26
  export { stepTimelineMessage, jumpToTimelineItem, registerTurnJumper, jumpToTimelineTurn } from './timeline-scroll.js';
26
- export { statusLookOf, taskStatusWord } from '../agents/status-look.js';
27
+ export { statusLookOf, taskStatusWord } from '../agents/status-look.js';