@opengeni/react 0.46.1 → 0.52.1

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 (341) hide show
  1. package/README.md +158 -14
  2. package/dist/artifacts-document.d.ts +3 -0
  3. package/dist/artifacts-document.js +17 -0
  4. package/dist/artifacts-document.js.map +1 -0
  5. package/dist/artifacts-presentation.d.ts +3 -0
  6. package/dist/artifacts-presentation.js +17 -0
  7. package/dist/artifacts-presentation.js.map +1 -0
  8. package/dist/artifacts-spreadsheet.d.ts +3 -0
  9. package/dist/artifacts-spreadsheet.js +17 -0
  10. package/dist/artifacts-spreadsheet.js.map +1 -0
  11. package/dist/artifacts.d.ts +2 -0
  12. package/dist/artifacts.js +170 -0
  13. package/dist/artifacts.js.map +1 -0
  14. package/dist/chunk-6BBWWOOU.js +82 -0
  15. package/dist/chunk-6BBWWOOU.js.map +1 -0
  16. package/dist/{chunk-HFO4ERGQ.js → chunk-724BW4TW.js} +586 -35
  17. package/dist/chunk-724BW4TW.js.map +1 -0
  18. package/dist/chunk-7I2KB3OK.js +3895 -0
  19. package/dist/chunk-7I2KB3OK.js.map +1 -0
  20. package/dist/chunk-7WCLAEFV.js +2828 -0
  21. package/dist/chunk-7WCLAEFV.js.map +1 -0
  22. package/dist/{chunk-U3CSCMWA.js → chunk-FK6VG4LL.js} +9 -13
  23. package/dist/chunk-FK6VG4LL.js.map +1 -0
  24. package/dist/{chunk-SRFUT2ZU.js → chunk-FWS3KC3Z.js} +120 -64
  25. package/dist/chunk-FWS3KC3Z.js.map +1 -0
  26. package/dist/{chunk-EKZH6IDG.js → chunk-HDBG7XGO.js} +62 -1
  27. package/dist/chunk-HDBG7XGO.js.map +1 -0
  28. package/dist/chunk-HUIKIDM5.js +2148 -0
  29. package/dist/chunk-HUIKIDM5.js.map +1 -0
  30. package/dist/{chunk-LGVMUIRV.js → chunk-JAGDUCZQ.js} +1053 -390
  31. package/dist/chunk-JAGDUCZQ.js.map +1 -0
  32. package/dist/{chunk-LWR4MXSS.js → chunk-JR3QFY6B.js} +420 -35
  33. package/dist/chunk-JR3QFY6B.js.map +1 -0
  34. package/dist/chunk-JVYQRRC4.js +53 -0
  35. package/dist/chunk-JVYQRRC4.js.map +1 -0
  36. package/dist/chunk-KCGXPP5V.js +157 -0
  37. package/dist/chunk-KCGXPP5V.js.map +1 -0
  38. package/dist/{chunk-EB67J347.js → chunk-KZ73RL76.js} +111 -31
  39. package/dist/chunk-KZ73RL76.js.map +1 -0
  40. package/dist/chunk-PEI6RANI.js +3234 -0
  41. package/dist/chunk-PEI6RANI.js.map +1 -0
  42. package/dist/{chunk-3PB7MIT6.js → chunk-ROIRTM37.js} +220 -72
  43. package/dist/chunk-ROIRTM37.js.map +1 -0
  44. package/dist/chunk-VZTQ73XT.js +86 -0
  45. package/dist/chunk-VZTQ73XT.js.map +1 -0
  46. package/dist/{chunk-VCBFUSUZ.js → chunk-WSK7G5LE.js} +72 -4
  47. package/dist/chunk-WSK7G5LE.js.map +1 -0
  48. package/dist/{chunk-FGZUCXZF.js → chunk-WYA65Y3F.js} +16 -16
  49. package/dist/chunk-WYA65Y3F.js.map +1 -0
  50. package/dist/{chunk-6EDV6YFE.js → chunk-X4S56Y2H.js} +147 -35
  51. package/dist/chunk-X4S56Y2H.js.map +1 -0
  52. package/dist/client.d.ts +7 -1
  53. package/dist/clipboard.d.ts +1 -0
  54. package/dist/clipboard.js +7 -0
  55. package/dist/clipboard.js.map +1 -0
  56. package/dist/commands/index.d.ts +3 -3
  57. package/dist/commands/registry.d.ts +1 -1
  58. package/dist/commands/types.d.ts +1 -1
  59. package/dist/components/approval-surface.d.ts +2 -2
  60. package/dist/components/artifacts/artifact-surface.d.ts +18 -0
  61. package/dist/components/artifacts/document-editor.d.ts +172 -0
  62. package/dist/components/artifacts/editable-artifact-ui.d.ts +13 -0
  63. package/dist/components/artifacts/editable-artifact-workbench.d.ts +49 -0
  64. package/dist/components/artifacts/editable-document.d.ts +24 -0
  65. package/dist/components/artifacts/editable-presentation.d.ts +24 -0
  66. package/dist/components/artifacts/editable-spreadsheet.d.ts +32 -0
  67. package/dist/components/artifacts/index.d.ts +8 -0
  68. package/dist/components/artifacts/presentation-editor.d.ts +297 -0
  69. package/dist/components/artifacts/spreadsheet-canvas.d.ts +120 -0
  70. package/dist/components/artifacts/spreadsheet-grid.d.ts +113 -0
  71. package/dist/components/browser-viewer.d.ts +29 -0
  72. package/dist/components/chat-composer.d.ts +13 -8
  73. package/dist/components/code-editor.d.ts +25 -3
  74. package/dist/components/command-palette.d.ts +2 -2
  75. package/dist/components/composer-transcription-control.d.ts +4 -2
  76. package/dist/components/composer.d.ts +29 -15
  77. package/dist/components/computer-viewer.d.ts +23 -0
  78. package/dist/components/copy-button.d.ts +2 -2
  79. package/dist/components/desktop-viewer.d.ts +25 -21
  80. package/dist/components/diff-view.d.ts +1 -1
  81. package/dist/components/enrollment-consent.d.ts +1 -1
  82. package/dist/components/enrollment-device-flow.d.ts +1 -1
  83. package/dist/components/file-browser.d.ts +2 -2
  84. package/dist/components/fleet-tile.d.ts +1 -1
  85. package/dist/components/generated-video-player.d.ts +10 -0
  86. package/dist/components/human-input-form.d.ts +1 -1
  87. package/dist/components/human-input-surface.d.ts +2 -2
  88. package/dist/components/interactive-workbench-viewers.d.ts +2 -0
  89. package/dist/components/machine-card.d.ts +2 -2
  90. package/dist/components/machine-dock-bar.d.ts +3 -3
  91. package/dist/components/machine-health-pill.d.ts +2 -2
  92. package/dist/components/machine-input-display.d.ts +1 -1
  93. package/dist/components/machine-metrics.d.ts +2 -2
  94. package/dist/components/machine-status-pill.d.ts +4 -4
  95. package/dist/components/machines/health.d.ts +1 -1
  96. package/dist/components/machines/machine-detail.d.ts +5 -3
  97. package/dist/components/machines/metric-history-chart.d.ts +1 -1
  98. package/dist/components/machines/metric-sparkline.d.ts +2 -2
  99. package/dist/components/machines/series.d.ts +2 -2
  100. package/dist/components/machines-dashboard.d.ts +5 -5
  101. package/dist/components/markdown.d.ts +1 -1
  102. package/dist/components/message-timeline.d.ts +22 -5
  103. package/dist/components/model-picker.d.ts +2 -2
  104. package/dist/components/model-policy-picker.d.ts +7 -7
  105. package/dist/components/pierre-diff.d.ts +1 -1
  106. package/dist/components/pierre-file.d.ts +1 -1
  107. package/dist/components/queue-draft-policy.d.ts +1 -1
  108. package/dist/components/queue-surface-implementation.d.ts +3 -3
  109. package/dist/components/queue-surface-state.d.ts +4 -4
  110. package/dist/components/queue-surface.d.ts +5 -5
  111. package/dist/components/sandbox-files.d.ts +5 -5
  112. package/dist/components/sandbox-terminal.d.ts +50 -4
  113. package/dist/components/sandbox-workspace.d.ts +30 -10
  114. package/dist/components/session-chrome.d.ts +4 -4
  115. package/dist/components/session-status.d.ts +2 -2
  116. package/dist/components/timeline-annotation-selection.d.ts +9 -0
  117. package/dist/components/timeline-annotations-dialog.d.ts +16 -0
  118. package/dist/components/timeline-annotations.d.ts +13 -0
  119. package/dist/components/tooltip.d.ts +4 -4
  120. package/dist/components/user-message-body.d.ts +2 -2
  121. package/dist/components/workbench-changes.d.ts +2 -2
  122. package/dist/components/workspace-dock.d.ts +3 -1
  123. package/dist/composer.d.ts +11 -11
  124. package/dist/composer.js +7 -7
  125. package/dist/hooks/internal.d.ts +7 -1
  126. package/dist/hooks/use-attached-browsers.d.ts +21 -0
  127. package/dist/hooks/use-available-models.d.ts +2 -2
  128. package/dist/hooks/use-billing-usage.d.ts +1 -1
  129. package/dist/hooks/use-browser-frame-stream.d.ts +28 -0
  130. package/dist/hooks/use-browser-identities.d.ts +26 -0
  131. package/dist/hooks/use-browser-session.d.ts +28 -0
  132. package/dist/hooks/use-browser-sessions.d.ts +32 -0
  133. package/dist/hooks/use-codex-accounts.d.ts +3 -3
  134. package/dist/hooks/use-composer.d.ts +36 -9
  135. package/dist/hooks/use-computer-frame-stream.d.ts +24 -0
  136. package/dist/hooks/use-computer-session.d.ts +28 -0
  137. package/dist/hooks/use-computer-sessions.d.ts +28 -0
  138. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  139. package/dist/hooks/use-environments.d.ts +11 -5
  140. package/dist/hooks/use-file-attachments.d.ts +1 -1
  141. package/dist/hooks/use-goal.d.ts +2 -2
  142. package/dist/hooks/use-human-input.d.ts +2 -2
  143. package/dist/hooks/use-last-started-turn-policy.d.ts +2 -2
  144. package/dist/hooks/use-machine-chip.d.ts +2 -2
  145. package/dist/hooks/use-machines.d.ts +10 -3
  146. package/dist/hooks/use-packs.d.ts +7 -2
  147. package/dist/hooks/use-rigs.d.ts +1 -1
  148. package/dist/hooks/use-sandbox-files.d.ts +25 -4
  149. package/dist/hooks/use-sandbox-git.d.ts +13 -5
  150. package/dist/hooks/use-sandbox-terminal.d.ts +1 -1
  151. package/dist/hooks/use-scheduled-tasks.d.ts +1 -1
  152. package/dist/hooks/use-session-capabilities.d.ts +5 -4
  153. package/dist/hooks/use-session-control.d.ts +1 -1
  154. package/dist/hooks/use-session-events.d.ts +2 -2
  155. package/dist/hooks/use-session-lineage.d.ts +1 -1
  156. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  157. package/dist/hooks/use-session.d.ts +2 -2
  158. package/dist/hooks/use-slash-commands.d.ts +1 -1
  159. package/dist/hooks/use-terminal-stream.d.ts +8 -2
  160. package/dist/hooks/use-transcription.d.ts +2 -2
  161. package/dist/hooks/use-turn-queue.d.ts +2 -2
  162. package/dist/hooks/use-video-artifact-playback.d.ts +9 -0
  163. package/dist/hooks/use-voice-input.d.ts +6 -4
  164. package/dist/hooks/use-workspace-capture.d.ts +1 -1
  165. package/dist/hooks/use-workspace-edit.d.ts +1 -1
  166. package/dist/hooks/use-workspace-sessions.d.ts +1 -1
  167. package/dist/hooks/use-workspaces.d.ts +1 -1
  168. package/dist/index.d.ts +158 -154
  169. package/dist/index.js +1718 -908
  170. package/dist/index.js.map +1 -1
  171. package/dist/interaction.d.ts +23 -0
  172. package/dist/interaction.js +36 -0
  173. package/dist/interaction.js.map +1 -0
  174. package/dist/interactive-workbench-viewers-KHNOHWQE.js +13 -0
  175. package/dist/interactive-workbench-viewers-KHNOHWQE.js.map +1 -0
  176. package/dist/lib/composer-responsive-context.d.ts +9 -0
  177. package/dist/lib/relay-wire.d.ts +4 -0
  178. package/dist/lib/sandbox-liveness.d.ts +9 -0
  179. package/dist/lib/terminal-capability.d.ts +5 -0
  180. package/dist/lib/use-portal-token-style.d.ts +14 -3
  181. package/dist/lib/xterm-theme.d.ts +1 -1
  182. package/dist/machines.d.ts +30 -30
  183. package/dist/machines.js +3 -3
  184. package/dist/provider.d.ts +4 -4
  185. package/dist/{queue-surface-implementation-J4XJFKRW.js → queue-surface-implementation-2KVJTYXH.js} +117 -64
  186. package/dist/queue-surface-implementation-2KVJTYXH.js.map +1 -0
  187. package/dist/realtime/dropdown-menu.d.ts +8 -8
  188. package/dist/realtime/realtime-control.d.ts +15 -6
  189. package/dist/realtime.d.ts +4 -4
  190. package/dist/realtime.js +30 -33
  191. package/dist/realtime.js.map +1 -1
  192. package/dist/session-context.d.ts +19 -1
  193. package/dist/session-ui.d.ts +14 -14
  194. package/dist/session-ui.js +6 -5
  195. package/dist/session.d.ts +28 -28
  196. package/dist/session.js +5 -5
  197. package/dist/timeline/activity-rail.d.ts +6 -3
  198. package/dist/timeline/disclosure-context.d.ts +1 -1
  199. package/dist/timeline/fleet-decision-projection.d.ts +1 -1
  200. package/dist/timeline/fleet-decision-row.d.ts +3 -3
  201. package/dist/timeline/index.d.ts +19 -19
  202. package/dist/timeline/parsers.d.ts +6 -3
  203. package/dist/timeline/projection.d.ts +3 -3
  204. package/dist/timeline/registry.d.ts +10 -1
  205. package/dist/timeline/screenshot-lightbox.d.ts +2 -2
  206. package/dist/timeline/shared.d.ts +21 -10
  207. package/dist/timeline/tool-diff.d.ts +2 -2
  208. package/dist/timeline/tool-renderers.d.ts +1 -1
  209. package/dist/timeline/turn-summary.d.ts +3 -3
  210. package/dist/timeline/types.d.ts +42 -2
  211. package/dist/timeline-annotation-selection-3L7LHGG2.js +187 -0
  212. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +1 -0
  213. package/dist/timeline-annotations-dialog-U7EVLR75.js +196 -0
  214. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +1 -0
  215. package/dist/voice-recording-store.d.ts +8 -2
  216. package/package.json +52 -7
  217. package/src/artifacts-document.ts +31 -0
  218. package/src/artifacts-presentation.ts +36 -0
  219. package/src/artifacts-spreadsheet.ts +21 -0
  220. package/src/artifacts.ts +86 -0
  221. package/src/client.ts +90 -1
  222. package/src/clipboard.ts +2 -0
  223. package/src/components/artifacts/artifact-surface.tsx +93 -0
  224. package/src/components/artifacts/document-editor.tsx +2255 -0
  225. package/src/components/artifacts/editable-artifact-ui.tsx +89 -0
  226. package/src/components/artifacts/editable-artifact-workbench.tsx +203 -0
  227. package/src/components/artifacts/editable-document.tsx +657 -0
  228. package/src/components/artifacts/editable-presentation.tsx +1020 -0
  229. package/src/components/artifacts/editable-spreadsheet.tsx +733 -0
  230. package/src/components/artifacts/index.ts +99 -0
  231. package/src/components/artifacts/presentation-editor.tsx +3148 -0
  232. package/src/components/artifacts/spreadsheet-canvas.ts +799 -0
  233. package/src/components/artifacts/spreadsheet-grid.tsx +2129 -0
  234. package/src/components/browser-viewer.tsx +1592 -0
  235. package/src/components/chat-composer.tsx +25 -2
  236. package/src/components/code-editor.tsx +90 -31
  237. package/src/components/command-palette.tsx +1 -1
  238. package/src/components/composer-transcription-control.tsx +51 -22
  239. package/src/components/composer.tsx +49 -23
  240. package/src/components/computer-viewer.tsx +1139 -0
  241. package/src/components/copy-button.tsx +1 -1
  242. package/src/components/desktop-viewer.tsx +103 -75
  243. package/src/components/file-browser.tsx +39 -17
  244. package/src/components/generated-video-player.tsx +89 -0
  245. package/src/components/human-input-form.tsx +2 -2
  246. package/src/components/interactive-workbench-viewers.ts +2 -0
  247. package/src/components/machine-card.tsx +1 -1
  248. package/src/components/machine-input-display.ts +3 -0
  249. package/src/components/machines/machine-detail.tsx +39 -15
  250. package/src/components/machines-dashboard.tsx +7 -6
  251. package/src/components/message-timeline.tsx +327 -37
  252. package/src/components/model-picker.tsx +2 -2
  253. package/src/components/model-policy-picker.tsx +16 -15
  254. package/src/components/queue-surface-implementation.tsx +135 -75
  255. package/src/components/queue-surface-state.tsx +2 -2
  256. package/src/components/sandbox-files.tsx +142 -62
  257. package/src/components/sandbox-terminal.tsx +119 -35
  258. package/src/components/sandbox-workspace.tsx +394 -228
  259. package/src/components/session-chrome.tsx +67 -27
  260. package/src/components/timeline-annotation-selection.tsx +221 -0
  261. package/src/components/timeline-annotations-dialog.tsx +213 -0
  262. package/src/components/timeline-annotations.tsx +84 -0
  263. package/src/components/tooltip.tsx +13 -16
  264. package/src/components/user-message-body.tsx +1 -1
  265. package/src/components/workbench-changes.tsx +192 -35
  266. package/src/components/workspace-dock.tsx +13 -5
  267. package/src/composer.ts +3 -0
  268. package/src/hooks/internal.ts +132 -38
  269. package/src/hooks/use-attached-browsers.ts +152 -0
  270. package/src/hooks/use-browser-frame-stream.ts +316 -0
  271. package/src/hooks/use-browser-identities.ts +225 -0
  272. package/src/hooks/use-browser-session.ts +476 -0
  273. package/src/hooks/use-browser-sessions.ts +281 -0
  274. package/src/hooks/use-codex-accounts.ts +4 -4
  275. package/src/hooks/use-composer.ts +769 -24
  276. package/src/hooks/use-computer-frame-stream.ts +311 -0
  277. package/src/hooks/use-computer-session.ts +442 -0
  278. package/src/hooks/use-computer-sessions.ts +245 -0
  279. package/src/hooks/use-environments.ts +24 -5
  280. package/src/hooks/use-file-attachments.ts +70 -32
  281. package/src/hooks/use-goal.ts +17 -5
  282. package/src/hooks/use-machine-chip.ts +5 -3
  283. package/src/hooks/use-machines.ts +79 -3
  284. package/src/hooks/use-packs.ts +51 -0
  285. package/src/hooks/use-sandbox-files.ts +382 -88
  286. package/src/hooks/use-sandbox-git.ts +208 -46
  287. package/src/hooks/use-sandbox-terminal.ts +3 -2
  288. package/src/hooks/use-session-capabilities.ts +94 -70
  289. package/src/hooks/use-session-events.ts +18 -4
  290. package/src/hooks/use-terminal-stream.ts +102 -23
  291. package/src/hooks/use-transcription.ts +4 -14
  292. package/src/hooks/use-turn-queue.ts +17 -5
  293. package/src/hooks/use-video-artifact-playback.ts +28 -0
  294. package/src/hooks/use-voice-input.ts +163 -19
  295. package/src/hooks/use-windowed-sections.ts +9 -7
  296. package/src/hooks/use-workspace-edit.ts +2 -1
  297. package/src/index.ts +21 -6
  298. package/src/interaction.ts +71 -0
  299. package/src/lib/composer-responsive-context.ts +15 -0
  300. package/src/lib/relay-wire.ts +4 -0
  301. package/src/lib/sandbox-liveness.ts +11 -0
  302. package/src/lib/terminal-capability.ts +10 -0
  303. package/src/lib/use-portal-token-style.ts +60 -15
  304. package/src/provider.tsx +52 -7
  305. package/src/realtime/dropdown-menu.tsx +15 -19
  306. package/src/realtime/realtime-control.tsx +16 -5
  307. package/src/session-context.ts +90 -0
  308. package/src/timeline/activity-rail.tsx +31 -6
  309. package/src/timeline/index.ts +4 -1
  310. package/src/timeline/parsers.ts +46 -20
  311. package/src/timeline/projection.ts +233 -13
  312. package/src/timeline/registry.ts +19 -0
  313. package/src/timeline/screenshot-lightbox.tsx +30 -9
  314. package/src/timeline/shared.tsx +59 -11
  315. package/src/timeline/tool-renderers.tsx +421 -24
  316. package/src/timeline/turn-summary.tsx +2 -2
  317. package/src/timeline/types.ts +58 -2
  318. package/src/voice-recording-store.ts +15 -0
  319. package/styles/compiled.css +5298 -0
  320. package/styles/compiled.d.ts +2 -0
  321. package/styles/effective-tokens.css +27 -0
  322. package/styles/index.css +18 -0
  323. package/styles/responsive.css +208 -0
  324. package/styles/responsive.d.ts +2 -0
  325. package/styles/tokens.css +50 -17
  326. package/dist/chunk-3PB7MIT6.js.map +0 -1
  327. package/dist/chunk-6EDV6YFE.js.map +0 -1
  328. package/dist/chunk-EB67J347.js.map +0 -1
  329. package/dist/chunk-EKZH6IDG.js.map +0 -1
  330. package/dist/chunk-FGZUCXZF.js.map +0 -1
  331. package/dist/chunk-HFO4ERGQ.js.map +0 -1
  332. package/dist/chunk-JB5725BI.js +0 -48
  333. package/dist/chunk-JB5725BI.js.map +0 -1
  334. package/dist/chunk-LGVMUIRV.js.map +0 -1
  335. package/dist/chunk-LWR4MXSS.js.map +0 -1
  336. package/dist/chunk-SRFUT2ZU.js.map +0 -1
  337. package/dist/chunk-U3CSCMWA.js.map +0 -1
  338. package/dist/chunk-VCBFUSUZ.js.map +0 -1
  339. package/dist/fleet-decision-projection-SLNZMS42.js +0 -241
  340. package/dist/fleet-decision-projection-SLNZMS42.js.map +0 -1
  341. package/dist/queue-surface-implementation-J4XJFKRW.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import type { GitFileDiff } from "@opengeni/sdk";
