@adecore/agents-react 0.31.12 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/dist/agents/AccountDot.js +57 -6
  2. package/dist/agents/AgentIcon.js +88 -12
  3. package/dist/agents/ModelOptionControl.js +153 -18
  4. package/dist/agents/ProviderLogo.js +49 -4
  5. package/dist/agents/account-limits.js +17 -14
  6. package/dist/agents/accounts.js +99 -67
  7. package/dist/agents/agent-marks.js +5 -3
  8. package/dist/agents/model-name.js +42 -31
  9. package/dist/agents/model-options.js +8 -8
  10. package/dist/agents/model-requirement.js +17 -14
  11. package/dist/agents/option-words.d.ts +7 -0
  12. package/dist/agents/option-words.js +35 -0
  13. package/dist/agents/provider-paths.js +6 -6
  14. package/dist/agents/status-look.js +32 -12
  15. package/dist/chat/account-choice.d.ts +13 -0
  16. package/dist/chat/account-choice.js +90 -20
  17. package/dist/chat/actions.js +126 -59
  18. package/dist/chat/activity.js +5 -5
  19. package/dist/chat/attachments.js +74 -53
  20. package/dist/chat/bookmarks.js +58 -48
  21. package/dist/chat/chat-client.js +344 -263
  22. package/dist/chat/chat-references.js +3 -3
  23. package/dist/chat/composer-effort.d.ts +5 -0
  24. package/dist/chat/composer-effort.js +26 -0
  25. package/dist/chat/composer-send.js +13 -13
  26. package/dist/chat/drafts.js +115 -79
  27. package/dist/chat/forks.js +81 -24
  28. package/dist/chat/guards.js +15 -43
  29. package/dist/chat/index.d.ts +3 -1
  30. package/dist/chat/index.js +3 -2
  31. package/dist/chat/logic/ansi.js +170 -167
  32. package/dist/chat/logic/answers.js +2 -2
  33. package/dist/chat/logic/bookmarks.js +19 -19
  34. package/dist/chat/logic/command-looks.js +138 -96
  35. package/dist/chat/logic/context-usage.js +13 -9
  36. package/dist/chat/logic/continue-after-stop.js +15 -19
  37. package/dist/chat/logic/effort.d.ts +14 -0
  38. package/dist/chat/logic/effort.js +34 -0
  39. package/dist/chat/logic/embedded-code.js +387 -326
  40. package/dist/chat/logic/fork.js +134 -110
  41. package/dist/chat/logic/generated-image.js +54 -23
  42. package/dist/chat/logic/goal.js +28 -20
  43. package/dist/chat/logic/handback.js +6 -6
  44. package/dist/chat/logic/json.js +2 -2
  45. package/dist/chat/logic/limit.js +46 -30
  46. package/dist/chat/logic/picker-entries.d.ts +5 -3
  47. package/dist/chat/logic/picker-entries.js +83 -43
  48. package/dist/chat/logic/resume-compaction.d.ts +14 -1
  49. package/dist/chat/logic/resume-compaction.js +93 -24
  50. package/dist/chat/logic/scrubber.js +188 -136
  51. package/dist/chat/logic/thought.js +13 -16
  52. package/dist/chat/logic/thread-cards.js +60 -48
  53. package/dist/chat/logic/timeline-copy.js +30 -38
  54. package/dist/chat/logic/timeline-target.js +92 -63
  55. package/dist/chat/logic/timeline.js +499 -355
  56. package/dist/chat/logic/tool-catalog.js +54 -34
  57. package/dist/chat/logic/tools.js +106 -82
  58. package/dist/chat/logic/visual-height.js +18 -18
  59. package/dist/chat/logic/visual-viewport.js +6 -3
  60. package/dist/chat/logic/welcome.js +9 -9
  61. package/dist/chat/logic/workflow.js +45 -34
  62. package/dist/chat/mentions.js +149 -109
  63. package/dist/chat/persisted-json.js +51 -54
  64. package/dist/chat/preferences.d.ts +4 -0
  65. package/dist/chat/preferences.js +162 -84
  66. package/dist/chat/prompt-hold.js +9 -9
  67. package/dist/chat/quote.js +21 -30
  68. package/dist/chat/reading-width.js +12 -10
  69. package/dist/chat/recent-messages.js +34 -21
  70. package/dist/chat/resume-compaction-dismissals.js +25 -5
  71. package/dist/chat/runtime-modes.js +3 -3
  72. package/dist/chat/send-key.js +11 -7
  73. package/dist/chat/stash.js +89 -69
  74. package/dist/chat/subagent-conversation.js +181 -139
  75. package/dist/chat/subagent-list.js +65 -67
  76. package/dist/chat/subagent-support.js +12 -7
  77. package/dist/chat/subagent-view.js +132 -44
  78. package/dist/chat/thumbnails.js +88 -60
  79. package/dist/chat/timeline-flash.js +24 -12
  80. package/dist/chat/timeline-scroll.js +116 -86
  81. package/dist/chat/ui/AccountPill.js +126 -15
  82. package/dist/chat/ui/AnsiOutput.js +62 -6
  83. package/dist/chat/ui/BookmarkMarker.js +231 -41
  84. package/dist/chat/ui/BookmarkSubmenu.js +165 -18
  85. package/dist/chat/ui/ChatActivity.js +649 -70
  86. package/dist/chat/ui/ChatReferenceChip.js +104 -9
  87. package/dist/chat/ui/CodeBlock.js +132 -58
  88. package/dist/chat/ui/Composer.js +866 -132
  89. package/dist/chat/ui/ComposerInput.js +309 -120
  90. package/dist/chat/ui/DiffPool.js +75 -14
  91. package/dist/chat/ui/EditDiff.js +160 -21
  92. package/dist/chat/ui/FadingWords.js +32 -3
  93. package/dist/chat/ui/GoalDock.js +235 -42
  94. package/dist/chat/ui/ImageView.js +617 -61
  95. package/dist/chat/ui/LimitState.js +446 -72
  96. package/dist/chat/ui/Markdown.js +991 -173
  97. package/dist/chat/ui/MermaidBlock.js +238 -68
  98. package/dist/chat/ui/MessageActions.js +251 -39
  99. package/dist/chat/ui/ModelMarks.js +55 -5
  100. package/dist/chat/ui/Pickers.js +664 -113
  101. package/dist/chat/ui/PromptComposer.js +281 -51
  102. package/dist/chat/ui/QuoteButton.js +151 -57
  103. package/dist/chat/ui/ResumeCompactionDock.d.ts +6 -2
  104. package/dist/chat/ui/ResumeCompactionDock.js +141 -6
  105. package/dist/chat/ui/RowTime.js +59 -5
  106. package/dist/chat/ui/RunSettings.js +1744 -154
  107. package/dist/chat/ui/Scrubber.js +517 -88
  108. package/dist/chat/ui/ShellCommand.js +183 -107
  109. package/dist/chat/ui/SubagentControls.js +212 -24
  110. package/dist/chat/ui/SubagentInfo.js +170 -13
  111. package/dist/chat/ui/SubagentStopButton.js +115 -24
  112. package/dist/chat/ui/SubagentTimeline.js +357 -91
  113. package/dist/chat/ui/Timeline.js +988 -476
  114. package/dist/chat/ui/TimelineMenu.js +552 -37
  115. package/dist/chat/ui/UnifiedDiff.js +234 -27
  116. package/dist/chat/ui/UploadThumb.js +37 -7
  117. package/dist/chat/ui/VisualDialogs.js +251 -20
  118. package/dist/chat/ui/VisualFrame.js +321 -95
  119. package/dist/chat/ui/Welcome.js +72 -7
  120. package/dist/chat/ui/chips.js +1 -1
  121. package/dist/chat/ui/code-lines.js +36 -36
  122. package/dist/chat/ui/code-streaming.js +1 -1
  123. package/dist/chat/ui/code-theme.js +7 -7
  124. package/dist/chat/ui/composer/ComposerControls.js +329 -21
  125. package/dist/chat/ui/composer/ComposerMenu.js +358 -30
  126. package/dist/chat/ui/composer/DraftParts.js +185 -11
  127. package/dist/chat/ui/composer/QueuedMessages.js +138 -13
  128. package/dist/chat/ui/composer/chips.js +29 -19
  129. package/dist/chat/ui/composer/editor.js +79 -63
  130. package/dist/chat/ui/composer/insert.js +26 -12
  131. package/dist/chat/ui/composer/key-handler.js +180 -127
  132. package/dist/chat/ui/composer/keys.js +90 -73
  133. package/dist/chat/ui/composer/menu-aria.js +18 -9
  134. package/dist/chat/ui/composer/placeholder.js +78 -31
  135. package/dist/chat/ui/composer/surface.js +13 -37
  136. package/dist/chat/ui/composer/use-chat-controls.js +230 -90
  137. package/dist/chat/ui/composer/use-compaction-offer.js +50 -18
  138. package/dist/chat/ui/composer/use-composer-draft.js +65 -34
  139. package/dist/chat/ui/composer/use-composer-menus.js +478 -193
  140. package/dist/chat/ui/composer/use-composer-submit.js +251 -109
  141. package/dist/chat/ui/composer/use-continuable-turn.js +33 -6
  142. package/dist/chat/ui/composer/use-draft-files.js +245 -93
  143. package/dist/chat/ui/composer/use-effort-stepper.d.ts +13 -0
  144. package/dist/chat/ui/composer/use-effort-stepper.js +88 -0
  145. package/dist/chat/ui/composer/use-notice.js +61 -16
  146. package/dist/chat/ui/composer/use-pending-requests.js +38 -17
  147. package/dist/chat/ui/composer/use-prompt-history.js +117 -45
  148. package/dist/chat/ui/composer/use-prompt-hold.js +119 -35
  149. package/dist/chat/ui/composer/use-take-back.js +94 -72
  150. package/dist/chat/ui/diff/ApprovalReview.js +101 -23
  151. package/dist/chat/ui/diff/DiffFallbackBoundary.js +21 -13
  152. package/dist/chat/ui/diff/DiffOmitted.js +56 -6
  153. package/dist/chat/ui/diff/DiffStack.js +92 -8
  154. package/dist/chat/ui/diff/DiffUnavailable.js +56 -6
  155. package/dist/chat/ui/diff/EditorEditDiff.js +263 -51
  156. package/dist/chat/ui/diff/EditorPatchDiff.js +39 -14
  157. package/dist/chat/ui/diff/LegacyDiffPool.js +27 -10
  158. package/dist/chat/ui/diff/LegacyEditDiff.js +97 -20
  159. package/dist/chat/ui/diff/LegacyUnifiedDiff.js +172 -42
  160. package/dist/chat/ui/diff/RawDiff.js +65 -5
  161. package/dist/chat/ui/diff/ReviewDiff.js +77 -5
  162. package/dist/chat/ui/diff/diff-props.js +1 -1
  163. package/dist/chat/ui/diff/diff-source-budget.js +46 -35
  164. package/dist/chat/ui/diff/editor-edit-model.js +18 -14
  165. package/dist/chat/ui/diff/review-plan.js +63 -40
  166. package/dist/chat/ui/diff/review-settle.js +24 -9
  167. package/dist/chat/ui/diff/syntax-runtime.js +236 -201
  168. package/dist/chat/ui/diff/use-review-stack.js +146 -25
  169. package/dist/chat/ui/diff-syntax.js +70 -58
  170. package/dist/chat/ui/diff-theme.js +31 -12
  171. package/dist/chat/ui/file-links.js +39 -10
  172. package/dist/chat/ui/find-reveal.js +29 -8
  173. package/dist/chat/ui/full-diff.js +17 -12
  174. package/dist/chat/ui/highlighter.js +143 -113
  175. package/dist/chat/ui/icons.js +16 -7
  176. package/dist/chat/ui/index.js +1 -1
  177. package/dist/chat/ui/intelligent-ui/UiBlockFrame.js +556 -82
  178. package/dist/chat/ui/intelligent-ui/UiFallbackPart.js +73 -5
  179. package/dist/chat/ui/intelligent-ui/UiReply.js +666 -262
  180. package/dist/chat/ui/intelligent-ui/block-local.js +59 -31
  181. package/dist/chat/ui/intelligent-ui/chart-data.js +77 -67
  182. package/dist/chat/ui/intelligent-ui/node-text.js +77 -91
  183. package/dist/chat/ui/intelligent-ui/registry.js +46 -46
  184. package/dist/chat/ui/intelligent-ui/render-context.js +1 -1
  185. package/dist/chat/ui/intelligent-ui/renderers/base-land.js +1 -1
  186. package/dist/chat/ui/intelligent-ui/renderers/binding.js +3 -3
  187. package/dist/chat/ui/intelligent-ui/renderers/chart.js +1223 -123
  188. package/dist/chat/ui/intelligent-ui/renderers/choices.js +312 -34
  189. package/dist/chat/ui/intelligent-ui/renderers/content.js +1241 -86
  190. package/dist/chat/ui/intelligent-ui/renderers/data.js +619 -54
  191. package/dist/chat/ui/intelligent-ui/renderers/inputs.js +868 -67
  192. package/dist/chat/ui/intelligent-ui/renderers/links.js +366 -62
  193. package/dist/chat/ui/intelligent-ui/renderers/map-slots.js +118 -60
  194. package/dist/chat/ui/intelligent-ui/renderers/map-style.js +85 -78
  195. package/dist/chat/ui/intelligent-ui/renderers/map-view.js +282 -217
  196. package/dist/chat/ui/intelligent-ui/renderers/map.js +621 -69
  197. package/dist/chat/ui/intelligent-ui/renderers/place-point.js +15 -8
  198. package/dist/chat/ui/intelligent-ui/renderers/structure.js +262 -20
  199. package/dist/chat/ui/intelligent-ui/renderers/text.js +674 -49
  200. package/dist/chat/ui/intelligent-ui/reply-parts.js +24 -15
  201. package/dist/chat/ui/intelligent-ui/table-data.js +97 -57
  202. package/dist/chat/ui/intelligent-ui/tones.js +31 -31
  203. package/dist/chat/ui/intelligent-ui/use-in-view.js +30 -12
  204. package/dist/chat/ui/intelligent-ui/use-later.js +28 -13
  205. package/dist/chat/ui/intelligent-ui/use-truncated.js +45 -21
  206. package/dist/chat/ui/intelligent-ui/use-ui-links.js +296 -109
  207. package/dist/chat/ui/intelligent-ui/use-ui-queries.js +256 -246
  208. package/dist/chat/ui/markdown-blocks.js +296 -262
  209. package/dist/chat/ui/mermaid.js +60 -72
  210. package/dist/chat/ui/quote-selection.js +32 -29
  211. package/dist/chat/ui/rehype-chips.js +35 -23
  212. package/dist/chat/ui/rehype-fade.js +28 -17
  213. package/dist/chat/ui/remark-html-as-text.js +22 -15
  214. package/dist/chat/ui/reply-context.js +1 -1
  215. package/dist/chat/ui/reveal.js +161 -72
  216. package/dist/chat/ui/rows/ForksRow.js +226 -24
  217. package/dist/chat/ui/rows/GeneratedImageRow.js +541 -87
  218. package/dist/chat/ui/rows/MessageRows.js +1706 -159
  219. package/dist/chat/ui/rows/RowContainer.js +57 -7
  220. package/dist/chat/ui/rows/Rows.js +463 -54
  221. package/dist/chat/ui/rows/SubagentRow.js +577 -60
  222. package/dist/chat/ui/rows/TaskRow.js +359 -40
  223. package/dist/chat/ui/rows/VisualRow.js +233 -11
  224. package/dist/chat/ui/rows/WorkRows.js +1945 -164
  225. package/dist/chat/ui/rows/WorkflowRow.js +293 -34
  226. package/dist/chat/ui/rows/row-rhythm.js +27 -17
  227. package/dist/chat/ui/theme-watch.js +26 -23
  228. package/dist/chat/ui/timestamp-format.js +4 -1
  229. package/dist/chat/ui/use-diff-source-tokens.js +70 -34
  230. package/dist/chat/ui/useToggleSet.js +51 -19
  231. package/dist/chat/ui/visual-theme.js +153 -128
  232. package/dist/chat/visual-bridge.js +123 -123
  233. package/dist/chat/visual-viewport.js +94 -83
  234. package/dist/chat/visuals.js +13 -5
  235. package/dist/host-hooks.d.ts +29 -0
  236. package/dist/host-hooks.js +78 -0
  237. package/dist/host.js +120 -48
  238. package/dist/index.js +1 -1
  239. package/dist/lazy.js +38 -32
  240. package/dist/locales/en/agent-chat.d.ts +34 -0
  241. package/dist/locales/en/agent-chat.js +747 -713
  242. package/dist/locales/en/agent-prompts.js +42 -42
  243. package/dist/locales/en/agent-providers.d.ts +1 -0
  244. package/dist/locales/en/agent-providers.js +166 -165
  245. package/dist/locales/en/agent-usage.d.ts +6 -0
  246. package/dist/locales/en/agent-usage.js +129 -123
  247. package/dist/locales/nl/agent-chat.d.ts +34 -0
  248. package/dist/locales/nl/agent-chat.js +747 -713
  249. package/dist/locales/nl/agent-prompts.js +42 -42
  250. package/dist/locales/nl/agent-providers.d.ts +1 -0
  251. package/dist/locales/nl/agent-providers.js +166 -165
  252. package/dist/locales/nl/agent-usage.d.ts +6 -0
  253. package/dist/locales/nl/agent-usage.js +129 -123
  254. package/dist/locales.js +14 -14
  255. package/dist/mounted-registry.js +31 -30
  256. package/dist/port-transport.js +122 -111
  257. package/dist/prompts/index.js +1 -1
  258. package/dist/prompts/logic/focus.js +15 -14
  259. package/dist/prompts/logic/keys.js +93 -59
  260. package/dist/prompts/logic/prompts.js +27 -14
  261. package/dist/prompts/logic/subjects.js +60 -46
  262. package/dist/prompts/logic/useFocusAfterAnswer.js +60 -20
  263. package/dist/prompts/logic/usePromptSession.js +88 -77
  264. package/dist/prompts/ui/ApprovalBody.js +246 -27
  265. package/dist/prompts/ui/PromptActions.js +215 -9
  266. package/dist/prompts/ui/PromptCard.js +215 -36
  267. package/dist/prompts/ui/PromptView.js +372 -34
  268. package/dist/prompts/ui/QuestionBody.js +269 -73
  269. package/dist/providers/AccountColors.js +36 -5
  270. package/dist/providers/AccountDetail.js +683 -50
  271. package/dist/providers/AccountVariables.js +139 -32
  272. package/dist/providers/AddAccountForm.js +125 -38
  273. package/dist/providers/CliDetail.js +343 -36
  274. package/dist/providers/InstallPage.js +644 -59
  275. package/dist/providers/ProviderList.d.ts +2 -1
  276. package/dist/providers/ProviderList.js +215 -23
  277. package/dist/providers/ProvidersPane.d.ts +4 -2
  278. package/dist/providers/ProvidersPane.js +244 -64
  279. package/dist/providers/account-actions.js +54 -30
  280. package/dist/providers/index.js +1 -1
  281. package/dist/providers/install-steps.js +12 -9
  282. package/dist/providers/pane-target.d.ts +3 -0
  283. package/dist/providers/pane-target.js +34 -13
  284. package/dist/providers/parts.js +62 -12
  285. package/dist/providers/provider-abilities.js +5 -5
  286. package/dist/providers/provider-groups.js +75 -40
  287. package/dist/providers/variables.js +73 -39
  288. package/dist/scope.js +6 -6
  289. package/dist/settings/sections.js +18 -18
  290. package/dist/state/chats.js +404 -192
  291. package/dist/state/index.js +1 -1
  292. package/dist/state/provider-accounts.js +70 -47
  293. package/dist/state/providers.js +45 -16
  294. package/dist/state/usage.js +154 -77
  295. package/dist/storage.js +69 -68
  296. package/dist/testing/index.js +1 -1
  297. package/dist/testing/prompts.js +105 -67
  298. package/dist/transport.js +10 -10
  299. package/dist/ui/PlainTextarea.js +27 -3
  300. package/dist/usage/LimitsList.js +646 -40
  301. package/dist/usage/UsageBreakdown.js +879 -38
  302. package/dist/usage/UsageChart.js +311 -32
  303. package/dist/usage/UsageDialog.js +46 -4
  304. package/dist/usage/UsageLimits.js +467 -34
  305. package/dist/usage/UsageLimitsCard.js +95 -11
  306. package/dist/usage/UsagePage.js +817 -96
  307. package/dist/usage/UsagePane.js +164 -10
  308. package/dist/usage/UsageSummary.js +151 -6
  309. package/dist/usage/UsageTiles.js +164 -14
  310. package/dist/usage/format.js +32 -32
  311. package/dist/usage/index.d.ts +1 -1
  312. package/dist/usage/index.js +2 -1
  313. package/dist/usage/limit-groups.d.ts +2 -0
  314. package/dist/usage/limit-groups.js +77 -59
  315. package/dist/usage/limits.js +78 -43
  316. package/dist/usage/money.js +20 -4
  317. package/dist/usage/summary.js +85 -64
  318. package/package.json +8 -8
  319. package/src/agents/ModelOptionControl.tsx +3 -1
  320. package/src/agents/option-words.ts +27 -0
  321. package/src/chat/account-choice.ts +41 -1
  322. package/src/chat/composer-effort.ts +32 -0
  323. package/src/chat/forks.ts +4 -5
  324. package/src/chat/index.ts +3 -1
  325. package/src/chat/logic/effort.ts +32 -0
  326. package/src/chat/logic/picker-entries.ts +45 -10
  327. package/src/chat/logic/resume-compaction.ts +95 -17
  328. package/src/chat/logic/timeline.ts +11 -3
  329. package/src/chat/preferences.ts +35 -0
  330. package/src/chat/subagent-view.ts +2 -3
  331. package/src/chat/ui/AnsiOutput.tsx +1 -2
  332. package/src/chat/ui/BookmarkSubmenu.tsx +3 -3
  333. package/src/chat/ui/ChatActivity.tsx +14 -22
  334. package/src/chat/ui/ChatReferenceChip.tsx +2 -3
  335. package/src/chat/ui/Composer.tsx +15 -7
  336. package/src/chat/ui/EditDiff.tsx +2 -3
  337. package/src/chat/ui/LimitState.tsx +2 -2
  338. package/src/chat/ui/Markdown.tsx +10 -8
  339. package/src/chat/ui/MermaidBlock.tsx +2 -3
  340. package/src/chat/ui/Pickers.tsx +49 -29
  341. package/src/chat/ui/PromptComposer.tsx +7 -9
  342. package/src/chat/ui/ResumeCompactionDock.tsx +16 -4
  343. package/src/chat/ui/RunSettings.tsx +67 -28
  344. package/src/chat/ui/Scrubber.tsx +3 -3
  345. package/src/chat/ui/ShellCommand.tsx +2 -0
  346. package/src/chat/ui/SubagentInfo.tsx +2 -3
  347. package/src/chat/ui/SubagentTimeline.tsx +12 -16
  348. package/src/chat/ui/Timeline.tsx +6 -6
  349. package/src/chat/ui/UnifiedDiff.tsx +3 -4
  350. package/src/chat/ui/VisualFrame.tsx +5 -8
  351. package/src/chat/ui/code-theme.ts +4 -4
  352. package/src/chat/ui/composer/placeholder.ts +2 -2
  353. package/src/chat/ui/composer/use-compaction-offer.ts +36 -16
  354. package/src/chat/ui/composer/use-composer-menus.ts +4 -9
  355. package/src/chat/ui/composer/use-composer-submit.ts +2 -1
  356. package/src/chat/ui/composer/use-effort-stepper.ts +56 -0
  357. package/src/chat/ui/composer/use-notice.ts +2 -2
  358. package/src/chat/ui/diff/EditorEditDiff.tsx +9 -13
  359. package/src/chat/ui/diff/LegacyEditDiff.tsx +12 -17
  360. package/src/chat/ui/diff/LegacyUnifiedDiff.tsx +13 -21
  361. package/src/chat/ui/diff/use-review-stack.ts +4 -4
  362. package/src/chat/ui/diff-theme.ts +3 -3
  363. package/src/chat/ui/file-links.ts +2 -2
  364. package/src/chat/ui/intelligent-ui/UiReply.tsx +2 -0
  365. package/src/chat/ui/intelligent-ui/renderers/chart.tsx +3 -3
  366. package/src/chat/ui/intelligent-ui/renderers/content.tsx +5 -6
  367. package/src/chat/ui/intelligent-ui/renderers/map-view.tsx +2 -1
  368. package/src/chat/ui/intelligent-ui/renderers/map.tsx +2 -1
  369. package/src/chat/ui/intelligent-ui/use-truncated.ts +16 -19
  370. package/src/chat/ui/intelligent-ui/use-ui-links.ts +3 -3
  371. package/src/chat/ui/rows/ForksRow.tsx +3 -5
  372. package/src/chat/ui/rows/GeneratedImageRow.tsx +2 -1
  373. package/src/chat/ui/rows/MessageRows.tsx +12 -21
  374. package/src/chat/ui/rows/SubagentRow.tsx +3 -3
  375. package/src/chat/ui/rows/TaskRow.tsx +1 -1
  376. package/src/chat/ui/rows/WorkRows.tsx +10 -5
  377. package/src/chat/ui/useToggleSet.ts +15 -18
  378. package/src/chat/ui/visual-theme.ts +2 -3
  379. package/src/host-hooks.ts +113 -0
  380. package/src/lazy.tsx +2 -0
  381. package/src/locales/en/agent-chat.ts +134 -108
  382. package/src/locales/en/agent-prompts.ts +7 -7
  383. package/src/locales/en/agent-providers.ts +35 -34
  384. package/src/locales/en/agent-usage.ts +26 -20
  385. package/src/locales/nl/agent-chat.ts +126 -100
  386. package/src/locales/nl/agent-prompts.ts +5 -5
  387. package/src/locales/nl/agent-providers.ts +33 -32
  388. package/src/locales/nl/agent-usage.ts +25 -20
  389. package/src/providers/CliDetail.tsx +2 -1
  390. package/src/providers/InstallPage.tsx +2 -4
  391. package/src/providers/ProviderList.tsx +12 -2
  392. package/src/providers/ProvidersPane.tsx +45 -15
  393. package/src/providers/pane-target.ts +20 -4
  394. package/src/state/chats.ts +2 -2
  395. package/src/usage/LimitsList.tsx +12 -13
  396. package/src/usage/UsageBreakdown.tsx +17 -6
  397. package/src/usage/UsageLimits.tsx +2 -1
  398. package/src/usage/UsagePage.tsx +3 -3
  399. package/src/usage/index.ts +1 -1
  400. package/src/usage/limit-groups.ts +12 -0
  401. package/src/usage/limits.ts +2 -2
  402. package/src/usage/money.ts +1 -2
