@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
@@ -1,4 +1,4 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { c as _c } from "react/compiler-runtime";
2
2
  import { Fragment, useContext, useEffect, useState } from 'react';
3
3
  import clsx from 'clsx';
4
4
  import i18next from 'i18next';
@@ -8,6 +8,7 @@ import { matchCommandLook } from '../../logic/command-looks.js';
8
8
  import { exitCodeOf, fileChanges, hasOutput, hasToolBody, liveOutput, readImagePath, shellCommand, toolCallLines, toolStartedAt, toolSummary, toolSummaryIsPath, unifiedChanges } from '../../logic/tools.js';
9
9
  import { useOpenForFind } from '../find-reveal.js';
10
10
  import { useChatHost } from '../../../host.js';
11
+ import { useCommandNames } from '../../../host-hooks.js';
11
12
  import { lazyNamed } from '../../../lazy.js';
12
13
  import { useChatActions } from '../../actions.js';
13
14
  import { ChatScopeContext, useChatScope } from '../../../scope.js';
@@ -23,169 +24,1599 @@ import { DiffStack, ReviewStackView } from '../diff/DiffStack.js';
23
24
  import { reviewEntries } from '../diff/review-plan.js';
24
25
  import { useReviewStack } from '../diff/use-review-stack.js';
25
26
  // A checkpoint opens its renderer only when a file is expanded.
27
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
26
28
  const UnifiedDiff = lazyNamed(() => import('../UnifiedDiff.js'), 'default');
27
29
  const OUTPUT_LIMIT = 4000;
28
30
  /* The line that says how much of a text past the limit is left out; empty for a text within it. */
29
31
  function clipNotice(text) {
30
- return text.length > OUTPUT_LIMIT ? `\n${i18next.t('agent-chat:work.moreCharacters', { count: text.length - OUTPUT_LIMIT })}` : '';
32
+ return text.length > OUTPUT_LIMIT ? `\n${i18next.t('agent-chat:work.moreCharacters', {
33
+ count: text.length - OUTPUT_LIMIT
34
+ })}` : '';
31
35
  }
32
36
  function clip(text) {
33
- return text.slice(0, OUTPUT_LIMIT) + clipNotice(text);
37
+ return text.slice(0, OUTPUT_LIMIT) + clipNotice(text);
34
38
  }
35
39
  const BRAND = 'font-semibold';
36
40
  /* `text` with `brand` in semibold where it names it, as a sentence about a look does. */
