@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
@@ -3,69 +3,109 @@
3
3
  * with the rest behind one row that opens all of them. A list of three hundred models is not one to scroll.
4
4
  */
5
5
  export const COMPACT_MODEL_LIMIT = 8;
6
+ const NO_FAVORITES = () => new Set();
6
7
  function matches(model, query) {
7
- return model.name.toLowerCase().includes(query) || model.slug.toLowerCase().includes(query) || (model.vendor?.toLowerCase().includes(query) ?? false);
8
+ return model.name.toLowerCase().includes(query) || model.slug.toLowerCase().includes(query) || (model.vendor?.toLowerCase().includes(query) ?? false);
8
9
  }
9
10
  /*
10
11
  * By maker, then by name, when the provider says who made its models; a list with no makers keeps the order
11
12
  * it came in. A model with no maker goes last, so the ones that have one read as groups.
12
13
  */
13
14
  export function modelsByVendor(models) {
14
- if (!models.some((model) => model.vendor !== undefined)) {
15
- return models;
15
+ if (!models.some(model => model.vendor !== undefined)) {
16
+ return models;
17
+ }
18
+ return [...models].sort((a, b) => {
19
+ if (a.vendor === undefined || b.vendor === undefined) {
20
+ return a.vendor === b.vendor ? 0 : a.vendor === undefined ? 1 : -1;
16
21
  }
17
- return [...models].sort((a, b) => {
18
- if (a.vendor === undefined || b.vendor === undefined) {
19
- return a.vendor === b.vendor ? 0 : a.vendor === undefined ? 1 : -1;
20
- }
21
- return (a.vendor.localeCompare(b.vendor, undefined, { sensitivity: 'base' }) ||
22
- a.name.localeCompare(b.name, undefined, { sensitivity: 'base', numeric: true }));
22
+ return a.vendor.localeCompare(b.vendor, undefined, {
23
+ sensitivity: 'base'
24
+ }) || a.name.localeCompare(b.name, undefined, {
25
+ sensitivity: 'base',
26
+ numeric: true
23
27
  });
28
+ });
24
29
  }
25
- /* The models a long list shows before it is opened: the default and the one that is picked. Null when the list is short enough to show whole. */
26
- export function shortlistOf(kind, models, current) {
27
- if (models.length <= COMPACT_MODEL_LIMIT) {
28
- return null;
29
- }
30
- return modelsByVendor(models.filter((model) => model.isDefault || (current?.provider === kind && current.model === model.slug)));
30
+ /* The starred models first, in the order they came, then the rest by maker. */
31
+ export function favoritesFirst(models, favorites) {
32
+ if (favorites.size === 0) {
33
+ return modelsByVendor(models);
34
+ }
35
+ return [...models.filter(model => favorites.has(model.slug)), ...modelsByVendor(models.filter(model => !favorites.has(model.slug)))];
36
+ }
37
+ /*
38
+ * The models a long list shows before it is opened: the starred ones, the default and the one that is picked.
39
+ * Null when the list is short enough to show whole.
40
+ */
41
+ export function shortlistOf(kind, models, current, favorites = new Set()) {
42
+ if (models.length <= COMPACT_MODEL_LIMIT) {
43
+ return null;
44
+ }
45
+ return favoritesFirst(models.filter(model => model.isDefault || favorites.has(model.slug) || current?.provider === kind && current.model === model.slug), favorites);
31
46
  }
32
47
  /* Whether the providers offer enough models together that a search is quicker than reading the list. */
33
48
  export function wantsModelSearch(providers) {
34
- return providers.reduce((count, entry) => count + entry.models.length, 0) > COMPACT_MODEL_LIMIT;
49
+ return providers.reduce((count, entry) => count + entry.models.length, 0) > COMPACT_MODEL_LIMIT;
35
50
  }
36
- /* Every model of every provider that a search finds, legacy ones included, by maker; a provider with none is left out. */
37
- export function searchModels(providers, query) {
38
- const needle = query.trim().toLowerCase();
39
- return providers
40
- .map((entry) => ({ entry, models: modelsByVendor(entry.models.filter((model) => matches(model, needle))) }))
41
- .filter((group) => group.models.length > 0);
51
+ /* Every model of every provider that a search finds, legacy ones included, starred first and then by maker; a provider with none is left out. */
52
+ export function searchModels(providers, query, favoritesOf = NO_FAVORITES) {
53
+ const needle = query.trim().toLowerCase();
54
+ return providers.map(entry => ({
55
+ entry,
56
+ models: favoritesFirst(entry.models.filter(model => matches(model, needle)), favoritesOf(entry.kind))
57
+ })).filter(group => group.models.length > 0);
42
58
  }
43
59
  const NONE = new Set();
44
60
  /*
45
61
  * The rows of the model list. A model an old CLI cannot run is a row like any other, so a search for
46
62
  * only that model still finds the row that explains why it cannot be picked. A search looks through
47
63
  * every model of every provider; without one, a provider with many models shows a short list and a row
48
- * that opens the rest, grouped by maker.
64
+ * that opens the rest, grouped by maker. A provider's starred models come first wherever it lists them.
49
65
  */
50
- export function pickerEntriesOf(providers, query, legacyOpen, expanded = NONE, current = null) {
51
- const rowsOf = (entry, models) => modelsByVendor(models).map((model) => ({ kind: 'model', provider: entry, model }));
52
- if (query !== '') {
53
- return providers.flatMap((entry) => rowsOf(entry, entry.models.filter((model) => matches(model, query))));
66
+ export function pickerEntriesOf(providers, query, legacyOpen, expanded = NONE, current = null, favoritesOf = NO_FAVORITES) {
67
+ const rowsOf = (entry, models) => favoritesFirst(models, favoritesOf(entry.kind)).map(model => ({
68
+ kind: 'model',
69
+ provider: entry,
70
+ model
71
+ }));
72
+ if (query !== '') {
73
+ return providers.flatMap(entry => rowsOf(entry, entry.models.filter(model => matches(model, query))));
74
+ }
75
+ const legacy = providers.flatMap(entry => entry.models.filter(model => model.legacy).map(model => ({
76
+ kind: 'model',
77
+ provider: entry,
78
+ model
79
+ })));
80
+ const live = providers.flatMap(entry => {
81
+ const models = entry.models.filter(model => !model.legacy);
82
+ const shortlist = shortlistOf(entry.kind, models, current, favoritesOf(entry.kind));
83
+ if (shortlist === null) {
84
+ return rowsOf(entry, models);
54
85
  }
55
- const legacy = providers.flatMap((entry) => entry.models.filter((model) => model.legacy).map((model) => ({ kind: 'model', provider: entry, model })));
56
- const live = providers.flatMap((entry) => {
57
- const models = entry.models.filter((model) => !model.legacy);
58
- const shortlist = shortlistOf(entry.kind, models, current);
59
- if (shortlist === null) {
60
- return rowsOf(entry, models);
61
- }
62
- if (expanded.has(entry.kind)) {
63
- return [{ kind: 'all', provider: entry, count: models.length, open: true }, ...rowsOf(entry, models)];
64
- }
65
- return [...rowsOf(entry, shortlist), { kind: 'all', provider: entry, count: models.length, open: false }];
66
- });
67
- if (legacy.length === 0) {
68
- return live;
86
+ if (expanded.has(entry.kind)) {
87
+ return [{
88
+ kind: 'all',
89
+ provider: entry,
90
+ count: models.length,
91
+ open: true
92
+ }, ...rowsOf(entry, models)];
69
93
  }
70
- return legacyOpen ? [...live, { kind: 'legacy', count: legacy.length }, ...legacy] : [...live, { kind: 'legacy', count: legacy.length }];
71
- }
94
+ return [...rowsOf(entry, shortlist), {
95
+ kind: 'all',
96
+ provider: entry,
97
+ count: models.length,
98
+ open: false
99
+ }];
100
+ });
101
+ if (legacy.length === 0) {
102
+ return live;
103
+ }
104
+ return legacyOpen ? [...live, {
105
+ kind: 'legacy',
106
+ count: legacy.length
107
+ }, ...legacy] : [...live, {
108
+ kind: 'legacy',
109
+ count: legacy.length
110
+ }];
111
+ }
@@ -1,14 +1,27 @@
1
1
  import type { ChatInfo, ChatItem, ProviderCapabilities } from '@adecore/agent-contracts';
2
2
  export declare const RESUME_COMPACTION_TOKENS = 100000;
3
3
  export declare const RESUME_COMPACTION_IDLE_MS: number;
4
+ export type ResumeCompactionReason = 'cache-expired' | 'idle';
4
5
  export interface ResumeCompactionOffer {
5
6
  turnId: string;
6
7
  tokens: number;
8
+ reason: ResumeCompactionReason;
7
9
  }
8
- export declare function resumeCompactionOffer({ info, compaction, items, dismissedTurnId, now }: {
10
+ interface OfferInput {
9
11
  info: ChatInfo;
10
12
  compaction: ProviderCapabilities['compaction'] | undefined;
11
13
  items: readonly ChatItem[];
12
14
  dismissedTurnId: string | null;
15
+ }
16
+ export declare function resumeCompactionDueAt(input: OfferInput): number | null;
17
+ export declare function resumeCompactionOffer(input: OfferInput & {
13
18
  now: number;
14
19
  }): ResumeCompactionOffer | null;
20
+ export interface DueClock {
21
+ now(): number;
22
+ setTimer(run: () => void, ms: number): unknown;
23
+ clearTimer(timer: unknown): void;
24
+ onWake(wake: () => void): () => void;
25
+ }
26
+ export declare function watchDueAt(dueAt: number, due: (now: number) => void, clock: DueClock): () => void;
27
+ export {};
@@ -5,34 +5,103 @@
5
5
  export const RESUME_COMPACTION_TOKENS = 100_000;
6
6
  /* The longest prompt cache Claude keeps is an hour, so past this the whole thread is read again anyway. */
7
7
  export const RESUME_COMPACTION_IDLE_MS = 70 * 60_000;
8
+ /* The newest turn by when it started, so a thread that arrives out of order still names the turn that ran last. */
8
9
  function lastTurn(items) {
9
- return items.findLast((item) => item.kind === 'turn') ?? null;
10
+ let last = null;
11
+ for (const item of items) {
12
+ if (item.kind === 'turn' && (last === null || item.createdAt >= last.createdAt)) {
13
+ last = item;
14
+ }
15
+ }
16
+ return last;
17
+ }
18
+ /* The turn an offer would be about, or null while nothing could be offered whatever the time. */
19
+ function offerableTurn({
20
+ info,
21
+ compaction,
22
+ items,
23
+ dismissedTurnId
24
+ }) {
25
+ if (compaction === undefined || compaction === 'none') {
26
+ return null;
27
+ }
28
+ if (info.activeTurnId !== null || (info.queue ?? []).length > 0) {
29
+ return null;
30
+ }
31
+ if (info.usage.contextTokens < RESUME_COMPACTION_TOKENS) {
32
+ return null;
33
+ }
34
+ const turn = lastTurn(items);
35
+ if (turn === null || turn.endedAt === null || turn.id === dismissedTurnId) {
36
+ return null;
37
+ }
38
+ /*
39
+ * `contextTokens` keeps the old number until the next request, so without this the offer would
40
+ * come straight back after a compaction. A native compaction is a turn without a message of the
41
+ * person, which is why this looks at the turn and not at the last thing that was said.
42
+ */
43
+ if (items.some(item => item.kind === 'compaction' && item.turnId === turn.id)) {
44
+ return null;
45
+ }
46
+ return turn;
47
+ }
48
+ /* A silence longer than any cache lives stands in for an expiry from a CLI that names none. */
49
+ function dueAtOf(info, endedAt) {
50
+ return info.usage.cacheExpiresAt ?? endedAt + RESUME_COMPACTION_IDLE_MS;
51
+ }
52
+ /*
53
+ * When the next message would pay for the whole thread again, or null while nothing could be offered,
54
+ * so a surface knows whether to keep a timer.
55
+ */
56
+ export function resumeCompactionDueAt(input) {
57
+ const endedAt = offerableTurn(input)?.endedAt ?? null;
58
+ return endedAt === null ? null : dueAtOf(input.info, endedAt);
10
59
  }
11
60
  /* Whether to offer compacting before the next message. */
12
- export function resumeCompactionOffer({ info, compaction, items, dismissedTurnId, now }) {
13
- if (compaction === undefined || compaction === 'none') {
14
- return null;
15
- }
16
- if (info.activeTurnId !== null || (info.queue ?? []).length > 0) {
17
- return null;
18
- }
19
- if (info.usage.contextTokens < RESUME_COMPACTION_TOKENS) {
20
- return null;
61
+ export function resumeCompactionOffer(input) {
62
+ const turn = offerableTurn(input);
63
+ if (turn === null || turn.endedAt === null || input.now < dueAtOf(input.info, turn.endedAt)) {
64
+ return null;
65
+ }
66
+ return {
67
+ turnId: turn.id,
68
+ tokens: input.info.usage.contextTokens,
69
+ reason: input.info.usage.cacheExpiresAt === undefined ? 'idle' : 'cache-expired'
70
+ };
71
+ }
72
+ /*
73
+ * Calls `due` with the time once `dueAt` passed. A timer can fire a few milliseconds early, and one that runs on a
74
+ * monotonic clock fires late after the system slept, so an early timer is armed again and a wake looks at once.
75
+ */
76
+ export function watchDueAt(dueAt, due, clock) {
77
+ let timer = null;
78
+ let done = false;
79
+ const check = () => {
80
+ if (timer !== null) {
81
+ clock.clearTimer(timer);
82
+ timer = null;
21
83
  }
22
- const turn = lastTurn(items);
23
- if (turn === null || turn.endedAt === null || turn.id === dismissedTurnId) {
24
- return null;
84
+ if (done) {
85
+ return;
25
86
  }
26
- if (now - turn.endedAt < RESUME_COMPACTION_IDLE_MS) {
27
- return null;
87
+ const now = clock.now();
88
+ if (now >= dueAt) {
89
+ done = true;
90
+ due(now);
91
+ return;
28
92
  }
29
- /*
30
- * `contextTokens` keeps the old number until the next request, so without this the offer would
31
- * come straight back after a compaction. A native compaction is a turn without a message of the
32
- * person, which is why this looks at the turn and not at the last thing that was said.
33
- */
34
- if (items.some((item) => item.kind === 'compaction' && item.turnId === turn.id)) {
35
- return null;
93
+ timer = clock.setTimer(() => {
94
+ timer = null;
95
+ check();
96
+ }, dueAt - now);
97
+ };
98
+ const stopWake = clock.onWake(check);
99
+ check();
100
+ return () => {
101
+ done = true;
102
+ stopWake();
103
+ if (timer !== null) {
104
+ clock.clearTimer(timer);
36
105
  }
37
- return { turnId: turn.id, tokens: info.usage.contextTokens };
38
- }
106
+ };
107
+ }