@@ -2,55 +2,79 @@ import i18next from 'i18next';
2
2
  import { accountFor, readChatPreferences, rememberChatAccount } from '../chat/preferences.js';
3
3
  import { providerAccountsOf, useProviderAccountsStore } from '../state/provider-accounts.js';
4
4
  function words(key, values) {
5
- return i18next.t(`agent-providers:${key}`, values);
5
+ return i18next.t(`agent-providers:${key}`, values);
6
6
  }
7
7
  function reason(e) {
8
- return e instanceof Error ? e.message : String(e);
8
+ return e instanceof Error ? e.message : String(e);
9
9
  }
10
10
  function linkTo(scope) {
11
- if (scope.transport.status !== 'open') {
12
- throw new Error(words('notAnswering'));
13
- }
14
- return scope.transport;
11
+ if (scope.transport.status !== 'open') {
12
+ throw new Error(words('notAnswering'));
13
+ }
14
+ return scope.transport;
15
15
  }
16
16
  /* The whole map, as `accounts.save` takes it. Answers false when the host refused, which a toast then says. */
17
17
  export async function saveAccounts(scope, host, accounts) {
18
- try {
19
- useProviderAccountsStore.getState().set(scope.id, await linkTo(scope).request('accounts.save', { accounts }));
20
- return true;
21
- }
22
- catch (e) {
23
- host.notify({ id: `providers-save-${scope.id}`, kind: 'error', title: words('account.saveFailed'), description: reason(e) });
24
- return false;
25
- }
18
+ try {
19
+ useProviderAccountsStore.getState().set(scope.id, await linkTo(scope).request('accounts.save', {
20
+ accounts
21
+ }));
22
+ return true;
23
+ } catch (e) {
24
+ host.notify({
25
+ id: `providers-save-${scope.id}`,
26
+ kind: 'error',
27
+ title: words('account.saveFailed'),
28
+ description: reason(e)
29
+ });
30
+ return false;
31
+ }
26
32
  }
