@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
@@ -4,102 +4,134 @@ import i18next from 'i18next';
4
4
  * of them (an older name, or one written by hand) reads as undefined, and the dot takes the accent.
5
5
  */
6
6
  export function accountColor(color, accents) {
7
- return accents.find((entry) => entry.id === color)?.color;
7
+ return accents.find(entry => entry.id === color)?.color;
8
8
  }
9
9
  /*
10
10
  * The variable each CLI reads its config folder from, as the host's providers name them. Only for
11
11
  * the sentence under the folder; a CLI missing here still works, the sentence just does not name it.
12
12
  */
13
- export const FOLDER_VARIABLES = { claude: 'CLAUDE_CONFIG_DIR', codex: 'CODEX_HOME' };
13
+ export const FOLDER_VARIABLES = {
14
+ claude: 'CLAUDE_CONFIG_DIR',
15
+ codex: 'CODEX_HOME'
16
+ };
14
17
  /* The accounts of one CLI, its default one first and the others in the order the machine keeps them. */
15
18
  export function accountsOfKind(accounts, kind) {
16
- if (accounts === null) {
17
- return [];
18
- }
19
- const statuses = new Map(accounts.statuses.map((status) => [status.id, status]));
20
- return Object.entries(accounts.accounts)
21
- .filter(([, account]) => account.kind === kind)
22
- .map(([id, account]) => ({ id, account, status: statuses.get(id) ?? null, isDefault: id === kind }))
23
- .sort((a, b) => Number(b.isDefault) - Number(a.isDefault));
19
+ if (accounts === null) {
20
+ return [];
21
+ }
22
+ const statuses = new Map(accounts.statuses.map(status => [status.id, status]));
23
+ return Object.entries(accounts.accounts).filter(([, account]) => account.kind === kind).map(([id, account]) => ({
24
+ id,
25
+ account,
26
+ status: statuses.get(id) ?? null,
27
+ isDefault: id === kind
28
+ })).sort((a, b) => Number(b.isDefault) - Number(a.isDefault));
24
29
  }
25
30
  /* A default account nobody named goes by its CLI's name. */
26
31
  export function accountName(entry, providerName) {
27
- return entry.account.label ?? (entry.isDefault ? providerName : entry.id);
32
+ return entry.account.label ?? (entry.isDefault ? providerName : entry.id);
28
33
  }
29
34
  export function accountLoginOf(accounts, kind) {
30
- if (accounts?.loginCommands?.[kind] !== undefined) {
31
- return 'terminal';
32
- }
33
- return accounts?.chatLogins?.includes(kind) === true ? 'chat' : null;
35
+ if (accounts?.loginCommands?.[kind] !== undefined) {
36
+ return 'terminal';
37
+ }
38
+ return accounts?.chatLogins?.includes(kind) === true ? 'chat' : null;
34
39
  }
35
40
  export const ACCOUNT_TONE_CLASSES = {
36
- muted: 'text-text-muted',
37
- 'needs-you': 'text-status-needs-you',
38
- error: 'text-status-error'
41
+ muted: 'text-text-muted',
42
+ 'needs-you': 'text-status-needs-you',
43
+ error: 'text-status-error'
39
44
  };
40
45
  /*
41
46
  * What an account's row says about it, in a few words. `canLogIn` is false for a CLI without a config
42
47
  * folder: it has no login of its own to report, so being there is all a ready one says.
43
48
  */
