@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
@@ -6,25 +6,25 @@ export const MENTION_DRAG_TYPE = 'application/x-adecore-mention';
6
6
  export const LEGACY_MENTION_DRAG_TYPE = 'application/x-ruimte-mention';
7
7
  export const MENTION_DRAG_TYPES = [MENTION_DRAG_TYPE, LEGACY_MENTION_DRAG_TYPE];
8
8
  export function carriesMentions(types) {
9
- return MENTION_DRAG_TYPES.some((type) => types.includes(type));
9
+ return MENTION_DRAG_TYPES.some(type => types.includes(type));
10
10
  }
11
11
  export function droppedMentions(data) {
12
- const text = data.getData(MENTION_DRAG_TYPE) || data.getData(LEGACY_MENTION_DRAG_TYPE);
13
- return text.trim() === '' ? [] : text.trim().split(/\s+/);
12
+ const text = data.getData(MENTION_DRAG_TYPE) || data.getData(LEGACY_MENTION_DRAG_TYPE);
13
+ return text.trim() === '' ? [] : text.trim().split(/\s+/);
14
14
  }
15
15
  export function writeMentionDrag(data, paths, legacy = true) {
16
- const text = paths.join(' ');
17
- data.setData(MENTION_DRAG_TYPE, text);
18
- if (legacy) {
19
- data.setData(LEGACY_MENTION_DRAG_TYPE, text);
20
- }
16
+ const text = paths.join(' ');
17
+ data.setData(MENTION_DRAG_TYPE, text);
18
+ if (legacy) {
19
+ data.setData(LEGACY_MENTION_DRAG_TYPE, text);
20
+ }
21
21
  }
22
22
  function isBoundary(char) {
23
- return char === undefined || /\s/.test(char);
23
+ return char === undefined || /\s/.test(char);
24
24
  }
25
25
  // A path at the end of a sentence still counts, so "open @a.ts." is a mention of a.ts.
26
26
  function isTokenEnd(char) {
27
- return isBoundary(char) || /[.,;:!?)]/.test(char);
27
+ return isBoundary(char) || /[.,;:!?)]/.test(char);
28
28
  }
29
29
  /*
30
30
  * The `<sigil>word` the caret sits in, if any. The sigil has to open a word (start of text or after
@@ -32,152 +32,192 @@ function isTokenEnd(char) {
32
32
  * closed with whitespace yet.
33
33
  */
34
34
  function findQuery(text, caret, sigil) {
35
- const before = text.slice(0, caret);
36
- const at = before.lastIndexOf(sigil);
37
- if (at < 0 || !isBoundary(before[at - 1])) {
38
- return null;
39
- }
40
- const query = before.slice(at + 1);
41
- if (/\s/.test(query) || !isBoundary(text[caret])) {
42
- return null;
43
- }
44
- return { start: at, query };
35
+ const before = text.slice(0, caret);
36
+ const at = before.lastIndexOf(sigil);
37
+ if (at < 0 || !isBoundary(before[at - 1])) {
38
+ return null;
39
+ }
40
+ const query = before.slice(at + 1);
41
+ if (/\s/.test(query) || !isBoundary(text[caret])) {
42
+ return null;
43
+ }
44
+ return {
45
+ start: at,
46
+ query
47
+ };
45
48
  }
46
49
  export function findMentionQuery(text, caret) {
47
- return findQuery(text, caret, '@');
50
+ return findQuery(text, caret, '@');
48
51
  }
49
52
  /* The `$word` the caret sits in. The name has to start with a letter, so `$20` and `$1e6` stay text. */
50
53
  export function findSkillQuery(text, caret) {
51
- const found = findQuery(text, caret, '$');
52
- return found === null || (found.query !== '' && !/^[A-Za-z]/.test(found.query)) ? null : found;
54
+ const found = findQuery(text, caret, '$');
55
+ return found === null || found.query !== '' && !/^[A-Za-z]/.test(found.query) ? null : found;
53
56
  }
54
57
  /* Replaces the `<sigil>query` under the caret with the chosen token and a space, and says where the caret goes. */
55
58
  export function insertToken(text, query, sigil, value) {
56
- const end = query.start + 1 + query.query.length;
57
- const token = `${sigil}${value} `;
58
- return { text: `${text.slice(0, query.start)}${token}${text.slice(end)}`, caret: query.start + token.length };
59
+ const end = query.start + 1 + query.query.length;
60
+ const token = `${sigil}${value} `;
61
+ return {
62
+ text: `${text.slice(0, query.start)}${token}${text.slice(end)}`,
63
+ caret: query.start + token.length
64
+ };
59
65
  }