27
33
  /* One account changed and every other one as the host last said. */
28
34
  export function saveAccount(scope, host, id, account) {
29
- const current = providerAccountsOf(scope.id).accounts?.accounts ?? {};
30
- return saveAccounts(scope, host, { ...current, [id]: account });
35
+ const current = providerAccountsOf(scope.id).accounts?.accounts ?? {};
36
+ return saveAccounts(scope, host, {
37
+ ...current,
38
+ [id]: account
39
+ });
31
40
  }
32
41
  /*
33
42
  * Forgets an account; its folder stays where it is. A pick for new agents that named it goes back to
34
43
  * the CLI's default account, since no chat started from it yet.
35
44
  */
36
45
  export async function removeAccount(scope, host, id, kind) {
37
- const { [id]: _gone, ...rest } = providerAccountsOf(scope.id).accounts?.accounts ?? {};
38
- if (!(await saveAccounts(scope, host, rest))) {
39
- throw new Error(words('account.saveFailed'));
40
- }
41
- if (accountFor(readChatPreferences(), scope.id, kind) === id) {
42
- rememberChatAccount(scope.id, kind, null);
43
- }
46
+ const {
47
+ [id]: _gone,
48
+ ...rest
49
+ } = providerAccountsOf(scope.id).accounts?.accounts ?? {};
50
+ if (!(await saveAccounts(scope, host, rest))) {
51
+ throw new Error(words('account.saveFailed'));
52
+ }
53
+ if (accountFor(readChatPreferences(), scope.id, kind) === id) {
54
+ rememberChatAccount(scope.id, kind, null);
55
+ }
44
56
  }