44
49
  export function accountStatusLine(status, canLogIn) {
45
- const words = (key, values) => i18next.t(`agent-providers:status.${key}`, values);
46
- switch (status?.state ?? 'checking') {
47
- case 'checking':
48
- return { text: words('checking'), tone: 'muted' };
49
- case 'disabled':
50
- return { text: words('disabled'), tone: 'muted' };
51
- case 'not-found':
52
- return { text: words('notFound'), tone: 'muted' };
53
- case 'signed-out':
54
- return { text: words('signedOut'), tone: 'needs-you' };
55
- case 'ready':
56
- if (!canLogIn) {
57
- return { text: words('available'), tone: 'muted' };
58
- }
59
- return { text: status?.plan ? words('readyPlan', { plan: status.plan }) : words('ready'), tone: 'muted' };
60
- case 'folder-missing':
61
- return { text: words('folderMissing'), tone: 'error' };
62
- case 'unavailable':
63
- return { text: words('unavailable'), tone: 'muted' };
64
- case 'failed':
65
- return { text: words('failed'), tone: 'error' };
66
- }
50
+ const words = (key, values) => i18next.t(`agent-providers:status.${key}`, values);
51
+ switch (status?.state ?? 'checking') {
52
+ case 'checking':
53
+ return {
54
+ text: words('checking'),
55
+ tone: 'muted'
56
+ };
57
+ case 'disabled':
58
+ return {
59
+ text: words('disabled'),
60
+ tone: 'muted'
61
+ };
62
+ case 'not-found':
63
+ return {
64
+ text: words('notFound'),
65
+ tone: 'muted'
66
+ };
67
+ case 'signed-out':
68
+ return {
69
+ text: words('signedOut'),
70
+ tone: 'needs-you'
71
+ };
72
+ case 'ready':
73
+ if (!canLogIn) {
74
+ return {
75
+ text: words('available'),
76
+ tone: 'muted'
77
+ };
78
+ }
79
+ return {
80
+ text: status?.plan ? words('readyPlan', {
81
+ plan: status.plan
82
+ }) : words('ready'),
83
+ tone: 'muted'
84
+ };
85
+ case 'folder-missing':
86
+ return {
87
+ text: words('folderMissing'),
88
+ tone: 'error'
89
+ };
90
+ case 'unavailable':
91
+ return {
92
+ text: words('unavailable'),
93
+ tone: 'muted'
94
+ };
95
+ case 'failed':
96
+ return {
97
+ text: words('failed'),
98
+ tone: 'error'
99
+ };
100
+ }
67
101
  }
68
102
  /* The part of a name an id can hold, the way the machine makes one: `Work (EU)` becomes `work-eu`. */
69
103
  function slugOf(label) {
70
- return label
71
- .normalize('NFKD')
72
- .replace(/[̀-ͯ]/g, '')
73
- .toLowerCase()
74
- .replace(/[^a-z0-9]+/g, '-')
75
- .replace(/^-+|-+$/g, '');
104
+ return label.normalize('NFKD').replace(/[̀-ͯ]/g, '').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
76
105
  }
77
106
  /* A free id for an account a person links to a folder of their own; one the machine makes gets its id from the machine. */
78
107
  export function mintAccountId(kind, label, taken) {
79
- const base = `${kind}_${slugOf(label) || 'account'}`.slice(0, 60).replace(/-+$/, '');
80
- let id = base;
81
- for (let suffix = 2; taken.has(id); suffix += 1) {
82
- id = `${base}-${suffix}`;
83
- }
84
- return id;
108
+ const base = `${kind}_${slugOf(label) || 'account'}`.slice(0, 60).replace(/-+$/, '');
109
+ let id = base;
110
+ for (let suffix = 2; taken.has(id); suffix += 1) {
111
+ id = `${base}-${suffix}`;
112
+ }
113
+ return id;
85
114
  }
86
115
  /*
87
116
  * The first featured accent no account of the CLI wears yet, then any other, so a new one stands apart.
88
117
  * An account without a color of its own wears `fallback`, the accent the app is painted in.
89
118
  */
90
119
  export function freeAccountColor(entries, accents, fallback) {
91
- const { all, featured } = accents;
92
- const worn = new Set(entries.map((entry) => (accountColor(entry.account.color, all) === undefined ? fallback : entry.account.color)));
93
- const choices = [...featured, ...all.map((entry) => entry.id).filter((id) => !featured.includes(id))];
94
- return choices.find((id) => !worn.has(id)) ?? featured[entries.length % featured.length] ?? fallback;
120
+ const {
121
+ all,
122
+ featured
123
+ } = accents;
124
+ const worn = new Set(entries.map(entry => accountColor(entry.account.color, all) === undefined ? fallback : entry.account.color));
125
+ const choices = [...featured, ...all.map(entry => entry.id).filter(id => !featured.includes(id))];
126
+ return choices.find(id => !worn.has(id)) ?? featured[entries.length % featured.length] ?? fallback;
95
127
  }