60
66
  /* Takes the `<sigil>query` under the caret out, for a pick that lands beside the text instead of in it. */
61
67
  export function dropQuery(text, query) {
62
- return {
63
- text: `${text.slice(0, query.start)}${text.slice(query.start + 1 + query.query.length)}`,
64
- caret: query.start
65
- };
68
+ return {
69
+ text: `${text.slice(0, query.start)}${text.slice(query.start + 1 + query.query.length)}`,
70
+ caret: query.start
71
+ };
66
72
  }
67
73
  export function insertMention(text, query, path) {
68
- return insertToken(text, query, '@', path);
74
+ return insertToken(text, query, '@', path);
69
75
  }
70
76
  export function insertSkill(text, query, name) {
71
- return insertToken(text, query, '$', name);
77
+ return insertToken(text, query, '$', name);
72
78
  }
73
- export const NO_MENTION_SEARCH = { query: null, files: [] };
79
+ export const NO_MENTION_SEARCH = {
80
+ query: null,
81
+ files: []
82
+ };
74
83
  /* What Enter or Tab takes from the `@` list at `index`. Files still on screen from an older query are never taken. */
75
84
  export function mentionPick(index, chats, search, query) {
76
- const chat = chats[index];
77
- if (chat !== undefined) {
78
- return { kind: 'chat', chat };
79
- }
80
- if (search.query !== query) {
81
- return null;
82
- }
83
- const path = search.files[index - chats.length] ?? search.files[0];
84
- return path === undefined ? null : { kind: 'file', path };
85
+ const chat = chats[index];
86
+ if (chat !== undefined) {
87
+ return {
88
+ kind: 'chat',
89
+ chat
90
+ };
91
+ }
92
+ if (search.query !== query) {
93
+ return null;
94
+ }
95
+ const path = search.files[index - chats.length] ?? search.files[0];
96
+ return path === undefined ? null : {
97
+ kind: 'file',
98
+ path
99
+ };
85
100
  }