45
57
  /* An account in a folder the host makes for it; answers its id. Throws what the host said, for the form to show. */
46
58
  export async function createAccount(scope, kind, label, color) {
47
- const created = await linkTo(scope).request('accounts.create', { kind, label, color });
48
- const { id, ...accounts } = created;
49
- useProviderAccountsStore.getState().set(scope.id, accounts);
50
- return id;
59
+ const created = await linkTo(scope).request('accounts.create', {
60
+ kind,
61
+ label,
62
+ color
63
+ });
64
+ const {
65
+ id,
66
+ ...accounts
67
+ } = created;
68
+ useProviderAccountsStore.getState().set(scope.id, accounts);
69
+ return id;
51
70
  }
52
71
  /* An account in a folder that is already on the host. Throws what the host said, for the form to show. */
53
72
  export async function linkAccount(scope, id, account) {
54
- const current = providerAccountsOf(scope.id).accounts?.accounts ?? {};
55
- useProviderAccountsStore.getState().set(scope.id, await linkTo(scope).request('accounts.save', { accounts: { ...current, [id]: account } }));
56
- }
73
+ const current = providerAccountsOf(scope.id).accounts?.accounts ?? {};
74
+ useProviderAccountsStore.getState().set(scope.id, await linkTo(scope).request('accounts.save', {
75
+ accounts: {
76
+ ...current,
77
+ [id]: account
78
+ }
79
+ }));
80
+ }
@@ -8,4 +8,4 @@ export { modelName, useModelName, shortModelName } from '../agents/model-name.js
8
8
  export { carryOptions } from '../agents/model-options.js';