96
128
  /* The accounts of a CLI a picker offers: every one that is on, and the one in use even while it is off. */
97
129
  export function offeredAccounts(entries, current) {
98
- return entries.filter((entry) => entry.account.enabled !== false || entry.id === current);
130
+ return entries.filter(entry => entry.account.enabled !== false || entry.id === current);
99
131
  }
100
132
  /* Whether a person has a choice of account for this CLI at all, which is when a chat shows its account. */
101
133
  export function hasAccountChoice(entries) {
102
- return entries.filter((entry) => entry.account.enabled !== false).length >= 2;
134
+ return entries.filter(entry => entry.account.enabled !== false).length >= 2;
103
135
  }
104
136
  /*
105
137
  * Whether a chat of one account can go on under another, the way the machine decides it: the same
@@ -107,12 +139,12 @@ export function hasAccountChoice(entries) {
107
139
  * not say where an account writes them answers no, so the person forks instead of being refused.
108
140
  */
109
141
  export function canContinueOn(accounts, kind, from, to) {
110
- const fromId = from ?? kind;
111
- const toId = to ?? kind;
112
- if (fromId === toId) {
113
- return true;
114
- }
115
- const folderOf = (id) => accounts?.accounts[id]?.kind === kind ? accounts.statuses.find((status) => status.id === id)?.transcripts : undefined;
116
- const folder = folderOf(fromId);
117
- return folder !== undefined && folder !== '' && folder === folderOf(toId);
118
- }
142
+ const fromId = from ?? kind;
143
+ const toId = to ?? kind;
144
+ if (fromId === toId) {
145
+ return true;
146
+ }
147
+ const folderOf = id => accounts?.accounts[id]?.kind === kind ? accounts.statuses.find(status => status.id === id)?.transcripts : undefined;
148
+ const folder = folderOf(fromId);
149
+ return folder !== undefined && folder !== '' && folder === folderOf(toId);
150
+ }
@@ -5,8 +5,10 @@ let hostMarks = {};
5
5
  * A later call replaces the whole set.
6
6
  */
7
7
  export function configureAgentMarks(marks) {
8
- hostMarks = { ...marks };
8
+ hostMarks = {
9
+ ...marks
10
+ };
9
11
  }
10
12
  export function hostAgentMark(kind) {
11
- return hostMarks[kind];
12
- }
13
+ return hostMarks[kind];
14
+ }
@@ -1,3 +1,4 @@
1
+ import { c as _c } from "react/compiler-runtime";
1
2
  import { useProviders } from '../state/providers.js';
2
3
  /*
3
4
  * A model id as a person reads it, for a model no catalog names: without its vendor prefix and its
@@ -5,52 +6,62 @@ import { useProviders } from '../state/providers.js';
5
6
  * 5).
6
7
  */
