@adecore/agents-react 0.31.12 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/README.md +1 -1
  2. package/dist/agents/AccountDot.js +57 -6
  3. package/dist/agents/AgentIcon.js +88 -12
  4. package/dist/agents/ModelOptionControl.js +153 -18
  5. package/dist/agents/ProviderLogo.js +49 -4
  6. package/dist/agents/account-limits.js +17 -14
  7. package/dist/agents/accounts.js +99 -67
  8. package/dist/agents/agent-marks.js +5 -3
  9. package/dist/agents/model-name.js +42 -31
  10. package/dist/agents/model-options.js +8 -8
  11. package/dist/agents/model-requirement.js +17 -14
  12. package/dist/agents/option-words.d.ts +7 -0
  13. package/dist/agents/option-words.js +35 -0
  14. package/dist/agents/provider-paths.js +6 -6
  15. package/dist/agents/status-look.js +32 -12
  16. package/dist/chat/account-choice.d.ts +13 -0
  17. package/dist/chat/account-choice.js +90 -20
  18. package/dist/chat/actions.js +126 -59
  19. package/dist/chat/activity.js +5 -5
  20. package/dist/chat/attachments.js +74 -53
  21. package/dist/chat/bookmarks.js +58 -48
  22. package/dist/chat/chat-client.js +344 -263
  23. package/dist/chat/chat-references.js +3 -3
  24. package/dist/chat/composer-effort.d.ts +5 -0
  25. package/dist/chat/composer-effort.js +26 -0
  26. package/dist/chat/composer-send.js +13 -13
  27. package/dist/chat/drafts.js +115 -79
  28. package/dist/chat/forks.js +81 -24
  29. package/dist/chat/guards.js +15 -43
  30. package/dist/chat/index.d.ts +3 -1
  31. package/dist/chat/index.js +3 -2
  32. package/dist/chat/logic/ansi.js +170 -167
  33. package/dist/chat/logic/answers.js +2 -2
  34. package/dist/chat/logic/bookmarks.js +19 -19
  35. package/dist/chat/logic/command-looks.js +138 -96
  36. package/dist/chat/logic/context-usage.js +13 -9
  37. package/dist/chat/logic/continue-after-stop.js +15 -19
  38. package/dist/chat/logic/effort.d.ts +14 -0
  39. package/dist/chat/logic/effort.js +34 -0
  40. package/dist/chat/logic/embedded-code.js +387 -326
  41. package/dist/chat/logic/fork.js +134 -110
  42. package/dist/chat/logic/generated-image.js +54 -23
  43. package/dist/chat/logic/goal.js +28 -20
  44. package/dist/chat/logic/handback.js +6 -6
  45. package/dist/chat/logic/json.js +2 -2
  46. package/dist/chat/logic/limit.js +46 -30
  47. package/dist/chat/logic/picker-entries.d.ts +5 -3
  48. package/dist/chat/logic/picker-entries.js +83 -43
  49. package/dist/chat/logic/resume-compaction.d.ts +14 -1
  50. package/dist/chat/logic/resume-compaction.js +93 -24
  51. package/dist/chat/logic/scrubber.js +188 -136
  52. package/dist/chat/logic/thought.js +13 -16
  53. package/dist/chat/logic/thread-cards.js +60 -48
  54. package/dist/chat/logic/timeline-copy.js +30 -38
  55. package/dist/chat/logic/timeline-target.js +92 -63
  56. package/dist/chat/logic/timeline.js +499 -355
  57. package/dist/chat/logic/tool-catalog.js +54 -34
  58. package/dist/chat/logic/tools.js +106 -82
  59. package/dist/chat/logic/visual-height.js +18 -18
  60. package/dist/chat/logic/visual-viewport.js +6 -3
  61. package/dist/chat/logic/welcome.js +9 -9
  62. package/dist/chat/logic/workflow.d.ts +10 -0
  63. package/dist/chat/logic/workflow.js +130 -32
  64. package/dist/chat/mentions.js +149 -109
  65. package/dist/chat/persisted-json.js +51 -54
  66. package/dist/chat/preferences.d.ts +4 -0
  67. package/dist/chat/preferences.js +162 -84
  68. package/dist/chat/prompt-hold.js +9 -9
  69. package/dist/chat/quote.js +21 -30
  70. package/dist/chat/reading-width.js +12 -10
  71. package/dist/chat/recent-messages.js +34 -21
  72. package/dist/chat/resume-compaction-dismissals.js +25 -5
  73. package/dist/chat/runtime-modes.js +3 -3
  74. package/dist/chat/send-key.js +11 -7
  75. package/dist/chat/stash.js +89 -69
  76. package/dist/chat/subagent-conversation.js +181 -139
  77. package/dist/chat/subagent-list.js +65 -67
  78. package/dist/chat/subagent-support.js +12 -7
  79. package/dist/chat/subagent-view.js +132 -44
  80. package/dist/chat/thumbnails.js +88 -60
  81. package/dist/chat/timeline-flash.js +24 -12
  82. package/dist/chat/timeline-scroll.js +116 -86
  83. package/dist/chat/ui/AccountPill.js +126 -15
  84. package/dist/chat/ui/AnsiOutput.js +62 -6
  85. package/dist/chat/ui/BookmarkMarker.js +231 -41
  86. package/dist/chat/ui/BookmarkSubmenu.js +165 -18
  87. package/dist/chat/ui/ChatActivity.js +649 -70
  88. package/dist/chat/ui/ChatReferenceChip.js +104 -9
  89. package/dist/chat/ui/CodeBlock.js +132 -58
  90. package/dist/chat/ui/Composer.js +866 -132
  91. package/dist/chat/ui/ComposerInput.js +309 -120
  92. package/dist/chat/ui/DiffPool.js +75 -14
  93. package/dist/chat/ui/EditDiff.js +160 -21
  94. package/dist/chat/ui/FadingWords.js +32 -3
  95. package/dist/chat/ui/GoalDock.js +235 -42
  96. package/dist/chat/ui/ImageView.js +617 -61
  97. package/dist/chat/ui/LimitState.js +446 -72
  98. package/dist/chat/ui/Markdown.js +991 -173
  99. package/dist/chat/ui/MermaidBlock.js +285 -79
  100. package/dist/chat/ui/MessageActions.js +251 -39
  101. package/dist/chat/ui/ModelMarks.js +55 -5
  102. package/dist/chat/ui/Pickers.js +664 -113
  103. package/dist/chat/ui/PromptComposer.js +281 -51
  104. package/dist/chat/ui/QuoteButton.js +151 -57
  105. package/dist/chat/ui/ResumeCompactionDock.d.ts +6 -2
  106. package/dist/chat/ui/ResumeCompactionDock.js +141 -6
  107. package/dist/chat/ui/RowTime.js +59 -5
  108. package/dist/chat/ui/RunSettings.js +1744 -154
  109. package/dist/chat/ui/Scrubber.js +517 -88
  110. package/dist/chat/ui/ShellCommand.js +183 -107
  111. package/dist/chat/ui/SubagentControls.js +212 -24
  112. package/dist/chat/ui/SubagentInfo.js +170 -13
  113. package/dist/chat/ui/SubagentStopButton.js +115 -24
  114. package/dist/chat/ui/SubagentTimeline.js +357 -91
  115. package/dist/chat/ui/Timeline.js +988 -476
  116. package/dist/chat/ui/TimelineMenu.js +552 -37
  117. package/dist/chat/ui/UnifiedDiff.js +234 -27
  118. package/dist/chat/ui/UploadThumb.js +37 -7
  119. package/dist/chat/ui/VisualDialogs.js +251 -20
  120. package/dist/chat/ui/VisualFrame.js +321 -95
  121. package/dist/chat/ui/Welcome.js +72 -7
  122. package/dist/chat/ui/chips.js +1 -1
  123. package/dist/chat/ui/code-lines.js +36 -36
  124. package/dist/chat/ui/code-streaming.js +1 -1
  125. package/dist/chat/ui/code-theme.js +7 -7
  126. package/dist/chat/ui/composer/ComposerControls.js +329 -21
  127. package/dist/chat/ui/composer/ComposerMenu.js +358 -30
  128. package/dist/chat/ui/composer/DraftParts.js +185 -11
  129. package/dist/chat/ui/composer/QueuedMessages.js +138 -13
  130. package/dist/chat/ui/composer/chips.js +29 -19
  131. package/dist/chat/ui/composer/editor.js +79 -63
  132. package/dist/chat/ui/composer/insert.js +26 -12
  133. package/dist/chat/ui/composer/key-handler.js +180 -127
  134. package/dist/chat/ui/composer/keys.js +90 -73
  135. package/dist/chat/ui/composer/menu-aria.js +18 -9
  136. package/dist/chat/ui/composer/placeholder.js +78 -31
  137. package/dist/chat/ui/composer/surface.js +13 -37
  138. package/dist/chat/ui/composer/use-chat-controls.js +230 -90
  139. package/dist/chat/ui/composer/use-compaction-offer.js +50 -18
  140. package/dist/chat/ui/composer/use-composer-draft.js +65 -34
  141. package/dist/chat/ui/composer/use-composer-menus.js +478 -193
  142. package/dist/chat/ui/composer/use-composer-submit.js +251 -109
  143. package/dist/chat/ui/composer/use-continuable-turn.js +33 -6
  144. package/dist/chat/ui/composer/use-draft-files.js +245 -93
  145. package/dist/chat/ui/composer/use-effort-stepper.d.ts +13 -0
  146. package/dist/chat/ui/composer/use-effort-stepper.js +88 -0
  147. package/dist/chat/ui/composer/use-notice.js +61 -16
  148. package/dist/chat/ui/composer/use-pending-requests.js +38 -17
  149. package/dist/chat/ui/composer/use-prompt-history.js +117 -45
  150. package/dist/chat/ui/composer/use-prompt-hold.js +119 -35
  151. package/dist/chat/ui/composer/use-take-back.js +94 -72
  152. package/dist/chat/ui/diff/ApprovalReview.js +101 -23
  153. package/dist/chat/ui/diff/DiffFallbackBoundary.js +21 -13
  154. package/dist/chat/ui/diff/DiffOmitted.js +56 -6
  155. package/dist/chat/ui/diff/DiffStack.js +92 -8
  156. package/dist/chat/ui/diff/DiffUnavailable.js +56 -6
  157. package/dist/chat/ui/diff/EditorEditDiff.js +263 -51
  158. package/dist/chat/ui/diff/EditorPatchDiff.js +39 -14
  159. package/dist/chat/ui/diff/LegacyDiffPool.js +27 -10
  160. package/dist/chat/ui/diff/LegacyEditDiff.js +97 -20
  161. package/dist/chat/ui/diff/LegacyUnifiedDiff.js +172 -42
  162. package/dist/chat/ui/diff/RawDiff.js +65 -5
  163. package/dist/chat/ui/diff/ReviewDiff.js +77 -5
  164. package/dist/chat/ui/diff/diff-props.js +1 -1
  165. package/dist/chat/ui/diff/diff-source-budget.js +46 -35
  166. package/dist/chat/ui/diff/editor-edit-model.js +18 -14
  167. package/dist/chat/ui/diff/review-plan.js +63 -40
  168. package/dist/chat/ui/diff/review-settle.js +24 -9
  169. package/dist/chat/ui/diff/syntax-runtime.js +236 -201
  170. package/dist/chat/ui/diff/use-review-stack.js +146 -25
  171. package/dist/chat/ui/diff-syntax.js +70 -58
  172. package/dist/chat/ui/diff-theme.js +31 -12
  173. package/dist/chat/ui/file-links.js +39 -10
  174. package/dist/chat/ui/find-reveal.js +29 -8
  175. package/dist/chat/ui/full-diff.js +17 -12
  176. package/dist/chat/ui/highlighter.js +143 -113
  177. package/dist/chat/ui/icons.js +16 -7
  178. package/dist/chat/ui/index.js +1 -1
  179. package/dist/chat/ui/intelligent-ui/UiBlockFrame.js +556 -82
  180. package/dist/chat/ui/intelligent-ui/UiFallbackPart.js +73 -5
  181. package/dist/chat/ui/intelligent-ui/UiReply.js +666 -262
  182. package/dist/chat/ui/intelligent-ui/block-local.js +59 -31
  183. package/dist/chat/ui/intelligent-ui/chart-data.js +77 -67
  184. package/dist/chat/ui/intelligent-ui/node-text.js +77 -91
  185. package/dist/chat/ui/intelligent-ui/registry.js +46 -46
  186. package/dist/chat/ui/intelligent-ui/render-context.js +1 -1
  187. package/dist/chat/ui/intelligent-ui/renderers/base-land.js +1 -1
  188. package/dist/chat/ui/intelligent-ui/renderers/binding.js +3 -3
  189. package/dist/chat/ui/intelligent-ui/renderers/chart.js +1223 -123
  190. package/dist/chat/ui/intelligent-ui/renderers/choices.js +312 -34
  191. package/dist/chat/ui/intelligent-ui/renderers/content.js +1241 -86
  192. package/dist/chat/ui/intelligent-ui/renderers/data.js +619 -54
  193. package/dist/chat/ui/intelligent-ui/renderers/inputs.js +868 -67
  194. package/dist/chat/ui/intelligent-ui/renderers/links.js +366 -62
  195. package/dist/chat/ui/intelligent-ui/renderers/map-slots.js +118 -60
  196. package/dist/chat/ui/intelligent-ui/renderers/map-style.js +85 -78
  197. package/dist/chat/ui/intelligent-ui/renderers/map-view.js +282 -217
  198. package/dist/chat/ui/intelligent-ui/renderers/map.js +621 -69
  199. package/dist/chat/ui/intelligent-ui/renderers/place-point.js +15 -8
  200. package/dist/chat/ui/intelligent-ui/renderers/structure.js +262 -20
  201. package/dist/chat/ui/intelligent-ui/renderers/text.js +674 -49
  202. package/dist/chat/ui/intelligent-ui/reply-parts.js +24 -15
  203. package/dist/chat/ui/intelligent-ui/table-data.js +97 -57
  204. package/dist/chat/ui/intelligent-ui/tones.js +31 -31
  205. package/dist/chat/ui/intelligent-ui/use-in-view.js +30 -12
  206. package/dist/chat/ui/intelligent-ui/use-later.js +28 -13
  207. package/dist/chat/ui/intelligent-ui/use-truncated.js +45 -21
  208. package/dist/chat/ui/intelligent-ui/use-ui-links.js +296 -109
  209. package/dist/chat/ui/intelligent-ui/use-ui-queries.js +256 -246
  210. package/dist/chat/ui/markdown-blocks.js +296 -262
  211. package/dist/chat/ui/mermaid.d.ts +8 -20
  212. package/dist/chat/ui/mermaid.js +47 -84
  213. package/dist/chat/ui/quote-selection.js +32 -29
  214. package/dist/chat/ui/rehype-chips.js +35 -23
  215. package/dist/chat/ui/rehype-fade.js +28 -17
  216. package/dist/chat/ui/remark-html-as-text.js +22 -15
  217. package/dist/chat/ui/reply-context.js +1 -1
  218. package/dist/chat/ui/reveal.js +161 -72
  219. package/dist/chat/ui/rows/ForksRow.js +226 -24
  220. package/dist/chat/ui/rows/GeneratedImageRow.js +541 -87
  221. package/dist/chat/ui/rows/MessageRows.js +1706 -159
  222. package/dist/chat/ui/rows/RowContainer.js +57 -7
  223. package/dist/chat/ui/rows/Rows.js +463 -54
  224. package/dist/chat/ui/rows/SubagentRow.js +577 -60
  225. package/dist/chat/ui/rows/TaskRow.js +359 -40
  226. package/dist/chat/ui/rows/VisualRow.js +233 -11
  227. package/dist/chat/ui/rows/WorkRows.d.ts +3 -0
  228. package/dist/chat/ui/rows/WorkRows.js +1945 -164
  229. package/dist/chat/ui/rows/WorkflowRow.js +756 -37
  230. package/dist/chat/ui/rows/row-rhythm.js +27 -17
  231. package/dist/chat/ui/theme-watch.js +26 -23
  232. package/dist/chat/ui/timestamp-format.js +4 -1
  233. package/dist/chat/ui/use-diff-source-tokens.js +70 -34
  234. package/dist/chat/ui/useToggleSet.js +51 -19
  235. package/dist/chat/ui/visual-theme.js +153 -128
  236. package/dist/chat/visual-bridge.js +123 -123
  237. package/dist/chat/visual-viewport.js +94 -83
  238. package/dist/chat/visuals.js +13 -5
  239. package/dist/host-hooks.d.ts +29 -0
  240. package/dist/host-hooks.js +78 -0
  241. package/dist/host.js +120 -48
  242. package/dist/index.js +1 -1
  243. package/dist/lazy.js +38 -32
  244. package/dist/locales/en/agent-chat.d.ts +42 -0
  245. package/dist/locales/en/agent-chat.js +755 -713
  246. package/dist/locales/en/agent-prompts.js +42 -42
  247. package/dist/locales/en/agent-providers.d.ts +1 -0
  248. package/dist/locales/en/agent-providers.js +166 -165
  249. package/dist/locales/en/agent-usage.d.ts +6 -0
  250. package/dist/locales/en/agent-usage.js +129 -123
  251. package/dist/locales/nl/agent-chat.d.ts +42 -0
  252. package/dist/locales/nl/agent-chat.js +755 -713
  253. package/dist/locales/nl/agent-prompts.js +42 -42
  254. package/dist/locales/nl/agent-providers.d.ts +1 -0
  255. package/dist/locales/nl/agent-providers.js +166 -165
  256. package/dist/locales/nl/agent-usage.d.ts +6 -0
  257. package/dist/locales/nl/agent-usage.js +129 -123
  258. package/dist/locales.js +14 -14
  259. package/dist/mounted-registry.js +31 -30
  260. package/dist/port-transport.js +122 -111
  261. package/dist/prompts/index.js +1 -1
  262. package/dist/prompts/logic/focus.js +15 -14
  263. package/dist/prompts/logic/keys.js +93 -59
  264. package/dist/prompts/logic/prompts.js +27 -14
  265. package/dist/prompts/logic/subjects.js +60 -46
  266. package/dist/prompts/logic/useFocusAfterAnswer.js +60 -20
  267. package/dist/prompts/logic/usePromptSession.js +88 -77
  268. package/dist/prompts/ui/ApprovalBody.js +246 -27
  269. package/dist/prompts/ui/PromptActions.js +215 -9
  270. package/dist/prompts/ui/PromptCard.js +215 -36
  271. package/dist/prompts/ui/PromptView.js +372 -34
  272. package/dist/prompts/ui/QuestionBody.js +269 -73
  273. package/dist/providers/AccountColors.js +36 -5
  274. package/dist/providers/AccountDetail.js +683 -50
  275. package/dist/providers/AccountVariables.js +139 -32
  276. package/dist/providers/AddAccountForm.js +125 -38
  277. package/dist/providers/CliDetail.js +343 -36
  278. package/dist/providers/InstallPage.js +644 -59
  279. package/dist/providers/ProviderList.d.ts +2 -1
  280. package/dist/providers/ProviderList.js +215 -23
  281. package/dist/providers/ProvidersPane.d.ts +4 -2
  282. package/dist/providers/ProvidersPane.js +244 -64
  283. package/dist/providers/account-actions.js +54 -30
  284. package/dist/providers/index.js +1 -1
  285. package/dist/providers/install-steps.js +12 -9
  286. package/dist/providers/pane-target.d.ts +3 -0
  287. package/dist/providers/pane-target.js +34 -13
  288. package/dist/providers/parts.js +62 -12
  289. package/dist/providers/provider-abilities.js +5 -5
  290. package/dist/providers/provider-groups.js +75 -40
  291. package/dist/providers/variables.js +73 -39
  292. package/dist/scope.js +6 -6
  293. package/dist/settings/sections.js +18 -18
  294. package/dist/state/chats.js +404 -192
  295. package/dist/state/index.js +1 -1
  296. package/dist/state/provider-accounts.js +70 -47
  297. package/dist/state/providers.js +45 -16
  298. package/dist/state/usage.js +154 -77
  299. package/dist/storage.js +69 -68
  300. package/dist/testing/index.js +1 -1
  301. package/dist/testing/prompts.js +105 -67
  302. package/dist/transport.js +10 -10
  303. package/dist/ui/PlainTextarea.js +27 -3
  304. package/dist/usage/LimitsList.js +646 -40
  305. package/dist/usage/UsageBreakdown.js +879 -38
  306. package/dist/usage/UsageChart.js +311 -32
  307. package/dist/usage/UsageDialog.js +46 -4
  308. package/dist/usage/UsageLimits.js +467 -34
  309. package/dist/usage/UsageLimitsCard.js +95 -11
  310. package/dist/usage/UsagePage.js +817 -96
  311. package/dist/usage/UsagePane.js +164 -10
  312. package/dist/usage/UsageSummary.js +151 -6
  313. package/dist/usage/UsageTiles.js +164 -14
  314. package/dist/usage/format.js +32 -32
  315. package/dist/usage/index.d.ts +1 -1
  316. package/dist/usage/index.js +2 -1
  317. package/dist/usage/limit-groups.d.ts +2 -0
  318. package/dist/usage/limit-groups.js +77 -59
  319. package/dist/usage/limits.js +78 -43
  320. package/dist/usage/money.js +20 -4
  321. package/dist/usage/summary.js +85 -64
  322. package/package.json +9 -9
  323. package/src/agents/ModelOptionControl.tsx +3 -1
  324. package/src/agents/option-words.ts +27 -0
  325. package/src/chat/account-choice.ts +41 -1
  326. package/src/chat/composer-effort.ts +32 -0
  327. package/src/chat/forks.ts +4 -5
  328. package/src/chat/index.ts +3 -1
  329. package/src/chat/logic/effort.ts +32 -0
  330. package/src/chat/logic/picker-entries.ts +45 -10
  331. package/src/chat/logic/resume-compaction.ts +95 -17
  332. package/src/chat/logic/timeline.ts +11 -3
  333. package/src/chat/logic/workflow.ts +86 -4
  334. package/src/chat/preferences.ts +35 -0
  335. package/src/chat/subagent-view.ts +2 -3
  336. package/src/chat/ui/AnsiOutput.tsx +1 -2
  337. package/src/chat/ui/BookmarkSubmenu.tsx +3 -3
  338. package/src/chat/ui/ChatActivity.tsx +14 -22
  339. package/src/chat/ui/ChatReferenceChip.tsx +2 -3
  340. package/src/chat/ui/Composer.tsx +15 -7
  341. package/src/chat/ui/EditDiff.tsx +2 -3
  342. package/src/chat/ui/LimitState.tsx +2 -2
  343. package/src/chat/ui/Markdown.tsx +10 -8
  344. package/src/chat/ui/MermaidBlock.tsx +57 -49
  345. package/src/chat/ui/Pickers.tsx +49 -29
  346. package/src/chat/ui/PromptComposer.tsx +7 -9
  347. package/src/chat/ui/ResumeCompactionDock.tsx +16 -4
  348. package/src/chat/ui/RunSettings.tsx +67 -28
  349. package/src/chat/ui/Scrubber.tsx +3 -3
  350. package/src/chat/ui/ShellCommand.tsx +2 -0
  351. package/src/chat/ui/SubagentInfo.tsx +2 -3
  352. package/src/chat/ui/SubagentTimeline.tsx +12 -16
  353. package/src/chat/ui/Timeline.tsx +6 -6
  354. package/src/chat/ui/UnifiedDiff.tsx +3 -4
  355. package/src/chat/ui/VisualFrame.tsx +5 -8
  356. package/src/chat/ui/code-theme.ts +4 -4
  357. package/src/chat/ui/composer/placeholder.ts +2 -2
  358. package/src/chat/ui/composer/use-compaction-offer.ts +36 -16
  359. package/src/chat/ui/composer/use-composer-menus.ts +4 -9
  360. package/src/chat/ui/composer/use-composer-submit.ts +2 -1
  361. package/src/chat/ui/composer/use-effort-stepper.ts +56 -0
  362. package/src/chat/ui/composer/use-notice.ts +2 -2
  363. package/src/chat/ui/diff/EditorEditDiff.tsx +9 -13
  364. package/src/chat/ui/diff/LegacyEditDiff.tsx +12 -17
  365. package/src/chat/ui/diff/LegacyUnifiedDiff.tsx +13 -21
  366. package/src/chat/ui/diff/use-review-stack.ts +4 -4
  367. package/src/chat/ui/diff-theme.ts +3 -3
  368. package/src/chat/ui/file-links.ts +2 -2
  369. package/src/chat/ui/intelligent-ui/UiReply.tsx +2 -0
  370. package/src/chat/ui/intelligent-ui/renderers/chart.tsx +3 -3
  371. package/src/chat/ui/intelligent-ui/renderers/content.tsx +5 -6
  372. package/src/chat/ui/intelligent-ui/renderers/map-view.tsx +2 -1
  373. package/src/chat/ui/intelligent-ui/renderers/map.tsx +2 -1
  374. package/src/chat/ui/intelligent-ui/use-truncated.ts +16 -19
  375. package/src/chat/ui/intelligent-ui/use-ui-links.ts +3 -3
  376. package/src/chat/ui/mermaid.ts +52 -96
  377. package/src/chat/ui/rows/ForksRow.tsx +3 -5
  378. package/src/chat/ui/rows/GeneratedImageRow.tsx +2 -1
  379. package/src/chat/ui/rows/MessageRows.tsx +12 -21
  380. package/src/chat/ui/rows/SubagentRow.tsx +3 -3
  381. package/src/chat/ui/rows/TaskRow.tsx +1 -1
  382. package/src/chat/ui/rows/WorkRows.tsx +11 -6
  383. package/src/chat/ui/rows/WorkflowRow.tsx +144 -54
  384. package/src/chat/ui/useToggleSet.ts +15 -18
  385. package/src/chat/ui/visual-theme.ts +2 -3
  386. package/src/host-hooks.ts +113 -0
  387. package/src/lazy.tsx +2 -0
  388. package/src/locales/en/agent-chat.ts +142 -108
  389. package/src/locales/en/agent-prompts.ts +7 -7
  390. package/src/locales/en/agent-providers.ts +35 -34
  391. package/src/locales/en/agent-usage.ts +26 -20
  392. package/src/locales/nl/agent-chat.ts +134 -100
  393. package/src/locales/nl/agent-prompts.ts +5 -5
  394. package/src/locales/nl/agent-providers.ts +33 -32
  395. package/src/locales/nl/agent-usage.ts +25 -20
  396. package/src/providers/CliDetail.tsx +2 -1
  397. package/src/providers/InstallPage.tsx +2 -4
  398. package/src/providers/ProviderList.tsx +12 -2
  399. package/src/providers/ProvidersPane.tsx +45 -15
  400. package/src/providers/pane-target.ts +20 -4
  401. package/src/state/chats.ts +2 -2
  402. package/src/usage/LimitsList.tsx +12 -13
  403. package/src/usage/UsageBreakdown.tsx +17 -6
  404. package/src/usage/UsageLimits.tsx +2 -1
  405. package/src/usage/UsagePage.tsx +3 -3
  406. package/src/usage/index.ts +1 -1
  407. package/src/usage/limit-groups.ts +12 -0
  408. package/src/usage/limits.ts +2 -2
  409. package/src/usage/money.ts +1 -2