9
9
  export {} from '../agents/model-requirement.js';
10
10
  export { ProvidersPane } from './ProvidersPane.js';
11
- export { CliMark, CliTile } from './parts.js';
11
+ export { CliMark, CliTile } from './parts.js';
@@ -2,18 +2,21 @@ import { isApplePlatform } from '@adecore/ui';
2
2
  const PLATFORMS = ['darwin', 'linux', 'win32'];
3
3
  /* The first step not done is the current one. */
4
4
  export function installStepStates(done) {
5
- const first = done.indexOf(false);
6
- return done.map((value, index) => (value ? 'done' : index === first ? 'current' : 'later'));
5
+ const first = done.indexOf(false);
6
+ return done.map((value, index) => value ? 'done' : index === first ? 'current' : 'later');
7
7
  }
8
8
  /* The system of the page, for a host that does not say which system its machine runs. */
9
9
  export function pagePlatform() {
10
- if (isApplePlatform()) {
11
- return 'darwin';
12
- }
13
- return typeof navigator !== 'undefined' && /windows/i.test(navigator.userAgent) ? 'win32' : 'linux';
10
+ if (isApplePlatform()) {
11
+ return 'darwin';
12
+ }
13
+ return typeof navigator !== 'undefined' && /windows/i.test(navigator.userAgent) ? 'win32' : 'linux';
14
14
  }
15
15
  /* The systems a provider has a command for, and the one the page opens on: the machine's when it has one there. */