7
8
  export function modelNameFromSlug(slug) {
8
- const bare = slug.slice(slug.lastIndexOf('/') + 1).replace(/-\d{6,8}$/, '');
9
- const words = [];
10
- for (const word of bare.split('-')) {
11
- const previous = words.at(-1);
12
- if (previous !== undefined && /^\d+$/.test(word) && /\d$/.test(previous)) {
13
- words[words.length - 1] = `${previous}.${word}`;
14
- continue;
15
- }
16
- words.push(word);
9
+ const bare = slug.slice(slug.lastIndexOf('/') + 1).replace(/-\d{6,8}$/, '');
10
+ const words = [];
11
+ for (const word of bare.split('-')) {
12
+ const previous = words.at(-1);
13
+ if (previous !== undefined && /^\d+$/.test(word) && /\d$/.test(previous)) {
14
+ words[words.length - 1] = `${previous}.${word}`;
15
+ continue;
17
16
  }
18
- return words.map((word) => (word === 'gpt' ? 'GPT' : word.charAt(0).toUpperCase() + word.slice(1))).join(' ');
17
+ words.push(word);
18
+ }
19
+ return words.map(word => word === 'gpt' ? 'GPT' : word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
19
20
  }
20
21
  /* What the CLI calls the model, so every surface says the same thing; a slug it no longer offers is read as one. */
21
22
  export function modelName(slug, models) {
22
- return models?.find((entry) => entry.slug === slug)?.name ?? modelNameFromSlug(slug);
23
+ return models?.find(entry => entry.slug === slug)?.name ?? modelNameFromSlug(slug);
23
24
  }
24
25
  export function agentChipOf(providers, provider, model) {
25
- const owner = providers.find((entry) => entry.kind === provider);
26
- return {
27
- mark: provider === 'claude' || provider === 'codex' ? 'logo' : 'icon',
28
- name: owner?.name ?? provider,
29
- model: modelName(model, owner?.models)
30
- };
26
+ const owner = providers.find(entry => entry.kind === provider);
27
+ return {
28
+ mark: provider === 'claude' || provider === 'codex' ? 'logo' : 'icon',
29
+ name: owner?.name ?? provider,
30
+ model: modelName(model, owner?.models)
31
+ };
31
32
  }
32
33
  /* The same answer for the machine in scope, whose catalog is the only one that can name the slug. */
33
34
  export function useModelName(provider, slug) {
34
- return useProviders((state) => modelName(slug, state.providers.find((entry) => entry.kind === provider)?.models));
35
+ const $ = _c(3);
36
+ let t0;
37
+ if ($[0] !== provider || $[1] !== slug) {
38
+ t0 = state => modelName(slug, state.providers.find(entry => entry.kind === provider)?.models);
39
+ $[0] = provider;
40
+ $[1] = slug;
41
+ $[2] = t0;
42
+ } else {
43
+ t0 = $[2];
44
+ }
45
+ return useProviders(t0);
35
46
  }
36
47
  /*
37
48
  * The leading words every model of a catalog shares, so a tight spot can say `Opus 5.5` where the
38
49
  * CLI says `Claude Opus 5.5`. Whole words only, so `GPT-6` never loses its `GPT-`, and never all of a name.
39
50
  */
40
51
  export function sharedModelPrefix(models) {
41
- const names = models.map((entry) => entry.name.split(' '));
42
- const first = names[0];
43
- if (first === undefined || names.length < 2) {
44
- return '';
45
- }
46
- let count = 0;
47
- while (names.every((words) => words.length > count + 1 && words[count] === first[count])) {
48
- count++;
49
- }
50
- return count === 0 ? '' : `${first.slice(0, count).join(' ')} `;
52
+ const names = models.map(entry => entry.name.split(' '));
53
+ const first = names[0];
54
+ if (first === undefined || names.length < 2) {
55
+ return '';
56
+ }
57
+ let count = 0;
58
+ while (names.every(words => words.length > count + 1 && words[count] === first[count])) {
59
+ count++;
60
+ }
61
+ return count === 0 ? '' : `${first.slice(0, count).join(' ')} `;
51
62
  }
52
63
  /* A model's name without the words its whole catalog shares. */
53
64
  export function shortModelName(name, models) {
54
- const prefix = sharedModelPrefix(models ?? []);
55
- return prefix !== '' && name.startsWith(prefix) ? name.slice(prefix.length) : name;
56
- }
65
+ const prefix = sharedModelPrefix(models ?? []);
66
+ return prefix !== '' && name.startsWith(prefix) ? name.slice(prefix.length) : name;
67
+ }
@@ -1,15 +1,15 @@
1
1
  function fits(option, value) {
2
- return option.type === 'boolean' ? typeof value === 'boolean' : typeof value === 'string' && option.choices.some((choice) => choice.id === value);
2
+ return option.type === 'boolean' ? typeof value === 'boolean' : typeof value === 'string' && option.choices.some(choice => choice.id === value);
3
3
  }
4
4
  /* What an option runs at: the value picked, else the model's own default. A value the model does not offer counts as unpicked. */
5
5
  export function optionValue(option, options) {
6
- const picked = options[option.id];
7
- if (fits(option, picked)) {
8
- return picked;
9
- }
10
- return option.type === 'boolean' ? option.defaultValue : option.defaultChoice;
6
+ const picked = options[option.id];
7
+ if (fits(option, picked)) {
8
+ return picked;
9
+ }
10
+ return option.type === 'boolean' ? option.defaultValue : option.defaultChoice;
11
11
  }
12
12
  /* The picked options that `model` offers as well, so switching models keeps an effort the next one also has. */
13
13
  export function carryOptions(options, model) {
14
- return Object.fromEntries((model?.options ?? []).filter((option) => fits(option, options[option.id])).map((option) => [option.id, options[option.id]]));
15
- }
14
+ return Object.fromEntries((model?.options ?? []).filter(option => fits(option, options[option.id])).map(option => [option.id, options[option.id]]));
15
+ }
@@ -1,10 +1,10 @@
1
1
  function partsOf(version, strict) {
2
- const found = (strict ? /^(\d+)\.(\d+)(?:\.(\d+))?$/ : /(\d+)\.(\d+)\.(\d+)/).exec(version);
3
- return found === null ? null : [Number(found[1]), Number(found[2]), Number(found[3] ?? 0)];
2
+ const found = (strict ? /^(\d+)\.(\d+)(?:\.(\d+))?$/ : /(\d+)\.(\d+)\.(\d+)/).exec(version);
3
+ return found === null ? null : [Number(found[1]), Number(found[2]), Number(found[3] ?? 0)];
4
4
  }
