@opengeni/react 1.0.1 → 2.3.0-canary.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.
- package/README.md +33 -10
- package/dist/artifacts-spreadsheet.js +1 -1
- package/dist/artifacts.js +1 -1
- package/dist/browser-viewer-GXUICIAG.js +14 -0
- package/dist/{chunk-R3AZOAB5.js → chunk-4MDLEHXL.js} +9 -115
- package/dist/chunk-4MDLEHXL.js.map +1 -0
- package/dist/chunk-5YK2ZDIG.js +116 -0
- package/dist/chunk-5YK2ZDIG.js.map +1 -0
- package/dist/chunk-H5YGYNXS.js +329 -0
- package/dist/chunk-H5YGYNXS.js.map +1 -0
- package/dist/{chunk-7WCLAEFV.js → chunk-ICA6R6TW.js} +2 -2
- package/dist/{chunk-7WCLAEFV.js.map → chunk-ICA6R6TW.js.map} +1 -1
- package/dist/{chunk-IGC6A2ZI.js → chunk-JOAVA2TW.js} +589 -217
- package/dist/chunk-JOAVA2TW.js.map +1 -0
- package/dist/{chunk-Y7OEDUJ5.js → chunk-LS4POUTY.js} +1057 -426
- package/dist/chunk-LS4POUTY.js.map +1 -0
- package/dist/{chunk-5UQPNLIO.js → chunk-LTCHJ4MS.js} +9 -9
- package/dist/chunk-LTCHJ4MS.js.map +1 -0
- package/dist/{chunk-C5ZPSSS5.js → chunk-NEXLLTP4.js} +2 -1
- package/dist/{chunk-C5ZPSSS5.js.map → chunk-NEXLLTP4.js.map} +1 -1
- package/dist/chunk-QGBJ6GHG.js +2300 -0
- package/dist/chunk-QGBJ6GHG.js.map +1 -0
- package/dist/{chunk-6KLX2RH5.js → chunk-RSXJN73N.js} +365 -21
- package/dist/chunk-RSXJN73N.js.map +1 -0
- package/dist/{chunk-B6WPZSTT.js → chunk-SE4W4WQ3.js} +78 -16
- package/dist/chunk-SE4W4WQ3.js.map +1 -0
- package/dist/{chunk-MKPIAGVL.js → chunk-W6NFJXSA.js} +8 -19
- package/dist/chunk-W6NFJXSA.js.map +1 -0
- package/dist/{chunk-XBZWOM2K.js → chunk-X4A66EWZ.js} +8 -3
- package/dist/chunk-X4A66EWZ.js.map +1 -0
- package/dist/chunk-X4JAFD5R.js +3907 -0
- package/dist/chunk-X4JAFD5R.js.map +1 -0
- package/dist/{chunk-HA46CYQK.js → chunk-XXWH2JLC.js} +792 -206
- package/dist/chunk-XXWH2JLC.js.map +1 -0
- package/dist/client.d.ts +2 -2
- package/dist/components/browser-viewer.d.ts +7 -1
- package/dist/components/computer-viewer.d.ts +4 -1
- package/dist/components/enrollment-consent.d.ts +6 -3
- package/dist/components/file-browser.d.ts +7 -1
- package/dist/components/human-input-form.d.ts +1 -1
- package/dist/components/human-input-surface.d.ts +1 -1
- package/dist/components/machine-card.d.ts +4 -1
- package/dist/components/machines/machine-detail.d.ts +4 -1
- package/dist/components/machines/machine-operation-policy.d.ts +11 -0
- package/dist/components/machines-dashboard.d.ts +3 -1
- package/dist/components/markdown.d.ts +20 -1
- package/dist/components/message-timeline.d.ts +1 -1
- package/dist/components/model-policy-picker.d.ts +2 -0
- package/dist/components/pierre-file.d.ts +1 -1
- package/dist/components/sandbox-files.d.ts +8 -2
- package/dist/components/sandbox-workspace.d.ts +33 -3
- package/dist/components/session-chrome.d.ts +15 -3
- package/dist/components/workspace-dock.d.ts +6 -2
- package/dist/composer.js +5 -5
- package/dist/computer-viewer-ZOP4Q7A7.js +16 -0
- package/dist/computer-viewer-ZOP4Q7A7.js.map +1 -0
- package/dist/hooks/channel-cache.d.ts +23 -0
- package/dist/hooks/shared-machines-list.d.ts +14 -0
- package/dist/hooks/use-attached-browsers.d.ts +2 -1
- package/dist/hooks/use-channels.d.ts +1 -0
- package/dist/hooks/use-composer.d.ts +37 -9
- package/dist/hooks/use-machine-chip.d.ts +3 -3
- package/dist/hooks/use-machines.d.ts +19 -1
- package/dist/hooks/use-sandbox-files.d.ts +1 -0
- package/dist/hooks/use-session-background-commands.d.ts +14 -0
- package/dist/hooks/use-turn-queue.d.ts +12 -0
- package/dist/hooks/use-workspace-sessions.d.ts +1 -0
- package/dist/index.d.ts +7 -5
- package/dist/index.js +1096 -623
- package/dist/index.js.map +1 -1
- package/dist/interaction.js +29 -181
- package/dist/interaction.js.map +1 -1
- package/dist/lib/interaction-errors.d.ts +3 -0
- package/dist/machines.d.ts +4 -2
- package/dist/machines.js +10 -2
- package/dist/model-policy.d.ts +1 -1
- package/dist/model-policy.js +1 -1
- package/dist/platform-activity-row-BJHUHXAT.js +169 -0
- package/dist/platform-activity-row-BJHUHXAT.js.map +1 -0
- package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-BSKUWHRI.js} +76 -16
- package/dist/queue-surface-implementation-BSKUWHRI.js.map +1 -0
- package/dist/realtime/realtime-control.d.ts +6 -3
- package/dist/realtime.js +36 -14
- package/dist/realtime.js.map +1 -1
- package/dist/session-ui.d.ts +1 -1
- package/dist/session-ui.js +6 -2
- package/dist/session.d.ts +2 -2
- package/dist/session.js +4 -4
- package/dist/timeline/index.d.ts +1 -1
- package/dist/timeline/platform-activity-row.d.ts +15 -0
- package/dist/timeline/screenshot-lightbox.d.ts +1 -1
- package/dist/timeline/shared.d.ts +4 -2
- package/dist/timeline/types.d.ts +50 -5
- package/dist/types/machines.d.ts +2 -2
- package/package.json +3 -3
- package/src/client.ts +12 -1
- package/src/components/artifacts/editable-spreadsheet.tsx +1 -1
- package/src/components/browser-viewer.tsx +361 -58
- package/src/components/chat-composer.tsx +1 -1
- package/src/components/composer.tsx +6 -6
- package/src/components/computer-viewer.tsx +368 -115
- package/src/components/enrollment-consent.tsx +64 -6
- package/src/components/file-browser.tsx +117 -2
- package/src/components/human-input-form.tsx +103 -59
- package/src/components/human-input-surface.tsx +1 -1
- package/src/components/machine-card.tsx +111 -0
- package/src/components/machine-input-display.ts +15 -0
- package/src/components/machines/machine-detail.tsx +47 -0
- package/src/components/machines/machine-operation-policy.tsx +179 -0
- package/src/components/machines-dashboard.tsx +6 -0
- package/src/components/markdown.tsx +174 -20
- package/src/components/message-timeline.tsx +215 -18
- package/src/components/model-policy-picker.tsx +9 -17
- package/src/components/pierre-file.tsx +1 -1
- package/src/components/queue-surface-implementation.tsx +82 -16
- package/src/components/sandbox-files.tsx +135 -19
- package/src/components/sandbox-workspace.tsx +204 -92
- package/src/components/session-chrome.tsx +415 -208
- package/src/components/session-status.tsx +1 -1
- package/src/components/user-message-body.tsx +168 -48
- package/src/components/workspace-dock.tsx +141 -175
- package/src/hooks/channel-cache.ts +104 -0
- package/src/hooks/shared-machines-list.ts +239 -0
- package/src/hooks/use-attached-browsers.ts +5 -1
- package/src/hooks/use-browser-frame-stream.ts +6 -1
- package/src/hooks/use-browser-session.ts +6 -4
- package/src/hooks/use-browser-sessions.ts +7 -1
- package/src/hooks/use-channels.ts +32 -10
- package/src/hooks/use-composer.ts +760 -291
- package/src/hooks/use-computer-frame-stream.ts +14 -9
- package/src/hooks/use-computer-session.ts +16 -14
- package/src/hooks/use-computer-sessions.ts +8 -1
- package/src/hooks/use-last-started-turn-policy.ts +1 -1
- package/src/hooks/use-machine-chip.ts +23 -6
- package/src/hooks/use-machines.ts +104 -6
- package/src/hooks/use-sandbox-files.ts +195 -140
- package/src/hooks/use-sandbox-git.ts +58 -29
- package/src/hooks/use-session-background-commands.ts +56 -0
- package/src/hooks/use-session-capabilities.ts +18 -0
- package/src/hooks/use-turn-queue.ts +111 -12
- package/src/hooks/use-workspace-sessions.ts +5 -1
- package/src/index.ts +26 -4
- package/src/lib/interaction-errors.ts +18 -0
- package/src/machines.ts +9 -1
- package/src/model-policy.ts +10 -2
- package/src/realtime/realtime-control.tsx +53 -17
- package/src/session-context.ts +1 -0
- package/src/session-ui.ts +6 -1
- package/src/session.ts +9 -1
- package/src/timeline/activity-rail.tsx +20 -75
- package/src/timeline/index.ts +4 -0
- package/src/timeline/platform-activity-row.tsx +201 -0
- package/src/timeline/projection.ts +529 -25
- package/src/timeline/screenshot-lightbox.tsx +48 -14
- package/src/timeline/shared.tsx +8 -2
- package/src/timeline/tool-renderers.tsx +104 -6
- package/src/timeline/turn-summary.tsx +6 -1
- package/src/timeline/types.ts +77 -2
- package/src/types/machines.ts +10 -0
- package/styles/compiled.css +115 -104
- package/dist/chunk-5UQPNLIO.js.map +0 -1
- package/dist/chunk-6KLX2RH5.js.map +0 -1
- package/dist/chunk-B6WPZSTT.js.map +0 -1
- package/dist/chunk-HA46CYQK.js.map +0 -1
- package/dist/chunk-IGC6A2ZI.js.map +0 -1
- package/dist/chunk-LLOLUHVG.js +0 -5937
- package/dist/chunk-LLOLUHVG.js.map +0 -1
- package/dist/chunk-MKPIAGVL.js.map +0 -1
- package/dist/chunk-R3AZOAB5.js.map +0 -1
- package/dist/chunk-XBZWOM2K.js.map +0 -1
- package/dist/chunk-Y7OEDUJ5.js.map +0 -1
- package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
- package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
- /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-GXUICIAG.js.map} +0 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// src/timeline/platform-activity-row.tsx
|
|
2
|
+
function PlatformActivityRow({
|
|
3
|
+
item,
|
|
4
|
+
d: ActivityDisclosure,
|
|
5
|
+
p: PayloadBlock,
|
|
6
|
+
t: displayName,
|
|
7
|
+
b: BotIcon,
|
|
8
|
+
m: Markdown,
|
|
9
|
+
r: truncate,
|
|
10
|
+
j,
|
|
11
|
+
s
|
|
12
|
+
}) {
|
|
13
|
+
if (item.kind === "reasoning") {
|
|
14
|
+
return j(ActivityDisclosure, {
|
|
15
|
+
icon: brainIcon(j, s),
|
|
16
|
+
iconTone: "muted",
|
|
17
|
+
title: item.streaming ? "Thinking" : j("span", {
|
|
18
|
+
className: "font-normal italic text-og-fg-subtle",
|
|
19
|
+
children: "Thought"
|
|
20
|
+
}),
|
|
21
|
+
running: item.streaming,
|
|
22
|
+
preview: truncate(item.text, 110),
|
|
23
|
+
children: j("div", {
|
|
24
|
+
className: "text-og-base leading-6 text-og-fg-muted [&_strong]:text-og-fg-muted",
|
|
25
|
+
children: j(Markdown, { streaming: item.streaming, children: item.text })
|
|
26
|
+
})
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (item.kind === "sandbox") {
|
|
30
|
+
return s(ActivityDisclosure, {
|
|
31
|
+
icon: terminalIcon(j, s),
|
|
32
|
+
iconTone: item.status === "failed" ? "failed" : item.status === "running" ? "running" : "muted",
|
|
33
|
+
title: sandboxRowTitle(item, displayName),
|
|
34
|
+
running: item.status === "running",
|
|
35
|
+
failed: item.status === "failed",
|
|
36
|
+
cancelled: item.status === "cancelled",
|
|
37
|
+
preview: item.command ?? void 0,
|
|
38
|
+
children: [
|
|
39
|
+
item.command ? j(PayloadBlock, { label: "Command", value: item.command }, "command") : null,
|
|
40
|
+
item.output ? j(PayloadBlock, { label: "Output", value: item.output }, "output") : null
|
|
41
|
+
]
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
const failed = item.status === "failed";
|
|
45
|
+
const running = item.status === "running";
|
|
46
|
+
const duration = startupDuration(item.durationMs);
|
|
47
|
+
return j(ActivityDisclosure, {
|
|
48
|
+
icon: j(BotIcon, { className: "size-3.5" }),
|
|
49
|
+
iconTone: failed ? "failed" : running ? "running" : "muted",
|
|
50
|
+
title: startupPhaseTitle(item.phase, item.status, item.outcome),
|
|
51
|
+
preview: item.phase === "model_preparation" ? "Includes overlapping sandbox, rig, repository, and runtime setup shown below." : void 0,
|
|
52
|
+
running,
|
|
53
|
+
failed,
|
|
54
|
+
cancelled: item.status === "cancelled",
|
|
55
|
+
chip: duration ? { tone: failed ? "bad" : "muted", text: duration } : void 0,
|
|
56
|
+
expandable: false
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function brainIcon(j, s) {
|
|
60
|
+
return lucideIcon(j, s, "brain", [
|
|
61
|
+
j("path", { d: "M 12 18V5" }, "spine"),
|
|
62
|
+
j("path", { d: "M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4" }, "center"),
|
|
63
|
+
j("path", { d: "M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5" }, "top"),
|
|
64
|
+
j("path", { d: "M17.997 5.125a4 4 0 0 1 2.526 5.77" }, "upper-right"),
|
|
65
|
+
j("path", { d: "M18 18a4 4 0 0 0 2-7.464" }, "right"),
|
|
66
|
+
j("path", { d: "M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517" }, "base"),
|
|
67
|
+
j("path", { d: "M6 18a4 4 0 0 1-2-7.464" }, "left"),
|
|
68
|
+
j("path", { d: "M6.003 5.125a4 4 0 0 0-2.526 5.77" }, "upper-left")
|
|
69
|
+
]);
|
|
70
|
+
}
|
|
71
|
+
function terminalIcon(j, s) {
|
|
72
|
+
return lucideIcon(j, s, "square-terminal", [
|
|
73
|
+
j("path", { d: "m7 11 2-2-2-2" }, "prompt"),
|
|
74
|
+
j("path", { d: "M11 13h4" }, "cursor"),
|
|
75
|
+
j("rect", { width: 18, height: 18, x: 3, y: 3, rx: 2, ry: 2 }, "frame")
|
|
76
|
+
]);
|
|
77
|
+
}
|
|
78
|
+
function lucideIcon(j, s, name, children) {
|
|
79
|
+
return s("svg", {
|
|
80
|
+
"aria-hidden": "true",
|
|
81
|
+
className: `lucide lucide-${name} size-3.5`,
|
|
82
|
+
fill: "none",
|
|
83
|
+
height: 24,
|
|
84
|
+
stroke: "currentColor",
|
|
85
|
+
strokeLinecap: "round",
|
|
86
|
+
strokeLinejoin: "round",
|
|
87
|
+
strokeWidth: 2,
|
|
88
|
+
viewBox: "0 0 24 24",
|
|
89
|
+
width: 24,
|
|
90
|
+
children
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function sandboxRowTitle(item, displayName) {
|
|
94
|
+
if (item.name === "sandbox.provision") {
|
|
95
|
+
return startupPhaseTitle(
|
|
96
|
+
"sandbox",
|
|
97
|
+
item.status === "cancelled" ? "complete" : item.status,
|
|
98
|
+
item.origin ?? null
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
return displayName(item.name);
|
|
102
|
+
}
|
|
103
|
+
function startupPhaseTitle(phase, status, outcome) {
|
|
104
|
+
if (status === "complete" && phase === "sandbox" && outcome && outcome !== "skipped") {
|
|
105
|
+
return `Sandbox ${outcome === "resumed" ? "reattached" : outcome}`;
|
|
106
|
+
}
|
|
107
|
+
if (status === "complete" && phase === "rig" && outcome === "skipped") {
|
|
108
|
+
return "Rig already ready";
|
|
109
|
+
}
|
|
110
|
+
const statusIndex = status === "running" ? 0 : status === "failed" ? 1 : status === "cancelled" ? 2 : 3;
|
|
111
|
+
return STARTUP_PHASE_TITLES[phase][statusIndex];
|
|
112
|
+
}
|
|
113
|
+
var STARTUP_PHASE_TITLES = {
|
|
114
|
+
queue: [
|
|
115
|
+
"Waiting for a worker",
|
|
116
|
+
"Worker startup failed",
|
|
117
|
+
"Worker wait interrupted",
|
|
118
|
+
"Worker started"
|
|
119
|
+
],
|
|
120
|
+
sandbox: [
|
|
121
|
+
"Starting sandbox",
|
|
122
|
+
"Sandbox didn\u2019t start",
|
|
123
|
+
"Sandbox startup interrupted",
|
|
124
|
+
"Sandbox ready"
|
|
125
|
+
],
|
|
126
|
+
rig: ["Setting up rig", "Rig setup failed", "Rig setup interrupted", "Rig ready"],
|
|
127
|
+
repository: [
|
|
128
|
+
"Preparing repository",
|
|
129
|
+
"Repository preparation failed",
|
|
130
|
+
"Repository preparation interrupted",
|
|
131
|
+
"Repository ready"
|
|
132
|
+
],
|
|
133
|
+
files: [
|
|
134
|
+
"Preparing files",
|
|
135
|
+
"File preparation failed",
|
|
136
|
+
"File preparation interrupted",
|
|
137
|
+
"Files ready"
|
|
138
|
+
],
|
|
139
|
+
tools: [
|
|
140
|
+
"Connecting tools",
|
|
141
|
+
"Tool connection failed",
|
|
142
|
+
"Tool connection interrupted",
|
|
143
|
+
"Tools ready"
|
|
144
|
+
],
|
|
145
|
+
model_preparation: [
|
|
146
|
+
"Preparing runtime and model request",
|
|
147
|
+
"Runtime/model preparation failed",
|
|
148
|
+
"Runtime/model preparation interrupted",
|
|
149
|
+
"Model request dispatched"
|
|
150
|
+
],
|
|
151
|
+
provider_first_byte: [
|
|
152
|
+
"Waiting for model",
|
|
153
|
+
"Model didn\u2019t respond",
|
|
154
|
+
"Model wait interrupted",
|
|
155
|
+
"Model started responding"
|
|
156
|
+
]
|
|
157
|
+
};
|
|
158
|
+
function startupDuration(durationMs) {
|
|
159
|
+
if (durationMs === null || !Number.isFinite(durationMs) || durationMs < 0) return null;
|
|
160
|
+
if (durationMs < 1e3) return `${Math.round(durationMs)}ms`;
|
|
161
|
+
if (durationMs < 6e4) return `${(durationMs / 1e3).toFixed(1)}s`;
|
|
162
|
+
const minutes = Math.floor(durationMs / 6e4);
|
|
163
|
+
const seconds = Math.round(durationMs % 6e4 / 1e3);
|
|
164
|
+
return `${minutes}m ${String(seconds).padStart(2, "0")}s`;
|
|
165
|
+
}
|
|
166
|
+
export {
|
|
167
|
+
PlatformActivityRow as default
|
|
168
|
+
};
|
|
169
|
+
//# sourceMappingURL=platform-activity-row-BJHUHXAT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/timeline/platform-activity-row.tsx"],"sourcesContent":["import type { ReasoningItem, SandboxItem, StartupPhaseItem } from \"./types\";\n\ntype RowJsx = typeof import(\"react/jsx-runtime\").jsx;\ntype RowJsxs = typeof import(\"react/jsx-runtime\").jsxs;\n\nexport default function PlatformActivityRow({\n item,\n d: ActivityDisclosure,\n p: PayloadBlock,\n t: displayName,\n b: BotIcon,\n m: Markdown,\n r: truncate,\n j,\n s,\n}: {\n item: ReasoningItem | SandboxItem | StartupPhaseItem;\n d: typeof import(\"./shared\").ActivityDisclosure;\n p: typeof import(\"./shared\").PayloadBlock;\n t: (name: string) => string;\n b: typeof import(\"lucide-react\").BotIcon;\n m: typeof import(\"../components/markdown\").Markdown;\n r: typeof import(\"../lib/format\").truncate;\n j: RowJsx;\n s: RowJsxs;\n}) {\n if (item.kind === \"reasoning\") {\n return j(ActivityDisclosure, {\n icon: brainIcon(j, s),\n iconTone: \"muted\",\n title: item.streaming\n ? \"Thinking\"\n : j(\"span\", {\n className: \"font-normal italic text-og-fg-subtle\",\n children: \"Thought\",\n }),\n running: item.streaming,\n preview: truncate(item.text, 110),\n children: j(\"div\", {\n className: \"text-og-base leading-6 text-og-fg-muted [&_strong]:text-og-fg-muted\",\n children: j(Markdown, { streaming: item.streaming, children: item.text }),\n }),\n });\n }\n if (item.kind === \"sandbox\") {\n return s(ActivityDisclosure, {\n icon: terminalIcon(j, s),\n iconTone:\n item.status === \"failed\" ? \"failed\" : item.status === \"running\" ? \"running\" : \"muted\",\n title: sandboxRowTitle(item, displayName),\n running: item.status === \"running\",\n failed: item.status === \"failed\",\n cancelled: item.status === \"cancelled\",\n preview: item.command ?? undefined,\n children: [\n item.command ? j(PayloadBlock, { label: \"Command\", value: item.command }, \"command\") : null,\n item.output ? j(PayloadBlock, { label: \"Output\", value: item.output }, \"output\") : null,\n ],\n });\n }\n\n const failed = item.status === \"failed\";\n const running = item.status === \"running\";\n const duration = startupDuration(item.durationMs);\n return j(ActivityDisclosure, {\n icon: j(BotIcon, { className: \"size-3.5\" }),\n iconTone: failed ? \"failed\" : running ? \"running\" : \"muted\",\n title: startupPhaseTitle(item.phase, item.status, item.outcome),\n preview:\n item.phase === \"model_preparation\"\n ? \"Includes overlapping sandbox, rig, repository, and runtime setup shown below.\"\n : undefined,\n running,\n failed,\n cancelled: item.status === \"cancelled\",\n chip: duration ? { tone: failed ? \"bad\" : \"muted\", text: duration } : undefined,\n expandable: false,\n });\n}\n\nfunction brainIcon(j: RowJsx, s: RowJsxs) {\n return lucideIcon(j, s, \"brain\", [\n j(\"path\", { d: \"M 12 18V5\" }, \"spine\"),\n j(\"path\", { d: \"M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4\" }, \"center\"),\n j(\"path\", { d: \"M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5\" }, \"top\"),\n j(\"path\", { d: \"M17.997 5.125a4 4 0 0 1 2.526 5.77\" }, \"upper-right\"),\n j(\"path\", { d: \"M18 18a4 4 0 0 0 2-7.464\" }, \"right\"),\n j(\"path\", { d: \"M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517\" }, \"base\"),\n j(\"path\", { d: \"M6 18a4 4 0 0 1-2-7.464\" }, \"left\"),\n j(\"path\", { d: \"M6.003 5.125a4 4 0 0 0-2.526 5.77\" }, \"upper-left\"),\n ]);\n}\n\nfunction terminalIcon(j: RowJsx, s: RowJsxs) {\n return lucideIcon(j, s, \"square-terminal\", [\n j(\"path\", { d: \"m7 11 2-2-2-2\" }, \"prompt\"),\n j(\"path\", { d: \"M11 13h4\" }, \"cursor\"),\n j(\"rect\", { width: 18, height: 18, x: 3, y: 3, rx: 2, ry: 2 }, \"frame\"),\n ]);\n}\n\nfunction lucideIcon(j: RowJsx, s: RowJsxs, name: string, children: ReturnType<RowJsx>[]) {\n return s(\"svg\", {\n \"aria-hidden\": \"true\",\n className: `lucide lucide-${name} size-3.5`,\n fill: \"none\",\n height: 24,\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n viewBox: \"0 0 24 24\",\n width: 24,\n children,\n });\n}\n\nfunction sandboxRowTitle(item: SandboxItem, displayName: (name: string) => string): string {\n if (item.name === \"sandbox.provision\") {\n return startupPhaseTitle(\n \"sandbox\",\n item.status === \"cancelled\" ? \"complete\" : item.status,\n item.origin ?? null,\n );\n }\n return displayName(item.name);\n}\n\nfunction startupPhaseTitle(\n phase: StartupPhaseItem[\"phase\"],\n status: StartupPhaseItem[\"status\"],\n outcome: StartupPhaseItem[\"outcome\"],\n): string {\n if (status === \"complete\" && phase === \"sandbox\" && outcome && outcome !== \"skipped\") {\n return `Sandbox ${outcome === \"resumed\" ? \"reattached\" : outcome}`;\n }\n if (status === \"complete\" && phase === \"rig\" && outcome === \"skipped\") {\n return \"Rig already ready\";\n }\n const statusIndex =\n status === \"running\" ? 0 : status === \"failed\" ? 1 : status === \"cancelled\" ? 2 : 3;\n return STARTUP_PHASE_TITLES[phase][statusIndex];\n}\n\nconst STARTUP_PHASE_TITLES: Record<\n StartupPhaseItem[\"phase\"],\n readonly [string, string, string, string]\n> = {\n queue: [\n \"Waiting for a worker\",\n \"Worker startup failed\",\n \"Worker wait interrupted\",\n \"Worker started\",\n ],\n sandbox: [\n \"Starting sandbox\",\n \"Sandbox didn’t start\",\n \"Sandbox startup interrupted\",\n \"Sandbox ready\",\n ],\n rig: [\"Setting up rig\", \"Rig setup failed\", \"Rig setup interrupted\", \"Rig ready\"],\n repository: [\n \"Preparing repository\",\n \"Repository preparation failed\",\n \"Repository preparation interrupted\",\n \"Repository ready\",\n ],\n files: [\n \"Preparing files\",\n \"File preparation failed\",\n \"File preparation interrupted\",\n \"Files ready\",\n ],\n tools: [\n \"Connecting tools\",\n \"Tool connection failed\",\n \"Tool connection interrupted\",\n \"Tools ready\",\n ],\n model_preparation: [\n \"Preparing runtime and model request\",\n \"Runtime/model preparation failed\",\n \"Runtime/model preparation interrupted\",\n \"Model request dispatched\",\n ],\n provider_first_byte: [\n \"Waiting for model\",\n \"Model didn’t respond\",\n \"Model wait interrupted\",\n \"Model started responding\",\n ],\n};\n\nfunction startupDuration(durationMs: number | null): string | null {\n if (durationMs === null || !Number.isFinite(durationMs) || durationMs < 0) return null;\n if (durationMs < 1_000) return `${Math.round(durationMs)}ms`;\n if (durationMs < 60_000) return `${(durationMs / 1_000).toFixed(1)}s`;\n const minutes = Math.floor(durationMs / 60_000);\n const seconds = Math.round((durationMs % 60_000) / 1_000);\n return `${minutes}m ${String(seconds).padStart(2, \"0\")}s`;\n}\n"],"mappings":"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","names":[]}
|
package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-BSKUWHRI.js}
RENAMED
|
@@ -58,6 +58,7 @@ function QueueSurface({
|
|
|
58
58
|
const [replaceDraftFor, setReplaceDraftFor] = useState(null);
|
|
59
59
|
const [announcement, setAnnouncement] = useState("");
|
|
60
60
|
const [draggedTurnId, setDraggedTurnId] = useState(null);
|
|
61
|
+
const [pendingMove, setPendingMove] = useState(null);
|
|
61
62
|
const surface = usePortalTokenSource();
|
|
62
63
|
const surfaceRef = surface.currentRef;
|
|
63
64
|
const portalTokenStyle = usePortalTokenStyle(surface.source);
|
|
@@ -80,27 +81,47 @@ function QueueSurface({
|
|
|
80
81
|
}, [queue.pendingInputs, queue.queue]);
|
|
81
82
|
const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 6 } }));
|
|
82
83
|
const displayedQueue = useMemo(() => {
|
|
83
|
-
if (
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
if (keyboardDrag) {
|
|
85
|
+
const oldIndex = queue.queue.findIndex((turn) => turn.id === keyboardDrag.turnId);
|
|
86
|
+
if (oldIndex < 0) return queue.queue;
|
|
87
|
+
return arrayMove(queue.queue, oldIndex, keyboardDrag.projectedIndex);
|
|
88
|
+
}
|
|
89
|
+
if (!pendingMove || pendingMove.baseVersion === null || queue.snapshot?.version !== pendingMove.baseVersion) {
|
|
90
|
+
return queue.queue;
|
|
91
|
+
}
|
|
92
|
+
const byId = new Map(queue.queue.map((turn) => [turn.id, turn]));
|
|
93
|
+
const projected = pendingMove.turnIds.map((turnId) => byId.get(turnId));
|
|
94
|
+
if (projected.some((turn) => !turn) || projected.length !== queue.queue.length) {
|
|
95
|
+
return queue.queue;
|
|
96
|
+
}
|
|
97
|
+
return projected;
|
|
98
|
+
}, [keyboardDrag, pendingMove, queue.queue, queue.snapshot?.version]);
|
|
88
99
|
const ids = useMemo(() => displayedQueue.map((turn) => turn.id), [displayedQueue]);
|
|
89
100
|
const moveToIndex = useCallback(
|
|
90
101
|
async (turnId, nextIndex) => {
|
|
102
|
+
if (queue.mutating || pendingMove) return;
|
|
91
103
|
const oldIndex = queue.queue.findIndex((turn) => turn.id === turnId);
|
|
92
104
|
if (oldIndex < 0) return;
|
|
93
105
|
const boundedIndex = Math.max(0, Math.min(nextIndex, queue.queue.length - 1));
|
|
94
106
|
if (oldIndex === boundedIndex) return;
|
|
95
107
|
const ordered = arrayMove(queue.queue, oldIndex, boundedIndex);
|
|
96
108
|
const beforeTurnId = ordered[boundedIndex + 1]?.id ?? null;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
);
|
|
101
|
-
|
|
109
|
+
setPendingMove({
|
|
110
|
+
baseVersion: queue.snapshot?.version ?? null,
|
|
111
|
+
turnIds: ordered.map((turn) => turn.id)
|
|
112
|
+
});
|
|
113
|
+
setAnnouncement(`Saving queued prompt at position ${boundedIndex + 1}.`);
|
|
114
|
+
try {
|
|
115
|
+
const moved = await queue.moveTurn(turnId, beforeTurnId);
|
|
116
|
+
setAnnouncement(
|
|
117
|
+
moved ? `Queued prompt moved to position ${boundedIndex + 1}.` : "The queue changed before that prompt could be moved. Refreshed server order."
|
|
118
|
+
);
|
|
119
|
+
if (moved) focusQueueTurn(surfaceRef.current, turnId);
|
|
120
|
+
} finally {
|
|
121
|
+
setPendingMove(null);
|
|
122
|
+
}
|
|
102
123
|
},
|
|
103
|
-
[queue, surfaceRef]
|
|
124
|
+
[pendingMove, queue, surfaceRef]
|
|
104
125
|
);
|
|
105
126
|
const onDragEnd = useCallback(
|
|
106
127
|
(event) => {
|
|
@@ -169,11 +190,15 @@ function QueueSurface({
|
|
|
169
190
|
const edit = useCallback(
|
|
170
191
|
async (turn, replaceDraft) => {
|
|
171
192
|
if (!composer || !canEditInComposer) return;
|
|
193
|
+
setAnnouncement("Moving queued prompt to the composer\u2026");
|
|
172
194
|
const restored = await queue.editTurn(turn.id, {
|
|
173
195
|
expectedDraftRevision: composer.draftRevision,
|
|
174
196
|
replaceDraft
|
|
175
197
|
});
|
|
176
|
-
if (!restored)
|
|
198
|
+
if (!restored) {
|
|
199
|
+
setAnnouncement("That prompt changed before it could be moved to the composer.");
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
177
202
|
composer.applyDraft(restored);
|
|
178
203
|
setReplaceDraftFor(null);
|
|
179
204
|
setAnnouncement("Queued prompt moved back to the composer for editing.");
|
|
@@ -298,6 +323,7 @@ function QueueSurface({
|
|
|
298
323
|
count,
|
|
299
324
|
attachedInputs: turn.id === queue.pendingInputAttachment?.turnId ? attachedInputs : [],
|
|
300
325
|
pending: queue.mutationFor(turn.id),
|
|
326
|
+
reorderDisabled: queue.mutating || pendingMove !== null,
|
|
301
327
|
confirmingReplace: replaceDraftFor === turn.id,
|
|
302
328
|
keyboardDragging: keyboardDrag?.turnId === turn.id,
|
|
303
329
|
portalTokenStyle,
|
|
@@ -307,6 +333,7 @@ function QueueSurface({
|
|
|
307
333
|
onConfirmReplace: () => void edit(turn, true),
|
|
308
334
|
onCancelReplace: () => setReplaceDraftFor(null),
|
|
309
335
|
onSteer: () => {
|
|
336
|
+
setAnnouncement("Requesting this queued prompt as the next direction\u2026");
|
|
310
337
|
void queue.steerTurn(turn.id).then((steered) => {
|
|
311
338
|
setAnnouncement(
|
|
312
339
|
steered ? "Queued prompt is now the next direction." : "That prompt changed before it could be steered."
|
|
@@ -317,6 +344,7 @@ function QueueSurface({
|
|
|
317
344
|
});
|
|
318
345
|
},
|
|
319
346
|
onDelete: () => {
|
|
347
|
+
setAnnouncement("Deleting queued prompt\u2026");
|
|
320
348
|
void queue.removeTurn(turn.id).then((removed) => {
|
|
321
349
|
setAnnouncement(
|
|
322
350
|
removed ? "Queued prompt deleted." : "That prompt changed before it could be deleted."
|
|
@@ -753,6 +781,7 @@ function SortableQueueRow({
|
|
|
753
781
|
count,
|
|
754
782
|
attachedInputs,
|
|
755
783
|
pending,
|
|
784
|
+
reorderDisabled,
|
|
756
785
|
confirmingReplace,
|
|
757
786
|
keyboardDragging,
|
|
758
787
|
portalTokenStyle,
|
|
@@ -767,7 +796,7 @@ function SortableQueueRow({
|
|
|
767
796
|
}) {
|
|
768
797
|
const sortable = useSortable({
|
|
769
798
|
id: turn.id,
|
|
770
|
-
disabled:
|
|
799
|
+
disabled: reorderDisabled || keyboardDragging
|
|
771
800
|
});
|
|
772
801
|
return /* @__PURE__ */ jsxs(
|
|
773
802
|
"li",
|
|
@@ -790,7 +819,7 @@ function SortableQueueRow({
|
|
|
790
819
|
...sortable.attributes,
|
|
791
820
|
...sortable.listeners,
|
|
792
821
|
onKeyDown: onHandleKeyDown,
|
|
793
|
-
disabled:
|
|
822
|
+
disabled: reorderDisabled,
|
|
794
823
|
className: "col-start-1 row-start-1 mt-0.5 inline-flex size-7 shrink-0 touch-none items-center justify-center rounded-md text-fg-subtle hover:bg-surface-2 hover:text-fg focus-visible:ring-2 focus-visible:ring-ring/40 pointer-coarse:size-[44px]",
|
|
795
824
|
"aria-label": `Reorder queued prompt ${index + 1}`,
|
|
796
825
|
title: "Drag to reorder. Press Space, arrows, then Space to drop.",
|
|
@@ -822,7 +851,26 @@ function SortableQueueRow({
|
|
|
822
851
|
] }) : null,
|
|
823
852
|
/* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children: turn.model }),
|
|
824
853
|
/* @__PURE__ */ jsx("span", { className: "shrink-0", children: turn.reasoningEffort })
|
|
825
|
-
] })
|
|
854
|
+
] }),
|
|
855
|
+
pending ? /* @__PURE__ */ jsxs(
|
|
856
|
+
"div",
|
|
857
|
+
{
|
|
858
|
+
role: "status",
|
|
859
|
+
"aria-live": "polite",
|
|
860
|
+
className: "mt-1 flex items-center gap-1.5 text-og-xs font-medium text-status-waiting",
|
|
861
|
+
"data-testid": `queue-mutation-${pending}`,
|
|
862
|
+
children: [
|
|
863
|
+
/* @__PURE__ */ jsx(
|
|
864
|
+
Loader2Icon,
|
|
865
|
+
{
|
|
866
|
+
"aria-hidden": "true",
|
|
867
|
+
className: "size-3 shrink-0 animate-spin motion-reduce:animate-none"
|
|
868
|
+
}
|
|
869
|
+
),
|
|
870
|
+
queueMutationPendingLabel(pending)
|
|
871
|
+
]
|
|
872
|
+
}
|
|
873
|
+
) : null
|
|
826
874
|
] }),
|
|
827
875
|
/* @__PURE__ */ jsxs("div", { className: "col-span-full row-start-3 flex min-w-0 items-start justify-end gap-1.5 sm:col-span-1 sm:col-start-4 sm:row-start-1 sm:gap-2", children: [
|
|
828
876
|
/* @__PURE__ */ jsxs(
|
|
@@ -962,6 +1010,18 @@ function SortableQueueRow({
|
|
|
962
1010
|
}
|
|
963
1011
|
);
|
|
964
1012
|
}
|
|
1013
|
+
function queueMutationPendingLabel(kind) {
|
|
1014
|
+
switch (kind) {
|
|
1015
|
+
case "move":
|
|
1016
|
+
return "Saving new position\u2026";
|
|
1017
|
+
case "edit":
|
|
1018
|
+
return "Moving to composer\u2026";
|
|
1019
|
+
case "steer":
|
|
1020
|
+
return "Changing direction\u2026";
|
|
1021
|
+
case "delete":
|
|
1022
|
+
return "Deleting\u2026";
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
965
1025
|
var verticalOnly = ({ transform }) => ({ ...transform, x: 0 });
|
|
966
1026
|
function focusQueueTurn(surface, turnId) {
|
|
967
1027
|
window.requestAnimationFrame(() => {
|
|
@@ -987,4 +1047,4 @@ export {
|
|
|
987
1047
|
QueueSurface,
|
|
988
1048
|
queueComposerCheckoutEnabled
|
|
989
1049
|
};
|
|
990
|
-
//# sourceMappingURL=queue-surface-implementation-
|
|
1050
|
+
//# sourceMappingURL=queue-surface-implementation-BSKUWHRI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/queue-surface-implementation.tsx"],"sourcesContent":["import {\n DndContext,\n DragOverlay,\n PointerSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n type Modifier,\n} from \"@dnd-kit/core\";\nimport {\n SortableContext,\n arrayMove,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport type { SessionPendingInputPreview, SessionTurn, TimelineAnnotation } from \"@opengeni/sdk\";\nimport {\n ArrowDownToLineIcon,\n ArrowUpToLineIcon,\n ChevronDownIcon,\n EllipsisIcon,\n GripVerticalIcon,\n Loader2Icon,\n PencilIcon,\n Trash2Icon,\n ZapIcon,\n} from \"lucide-react\";\nimport {\n useCallback,\n useId,\n useMemo,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\n\nimport { DropdownMenu } from \"radix-ui\";\nimport type { ComposerState } from \"../hooks/use-composer\";\nimport type { QueueMutationKind, UseTurnQueueResult } from \"../hooks/use-turn-queue\";\nimport {\n type PortalTokenStyle,\n usePortalTokenSource,\n usePortalTokenStyle,\n} from \"../lib/use-portal-token-style\";\nimport { requestQueueDraftEdit } from \"./queue-draft-policy\";\nimport { QueueErrorAlert, QueueStoppingStatus } from \"./queue-surface-state\";\nimport { TimelineAnnotationsChip } from \"./timeline-annotations\";\n\n/** The sole pending-input surface: compact above Goal, Agents, and composer. */\ntype QueueSurfaceCommonProps = {\n /** Focus the composer owned by this queue after checkout/removal. */\n onRequestComposerFocus?: (() => void) | undefined;\n};\n\nexport type QueueSurfaceProps =\n | (QueueSurfaceCommonProps & {\n queue: UseTurnQueueResult;\n composer: ComposerState;\n readOnly?: false | undefined;\n })\n | (QueueSurfaceCommonProps & {\n queue: UseTurnQueueResult;\n composer?: undefined;\n readOnly: true;\n });\n\n/** @internal Pure policy seam for queue/composer embedding tests. */\nexport function queueComposerCheckoutEnabled(\n composer: ComposerState | undefined,\n readOnly: boolean,\n): boolean {\n return !readOnly && composer !== undefined && composer.draftPersistence !== \"disabled\";\n}\n\nexport function QueueSurface({\n queue,\n composer,\n readOnly = false,\n onRequestComposerFocus,\n}: QueueSurfaceProps) {\n const [open, setOpen] = useState(false);\n const [replaceDraftFor, setReplaceDraftFor] = useState<string | null>(null);\n const [announcement, setAnnouncement] = useState(\"\");\n const [draggedTurnId, setDraggedTurnId] = useState<string | null>(null);\n const [pendingMove, setPendingMove] = useState<{\n baseVersion: number | null;\n turnIds: string[];\n } | null>(null);\n const surface = usePortalTokenSource<HTMLDivElement>();\n const surfaceRef = surface.currentRef;\n const portalTokenStyle = usePortalTokenStyle(surface.source);\n const [keyboardDrag, setKeyboardDrag] = useState<{\n turnId: string;\n projectedIndex: number;\n } | null>(null);\n const count = queue.queue.length;\n const pendingInputCount = queue.pendingInputs.length;\n const totalCount = count + pendingInputCount;\n const attachedInputIds = queue.pendingInputAttachment?.inputIds ?? [];\n const attachedInputs = queue.pendingInputs.filter((input) => attachedInputIds.includes(input.id));\n const standaloneInputs = queue.pendingInputs.filter(\n (input) => !attachedInputIds.includes(input.id),\n );\n const canEditInComposer = queueComposerCheckoutEnabled(composer, readOnly);\n const collapsedPreview = useMemo(() => {\n const firstTurn = queue.queue[0];\n return firstTurn\n ? queueTurnPreview(firstTurn, QUEUE_COLLAPSED_PREVIEW_CHARACTERS)\n : queuePromptPreview(\n queue.pendingInputs[0]?.summary ?? \"\",\n QUEUE_COLLAPSED_PREVIEW_CHARACTERS,\n );\n }, [queue.pendingInputs, queue.queue]);\n const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 6 } }));\n\n const displayedQueue = useMemo(() => {\n if (keyboardDrag) {\n const oldIndex = queue.queue.findIndex((turn) => turn.id === keyboardDrag.turnId);\n if (oldIndex < 0) return queue.queue;\n return arrayMove(queue.queue, oldIndex, keyboardDrag.projectedIndex);\n }\n if (\n !pendingMove ||\n pendingMove.baseVersion === null ||\n queue.snapshot?.version !== pendingMove.baseVersion\n ) {\n return queue.queue;\n }\n const byId = new Map(queue.queue.map((turn) => [turn.id, turn]));\n const projected = pendingMove.turnIds.map((turnId) => byId.get(turnId));\n // Never let an optimistic ordering projection omit or invent a row. Any\n // concurrent authoritative membership change wins immediately.\n if (projected.some((turn) => !turn) || projected.length !== queue.queue.length) {\n return queue.queue;\n }\n return projected as SessionTurn[];\n }, [keyboardDrag, pendingMove, queue.queue, queue.snapshot?.version]);\n\n const ids = useMemo(() => displayedQueue.map((turn) => turn.id), [displayedQueue]);\n const moveToIndex = useCallback(\n async (turnId: string, nextIndex: number): Promise<void> => {\n if (queue.mutating || pendingMove) return;\n const oldIndex = queue.queue.findIndex((turn) => turn.id === turnId);\n if (oldIndex < 0) return;\n const boundedIndex = Math.max(0, Math.min(nextIndex, queue.queue.length - 1));\n if (oldIndex === boundedIndex) return;\n const ordered = arrayMove(queue.queue, oldIndex, boundedIndex);\n const beforeTurnId = ordered[boundedIndex + 1]?.id ?? null;\n setPendingMove({\n baseVersion: queue.snapshot?.version ?? null,\n turnIds: ordered.map((turn) => turn.id),\n });\n setAnnouncement(`Saving queued prompt at position ${boundedIndex + 1}.`);\n try {\n const moved = await queue.moveTurn(turnId, beforeTurnId);\n setAnnouncement(\n moved\n ? `Queued prompt moved to position ${boundedIndex + 1}.`\n : \"The queue changed before that prompt could be moved. Refreshed server order.\",\n );\n if (moved) focusQueueTurn(surfaceRef.current, turnId);\n } finally {\n setPendingMove(null);\n }\n },\n [pendingMove, queue, surfaceRef],\n );\n\n const onDragEnd = useCallback(\n (event: DragEndEvent) => {\n setDraggedTurnId(null);\n const activeId = String(event.active.id);\n const overId = event.over ? String(event.over.id) : null;\n if (!overId || activeId === overId) {\n setAnnouncement(\"Queued prompt returned to its original position.\");\n return;\n }\n const nextIndex = queue.queue.findIndex((turn) => turn.id === overId);\n if (nextIndex >= 0) void moveToIndex(activeId, nextIndex);\n },\n [moveToIndex, queue.queue],\n );\n\n const onDragStart = useCallback(\n (event: DragStartEvent) => {\n setKeyboardDrag(null);\n const turnId = String(event.active.id);\n const position = queue.queue.findIndex((turn) => turn.id === turnId) + 1;\n setDraggedTurnId(turnId);\n setAnnouncement(`Dragging queued prompt ${position} of ${queue.queue.length}.`);\n },\n [queue.queue],\n );\n\n const onHandleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLButtonElement>, turnId: string) => {\n const canonicalIndex = queue.queue.findIndex((turn) => turn.id === turnId);\n if (canonicalIndex < 0) return;\n\n if (!keyboardDrag) {\n if (event.key !== \" \") return;\n event.preventDefault();\n setKeyboardDrag({ turnId, projectedIndex: canonicalIndex });\n setAnnouncement(\n `Lifted queued prompt ${canonicalIndex + 1} of ${count}. Use arrow keys to move it, then press Space to drop.`,\n );\n return;\n }\n if (keyboardDrag.turnId !== turnId) return;\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n setKeyboardDrag(null);\n setAnnouncement(\"Queue reorder cancelled.\");\n return;\n }\n if (event.key === \" \") {\n event.preventDefault();\n const targetIndex = keyboardDrag.projectedIndex;\n setAnnouncement(`Moving queued prompt to position ${targetIndex + 1}.`);\n void moveToIndex(turnId, targetIndex).finally(() => setKeyboardDrag(null));\n return;\n }\n\n const direction = event.key === \"ArrowUp\" ? -1 : event.key === \"ArrowDown\" ? 1 : 0;\n const edge = event.key === \"Home\" ? 0 : event.key === \"End\" ? count - 1 : null;\n if (direction === 0 && edge === null) return;\n event.preventDefault();\n const projectedIndex = Math.max(\n 0,\n Math.min(edge ?? keyboardDrag.projectedIndex + direction, count - 1),\n );\n setKeyboardDrag({ turnId, projectedIndex });\n setAnnouncement(`Queued prompt projected to position ${projectedIndex + 1} of ${count}.`);\n },\n [count, keyboardDrag, moveToIndex, queue.queue],\n );\n\n const edit = useCallback(\n async (turn: SessionTurn, replaceDraft: boolean) => {\n if (!composer || !canEditInComposer) return;\n setAnnouncement(\"Moving queued prompt to the composer…\");\n const restored = await queue.editTurn(turn.id, {\n expectedDraftRevision: composer.draftRevision,\n replaceDraft,\n });\n if (!restored) {\n setAnnouncement(\"That prompt changed before it could be moved to the composer.\");\n return;\n }\n composer.applyDraft(restored);\n setReplaceDraftFor(null);\n setAnnouncement(\"Queued prompt moved back to the composer for editing.\");\n window.requestAnimationFrame(() => {\n if (onRequestComposerFocus) {\n onRequestComposerFocus();\n return;\n }\n const input = document.querySelector<HTMLTextAreaElement>(\n 'textarea[aria-label=\"Message the agent\"]',\n );\n input?.scrollIntoView({ block: \"nearest\", behavior: \"smooth\" });\n input?.focus();\n });\n },\n [canEditInComposer, composer, onRequestComposerFocus, queue],\n );\n\n const requestEdit = useCallback(\n (turn: SessionTurn) => {\n if (!composer || !canEditInComposer) return;\n requestQueueDraftEdit(\n composer,\n () => setReplaceDraftFor(turn.id),\n () => void edit(turn, false),\n );\n },\n [canEditInComposer, composer, edit],\n );\n\n if (totalCount === 0 && !queue.stoppingPreviousAttempt && !queue.error && !queue.mutationError)\n return null;\n\n return (\n <div\n ref={surface.ref}\n className=\"og-root mx-auto mb-2 w-full max-w-3xl shrink-0 px-4 sm:px-6\"\n data-testid=\"queue-surface\"\n >\n <div className=\"overflow-hidden rounded-lg border border-border bg-surface/80 shadow-sm\">\n {queue.stoppingPreviousAttempt ? <QueueStoppingStatus queue={queue} dividerAfter /> : null}\n <button\n type=\"button\"\n className=\"flex w-full min-w-0 flex-wrap items-center gap-2 px-3 py-2 text-left outline-hidden transition-colors hover:bg-surface-2/60 focus-visible:bg-surface-2/60 focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring/40 pointer-coarse:min-h-[44px]\"\n onClick={() => setOpen((value) => !value)}\n aria-description={!open && totalCount > 0 ? collapsedPreview.summary : undefined}\n aria-expanded={open}\n aria-label={`${count} queued prompt${count === 1 ? \"\" : \"s\"}${\n pendingInputCount > 0\n ? ` and ${pendingInputCount} pending machine input${pendingInputCount === 1 ? \"\" : \"s\"}`\n : \"\"\n }${readOnly ? \" Read-only\" : \"\"}`}\n >\n <ChevronDownIcon\n aria-hidden=\"true\"\n className={`size-3.5 shrink-0 text-fg-subtle transition-transform ${open ? \"rotate-180\" : \"\"}`}\n />\n <span className=\"text-og-control font-medium text-fg\">\n {count > 0 ? `${count} queued prompt${count === 1 ? \"\" : \"s\"}` : null}\n {count > 0 && pendingInputCount > 0 ? \" · \" : null}\n {pendingInputCount > 0\n ? `${pendingInputCount} incoming update${pendingInputCount === 1 ? \"\" : \"s\"}`\n : null}\n </span>\n {readOnly ? (\n <span className=\"shrink-0 rounded border border-border px-1.5 py-0.5 text-og-xs text-fg-subtle\">\n Read-only\n </span>\n ) : null}\n {!open && totalCount > 0 ? (\n <span\n aria-hidden=\"true\"\n className={`max-w-full truncate text-fg-muted ${\n collapsedPreview.collapsedVisual === collapsedPreview.summary\n ? \"min-w-0 flex-1 text-og-control\"\n : \"shrink-0 text-[10px]\"\n }`}\n data-testid=\"queue-collapsed-preview\"\n dir=\"auto\"\n >\n {collapsedPreview.collapsedVisual}\n </span>\n ) : null}\n {queue.loading ? <Loader2Icon className=\"ml-auto size-3.5 animate-spin\" /> : null}\n </button>\n\n {open && standaloneInputs.length > 0 ? (\n <PendingMachineInputs inputs={standaloneInputs} />\n ) : null}\n\n {open && count > 0 && readOnly ? (\n <ol\n className=\"max-h-[min(30rem,60dvh)] divide-y divide-border overflow-y-auto overscroll-contain border-t border-border\"\n aria-label=\"Queued prompts\"\n data-testid=\"queue-list\"\n >\n {queue.queue.map((turn, index) => (\n <ReadOnlyQueueRow\n key={turn.id}\n turn={turn}\n index={index}\n attachedInputs={\n turn.id === queue.pendingInputAttachment?.turnId ? attachedInputs : []\n }\n onDisclosureChange={(expanded) =>\n setAnnouncement(\n `Full content for queued prompt ${index + 1} ${expanded ? \"shown\" : \"hidden\"}.`,\n )\n }\n />\n ))}\n </ol>\n ) : null}\n\n {open && count > 0 && !readOnly ? (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={[verticalOnly]}\n onDragStart={onDragStart}\n onDragCancel={() => {\n setDraggedTurnId(null);\n setAnnouncement(\"Queue reorder cancelled.\");\n }}\n onDragEnd={onDragEnd}\n >\n <SortableContext items={ids} strategy={verticalListSortingStrategy}>\n <ol\n className=\"max-h-[min(30rem,60dvh)] divide-y divide-border overflow-y-auto overscroll-contain border-t border-border\"\n aria-label=\"Queued prompts\"\n data-testid=\"queue-list\"\n >\n {displayedQueue.map((turn, index) => (\n <SortableQueueRow\n key={turn.id}\n turn={turn}\n index={index}\n count={count}\n attachedInputs={\n turn.id === queue.pendingInputAttachment?.turnId ? attachedInputs : []\n }\n pending={queue.mutationFor(turn.id)}\n reorderDisabled={queue.mutating || pendingMove !== null}\n confirmingReplace={replaceDraftFor === turn.id}\n keyboardDragging={keyboardDrag?.turnId === turn.id}\n portalTokenStyle={portalTokenStyle}\n onHandleKeyDown={(event) => onHandleKeyDown(event, turn.id)}\n onMove={(nextIndex) => void moveToIndex(turn.id, nextIndex)}\n onEdit={canEditInComposer ? () => requestEdit(turn) : undefined}\n onConfirmReplace={() => void edit(turn, true)}\n onCancelReplace={() => setReplaceDraftFor(null)}\n onSteer={() => {\n setAnnouncement(\"Requesting this queued prompt as the next direction…\");\n void queue.steerTurn(turn.id).then((steered) => {\n setAnnouncement(\n steered\n ? \"Queued prompt is now the next direction.\"\n : \"That prompt changed before it could be steered.\",\n );\n if (steered) {\n focusAfterQueueRemoval(surfaceRef.current, index, onRequestComposerFocus);\n }\n });\n }}\n onDelete={() => {\n setAnnouncement(\"Deleting queued prompt…\");\n void queue.removeTurn(turn.id).then((removed) => {\n setAnnouncement(\n removed\n ? \"Queued prompt deleted.\"\n : \"That prompt changed before it could be deleted.\",\n );\n if (removed) {\n focusAfterQueueRemoval(surfaceRef.current, index, onRequestComposerFocus);\n }\n });\n }}\n onDisclosureChange={(expanded) =>\n setAnnouncement(\n `Full content for queued prompt ${index + 1} ${expanded ? \"shown\" : \"hidden\"}.`,\n )\n }\n />\n ))}\n </ol>\n </SortableContext>\n <DragOverlay modifiers={[verticalOnly]}>\n {draggedTurnId ? (\n <div\n className=\"max-h-20 w-[min(36rem,calc(100vw-2rem))] max-w-[calc(100vw-2rem)] overflow-hidden rounded-md border border-brand/40 bg-surface px-3 py-2 text-og-control text-fg shadow-lg\"\n data-testid=\"queue-drag-overlay\"\n >\n <p\n aria-hidden=\"true\"\n className=\"line-clamp-3 break-all whitespace-pre-wrap [unicode-bidi:plaintext]\"\n dir=\"auto\"\n >\n {\n queueTurnPreview(\n queue.queue.find((turn) => turn.id === draggedTurnId),\n QUEUE_ROW_PREVIEW_CHARACTERS,\n ).summary\n }\n </p>\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n ) : null}\n\n {queue.error || queue.mutationError ? (\n <QueueErrorAlert queue={queue} dividerBefore />\n ) : null}\n </div>\n <p className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {announcement}\n </p>\n </div>\n );\n}\n\nfunction PendingMachineInputs({\n inputs,\n attached = false,\n}: {\n inputs: SessionPendingInputPreview[];\n attached?: boolean;\n}) {\n return (\n <section className=\"border-t border-border px-3 py-2\">\n <p className=\"text-og-xs font-medium text-fg-subtle\">\n {attached\n ? `${inputs.length} update${inputs.length === 1 ? \"\" : \"s\"} will join this prompt`\n : \"Incoming updates waiting to run\"}\n </p>\n <ol className=\"mt-1 space-y-1\">\n {inputs.map((input) => (\n <li\n key={input.id}\n className=\"line-clamp-3 break-words text-og-control text-fg\"\n dir=\"auto\"\n >\n <strong className=\"capitalize text-fg-muted\">\n {input.kind.replace(\"_terminal\", \"\").replaceAll(\"_\", \" \")}\n </strong>{\" \"}\n · {input.sourceId}\n {input.summary ? ` — ${input.summary}` : \"\"}\n </li>\n ))}\n </ol>\n </section>\n );\n}\n\nconst QUEUE_ROW_PREVIEW_CHARACTERS = 360;\nconst QUEUE_COLLAPSED_PREVIEW_CHARACTERS = 180;\nconst QUEUE_PREVIEW_GRAPHEME_CONTEXT_CHARACTERS = 32;\nconst QUEUE_PREVIEW_REFERENCE_SAMPLE_CHARACTERS = 32;\nconst QUEUE_VISIBLE_END_IDENTITY_CHARACTERS = 18;\nconst QUEUE_PREVIEW_SEPARATOR = \" … \";\nconst queuePreviewSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\nconst queuePromptNonRenderingCodePoint =\n /[\\p{White_Space}\\p{Control}\\p{Default_Ignorable_Code_Point}]/u;\n\ntype BoundedPromptSample = {\n value: string;\n characters: number;\n truncated: boolean;\n};\n\ntype QueuePromptPreview = {\n summary: string;\n collapsedVisual: string;\n visibleStart: string;\n visibleIdentity: string | null;\n visibleIdentityLabel: \"End\" | \"Safe boundary\" | null;\n isFallback: boolean;\n};\n\nfunction annotationOnlyQueuePreview(count: number): QueuePromptPreview {\n const summary = `${count} timeline ${count === 1 ? \"annotation\" : \"annotations\"}`;\n return {\n summary,\n collapsedVisual: summary,\n visibleStart: summary,\n visibleIdentity: null,\n visibleIdentityLabel: null,\n isFallback: false,\n };\n}\n\nfunction queueTurnPreview(\n turn: SessionTurn | undefined,\n maxCharacters: number,\n): QueuePromptPreview {\n if (!turn) return queuePromptPreview(\"\", maxCharacters);\n const annotations = turn.annotations ?? [];\n return turn.prompt.length === 0 && annotations.length > 0\n ? annotationOnlyQueuePreview(annotations.length)\n : queuePromptPreview(turn.prompt, maxCharacters);\n}\n\n/**\n * Build a bounded head/tail summary of an arbitrary queued prompt. Sampling\n * both ends distinguishes prompts with equal long prefixes. Each sampled edge\n * has a small amount of grapheme context so ordinary emoji/combining sequences\n * can be retained whole. A cluster that exceeds that context is omitted rather\n * than fragmented, and malformed UTF-16 is replaced only in the summary. The\n * durable prompt remains exact and no operation scans or copies it in full.\n */\nfunction queuePromptPreview(prompt: string, maxCharacters: number): QueuePromptPreview {\n const wholePromptProbe = samplePromptStart(prompt, maxCharacters + 1);\n if (!wholePromptProbe.truncated && wholePromptProbe.characters <= maxCharacters) {\n const summary = replaceLoneSurrogates(wholePromptProbe.value);\n return hasVisiblePromptContent(summary)\n ? {\n summary,\n collapsedVisual: summary,\n visibleStart: summary,\n visibleIdentity: null,\n visibleIdentityLabel: null,\n isFallback: false,\n }\n : fallbackPromptPreview(prompt.length, wholePromptProbe.value, wholePromptProbe.value);\n }\n\n const suffixCharacters = Math.min(Math.floor(maxCharacters / 3), 120);\n const prefixCharacters =\n maxCharacters - codePointLength(QUEUE_PREVIEW_SEPARATOR) - suffixCharacters;\n const prefixSample = samplePromptStart(\n prompt,\n prefixCharacters + QUEUE_PREVIEW_GRAPHEME_CONTEXT_CHARACTERS,\n );\n const suffixSample = samplePromptEnd(\n prompt,\n suffixCharacters + QUEUE_PREVIEW_GRAPHEME_CONTEXT_CHARACTERS,\n );\n const prefixSegments = segmentPromptSample(prefixSample.value);\n const suffixSegments = segmentPromptSample(suffixSample.value);\n\n // A cluster at a truncated sampling edge may continue outside the sample.\n // Prefix sampling starts at the true source start, so only its last segment\n // is ambiguous. Suffix sampling ends at the true source end, so its first is.\n if (prefixSample.truncated) prefixSegments.pop();\n if (suffixSample.truncated) {\n let ambiguousSegment = suffixSegments.shift();\n // A locally segmented leading fragment ending in ZWJ can join the next\n // pictographic segment when omitted left context supplies its base. Keep\n // backing off until that uncertainty no longer propagates to the right.\n while (ambiguousSegment?.endsWith(\"\\u200d\") && suffixSegments.length > 0) {\n ambiguousSegment = suffixSegments.shift();\n }\n // Regional Indicator pairing depends on the parity of the preceding run.\n // If that run reaches the unknown sample boundary, omit all of its visible\n // leading segments rather than potentially recombining halves of flags.\n while (suffixSegments[0] && startsWithRegionalIndicator(suffixSegments[0])) {\n suffixSegments.shift();\n }\n }\n\n const prefix = takeWholeGraphemesFromStart(prefixSegments, prefixCharacters);\n const suffix = takeWholeGraphemesFromEnd(suffixSegments, suffixCharacters);\n const reference = boundedPromptSampleReference(\n prompt.length,\n prefixSample.value,\n suffixSample.value,\n );\n\n if (!hasVisiblePromptContent(prefix) && !hasVisiblePromptContent(suffix)) {\n return fallbackPromptPreview(prompt.length, prefixSample.value, suffixSample.value);\n }\n\n const safeSuffix = hasVisiblePromptContent(suffix)\n ? suffix\n : promptPreviewFallbackLabel(reference);\n const summary = `${prefix}${QUEUE_PREVIEW_SEPARATOR}${safeSuffix}`;\n if (!hasVisiblePromptContent(prefix)) {\n return {\n summary,\n collapsedVisual: summary,\n visibleStart: safeSuffix,\n visibleIdentity: null,\n visibleIdentityLabel: null,\n isFallback: false,\n };\n }\n\n const endIdentity = takeWholeGraphemesFromEnd(\n suffixSegments,\n QUEUE_VISIBLE_END_IDENTITY_CHARACTERS,\n );\n return {\n summary,\n collapsedVisual: summary,\n visibleStart: prefix,\n visibleIdentity: hasVisiblePromptContent(endIdentity) ? endIdentity : `ref ${reference}`,\n visibleIdentityLabel: hasVisiblePromptContent(endIdentity) ? \"End\" : \"Safe boundary\",\n isFallback: false,\n };\n}\n\nfunction fallbackPromptPreview(\n promptLength: number,\n startSample: string,\n endSample: string,\n): QueuePromptPreview {\n const reference = boundedPromptSampleReference(promptLength, startSample, endSample);\n const summary = promptPreviewFallbackLabel(reference);\n return {\n summary,\n collapsedVisual: `Omitted · ${reference}`,\n // The complete fallback remains the canonical accessible summary. Narrow\n // collapsed/row layouts paint the bounded reference in a compact truthful\n // form so ellipsis cannot hide the only identifying portion.\n visibleStart: `Omitted · ${reference}`,\n visibleIdentity: null,\n visibleIdentityLabel: null,\n isFallback: true,\n };\n}\n\nfunction promptPreviewFallbackLabel(reference: string): string {\n return `Content omitted at safe boundary · ref ${reference}`;\n}\n\nfunction boundedPromptSampleReference(\n promptLength: number,\n startSample: string,\n endSample: string,\n): string {\n const head = samplePromptStart(startSample, QUEUE_PREVIEW_REFERENCE_SAMPLE_CHARACTERS).value;\n const tail = samplePromptEnd(endSample, QUEUE_PREVIEW_REFERENCE_SAMPLE_CHARACTERS).value;\n let hash = 0x811c9dc5;\n for (const value of [String(promptLength), head, tail]) {\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n hash ^= 0xffff;\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\").toUpperCase();\n}\n\nfunction hasVisiblePromptContent(value: string): boolean {\n // Callers pass only the already-bounded whole/head/tail preview samples.\n // Default-ignorables and controls can survive trim() while painting no row\n // identity at all (for example ZWJ, VS16, bidi controls, and tag characters).\n for (const character of value) {\n if (!queuePromptNonRenderingCodePoint.test(character)) return true;\n }\n return false;\n}\n\nfunction samplePromptStart(prompt: string, maxCharacters: number): BoundedPromptSample {\n let end = 0;\n let characters = 0;\n while (end < prompt.length && characters < maxCharacters) {\n const first = prompt.charCodeAt(end);\n end +=\n isHighSurrogate(first) &&\n end + 1 < prompt.length &&\n isLowSurrogate(prompt.charCodeAt(end + 1))\n ? 2\n : 1;\n characters += 1;\n }\n return { value: prompt.slice(0, end), characters, truncated: end < prompt.length };\n}\n\nfunction samplePromptEnd(prompt: string, maxCharacters: number): BoundedPromptSample {\n let start = prompt.length;\n let characters = 0;\n while (start > 0 && characters < maxCharacters) {\n start -= 1;\n if (\n isLowSurrogate(prompt.charCodeAt(start)) &&\n start > 0 &&\n isHighSurrogate(prompt.charCodeAt(start - 1))\n ) {\n start -= 1;\n }\n characters += 1;\n }\n return { value: prompt.slice(start), characters, truncated: start > 0 };\n}\n\nfunction segmentPromptSample(sample: string): string[] {\n return Array.from(\n queuePreviewSegmenter.segment(replaceLoneSurrogates(sample)),\n ({ segment }) => segment,\n );\n}\n\nfunction replaceLoneSurrogates(value: string): string {\n let sanitized = \"\";\n for (let index = 0; index < value.length; index += 1) {\n const current = value.charCodeAt(index);\n if (\n isHighSurrogate(current) &&\n index + 1 < value.length &&\n isLowSurrogate(value.charCodeAt(index + 1))\n ) {\n sanitized += value.slice(index, index + 2);\n index += 1;\n } else if (isHighSurrogate(current) || isLowSurrogate(current)) {\n sanitized += \"�\";\n } else {\n sanitized += value[index];\n }\n }\n return sanitized;\n}\n\nfunction takeWholeGraphemesFromStart(segments: string[], maxCharacters: number): string {\n const selected: string[] = [];\n let characters = 0;\n for (const segment of segments) {\n const segmentCharacters = codePointLength(segment);\n if (characters + segmentCharacters > maxCharacters) break;\n selected.push(segment);\n characters += segmentCharacters;\n }\n while (selected.at(-1)?.trim().length === 0) selected.pop();\n return selected.join(\"\");\n}\n\nfunction takeWholeGraphemesFromEnd(segments: string[], maxCharacters: number): string {\n const selected: string[] = [];\n let characters = 0;\n for (let index = segments.length - 1; index >= 0; index -= 1) {\n const segment = segments[index];\n if (!segment) continue;\n const segmentCharacters = codePointLength(segment);\n if (characters + segmentCharacters > maxCharacters) break;\n selected.unshift(segment);\n characters += segmentCharacters;\n }\n while (selected[0]?.trim().length === 0) selected.shift();\n while (selected.at(-1)?.trim().length === 0) selected.pop();\n return selected.join(\"\");\n}\n\nfunction codePointLength(value: string): number {\n let characters = 0;\n for (const _character of value) characters += 1;\n return characters;\n}\n\nfunction startsWithRegionalIndicator(value: string): boolean {\n const codePoint = value.codePointAt(0);\n return codePoint !== undefined && codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff;\n}\n\nfunction isHighSurrogate(codeUnit: number): boolean {\n return codeUnit >= 0xd800 && codeUnit <= 0xdbff;\n}\n\nfunction isLowSurrogate(codeUnit: number): boolean {\n return codeUnit >= 0xdc00 && codeUnit <= 0xdfff;\n}\n\nfunction QueuePrompt({\n prompt,\n annotations,\n index,\n onDisclosureChange,\n}: {\n prompt: string;\n annotations: readonly TimelineAnnotation[];\n index: number;\n onDisclosureChange: (expanded: boolean) => void;\n}) {\n const [expanded, setExpanded] = useState(false);\n const fullContentId = useId();\n const preview = useMemo(\n () =>\n prompt.length === 0 && annotations.length > 0\n ? annotationOnlyQueuePreview(annotations.length)\n : queuePromptPreview(prompt, QUEUE_ROW_PREVIEW_CHARACTERS),\n [annotations.length, prompt],\n );\n\n return (\n <div className=\"w-full min-w-0 max-w-full\">\n {prompt ? (\n <div\n aria-label={`Queued prompt ${index + 1} summary: ${preview.summary}`}\n className=\"max-w-full overflow-hidden text-og-control leading-5 text-fg\"\n data-testid={`queue-prompt-preview-${index + 1}`}\n dir=\"auto\"\n role=\"note\"\n >\n <span\n aria-hidden=\"true\"\n className=\"flex min-w-0 max-w-full items-baseline gap-2 sm:block\"\n >\n <span\n className={`${preview.isFallback ? \"\" : \"line-clamp-1 sm:line-clamp-2\"} min-w-0 flex-1 whitespace-pre-wrap break-all [unicode-bidi:plaintext]`}\n data-testid={`queue-prompt-start-${index + 1}`}\n dir=\"auto\"\n >\n {preview.visibleStart}\n </span>\n {preview.visibleIdentity && preview.visibleIdentityLabel ? (\n <span\n className=\"flex min-w-0 max-w-[70%] shrink-0 items-center gap-1 text-og-xs leading-4 text-fg-muted sm:mt-0.5 sm:max-w-full\"\n data-testid={`queue-prompt-identity-row-${index + 1}`}\n >\n <span className=\"shrink-0 font-medium text-fg-subtle\">\n {preview.visibleIdentityLabel}\n </span>\n <span\n className=\"min-w-0 overflow-hidden text-ellipsis whitespace-nowrap font-mono [unicode-bidi:plaintext]\"\n data-testid={`queue-prompt-identity-${index + 1}`}\n dir=\"auto\"\n >\n {preview.visibleIdentity}\n </span>\n </span>\n ) : null}\n </span>\n </div>\n ) : null}\n {annotations.length > 0 ? (\n <TimelineAnnotationsChip\n annotations={annotations}\n className={prompt ? \"mt-1\" : undefined}\n />\n ) : null}\n {prompt ? (\n <button\n type=\"button\"\n aria-controls={fullContentId}\n aria-expanded={expanded}\n aria-label={`${expanded ? \"Hide\" : \"Show\"} full content for queued prompt ${index + 1}`}\n className=\"mt-1 inline-flex min-h-7 min-w-0 max-w-full items-center gap-1 whitespace-normal rounded-md text-left text-og-xs font-medium text-fg outline-hidden focus-visible:ring-2 focus-visible:ring-ring/40 pointer-coarse:min-h-[44px]\"\n data-testid={`queue-prompt-disclosure-${index + 1}`}\n onClick={() => {\n const next = !expanded;\n setExpanded(next);\n onDisclosureChange(next);\n }}\n >\n <ChevronDownIcon\n aria-hidden=\"true\"\n className={`size-3 shrink-0 transition-transform ${expanded ? \"rotate-180\" : \"\"}`}\n />\n {expanded ? \"Hide full prompt\" : \"View full prompt\"}\n </button>\n ) : null}\n {expanded && prompt ? (\n <pre\n id={fullContentId}\n role=\"region\"\n aria-label={`Full content for queued prompt ${index + 1}`}\n className=\"mt-1.5 max-h-64 w-full min-w-0 max-w-full overflow-auto overscroll-contain rounded-md border border-border bg-surface-2/60 p-2 whitespace-pre-wrap break-all font-mono text-og-control leading-5 text-fg [unicode-bidi:plaintext]\"\n data-testid={`queue-prompt-full-${index + 1}`}\n dir=\"auto\"\n tabIndex={0}\n >\n {prompt}\n </pre>\n ) : null}\n </div>\n );\n}\n\nfunction ReadOnlyQueueRow({\n turn,\n index,\n attachedInputs,\n onDisclosureChange,\n}: {\n turn: SessionTurn;\n index: number;\n attachedInputs: SessionPendingInputPreview[];\n onDisclosureChange: (expanded: boolean) => void;\n}) {\n return (\n <li className=\"flex min-w-0 items-start gap-2 bg-surface px-3 py-2\">\n <span className=\"mt-1 shrink-0 font-mono text-og-xs text-fg-subtle\">{index + 1}</span>\n <div className=\"min-w-0 flex-1\">\n <QueuePrompt\n prompt={turn.prompt}\n annotations={turn.annotations ?? []}\n index={index}\n onDisclosureChange={onDisclosureChange}\n />\n {attachedInputs.length > 0 ? (\n <PendingMachineInputs inputs={attachedInputs} attached />\n ) : null}\n <div className=\"mt-1 flex min-w-0 items-center gap-2 overflow-hidden whitespace-nowrap text-og-xs text-fg-subtle\">\n {turn.resources.length > 0 ? (\n <span className=\"shrink-0\">\n {turn.resources.length} resource{turn.resources.length === 1 ? \"\" : \"s\"}\n </span>\n ) : null}\n {turn.tools.length > 0 ? (\n <span className=\"shrink-0\">\n {turn.tools.length} tool{turn.tools.length === 1 ? \"\" : \"s\"}\n </span>\n ) : null}\n <span className=\"min-w-0 truncate\">{turn.model}</span>\n <span className=\"shrink-0\">{turn.reasoningEffort}</span>\n </div>\n </div>\n </li>\n );\n}\n\nfunction SortableQueueRow({\n turn,\n index,\n count,\n attachedInputs,\n pending,\n reorderDisabled,\n confirmingReplace,\n keyboardDragging,\n portalTokenStyle,\n onHandleKeyDown,\n onMove,\n onEdit,\n onConfirmReplace,\n onCancelReplace,\n onSteer,\n onDelete,\n onDisclosureChange,\n}: {\n turn: SessionTurn;\n index: number;\n count: number;\n attachedInputs: SessionPendingInputPreview[];\n pending: QueueMutationKind | null;\n reorderDisabled: boolean;\n confirmingReplace: boolean;\n keyboardDragging: boolean;\n portalTokenStyle: PortalTokenStyle;\n onHandleKeyDown: (event: ReactKeyboardEvent<HTMLButtonElement>) => void;\n onMove: (index: number) => void;\n onEdit?: (() => void) | undefined;\n onConfirmReplace: () => void;\n onCancelReplace: () => void;\n onSteer: () => void;\n onDelete: () => void;\n onDisclosureChange: (expanded: boolean) => void;\n}) {\n const sortable = useSortable({\n id: turn.id,\n disabled: reorderDisabled || keyboardDragging,\n });\n return (\n <li\n data-queue-turn-id={turn.id}\n ref={sortable.setNodeRef}\n style={{\n transform: CSS.Transform.toString(sortable.transform),\n transition: sortable.transition,\n }}\n className={`bg-surface ${sortable.isDragging || keyboardDragging ? \"relative z-10 shadow-lg ring-1 ring-brand/40\" : \"\"}`}\n >\n <div className=\"grid min-w-0 grid-cols-[auto_minmax(0,1fr)] items-start gap-x-1.5 px-2 py-1.5 sm:grid-cols-[auto_auto_minmax(0,1fr)_auto] sm:gap-x-2 sm:px-3 sm:py-2\">\n <button\n data-queue-handle\n ref={sortable.setActivatorNodeRef}\n type=\"button\"\n {...sortable.attributes}\n {...sortable.listeners}\n onKeyDown={onHandleKeyDown}\n disabled={reorderDisabled}\n className=\"col-start-1 row-start-1 mt-0.5 inline-flex size-7 shrink-0 touch-none items-center justify-center rounded-md text-fg-subtle hover:bg-surface-2 hover:text-fg focus-visible:ring-2 focus-visible:ring-ring/40 pointer-coarse:size-[44px]\"\n aria-label={`Reorder queued prompt ${index + 1}`}\n title=\"Drag to reorder. Press Space, arrows, then Space to drop.\"\n >\n <GripVerticalIcon className=\"size-3.5\" />\n </button>\n <span className=\"col-start-2 row-start-1 mt-1 shrink-0 font-mono text-og-xs text-fg-subtle\">\n {index + 1}\n </span>\n <div className=\"col-span-full row-start-2 min-w-0 sm:col-span-1 sm:col-start-3 sm:row-start-1\">\n <QueuePrompt\n prompt={turn.prompt}\n annotations={turn.annotations ?? []}\n index={index}\n onDisclosureChange={onDisclosureChange}\n />\n {attachedInputs.length > 0 ? (\n <PendingMachineInputs inputs={attachedInputs} attached />\n ) : null}\n <div className=\"mt-1 flex min-w-0 items-center gap-2 overflow-hidden whitespace-nowrap text-og-xs text-fg-subtle\">\n {turn.resources.length > 0 ? (\n <span className=\"shrink-0\">\n {turn.resources.length} resource{turn.resources.length === 1 ? \"\" : \"s\"}\n </span>\n ) : null}\n {turn.tools.length > 0 ? (\n <span className=\"shrink-0\">\n {turn.tools.length} tool{turn.tools.length === 1 ? \"\" : \"s\"}\n </span>\n ) : null}\n <span className=\"min-w-0 truncate\">{turn.model}</span>\n <span className=\"shrink-0\">{turn.reasoningEffort}</span>\n </div>\n {pending ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"mt-1 flex items-center gap-1.5 text-og-xs font-medium text-status-waiting\"\n data-testid={`queue-mutation-${pending}`}\n >\n <Loader2Icon\n aria-hidden=\"true\"\n className=\"size-3 shrink-0 animate-spin motion-reduce:animate-none\"\n />\n {queueMutationPendingLabel(pending)}\n </div>\n ) : null}\n </div>\n <div className=\"col-span-full row-start-3 flex min-w-0 items-start justify-end gap-1.5 sm:col-span-1 sm:col-start-4 sm:row-start-1 sm:gap-2\">\n <button\n type=\"button\"\n disabled={pending !== null}\n onClick={onSteer}\n aria-label={`Steer queued prompt ${index + 1}`}\n title=\"Steer — interrupt the current turn and send this message now\"\n className=\"inline-flex h-7 shrink-0 items-center justify-center gap-1 rounded-md px-2 text-og-control font-medium text-fg outline-hidden transition-[background-color] hover:bg-surface-2 focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50 pointer-coarse:min-h-[44px] pointer-coarse:min-w-[44px]\"\n >\n {pending === \"steer\" ? (\n <Loader2Icon className=\"size-3.5 animate-spin\" />\n ) : (\n <ZapIcon className=\"size-3.5\" />\n )}\n <span className=\"hidden sm:inline\">Steer</span>\n </button>\n <button\n type=\"button\"\n disabled={pending !== null}\n onClick={onDelete}\n aria-label={`Delete queued prompt ${index + 1}`}\n title=\"Delete this queued prompt\"\n className=\"inline-flex size-7 shrink-0 items-center justify-center rounded-md outline-hidden transition-colors hover:bg-surface-2 hover:text-status-failed focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50 pointer-coarse:size-[44px]\"\n >\n {pending === \"delete\" ? (\n <Loader2Icon className=\"size-3.5 animate-spin\" />\n ) : (\n <Trash2Icon className=\"size-3.5\" />\n )}\n </button>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n disabled={pending !== null}\n aria-label={`More actions for queued prompt ${index + 1}`}\n className=\"inline-flex size-7 shrink-0 items-center justify-center rounded-md outline-hidden transition-colors hover:bg-surface-2 focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50 pointer-coarse:size-[44px]\"\n >\n {pending && pending !== \"steer\" && pending !== \"delete\" ? (\n <Loader2Icon className=\"size-3.5 animate-spin\" />\n ) : (\n <EllipsisIcon className=\"size-3.5\" />\n )}\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"end\"\n sideOffset={4}\n className=\"og-root z-50 w-48 max-w-[calc(100vw-16px)] rounded-md border border-border bg-surface p-1 text-og-control text-fg shadow-lg\"\n style={portalTokenStyle}\n data-testid={`queue-actions-menu-${index + 1}`}\n >\n {onEdit ? (\n <>\n <DropdownMenu.Item\n className=\"flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-hidden focus:bg-surface-2 pointer-coarse:min-h-[44px]\"\n onSelect={onEdit}\n >\n <PencilIcon className=\"size-3.5\" /> Edit in composer\n </DropdownMenu.Item>\n <DropdownMenu.Separator className=\"my-1 h-px bg-border\" />\n </>\n ) : null}\n <DropdownMenu.Item\n className=\"flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-hidden focus:bg-surface-2 data-[disabled]:opacity-50 pointer-coarse:min-h-[44px]\"\n disabled={index === 0}\n onSelect={() => onMove(0)}\n >\n <ArrowUpToLineIcon className=\"size-3.5\" /> Move to top\n </DropdownMenu.Item>\n <DropdownMenu.Item\n className=\"flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-hidden focus:bg-surface-2 data-[disabled]:opacity-50 pointer-coarse:min-h-[44px]\"\n disabled={index === 0}\n onSelect={() => onMove(index - 1)}\n >\n Move up\n </DropdownMenu.Item>\n <DropdownMenu.Item\n className=\"flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-hidden focus:bg-surface-2 data-[disabled]:opacity-50 pointer-coarse:min-h-[44px]\"\n disabled={index === count - 1}\n onSelect={() => onMove(index + 1)}\n >\n Move down\n </DropdownMenu.Item>\n <DropdownMenu.Item\n className=\"flex min-w-0 cursor-default items-center gap-2 whitespace-normal break-words rounded-sm px-2 py-1.5 outline-hidden focus:bg-surface-2 data-[disabled]:opacity-50 pointer-coarse:min-h-[44px]\"\n disabled={index === count - 1}\n onSelect={() => onMove(count - 1)}\n >\n <ArrowDownToLineIcon className=\"size-3.5\" /> Move to bottom\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n </div>\n {confirmingReplace ? (\n <div className=\"mx-3 mb-2 rounded-md border border-status-waiting/30 bg-status-waiting/10 p-2 text-og-control text-fg\">\n <p>Your composer already has a draft. Replace it with this queued prompt?</p>\n <p className=\"mt-0.5 text-fg-muted\">\n The current draft will be permanently discarded; this queued prompt is preserved until\n you confirm.\n </p>\n <div className=\"mt-2 flex justify-end gap-1.5\">\n <button\n type=\"button\"\n className=\"rounded-md px-2 py-1 font-medium hover:bg-surface-2 focus-visible:ring-2 focus-visible:ring-ring/40\"\n onClick={onCancelReplace}\n >\n Keep current draft\n </button>\n <button\n type=\"button\"\n className=\"rounded-md bg-brand px-2 py-1 font-medium text-white hover:bg-brand/90 focus-visible:ring-2 focus-visible:ring-ring/40\"\n onClick={onConfirmReplace}\n >\n Replace and edit\n </button>\n </div>\n </div>\n ) : null}\n </li>\n );\n}\n\nfunction queueMutationPendingLabel(kind: QueueMutationKind): string {\n switch (kind) {\n case \"move\":\n return \"Saving new position…\";\n case \"edit\":\n return \"Moving to composer…\";\n case \"steer\":\n return \"Changing direction…\";\n case \"delete\":\n return \"Deleting…\";\n }\n}\n\nconst verticalOnly: Modifier = ({ transform }) => ({ ...transform, x: 0 });\n\nfunction focusQueueTurn(surface: HTMLElement | null, turnId: string): void {\n window.requestAnimationFrame(() => {\n surface\n ?.querySelector<HTMLElement>(`[data-queue-turn-id=\"${turnId}\"] [data-queue-handle]`)\n ?.focus();\n });\n}\n\nfunction focusAfterQueueRemoval(\n surface: HTMLElement | null,\n previousIndex: number,\n onRequestComposerFocus?: (() => void) | undefined,\n): void {\n window.requestAnimationFrame(() => {\n const handles = surface?.querySelectorAll<HTMLElement>(\"[data-queue-handle]\") ?? [];\n const nearest = handles[Math.min(previousIndex, Math.max(0, handles.length - 1))];\n if (nearest) {\n nearest.focus();\n return;\n }\n if (onRequestComposerFocus) {\n onRequestComposerFocus();\n return;\n }\n document\n .querySelector<HTMLTextAreaElement>('textarea[aria-label=\"Message the agent\"]')\n ?.focus();\n });\n}\n"],"mappings":"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","names":["summary"]}
|
|
@@ -78,6 +78,8 @@ export declare function SessionRealtimeControl(props: {
|
|
|
78
78
|
* `none` never attaches a model menu to the bar button.
|
|
79
79
|
*/
|
|
80
80
|
modelMenu?: "split" | "split-desktop" | "none" | undefined;
|
|
81
|
+
/** Explicitly expose low-level controller diagnostics; disabled by default. */
|
|
82
|
+
showDiagnostics?: boolean | undefined;
|
|
81
83
|
/** Deterministic browser-test/demo seam. Production hosts should use the SDK default. */
|
|
82
84
|
controllerFactory?: SessionRealtimeControllerFactory | undefined;
|
|
83
85
|
}): import("react").JSX.Element;
|
|
@@ -91,7 +93,7 @@ export declare function useRealtimeModelSelection(options: {
|
|
|
91
93
|
selectedModel: RealtimeModelOption;
|
|
92
94
|
selectModel: (value: string) => void;
|
|
93
95
|
};
|
|
94
|
-
|
|
96
|
+
type NewSessionRealtimeControlProps = {
|
|
95
97
|
client?: RealtimeControllerClient | undefined;
|
|
96
98
|
workspaceId?: string | undefined;
|
|
97
99
|
codexConnected: boolean;
|
|
@@ -109,7 +111,8 @@ export declare function NewSessionRealtimeControl(props: {
|
|
|
109
111
|
* `none` never attaches a model menu to the bar button.
|
|
110
112
|
*/
|
|
111
113
|
modelMenu?: "split" | "split-desktop" | "none" | undefined;
|
|
112
|
-
}
|
|
114
|
+
};
|
|
115
|
+
export declare function NewSessionRealtimeControl(props: NewSessionRealtimeControlProps): import("react").JSX.Element;
|
|
113
116
|
export declare function RealtimeVoiceControl(props: {
|
|
114
117
|
snapshot: SessionRealtimeControllerSnapshot;
|
|
115
118
|
canStart: boolean;
|
|
@@ -125,7 +128,7 @@ export declare function RealtimeVoiceControl(props: {
|
|
|
125
128
|
* `none` = start button only.
|
|
126
129
|
*/
|
|
127
130
|
modelMenu?: "split" | "split-desktop" | "none" | undefined;
|
|
128
|
-
showDiagnostics?: boolean;
|
|
131
|
+
showDiagnostics?: boolean | undefined;
|
|
129
132
|
/** Extra classes on the in-bar mute cluster (e.g. `max-sm:hidden` when mutes live in “+”). */
|
|
130
133
|
muteControlsClassName?: string | undefined;
|
|
131
134
|
audioRef: RefObject<HTMLAudioElement | null>;
|