16
16
  export function installPlatforms(provider, machine) {
17
- const offered = PLATFORMS.filter((platform) => Boolean(provider.install?.commands[platform]));
18
- return { offered, initial: offered.includes(machine) ? machine : (offered[0] ?? null) };
19
- }
17
+ const offered = PLATFORMS.filter(platform => Boolean(provider.install?.commands[platform]));
18
+ return {
19
+ offered,
20
+ initial: offered.includes(machine) ? machine : offered[0] ?? null
21
+ };
22
+ }
@@ -11,5 +11,8 @@ export type Picked = {
11
11
  } | {
12
12
  kind: 'add';
13
13
  cli: AgentKind;
14
+ } | {
15
+ kind: 'catalog';
14
16
  };
15
17
  export declare function pickOfTarget(target: string | null, providers: ProviderInfo[]): Picked | null;
18
+ export declare function pickOfCli(cli: AgentKind, providers: ProviderInfo[]): Picked;
@@ -1,17 +1,38 @@
1
1
  const INSTALL_TARGET = 'providers.install.';
2
+ const ADD_TARGET = 'providers.add';
2
3
  /* What a target opens on its own, before any CLI is picked; null for a target that only lands on a row of the CLI already shown. */
3
4
  export function pickOfTarget(target, providers) {
4
- if (target === 'providers.apple') {
5
- return { kind: 'cli', cli: 'apple' };
6
- }
7
- if (!target?.startsWith(INSTALL_TARGET) || target.length === INSTALL_TARGET.length) {
8
- return null;
9
- }
10
- const cli = target.slice(INSTALL_TARGET.length);
11
- const provider = providers.find((entry) => entry.kind === cli);
12
- // A CLI the host has not reported yet is taken as missing; once it is installed and signed in, its install page gives way to its detail.
13
- if (provider !== undefined && (provider.installed || !provider.capabilities.terminal)) {
14
- return { kind: 'cli', cli };
15
- }
16
- return { kind: 'install', cli };
5
+ if (target === 'providers.apple') {
6
+ return {
7
+ kind: 'cli',
8
+ cli: 'apple'
9
+ };
10
+ }
11
+ if (target === ADD_TARGET) {
12
+ return {
13
+ kind: 'catalog'
14
+ };
15
+ }
16
+ if (!target?.startsWith(INSTALL_TARGET) || target.length === INSTALL_TARGET.length) {
17
+ return null;
18
+ }
19
+ return pickOfCli(target.slice(INSTALL_TARGET.length), providers);
17
20
  }
21
+ /*
22
+ * A CLI opened by name, from a target or from the host's page that just added it: its detail once it is there, its
23
+ * install page while it is missing. A CLI the host has not reported yet is taken as missing, so the pick holds until
24
+ * the next list names it; once it is installed and signed in, its install page gives way to its detail.
25
+ */
26
+ export function pickOfCli(cli, providers) {
27
+ const provider = providers.find(entry => entry.kind === cli);
28
+ if (provider !== undefined && (provider.installed || !provider.capabilities.terminal)) {
29
+ return {
30
+ kind: 'cli',
31
+ cli
32
+ };
33
+ }
34
+ return {
35
+ kind: 'install',
36
+ cli
37
+ };
38
+ }
@@ -1,20 +1,70 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { c as _c } from "react/compiler-runtime";
2
2
  import clsx from 'clsx';
3
3
  import { AgentIcon } from '../agents/AgentIcon.js';
4
4
  // Each CLI in its color of the usage charts, so a mark here reads as the same CLI there. A CLI without
5
5
  // a chart color of its own is muted.
6
+ import { jsx as _jsx } from "react/jsx-runtime";
6
7
  const CLI_COLORS = {
7
- claude: 'text-chart-claude',
8
- codex: 'text-chart-codex',
9
- gemini: 'text-chart-gemini',
10
- copilot: 'text-chart-copilot',
11
- nanogpt: 'text-chart-nanogpt',
12
- grok: 'text-chart-grok'
8
+ claude: 'text-chart-claude',
9
+ codex: 'text-chart-codex',
10
+ gemini: 'text-chart-gemini',
11
+ copilot: 'text-chart-copilot',
12
+ nanogpt: 'text-chart-nanogpt',
13
+ grok: 'text-chart-grok'
13
14
  };
14
- export function CliMark({ kind, size = 14, className }) {
15
- return _jsx(AgentIcon, { kind: kind, size: size, className: clsx('shrink-0', CLI_COLORS[kind] ?? 'text-text-muted', className) });
15
+ export function CliMark(t0) {
16
+ const $ = _c(7);
17
+ const {
18
+ kind,
19
+ size: t1,
20
+ className
21
+ } = t0;
22
+ const size = t1 === undefined ? 14 : t1;
23
+ const t2 = CLI_COLORS[kind] ?? "text-text-muted";
24
+ let t3;
25
+ if ($[0] !== className || $[1] !== t2) {
26
+ t3 = clsx("shrink-0", t2, className);
27
+ $[0] = className;
28
+ $[1] = t2;
29
+ $[2] = t3;
30
+ } else {
31
+ t3 = $[2];
32
+ }
33
+ let t4;
34
+ if ($[3] !== kind || $[4] !== size || $[5] !== t3) {
35
+ t4 = /*#__PURE__*/_jsx(AgentIcon, {
36
+ kind: kind,
37
+ size: size,
38
+ className: t3
39
+ });
40
+ $[3] = kind;
41
+ $[4] = size;
42
+ $[5] = t3;
43
+ $[6] = t4;
44
+ } else {
45
+ t4 = $[6];
46
+ }
47
+ return t4;
16
48
  }
17
49
  /* As tall as the title's first line, so the mark sits beside the name rather than between the two lines. */
18
- export function CliTile({ kind }) {
19
- return (_jsx("span", { className: "grid h-6 shrink-0 place-items-center", children: _jsx(CliMark, { kind: kind, size: 24 }) }));
20
- }
50
+ export function CliTile(t0) {
51
+ const $ = _c(2);
52
+ const {
53
+ kind
54
+ } = t0;
55
+ let t1;
56
+ if ($[0] !== kind) {
57
+ t1 = /*#__PURE__*/_jsx("span", {
58
+ className: "grid h-6 shrink-0 place-items-center",
59
+ children: /*#__PURE__*/_jsx(CliMark, {
60
+ kind: kind,
61
+ size: 24
62
+ })
63
+ });
64
+ $[0] = kind;
65
+ $[1] = t1;
66
+ } else {
67
+ t1 = $[1];
68
+ }
69
+ return t1;
70
+ }
@@ -1,11 +1,11 @@
1
1
  import i18next from 'i18next';
2
2
  /* What a provider offers, in one sentence, where it can be opened and whether its hooks report status. */
3
3
  export function providerAbilities(provider) {
4
- const where = provider.capabilities.chat ? i18next.t('agent-providers:abilities.chatAndTerminal') : i18next.t('agent-providers:abilities.terminalOnly');
5
- const status = provider.capabilities.hooks ? i18next.t('agent-providers:abilities.reportsStatus') : i18next.t('agent-providers:abilities.noStatus');
6
- return `${where} ${status}`;
4
+ const where = provider.capabilities.chat ? i18next.t('agent-providers:abilities.chatAndTerminal') : i18next.t('agent-providers:abilities.terminalOnly');
5
+ const status = provider.capabilities.hooks ? i18next.t('agent-providers:abilities.reportsStatus') : i18next.t('agent-providers:abilities.noStatus');
6
+ return `${where} ${status}`;
7
7
  }
8
8
  /* Whether a message sent while a turn runs may join it. Undefined while the host has not answered `provider.list`, which steers nothing. */
9
9
  export function canSteer(capabilities) {
10
- return capabilities?.steer === true;
11
- }
10
+ return capabilities?.steer === true;
11
+ }
@@ -2,51 +2,86 @@ import i18next from 'i18next';
2
2
  import { accountsOfKind } from '../agents/accounts.js';