@@ -2,149 +2,173 @@ import i18next from 'i18next';
2
2
  /* The providers whose chat a machine can fork, and go on with in a fork, are the ones with a conversation the CLI keeps. */
3
3
  export const FORKABLE_PROVIDERS = new Set(['claude', 'codex']);
4
4
  function turnsOf(items, order) {
5
- return order.flatMap((id) => {
6
- const item = items[id];
7
- return item?.kind === 'turn' ? [item] : [];
8
- });
5
+ return order.flatMap(id => {
6
+ const item = items[id];
7
+ return item?.kind === 'turn' ? [item] : [];
8
+ });
9
9
  }
10
10
  /*
11
11
  * Why a chat cannot be forked after this turn right now, or null when it can. A turn still running,
12
12
  * or any turn in the chat, is a transcript that grows while it would be copied.
13
13
  */
14
14
  export function forkRefusal(info, turn) {
15
- if (info === null || turn?.kind !== 'turn') {
16
- return i18next.t('agent-chat:fork.refusal.notInConversation');
17
- }
18
- if (!FORKABLE_PROVIDERS.has(info.provider)) {
19
- return i18next.t('agent-chat:fork.refusal.cliCannotFork');
20
- }
21
- if (info.agentSessionId === null) {
22
- return i18next.t('agent-chat:fork.refusal.noConversation');
23
- }
24
- if (turn.state === 'running' || info.activeTurnId !== null) {
25
- return i18next.t('agent-chat:fork.refusal.turnRunning');
26
- }
27
- return null;
15
+ if (info === null || turn?.kind !== 'turn') {
16
+ return i18next.t('agent-chat:fork.refusal.notInConversation');
17
+ }
18
+ if (!FORKABLE_PROVIDERS.has(info.provider)) {
19
+ return i18next.t('agent-chat:fork.refusal.cliCannotFork');
20
+ }
21
+ if (info.agentSessionId === null) {
22
+ return i18next.t('agent-chat:fork.refusal.noConversation');
23
+ }
24
+ if (turn.state === 'running' || info.activeTurnId !== null) {
25
+ return i18next.t('agent-chat:fork.refusal.turnRunning');
26
+ }
27
+ return null;
28
28
  }