86
101
  function findToken(text, sigil, value, from) {
87
- const token = `${sigil}${value}`;
88
- let index = text.indexOf(token, from);
89
- while (index >= 0) {
90
- if (isBoundary(text[index - 1]) && isTokenEnd(text[index + token.length])) {
91
- return index;
92
- }
93
- index = text.indexOf(token, index + 1);
102
+ const token = `${sigil}${value}`;
103
+ let index = text.indexOf(token, from);
104
+ while (index >= 0) {
105
+ if (isBoundary(text[index - 1]) && isTokenEnd(text[index + token.length])) {
106
+ return index;
94
107
  }
95
- return -1;
108
+ index = text.indexOf(token, index + 1);
109
+ }
110
+ return -1;
96
111
  }
97
112
  function present(text, sigil, chosen) {
98
- const found = [];
99
- for (const value of new Set(chosen)) {
100
- const index = findToken(text, sigil, value, 0);
101
- if (index >= 0) {
102
- found.push({ index, value });
103
- }
113
+ const found = [];
114
+ for (const value of new Set(chosen)) {
115
+ const index = findToken(text, sigil, value, 0);
116
+ if (index >= 0) {
117
+ found.push({
118
+ index,
119
+ value
120
+ });
104
121
  }
105
- return found.sort((a, b) => a.index - b.index).map((entry) => entry.value);
122
+ }
123
+ return found.sort((a, b) => a.index - b.index).map(entry => entry.value);
106
124
  }
107
125
  /* The chosen mentions that still sit in the text as a whole `@path` token, in text order and without doubles. */
108
126
  export function presentMentions(text, chosen) {
109
- return present(text, '@', chosen);
127
+ return present(text, '@', chosen);
110
128
  }
111
129
  /* The chosen skills that still sit in the text as a whole `$name` token, in text order and without doubles. */
112
130
  export function presentSkills(text, chosen) {
113
- return present(text, '$', chosen);
131
+ return present(text, '$', chosen);
114
132
  }
115
133
  /* The characters a segment stands for, sigil included; joined, the segments spell the text they were cut from. */
116
134
  export function chipText(segment) {
117
- if (segment.kind === 'mention') {
118
- return `@${segment.path}`;
119
- }
120
- if (segment.kind === 'skill') {
121
- return `$${segment.name}`;
122
- }
123
- return segment.text;
135
+ if (segment.kind === 'mention') {
136
+ return `@${segment.path}`;
137
+ }
138
+ if (segment.kind === 'skill') {
139
+ return `$${segment.name}`;
140
+ }
141
+ return segment.text;
124
142
  }
125
143
  /*
126
144
  * The paths in a pasted text that is nothing but `@path` tokens, which is what copying mentions from
127
145
  * a list of files puts on the clipboard. Any other text, an email address included, is text.
128
146
  */
129
147
  export function pastedMentions(text) {
130
- const tokens = text.trim().split(/\s+/);
131
- if (tokens.some((token) => !/^@[^\s@]+$/.test(token))) {
132
- return [];
133
- }
134
- return [...new Set(tokens.map((token) => token.slice(1)))];
148
+ const tokens = text.trim().split(/\s+/);
149
+ if (tokens.some(token => !/^@[^\s@]+$/.test(token))) {
150
+ return [];
151
+ }
152
+ return [...new Set(tokens.map(token => token.slice(1)))];
135
153
  }
136
154
  /*
137
155
  * Where the chosen mentions and skills sit in the text, in text order; longer values win when one
138
156
  * prefixes another. A token that overlaps an excluded range (a code span, say) is text.
139
157
  */
140
158
  export function chipRanges(text, mentions, skills = [], excluded = []) {
141
- const tokens = [
142
- ...[...new Set(mentions)].map((value) => ({ sigil: '@', kind: 'mention', value })),
143
- ...[...new Set(skills)].map((value) => ({ sigil: '$', kind: 'skill', value }))
144
- ].sort((a, b) => b.value.length - a.value.length);
145
- const allowed = (from, to) => !excluded.some((range) => from < range.to && to > range.from);
146
- const ranges = [];
147
- let cursor = 0;
148
- while (cursor < text.length) {
149
- let best = null;
150
- for (const token of tokens) {
151
- const length = token.value.length + 1;
152
- let index = findToken(text, token.sigil, token.value, cursor);
153
- while (index >= 0 && !allowed(index, index + length)) {
154
- index = findToken(text, token.sigil, token.value, index + 1);
155
- }
156
- if (index >= 0 && (best === null || index < best.from)) {
157
- best = { from: index, to: index + length, kind: token.kind, value: token.value };
158
- }
159
- }
160
- if (best === null) {
161
- break;
162
- }
163
- ranges.push(best);
164
- cursor = best.to;
159
+ const tokens = [...[...new Set(mentions)].map(value => ({
160
+ sigil: '@',
161
+ kind: 'mention',
162
+ value
163
+ })), ...[...new Set(skills)].map(value => ({
164
+ sigil: '$',
165
+ kind: 'skill',
166
+ value
167
+ }))].sort((a, b) => b.value.length - a.value.length);
168
+ const allowed = (from, to) => !excluded.some(range => from < range.to && to > range.from);
169
+ const ranges = [];
170
+ let cursor = 0;
171
+ while (cursor < text.length) {
172
+ let best = null;
173
+ for (const token of tokens) {
174
+ const length = token.value.length + 1;
175
+ let index = findToken(text, token.sigil, token.value, cursor);
176
+ while (index >= 0 && !allowed(index, index + length)) {
177
+ index = findToken(text, token.sigil, token.value, index + 1);
178
+ }
179
+ if (index >= 0 && (best === null || index < best.from)) {
180
+ best = {
181
+ from: index,
182
+ to: index + length,
183
+ kind: token.kind,
184
+ value: token.value
185
+ };
186
+ }
165
187
  }
166
- return ranges;
188
+ if (best === null) {
189
+ break;
190
+ }
191
+ ranges.push(best);
192
+ cursor = best.to;
193
+ }
194
+ return ranges;
167
195
  }
168
196
  /* Splits the text so a renderer can draw the mentions and skills as chips. */
169
197
  export function tokenizeChips(text, mentions, skills = []) {
170
- const segments = [];
171
- let cursor = 0;
172
- for (const range of chipRanges(text, mentions, skills)) {
173
- if (range.from > cursor) {
174
- segments.push({ kind: 'text', text: text.slice(cursor, range.from) });
175
- }
176
- segments.push(range.kind === 'mention' ? { kind: 'mention', path: range.value } : { kind: 'skill', name: range.value });
177
- cursor = range.to;
178
- }
179
- if (cursor < text.length) {
180
- segments.push({ kind: 'text', text: text.slice(cursor) });
198
+ const segments = [];
199
+ let cursor = 0;
200
+ for (const range of chipRanges(text, mentions, skills)) {
201
+ if (range.from > cursor) {
202
+ segments.push({
203
+ kind: 'text',
204
+ text: text.slice(cursor, range.from)
205
+ });
181
206
  }
182
- return segments;
183
- }
207
+ segments.push(range.kind === 'mention' ? {
208
+ kind: 'mention',
209
+ path: range.value
210
+ } : {
211
+ kind: 'skill',
212
+ name: range.value
213
+ });
214
+ cursor = range.to;
215
+ }
216
+ if (cursor < text.length) {
217
+ segments.push({
218
+ kind: 'text',
219
+ text: text.slice(cursor)
220
+ });
221
+ }
222
+ return segments;
223
+ }
@@ -1,58 +1,55 @@
1
1
  import { chatStorageAdapter, hydrateChatStorage } from '../storage.js';
2
2
  export function persistedJson(key, parse, fallback, legacyKeys = () => []) {
3
- let memory = fallback;
4
- let unwritten = false;
5
- const currentKey = () => (typeof key === 'string' ? key : key());
6
- return {
7
- read: () => {
8
- hydrateChatStorage();
9
- if (unwritten) {
10
- return memory;
11
- }
12
- try {
13
- const storage = chatStorageAdapter();
14
- if (!storage) {
15
- return memory;
16
- }
17
- let raw = storage.getItem(currentKey());
18
- if (raw === null) {
19
- for (const legacy of legacyKeys()) {
20
- raw = storage.getItem(legacy);
21
- if (raw !== null) {
22
- // Keep the old key for clients still using it, and migrate without changing the record.
23
- try {
24
- storage.setItem(currentKey(), raw);
25
- }
26
- catch {
27
- // A full storage still lets the existing record be read.
28
- }
29
- break;
30
- }
31
- }
32
- }
33
- memory = parse(raw);
34
- return memory;
35
- }
36
- catch {
37
- return memory;
38
- }
39
- },
40
- write: (value) => {
41
- hydrateChatStorage();
42
- memory = value;
43
- unwritten = true;
44
- try {
45
- const storage = chatStorageAdapter();
46
- if (!storage) {
47
- return false;
48
- }
49
- storage.setItem(currentKey(), JSON.stringify(value));
50
- unwritten = false;
51
- return true;
52
- }
53
- catch {
54
- return false;
3
+ let memory = fallback;
4
+ let unwritten = false;
5
+ const currentKey = () => typeof key === 'string' ? key : key();
6
+ return {
7
+ read: () => {
8
+ hydrateChatStorage();
9
+ if (unwritten) {
10
+ return memory;
11
+ }
12
+ try {
13
+ const storage = chatStorageAdapter();
14
+ if (!storage) {
15
+ return memory;
16
+ }
17
+ let raw = storage.getItem(currentKey());
18
+ if (raw === null) {
19
+ for (const legacy of legacyKeys()) {
20
+ raw = storage.getItem(legacy);
21
+ if (raw !== null) {
22
+ // Keep the old key for clients still using it, and migrate without changing the record.
23
+ try {
24
+ storage.setItem(currentKey(), raw);
25
+ } catch {
26
+ // A full storage still lets the existing record be read.
27
+ }
28
+ break;
55
29
  }
30
+ }
31
+ }
32
+ memory = parse(raw);
33
+ return memory;
34
+ } catch {
35
+ return memory;
36
+ }
37
+ },
38
+ write: value => {
39
+ hydrateChatStorage();
40
+ memory = value;
41
+ unwritten = true;
42
+ try {
43
+ const storage = chatStorageAdapter();
44
+ if (!storage) {
45
+ return false;
56
46
  }
57
- };
58
- }
47
+ storage.setItem(currentKey(), JSON.stringify(value));
48
+ unwritten = false;
49
+ return true;
50
+ } catch {
51
+ return false;
52
+ }
53
+ }
54
+ };
55
+ }
@@ -9,6 +9,7 @@ export interface ChatPreferences {
9
9
  accountByMachine: Record<string, Partial<Record<AgentKind, string>>>;
10
10
  readingWidth: ChatReadingWidth;
11
11
  sendKey: ChatSendKey;
12
+ favoriteModels: Partial<Record<AgentKind, string[]>>;
12
13
  changedAt: number;
13
14
  }
14
15
  export declare const DEFAULT_CHAT_PREFERENCES: ChatPreferences;
@@ -29,4 +30,7 @@ export declare function rememberReadingWidth(readingWidth: ChatReadingWidth): vo
29
30
  export declare function rememberSendKey(sendKey: ChatSendKey): void;
30
31
  export declare function rememberChatSelection(provider: AgentKind, selection: ModelSelection): void;
31
32
  export declare function rememberChatAccount(scopeId: string, provider: AgentKind, account: string | null): void;
33
+ export declare function favoriteModelsOf(favorites: ChatPreferences['favoriteModels'], provider: AgentKind): ReadonlySet<string>;
34
+ export declare function withFavoriteToggled(preferences: ChatPreferences, provider: AgentKind, slug: string): ChatPreferences;
35
+ export declare function toggleFavoriteModel(provider: AgentKind, slug: string): void;
32
36
  export declare function forgetChatSelection(provider: AgentKind): void;