3
3
  /* What an account says beside its name: its plan while it is ready, a short word when it is not, nothing while it is checked. */
4
4
  export function accountNote(status) {
5
- const words = (key) => i18next.t(`agent-providers:${key}`);
6
- switch (status?.state ?? 'checking') {
7
- case 'checking':
8
- return null;
9
- case 'ready':
10
- return status?.plan ? { text: status.plan, tone: 'muted' } : null;
11
- case 'signed-out':
12
- return { text: words('list.signedOut'), tone: 'warning' };
13
- case 'failed':
14
- return { text: words('status.failed'), tone: 'warning' };
15
- case 'folder-missing':
16
- return { text: words('status.folderMissing'), tone: 'warning' };
17
- case 'disabled':
18
- return { text: words('status.disabled'), tone: 'muted' };
19
- case 'not-found':
20
- return { text: words('status.notFound'), tone: 'muted' };
21
- case 'unavailable':
22
- return { text: words('status.unavailable'), tone: 'muted' };
23
- }
5
+ const words = key => i18next.t(`agent-providers:${key}`);
6
+ switch (status?.state ?? 'checking') {
7
+ case 'checking':
8
+ return null;
9
+ case 'ready':
10
+ return status?.plan ? {
11
+ text: status.plan,
12
+ tone: 'muted'
13
+ } : null;
14
+ case 'signed-out':
15
+ return {
16
+ text: words('list.signedOut'),
17
+ tone: 'warning'
18
+ };
19
+ case 'failed':
20
+ return {
21
+ text: words('status.failed'),
22
+ tone: 'warning'
23
+ };
24
+ case 'folder-missing':
25
+ return {
26
+ text: words('status.folderMissing'),
27
+ tone: 'warning'
28
+ };
29
+ case 'disabled':
30
+ return {
31
+ text: words('status.disabled'),
32
+ tone: 'muted'
33
+ };
34
+ case 'not-found':
35
+ return {
36
+ text: words('status.notFound'),
37
+ tone: 'muted'
38
+ };
39
+ case 'unavailable':
40
+ return {
41
+ text: words('status.unavailable'),
42
+ tone: 'muted'
43
+ };
44
+ }
24
45
  }
25
46
  // An account still being checked counts as usable, so a provider does not hop between groups while the checks run.
26
- const usable = (entry) => entry.status === null || entry.status.state === 'ready' || entry.status.state === 'checking';
47
+ const usable = entry => entry.status === null || entry.status.state === 'ready' || entry.status.state === 'checking';
27
48
  /*
28
49
  * The providers in the three groups of the list. A provider the host says is not set up needs setup whatever
29
50
  * its accounts say; otherwise one usable account, or none to read, makes it ready.
30
51
  */
31
52
  export function groupProviders(providers, accounts, setupStatusOf) {
32
- const groups = { ready: [], setup: [], missing: [] };
33
- for (const provider of providers) {
34
- // A provider that never runs in a terminal is no CLI to install: it is turned on in its own detail.
35
- if (!provider.installed && provider.capabilities.terminal) {
36
- groups.missing.push(provider);
37
- continue;
38
- }
39
- const entries = provider.installed ? accountsOfKind(accounts, provider.kind) : [];
40
- const hostStatus = setupStatusOf?.(provider) ?? null;
41
- if (hostStatus !== null) {
42
- groups.setup.push({ provider, entries, note: hostStatus });
43
- }
44
- else if (entries.length === 0 || entries.some(usable)) {
45
- groups.ready.push({ provider, entries, note: entries.length === 1 ? accountNote(entries[0].status) : null });
46
- }
47
- else {
48
- groups.setup.push({ provider, entries, note: accountNote(entries[0].status) });
49
- }
53
+ const groups = {
54
+ ready: [],
55
+ setup: [],
56
+ missing: []
57
+ };
58
+ for (const provider of providers) {
59
+ // A provider that never runs in a terminal is no CLI to install: it is turned on in its own detail.
60
+ if (!provider.installed && provider.capabilities.terminal) {
61
+ groups.missing.push(provider);
62
+ continue;
50
63
  }
51
- return groups;
52
- }
64
+ const entries = provider.installed ? accountsOfKind(accounts, provider.kind) : [];
65
+ const hostStatus = setupStatusOf?.(provider) ?? null;
66
+ if (hostStatus !== null) {
67
+ groups.setup.push({
68
+ provider,
69
+ entries,
70
+ note: hostStatus
71
+ });
72
+ } else if (entries.length === 0 || entries.some(usable)) {
73
+ groups.ready.push({
74
+ provider,
75
+ entries,
76
+ note: entries.length === 1 ? accountNote(entries[0].status) : null
77
+ });
78
+ } else {
79
+ groups.setup.push({
80
+ provider,
81
+ entries,
82
+ note: accountNote(entries[0].status)
83
+ });
84
+ }
85
+ }
86
+ return groups;
87
+ }
@@ -2,62 +2,96 @@ import i18next from 'i18next';
2
2
  const NAME = /^[A-Za-z_][A-Za-z0-9_]{0,127}$/;
3
3
  let drafted = 0;
4
4
  function nextKey() {
5
- drafted += 1;
6
- return `variable-${drafted}`;
5
+ drafted += 1;
6
+ return `variable-${drafted}`;
7
7
  }
8
8
  export function draftsOf(env) {
9
- return (env ?? []).map((variable) => ({
10
- key: nextKey(),
11
- name: variable.name,
12
- value: variable.value,
13
- sensitive: variable.sensitive,
14
- kept: variable.sensitive && variable.valueRedacted === true ? variable.name : null
15
- }));
9
+ return (env ?? []).map(variable => ({
10
+ key: nextKey(),
11
+ name: variable.name,
12
+ value: variable.value,
13
+ sensitive: variable.sensitive,
14
+ kept: variable.sensitive && variable.valueRedacted === true ? variable.name : null
15
+ }));
16
16
  }