29
29
  /* Why a fork cannot write a summary for its original right now, or null when it can. */
30
30
  export function summaryRefusal(state) {
31
- if (!state.originalPresent) {
32
- return i18next.t('agent-chat:fork.refusal.originalGone');
33
- }
34
- if (state.busy) {
35
- return i18next.t('agent-chat:fork.refusal.turnRunning');
36
- }
37
- return null;
31
+ if (!state.originalPresent) {
32
+ return i18next.t('agent-chat:fork.refusal.originalGone');
33
+ }
34
+ if (state.busy) {
35
+ return i18next.t('agent-chat:fork.refusal.turnRunning');
36
+ }
37
+ return null;
38
38
  }
39
39
  /* The forks this client knows of that went on after this turn of this chat, in the order it holds them. */
40
40
  export function forkIdsAfter(infos, chatId, turnId) {
41
- const ids = [];
42
- for (const info of infos) {
43
- if (info.forkOf?.chatId === chatId && info.forkOf.turnId === turnId) {
44
- ids.push(info.chatId);
45
- }
41
+ const ids = [];
42
+ for (const info of infos) {
43
+ if (info.forkOf?.chatId === chatId && info.forkOf.turnId === turnId) {
44
+ ids.push(info.chatId);
46
45
  }
47
- return ids;
46
+ }
47
+ return ids;
48
48
  }
49
49
  /* The turns of this chat that at least one fork this client knows of went on after. */
50
50
  export function forkedTurnIds(infos, chatId) {
51
- const turns = new Set();
52
- for (const info of infos) {
53
- if (info.forkOf?.chatId === chatId) {
54
- turns.add(info.forkOf.turnId);
55
- }
51
+ const turns = new Set();
52
+ for (const info of infos) {
53
+ if (info.forkOf?.chatId === chatId) {
54
+ turns.add(info.forkOf.turnId);
56
55
  }
57
- return turns;
56
+ }
57
+ return turns;
58
58
  }
59
59
  /* The last turn that ended, which is where a fork from the node's menu goes on after. */
60
60
  export function lastSettledTurn(items, order) {
61
- return turnsOf(items, order).findLast((turn) => turn.state !== 'running')?.id ?? null;
61
+ return turnsOf(items, order).findLast(turn => turn.state !== 'running')?.id ?? null;
62
62
  }
63
63
  export function forkPointOf(items, order, turnId, whole) {
64
- const turns = turnsOf(items, order);
65
- const index = turns.findIndex((turn) => turn.id === turnId);
66
- const turn = turns[index];
67
- if (turn === undefined) {
68
- return null;
69
- }
70
- const asked = order.map((id) => items[id]).find((item) => item?.kind === 'user' && item.turnId === turnId);
71
- const text = asked?.kind === 'user' ? asked.text : (turn.label ?? '');
72
- const prompt = text
73
- .split('\n')
74
- .find((line) => line.trim() !== '')
75
- ?.trim() ?? null;
76
- return { turnId, number: index + 1, total: turns.length, counted: whole, last: index === turns.length - 1, prompt };
64
+ const turns = turnsOf(items, order);
65
+ const index = turns.findIndex(turn => turn.id === turnId);
66
+ const turn = turns[index];
67
+ if (turn === undefined) {
68
+ return null;
69
+ }
70
+ const asked = order.map(id => items[id]).find(item => item?.kind === 'user' && item.turnId === turnId);
71
+ const text = asked?.kind === 'user' ? asked.text : turn.label ?? '';
72
+ const prompt = text.split('\n').find(line => line.trim() !== '')?.trim() ?? null;
73
+ return {
74
+ turnId,
75
+ number: index + 1,
76
+ total: turns.length,
77
+ counted: whole,
78
+ last: index === turns.length - 1,
79
+ prompt
80
+ };
77
81
  }
78
82
  /* The line at the top of the dialog: which turn, and what it was about. */
79
83
  export function forkPointLabel(point, maxPrompt = 60) {
80
- const where = point.last
81
- ? i18next.t('agent-chat:fork.point.afterLast')
82
- : point.counted
83
- ? i18next.t('agent-chat:fork.point.afterTurn', { number: point.number, total: point.total })
84
- : i18next.t('agent-chat:fork.point.afterThis');
85
- if (point.prompt === null) {
86
- return where;
87
- }
88
- const prompt = point.prompt.length > maxPrompt ? `${point.prompt.slice(0, maxPrompt - 1)}…` : point.prompt;
89
- return i18next.t('agent-chat:fork.point.about', { where, prompt });
84
+ const where = point.last ? i18next.t('agent-chat:fork.point.afterLast') : point.counted ? i18next.t('agent-chat:fork.point.afterTurn', {
85
+ number: point.number,
86
+ total: point.total
87
+ }) : i18next.t('agent-chat:fork.point.afterThis');
88
+ if (point.prompt === null) {
89
+ return where;
90
+ }
91
+ const prompt = point.prompt.length > maxPrompt ? `${point.prompt.slice(0, maxPrompt - 1)}…` : point.prompt;
92
+ return i18next.t('agent-chat:fork.point.about', {
93
+ where,
94
+ prompt
95
+ });
90
96
  }
91
97
  /* The turn a row of the thread belongs to, which is the turn "Fork from here" on that row goes on after. */
92
98
  export function turnIdOfRow(row) {
93
- switch (row.kind) {
94
- case 'turn-start':
95
- case 'turn-fold':
96
- return row.turn.id;
97
- case 'changed-files':
98
- case 'forks':
99
- return row.turnId;
100
- case 'work':
101
- case 'work-live':
102
- case 'workflow':
103
- return row.tool.turnId;
104
- case 'work-group':
105
- return row.tools[0]?.turnId ?? null;
106
- case 'visual':
107
- return row.visual.turnId ?? null;
108
- case 'user':
109
- case 'assistant':
110
- case 'thinking':
111
- case 'live-thought':
112
- case 'subagent':
113
- case 'approval':
114
- case 'question':
115
- return row.item.turnId;
116
- default:
117
- return null;
118
- }
99
+ switch (row.kind) {
100
+ case 'turn-start':
101
+ case 'turn-fold':
102
+ return row.turn.id;
103
+ case 'changed-files':
104
+ case 'forks':
105
+ return row.turnId;
106
+ case 'work':
107
+ case 'work-live':
108
+ case 'workflow':
109
+ return row.tool.turnId;
110
+ case 'work-group':
111
+ return row.tools[0]?.turnId ?? null;
112
+ case 'visual':
113
+ return row.visual.turnId ?? null;
114
+ case 'user':
115
+ case 'assistant':
116
+ case 'thinking':
117
+ case 'live-thought':
118
+ case 'subagent':
119
+ case 'approval':
120
+ case 'question':
121
+ return row.item.turnId;
122
+ default:
123
+ return null;
124
+ }
119
125
  }
120
126
  /* What the dialog offers, first the default: a view forks into a view, and a node into a node or, when asked, a view. */
121
127
  export function forkShapes(origin) {
122
- return origin === 'view' ? ['view'] : ['node', 'view'];
128
+ return origin === 'view' ? ['view'] : ['node', 'view'];
123
129
  }
124
130
  export function forkPayload(input) {
125
- const { cli, worktree } = input;
126
- const provider = cli !== undefined && cli.chosen.provider !== cli.original.provider ? cli.chosen.provider : null;
127
- const selection = cli !== undefined && (provider !== null || cli.chosen.selection.model !== cli.original.selection.model) ? cli.chosen.selection : null;
128
- const account = cli?.chosen.account !== undefined && (provider !== null || cli.chosen.account !== cli.original.account) ? cli.chosen.account : null;
129
- return {
130
- chatId: input.chatId,
131
- turnId: input.turnId,
132
- title: input.title,
133
- ...(input.shape === 'view' ? { asView: true } : {}),
134
- ...(provider === null ? {} : { provider }),
135
- ...(selection === null ? {} : { selection }),
136
- ...(account === null ? {} : { account }),
137
- ...(worktree ? { worktree: { branch: worktree.branch }, ...(worktree.filesAfterTurn ? { filesAfterTurn: true } : {}) } : {})
138
- };
131
+ const {
132
+ cli,
133
+ worktree
134
+ } = input;
135
+ const provider = cli !== undefined && cli.chosen.provider !== cli.original.provider ? cli.chosen.provider : null;
136
+ const selection = cli !== undefined && (provider !== null || cli.chosen.selection.model !== cli.original.selection.model) ? cli.chosen.selection : null;
137
+ const account = cli?.chosen.account !== undefined && (provider !== null || cli.chosen.account !== cli.original.account) ? cli.chosen.account : null;
138
+ return {
139
+ chatId: input.chatId,
140
+ turnId: input.turnId,
141
+ title: input.title,
142
+ ...(input.shape === 'view' ? {
143
+ asView: true
144
+ } : {}),
145
+ ...(provider === null ? {} : {
146
+ provider
147
+ }),
148
+ ...(selection === null ? {} : {
149
+ selection
150
+ }),
151
+ ...(account === null ? {} : {
152
+ account
153
+ }),
154
+ ...(worktree ? {
155
+ worktree: {
156
+ branch: worktree.branch
157
+ },
158
+ ...(worktree.filesAfterTurn ? {
159
+ filesAfterTurn: true
160
+ } : {})
161
+ } : {})
162
+ };
139
163
  }
140
164
  /* Why a branch cannot be the fork's, or null when it can. */
141
165
  export function branchRefusal(branch, taken) {
142
- const name = branch.trim();
143
- if (name === '') {
144
- return i18next.t('agent-chat:fork.branch.unnamed');
145
- }
146
- if (taken.includes(name)) {
147
- return i18next.t('agent-chat:fork.branch.taken');
148
- }
149
- return null;
150
- }
166
+ const name = branch.trim();
167
+ if (name === '') {
168
+ return i18next.t('agent-chat:fork.branch.unnamed');
169
+ }
170
+ if (taken.includes(name)) {
171
+ return i18next.t('agent-chat:fork.branch.taken');
172
+ }
173
+ return null;
174
+ }
@@ -1,32 +1,63 @@
1
1
  import { CHAT_ATTACHMENT_MAX_BYTES, GeneratedImageInputSchema } from '@adecore/agent-contracts';
2
2
  export const IMAGE_GENERATION_TOOL = 'ImageGeneration';
3
3
  export function isImageGeneration(tool) {
4
- return tool.name === IMAGE_GENERATION_TOOL;
4
+ return tool.name === IMAGE_GENERATION_TOOL;
5
5
  }
6
6
  /* What the row of an image generation draws, from the tool call alone. */
7
7
  export function generatedImageView(tool) {
8
- if (tool.state === 'running') {
9
- return { state: 'generating' };
10
- }
11
- const parsed = GeneratedImageInputSchema.safeParse(tool.input);
12
- const input = parsed.success ? parsed.data : {};
13
- const output = tool.output?.trim() || null;
14
- if (tool.state === 'error' || input.attachment === undefined) {
15
- return { state: 'failed', failure: output === null && tool.state !== 'error' ? { kind: 'empty' } : { kind: 'provider', message: output } };
16
- }
17
- const attachment = input.attachment;
18
- if (attachment.size === 0) {
19
- return { state: 'failed', failure: { kind: 'empty' } };
20
- }
21
- if (!attachment.mime.startsWith('image/')) {
22
- return { state: 'failed', failure: { kind: 'not-image' } };
23
- }
24
- if (attachment.size > CHAT_ATTACHMENT_MAX_BYTES) {
25
- return { state: 'failed', failure: { kind: 'too-large', limit: CHAT_ATTACHMENT_MAX_BYTES } };
26
- }
27
- return { state: 'ready', attachment, prompt: input.revisedPrompt?.trim() || null, transparent: input.transparentBackground === true };
8
+ if (tool.state === 'running') {
9
+ return {
10
+ state: 'generating'
11
+ };
12
+ }
13
+ const parsed = GeneratedImageInputSchema.safeParse(tool.input);
14
+ const input = parsed.success ? parsed.data : {};
15
+ const output = tool.output?.trim() || null;
16
+ if (tool.state === 'error' || input.attachment === undefined) {
17
+ return {
18
+ state: 'failed',
19
+ failure: output === null && tool.state !== 'error' ? {
20
+ kind: 'empty'
21
+ } : {
22
+ kind: 'provider',
23
+ message: output
24
+ }
25
+ };
26
+ }
27
+ const attachment = input.attachment;
28
+ if (attachment.size === 0) {
29
+ return {
30
+ state: 'failed',
31
+ failure: {
32
+ kind: 'empty'
33
+ }
34
+ };
35
+ }
36
+ if (!attachment.mime.startsWith('image/')) {
37
+ return {
38
+ state: 'failed',
39
+ failure: {
40
+ kind: 'not-image'
41
+ }
42
+ };
43
+ }
44
+ if (attachment.size > CHAT_ATTACHMENT_MAX_BYTES) {
45
+ return {
46
+ state: 'failed',
47
+ failure: {
48
+ kind: 'too-large',
49
+ limit: CHAT_ATTACHMENT_MAX_BYTES
50
+ }
51
+ };
52
+ }
53
+ return {
54
+ state: 'ready',
55
+ attachment,
56
+ prompt: input.revisedPrompt?.trim() || null,
57
+ transparent: input.transparentBackground === true
58
+ };
28
59
  }
29
60
  /* Width over height, when the attachment carries both. */
30
61
  export function attachmentAspect(attachment) {
31
- return attachment.width !== undefined && attachment.height !== undefined ? attachment.width / attachment.height : undefined;
32
- }
62
+ return attachment.width !== undefined && attachment.height !== undefined ? attachment.width / attachment.height : undefined;
63
+ }
@@ -4,23 +4,31 @@
4
4
  * turns, and a goal it already met clears itself.