5
5
  /* Whether the model's reported name is this model: its slug, the slug with a suffix such as `[1m]`. */
6
6
  function isReported(slug, reported) {
7
- return [...reported].some((name) => name === slug || name.startsWith(`${slug}[`));
7
+ return [...reported].some(name => name === slug || name.startsWith(`${slug}[`));
8
8
  }
9
9
  /*
10
10
  * What a model asks of the CLI that is too old for it, or null when nothing blocks it: no minimum is
@@ -12,15 +12,18 @@ function isReported(slug, reported) {
12
12
  * CLI is new enough, or a chat of this provider already reported running the model.
13
13
  */
14
14
  export function modelRequirementOf(model, provider, reported) {
15
- const minimum = model.minCliVersion === undefined ? null : partsOf(model.minCliVersion, true);
16
- const installed = provider.version === null ? null : partsOf(provider.version, false);
17
- if (minimum === null || installed === null || isReported(model.slug, reported)) {
18
- return null;
19
- }
20
- for (let i = 0; i < 3; i++) {
21
- if (installed[i] !== minimum[i]) {
22
- return (installed[i] ?? 0) > (minimum[i] ?? 0) ? null : { cli: provider.name, minVersion: model.minCliVersion ?? '' };
23
- }
24
- }
15
+ const minimum = model.minCliVersion === undefined ? null : partsOf(model.minCliVersion, true);
16
+ const installed = provider.version === null ? null : partsOf(provider.version, false);
17
+ if (minimum === null || installed === null || isReported(model.slug, reported)) {
25
18
  return null;
26
- }
19
+ }
20
+ for (let i = 0; i < 3; i++) {
21
+ if (installed[i] !== minimum[i]) {
22
+ return (installed[i] ?? 0) > (minimum[i] ?? 0) ? null : {
23
+ cli: provider.name,
24
+ minVersion: model.minCliVersion ?? ''
25
+ };
26
+ }
27
+ }
28
+ return null;
29
+ }
@@ -0,0 +1,7 @@
1
+ import type { ModelOptionDescriptor } from '@adecore/agent-contracts';
2
+ export declare function optionWord(option: ModelOptionDescriptor): string;
3
+ export declare function choiceWord(optionId: string, choice: {
4
+ id: string;
5
+ label: string;
6
+ }): string;
7
+ export declare function localizedOption(option: ModelOptionDescriptor): ModelOptionDescriptor;
@@ -0,0 +1,35 @@
1
+ import i18next from 'i18next';
2
+ /*
3
+ * The model catalogs write a model's knobs in English. Those words read in the person's language; a word
4
+ * that differs from the catalog's is an agent's own and stays as the agent wrote it.
5
+ */
6
+ function catalogWord(key, written) {
7
+ return i18next.t(key, {
8
+ lng: 'en',
9
+ defaultValue: ''
10
+ }) === written ? i18next.t(key) : written;
11
+ }
12
+ export function optionWord(option) {
13
+ return catalogWord(`agent-chat:modelOptions.${option.id}.label`, option.label);
14
+ }
15
+ export function choiceWord(optionId, choice) {
16
+ return catalogWord(`agent-chat:modelOptions.${optionId}.choices.${choice.id}`, choice.label);
17
+ }
18
+ /* The option with the words a person reads, for a surface that draws its labels and choices. */
19
+ export function localizedOption(option) {
20
+ const label = optionWord(option);
21
+ if (option.type !== 'select') {
22
+ return {
23
+ ...option,
24
+ label
25
+ };
26
+ }
27
+ return {
28
+ ...option,
29
+ label,
30
+ choices: option.choices.map(choice => ({
31
+ ...choice,
32
+ label: choiceWord(option.id, choice)
33
+ }))
34
+ };
35
+ }
@@ -4,9 +4,9 @@ import { siGithubcopilot } from 'simple-icons';
4
4
  * exception for provider marks. One path each, in `currentColor`, so a row decides how loud the logo is.
