@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.
- package/README.md +158 -14
- package/dist/artifacts-document.d.ts +3 -0
- package/dist/artifacts-document.js +17 -0
- package/dist/artifacts-document.js.map +1 -0
- package/dist/artifacts-presentation.d.ts +3 -0
- package/dist/artifacts-presentation.js +17 -0
- package/dist/artifacts-presentation.js.map +1 -0
- package/dist/artifacts-spreadsheet.d.ts +3 -0
- package/dist/artifacts-spreadsheet.js +17 -0
- package/dist/artifacts-spreadsheet.js.map +1 -0
- package/dist/artifacts.d.ts +2 -0
- package/dist/artifacts.js +170 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/chunk-6BBWWOOU.js +82 -0
- package/dist/chunk-6BBWWOOU.js.map +1 -0
- package/dist/{chunk-HFO4ERGQ.js → chunk-724BW4TW.js} +586 -35
- package/dist/chunk-724BW4TW.js.map +1 -0
- package/dist/chunk-7I2KB3OK.js +3895 -0
- package/dist/chunk-7I2KB3OK.js.map +1 -0
- package/dist/chunk-7WCLAEFV.js +2828 -0
- package/dist/chunk-7WCLAEFV.js.map +1 -0
- package/dist/{chunk-U3CSCMWA.js → chunk-FK6VG4LL.js} +9 -13
- package/dist/chunk-FK6VG4LL.js.map +1 -0
- package/dist/{chunk-SRFUT2ZU.js → chunk-FWS3KC3Z.js} +120 -64
- package/dist/chunk-FWS3KC3Z.js.map +1 -0
- package/dist/{chunk-EKZH6IDG.js → chunk-HDBG7XGO.js} +62 -1
- package/dist/chunk-HDBG7XGO.js.map +1 -0
- package/dist/chunk-HUIKIDM5.js +2148 -0
- package/dist/chunk-HUIKIDM5.js.map +1 -0
- package/dist/{chunk-LGVMUIRV.js → chunk-JAGDUCZQ.js} +1053 -390
- package/dist/chunk-JAGDUCZQ.js.map +1 -0
- package/dist/{chunk-LWR4MXSS.js → chunk-JR3QFY6B.js} +420 -35
- package/dist/chunk-JR3QFY6B.js.map +1 -0
- package/dist/chunk-JVYQRRC4.js +53 -0
- package/dist/chunk-JVYQRRC4.js.map +1 -0
- package/dist/chunk-KCGXPP5V.js +157 -0
- package/dist/chunk-KCGXPP5V.js.map +1 -0
- package/dist/{chunk-EB67J347.js → chunk-KZ73RL76.js} +111 -31
- package/dist/chunk-KZ73RL76.js.map +1 -0
- package/dist/chunk-PEI6RANI.js +3234 -0
- package/dist/chunk-PEI6RANI.js.map +1 -0
- package/dist/{chunk-3PB7MIT6.js → chunk-ROIRTM37.js} +220 -72
- package/dist/chunk-ROIRTM37.js.map +1 -0
- package/dist/chunk-VZTQ73XT.js +86 -0
- package/dist/chunk-VZTQ73XT.js.map +1 -0
- package/dist/{chunk-VCBFUSUZ.js → chunk-WSK7G5LE.js} +72 -4
- package/dist/chunk-WSK7G5LE.js.map +1 -0
- package/dist/{chunk-FGZUCXZF.js → chunk-WYA65Y3F.js} +16 -16
- package/dist/chunk-WYA65Y3F.js.map +1 -0
- package/dist/{chunk-6EDV6YFE.js → chunk-X4S56Y2H.js} +147 -35
- package/dist/chunk-X4S56Y2H.js.map +1 -0
- package/dist/client.d.ts +7 -1
- package/dist/clipboard.d.ts +1 -0
- package/dist/clipboard.js +7 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/commands/index.d.ts +3 -3
- package/dist/commands/registry.d.ts +1 -1
- package/dist/commands/types.d.ts +1 -1
- package/dist/components/approval-surface.d.ts +2 -2
- package/dist/components/artifacts/artifact-surface.d.ts +18 -0
- package/dist/components/artifacts/document-editor.d.ts +172 -0
- package/dist/components/artifacts/editable-artifact-ui.d.ts +13 -0
- package/dist/components/artifacts/editable-artifact-workbench.d.ts +49 -0
- package/dist/components/artifacts/editable-document.d.ts +24 -0
- package/dist/components/artifacts/editable-presentation.d.ts +24 -0
- package/dist/components/artifacts/editable-spreadsheet.d.ts +32 -0
- package/dist/components/artifacts/index.d.ts +8 -0
- package/dist/components/artifacts/presentation-editor.d.ts +297 -0
- package/dist/components/artifacts/spreadsheet-canvas.d.ts +120 -0
- package/dist/components/artifacts/spreadsheet-grid.d.ts +113 -0
- package/dist/components/browser-viewer.d.ts +29 -0
- package/dist/components/chat-composer.d.ts +13 -8
- package/dist/components/code-editor.d.ts +25 -3
- package/dist/components/command-palette.d.ts +2 -2
- package/dist/components/composer-transcription-control.d.ts +4 -2
- package/dist/components/composer.d.ts +29 -15
- package/dist/components/computer-viewer.d.ts +23 -0
- package/dist/components/copy-button.d.ts +2 -2
- package/dist/components/desktop-viewer.d.ts +25 -21
- package/dist/components/diff-view.d.ts +1 -1
- package/dist/components/enrollment-consent.d.ts +1 -1
- package/dist/components/enrollment-device-flow.d.ts +1 -1
- package/dist/components/file-browser.d.ts +2 -2
- package/dist/components/fleet-tile.d.ts +1 -1
- package/dist/components/generated-video-player.d.ts +10 -0
- package/dist/components/human-input-form.d.ts +1 -1
- package/dist/components/human-input-surface.d.ts +2 -2
- package/dist/components/interactive-workbench-viewers.d.ts +2 -0
- package/dist/components/machine-card.d.ts +2 -2
- package/dist/components/machine-dock-bar.d.ts +3 -3
- package/dist/components/machine-health-pill.d.ts +2 -2
- package/dist/components/machine-input-display.d.ts +1 -1
- package/dist/components/machine-metrics.d.ts +2 -2
- package/dist/components/machine-status-pill.d.ts +4 -4
- package/dist/components/machines/health.d.ts +1 -1
- package/dist/components/machines/machine-detail.d.ts +5 -3
- package/dist/components/machines/metric-history-chart.d.ts +1 -1
- package/dist/components/machines/metric-sparkline.d.ts +2 -2
- package/dist/components/machines/series.d.ts +2 -2
- package/dist/components/machines-dashboard.d.ts +5 -5
- package/dist/components/markdown.d.ts +1 -1
- package/dist/components/message-timeline.d.ts +22 -5
- package/dist/components/model-picker.d.ts +2 -2
- package/dist/components/model-policy-picker.d.ts +7 -7
- package/dist/components/pierre-diff.d.ts +1 -1
- package/dist/components/pierre-file.d.ts +1 -1
- package/dist/components/queue-draft-policy.d.ts +1 -1
- package/dist/components/queue-surface-implementation.d.ts +3 -3
- package/dist/components/queue-surface-state.d.ts +4 -4
- package/dist/components/queue-surface.d.ts +5 -5
- package/dist/components/sandbox-files.d.ts +5 -5
- package/dist/components/sandbox-terminal.d.ts +50 -4
- package/dist/components/sandbox-workspace.d.ts +30 -10
- package/dist/components/session-chrome.d.ts +4 -4
- package/dist/components/session-status.d.ts +2 -2
- package/dist/components/timeline-annotation-selection.d.ts +9 -0
- package/dist/components/timeline-annotations-dialog.d.ts +16 -0
- package/dist/components/timeline-annotations.d.ts +13 -0
- package/dist/components/tooltip.d.ts +4 -4
- package/dist/components/user-message-body.d.ts +2 -2
- package/dist/components/workbench-changes.d.ts +2 -2
- package/dist/components/workspace-dock.d.ts +3 -1
- package/dist/composer.d.ts +11 -11
- package/dist/composer.js +7 -7
- package/dist/hooks/internal.d.ts +7 -1
- package/dist/hooks/use-attached-browsers.d.ts +21 -0
- package/dist/hooks/use-available-models.d.ts +2 -2
- package/dist/hooks/use-billing-usage.d.ts +1 -1
- package/dist/hooks/use-browser-frame-stream.d.ts +28 -0
- package/dist/hooks/use-browser-identities.d.ts +26 -0
- package/dist/hooks/use-browser-session.d.ts +28 -0
- package/dist/hooks/use-browser-sessions.d.ts +32 -0
- package/dist/hooks/use-codex-accounts.d.ts +3 -3
- package/dist/hooks/use-composer.d.ts +36 -9
- package/dist/hooks/use-computer-frame-stream.d.ts +24 -0
- package/dist/hooks/use-computer-session.d.ts +28 -0
- package/dist/hooks/use-computer-sessions.d.ts +28 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-environments.d.ts +11 -5
- package/dist/hooks/use-file-attachments.d.ts +1 -1
- package/dist/hooks/use-goal.d.ts +2 -2
- package/dist/hooks/use-human-input.d.ts +2 -2
- package/dist/hooks/use-last-started-turn-policy.d.ts +2 -2
- package/dist/hooks/use-machine-chip.d.ts +2 -2
- package/dist/hooks/use-machines.d.ts +10 -3
- package/dist/hooks/use-packs.d.ts +7 -2
- package/dist/hooks/use-rigs.d.ts +1 -1
- package/dist/hooks/use-sandbox-files.d.ts +25 -4
- package/dist/hooks/use-sandbox-git.d.ts +13 -5
- package/dist/hooks/use-sandbox-terminal.d.ts +1 -1
- package/dist/hooks/use-scheduled-tasks.d.ts +1 -1
- package/dist/hooks/use-session-capabilities.d.ts +5 -4
- package/dist/hooks/use-session-control.d.ts +1 -1
- package/dist/hooks/use-session-events.d.ts +2 -2
- package/dist/hooks/use-session-lineage.d.ts +1 -1
- package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
- package/dist/hooks/use-session.d.ts +2 -2
- package/dist/hooks/use-slash-commands.d.ts +1 -1
- package/dist/hooks/use-terminal-stream.d.ts +8 -2
- package/dist/hooks/use-transcription.d.ts +2 -2
- package/dist/hooks/use-turn-queue.d.ts +2 -2
- package/dist/hooks/use-video-artifact-playback.d.ts +9 -0
- package/dist/hooks/use-voice-input.d.ts +6 -4
- package/dist/hooks/use-workspace-capture.d.ts +1 -1
- package/dist/hooks/use-workspace-edit.d.ts +1 -1
- package/dist/hooks/use-workspace-sessions.d.ts +1 -1
- package/dist/hooks/use-workspaces.d.ts +1 -1
- package/dist/index.d.ts +158 -154
- package/dist/index.js +1718 -908
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +23 -0
- package/dist/interaction.js +36 -0
- package/dist/interaction.js.map +1 -0
- package/dist/interactive-workbench-viewers-KHNOHWQE.js +13 -0
- package/dist/interactive-workbench-viewers-KHNOHWQE.js.map +1 -0
- package/dist/lib/composer-responsive-context.d.ts +9 -0
- package/dist/lib/relay-wire.d.ts +4 -0
- package/dist/lib/sandbox-liveness.d.ts +9 -0
- package/dist/lib/terminal-capability.d.ts +5 -0
- package/dist/lib/use-portal-token-style.d.ts +14 -3
- package/dist/lib/xterm-theme.d.ts +1 -1
- package/dist/machines.d.ts +30 -30
- package/dist/machines.js +3 -3
- package/dist/provider.d.ts +4 -4
- package/dist/{queue-surface-implementation-J4XJFKRW.js → queue-surface-implementation-2KVJTYXH.js} +117 -64
- package/dist/queue-surface-implementation-2KVJTYXH.js.map +1 -0
- package/dist/realtime/dropdown-menu.d.ts +8 -8
- package/dist/realtime/realtime-control.d.ts +15 -6
- package/dist/realtime.d.ts +4 -4
- package/dist/realtime.js +30 -33
- package/dist/realtime.js.map +1 -1
- package/dist/session-context.d.ts +19 -1
- package/dist/session-ui.d.ts +14 -14
- package/dist/session-ui.js +6 -5
- package/dist/session.d.ts +28 -28
- package/dist/session.js +5 -5
- package/dist/timeline/activity-rail.d.ts +6 -3
- package/dist/timeline/disclosure-context.d.ts +1 -1
- package/dist/timeline/fleet-decision-projection.d.ts +1 -1
- package/dist/timeline/fleet-decision-row.d.ts +3 -3
- package/dist/timeline/index.d.ts +19 -19
- package/dist/timeline/parsers.d.ts +6 -3
- package/dist/timeline/projection.d.ts +3 -3
- package/dist/timeline/registry.d.ts +10 -1
- package/dist/timeline/screenshot-lightbox.d.ts +2 -2
- package/dist/timeline/shared.d.ts +21 -10
- package/dist/timeline/tool-diff.d.ts +2 -2
- package/dist/timeline/tool-renderers.d.ts +1 -1
- package/dist/timeline/turn-summary.d.ts +3 -3
- package/dist/timeline/types.d.ts +42 -2
- package/dist/timeline-annotation-selection-3L7LHGG2.js +187 -0
- package/dist/timeline-annotation-selection-3L7LHGG2.js.map +1 -0
- package/dist/timeline-annotations-dialog-U7EVLR75.js +196 -0
- package/dist/timeline-annotations-dialog-U7EVLR75.js.map +1 -0
- package/dist/voice-recording-store.d.ts +8 -2
- package/package.json +52 -7
- package/src/artifacts-document.ts +31 -0
- package/src/artifacts-presentation.ts +36 -0
- package/src/artifacts-spreadsheet.ts +21 -0
- package/src/artifacts.ts +86 -0
- package/src/client.ts +90 -1
- package/src/clipboard.ts +2 -0
- package/src/components/artifacts/artifact-surface.tsx +93 -0
- package/src/components/artifacts/document-editor.tsx +2255 -0
- package/src/components/artifacts/editable-artifact-ui.tsx +89 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +203 -0
- package/src/components/artifacts/editable-document.tsx +657 -0
- package/src/components/artifacts/editable-presentation.tsx +1020 -0
- package/src/components/artifacts/editable-spreadsheet.tsx +733 -0
- package/src/components/artifacts/index.ts +99 -0
- package/src/components/artifacts/presentation-editor.tsx +3148 -0
- package/src/components/artifacts/spreadsheet-canvas.ts +799 -0
- package/src/components/artifacts/spreadsheet-grid.tsx +2129 -0
- package/src/components/browser-viewer.tsx +1592 -0
- package/src/components/chat-composer.tsx +25 -2
- package/src/components/code-editor.tsx +90 -31
- package/src/components/command-palette.tsx +1 -1
- package/src/components/composer-transcription-control.tsx +51 -22
- package/src/components/composer.tsx +49 -23
- package/src/components/computer-viewer.tsx +1139 -0
- package/src/components/copy-button.tsx +1 -1
- package/src/components/desktop-viewer.tsx +103 -75
- package/src/components/file-browser.tsx +39 -17
- package/src/components/generated-video-player.tsx +89 -0
- package/src/components/human-input-form.tsx +2 -2
- package/src/components/interactive-workbench-viewers.ts +2 -0
- package/src/components/machine-card.tsx +1 -1
- package/src/components/machine-input-display.ts +3 -0
- package/src/components/machines/machine-detail.tsx +39 -15
- package/src/components/machines-dashboard.tsx +7 -6
- package/src/components/message-timeline.tsx +327 -37
- package/src/components/model-picker.tsx +2 -2
- package/src/components/model-policy-picker.tsx +16 -15
- package/src/components/queue-surface-implementation.tsx +135 -75
- package/src/components/queue-surface-state.tsx +2 -2
- package/src/components/sandbox-files.tsx +142 -62
- package/src/components/sandbox-terminal.tsx +119 -35
- package/src/components/sandbox-workspace.tsx +394 -228
- package/src/components/session-chrome.tsx +67 -27
- package/src/components/timeline-annotation-selection.tsx +221 -0
- package/src/components/timeline-annotations-dialog.tsx +213 -0
- package/src/components/timeline-annotations.tsx +84 -0
- package/src/components/tooltip.tsx +13 -16
- package/src/components/user-message-body.tsx +1 -1
- package/src/components/workbench-changes.tsx +192 -35
- package/src/components/workspace-dock.tsx +13 -5
- package/src/composer.ts +3 -0
- package/src/hooks/internal.ts +132 -38
- package/src/hooks/use-attached-browsers.ts +152 -0
- package/src/hooks/use-browser-frame-stream.ts +316 -0
- package/src/hooks/use-browser-identities.ts +225 -0
- package/src/hooks/use-browser-session.ts +476 -0
- package/src/hooks/use-browser-sessions.ts +281 -0
- package/src/hooks/use-codex-accounts.ts +4 -4
- package/src/hooks/use-composer.ts +769 -24
- package/src/hooks/use-computer-frame-stream.ts +311 -0
- package/src/hooks/use-computer-session.ts +442 -0
- package/src/hooks/use-computer-sessions.ts +245 -0
- package/src/hooks/use-environments.ts +24 -5
- package/src/hooks/use-file-attachments.ts +70 -32
- package/src/hooks/use-goal.ts +17 -5
- package/src/hooks/use-machine-chip.ts +5 -3
- package/src/hooks/use-machines.ts +79 -3
- package/src/hooks/use-packs.ts +51 -0
- package/src/hooks/use-sandbox-files.ts +382 -88
- package/src/hooks/use-sandbox-git.ts +208 -46
- package/src/hooks/use-sandbox-terminal.ts +3 -2
- package/src/hooks/use-session-capabilities.ts +94 -70
- package/src/hooks/use-session-events.ts +18 -4
- package/src/hooks/use-terminal-stream.ts +102 -23
- package/src/hooks/use-transcription.ts +4 -14
- package/src/hooks/use-turn-queue.ts +17 -5
- package/src/hooks/use-video-artifact-playback.ts +28 -0
- package/src/hooks/use-voice-input.ts +163 -19
- package/src/hooks/use-windowed-sections.ts +9 -7
- package/src/hooks/use-workspace-edit.ts +2 -1
- package/src/index.ts +21 -6
- package/src/interaction.ts +71 -0
- package/src/lib/composer-responsive-context.ts +15 -0
- package/src/lib/relay-wire.ts +4 -0
- package/src/lib/sandbox-liveness.ts +11 -0
- package/src/lib/terminal-capability.ts +10 -0
- package/src/lib/use-portal-token-style.ts +60 -15
- package/src/provider.tsx +52 -7
- package/src/realtime/dropdown-menu.tsx +15 -19
- package/src/realtime/realtime-control.tsx +16 -5
- package/src/session-context.ts +90 -0
- package/src/timeline/activity-rail.tsx +31 -6
- package/src/timeline/index.ts +4 -1
- package/src/timeline/parsers.ts +46 -20
- package/src/timeline/projection.ts +233 -13
- package/src/timeline/registry.ts +19 -0
- package/src/timeline/screenshot-lightbox.tsx +30 -9
- package/src/timeline/shared.tsx +59 -11
- package/src/timeline/tool-renderers.tsx +421 -24
- package/src/timeline/turn-summary.tsx +2 -2
- package/src/timeline/types.ts +58 -2
- package/src/voice-recording-store.ts +15 -0
- package/styles/compiled.css +5298 -0
- package/styles/compiled.d.ts +2 -0
- package/styles/effective-tokens.css +27 -0
- package/styles/index.css +18 -0
- package/styles/responsive.css +208 -0
- package/styles/responsive.d.ts +2 -0
- package/styles/tokens.css +50 -17
- package/dist/chunk-3PB7MIT6.js.map +0 -1
- package/dist/chunk-6EDV6YFE.js.map +0 -1
- package/dist/chunk-EB67J347.js.map +0 -1
- package/dist/chunk-EKZH6IDG.js.map +0 -1
- package/dist/chunk-FGZUCXZF.js.map +0 -1
- package/dist/chunk-HFO4ERGQ.js.map +0 -1
- package/dist/chunk-JB5725BI.js +0 -48
- package/dist/chunk-JB5725BI.js.map +0 -1
- package/dist/chunk-LGVMUIRV.js.map +0 -1
- package/dist/chunk-LWR4MXSS.js.map +0 -1
- package/dist/chunk-SRFUT2ZU.js.map +0 -1
- package/dist/chunk-U3CSCMWA.js.map +0 -1
- package/dist/chunk-VCBFUSUZ.js.map +0 -1
- package/dist/fleet-decision-projection-SLNZMS42.js +0 -241
- package/dist/fleet-decision-projection-SLNZMS42.js.map +0 -1
- 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
|
|
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
|
-
|
|
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={
|
|
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={
|
|
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
|
|
1422
|
+
preview="exact value preserved"
|
|
1030
1423
|
>
|
|
1031
|
-
<PayloadBlock label="Arguments" value={
|
|
1032
|
-
<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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(--
|
|
441
|
-
: "duration-[var(--
|
|
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,
|