1
+ import type { GitFileDiff, RetainedArtifactReference } from "@opengeni/sdk";
2
2
  import {
3
3
  BoxIcon,
4
4
  BrainCircuitIcon,
@@ -26,21 +26,23 @@ import {
26
26
  Share2Icon,
27
27
  TargetIcon,
28
28
  TerminalIcon,
29
+ VideoIcon,
29
30
  WrenchIcon,
30
31
  } from "lucide-react";
31
- import type { ReactNode } from "react";
32
+ import { useEffect, useRef, useState, type ReactNode } from "react";
32
33
  import { stringifyPayload, tryParseJson } from "../lib/format";
33
34
  import { useTimelineComputeLabel } from "./compute-label";
34
35
  import {
35
36
  applyPatchOpsFromToolItem,
36
37
  controlCaret,
37
38
  execTruncated,
39
+ generatedImageReceipt,
38
40
  isExecSessionLostBanner,
39
41
  looksBinary,
40
42
  mediaPreviewFact,
41
43
  parseExecBannerSessionId,
42
44
  parseToolArgs,
43
- redactSecrets,
45
+ retainedScreenshotMetadata,
44
46
  sandboxCommandExitCode,
45
47
  stripExecBanner,
46
48
  tailPeek,
@@ -559,7 +561,7 @@ function asComputerArgs(args: unknown): Partial<ComputerAction> {
559
561
  };
560
562
  }
561
563
 
562
- function ComputerCallRenderer({ item }: ToolRendererProps) {
564
+ function ComputerCallRenderer({ item, loadRetainedScreenshot }: ToolRendererProps) {
563
565
  const raw = (item.raw ?? {}) as {
564
566
  action?: ComputerAction;
565
567
  actions?: ComputerAction[];
@@ -582,6 +584,7 @@ function ComputerCallRenderer({ item }: ToolRendererProps) {
582
584
  const rejected = raw.providerData?.approvalStatus === "rejected";
583
585
  const readOnly = typeof out === "string" && out.includes("read-only");
584
586
  const shotUrl = screenshotDataUrl(out);
587
+ const retained = retainedScreenshotMetadata(out);
585
588
  const omittedMedia = mediaPreviewFact(out);
586
589
  const empty = out === "" || out == null;
587
590
  const batched = actions.length > 1 ? actions.map((a) => computerVerb(a)).join(" · ") : null;
@@ -640,6 +643,44 @@ function ComputerCallRenderer({ item }: ToolRendererProps) {
640
643
  const isFailed = item.status === "failed";
641
644
  const isCancelled = item.status === "cancelled";
642
645
 
646
+ if (retained) {
647
+ if (!retained.available) {
648
+ const state =
649
+ retained.reason === "expired" || retained.reason === "deleted"
650
+ ? retained.reason
651
+ : "unavailable";
652
+ return (
653
+ <ActivityDisclosure
654
+ icon={<CameraOffIcon className={ICON_SIZE} />}
655
+ iconTone={isFailed ? "failed" : "muted"}
656
+ title={`${verb}${countSuffix} · ${state}`}
657
+ failed={isFailed}
658
+ cancelled={isCancelled}
659
+ preview={`screenshot ${state}`}
660
+ media={<MediaEmpty />}
661
+ >
662
+ <BodyNote tone={isFailed ? "error" : undefined}>
663
+ Screenshot {state}: {retained.reason.replaceAll("_", " ")}.
664
+ </BodyNote>
665
+ </ActivityDisclosure>
666
+ );
667
+ }
668
+ return (
669
+ <RetainedSessionImageDisclosure
670
+ artifact={retained}
671
+ load={loadRetainedScreenshot}
672
+ title={`${verb}${countSuffix}`}
673
+ caption={`${verb}${countSuffix}`}
674
+ noun="screenshot"
675
+ icon={<CameraIcon className={ICON_SIZE} />}
676
+ lightboxLabel="Screenshot"
677
+ batched={batched}
678
+ failed={isFailed}
679
+ cancelled={isCancelled}
680
+ />
681
+ );
682
+ }
683
+
643
684
  if (shotUrl) {
644
685
  const caption = `${verb}${actions.length > 1 ? ` (+${actions.length - 1} more)` : ""}`;
645
686
  return (
@@ -720,6 +761,318 @@ function ComputerCallRenderer({ item }: ToolRendererProps) {
720
761
  );
721
762
  }
722
763
 
764
+ type RetainedImageState =
765
+ | { kind: "loading" }
766
+ | { kind: "ready"; url: string }
767
+ | { kind: "unavailable"; label: string }
768
+ | { kind: "error"; message: string };
769
+
770
+ function useRetainedImageObjectUrl(
771
+ artifact: RetainedArtifactReference,
772
+ load: ToolRendererProps["loadRetainedArtifact"],
773
+ ): RetainedImageState {
774
+ const [state, setState] = useState<RetainedImageState>({ kind: "loading" });
775
+ // Function outputs are commonly serialized JSON. Parsing them creates a new
776
+ // object on every render, so depend on the immutable wire value rather than
777
+ // object identity; otherwise the loader can refetch after its own setState.
778
+ const artifactValue = retainedArtifactValue(artifact);
779
+ const stableArtifactRef = useRef({ value: artifactValue, artifact });
780
+ if (stableArtifactRef.current.value !== artifactValue) {
781
+ stableArtifactRef.current = { value: artifactValue, artifact };
782
+ }
783
+ const stableArtifact = stableArtifactRef.current.artifact;
784
+ useEffect(() => {
785
+ if (!load) {
786
+ setState({ kind: "unavailable", label: "retrieval is not configured" });
787
+ return;
788
+ }
789
+ const controller = new AbortController();
790
+ let objectUrl: string | null = null;
791
+ setState({ kind: "loading" });
792
+ void load(stableArtifact, controller.signal)
793
+ .then((source) => {
794
+ if (controller.signal.aborted) return;
795
+ if (!source) {
796
+ setState({ kind: "unavailable", label: "bytes are unavailable" });
797
+ return;
798
+ }
799
+ if (!(source instanceof Uint8Array)) {
800
+ if (!source.url.trim()) {
801
+ setState({ kind: "unavailable", label: "URL is unavailable" });
802
+ return;
803
+ }
804
+ setState({ kind: "ready", url: source.url });
805
+ return;
806
+ }
807
+ objectUrl = URL.createObjectURL(
808
+ new Blob([source as unknown as BlobPart], { type: stableArtifact.contentType }),
809
+ );
810
+ setState({ kind: "ready", url: objectUrl });
811
+ })
812
+ .catch((error: unknown) => {
813
+ if (controller.signal.aborted) return;
814
+ const status =
815
+ error && typeof error === "object" && "status" in error
816
+ ? Number((error as { status?: unknown }).status)
817
+ : null;
818
+ setState(
819
+ status === 404
820
+ ? { kind: "unavailable", label: "deleted" }
821
+ : status === 410
822
+ ? { kind: "unavailable", label: "expired or unavailable" }
823
+ : { kind: "error", message: "retrieval failed" },
824
+ );
825
+ });
826
+ return () => {
827
+ controller.abort();
828
+ if (objectUrl) URL.revokeObjectURL(objectUrl);
829
+ };
830
+ }, [stableArtifact, load]);
831
+ return state;
832
+ }
833
+
834
+ function retainedArtifactValue(artifact: RetainedArtifactReference): string {
835
+ return [
836
+ artifact.artifactId,
837
+ artifact.kind,
838
+ artifact.contentType,
839
+ artifact.originalBytes,
840
+ artifact.sha256,
841
+ artifact.retainedAt,
842
+ artifact.dimensions?.width ?? "",
843
+ artifact.dimensions?.height ?? "",
844
+ artifact.retention.policy,
845
+ artifact.retention.expiresAt ?? "",
846
+ artifact.retrieval.method,
847
+ artifact.retrieval.path,
848
+ artifact.retrieval.acceptRanges,
849
+ artifact.retrieval.maxRangeBytes,
850
+ ].join("\0");
851
+ }
852
+
853
+ function RetainedSessionImageDisclosure({
854
+ artifact,
855
+ load,
856
+ title,
857
+ caption,
858
+ noun,
859
+ icon,
860
+ lightboxLabel,
861
+ batched,
862
+ failed,
863
+ cancelled,
864
+ }: {
865
+ artifact: RetainedArtifactReference;
866
+ load: ToolRendererProps["loadRetainedScreenshot"];
867
+ title: string;
868
+ caption: string;
869
+ noun: "image" | "screenshot";
870
+ icon: ReactNode;
871
+ lightboxLabel: string;
872
+ batched: string | null;
873
+ failed: boolean;
874
+ cancelled: boolean;
875
+ }) {
876
+ const state = useRetainedImageObjectUrl(artifact, load);
877
+
878
+ return (
879
+ <ActivityDisclosure
880
+ icon={icon}
881
+ iconTone={failed ? "failed" : state.kind === "ready" ? "accent" : "muted"}
882
+ title={title}
883
+ failed={failed}
884
+ cancelled={cancelled}
885
+ preview={
886
+ state.kind === "loading"
887
+ ? `loading retained ${noun}…`
888
+ : state.kind === "error"
889
+ ? `${noun} retrieval failed`
890
+ : state.kind === "unavailable"
891
+ ? `${noun} ${state.label}`
892
+ : undefined
893
+ }
894
+ media={
895
+ state.kind === "ready" ? (
896
+ <Thumbnail
897
+ src={state.url}
898
+ caption={caption}
899
+ alt={caption}
900
+ expandLabel={`Expand ${noun}`}
901
+ lightboxLabel={lightboxLabel}
902
+ />
903
+ ) : state.kind === "loading" ? (
904
+ <MediaSkeleton />
905
+ ) : (
906
+ <MediaEmpty />
907
+ )
908
+ }
909
+ >
910
+ {state.kind === "ready" ? (
911
+ <ScreenshotFigure
912
+ src={state.url}
913
+ caption={caption}
914
+ alt={caption}
915
+ expandLabel={`Expand ${noun}`}
916
+ lightboxLabel={lightboxLabel}
917
+ />
918
+ ) : state.kind === "loading" ? (
919
+ <BodyNote>Loading the retained {noun}…</BodyNote>
920
+ ) : state.kind === "unavailable" ? (
921
+ <BodyNote>
922
+ {noun === "screenshot" ? "Screenshot" : "Image"} {state.label}.
923
+ </BodyNote>
924
+ ) : (
925
+ <BodyNote tone="error">
926
+ {noun === "screenshot" ? "Screenshot" : "Image"} retrieval failed: {state.message}
927
+ </BodyNote>
928
+ )}
929
+ {batched ? <BodyNote>batched: {batched}</BodyNote> : null}
930
+ </ActivityDisclosure>
931
+ );
932
+ }
933
+
934
+ function GeneratedImageRenderer({ item, loadRetainedArtifact }: ToolRendererProps) {
935
+ const args = parseToolArgs(item.arguments);
936
+ const prompt = typeof args.prompt === "string" ? args.prompt : "";
937
+ const raw =
938
+ item.raw && typeof item.raw === "object" && !Array.isArray(item.raw)
939
+ ? (item.raw as Record<string, unknown>)
940
+ : null;
941
+ // Function tools settle through agent.toolCall.output; OpenAI's hosted image
942
+ // call is already complete on agent.toolCall.created and carries the compact
943
+ // receipt in raw.output. Both paths deliberately converge on one renderer.
944
+ const receipt = generatedImageReceipt(item.output) ?? generatedImageReceipt(raw?.output);
945
+ if (item.status === "running") {
946
+ return (
947
+ <ActivityDisclosure
948
+ icon={<ImageIcon className={ICON_SIZE} />}
949
+ iconTone="running"
950
+ title="Generating image"
951
+ running
952
+ preview={<RunningPreview>{truncatePreview(prompt, 72) || "creating…"}</RunningPreview>}
953
+ media={<MediaSkeleton />}
954
+ >
955
+ {prompt ? <BodyNote>{prompt}</BodyNote> : null}
956
+ </ActivityDisclosure>
957
+ );
958
+ }
959
+ if (!receipt) return <GenericRenderer item={item} />;
960
+ return (
961
+ <GeneratedImageDisclosure
962
+ receipt={receipt}
963
+ load={loadRetainedArtifact}
964
+ prompt={prompt}
965
+ failed={item.status === "failed"}
966
+ cancelled={item.status === "cancelled"}
967
+ />
968
+ );
969
+ }
970
+
971
+ function GeneratedVideoRenderer({ item }: ToolRendererProps) {
972
+ const args = parseToolArgs(item.arguments);
973
+ const prompt = typeof args.prompt === "string" ? args.prompt : "";
974
+ const parsedOutput = typeof item.output === "string" ? tryParseJson(item.output) : item.output;
975
+ const accepted =
976
+ parsedOutput &&
977
+ typeof parsedOutput === "object" &&
978
+ !Array.isArray(parsedOutput) &&
979
+ (parsedOutput as Record<string, unknown>).status === "accepted";
980
+ const failed = item.status === "failed";
981
+ const cancelled = item.status === "cancelled";
982
+ const running = item.status === "running";
983
+ return (
984
+ <ActivityDisclosure
985
+ icon={<VideoIcon className={ICON_SIZE} />}
986
+ iconTone={failed ? "failed" : running ? "running" : accepted ? "accent" : "muted"}
987
+ title={
988
+ running ? "Starting video generation" : accepted ? "Generating video" : "Generate video"
989
+ }
990
+ running={running}
991
+ failed={failed}
992
+ cancelled={cancelled}
993
+ preview={truncatePreview(prompt, 88) || (accepted ? "request accepted" : undefined)}
994
+ >
995
+ {prompt ? <BodyNote>{prompt}</BodyNote> : null}
996
+ {accepted ? (
997
+ <BodyNote>The video will appear here when it is ready.</BodyNote>
998
+ ) : item.output !== undefined ? (
999
+ <PayloadBlock label="Output" value={item.output} />
1000
+ ) : null}
1001
+ </ActivityDisclosure>
1002
+ );
1003
+ }
1004
+ function GeneratedImageDisclosure({
1005
+ receipt,
1006
+ load,
1007
+ prompt,
1008
+ failed,
1009
+ cancelled,
1010
+ }: {
1011
+ receipt: NonNullable<ReturnType<typeof generatedImageReceipt>>;
1012
+ load: ToolRendererProps["loadRetainedArtifact"];
1013
+ prompt: string;
1014
+ failed: boolean;
1015
+ cancelled: boolean;
1016
+ }) {
1017
+ const state = useRetainedImageObjectUrl(receipt.artifact, load);
1018
+ const dimensions = receipt.artifact.dimensions!;
1019
+ const title = failed ? "Image generation failed" : "Generated image";
1020
+ const caption = prompt || `Generated image · ${dimensions.width}×${dimensions.height}`;
1021
+ return (
1022
+ <ActivityDisclosure
1023
+ icon={<ImageIcon className={ICON_SIZE} />}
1024
+ iconTone={failed ? "failed" : state.kind === "ready" ? "accent" : "muted"}
1025
+ title={title}
1026
+ defaultOpen={!failed && !cancelled}
1027
+ failed={failed}
1028
+ cancelled={cancelled}
1029
+ preview={
1030
+ state.kind === "loading"
1031
+ ? "loading image…"
1032
+ : state.kind === "error"
1033
+ ? "image retrieval failed"
1034
+ : state.kind === "unavailable"
1035
+ ? `image ${state.label}`
1036
+ : truncatePreview(prompt, 88) || `${dimensions.width}×${dimensions.height}`
1037
+ }
1038
+ media={
1039
+ state.kind === "ready" ? (
1040
+ <Thumbnail
1041
+ src={state.url}
1042
+ caption={caption}
1043
+ alt={caption}
1044
+ expandLabel="Expand generated image"
1045
+ lightboxLabel="Generated image"
1046
+ />
1047
+ ) : state.kind === "loading" ? (
1048
+ <MediaSkeleton />
1049
+ ) : (
1050
+ <MediaEmpty />
1051
+ )
1052
+ }
1053
+ >
1054
+ {state.kind === "ready" ? (
1055
+ <ScreenshotFigure
1056
+ src={state.url}
1057
+ caption={caption}
1058
+ alt={caption}
1059
+ expandLabel="Expand generated image"
1060
+ lightboxLabel="Generated image"
1061
+ />
1062
+ ) : state.kind === "loading" ? (
1063
+ <BodyNote>Loading the generated image…</BodyNote>
1064
+ ) : state.kind === "unavailable" ? (
1065
+ <BodyNote>Image {state.label}.</BodyNote>
1066
+ ) : (
1067
+ <BodyNote tone="error">Image retrieval failed.</BodyNote>
1068
+ )}
1069
+ <BodyNote>
1070
+ {dimensions.width}×{dimensions.height} · {receipt.sandboxPath}
1071
+ </BodyNote>
1072
+ </ActivityDisclosure>
1073
+ );
1074
+ }
1075
+
723
1076
  /* ---- web_search ------------------------------------------------------------ */
724
1077
 
725
1078
  type WebSearchResult = { title: string; domain: string; snippet: string };
@@ -871,11 +1224,12 @@ const VIEW_IMAGE_ERRORS = [
871
1224
  "unable to read image",
872
1225
  ];
873
1226
 
874
- function ViewImageRenderer({ item }: ToolRendererProps) {
1227
+ function ViewImageRenderer({ item, loadRetainedScreenshot }: ToolRendererProps) {
875
1228
  const args = parseToolArgs(item.arguments);
876
1229
  const path = typeof args.path === "string" ? args.path : "";
877
1230
  const out = item.output;
878
1231
  const text = typeof out === "string" ? out : "";
1232
+ const retained = retainedScreenshotMetadata(out);
879
1233
  const omittedMedia = mediaPreviewFact(out);
880
1234
 
881
1235
  if (item.status === "running") {
@@ -896,6 +1250,45 @@ function ViewImageRenderer({ item }: ToolRendererProps) {
896
1250
  const viewFailed = item.status === "failed";
897
1251
  const viewCancelled = item.status === "cancelled";
898
1252
 
1253
+ if (retained) {
1254
+ const title = `Viewed ${basename(path)}`;
1255
+ if (!retained.available) {
1256
+ const state =
1257
+ retained.reason === "expired" || retained.reason === "deleted"
1258
+ ? retained.reason
1259
+ : "unavailable";
1260
+ return (
1261
+ <ActivityDisclosure
1262
+ icon={<ImageIcon className={ICON_SIZE} />}
1263
+ iconTone={viewFailed ? "failed" : "muted"}
1264
+ title={`${title} · ${state}`}
1265
+ failed={viewFailed}
1266
+ cancelled={viewCancelled}
1267
+ preview={`image ${state}`}
1268
+ media={<MediaEmpty />}
1269
+ >
1270
+ <BodyNote tone={viewFailed ? "error" : undefined}>
1271
+ Image {state}: {retained.reason.replaceAll("_", " ")}.
1272
+ </BodyNote>
1273
+ </ActivityDisclosure>
1274
+ );
1275
+ }
1276
+ return (
1277
+ <RetainedSessionImageDisclosure
1278
+ artifact={retained}
1279
+ load={loadRetainedScreenshot}
1280
+ title={title}
1281
+ caption={path || title}
1282
+ noun="image"
1283
+ icon={<ImageIcon className={ICON_SIZE} />}
1284
+ lightboxLabel="Image"
1285
+ batched={null}
1286
+ failed={viewFailed}
1287
+ cancelled={viewCancelled}
1288
+ />
1289
+ );
1290
+ }
1291
+
899
1292
  const errMatch = VIEW_IMAGE_ERRORS.find((p) => text.includes(p));
900
1293
  if (errMatch) {
901
1294
  const tooBig = text.includes("exceeded the allowed size");
@@ -995,7 +1388,7 @@ function SecretSetRenderer({ item }: ToolRendererProps) {
995
1388
  running
996
1389
  preview={<RunningPreview>setting…</RunningPreview>}
997
1390
  >
998
- <PayloadBlock label="Arguments" value={redactSecrets(args)} />
1391
+ <PayloadBlock label="Arguments" value={args} />
999
1392
  </ActivityDisclosure>
1000
1393
  );
1001
1394
  }
@@ -1010,7 +1403,7 @@ function SecretSetRenderer({ item }: ToolRendererProps) {
1010
1403
  failed
1011
1404
  preview={errorText ?? "variable write failed"}
1012
1405
  >
1013
- <PayloadBlock label="Arguments" value={redactSecrets(args)} />
1406
+ <PayloadBlock label="Arguments" value={args} />
1014
1407
  {errorText ? (
1015
1408
  <PayloadBlock label="Error" value={errorText} failed />
1016
1409
  ) : (
@@ -1026,10 +1419,12 @@ function SecretSetRenderer({ item }: ToolRendererProps) {
1026
1419
  iconTone="muted"
1027
1420
  title={`Set ${name}`}
1028
1421
  cancelled={item.status === "cancelled"}
1029
- preview="value write-only · never returned"
1422
+ preview="exact value preserved"
1030
1423
  >
1031
- <PayloadBlock label="Arguments" value={redactSecrets(args)} />
1032
- <BodyNote>the value is a secret — redacted in every view; the API never returns it.</BodyNote>
1424
+ <PayloadBlock label="Arguments" value={args} />
1425
+ <BodyNote>
1426
+ The configured value is preserved exactly and available through authorized secret reads.
1427
+ </BodyNote>
1033
1428
  </ActivityDisclosure>
1034
1429
  );
1035
1430
  }
@@ -1175,7 +1570,7 @@ function ToolSearchRenderer({ item }: ToolRendererProps) {
1175
1570
  }
1176
1571
  >
1177
1572
  {query ? <BodyNote>capability query: {query}</BodyNote> : null}
1178
- <PayloadBlock label="Arguments" value={redactSecrets(parseToolArgs(item.arguments))} />
1573
+ <PayloadBlock label="Arguments" value={parseToolArgs(item.arguments)} />
1179
1574
  </ActivityDisclosure>
1180
1575
  );
1181
1576
  }
@@ -1191,7 +1586,7 @@ function ToolSearchRenderer({ item }: ToolRendererProps) {
1191
1586
  preview={truncatePreview(outText, 80) || queryPreview || "Lookup failed"}
1192
1587
  >
1193
1588
  {query ? <BodyNote>capability query: {query}</BodyNote> : null}
1194
- <PayloadBlock label="Arguments" value={redactSecrets(parseToolArgs(item.arguments))} />
1589
+ <PayloadBlock label="Arguments" value={parseToolArgs(item.arguments)} />
1195
1590
  <PayloadBlock label="Error" value={outText} failed />
1196
1591
  </ActivityDisclosure>
1197
1592
  );
@@ -1226,7 +1621,7 @@ function ToolSearchRenderer({ item }: ToolRendererProps) {
1226
1621
  ) : tools && tools.length === 0 ? (
1227
1622
  <BodyNote>no deferred tools matched this capability query.</BodyNote>
1228
1623
  ) : null}
1229
- <PayloadBlock label="Arguments" value={redactSecrets(parseToolArgs(item.arguments))} />
1624
+ <PayloadBlock label="Arguments" value={parseToolArgs(item.arguments)} />
1230
1625
  {tools == null && outText ? <PayloadBlock label="Result" value={outText} /> : null}
1231
1626
  </ActivityDisclosure>
1232
1627
  );
@@ -1249,7 +1644,7 @@ function DocsSearchRenderer({ item }: ToolRendererProps) {
1249
1644
  running
1250
1645
  preview={<RunningPreview>Searching…</RunningPreview>}
1251
1646
  >
1252
- <PayloadBlock label="Arguments" value={redactSecrets(args)} />
1647
+ <PayloadBlock label="Arguments" value={args} />
1253
1648
  </ActivityDisclosure>
1254
1649
  );
1255
1650
  }
@@ -1264,7 +1659,7 @@ function DocsSearchRenderer({ item }: ToolRendererProps) {
1264
1659
  failed
1265
1660
  preview={truncatePreview(outText, 80) || "Search failed"}
1266
1661
  >
1267
- <PayloadBlock label="Arguments" value={redactSecrets(args)} />
1662
+ <PayloadBlock label="Arguments" value={args} />
1268
1663
  <PayloadBlock label="Error" value={outText} failed />
1269
1664
  </ActivityDisclosure>
1270
1665
  );
@@ -1300,7 +1695,7 @@ function DocsSearchRenderer({ item }: ToolRendererProps) {
1300
1695
  ))}
1301
1696
  </ul>
1302
1697
  ) : null}
1303
- <PayloadBlock label="Arguments" value={redactSecrets(args)} />
1698
+ <PayloadBlock label="Arguments" value={args} />
1304
1699
  <PayloadBlock label="Result" value={outText} />
1305
1700
  </ActivityDisclosure>
1306
1701
  );
@@ -1330,7 +1725,7 @@ function SetSessionTitleRenderer({ item }: ToolRendererProps) {
1330
1725
  )
1331
1726
  }
1332
1727
  >
1333
- <PayloadBlock label="Arguments" value={redactSecrets(args)} />
1728
+ <PayloadBlock label="Arguments" value={args} />
1334
1729
  </ActivityDisclosure>
1335
1730
  );
1336
1731
  }