5
5
  */
6
6
  export function goalView(info, goals, canAct) {
7
- const goal = info.goal;
8
- if (goal === undefined) {
9
- return null;
10
- }
11
- if (!canAct || goals === undefined) {
12
- return { goal, actions: [] };
13
- }
14
- if (goals === 'command') {
15
- return { goal, actions: goal.status === 'complete' || info.activeTurnId !== null ? [] : ['clear'] };
16
- }
17
- const actions = [];
18
- if (goal.status === 'active') {
19
- actions.push('pause');
20
- }
21
- else if (goal.status !== 'complete') {
22
- actions.push('resume');
23
- }
24
- actions.push('clear');
25
- return { goal, actions };
26
- }
7
+ const goal = info.goal;
8
+ if (goal === undefined) {
9
+ return null;
10
+ }
11
+ if (!canAct || goals === undefined) {
12
+ return {
13
+ goal,
14
+ actions: []
15
+ };
16
+ }
17
+ if (goals === 'command') {
18
+ return {
19
+ goal,
20
+ actions: goal.status === 'complete' || info.activeTurnId !== null ? [] : ['clear']
21
+ };
22
+ }
23
+ const actions = [];
24
+ if (goal.status === 'active') {
25
+ actions.push('pause');
26
+ } else if (goal.status !== 'complete') {
27
+ actions.push('resume');
28
+ }
29
+ actions.push('clear');
30
+ return {
31
+ goal,
32
+ actions
33
+ };
34
+ }
@@ -1,8 +1,8 @@
1
1
  /* The report a `SubagentHandback` call carries in `input.message` (Claude Code 2.1.273), or null for any other item. */