17
17
  export function emptyDraft(sensitive) {
18
- return { key: nextKey(), name: '', value: '', sensitive, kept: null };
18
+ return {
19
+ key: nextKey(),
20
+ name: '',
21
+ value: '',
22
+ sensitive,
23
+ kept: null
24
+ };
19
25
  }
20
26
  /*
21
27
  * A value the keychain holds only counts under the name it was kept under, and only while it stays
22
28
  * sensitive: the machine finds it by that name, and never hands it out to be stored in plain text.
23
29
  */
24
30
  function keepsValue(draft) {
25
- return draft.value === '' && draft.sensitive && draft.kept === draft.name;
31
+ return draft.value === '' && draft.sensitive && draft.kept === draft.name;
26
32
  }
27
33
  /* The first thing that keeps these from being saved, in a sentence; null when they can be. */
28
34
  export function variablesProblem(drafts) {
29
- const words = (key, name) => i18next.t(`agent-providers:account.variables.problem.${key}`, { name });
30
- const seen = new Set();
31
- for (const draft of drafts) {
32
- const name = draft.name.trim();
33
- if (name === '') {
34
- return words('noName', '');
35
- }
36
- if (!NAME.test(name)) {
37
- return words('invalidName', name);
38
- }
39
- if (seen.has(name)) {
40
- return words('duplicate', name);
41
- }
42
- seen.add(name);
43
- if (draft.value === '' && !keepsValue({ ...draft, name })) {
44
- return words('noValue', name);
45
- }
35
+ const words = (key, name) => i18next.t(`agent-providers:account.variables.problem.${key}`, {
36
+ name
37
+ });
38
+ const seen = new Set();
39
+ for (const draft of drafts) {
40
+ const name = draft.name.trim();
41
+ if (name === '') {
42
+ return words('noName', '');
46
43
  }
47
- return null;
44
+ if (!NAME.test(name)) {
45
+ return words('invalidName', name);
46
+ }
47
+ if (seen.has(name)) {
48
+ return words('duplicate', name);
49
+ }
50
+ seen.add(name);
51
+ if (draft.value === '' && !keepsValue({
52
+ ...draft,
53
+ name
54
+ })) {
55
+ return words('noValue', name);
56
+ }
57
+ }
58
+ return null;
48
59
  }
49
60
  /* The variables as `accounts.save` takes them; a kept value goes back empty and redacted, so the machine keeps what it has. */
50
61
  export function variablesOf(drafts) {
51
- return drafts.map((draft) => {
52
- const name = draft.name.trim();
53
- if (keepsValue({ ...draft, name })) {
54
- return { name, value: '', sensitive: true, valueRedacted: true };
55
- }
56
- return { name, value: draft.value, sensitive: draft.sensitive };
57
- });
62
+ return drafts.map(draft => {
63
+ const name = draft.name.trim();
64
+ if (keepsValue({
65
+ ...draft,
66
+ name
67
+ })) {
68
+ return {
69
+ name,
70
+ value: '',
71
+ sensitive: true,
72
+ valueRedacted: true
73
+ };
74
+ }
75
+ return {
76
+ name,
77
+ value: draft.value,
78
+ sensitive: draft.sensitive
79
+ };
80
+ });
58
81
  }
59
82
  /* Whether the drafts say something other than what the machine holds. */
60
83
  export function variablesChanged(drafts, env) {
61
- return (JSON.stringify(variablesOf(drafts)) !==
62
- JSON.stringify((env ?? []).map(({ name, value, sensitive, valueRedacted }) => ({ name, value, sensitive, ...(valueRedacted ? { valueRedacted } : {}) }))));
63
- }
84
+ return JSON.stringify(variablesOf(drafts)) !== JSON.stringify((env ?? []).map(({
85
+ name,
86
+ value,
87
+ sensitive,
88
+ valueRedacted
89
+ }) => ({
90
+ name,
91
+ value,
92
+ sensitive,
93
+ ...(valueRedacted ? {
94
+ valueRedacted
95
+ } : {})
96
+ })));
97
+ }
package/dist/scope.js CHANGED
@@ -2,9 +2,9 @@ import { createContext, useContext } from 'react';
2
2
  export const ChatScopeContext = createContext(null);
3
3
  /* Throws outside a scope on purpose: a component that reads a chat has to know which host it runs on. */
4
4
  export function useChatScope() {
5
- const scope = useContext(ChatScopeContext);
6
- if (scope === null) {
7
- throw new Error('This component reads a chat, so it has to be rendered inside a ChatScopeContext');
8
- }
9
- return scope;
10
- }
5
+ const scope = useContext(ChatScopeContext);
6
+ if (scope === null) {
7
+ throw new Error("This component reads a chat, so it has to be rendered inside a ChatScopeContext");
8
+ }
9
+ return scope;
10
+ }
@@ -2,18 +2,18 @@ import i18next from 'i18next';
2
2
  import { Brain, ChartNoAxesColumn } from 'lucide-react';
3
3
  /* The agent CLIs of the host and the accounts they sign in with: `ProvidersPane`. */
4
4
  export const PROVIDERS_SECTION = {
5
- id: 'providers',
6
- icon: Brain,
7
- split: true,
8
- label: () => i18next.t('agent-providers:section.label'),
9
- description: () => i18next.t('agent-providers:section.description')
5
+ id: 'providers',
6
+ icon: Brain,
7
+ split: true,
8
+ label: () => i18next.t('agent-providers:section.label'),
9
+ description: () => i18next.t('agent-providers:section.description')
10
10
  };
11
11
  /* The currency of the usage page and the way to it: `UsagePane`. */
12
12
  export const USAGE_SECTION = {
13
- id: 'usage',
14
- icon: ChartNoAxesColumn,
15
- label: () => i18next.t('agent-usage:section.label'),
16
- description: () => i18next.t('agent-usage:section.description')
13
+ id: 'usage',
14
+ icon: ChartNoAxesColumn,
15
+ label: () => i18next.t('agent-usage:section.label'),
16
+ description: () => i18next.t('agent-usage:section.description')
17
17
  };
18
18
  /*
19
19
  * The entry the dialog takes for a section, with the pane the app hands it: the pane of this package
@@ -21,12 +21,12 @@ export const USAGE_SECTION = {
21
21
  * draws, since the words follow the language.
22
22
  */
23
23
  export function settingsSection(section, pane) {
24
- return {
25
- id: section.id,
26
- icon: section.icon,
27
- label: section.label(),
28
- description: section.description(),
29
- pane,
30
- split: section.split
31
- };
32
- }
24
+ return {
25
+ id: section.id,
26
+ icon: section.icon,
27
+ label: section.label(),
28
+ description: section.description(),
29
+ pane,
30
+ split: section.split
31
+ };
32
+ }