37
41
  function withBrand(text, brands) {
38
- for (const brand of brands) {
39
- const at = brand === '' ? -1 : text.indexOf(brand);
40
- if (at !== -1) {
41
- return (_jsxs(_Fragment, { children: [text.slice(0, at), _jsx("span", { className: BRAND, children: brand }), text.slice(at + brand.length)] }));
42
- }
42
+ for (const brand of brands) {
43
+ const at = brand === '' ? -1 : text.indexOf(brand);
44
+ if (at !== -1) {
45
+ return /*#__PURE__*/_jsxs(_Fragment, {
46
+ children: [text.slice(0, at), /*#__PURE__*/_jsx("span", {
47
+ className: BRAND,
48
+ children: brand
49
+ }), text.slice(at + brand.length)]
50
+ });
43
51
  }
44
- return text;
52
+ }
53
+ return text;
54
+ }
55
+ function hasNames(look) {
56
+ return look.useNames !== undefined;
45
57
  }
46
58
  /* The detail of a look's run, with the words its host names drawn as those names. */
47
- function NamedLookDetail({ run, chatId, useNames }) {
48
- const scope = useContext(ChatScopeContext);
49
- const nameOf = useNames(scope?.id ?? '', chatId);
50
- const names = run.words.flatMap((word) => {
59
+ function NamedLookDetail(t0) {
60
+ const $ = _c(9);
61
+ const {
62
+ run,
63
+ chatId,
64
+ look
65
+ } = t0;
66
+ const scope = useContext(ChatScopeContext);
67
+ const nameOf = useCommandNames(look, scope?.id ?? "", chatId);
68
+ let t1;
69
+ if ($[0] !== nameOf || $[1] !== run.words) {
70
+ let t2;
71
+ if ($[3] !== nameOf) {
72
+ t2 = word => {
51
73
  const name = nameOf(word.text, word.option);
52
- return name === null ? [] : [{ start: word.start, end: word.end, word: word.text, name }];
74
+ return name === null ? [] : [{
75
+ start: word.start,
76
+ end: word.end,
77
+ word: word.text,
78
+ name
79
+ }];
80
+ };
81
+ $[3] = nameOf;
82
+ $[4] = t2;
83
+ } else {
84
+ t2 = $[4];
85
+ }
86
+ t1 = run.words.flatMap(t2);
87
+ $[0] = nameOf;
88
+ $[1] = run.words;
89
+ $[2] = t1;
90
+ } else {
91
+ t1 = $[2];
92
+ }
93
+ const names = t1;
94
+ let t2;
95
+ if ($[5] !== names || $[6] !== run.code || $[7] !== run.detail) {
96
+ t2 = /*#__PURE__*/_jsx(ShellCommand, {
97
+ command: run.detail,
98
+ code: run.code,
99
+ names: names
53
100
  });
54
- return _jsx(ShellCommand, { command: run.detail, code: run.code, names: names });
101
+ $[5] = names;
102
+ $[6] = run.code;
103
+ $[7] = run.detail;
104
+ $[8] = t2;
105
+ } else {
106
+ t2 = $[8];
107
+ }
108
+ return t2;
55
109
  }
56
- function LookDetail({ run, chatId }) {
57
- const { useNames } = run.look;
58
- if (useNames === undefined) {
59
- return _jsx(ShellCommand, { command: run.detail, code: run.code });
110
+ function LookDetail(t0) {
111
+ const $ = _c(7);
112
+ const {
113
+ run,
114
+ chatId
115
+ } = t0;
116
+ const {
117
+ look
118
+ } = run;
119
+ if (!hasNames(look)) {
120
+ let t1;
121
+ if ($[0] !== run.code || $[1] !== run.detail) {
122
+ t1 = /*#__PURE__*/_jsx(ShellCommand, {
123
+ command: run.detail,
124
+ code: run.code
125
+ });
126
+ $[0] = run.code;
127
+ $[1] = run.detail;
128
+ $[2] = t1;
129
+ } else {
130
+ t1 = $[2];
60
131
  }
61
- // Keyed by the look, so a row whose command turns into another look's starts its hooks again.
62
- return _jsx(NamedLookDetail, { run: run, chatId: chatId, useNames: useNames }, run.look.program);
132
+ return t1;
133
+ }
134
+ let t1;
135
+ if ($[3] !== chatId || $[4] !== look || $[5] !== run) {
136
+ t1 = /*#__PURE__*/_jsx(NamedLookDetail, {
137
+ run: run,
138
+ chatId: chatId,
139
+ look: look
140
+ }, look.program);
141
+ $[3] = chatId;
142
+ $[4] = look;
143
+ $[5] = run;
144
+ $[6] = t1;
145
+ } else {
146
+ t1 = $[6];
147
+ }
148
+ return t1;
63
149
  }
64
150
  const TAG = 'shrink-0 rounded bg-surface-hover px-1.5 text-text-faint';
65
151
  /* What else the line ran, in quiet tags: the other programs and a heredoc, and how many more runs of a look. */
66
- function LookTags({ run }) {
67
- const { t } = useTranslation('agent-chat');
68
- const also = run.heredoc ? [...run.others, t('work.heredoc')] : run.others;
69
- return (_jsxs(_Fragment, { children: [also.length > 0 && _jsx("span", { className: TAG, children: t('work.alsoRan', { programs: also.join(', ') }) }), run.more > 0 && _jsx("span", { className: TAG, children: t('work.moreRuns', { count: run.more }) })] }));
152
+ function LookTags(t0) {
153
+ const $ = _c(10);
154
+ const {
155
+ run
156
+ } = t0;
157
+ const {
158
+ t
159
+ } = useTranslation("agent-chat");
160
+ let t1;
161
+ if ($[0] !== run.heredoc || $[1] !== run.others || $[2] !== t) {
162
+ const also = run.heredoc ? [...run.others, t("work.heredoc")] : run.others;
163
+ t1 = also.length > 0 && /*#__PURE__*/_jsx("span", {
164
+ className: TAG,
165
+ children: t("work.alsoRan", {
166
+ programs: also.join(", ")
167
+ })
168
+ });
169
+ $[0] = run.heredoc;
170
+ $[1] = run.others;
171
+ $[2] = t;
172
+ $[3] = t1;
173
+ } else {
174
+ t1 = $[3];
175
+ }
176
+ let t2;
177
+ if ($[4] !== run.more || $[5] !== t) {
178
+ t2 = run.more > 0 && /*#__PURE__*/_jsx("span", {
179
+ className: TAG,
180
+ children: t("work.moreRuns", {
181
+ count: run.more
182
+ })
183
+ });
184
+ $[4] = run.more;
185
+ $[5] = t;
186
+ $[6] = t2;
187
+ } else {
188
+ t2 = $[6];
189
+ }
190
+ let t3;
191
+ if ($[7] !== t1 || $[8] !== t2) {
192
+ t3 = /*#__PURE__*/_jsxs(_Fragment, {
193
+ children: [t1, t2]
194
+ });
195
+ $[7] = t1;
196
+ $[8] = t2;
197
+ $[9] = t3;
198
+ } else {
199
+ t3 = $[9];
200
+ }
201
+ return t3;
70
202
  }
71
203
  /*
72
204
  * The line of a call, a subagent or a group. Without `onToggle` it has nothing to open: no chevron, and
73
205
  * not a button. `time` shows at the right edge while the line is hovered or focused.
74
206
  */
75
- export function ToggleLine({ icon, label, brand, detail, command, look, path, open = false, onToggle, failed, live, trailing, time, className }) {
76
- const classes = clsx(
77
- // Fix the width so long commands reach the truncation inside the negative margins.
78
- 'group/line -mx-1 mb-0.5 flex h-7 w-[calc(100%+8px)] items-center gap-2 rounded-md px-1 text-left text-xs text-text-muted', onToggle !== undefined && 'hover:bg-surface-hover', failed && 'text-status-error', className);
79
- const content = (_jsxs(_Fragment, { children: [_jsx("span", { className: clsx(ROW_GUTTER, live && 'text-accent'), children: icon }), _jsxs("span", { className: "flex min-w-0 items-baseline gap-2", children: [_jsxs("span", { className: clsx('shrink-0', live && 'chat-live-text'), children: [brand !== undefined && _jsx("span", { className: BRAND, children: brand }), brand !== undefined && label !== '' && ' ', label] }), look !== undefined ? (_jsxs(_Fragment, { children: [look.run.detail !== '' && (_jsx("span", { "data-find-field": "summary", className: "min-w-0 truncate font-mono text-code text-text-faint", children: _jsx(LookDetail, { run: look.run, chatId: look.chatId }) })), _jsx(LookTags, { run: look.run })] })) : (detail && (_jsx("span", { "data-find-field": "summary", className: "min-w-0 truncate font-mono text-code text-text-faint", children: command ? _jsx(ShellCommand, { command: detail }) : path ? _jsx(MiddleTruncate, { text: detail }) : detail })))] }), _jsx("span", { className: "grow" }), trailing, time !== undefined && _jsx(RowTime, { at: time }), failed && _jsx(Icon, { icon: X, size: 12, className: "shrink-0" }), onToggle !== undefined && (_jsx(Icon, { icon: ChevronRight, size: 12, className: clsx('shrink-0 text-text-faint transition-transform', open && 'rotate-90') }))] }));
80
- if (onToggle === undefined) {
81
- return _jsx("div", { className: classes, children: content });
207
+ export function ToggleLine(t0) {
208
+ const $ = _c(48);
209
+ const {
210
+ icon,
211
+ label,
212
+ brand,
213
+ detail,
214
+ command,
215
+ look,
216
+ path,
217
+ open: t1,
218
+ onToggle,
219
+ failed,
220
+ live,
221
+ trailing,
222
+ time,
223
+ className
224
+ } = t0;
225
+ const open = t1 === undefined ? false : t1;
226
+ const t2 = onToggle !== undefined && "hover:bg-surface-hover";
227
+ const t3 = failed && "text-status-error";
228
+ let t4;
229
+ if ($[0] !== className || $[1] !== t2 || $[2] !== t3) {
230
+ t4 = clsx("group/line -mx-1 mb-0.5 flex h-7 w-[calc(100%+8px)] items-center gap-2 rounded-md px-1 text-left text-xs text-text-muted", t2, t3, className);
231
+ $[0] = className;
232
+ $[1] = t2;
233
+ $[2] = t3;
234
+ $[3] = t4;
235
+ } else {
236
+ t4 = $[3];
237
+ }
238
+ const classes = t4;
239
+ const t5 = live && "text-accent";
240
+ let t6;
241
+ if ($[4] !== t5) {
242
+ t6 = clsx(ROW_GUTTER, t5);
243
+ $[4] = t5;
244
+ $[5] = t6;
245
+ } else {
246
+ t6 = $[5];
247
+ }
248
+ let t7;
249
+ if ($[6] !== icon || $[7] !== t6) {
250
+ t7 = /*#__PURE__*/_jsx("span", {
251
+ className: t6,
252
+ children: icon
253
+ });
254
+ $[6] = icon;
255
+ $[7] = t6;
256
+ $[8] = t7;
257
+ } else {
258
+ t7 = $[8];
259
+ }
260
+ const t8 = live && "chat-live-text";
261
+ let t9;
262
+ if ($[9] !== t8) {
263
+ t9 = clsx("shrink-0", t8);
264
+ $[9] = t8;
265
+ $[10] = t9;
266
+ } else {
267
+ t9 = $[10];
268
+ }
269
+ let t10;
270
+ if ($[11] !== brand) {
271
+ t10 = brand !== undefined && /*#__PURE__*/_jsx("span", {
272
+ className: BRAND,
273
+ children: brand
274
+ });
275
+ $[11] = brand;
276
+ $[12] = t10;
277
+ } else {
278
+ t10 = $[12];
279
+ }
280
+ const t11 = brand !== undefined && label !== "" && " ";
281
+ let t12;
282
+ if ($[13] !== label || $[14] !== t10 || $[15] !== t11 || $[16] !== t9) {
283
+ t12 = /*#__PURE__*/_jsxs("span", {
284
+ className: t9,
285
+ children: [t10, t11, label]
286
+ });
287
+ $[13] = label;
288
+ $[14] = t10;
289
+ $[15] = t11;
290
+ $[16] = t9;
291
+ $[17] = t12;
292
+ } else {
293
+ t12 = $[17];
294
+ }
295
+ let t13;
296
+ if ($[18] !== command || $[19] !== detail || $[20] !== look || $[21] !== path) {
297
+ t13 = look !== undefined ? /*#__PURE__*/_jsxs(_Fragment, {
298
+ children: [look.run.detail !== "" && /*#__PURE__*/_jsx("span", {
299
+ "data-find-field": "summary",
300
+ className: "min-w-0 truncate font-mono text-code text-text-faint",
301
+ children: /*#__PURE__*/_jsx(LookDetail, {
302
+ run: look.run,
303
+ chatId: look.chatId
304
+ })
305
+ }), /*#__PURE__*/_jsx(LookTags, {
306
+ run: look.run
307
+ })]
308
+ }) : detail && /*#__PURE__*/_jsx("span", {
309
+ "data-find-field": "summary",
310
+ className: "min-w-0 truncate font-mono text-code text-text-faint",
311
+ children: command ? /*#__PURE__*/_jsx(ShellCommand, {
312
+ command: detail
313
+ }) : path ? /*#__PURE__*/_jsx(MiddleTruncate, {
314
+ text: detail
315
+ }) : detail
316
+ });
317
+ $[18] = command;
318
+ $[19] = detail;
319
+ $[20] = look;
320
+ $[21] = path;
321
+ $[22] = t13;
322
+ } else {
323
+ t13 = $[22];
324
+ }
325
+ let t14;
326
+ if ($[23] !== t12 || $[24] !== t13) {
327
+ t14 = /*#__PURE__*/_jsxs("span", {
328
+ className: "flex min-w-0 items-baseline gap-2",
329
+ children: [t12, t13]
330
+ });
331
+ $[23] = t12;
332
+ $[24] = t13;
333
+ $[25] = t14;
334
+ } else {
335
+ t14 = $[25];
336
+ }
337
+ let t15;
338
+ if ($[26] === Symbol.for("react.memo_cache_sentinel")) {
339
+ t15 = /*#__PURE__*/_jsx("span", {
340
+ className: "grow"
341
+ });
342
+ $[26] = t15;
343
+ } else {
344
+ t15 = $[26];
345
+ }
346
+ let t16;
347
+ if ($[27] !== time) {
348
+ t16 = time !== undefined && /*#__PURE__*/_jsx(RowTime, {
349
+ at: time
350
+ });
351
+ $[27] = time;
352
+ $[28] = t16;
353
+ } else {
354
+ t16 = $[28];
355
+ }
356
+ let t17;
357
+ if ($[29] !== failed) {
358
+ t17 = failed && /*#__PURE__*/_jsx(Icon, {
359
+ icon: X,
360
+ size: 12,
361
+ className: "shrink-0"
362
+ });
363
+ $[29] = failed;
364
+ $[30] = t17;
365
+ } else {
366
+ t17 = $[30];
367
+ }
368
+ let t18;
369
+ if ($[31] !== onToggle || $[32] !== open) {
370
+ t18 = onToggle !== undefined && /*#__PURE__*/_jsx(Icon, {
371
+ icon: ChevronRight,
372
+ size: 12,
373
+ className: clsx("shrink-0 text-text-faint transition-transform", open && "rotate-90")
374
+ });
375
+ $[31] = onToggle;
376
+ $[32] = open;
377
+ $[33] = t18;
378
+ } else {
379
+ t18 = $[33];
380
+ }
381
+ let t19;
382
+ if ($[34] !== t14 || $[35] !== t16 || $[36] !== t17 || $[37] !== t18 || $[38] !== t7 || $[39] !== trailing) {
383
+ t19 = /*#__PURE__*/_jsxs(_Fragment, {
384
+ children: [t7, t14, t15, trailing, t16, t17, t18]
385
+ });
386
+ $[34] = t14;
387
+ $[35] = t16;
388
+ $[36] = t17;
389
+ $[37] = t18;
390
+ $[38] = t7;
391
+ $[39] = trailing;
392
+ $[40] = t19;
393
+ } else {
394
+ t19 = $[40];
395
+ }
396
+ const content = t19;
397
+ if (onToggle === undefined) {
398
+ let t20;
399
+ if ($[41] !== classes || $[42] !== content) {
400
+ t20 = /*#__PURE__*/_jsx("div", {
401
+ className: classes,
402
+ children: content
403
+ });
404
+ $[41] = classes;
405
+ $[42] = content;
406
+ $[43] = t20;
407
+ } else {
408
+ t20 = $[43];
82
409
  }
83
- return (_jsx("button", { className: classes, onClick: onToggle, children: content }));
410
+ return t20;
411
+ }
412
+ let t20;
413
+ if ($[44] !== classes || $[45] !== content || $[46] !== onToggle) {
414
+ t20 = /*#__PURE__*/_jsx("button", {
415
+ className: classes,
416
+ onClick: onToggle,
417
+ children: content
418
+ });
419
+ $[44] = classes;
420
+ $[45] = content;
421
+ $[46] = onToggle;
422
+ $[47] = t20;
423
+ } else {
424
+ t20 = $[47];
425
+ }
426
+ return t20;
84
427
  }
85
428
  /* The diff renderers load lazily, so a diff waits on them under a line that says so. */
86
- function DiffSuspense({ children }) {
87
- const { t } = useTranslation('agent-chat');
88
- return _jsx(LazyBoundary, { fallback: _jsx("div", { className: "px-3 py-2 text-xs text-text-faint", children: t('work.loadingDiff') }), children: children });
429
+ function DiffSuspense(t0) {
430
+ const $ = _c(7);
431
+ const {
432
+ children
433
+ } = t0;
434
+ const {
435
+ t
436
+ } = useTranslation("agent-chat");
437
+ let t1;
438
+ if ($[0] !== t) {
439
+ t1 = t("work.loadingDiff");
440
+ $[0] = t;
441
+ $[1] = t1;
442
+ } else {
443
+ t1 = $[1];
444
+ }
445
+ let t2;
446
+ if ($[2] !== t1) {
447
+ t2 = /*#__PURE__*/_jsx("div", {
448
+ className: "px-3 py-2 text-xs text-text-faint",
449
+ children: t1
450
+ });
451
+ $[2] = t1;
452
+ $[3] = t2;
453
+ } else {
454
+ t2 = $[3];
455
+ }
456
+ let t3;
457
+ if ($[4] !== children || $[5] !== t2) {
458
+ t3 = /*#__PURE__*/_jsx(LazyBoundary, {
459
+ fallback: t2,
460
+ children: children
461
+ });
462
+ $[4] = children;
463
+ $[5] = t2;
464
+ $[6] = t3;
465
+ } else {
466
+ t3 = $[6];
467
+ }
468
+ return t3;
89
469
  }
90
470
  /* A file in a changed files card, which opens its diff under it. */
91
- function ChangedFileLine({ path, open, onToggle, trailing, children }) {
92
- return (_jsxs("div", { className: "border-t border-border", children: [_jsxs("button", { className: "flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-text-muted hover:bg-surface-hover", "data-file-path": path, onClick: onToggle, children: [_jsx(Icon, { icon: ChevronRight, size: 12, className: clsx('shrink-0 text-text-faint transition-transform', open && 'rotate-90') }), _jsx(MiddleTruncate, { text: path, className: "font-mono text-text" }), _jsx("span", { className: "grow" }), trailing] }), open && _jsx("div", { className: "border-t border-border", children: children })] }));
471
+ function ChangedFileLine(t0) {
472
+ const $ = _c(19);
473
+ const {
474
+ path,
475
+ open,
476
+ onToggle,
477
+ trailing,
478
+ children
479
+ } = t0;
480
+ const t1 = open && "rotate-90";
481
+ let t2;
482
+ if ($[0] !== t1) {
483
+ t2 = clsx("shrink-0 text-text-faint transition-transform", t1);
484
+ $[0] = t1;
485
+ $[1] = t2;
486
+ } else {
487
+ t2 = $[1];
488
+ }
489
+ let t3;
490
+ if ($[2] !== t2) {
491
+ t3 = /*#__PURE__*/_jsx(Icon, {
492
+ icon: ChevronRight,
493
+ size: 12,
494
+ className: t2
495
+ });
496
+ $[2] = t2;
497
+ $[3] = t3;
498
+ } else {
499
+ t3 = $[3];
500
+ }
501
+ let t4;
502
+ if ($[4] !== path) {
503
+ t4 = /*#__PURE__*/_jsx(MiddleTruncate, {
504
+ text: path,
505
+ className: "font-mono text-text"
506
+ });
507
+ $[4] = path;
508
+ $[5] = t4;
509
+ } else {
510
+ t4 = $[5];
511
+ }
512
+ let t5;
513
+ if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
514
+ t5 = /*#__PURE__*/_jsx("span", {
515
+ className: "grow"
516
+ });
517
+ $[6] = t5;
518
+ } else {
519
+ t5 = $[6];
520
+ }
521
+ let t6;
522
+ if ($[7] !== onToggle || $[8] !== path || $[9] !== t3 || $[10] !== t4 || $[11] !== trailing) {
523
+ t6 = /*#__PURE__*/_jsxs("button", {
524
+ className: "flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-text-muted hover:bg-surface-hover",
525
+ "data-file-path": path,
526
+ onClick: onToggle,
527
+ children: [t3, t4, t5, trailing]
528
+ });
529
+ $[7] = onToggle;
530
+ $[8] = path;
531
+ $[9] = t3;
532
+ $[10] = t4;
533
+ $[11] = trailing;
534
+ $[12] = t6;
535
+ } else {
536
+ t6 = $[12];
537
+ }
538
+ let t7;
539
+ if ($[13] !== children || $[14] !== open) {
540
+ t7 = open && /*#__PURE__*/_jsx("div", {
541
+ className: "border-t border-border",
542
+ children: children
543
+ });
544
+ $[13] = children;
545
+ $[14] = open;
546
+ $[15] = t7;
547
+ } else {
548
+ t7 = $[15];
549
+ }
550
+ let t8;
551
+ if ($[16] !== t6 || $[17] !== t7) {
552
+ t8 = /*#__PURE__*/_jsxs("div", {
553
+ className: "border-t border-border",
554
+ children: [t6, t7]
555
+ });
556
+ $[16] = t6;
557
+ $[17] = t7;
558
+ $[18] = t8;
559
+ } else {
560
+ t8 = $[18];
561
+ }
562
+ return t8;
93
563
  }
94
564
  /* A diff keeps its card, with what the call answered under it. */
95
- function DiffBody({ tool, entries, patched }) {
96
- return (_jsxs("div", { className: "mt-1.5 mb-2 ml-6 overflow-hidden rounded-md border border-border bg-surface-raised", children: [_jsx(DiffStack, { entries: entries }), hasOutput(tool.output) && !patched && (_jsx("pre", { "data-find-field": "output", className: clsx('max-h-64 overflow-auto whitespace-pre-wrap border-t border-border px-3 py-2 font-mono text-code select-text', tool.state === 'error' ? 'text-chat-removed' : 'text-chat-output'), children: _jsx(AnsiOutput, { text: tool.output, limit: OUTPUT_LIMIT }) }))] }));
565
+ function DiffBody(t0) {
566
+ const $ = _c(9);
567
+ const {
568
+ tool,
569
+ entries,
570
+ patched
571
+ } = t0;
572
+ let t1;
573
+ if ($[0] !== entries) {
574
+ t1 = /*#__PURE__*/_jsx(DiffStack, {
575
+ entries: entries
576
+ });
577
+ $[0] = entries;
578
+ $[1] = t1;
579
+ } else {
580
+ t1 = $[1];
581
+ }
582
+ let t2;
583
+ if ($[2] !== patched || $[3] !== tool.output || $[4] !== tool.state) {
584
+ t2 = hasOutput(tool.output) && !patched && /*#__PURE__*/_jsx("pre", {
585
+ "data-find-field": "output",
586
+ className: clsx("max-h-64 overflow-auto whitespace-pre-wrap border-t border-border px-3 py-2 font-mono text-code select-text", tool.state === "error" ? "text-chat-removed" : "text-chat-output"),
587
+ children: /*#__PURE__*/_jsx(AnsiOutput, {
588
+ text: tool.output,
589
+ limit: OUTPUT_LIMIT
590
+ })
591
+ });
592
+ $[2] = patched;
593
+ $[3] = tool.output;
594
+ $[4] = tool.state;
595
+ $[5] = t2;
596
+ } else {
597
+ t2 = $[5];
598
+ }
599
+ let t3;
600
+ if ($[6] !== t1 || $[7] !== t2) {
601
+ t3 = /*#__PURE__*/_jsxs("div", {
602
+ className: "mt-1.5 mb-2 ml-6 overflow-hidden rounded-md border border-border bg-surface-raised",
603
+ children: [t1, t2]
604
+ });
605
+ $[6] = t1;
606
+ $[7] = t2;
607
+ $[8] = t3;
608
+ } else {
609
+ t3 = $[8];
610
+ }
611
+ return t3;
97
612
  }
98
613
  /* What a call answered, muted under the call; a failure in the error color, or its exit code when the tool names one. */
99
- function ToolOutput({ tool }) {
100
- const { t } = useTranslation('agent-chat');
101
- if (!hasOutput(tool.output)) {
102
- return null;
103
- }
104
- const failed = tool.state === 'error';
105
- const { code, rest } = failed ? exitCodeOf(tool.output) : { code: null, rest: tool.output };
106
- return (_jsxs(_Fragment, { children: [hasOutput(rest) && (_jsx("pre", { "data-find-field": "output", className: clsx('max-h-64 overflow-auto whitespace-pre-wrap', failed && code === null ? 'text-status-error' : 'text-text-muted'), children: _jsx(AnsiOutput, { text: rest, limit: OUTPUT_LIMIT }) })), code !== null && _jsx("div", { className: "text-status-error", children: t('work.exitCode', { code: String(code) }) })] }));
614
+ function ToolOutput(t0) {
615
+ const $ = _c(10);
616
+ const {
617
+ tool
618
+ } = t0;
619
+ const {
620
+ t
621
+ } = useTranslation("agent-chat");
622
+ if (!hasOutput(tool.output)) {
623
+ return null;
624
+ }
625
+ const failed = tool.state === "error";
626
+ let code;
627
+ let t1;
628
+ if ($[0] !== failed || $[1] !== tool.output) {
629
+ const {
630
+ code: t2,
631
+ rest
632
+ } = failed ? exitCodeOf(tool.output) : {
633
+ code: null,
634
+ rest: tool.output
635
+ };
636
+ code = t2;
637
+ t1 = hasOutput(rest) && /*#__PURE__*/_jsx("pre", {
638
+ "data-find-field": "output",
639
+ className: clsx("max-h-64 overflow-auto whitespace-pre-wrap", failed && code === null ? "text-status-error" : "text-text-muted"),
640
+ children: /*#__PURE__*/_jsx(AnsiOutput, {
641
+ text: rest,
642
+ limit: OUTPUT_LIMIT
643
+ })
644
+ });
645
+ $[0] = failed;
646
+ $[1] = tool.output;
647
+ $[2] = code;
648
+ $[3] = t1;
649
+ } else {
650
+ code = $[2];
651
+ t1 = $[3];
652
+ }
653
+ let t2;
654
+ if ($[4] !== code || $[5] !== t) {
655
+ t2 = code !== null && /*#__PURE__*/_jsx("div", {
656
+ className: "text-status-error",
657
+ children: t("work.exitCode", {
658
+ code: String(code)
659
+ })
660
+ });
661
+ $[4] = code;
662
+ $[5] = t;
663
+ $[6] = t2;
664
+ } else {
665
+ t2 = $[6];
666
+ }
667
+ let t3;
668
+ if ($[7] !== t1 || $[8] !== t2) {
669
+ t3 = /*#__PURE__*/_jsxs(_Fragment, {
670
+ children: [t1, t2]
671
+ });
672
+ $[7] = t1;
673
+ $[8] = t2;
674
+ $[9] = t3;
675
+ } else {
676
+ t3 = $[9];
677
+ }
678
+ return t3;
107
679
  }
108
680
  /* An opened call without a card: what it was asked in the foreground, what it answered muted below. */
109
- function ToolBody({ tool }) {
110
- const patches = unifiedChanges(tool);
111
- const changes = patches.length > 0 ? [] : fileChanges(tool.name, tool.input);
112
- if (patches.length + changes.length > 0) {
113
- return _jsx(DiffBody, { tool: tool, entries: reviewEntries(patches, changes), patched: patches.length > 0 });
681
+ export function ToolBody(t0) {
682
+ const $ = _c(16);
683
+ const {
684
+ tool
685
+ } = t0;
686
+ let t1;
687
+ if ($[0] !== tool) {
688
+ t1 = Symbol.for("react.early_return_sentinel");
689
+ bb0: {
690
+ const patches = unifiedChanges(tool);
691
+ const changes = patches.length > 0 ? [] : fileChanges(tool.name, tool.input);
692
+ if (patches.length + changes.length > 0) {
693
+ t1 = /*#__PURE__*/_jsx(DiffBody, {
694
+ tool: tool,
695
+ entries: reviewEntries(patches, changes),
696
+ patched: patches.length > 0
697
+ });
698
+ break bb0;
699
+ }
114
700
  }
701
+ $[0] = tool;
702
+ $[1] = t1;
703
+ } else {
704
+ t1 = $[1];
705
+ }
706
+ if (t1 !== Symbol.for("react.early_return_sentinel")) {
707
+ return t1;
708
+ }
709
+ let t2;
710
+ let t3;
711
+ let t4;
712
+ let t5;
713
+ if ($[2] !== tool.input || $[3] !== tool.name) {
115
714
  const lines = toolCallLines(tool.name, tool.input);
116
- return (_jsxs("div", { className: "mt-0.5 mb-2 ml-6 flex flex-col gap-1.5 font-mono text-code select-text", children: [lines.command !== null && (_jsxs("pre", { className: "max-h-64 overflow-auto whitespace-pre-wrap wrap-anywhere text-text", children: [_jsx(ShellCommand, { command: lines.command.slice(0, OUTPUT_LIMIT) }), clipNotice(lines.command)] })), lines.args.length > 0 && (_jsx("dl", { className: "grid max-h-64 grid-cols-[auto_minmax(0,1fr)] gap-x-3 overflow-auto", children: lines.args.map(([key, value]) => (_jsxs(Fragment, { children: [_jsx("dt", { className: "text-text-faint", children: key }), _jsx("dd", { className: "whitespace-pre-wrap wrap-anywhere text-text", children: clip(value) })] }, key))) })), lines.text !== null && _jsx("pre", { className: "max-h-64 overflow-auto whitespace-pre-wrap wrap-anywhere text-text", children: clip(lines.text) }), _jsx(ToolOutput, { tool: tool })] }));
715
+ t2 = "mt-0.5 mb-2 ml-6 flex flex-col gap-1.5 font-mono text-code select-text";
716
+ t3 = lines.command !== null && /*#__PURE__*/_jsxs("pre", {
717
+ className: "max-h-64 overflow-auto whitespace-pre-wrap wrap-anywhere text-text",
718
+ children: [/*#__PURE__*/_jsx(ShellCommand, {
719
+ command: lines.command.slice(0, OUTPUT_LIMIT)
720
+ }), clipNotice(lines.command)]
721
+ });
722
+ t4 = lines.args.length > 0 && /*#__PURE__*/_jsx("dl", {
723
+ className: "grid max-h-64 grid-cols-[auto_minmax(0,1fr)] gap-x-3 overflow-auto",
724
+ children: lines.args.map(_temp)
725
+ });
726
+ t5 = lines.text !== null && /*#__PURE__*/_jsx("pre", {
727
+ className: "max-h-64 overflow-auto whitespace-pre-wrap wrap-anywhere text-text",
728
+ children: clip(lines.text)
729
+ });
730
+ $[2] = tool.input;
731
+ $[3] = tool.name;
732
+ $[4] = t2;
733
+ $[5] = t3;
734
+ $[6] = t4;
735
+ $[7] = t5;
736
+ } else {
737
+ t2 = $[4];
738
+ t3 = $[5];
739
+ t4 = $[6];
740
+ t5 = $[7];
741
+ }
742
+ let t6;
743
+ if ($[8] !== tool) {
744
+ t6 = /*#__PURE__*/_jsx(ToolOutput, {
745
+ tool: tool
746
+ });
747
+ $[8] = tool;
748
+ $[9] = t6;
749
+ } else {
750
+ t6 = $[9];
751
+ }
752
+ let t7;
753
+ if ($[10] !== t2 || $[11] !== t3 || $[12] !== t4 || $[13] !== t5 || $[14] !== t6) {
754
+ t7 = /*#__PURE__*/_jsxs("div", {
755
+ className: t2,
756
+ children: [t3, t4, t5, t6]
757
+ });
758
+ $[10] = t2;
759
+ $[11] = t3;
760
+ $[12] = t4;
761
+ $[13] = t5;
762
+ $[14] = t6;
763
+ $[15] = t7;
764
+ } else {
765
+ t7 = $[15];
766
+ }
767
+ return t7;
117
768
  }
118
769
  /*
119
770
  * One settled tool call: a line, and what it was asked and answered behind it. An image the call
120
771
  * looked at is drawn under the line. `icon`, `label` and `failed` let a row that knows the call better name it.
121
772
  */
122
- export function WorkRow({ tool, chatId, nested, detail, icon, label, failed }) {
123
- const host = useChatHost();
124
- const [open, setOpen] = useState(false);
125
- const image = tool.state === 'done' ? readImagePath(tool.name, tool.input) : null;
126
- const { ReadImage } = host;
127
- useOpenForFind(tool.id, 'output', setOpen);
128
- const summary = detail ?? toolSummary(tool.name, tool.input);
129
- const opens = hasToolBody(tool);
130
- const shell = shellCommand(tool.name, tool.input);
131
- const run = detail === undefined && icon === undefined && label === undefined && shell !== null ? matchCommandLook(shell, host.commandLooks) : null;
132
- return (_jsxs("div", { "data-find-item": tool.id, className: nested ? 'ml-6' : undefined, children: [_jsx(ToggleLine, { icon: run === null ? (icon ?? toolIcon(tool.name)) : _jsx(run.look.Mark, { size: 12 }), label: run === null ? (label ?? tool.name) : run.match.label, brand: run?.look.brand, detail: summary, look: run === null ? undefined : { run, chatId: chatId ?? '' }, command: detail === undefined && summary === shell, path: detail === undefined && toolSummaryIsPath(tool.name, tool.input), open: open && opens, onToggle: opens ? () => setOpen((o) => !o) : undefined, failed: failed ?? tool.state === 'error', time: tool.createdAt }), image !== null && ReadImage !== null && _jsx(ReadImage, { path: image }), open && opens && _jsx(ToolBody, { tool: tool })] }));
773
+ function _temp(t0) {
774
+ const [key, value] = t0;
775
+ return /*#__PURE__*/_jsxs(Fragment, {
776
+ children: [/*#__PURE__*/_jsx("dt", {
777
+ className: "text-text-faint",
778
+ children: key
779
+ }), /*#__PURE__*/_jsx("dd", {
780
+ className: "whitespace-pre-wrap wrap-anywhere text-text",
781
+ children: clip(value)
782
+ })]
783
+ }, key);
784
+ }
785
+ export function WorkRow(t0) {
786
+ const $ = _c(56);
787
+ const {
788
+ tool,
789
+ chatId,
790
+ nested,
791
+ detail,
792
+ icon,
793
+ label,
794
+ failed
795
+ } = t0;
796
+ const host = useChatHost();
797
+ const [open, setOpen] = useState(false);
798
+ let t1;
799
+ if ($[0] !== tool.input || $[1] !== tool.name || $[2] !== tool.state) {
800
+ t1 = tool.state === "done" ? readImagePath(tool.name, tool.input) : null;
801
+ $[0] = tool.input;
802
+ $[1] = tool.name;
803
+ $[2] = tool.state;
804
+ $[3] = t1;
805
+ } else {
806
+ t1 = $[3];
807
+ }
808
+ const image = t1;
809
+ const {
810
+ ReadImage
811
+ } = host;
812
+ useOpenForFind(tool.id, "output", setOpen);
813
+ let t2;
814
+ if ($[4] !== detail || $[5] !== tool.input || $[6] !== tool.name) {
815
+ t2 = detail ?? toolSummary(tool.name, tool.input);
816
+ $[4] = detail;
817
+ $[5] = tool.input;
818
+ $[6] = tool.name;
819
+ $[7] = t2;
820
+ } else {
821
+ t2 = $[7];
822
+ }
823
+ const summary = t2;
824
+ let t3;
825
+ if ($[8] !== tool) {
826
+ t3 = hasToolBody(tool);
827
+ $[8] = tool;
828
+ $[9] = t3;
829
+ } else {
830
+ t3 = $[9];
831
+ }
832
+ const opens = t3;
833
+ let shell;
834
+ let t4;
835
+ if ($[10] !== detail || $[11] !== host.commandLooks || $[12] !== icon || $[13] !== label || $[14] !== tool.input || $[15] !== tool.name) {
836
+ shell = shellCommand(tool.name, tool.input);
837
+ t4 = detail === undefined && icon === undefined && label === undefined && shell !== null ? matchCommandLook(shell, host.commandLooks) : null;
838
+ $[10] = detail;
839
+ $[11] = host.commandLooks;
840
+ $[12] = icon;
841
+ $[13] = label;
842
+ $[14] = tool.input;
843
+ $[15] = tool.name;
844
+ $[16] = shell;
845
+ $[17] = t4;
846
+ } else {
847
+ shell = $[16];
848
+ t4 = $[17];
849
+ }
850
+ const run = t4;
851
+ const t5 = nested ? "ml-6" : undefined;
852
+ let t6;
853
+ if ($[18] !== icon || $[19] !== run || $[20] !== tool.name) {
854
+ t6 = run === null ? icon ?? toolIcon(tool.name) : /*#__PURE__*/_jsx(run.look.Mark, {
855
+ size: 12
856
+ });
857
+ $[18] = icon;
858
+ $[19] = run;
859
+ $[20] = tool.name;
860
+ $[21] = t6;
861
+ } else {
862
+ t6 = $[21];
863
+ }
864
+ const t7 = run === null ? label ?? tool.name : run.match.label;
865
+ const t8 = run?.look.brand;
866
+ let t9;
867
+ if ($[22] !== chatId || $[23] !== run) {
868
+ t9 = run === null ? undefined : {
869
+ run,
870
+ chatId: chatId ?? ""
871
+ };
872
+ $[22] = chatId;
873
+ $[23] = run;
874
+ $[24] = t9;
875
+ } else {
876
+ t9 = $[24];
877
+ }
878
+ const t10 = detail === undefined && summary === shell;
879
+ let t11;
880
+ if ($[25] !== detail || $[26] !== tool.input || $[27] !== tool.name) {
881
+ t11 = detail === undefined && toolSummaryIsPath(tool.name, tool.input);
882
+ $[25] = detail;
883
+ $[26] = tool.input;
884
+ $[27] = tool.name;
885
+ $[28] = t11;
886
+ } else {
887
+ t11 = $[28];
888
+ }
889
+ const t12 = open && opens;
890
+ let t13;
891
+ if ($[29] !== opens) {
892
+ t13 = opens ? () => setOpen(_temp2) : undefined;
893
+ $[29] = opens;
894
+ $[30] = t13;
895
+ } else {
896
+ t13 = $[30];
897
+ }
898
+ const t14 = failed ?? tool.state === "error";
899
+ let t15;
900
+ if ($[31] !== summary || $[32] !== t10 || $[33] !== t11 || $[34] !== t12 || $[35] !== t13 || $[36] !== t14 || $[37] !== t6 || $[38] !== t7 || $[39] !== t8 || $[40] !== t9 || $[41] !== tool.createdAt) {
901
+ t15 = /*#__PURE__*/_jsx(ToggleLine, {
902
+ icon: t6,
903
+ label: t7,
904
+ brand: t8,
905
+ detail: summary,
906
+ look: t9,
907
+ command: t10,
908
+ path: t11,
909
+ open: t12,
910
+ onToggle: t13,
911
+ failed: t14,
912
+ time: tool.createdAt
913
+ });
914
+ $[31] = summary;
915
+ $[32] = t10;
916
+ $[33] = t11;
917
+ $[34] = t12;
918
+ $[35] = t13;
919
+ $[36] = t14;
920
+ $[37] = t6;
921
+ $[38] = t7;
922
+ $[39] = t8;
923
+ $[40] = t9;
924
+ $[41] = tool.createdAt;
925
+ $[42] = t15;
926
+ } else {
927
+ t15 = $[42];
928
+ }
929
+ let t16;
930
+ if ($[43] !== ReadImage || $[44] !== image) {
931
+ t16 = image !== null && ReadImage !== null && /*#__PURE__*/_jsx(ReadImage, {
932
+ path: image
933
+ });
934
+ $[43] = ReadImage;
935
+ $[44] = image;
936
+ $[45] = t16;
937
+ } else {
938
+ t16 = $[45];
939
+ }
940
+ let t17;
941
+ if ($[46] !== open || $[47] !== opens || $[48] !== tool) {
942
+ t17 = open && opens && /*#__PURE__*/_jsx(ToolBody, {
943
+ tool: tool
944
+ });
945
+ $[46] = open;
946
+ $[47] = opens;
947
+ $[48] = tool;
948
+ $[49] = t17;
949
+ } else {
950
+ t17 = $[49];
951
+ }
952
+ let t18;
953
+ if ($[50] !== t15 || $[51] !== t16 || $[52] !== t17 || $[53] !== t5 || $[54] !== tool.id) {
954
+ t18 = /*#__PURE__*/_jsxs("div", {
955
+ "data-find-item": tool.id,
956
+ className: t5,
957
+ children: [t15, t16, t17]
958
+ });
959
+ $[50] = t15;
960
+ $[51] = t16;
961
+ $[52] = t17;
962
+ $[53] = t5;
963
+ $[54] = tool.id;
964
+ $[55] = t18;
965
+ } else {
966
+ t18 = $[55];
967
+ }
968
+ return t18;
133
969
  }
134
970
  /* "running for 12s" next to a live call. */
135
- export function RunningFor({ startedAt }) {
136
- const { t } = useTranslation('agent-chat');
137
- const ref = useTickingText(() => t('work.runningFor', { elapsed: formatElapsedShort(Date.now() - startedAt) }));
138
- return _jsx("span", { ref: ref, className: "shrink-0 text-xs text-text-faint tabular-nums" });
971
+ function _temp2(o) {
972
+ return !o;
973
+ }
974
+ export function RunningFor(t0) {
975
+ const $ = _c(5);
976
+ const {
977
+ startedAt
978
+ } = t0;
979
+ const {
980
+ t
981
+ } = useTranslation("agent-chat");
982
+ let t1;
983
+ if ($[0] !== startedAt || $[1] !== t) {
984
+ t1 = () => t("work.runningFor", {
985
+ elapsed: formatElapsedShort(Date.now() - startedAt)
986
+ });
987
+ $[0] = startedAt;
988
+ $[1] = t;
989
+ $[2] = t1;
990
+ } else {
991
+ t1 = $[2];
992
+ }
993
+ const ref = useTickingText(t1);
994
+ let t2;
995
+ if ($[3] !== ref) {
996
+ t2 = /*#__PURE__*/_jsx("span", {
997
+ ref: ref,
998
+ className: "shrink-0 text-xs text-text-faint tabular-nums"
999
+ });
1000
+ $[3] = ref;
1001
+ $[4] = t2;
1002
+ } else {
1003
+ t2 = $[4];
1004
+ }
1005
+ return t2;
139
1006
  }
140
1007
  /* A call still running: its timer on the line, and for a provider that streams output, the last lines under it. */
141
- export function WorkLiveRow({ chatId, tool: derived }) {
142
- const [open, setOpen] = useState(false);
143
- const tool = useCurrentItem(chatId, derived);
144
- const tail = liveOutput(tool);
145
- const summary = toolSummary(tool.name, tool.input);
146
- const opens = hasToolBody(tool);
147
- const shell = shellCommand(tool.name, tool.input);
148
- const { commandLooks } = useChatHost();
149
- const run = shell === null ? null : matchCommandLook(shell, commandLooks);
150
- const awaiting = useAwaitsApproval(chatId, tool.toolUseId);
151
- const { t } = useTranslation('agent-chat');
152
- return (_jsxs("div", { children: [_jsx(ToggleLine, { icon: run === null ? toolIcon(tool.name) : _jsx(run.look.Mark, { size: 12 }), label: run === null ? tool.name : run.match.label, brand: run?.look.brand, look: run === null ? undefined : { run, chatId }, detail: summary || tool.progress?.description || '', command: summary !== '' && summary === shellCommand(tool.name, tool.input), path: summary !== '' && toolSummaryIsPath(tool.name, tool.input), open: open && opens, onToggle: opens ? () => setOpen((o) => !o) : undefined, trailing: awaiting ? (_jsx("span", { className: "shrink-0 text-xs text-text-faint", children: t('work.awaitingApproval') })) : (_jsx(RunningFor, { startedAt: toolStartedAt(tool) })), live: true }), open && opens && _jsx(ToolBody, { tool: tool }), tail !== null && !open && (_jsx("pre", { className: "mt-1.5 mb-2 ml-6 max-h-48 overflow-auto rounded-md border border-border bg-surface-raised px-3 py-2 font-mono text-code whitespace-pre-wrap text-chat-output select-text", children: _jsx(AnsiOutput, { text: tail, tailLines: 12 }) }))] }));
1008
+ export function WorkLiveRow(t0) {
1009
+ const $ = _c(49);
1010
+ const {
1011
+ chatId,
1012
+ tool: derived
1013
+ } = t0;
1014
+ const [open, setOpen] = useState(false);
1015
+ const tool = useCurrentItem(chatId, derived);
1016
+ let t1;
1017
+ if ($[0] !== tool) {
1018
+ t1 = liveOutput(tool);
1019
+ $[0] = tool;
1020
+ $[1] = t1;
1021
+ } else {
1022
+ t1 = $[1];
1023
+ }
1024
+ const tail = t1;
1025
+ let t2;
1026
+ if ($[2] !== tool.input || $[3] !== tool.name) {
1027
+ t2 = toolSummary(tool.name, tool.input);
1028
+ $[2] = tool.input;
1029
+ $[3] = tool.name;
1030
+ $[4] = t2;
1031
+ } else {
1032
+ t2 = $[4];
1033
+ }
1034
+ const summary = t2;
1035
+ let t3;
1036
+ if ($[5] !== tool) {
1037
+ t3 = hasToolBody(tool);
1038
+ $[5] = tool;
1039
+ $[6] = t3;
1040
+ } else {
1041
+ t3 = $[6];
1042
+ }
1043
+ const opens = t3;
1044
+ const shell = shellCommand(tool.name, tool.input);
1045
+ const {
1046
+ commandLooks
1047
+ } = useChatHost();
1048
+ const run = shell === null ? null : matchCommandLook(shell, commandLooks);
1049
+ const awaiting = useAwaitsApproval(chatId, tool.toolUseId);
1050
+ const {
1051
+ t
1052
+ } = useTranslation("agent-chat");
1053
+ let t4;
1054
+ if ($[7] !== run || $[8] !== tool.name) {
1055
+ t4 = run === null ? toolIcon(tool.name) : /*#__PURE__*/_jsx(run.look.Mark, {
1056
+ size: 12
1057
+ });
1058
+ $[7] = run;
1059
+ $[8] = tool.name;
1060
+ $[9] = t4;
1061
+ } else {
1062
+ t4 = $[9];
1063
+ }
1064
+ const t5 = run === null ? tool.name : run.match.label;
1065
+ const t6 = run?.look.brand;
1066
+ let t7;
1067
+ if ($[10] !== chatId || $[11] !== run) {
1068
+ t7 = run === null ? undefined : {
1069
+ run,
1070
+ chatId
1071
+ };
1072
+ $[10] = chatId;
1073
+ $[11] = run;
1074
+ $[12] = t7;
1075
+ } else {
1076
+ t7 = $[12];
1077
+ }
1078
+ const t8 = summary || tool.progress?.description || "";
1079
+ let t9;
1080
+ if ($[13] !== summary || $[14] !== tool.input || $[15] !== tool.name) {
1081
+ t9 = summary !== "" && summary === shellCommand(tool.name, tool.input);
1082
+ $[13] = summary;
1083
+ $[14] = tool.input;
1084
+ $[15] = tool.name;
1085
+ $[16] = t9;
1086
+ } else {
1087
+ t9 = $[16];
1088
+ }
1089
+ let t10;
1090
+ if ($[17] !== summary || $[18] !== tool.input || $[19] !== tool.name) {
1091
+ t10 = summary !== "" && toolSummaryIsPath(tool.name, tool.input);
1092
+ $[17] = summary;
1093
+ $[18] = tool.input;
1094
+ $[19] = tool.name;
1095
+ $[20] = t10;
1096
+ } else {
1097
+ t10 = $[20];
1098
+ }
1099
+ const t11 = open && opens;
1100
+ let t12;
1101
+ if ($[21] !== opens) {
1102
+ t12 = opens ? () => setOpen(_temp3) : undefined;
1103
+ $[21] = opens;
1104
+ $[22] = t12;
1105
+ } else {
1106
+ t12 = $[22];
1107
+ }
1108
+ let t13;
1109
+ if ($[23] !== awaiting || $[24] !== t || $[25] !== tool) {
1110
+ t13 = awaiting ? /*#__PURE__*/_jsx("span", {
1111
+ className: "shrink-0 text-xs text-text-faint",
1112
+ children: t("work.awaitingApproval")
1113
+ }) : /*#__PURE__*/_jsx(RunningFor, {
1114
+ startedAt: toolStartedAt(tool)
1115
+ });
1116
+ $[23] = awaiting;
1117
+ $[24] = t;
1118
+ $[25] = tool;
1119
+ $[26] = t13;
1120
+ } else {
1121
+ t13 = $[26];
1122
+ }
1123
+ let t14;
1124
+ if ($[27] !== t10 || $[28] !== t11 || $[29] !== t12 || $[30] !== t13 || $[31] !== t4 || $[32] !== t5 || $[33] !== t6 || $[34] !== t7 || $[35] !== t8 || $[36] !== t9) {
1125
+ t14 = /*#__PURE__*/_jsx(ToggleLine, {
1126
+ icon: t4,
1127
+ label: t5,
1128
+ brand: t6,
1129
+ look: t7,
1130
+ detail: t8,
1131
+ command: t9,
1132
+ path: t10,
1133
+ open: t11,
1134
+ onToggle: t12,
1135
+ trailing: t13,
1136
+ live: true
1137
+ });
1138
+ $[27] = t10;
1139
+ $[28] = t11;
1140
+ $[29] = t12;
1141
+ $[30] = t13;
1142
+ $[31] = t4;
1143
+ $[32] = t5;
1144
+ $[33] = t6;
1145
+ $[34] = t7;
1146
+ $[35] = t8;
1147
+ $[36] = t9;
1148
+ $[37] = t14;
1149
+ } else {
1150
+ t14 = $[37];
1151
+ }
1152
+ let t15;
1153
+ if ($[38] !== open || $[39] !== opens || $[40] !== tool) {
1154
+ t15 = open && opens && /*#__PURE__*/_jsx(ToolBody, {
1155
+ tool: tool
1156
+ });
1157
+ $[38] = open;
1158
+ $[39] = opens;
1159
+ $[40] = tool;
1160
+ $[41] = t15;
1161
+ } else {
1162
+ t15 = $[41];
1163
+ }
1164
+ let t16;
1165
+ if ($[42] !== open || $[43] !== tail) {
1166
+ t16 = tail !== null && !open && /*#__PURE__*/_jsx("pre", {
1167
+ className: "mt-1.5 mb-2 ml-6 max-h-48 overflow-auto rounded-md border border-border bg-surface-raised px-3 py-2 font-mono text-code whitespace-pre-wrap text-chat-output select-text",
1168
+ children: /*#__PURE__*/_jsx(AnsiOutput, {
1169
+ text: tail,
1170
+ tailLines: 12
1171
+ })
1172
+ });
1173
+ $[42] = open;
1174
+ $[43] = tail;
1175
+ $[44] = t16;
1176
+ } else {
1177
+ t16 = $[44];
1178
+ }
1179
+ let t17;
1180
+ if ($[45] !== t14 || $[46] !== t15 || $[47] !== t16) {
1181
+ t17 = /*#__PURE__*/_jsxs("div", {
1182
+ children: [t14, t15, t16]
1183
+ });
1184
+ $[45] = t14;
1185
+ $[46] = t15;
1186
+ $[47] = t16;
1187
+ $[48] = t17;
1188
+ } else {
1189
+ t17 = $[48];
1190
+ }
1191
+ return t17;
153
1192
  }
154
1193
  /* A run of tool calls as one line ("Read 4 files"); opening it lists every call. A run of one look wears its mark and its brand. */
155
- export function WorkGroupRow({ tools, summary, look, expanded, onToggle }) {
156
- const failed = tools.some((tool) => tool.state === 'error');
157
- return (_jsx("div", { children: _jsx(ToggleLine, { icon: look === undefined ? toolIcon(tools[0].name) : _jsx(look.Mark, { size: 12 }), label: look?.brand === undefined ? summary : withBrand(summary, [look.brand]), open: expanded, onToggle: onToggle, failed: failed, time: tools[0].createdAt }) }));
1194
+ function _temp3(o) {
1195
+ return !o;
1196
+ }
1197
+ export function WorkGroupRow(t0) {
1198
+ const $ = _c(15);
1199
+ const {
1200
+ tools,
1201
+ summary,
1202
+ look,
1203
+ expanded,
1204
+ onToggle
1205
+ } = t0;
1206
+ let t1;
1207
+ if ($[0] !== tools) {
1208
+ t1 = tools.some(_temp4);
1209
+ $[0] = tools;
1210
+ $[1] = t1;
1211
+ } else {
1212
+ t1 = $[1];
1213
+ }
1214
+ const failed = t1;
1215
+ let t2;
1216
+ if ($[2] !== look || $[3] !== tools[0].name) {
1217
+ t2 = look === undefined ? toolIcon(tools[0].name) : /*#__PURE__*/_jsx(look.Mark, {
1218
+ size: 12
1219
+ });
1220
+ $[2] = look;
1221
+ $[3] = tools[0].name;
1222
+ $[4] = t2;
1223
+ } else {
1224
+ t2 = $[4];
1225
+ }
1226
+ let t3;
1227
+ if ($[5] !== look || $[6] !== summary) {
1228
+ t3 = look?.brand === undefined ? summary : withBrand(summary, [look.brand]);
1229
+ $[5] = look;
1230
+ $[6] = summary;
1231
+ $[7] = t3;
1232
+ } else {
1233
+ t3 = $[7];
1234
+ }
1235
+ let t4;
1236
+ if ($[8] !== expanded || $[9] !== failed || $[10] !== onToggle || $[11] !== t2 || $[12] !== t3 || $[13] !== tools[0].createdAt) {
1237
+ t4 = /*#__PURE__*/_jsx("div", {
1238
+ children: /*#__PURE__*/_jsx(ToggleLine, {
1239
+ icon: t2,
1240
+ label: t3,
1241
+ open: expanded,
1242
+ onToggle: onToggle,
1243
+ failed: failed,
1244
+ time: tools[0].createdAt
1245
+ })
1246
+ });
1247
+ $[8] = expanded;
1248
+ $[9] = failed;
1249
+ $[10] = onToggle;
1250
+ $[11] = t2;
1251
+ $[12] = t3;
1252
+ $[13] = tools[0].createdAt;
1253
+ $[14] = t4;
1254
+ } else {
1255
+ t4 = $[14];
1256
+ }
1257
+ return t4;
158
1258
  }
159
1259
  /*
160
1260
  * A settled turn folded behind how long it took and what it did. A line and not a button, like the
161
1261
  * tool lines it hides; the work reads fainter than the time so the eye lands on the time first.
162
1262
  */
163
- export function TurnFoldRow({ turn, label, work, expanded, onToggle }) {
164
- const { commandLooks } = useChatHost();
165
- const brands = commandLooks?.flatMap(({ brand }) => (brand === undefined ? [] : [brand])) ?? [];
166
- return (_jsxs("button", { className: clsx('group group/line -mx-1 mb-2 flex h-7 w-[calc(100%+8px)] min-w-0 items-center gap-2 rounded-md px-1 text-left text-xs text-text-muted hover:bg-surface-hover', turn.state === 'error' && 'text-status-error'), "aria-expanded": expanded, onClick: onToggle, children: [_jsx("span", { className: ROW_GUTTER, children: _jsx(Icon, { icon: ChevronRight, size: 12, className: clsx('transition-transform', expanded && 'rotate-90') }) }), _jsx("span", { className: "shrink-0 group-hover:text-text", children: label }), work.length > 0 && (_jsx("span", { className: "min-w-0 truncate text-text-faint", children: work.map((part, index) => (_jsxs(Fragment, { children: [' · ', withBrand(part, brands)] }, index))) })), _jsx("span", { className: "grow" }), _jsx(RowTime, { at: turn.createdAt })] }));
1263
+ function _temp4(tool) {
1264
+ return tool.state === "error";
1265
+ }
1266
+ export function TurnFoldRow(t0) {
1267
+ const $ = _c(31);
1268
+ const {
1269
+ turn,
1270
+ label,
1271
+ work,
1272
+ expanded,
1273
+ onToggle
1274
+ } = t0;
1275
+ const {
1276
+ commandLooks
1277
+ } = useChatHost();
1278
+ let t1;
1279
+ let t2;
1280
+ let t3;
1281
+ let t4;
1282
+ let t5;
1283
+ let t6;
1284
+ if ($[0] !== commandLooks || $[1] !== expanded || $[2] !== label || $[3] !== onToggle || $[4] !== turn.state || $[5] !== work) {
1285
+ const brands = commandLooks?.flatMap(_temp5) ?? [];
1286
+ const t7 = turn.state === "error" && "text-status-error";
1287
+ if ($[12] !== t7) {
1288
+ t1 = clsx("group group/line -mx-1 mb-2 flex h-7 w-[calc(100%+8px)] min-w-0 items-center gap-2 rounded-md px-1 text-left text-xs text-text-muted hover:bg-surface-hover", t7);
1289
+ $[12] = t7;
1290
+ $[13] = t1;
1291
+ } else {
1292
+ t1 = $[13];
1293
+ }
1294
+ t2 = expanded;
1295
+ t3 = onToggle;
1296
+ const t8 = expanded && "rotate-90";
1297
+ let t9;
1298
+ if ($[14] !== t8) {
1299
+ t9 = clsx("transition-transform", t8);
1300
+ $[14] = t8;
1301
+ $[15] = t9;
1302
+ } else {
1303
+ t9 = $[15];
1304
+ }
1305
+ if ($[16] !== t9) {
1306
+ t4 = /*#__PURE__*/_jsx("span", {
1307
+ className: ROW_GUTTER,
1308
+ children: /*#__PURE__*/_jsx(Icon, {
1309
+ icon: ChevronRight,
1310
+ size: 12,
1311
+ className: t9
1312
+ })
1313
+ });
1314
+ $[16] = t9;
1315
+ $[17] = t4;
1316
+ } else {
1317
+ t4 = $[17];
1318
+ }
1319
+ if ($[18] !== label) {
1320
+ t5 = /*#__PURE__*/_jsx("span", {
1321
+ className: "shrink-0 group-hover:text-text",
1322
+ children: label
1323
+ });
1324
+ $[18] = label;
1325
+ $[19] = t5;
1326
+ } else {
1327
+ t5 = $[19];
1328
+ }
1329
+ t6 = work.length > 0 && /*#__PURE__*/_jsx("span", {
1330
+ className: "min-w-0 truncate text-text-faint",
1331
+ children: work.map((part, index) => /*#__PURE__*/_jsxs(Fragment, {
1332
+ children: [" \xB7 ", withBrand(part, brands)]
1333
+ }, index))
1334
+ });
1335
+ $[0] = commandLooks;
1336
+ $[1] = expanded;
1337
+ $[2] = label;
1338
+ $[3] = onToggle;
1339
+ $[4] = turn.state;
1340
+ $[5] = work;
1341
+ $[6] = t1;
1342
+ $[7] = t2;
1343
+ $[8] = t3;
1344
+ $[9] = t4;
1345
+ $[10] = t5;
1346
+ $[11] = t6;
1347
+ } else {
1348
+ t1 = $[6];
1349
+ t2 = $[7];
1350
+ t3 = $[8];
1351
+ t4 = $[9];
1352
+ t5 = $[10];
1353
+ t6 = $[11];
1354
+ }
1355
+ let t7;
1356
+ if ($[20] === Symbol.for("react.memo_cache_sentinel")) {
1357
+ t7 = /*#__PURE__*/_jsx("span", {
1358
+ className: "grow"
1359
+ });
1360
+ $[20] = t7;
1361
+ } else {
1362
+ t7 = $[20];
1363
+ }
1364
+ let t8;
1365
+ if ($[21] !== turn.createdAt) {
1366
+ t8 = /*#__PURE__*/_jsx(RowTime, {
1367
+ at: turn.createdAt
1368
+ });
1369
+ $[21] = turn.createdAt;
1370
+ $[22] = t8;
1371
+ } else {
1372
+ t8 = $[22];
1373
+ }
1374
+ let t9;
1375
+ if ($[23] !== t1 || $[24] !== t2 || $[25] !== t3 || $[26] !== t4 || $[27] !== t5 || $[28] !== t6 || $[29] !== t8) {
1376
+ t9 = /*#__PURE__*/_jsxs("button", {
1377
+ className: t1,
1378
+ "aria-expanded": t2,
1379
+ onClick: t3,
1380
+ children: [t4, t5, t6, t7, t8]
1381
+ });
1382
+ $[23] = t1;
1383
+ $[24] = t2;
1384
+ $[25] = t3;
1385
+ $[26] = t4;
1386
+ $[27] = t5;
1387
+ $[28] = t6;
1388
+ $[29] = t8;
1389
+ $[30] = t9;
1390
+ } else {
1391
+ t9 = $[30];
1392
+ }
1393
+ return t9;
1394
+ }
1395
+ function _temp5(t0) {
1396
+ const {
1397
+ brand
1398
+ } = t0;
1399
+ return brand === undefined ? [] : [brand];
167
1400
  }
168
1401
  function omittedLabel(reason) {
169
- return reason === 'binary' ? i18next.t('agent-chat:work.omitted.binary') : i18next.t('agent-chat:work.omitted.tooLarge');
1402
+ return reason === 'binary' ? i18next.t('agent-chat:work.omitted.binary') : i18next.t('agent-chat:work.omitted.tooLarge');
170
1403
  }
171
1404
  /* One file of a turn's checkpoint diff: its patch, or the reason there is none. */
172
- function CheckpointFileBody({ file }) {
173
- if (file.omitted) {
174
- return _jsx("div", { className: "px-3 py-2 text-xs text-text-faint", children: omittedLabel(file.omitted) });
1405
+ function CheckpointFileBody(t0) {
1406
+ const $ = _c(6);
1407
+ const {
1408
+ file
1409
+ } = t0;
1410
+ if (file.omitted) {
1411
+ let t1;
1412
+ if ($[0] !== file.omitted) {
1413
+ t1 = omittedLabel(file.omitted);
1414
+ $[0] = file.omitted;
1415
+ $[1] = t1;
1416
+ } else {
1417
+ t1 = $[1];
175
1418
  }
176
- return (_jsx(DiffSuspense, { children: _jsx(UnifiedDiff, { change: file }) }));
1419
+ let t2;
1420
+ if ($[2] !== t1) {
1421
+ t2 = /*#__PURE__*/_jsx("div", {
1422
+ className: "px-3 py-2 text-xs text-text-faint",
1423
+ children: t1
1424
+ });
1425
+ $[2] = t1;
1426
+ $[3] = t2;
1427
+ } else {
1428
+ t2 = $[3];
1429
+ }
1430
+ return t2;
1431
+ }
1432
+ let t1;
1433
+ if ($[4] !== file) {
1434
+ t1 = /*#__PURE__*/_jsx(DiffSuspense, {
1435
+ children: /*#__PURE__*/_jsx(UnifiedDiff, {
1436
+ change: file
1437
+ })
1438
+ });
1439
+ $[4] = file;
1440
+ $[5] = t1;
1441
+ } else {
1442
+ t1 = $[5];
1443
+ }
1444
+ return t1;
177
1445
  }
178
1446
  /* The frame of a changed files card: a header that folds the list of files away. */
179
- function ChangedFilesCard({ count, truncated, added, deleted, revealNonce = 0, baseMoved, children }) {
180
- const { t } = useTranslation('agent-chat');
181
- const [expanded, setExpanded] = useState(false);
182
- // A jump opens the card, also one that mounted it by scrolling it on screen; the flash is gone by the next visit.
183
- const [seenReveal, setSeenReveal] = useState(0);
184
- if (revealNonce > 0 && revealNonce !== seenReveal) {
185
- setSeenReveal(revealNonce);
186
- setExpanded(true);
187
- }
188
- return (_jsxs("div", { className: "mb-3 overflow-hidden rounded-lg border border-border bg-surface-raised", children: [_jsxs("button", { className: "flex w-full items-center gap-2 px-3 py-2 text-left text-xs text-text-muted hover:bg-surface-hover", "aria-expanded": expanded, onClick: () => setExpanded((value) => !value), children: [_jsx(Icon, { icon: FileDiff, size: 12, className: "shrink-0" }), _jsx("span", { className: "shrink-0 font-medium text-text", children: baseMoved === undefined ? t('work.changedFiles', { count }) : t('work.folderChanges', { count }) }), truncated && _jsx("span", { className: "min-w-0 truncate text-text-faint", children: t('work.andMore') }), _jsx("span", { className: "grow" }), added !== undefined && _jsxs("span", { className: "text-chat-added tabular-nums", children: ["+", added] }), deleted !== undefined && _jsxs("span", { className: "text-chat-removed tabular-nums", children: ["-", deleted] }), _jsx(Icon, { icon: ChevronRight, size: 12, className: clsx('shrink-0 text-text-faint transition-transform', expanded && 'rotate-90') })] }), baseMoved !== undefined && (_jsx("div", { className: "pr-3 pb-2 pl-8 text-xs text-text-faint", children: t('work.baseMoved', { from: baseMoved.from.slice(0, 7), to: baseMoved.to.slice(0, 7) }) })), expanded && children] }));
1447
+ function ChangedFilesCard(t0) {
1448
+ const $ = _c(34);
1449
+ const {
1450
+ count,
1451
+ truncated,
1452
+ added,
1453
+ deleted,
1454
+ revealNonce: t1,
1455
+ baseMoved,
1456
+ children
1457
+ } = t0;
1458
+ const revealNonce = t1 === undefined ? 0 : t1;
1459
+ const {
1460
+ t
1461
+ } = useTranslation("agent-chat");
1462
+ const [expanded, setExpanded] = useState(false);
1463
+ const [seenReveal, setSeenReveal] = useState(0);
1464
+ if (revealNonce > 0 && revealNonce !== seenReveal) {
1465
+ setSeenReveal(revealNonce);
1466
+ setExpanded(true);
1467
+ }
1468
+ let t2;
1469
+ let t3;
1470
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
1471
+ t2 = () => setExpanded(_temp6);
1472
+ t3 = /*#__PURE__*/_jsx(Icon, {
1473
+ icon: FileDiff,
1474
+ size: 12,
1475
+ className: "shrink-0"
1476
+ });
1477
+ $[0] = t2;
1478
+ $[1] = t3;
1479
+ } else {
1480
+ t2 = $[0];
1481
+ t3 = $[1];
1482
+ }
1483
+ let t4;
1484
+ if ($[2] !== baseMoved || $[3] !== count || $[4] !== t) {
1485
+ t4 = baseMoved === undefined ? t("work.changedFiles", {
1486
+ count
1487
+ }) : t("work.folderChanges", {
1488
+ count
1489
+ });
1490
+ $[2] = baseMoved;
1491
+ $[3] = count;
1492
+ $[4] = t;
1493
+ $[5] = t4;
1494
+ } else {
1495
+ t4 = $[5];
1496
+ }
1497
+ let t5;
1498
+ if ($[6] !== t4) {
1499
+ t5 = /*#__PURE__*/_jsx("span", {
1500
+ className: "shrink-0 font-medium text-text",
1501
+ children: t4
1502
+ });
1503
+ $[6] = t4;
1504
+ $[7] = t5;
1505
+ } else {
1506
+ t5 = $[7];
1507
+ }
1508
+ let t6;
1509
+ if ($[8] !== t || $[9] !== truncated) {
1510
+ t6 = truncated && /*#__PURE__*/_jsx("span", {
1511
+ className: "min-w-0 truncate text-text-faint",
1512
+ children: t("work.andMore")
1513
+ });
1514
+ $[8] = t;
1515
+ $[9] = truncated;
1516
+ $[10] = t6;
1517
+ } else {
1518
+ t6 = $[10];
1519
+ }
1520
+ let t7;
1521
+ if ($[11] === Symbol.for("react.memo_cache_sentinel")) {
1522
+ t7 = /*#__PURE__*/_jsx("span", {
1523
+ className: "grow"
1524
+ });
1525
+ $[11] = t7;
1526
+ } else {
1527
+ t7 = $[11];
1528
+ }
1529
+ let t8;
1530
+ if ($[12] !== added) {
1531
+ t8 = added !== undefined && /*#__PURE__*/_jsxs("span", {
1532
+ className: "text-chat-added tabular-nums",
1533
+ children: ["+", added]
1534
+ });
1535
+ $[12] = added;
1536
+ $[13] = t8;
1537
+ } else {
1538
+ t8 = $[13];
1539
+ }
1540
+ let t9;
1541
+ if ($[14] !== deleted) {
1542
+ t9 = deleted !== undefined && /*#__PURE__*/_jsxs("span", {
1543
+ className: "text-chat-removed tabular-nums",
1544
+ children: ["-", deleted]
1545
+ });
1546
+ $[14] = deleted;
1547
+ $[15] = t9;
1548
+ } else {
1549
+ t9 = $[15];
1550
+ }
1551
+ const t10 = expanded && "rotate-90";
1552
+ let t11;
1553
+ if ($[16] !== t10) {
1554
+ t11 = clsx("shrink-0 text-text-faint transition-transform", t10);
1555
+ $[16] = t10;
1556
+ $[17] = t11;
1557
+ } else {
1558
+ t11 = $[17];
1559
+ }
1560
+ let t12;
1561
+ if ($[18] !== t11) {
1562
+ t12 = /*#__PURE__*/_jsx(Icon, {
1563
+ icon: ChevronRight,
1564
+ size: 12,
1565
+ className: t11
1566
+ });
1567
+ $[18] = t11;
1568
+ $[19] = t12;
1569
+ } else {
1570
+ t12 = $[19];
1571
+ }
1572
+ let t13;
1573
+ if ($[20] !== expanded || $[21] !== t12 || $[22] !== t5 || $[23] !== t6 || $[24] !== t8 || $[25] !== t9) {
1574
+ t13 = /*#__PURE__*/_jsxs("button", {
1575
+ className: "flex w-full items-center gap-2 px-3 py-2 text-left text-xs text-text-muted hover:bg-surface-hover",
1576
+ "aria-expanded": expanded,
1577
+ onClick: t2,
1578
+ children: [t3, t5, t6, t7, t8, t9, t12]
1579
+ });
1580
+ $[20] = expanded;
1581
+ $[21] = t12;
1582
+ $[22] = t5;
1583
+ $[23] = t6;
1584
+ $[24] = t8;
1585
+ $[25] = t9;
1586
+ $[26] = t13;
1587
+ } else {
1588
+ t13 = $[26];
1589
+ }
1590
+ let t14;
1591
+ if ($[27] !== baseMoved || $[28] !== t) {
1592
+ t14 = baseMoved !== undefined && /*#__PURE__*/_jsx("div", {
1593
+ className: "pr-3 pb-2 pl-8 text-xs text-text-faint",
1594
+ children: t("work.baseMoved", {
1595
+ from: baseMoved.from.slice(0, 7),
1596
+ to: baseMoved.to.slice(0, 7)
1597
+ })
1598
+ });
1599
+ $[27] = baseMoved;
1600
+ $[28] = t;
1601
+ $[29] = t14;
1602
+ } else {
1603
+ t14 = $[29];
1604
+ }
1605
+ const t15 = expanded && children;
1606
+ let t16;
1607
+ if ($[30] !== t13 || $[31] !== t14 || $[32] !== t15) {
1608
+ t16 = /*#__PURE__*/_jsxs("div", {
1609
+ className: "mb-3 overflow-hidden rounded-lg border border-border bg-surface-raised",
1610
+ children: [t13, t14, t15]
1611
+ });
1612
+ $[30] = t13;
1613
+ $[31] = t14;
1614
+ $[32] = t15;
1615
+ $[33] = t16;
1616
+ } else {
1617
+ t16 = $[33];
1618
+ }
1619
+ return t16;
189
1620
  }
190
1621
  /*
191
1622
  * The files a settled turn changed, as a card; each file opens its diff in place. The host's
@@ -193,76 +1624,426 @@ function ChangedFilesCard({ count, truncated, added, deleted, revealNonce = 0, b
193
1624
  * unified diffs the CLI reported, then the before and after of its own edits. A turn that has a
194
1625
  * checkpoint but no stored diff asks the host for one, which is also how a running turn gets it.
195
1626
  */
196
- export function ChangedFilesRow({ tools, diff, checkpoint, baseMoved, chatId, turnId }) {
197
- const [open, setOpen] = useState({});
198
- const [fetched, setFetched] = useState(null);
199
- const actions = useChatActions();
200
- useEffect(() => {
201
- if (diff !== null || !checkpoint) {
202
- return;
1627
+ function _temp6(value) {
1628
+ return !value;
1629
+ }
1630
+ export function ChangedFilesRow(t0) {
1631
+ const $ = _c(34);
1632
+ const {
1633
+ tools,
1634
+ diff,
1635
+ checkpoint,
1636
+ baseMoved,
1637
+ chatId,
1638
+ turnId
1639
+ } = t0;
1640
+ let t1;
1641
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
1642
+ t1 = {};
1643
+ $[0] = t1;
1644
+ } else {
1645
+ t1 = $[0];
1646
+ }
1647
+ const [open, setOpen] = useState(t1);
1648
+ const [fetched, setFetched] = useState(null);
1649
+ const actions = useChatActions();
1650
+ let t2;
1651
+ let t3;
1652
+ if ($[1] !== actions || $[2] !== chatId || $[3] !== checkpoint || $[4] !== diff || $[5] !== turnId) {
1653
+ t2 = () => {
1654
+ if (diff !== null || !checkpoint) {
1655
+ return;
1656
+ }
1657
+ let alive = true;
1658
+ actions.turnDiff(chatId, turnId).then(answer => {
1659
+ if (alive) {
1660
+ setFetched(answer);
203
1661
  }
204
- let alive = true;
205
- void actions
206
- .turnDiff(chatId, turnId)
207
- .then((answer) => {
208
- if (alive) {
209
- setFetched(answer);
210
- }
211
- })
212
- .catch(() => undefined);
213
- return () => {
214
- alive = false;
215
- };
216
- }, [actions, chatId, turnId, diff, checkpoint]);
217
- const checkpointDiff = diff ?? fetched;
218
- const { keyOf } = useChatScope();
219
- const flash = useTimelineFlash((s) => s.target);
220
- const revealNonce = flash !== null && flash.opens && flash.key === keyOf(chatId) && flash.rowId === `files-${turnId}` ? flash.nonce : 0;
221
- if (checkpointDiff !== null && checkpointDiff.files.length > 0) {
222
- const files = checkpointDiff.files;
223
- return (_jsx(ChangedFilesCard, { revealNonce: revealNonce, baseMoved: baseMoved, count: files.length, truncated: checkpointDiff.truncated, added: files.reduce((sum, file) => sum + file.added, 0), deleted: files.reduce((sum, file) => sum + file.deleted, 0), children: files.map((file) => (_jsx(ChangedFileLine, { path: file.path, open: open[file.path] === true, onToggle: () => setOpen((o) => ({ ...o, [file.path]: !o[file.path] })), trailing: _jsxs(_Fragment, { children: [_jsxs("span", { className: "text-chat-added tabular-nums", children: ["+", file.added] }), _jsxs("span", { className: "text-chat-removed tabular-nums", children: ["-", file.deleted] })] }), children: _jsx(CheckpointFileBody, { file: file }) }, file.path))) }));
1662
+ }).catch(_temp7);
1663
+ return () => {
1664
+ alive = false;
1665
+ };
1666
+ };
1667
+ t3 = [actions, chatId, turnId, diff, checkpoint];
1668
+ $[1] = actions;
1669
+ $[2] = chatId;
1670
+ $[3] = checkpoint;
1671
+ $[4] = diff;
1672
+ $[5] = turnId;
1673
+ $[6] = t2;
1674
+ $[7] = t3;
1675
+ } else {
1676
+ t2 = $[6];
1677
+ t3 = $[7];
1678
+ }
1679
+ useEffect(t2, t3);
1680
+ const checkpointDiff = diff ?? fetched;
1681
+ const {
1682
+ keyOf
1683
+ } = useChatScope();
1684
+ const flash = useTimelineFlash(_temp8);
1685
+ let t4;
1686
+ if ($[8] !== chatId || $[9] !== flash || $[10] !== keyOf || $[11] !== turnId) {
1687
+ t4 = flash !== null && flash.opens && flash.key === keyOf(chatId) && flash.rowId === `files-${turnId}` ? flash.nonce : 0;
1688
+ $[8] = chatId;
1689
+ $[9] = flash;
1690
+ $[10] = keyOf;
1691
+ $[11] = turnId;
1692
+ $[12] = t4;
1693
+ } else {
1694
+ t4 = $[12];
1695
+ }
1696
+ const revealNonce = t4;
1697
+ if (checkpointDiff !== null && checkpointDiff.files.length > 0) {
1698
+ const files = checkpointDiff.files;
1699
+ const t5 = files.length;
1700
+ const t6 = checkpointDiff.truncated;
1701
+ let t7;
1702
+ if ($[13] !== files) {
1703
+ t7 = files.reduce(_temp9, 0);
1704
+ $[13] = files;
1705
+ $[14] = t7;
1706
+ } else {
1707
+ t7 = $[14];
1708
+ }
1709
+ let t8;
1710
+ if ($[15] !== files) {
1711
+ t8 = files.reduce(_temp0, 0);
1712
+ $[15] = files;
1713
+ $[16] = t8;
1714
+ } else {
1715
+ t8 = $[16];
1716
+ }
1717
+ let t9;
1718
+ if ($[17] !== files || $[18] !== open) {
1719
+ let t10;
1720
+ if ($[20] !== open) {
1721
+ t10 = file_1 => /*#__PURE__*/_jsx(ChangedFileLine, {
1722
+ path: file_1.path,
1723
+ open: open[file_1.path] === true,
1724
+ onToggle: () => setOpen(o => ({
1725
+ ...o,
1726
+ [file_1.path]: !o[file_1.path]
1727
+ })),
1728
+ trailing: /*#__PURE__*/_jsxs(_Fragment, {
1729
+ children: [/*#__PURE__*/_jsxs("span", {
1730
+ className: "text-chat-added tabular-nums",
1731
+ children: ["+", file_1.added]
1732
+ }), /*#__PURE__*/_jsxs("span", {
1733
+ className: "text-chat-removed tabular-nums",
1734
+ children: ["-", file_1.deleted]
1735
+ })]
1736
+ }),
1737
+ children: /*#__PURE__*/_jsx(CheckpointFileBody, {
1738
+ file: file_1
1739
+ })
1740
+ }, file_1.path);
1741
+ $[20] = open;
1742
+ $[21] = t10;
1743
+ } else {
1744
+ t10 = $[21];
1745
+ }
1746
+ t9 = files.map(t10);
1747
+ $[17] = files;
1748
+ $[18] = open;
1749
+ $[19] = t9;
1750
+ } else {
1751
+ t9 = $[19];
224
1752
  }
225
- return _jsx(ProviderChangedFiles, { tools: tools, open: open, setOpen: setOpen, revealNonce: revealNonce });
1753
+ let t10;
1754
+ if ($[22] !== baseMoved || $[23] !== checkpointDiff.truncated || $[24] !== files.length || $[25] !== revealNonce || $[26] !== t7 || $[27] !== t8 || $[28] !== t9) {
1755
+ t10 = /*#__PURE__*/_jsx(ChangedFilesCard, {
1756
+ revealNonce: revealNonce,
1757
+ baseMoved: baseMoved,
1758
+ count: t5,
1759
+ truncated: t6,
1760
+ added: t7,
1761
+ deleted: t8,
1762
+ children: t9
1763
+ });
1764
+ $[22] = baseMoved;
1765
+ $[23] = checkpointDiff.truncated;
1766
+ $[24] = files.length;
1767
+ $[25] = revealNonce;
1768
+ $[26] = t7;
1769
+ $[27] = t8;
1770
+ $[28] = t9;
1771
+ $[29] = t10;
1772
+ } else {
1773
+ t10 = $[29];
1774
+ }
1775
+ return t10;
1776
+ }
1777
+ let t5;
1778
+ if ($[30] !== open || $[31] !== revealNonce || $[32] !== tools) {
1779
+ t5 = /*#__PURE__*/_jsx(ProviderChangedFiles, {
1780
+ tools: tools,
1781
+ open: open,
1782
+ setOpen: setOpen,
1783
+ revealNonce: revealNonce
1784
+ });
1785
+ $[30] = open;
1786
+ $[31] = revealNonce;
1787
+ $[32] = tools;
1788
+ $[33] = t5;
1789
+ } else {
1790
+ t5 = $[33];
1791
+ }
1792
+ return t5;
1793
+ }
1794
+ function _temp0(sum_0, file_0) {
1795
+ return sum_0 + file_0.deleted;
226
1796
  }
227
- function ProviderReviewFiles({ reviews, open, setOpen }) {
228
- const { t } = useTranslation('agent-chat');
229
- const stack = useReviewStack(reviews.filter(({ path }) => open[path] === true).flatMap(({ reviews }) => reviews));
230
- return reviews.map(({ path, count, reviews }) => (_jsx(ChangedFileLine, { path: path, open: open[path] === true, onToggle: () => setOpen((previous) => ({ ...previous, [path]: !previous[path] })), trailing: _jsx("span", { className: "text-text-faint", children: t('work.edits', { count }) }), children: _jsx(ReviewStackView, { entries: reviews, stack: stack }) }, path)));
1797
+ function _temp9(sum, file) {
1798
+ return sum + file.added;
1799
+ }
1800
+ function _temp8(s) {
1801
+ return s.target;
1802
+ }
1803
+ function _temp7() {}
1804
+ function ProviderReviewFiles(t0) {
1805
+ const $ = _c(16);
1806
+ const {
1807
+ reviews,
1808
+ open,
1809
+ setOpen
1810
+ } = t0;
1811
+ const {
1812
+ t
1813
+ } = useTranslation("agent-chat");
1814
+ let t1;
1815
+ if ($[0] !== open || $[1] !== reviews) {
1816
+ let t2;
1817
+ if ($[3] !== open) {
1818
+ t2 = t3 => {
1819
+ const {
1820
+ path
1821
+ } = t3;
1822
+ return open[path] === true;
1823
+ };
1824
+ $[3] = open;
1825
+ $[4] = t2;
1826
+ } else {
1827
+ t2 = $[4];
1828
+ }
1829
+ t1 = reviews.filter(t2).flatMap(_temp1);
1830
+ $[0] = open;
1831
+ $[1] = reviews;
1832
+ $[2] = t1;
1833
+ } else {
1834
+ t1 = $[2];
1835
+ }
1836
+ const stack = useReviewStack(t1);
1837
+ let t2;
1838
+ if ($[5] !== open || $[6] !== reviews || $[7] !== setOpen || $[8] !== stack || $[9] !== t) {
1839
+ let t3;
1840
+ if ($[11] !== open || $[12] !== setOpen || $[13] !== stack || $[14] !== t) {
1841
+ t3 = t4 => {
1842
+ const {
1843
+ path: path_0,
1844
+ count,
1845
+ reviews: reviews_1
1846
+ } = t4;
1847
+ return /*#__PURE__*/_jsx(ChangedFileLine, {
1848
+ path: path_0,
1849
+ open: open[path_0] === true,
1850
+ onToggle: () => setOpen(previous => ({
1851
+ ...previous,
1852
+ [path_0]: !previous[path_0]
1853
+ })),
1854
+ trailing: /*#__PURE__*/_jsx("span", {
1855
+ className: "text-text-faint",
1856
+ children: t("work.edits", {
1857
+ count
1858
+ })
1859
+ }),
1860
+ children: /*#__PURE__*/_jsx(ReviewStackView, {
1861
+ entries: reviews_1,
1862
+ stack: stack
1863
+ })
1864
+ }, path_0);
1865
+ };
1866
+ $[11] = open;
1867
+ $[12] = setOpen;
1868
+ $[13] = stack;
1869
+ $[14] = t;
1870
+ $[15] = t3;
1871
+ } else {
1872
+ t3 = $[15];
1873
+ }
1874
+ t2 = reviews.map(t3);
1875
+ $[5] = open;
1876
+ $[6] = reviews;
1877
+ $[7] = setOpen;
1878
+ $[8] = stack;
1879
+ $[9] = t;
1880
+ $[10] = t2;
1881
+ } else {
1882
+ t2 = $[10];
1883
+ }
1884
+ return t2;
231
1885
  }
232
1886
  /* The fallback card, built from what the CLI itself reported about its edits. */
233
- function ProviderChangedFiles({ tools, open, setOpen, revealNonce }) {
234
- const byPath = new Map();
235
- const entryFor = (path) => {
236
- const existing = byPath.get(path);
237
- if (existing) {
238
- return existing;
239
- }
240
- const created = { edits: [], patches: [] };
241
- byPath.set(path, created);
242
- return created;
1887
+ function _temp1(t0) {
1888
+ const {
1889
+ reviews: reviews_0
1890
+ } = t0;
1891
+ return reviews_0;
1892
+ }
1893
+ function ProviderChangedFiles(t0) {
1894
+ const $ = _c(11);
1895
+ const {
1896
+ tools,
1897
+ open,
1898
+ setOpen,
1899
+ revealNonce
1900
+ } = t0;
1901
+ let byPath;
1902
+ let t1;
1903
+ if ($[0] !== tools) {
1904
+ byPath = new Map();
1905
+ const entryFor = path => {
1906
+ const existing = byPath.get(path);
1907
+ if (existing) {
1908
+ return existing;
1909
+ }
1910
+ const created = {
1911
+ edits: [],
1912
+ patches: []
1913
+ };
1914
+ byPath.set(path, created);
1915
+ return created;
243
1916
  };
244
1917
  for (const tool of tools) {
245
- const patches = unifiedChanges(tool);
246
- if (patches.length > 0) {
247
- for (const patch of patches) {
248
- entryFor(patch.path).patches.push(patch);
249
- }
250
- continue;
251
- }
252
- for (const change of fileChanges(tool.name, tool.input)) {
253
- entryFor(change.path || tool.id).edits.push(change);
1918
+ const patches = unifiedChanges(tool);
1919
+ if (patches.length > 0) {
1920
+ for (const patch of patches) {
1921
+ entryFor(patch.path).patches.push(patch);
254
1922
  }
1923
+ continue;
1924
+ }
1925
+ for (const change of fileChanges(tool.name, tool.input)) {
1926
+ entryFor(change.path || tool.id).edits.push(change);
1927
+ }
255
1928
  }
256
- const reviews = [...byPath].map(([path, entry]) => ({
257
- path,
258
- count: entry.patches.length + entry.edits.length,
259
- reviews: reviewEntries(entry.patches, entry.edits)
260
- }));
261
- return (_jsx(ChangedFilesCard, { count: byPath.size, revealNonce: revealNonce, children: _jsx(ProviderReviewFiles, { reviews: reviews, open: open, setOpen: setOpen }) }));
1929
+ t1 = [...byPath].map(_temp10);
1930
+ $[0] = tools;
1931
+ $[1] = byPath;
1932
+ $[2] = t1;
1933
+ } else {
1934
+ byPath = $[1];
1935
+ t1 = $[2];
1936
+ }
1937
+ const reviews = t1;
1938
+ let t2;
1939
+ if ($[3] !== open || $[4] !== reviews || $[5] !== setOpen) {
1940
+ t2 = /*#__PURE__*/_jsx(ProviderReviewFiles, {
1941
+ reviews: reviews,
1942
+ open: open,
1943
+ setOpen: setOpen
1944
+ });
1945
+ $[3] = open;
1946
+ $[4] = reviews;
1947
+ $[5] = setOpen;
1948
+ $[6] = t2;
1949
+ } else {
1950
+ t2 = $[6];
1951
+ }
1952
+ let t3;
1953
+ if ($[7] !== byPath.size || $[8] !== revealNonce || $[9] !== t2) {
1954
+ t3 = /*#__PURE__*/_jsx(ChangedFilesCard, {
1955
+ count: byPath.size,
1956
+ revealNonce: revealNonce,
1957
+ children: t2
1958
+ });
1959
+ $[7] = byPath.size;
1960
+ $[8] = revealNonce;
1961
+ $[9] = t2;
1962
+ $[10] = t3;
1963
+ } else {
1964
+ t3 = $[10];
1965
+ }
1966
+ return t3;
262
1967
  }
263
1968
  /* "Working for 00:14". */
264
- export function WorkingRow({ startedAt }) {
265
- const { t } = useTranslation('agent-chat');
266
- const ref = useTickingText(() => formatClockDuration(Date.now() - startedAt));
267
- return (_jsxs("div", { className: "-mx-1 mb-0.5 flex h-7 items-center gap-2 px-1 text-xs text-text-muted", children: [_jsx("span", { className: `${ROW_GUTTER} text-status-running`, children: _jsx(Spinner, { size: 12 }) }), _jsx("span", { className: "chat-live-text", children: t('work.workingFor') }), _jsx("span", { ref: ref, className: "tabular-nums" })] }));
1969
+ function _temp10(t0) {
1970
+ const [path_0, entry] = t0;
1971
+ return {
1972
+ path: path_0,
1973
+ count: entry.patches.length + entry.edits.length,
1974
+ reviews: reviewEntries(entry.patches, entry.edits)
1975
+ };
268
1976
  }
1977
+ export function WorkingRow(t0) {
1978
+ const $ = _c(12);
1979
+ const {
1980
+ startedAt
1981
+ } = t0;
1982
+ const {
1983
+ t
1984
+ } = useTranslation("agent-chat");
1985
+ let t1;
1986
+ if ($[0] !== startedAt) {
1987
+ t1 = () => formatClockDuration(Date.now() - startedAt);
1988
+ $[0] = startedAt;
1989
+ $[1] = t1;
1990
+ } else {
1991
+ t1 = $[1];
1992
+ }
1993
+ const ref = useTickingText(t1);
1994
+ let t2;
1995
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
1996
+ t2 = /*#__PURE__*/_jsx("span", {
1997
+ className: `${ROW_GUTTER} text-status-running`,
1998
+ children: /*#__PURE__*/_jsx(Spinner, {
1999
+ size: 12
2000
+ })
2001
+ });
2002
+ $[2] = t2;
2003
+ } else {
2004
+ t2 = $[2];
2005
+ }
2006
+ let t3;
2007
+ if ($[3] !== t) {
2008
+ t3 = t("work.workingFor");
2009
+ $[3] = t;
2010
+ $[4] = t3;
2011
+ } else {
2012
+ t3 = $[4];
2013
+ }
2014
+ let t4;
2015
+ if ($[5] !== t3) {
2016
+ t4 = /*#__PURE__*/_jsx("span", {
2017
+ className: "chat-live-text",
2018
+ children: t3
2019
+ });
2020
+ $[5] = t3;
2021
+ $[6] = t4;
2022
+ } else {
2023
+ t4 = $[6];
2024
+ }
2025
+ let t5;
2026
+ if ($[7] !== ref) {
2027
+ t5 = /*#__PURE__*/_jsx("span", {
2028
+ ref: ref,
2029
+ className: "tabular-nums"
2030
+ });
2031
+ $[7] = ref;
2032
+ $[8] = t5;
2033
+ } else {
2034
+ t5 = $[8];
2035
+ }
2036
+ let t6;
2037
+ if ($[9] !== t4 || $[10] !== t5) {
2038
+ t6 = /*#__PURE__*/_jsxs("div", {
2039
+ className: "-mx-1 mb-0.5 flex h-7 items-center gap-2 px-1 text-xs text-text-muted",
2040
+ children: [t2, t4, t5]
2041
+ });
2042
+ $[9] = t4;
2043
+ $[10] = t5;
2044
+ $[11] = t6;
2045
+ } else {
2046
+ t6 = $[11];
2047
+ }
2048
+ return t6;
2049
+ }