@@ -1345,7 +1740,7 @@ function SetSessionTitleRenderer({ item }: ToolRendererProps) {
1345
1740
  failed
1346
1741
  preview={truncatePreview(outText, 80) || "Rename failed"}
1347
1742
  >
1348
- <PayloadBlock label="Arguments" value={redactSecrets(args)} />
1743
+ <PayloadBlock label="Arguments" value={args} />
1349
1744
  <PayloadBlock label="Error" value={outText} failed />
1350
1745
  </ActivityDisclosure>
1351
1746
  );
@@ -1371,7 +1766,7 @@ function SetSessionTitleRenderer({ item }: ToolRendererProps) {
1371
1766
  cancelled={item.status === "cancelled"}
1372
1767
  preview={item.status === "cancelled" ? undefined : settledTitle || undefined}
1373
1768
  >
1374
- <PayloadBlock label="Arguments" value={redactSecrets(args)} />
1769
+ <PayloadBlock label="Arguments" value={args} />
1375
1770
  {outText ? <PayloadBlock label="Result" value={outText} /> : null}
1376
1771
  </ActivityDisclosure>
1377
1772
  );
@@ -1431,7 +1826,7 @@ function MemoryProposeRenderer({ item }: ToolRendererProps) {
1431
1826
  running
1432
1827
  preview={<RunningPreview>Proposing…</RunningPreview>}
1433
1828
  >
1434
- <PayloadBlock label="Arguments" value={redactSecrets(args)} />
1829
+ <PayloadBlock label="Arguments" value={args} />
1435
1830
  </ActivityDisclosure>
1436
1831
  );