5
5
  */
6
6
  export const PROVIDER_PATHS = {
7
- claude: 'M4.709 15.955l4.72-2.647.079-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.377-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.048.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.607.212-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.914-1.316-.012.01z',
8
- codex: 'M21.55 10.004a5.416 5.416 0 00-.478-4.501c-1.217-2.09-3.662-3.166-6.05-2.66A5.59 5.59 0 0010.831 1C8.39.995 6.224 2.546 5.473 4.838A5.553 5.553 0 001.76 7.496a5.487 5.487 0 00.691 6.5 5.416 5.416 0 00.477 4.502c1.217 2.09 3.662 3.165 6.05 2.66A5.586 5.586 0 0013.168 23c2.443.006 4.61-1.546 5.361-3.84a5.554 5.554 0 003.715-2.66 5.488 5.488 0 00-.693-6.497v.001zm-8.381 11.558a4.199 4.199 0 01-2.675-.954c.034-.018.093-.05.132-.074l4.44-2.53a.71.71 0 00.364-.623v-6.176l1.877 1.069c.02.01.033.029.036.05v5.115c-.003 2.274-1.87 4.118-4.174 4.123zM4.192 17.78a4.059 4.059 0 01-.498-2.763c.032.019.09.055.131.078l4.44 2.53c.225.13.504.13.73 0l5.42-3.088v2.138a.068.068 0 01-.027.057L9.9 19.288c-1.999 1.136-4.552.46-5.707-1.51h-.001zM3.023 8.216A4.15 4.15 0 015.198 6.41l-.002.151v5.06a.711.711 0 00.364.624l5.42 3.087-1.876 1.07a.067.067 0 01-.063.005l-4.489-2.559c-1.995-1.14-2.679-3.658-1.53-5.63h.001zm15.417 3.54l-5.42-3.088L14.896 7.6a.067.067 0 01.063-.006l4.489 2.557c1.998 1.14 2.683 3.662 1.529 5.633a4.163 4.163 0 01-2.174 1.807V12.38a.71.71 0 00-.363-.623zm1.867-2.773a6.04 6.04 0 00-.132-.078l-4.44-2.53a.731.731 0 00-.729 0l-5.42 3.088V7.325a.068.068 0 01.027-.057L14.1 4.713c2-1.137 4.555-.46 5.707 1.513.487.833.664 1.809.499 2.757h.001zm-11.741 3.81l-1.877-1.068a.065.065 0 01-.036-.051V6.559c.001-2.277 1.873-4.122 4.181-4.12.976 0 1.92.338 2.671.954-.034.018-.092.05-.131.073l-4.44 2.53a.71.71 0 00-.365.623l-.003 6.173v.001zm1.02-2.168L12 9.25l2.414 1.375v2.75L12 14.75l-2.415-1.375v-2.75z',
9
- nanogpt: 'M5 20V4h2.6l8.8 11.2V4H19v16h-2.6L7.6 8.8V20z',
10
- grok: 'M6.469 8.776 16.512 23h-4.464L2.005 8.776H6.47Zm-.004 7.9 2.233 3.164L6.467 23H2l4.465-6.324ZM22 2.582V23h-3.659V7.764L22 2.582ZM22 1l-9.952 14.095-2.233-3.163L17.533 1H22Z',
11
- copilot: siGithubcopilot.path
12
- };
7
+ claude: 'M4.709 15.955l4.72-2.647.079-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.377-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.048.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.607.212-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.914-1.316-.012.01z',
8
+ codex: 'M21.55 10.004a5.416 5.416 0 00-.478-4.501c-1.217-2.09-3.662-3.166-6.05-2.66A5.59 5.59 0 0010.831 1C8.39.995 6.224 2.546 5.473 4.838A5.553 5.553 0 001.76 7.496a5.487 5.487 0 00.691 6.5 5.416 5.416 0 00.477 4.502c1.217 2.09 3.662 3.165 6.05 2.66A5.586 5.586 0 0013.168 23c2.443.006 4.61-1.546 5.361-3.84a5.554 5.554 0 003.715-2.66 5.488 5.488 0 00-.693-6.497v.001zm-8.381 11.558a4.199 4.199 0 01-2.675-.954c.034-.018.093-.05.132-.074l4.44-2.53a.71.71 0 00.364-.623v-6.176l1.877 1.069c.02.01.033.029.036.05v5.115c-.003 2.274-1.87 4.118-4.174 4.123zM4.192 17.78a4.059 4.059 0 01-.498-2.763c.032.019.09.055.131.078l4.44 2.53c.225.13.504.13.73 0l5.42-3.088v2.138a.068.068 0 01-.027.057L9.9 19.288c-1.999 1.136-4.552.46-5.707-1.51h-.001zM3.023 8.216A4.15 4.15 0 015.198 6.41l-.002.151v5.06a.711.711 0 00.364.624l5.42 3.087-1.876 1.07a.067.067 0 01-.063.005l-4.489-2.559c-1.995-1.14-2.679-3.658-1.53-5.63h.001zm15.417 3.54l-5.42-3.088L14.896 7.6a.067.067 0 01.063-.006l4.489 2.557c1.998 1.14 2.683 3.662 1.529 5.633a4.163 4.163 0 01-2.174 1.807V12.38a.71.71 0 00-.363-.623zm1.867-2.773a6.04 6.04 0 00-.132-.078l-4.44-2.53a.731.731 0 00-.729 0l-5.42 3.088V7.325a.068.068 0 01.027-.057L14.1 4.713c2-1.137 4.555-.46 5.707 1.513.487.833.664 1.809.499 2.757h.001zm-11.741 3.81l-1.877-1.068a.065.065 0 01-.036-.051V6.559c.001-2.277 1.873-4.122 4.181-4.12.976 0 1.92.338 2.671.954-.034.018-.092.05-.131.073l-4.44 2.53a.71.71 0 00-.365.623l-.003 6.173v.001zm1.02-2.168L12 9.25l2.414 1.375v2.75L12 14.75l-2.415-1.375v-2.75z',
9
+ nanogpt: 'M5 20V4h2.6l8.8 11.2V4H19v16h-2.6L7.6 8.8V20z',
10
+ grok: 'M6.469 8.776 16.512 23h-4.464L2.005 8.776H6.47Zm-.004 7.9 2.233 3.164L6.467 23H2l4.465-6.324ZM22 2.582V23h-3.659V7.764L22 2.582ZM22 1l-9.952 14.095-2.233-3.163L17.533 1H22Z',
11
+ copilot: siGithubcopilot.path
12
+ };
@@ -4,20 +4,40 @@ import { CircleCheck, CircleSlash, CircleX, Hourglass, LoaderCircle } from 'luci
4
4
  * spinner stops under reduced motion with every other animation.