2
2
  export function handbackReportOf(item) {
3
- if (item.kind !== 'tool' || item.name !== 'SubagentHandback' || typeof item.input !== 'object' || item.input === null) {
4
- return null;
5
- }
6
- const message = item.input.message;
7
- return typeof message === 'string' && message.trim() !== '' ? message : null;
8
- }
3
+ if (item.kind !== 'tool' || item.name !== 'SubagentHandback' || typeof item.input !== 'object' || item.input === null) {
4
+ return null;
5
+ }
6
+ const message = item.input.message;
7
+ return typeof message === 'string' && message.trim() !== '' ? message : null;
8
+ }
@@ -1,4 +1,4 @@
1
1
  /* A plain object, which is what a tool's input and a stored record are and an array is not. */
2
2
  export function isRecord(value) {
3
- return typeof value === 'object' && value !== null && !Array.isArray(value);
4
- }
3
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
4
+ }
@@ -5,33 +5,49 @@ import { formatMoment } from '@adecore/ui/format';
5
5
  * the thread says the same as the chat. Null while the last turn stopped on nothing, or a turn runs.
6
6
  */
7
7
  export function limitView(info, now) {
8
- const limit = info.limit;
9
- if (limit === undefined || info.activeTurnId !== null) {
10
- return null;
11
- }
12
- const resumes = info.resumeAt === undefined ? null : formatMoment(info.resumeAt, now);
13
- if (limit.kind === 'overload') {
14
- return {
15
- pill: resumes === null ? i18next.t('agent-chat:limit.overload.pill') : i18next.t('agent-chat:limit.overload.pillRetry', { time: resumes }),
16
- title: i18next.t('agent-chat:limit.overload.title'),
17
- detail: resumes === null ? i18next.t('agent-chat:limit.overload.sendAgain') : i18next.t('agent-chat:limit.overload.retries', { time: resumes })
18
- };
19
- }
20
- const title = i18next.t('agent-chat:limit.usage.title');
21
- if (resumes !== null) {
22
- return {
23
- pill: i18next.t('agent-chat:limit.usage.pillResumes', { time: resumes }),
24
- title,
25
- detail: i18next.t('agent-chat:limit.usage.resumes', { time: resumes })
26
- };
27
- }
28
- if (limit.resetsAt !== undefined) {
29
- const resets = formatMoment(limit.resetsAt, now);
30
- return {
31
- pill: i18next.t('agent-chat:limit.usage.pillUntil', { time: resets }),
32
- title,
33
- detail: i18next.t('agent-chat:limit.usage.resets', { time: resets })
34
- };
35
- }
36
- return { pill: i18next.t('agent-chat:limit.usage.pill'), title, detail: null };
37
- }
8
+ const limit = info.limit;
9
+ if (limit === undefined || info.activeTurnId !== null) {
10
+ return null;
11
+ }
12
+ const resumes = info.resumeAt === undefined ? null : formatMoment(info.resumeAt, now);
13
+ if (limit.kind === 'overload') {
14
+ return {
15
+ pill: resumes === null ? i18next.t('agent-chat:limit.overload.pill') : i18next.t('agent-chat:limit.overload.pillRetry', {
16
+ time: resumes
17
+ }),
18
+ title: i18next.t('agent-chat:limit.overload.title'),
19
+ detail: resumes === null ? i18next.t('agent-chat:limit.overload.sendAgain') : i18next.t('agent-chat:limit.overload.retries', {
20
+ time: resumes
21
+ })
22
+ };
23
+ }
24
+ const title = i18next.t('agent-chat:limit.usage.title');
25
+ if (resumes !== null) {
26
+ return {
27
+ pill: i18next.t('agent-chat:limit.usage.pillResumes', {
28
+ time: resumes
29
+ }),
30
+ title,
31
+ detail: i18next.t('agent-chat:limit.usage.resumes', {
32
+ time: resumes
33
+ })
34
+ };
35
+ }
36
+ if (limit.resetsAt !== undefined) {
37
+ const resets = formatMoment(limit.resetsAt, now);
38
+ return {
39
+ pill: i18next.t('agent-chat:limit.usage.pillUntil', {
40
+ time: resets
41
+ }),
42
+ title,
43
+ detail: i18next.t('agent-chat:limit.usage.resets', {
44
+ time: resets
45
+ })
46
+ };
47
+ }
48
+ return {
49
+ pill: i18next.t('agent-chat:limit.usage.pill'),
50
+ title,
51
+ detail: null
52
+ };
53
+ }
@@ -17,11 +17,13 @@ export interface PickerCurrent {
17
17
  provider: AgentKind;
18
18
  model: string;
19
19
  }