1437
1832
  }
@@ -1493,7 +1888,7 @@ function askToolPreview(args: unknown): string | null {
1493
1888
  }
1494
1889
 
1495
1890
  function AskRenderer({ item }: ToolRendererProps) {
1496
- const args = redactSecrets(parseToolArgs(item.arguments));
1891
+ const args = parseToolArgs(item.arguments);
1497
1892
  const preview = askToolPreview(args);
1498
1893
  const icon = <MessageCircleQuestionIcon className={ICON_SIZE} />;
1499
1894
  const title = "Ask";
@@ -1583,7 +1978,7 @@ function runOnOpPreview(args: Record<string, unknown>): string | null {
1583
1978
 
1584
1979
  function RunOnRenderer({ item }: ToolRendererProps) {
1585
1980
  const parsedArgs = parseToolArgs(item.arguments);
1586
- const args = redactSecrets(parsedArgs);
1981
+ const args = parsedArgs;
1587
1982
  const targetName = runOnTargetName(item.output);
1588
1983
  const title = targetName ? `Run on ${targetName}` : "Run on";
1589
1984
  const opPreview = runOnOpPreview(parsedArgs);
@@ -1648,7 +2043,7 @@ function RunOnRenderer({ item }: ToolRendererProps) {
1648
2043
  */
1649
2044
  function GenericRenderer({ item }: ToolRendererProps) {
1650
2045
  const running = item.status === "running";
1651
- const args = redactSecrets(parseToolArgs(item.arguments));
2046
+ const args = parseToolArgs(item.arguments);
1652
2047
  const display = toolDisplayName(item.name);
1653
2048
  const icon = <GenericToolIcon name={item.name} />;
1654
2049
  // Goal tools: surface the objective text on the collapsed row so the in-cluster
@@ -1791,7 +2186,6 @@ const BASE_ENTRIES: ToolRegistryEntry[] = [
1791
2186
  // truth and is consulted first by the registry.
1792
2187
  { match: "rawType", type: "apply_patch_call", render: ApplyPatchRenderer },
1793
2188
  { match: "rawType", type: "computer_call", render: ComputerCallRenderer },
1794
- { match: "rawType", type: "hosted_tool_call", render: WebSearchRenderer },
1795
2189
  { match: "rawType", type: "tool_search_call", render: ToolSearchRenderer },
1796
2190
  // First-party sandbox + MCP tools resolve by name (exact or MCP leaf).
1797
2191
  { match: "name", name: "exec_command", render: ExecRenderer },
@@ -1811,6 +2205,9 @@ const BASE_ENTRIES: ToolRegistryEntry[] = [
1811
2205
  { match: "name", name: "computer_keypress", render: ComputerCallRenderer },
1812
2206
  { match: "name", name: "computer_drag", render: ComputerCallRenderer },
1813
2207
  { match: "name", name: "web_search_call", render: WebSearchRenderer },
2208
+ { match: "name", name: "image_generation_call", render: GeneratedImageRenderer },
2209
+ { match: "name", name: "generate_image", render: GeneratedImageRenderer },
2210
+ { match: "name", name: "generate_video", render: GeneratedVideoRenderer },
1814
2211
  { match: "name", name: "tool_search", render: ToolSearchRenderer },
1815
2212
  { match: "name", name: "view_image", render: ViewImageRenderer },
1816
2213
  { match: "name", name: "environment_set_variable", render: SecretSetRenderer },
@@ -437,8 +437,8 @@ export function TurnSummary({
437
437
  className={cn(
438
438
  "size-3.5 shrink-0 text-og-fg-subtle transition-transform ease-og-in-out group-data-[state=open]:rotate-90",
439
439
  settlePhase
440
- ? "duration-[var(--og-duration-disclose-settle)]"
441
- : "duration-[var(--og-duration-disclose)]",
440
+ ? "duration-[var(--_og-duration-disclose-settle)]"
441
+ : "duration-[var(--_og-duration-disclose)]",
442
442
  )}
443
443
  />
444
444
  {/* Completion is the quiet default and needs no repeated glyph. Failed,