5
5
  */
6
6
  const LOOKS = {
7
- running: { icon: LoaderCircle, tone: 'text-status-running', spins: true },
8
- // The hourglass of a chat that stopped on a limit, since that is what holds the work up.
9
- paused: { icon: Hourglass, tone: 'text-text-faint', spins: false },
10
- done: { icon: CircleCheck, tone: 'text-status-idle', spins: false },
11
- failed: { icon: CircleX, tone: 'text-status-error', spins: false },
12
- cancelled: { icon: CircleSlash, tone: 'text-text-faint', spins: false }
7
+ running: {
8
+ icon: LoaderCircle,
9
+ tone: 'text-status-running',
10
+ spins: true
11
+ },
12
+ // The hourglass of a chat that stopped on a limit, since that is what holds the work up.
13
+ paused: {
14
+ icon: Hourglass,
15
+ tone: 'text-text-faint',
16
+ spins: false
17
+ },
18
+ done: {
19
+ icon: CircleCheck,
20
+ tone: 'text-status-idle',
21
+ spins: false
22
+ },
23
+ failed: {
24
+ icon: CircleX,
25
+ tone: 'text-status-error',
26
+ spins: false
27
+ },
28
+ cancelled: {
29
+ icon: CircleSlash,
30
+ tone: 'text-text-faint',
31
+ spins: false
32
+ }
13
33
  };