20
+ export type FavoritesOf = (kind: AgentKind) => ReadonlySet<string>;
20
21
  export declare function modelsByVendor(models: ModelInfo[]): ModelInfo[];
21
- export declare function shortlistOf(kind: AgentKind, models: ModelInfo[], current: PickerCurrent | null): ModelInfo[] | null;
22
+ export declare function favoritesFirst(models: ModelInfo[], favorites: ReadonlySet<string>): ModelInfo[];
23
+ export declare function shortlistOf(kind: AgentKind, models: ModelInfo[], current: PickerCurrent | null, favorites?: ReadonlySet<string>): ModelInfo[] | null;
22
24
  export declare function wantsModelSearch(providers: readonly ProviderInfo[]): boolean;
23
- export declare function searchModels(providers: readonly ProviderInfo[], query: string): Array<{
25
+ export declare function searchModels(providers: readonly ProviderInfo[], query: string, favoritesOf?: FavoritesOf): Array<{
24
26
  entry: ProviderInfo;
25
27
  models: ModelInfo[];
26
28
  }>;
27
- export declare function pickerEntriesOf(providers: readonly ProviderInfo[], query: string, legacyOpen: boolean, expanded?: ReadonlySet<AgentKind>, current?: PickerCurrent | null): PickerEntry[];
29
+ export declare function pickerEntriesOf(providers: readonly ProviderInfo[], query: string, legacyOpen: boolean, expanded?: ReadonlySet<AgentKind>, current?: PickerCurrent | null, favoritesOf?: FavoritesOf): PickerEntry[];