14
34
  export function statusLookOf(word) {
15
- return LOOKS[word];
35
+ return LOOKS[word];
16
36
  }
17
37
  /* A task calls its running state `open`, which is the host's word for it and not a person's; an open task whose child stopped on a limit is paused. */
18
38
  export function taskStatusWord(task) {
19
- if (task.status !== 'open') {
20
- return task.status;
21
- }
22
- return task.paused === undefined ? 'running' : 'paused';
23
- }
39
+ if (task.status !== 'open') {
40
+ return task.status;
41
+ }
42
+ return task.paused === undefined ? 'running' : 'paused';
43
+ }
@@ -1,5 +1,6 @@
1
1
  import type { AgentKind, ProviderAccounts } from '@adecore/agent-contracts';
2
2
  import { type AccountEntry } from '../agents/accounts.js';
3
+ import { type ProviderAccountsRow } from '../state/provider-accounts.js';
3
4
  export interface AccountChoice {
4
5
  accounts: ProviderAccounts;
5
6
  offered: AccountEntry[];
@@ -9,3 +10,15 @@ export interface AccountChoice {
9
10
  nameOf(entry: AccountEntry): string;
10
11
  }
11
12
  export declare function useAccountChoice(kind: AgentKind | null, account: string | undefined): AccountChoice | null;
13
+ export type NewAccountChoice = {
14
+ status: 'loading';
15
+ } | {
16
+ status: 'unsupported';
17
+ } | {
18
+ status: 'ready';
19
+ offered: AccountEntry[];
20
+ providerName: string;
21
+ nameOf(entry: AccountEntry): string;
22
+ };
23
+ export declare function newAccountChoiceOf(row: ProviderAccountsRow, kind: AgentKind | null, providerName: string): NewAccountChoice;
24
+ export declare function useNewAccountChoice(kind: AgentKind | null): NewAccountChoice;