@tangle-network/sandbox-cli 0.21.64 → 0.21.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/README.md +31 -3
  2. package/SKILL.md +29 -1
  3. package/dist/graph-native-CS_TmaCK.mjs +1 -0
  4. package/dist/graph-viewer/Analytics-bWsqhurt.js +1001 -0
  5. package/dist/graph-viewer/{AnswerStrip-DhwqOyxI.js → AnswerStrip-COxV7gLW.js} +2 -2
  6. package/dist/graph-viewer/Checks-CQGmKcQ0.js +164 -0
  7. package/dist/graph-viewer/Conversations-DgCshBAf.js +627 -0
  8. package/dist/graph-viewer/{Files-DtZhf0ii.js → Files-CvIOGrAs.js} +81 -90
  9. package/dist/graph-viewer/LiveRun-DHmsr6F7.js +311 -0
  10. package/dist/graph-viewer/{Outputs-QET3nPPp.js → Outputs-rwBg_x36.js} +4 -4
  11. package/dist/graph-viewer/Overview-C150tkVa.js +194 -0
  12. package/dist/graph-viewer/{RunOverview-DJQDAMIx.js → RunOverview-CSqsunqf.js} +2 -2
  13. package/dist/graph-viewer/RunPage-F_prVwiV.js +286 -0
  14. package/dist/graph-viewer/Timeline-BFDywlmz.js +335 -0
  15. package/dist/graph-viewer/Today-BdDuqZGF.js +623 -0
  16. package/dist/graph-viewer/Topology-SAfGtd5u.js +238 -0
  17. package/dist/graph-viewer/Traces-BYqXaS_s.js +254 -0
  18. package/dist/graph-viewer/{WallPages-4d9QUZDq.js → WallPages-MM70VZrC.js} +48 -30
  19. package/dist/graph-viewer/agent-runtime.js +55 -55
  20. package/dist/graph-viewer/{data-BJmP7F1M.js → data-DTGmre1W.js} +31 -27
  21. package/dist/graph-viewer/harness-sessions.js +1 -1
  22. package/dist/graph-viewer/index.js +1357 -1392
  23. package/dist/graph-viewer/{lazy-pages-DM0cZM10.js → lazy-pages-BYuq_L_n.js} +9 -5
  24. package/dist/graph-viewer/{outputs-model-CGdvjkQh.js → outputs-model-CHTx8rMz.js} +2 -2
  25. package/dist/graph-viewer/{viewer/plain-words-CgvxtEOa.js → plain-words-BrMHl0On.js} +9 -4
  26. package/dist/graph-viewer/receipt.js +2 -2
  27. package/dist/graph-viewer/record-CsP_3NJS.js +612 -0
  28. package/dist/graph-viewer/record-part-CuT9Xw37.js +334 -0
  29. package/dist/graph-viewer/record.js +2 -336
  30. package/dist/graph-viewer/report-viewer.js +65 -65
  31. package/dist/graph-viewer/report.js +1 -1
  32. package/dist/graph-viewer/research-publication.js +1 -1
  33. package/dist/graph-viewer/{run-files-C1NgzM0l.js → run-files-BckQDdTD.js} +1 -1
  34. package/dist/graph-viewer/{run-receipt-Bvi4-KVM.js → run-receipt-Bt2iXJUy.js} +1 -0
  35. package/dist/graph-viewer/schemas/agent-workspace.play.v1.json +3 -0
  36. package/dist/graph-viewer/schemas/agent-workspace.plays.v1.json +2 -0
  37. package/dist/graph-viewer/schemas/agent-workspace.run.v1.json +1 -0
  38. package/dist/graph-viewer/styles.css +4559 -2385
  39. package/dist/graph-viewer/trace-spans.js +1 -1
  40. package/dist/graph-viewer/ui-xa5w5bEN.js +889 -0
  41. package/dist/graph-viewer/viewer/{AgentGraphCanvas-CMdOlSlh-4EervjeC.js → AgentGraphCanvas-B74GN1o6-BZEumF7-.js} +2610 -2707
  42. package/dist/graph-viewer/viewer/Analytics-E3XS570U.js +1002 -0
  43. package/dist/graph-viewer/viewer/{AnswerStrip-CGUyXuYH.js → AnswerStrip-B7xMU57A.js} +2 -2
  44. package/dist/graph-viewer/viewer/Checks-CJ5XSHbv.js +165 -0
  45. package/dist/graph-viewer/viewer/Conversations-AX8G7Qyl.js +904 -0
  46. package/dist/graph-viewer/viewer/Files-DxL1576V.js +630 -0
  47. package/dist/graph-viewer/viewer/LiveRun-B-BckyEj.js +820 -0
  48. package/dist/graph-viewer/viewer/{Outputs-CumGyjQo.js → Outputs-BoIpgfMv.js} +24 -23
  49. package/dist/graph-viewer/viewer/Overview-Dzg5XJgy.js +436 -0
  50. package/dist/graph-viewer/viewer/RunPage-NtevWXBs.js +285 -0
  51. package/dist/graph-viewer/viewer/{Scores-ZS16yk0n.js → Scores-Dgv4WePL.js} +3 -3
  52. package/dist/graph-viewer/viewer/Timeline-CzY3LVDu.js +335 -0
  53. package/dist/graph-viewer/viewer/Today-Bi9IIwuh.js +623 -0
  54. package/dist/graph-viewer/viewer/Topology-CzjqSFXH.js +239 -0
  55. package/dist/graph-viewer/viewer/Traces-CMX0H1VU.js +254 -0
  56. package/dist/graph-viewer/viewer/{WallPages-CzWpyIfp.js → WallPages-Clj4bORg.js} +50 -32
  57. package/dist/graph-viewer/viewer/addon-webgl-BSCscllv.js +4027 -0
  58. package/dist/graph-viewer/viewer/agent-record-BrP-ENHg.css +2 -0
  59. package/dist/graph-viewer/viewer/{bot-D6Nrej7Z.js → bot-BaQU59LG.js} +1 -1
  60. package/dist/graph-viewer/viewer/{chevron-right-D_5IKLxu.js → chevron-right-Xn05jYLT.js} +1 -1
  61. package/dist/graph-viewer/viewer/{createLucideIcon-yH0cxLMy.js → createLucideIcon-BSphcoOJ.js} +1 -1
  62. package/dist/graph-viewer/viewer/dashboard-D3JhmRhe-DSl0zhkw.js +371 -0
  63. package/dist/graph-viewer/viewer/{data-CkWfWr7i.js → data-CVHeKhrh.js} +144 -139
  64. package/dist/graph-viewer/viewer/dist-4_KJz8ZM.js +349 -0
  65. package/dist/graph-viewer/viewer/dist-Dy-wrdTt.js +1615 -0
  66. package/dist/graph-viewer/viewer/es2015-utW4DTOJ.js +3506 -0
  67. package/dist/graph-viewer/viewer/{final-output-kwY11u9X.js → final-output-BYT-g-9j.js} +1 -1
  68. package/dist/graph-viewer/viewer/flow-waterfall-model-DvrgPLGS-BdThSFH-.js +2696 -0
  69. package/dist/graph-viewer/viewer/git-branch-BzTbIcYL.js +28 -0
  70. package/dist/graph-viewer/viewer/{highlights-Btsi5OXl.js → highlights-DWeSCtiR.js} +4 -4
  71. package/dist/graph-viewer/viewer/jsx-runtime-DPT6sCLq.js +319 -0
  72. package/dist/graph-viewer/viewer/lazy-pages-ChiMJ8r_.js +803 -0
  73. package/dist/graph-viewer/viewer/{markdown-CX_sVrXB.js → markdown-lADwhD7y.js} +2324 -2608
  74. package/dist/graph-viewer/viewer/model-brand-bTcMjQtB-RSb7EbGB.js +476 -0
  75. package/dist/graph-viewer/viewer/{page-header-Brq611fd.js → page-header-QbUg8F8i.js} +12 -11
  76. package/dist/graph-viewer/{plain-words-CgvxtEOa.js → viewer/plain-words-BrMHl0On.js} +9 -4
  77. package/dist/graph-viewer/viewer/primitives-znfPK9NP-B6UO7uDr.js +346 -0
  78. package/dist/graph-viewer/viewer/react-DQ7E2Epi.js +4254 -0
  79. package/dist/graph-viewer/viewer/{react-dom-t1L4_-il.js → react-dom-BEusmvQH.js} +1 -1
  80. package/dist/graph-viewer/viewer/record-DZnT6SWN-H-ul3U3a.js +3523 -0
  81. package/dist/graph-viewer/viewer/record-W39D5MO-.js +1 -0
  82. package/dist/graph-viewer/viewer/record-part-CbweyYoV.js +335 -0
  83. package/dist/graph-viewer/viewer/{segmented-control-BaJmvTNd.js → segmented-control-Di1mbQlP.js} +27 -26
  84. package/dist/graph-viewer/viewer/{shiki-Qnby7Sh6.js → shiki-BfNNlmfZ.js} +15 -15
  85. package/dist/graph-viewer/viewer/status-meta-S0kV_RDp.js +273 -0
  86. package/dist/graph-viewer/viewer/{stream-tokenizer-CWtnjmRd.js → stream-tokenizer-B5wWaM3U.js} +12 -12
  87. package/dist/graph-viewer/viewer/{themes-1i1fzpRk.js → themes-DuRxHiga.js} +1 -1
  88. package/dist/graph-viewer/viewer/ui-Co03nZUX.js +889 -0
  89. package/dist/graph-viewer/viewer/utils-BuObIC0n.js +1815 -0
  90. package/dist/graph-viewer/viewer/workbench-E6_5q_oL.js +28351 -0
  91. package/dist/graph-viewer/viewer/workflows--mZpHYqo.js +3298 -0
  92. package/dist/graph-viewer/viewer/workspace-cKs9sGEO.js +2468 -0
  93. package/dist/graph-viewer/{workspace-model-Ewf17pTW.js → workspace-model-BkPl_J8E.js} +1 -1
  94. package/dist/graph-viewer/workspace-viewer.js +7452 -7489
  95. package/dist/graph-viewer/workspace.js +1 -1
  96. package/dist/index.mjs +27 -22
  97. package/package.json +9 -8
  98. package/dist/graph-viewer/Analytics-DFWW8Phh.js +0 -938
  99. package/dist/graph-viewer/Checks-qgqV4xgV.js +0 -155
  100. package/dist/graph-viewer/Conversations-CGB45kpj.js +0 -545
  101. package/dist/graph-viewer/LiveRun-C21wUKAY.js +0 -210
  102. package/dist/graph-viewer/Overview-BjeLsA2I.js +0 -506
  103. package/dist/graph-viewer/RunPage-CkkcBEUe.js +0 -258
  104. package/dist/graph-viewer/Timeline-C2Xolk0t.js +0 -293
  105. package/dist/graph-viewer/Today-BVVDtSVN.js +0 -660
  106. package/dist/graph-viewer/Topology-DO5XX8e4.js +0 -545
  107. package/dist/graph-viewer/Traces-BhMxjNgw.js +0 -259
  108. package/dist/graph-viewer/part-events-BrLrg_EV.js +0 -276
  109. package/dist/graph-viewer/record-part-CZal_IMH.js +0 -1408
  110. package/dist/graph-viewer/ui-D8QZRsC3.js +0 -938
  111. package/dist/graph-viewer/viewer/Analytics-DD__nbLm.js +0 -939
  112. package/dist/graph-viewer/viewer/Checks-Ds5M7eAW.js +0 -156
  113. package/dist/graph-viewer/viewer/Conversations-C1n0EBBd.js +0 -819
  114. package/dist/graph-viewer/viewer/Files-Cjr7NMU_.js +0 -448
  115. package/dist/graph-viewer/viewer/LiveRun-uPTkPSjo.js +0 -6772
  116. package/dist/graph-viewer/viewer/Overview-4Umk14_2.js +0 -507
  117. package/dist/graph-viewer/viewer/RunPage-DZlBW7Va.js +0 -257
  118. package/dist/graph-viewer/viewer/Timeline-BnK6-yBR.js +0 -294
  119. package/dist/graph-viewer/viewer/Today-a_-oNigi.js +0 -660
  120. package/dist/graph-viewer/viewer/Topology-CQPCLQT6.js +0 -546
  121. package/dist/graph-viewer/viewer/Traces-C0IGk0L4.js +0 -259
  122. package/dist/graph-viewer/viewer/WorkflowGraph-DZ3xejKE-jRXKeSrg.js +0 -1559
  123. package/dist/graph-viewer/viewer/agent-record-Dw772ROs.css +0 -2
  124. package/dist/graph-viewer/viewer/agent-timeline-Cs9Qbpvo.js +0 -1798
  125. package/dist/graph-viewer/viewer/dist-C1-7EfoW.js +0 -488
  126. package/dist/graph-viewer/viewer/file-text-m7a3piQF.js +0 -47
  127. package/dist/graph-viewer/viewer/jsx-runtime-DQWyJOhv.js +0 -2136
  128. package/dist/graph-viewer/viewer/lazy-pages-BowaGsg-.js +0 -20
  129. package/dist/graph-viewer/viewer/model-brand-bTcMjQtB-fagiBQam.js +0 -723
  130. package/dist/graph-viewer/viewer/popover-CvOAjlnk.js +0 -5329
  131. package/dist/graph-viewer/viewer/react-CY3IbSNO.js +0 -4262
  132. package/dist/graph-viewer/viewer/record-part-D3_Anfpe.js +0 -1329
  133. package/dist/graph-viewer/viewer/terminal-83J_I4Ne.js +0 -52
  134. package/dist/graph-viewer/viewer/ui-C9b1rIUH.js +0 -938
  135. package/dist/graph-viewer/viewer/workspace-CekmOBs3.js +0 -25100
  136. package/dist/graph-viewer/viewer/x-DOc2URqZ.js +0 -56
@@ -0,0 +1,820 @@
1
+ import { i as e } from "./rolldown-runtime-DArdT4gl.js";
2
+ import { n as t, t as n } from "./jsx-runtime-DPT6sCLq.js";
3
+ import { t as r } from "./utils-BuObIC0n.js";
4
+ import { t as i } from "./workbench-E6_5q_oL.js";
5
+ import { y as a } from "./markdown-lADwhD7y.js";
6
+ import { a as o, o as s } from "./record-DZnT6SWN-H-ul3U3a.js";
7
+ import { h as c, n as l, o as u, p as d, t as f, x as p } from "./workflows--mZpHYqo.js";
8
+ import { n as m } from "./status-meta-S0kV_RDp.js";
9
+ import { p as h } from "./data-CVHeKhrh.js";
10
+ import { a as g, d as _ } from "./react-DQ7E2Epi.js";
11
+ import { r as v, t as y } from "./model-brand-bTcMjQtB-RSb7EbGB.js";
12
+ //#region node_modules/.pnpm/@tangle-network+sandbox-ui@2.0.15_b185337ee4bca5ec0279ca525649b58b/node_modules/@tangle-network/sandbox-ui/dist/run-Cl_pQ3pl.js
13
+ var b = n(), x = /* @__PURE__ */ e(t(), 1);
14
+ function S(e) {
15
+ if (e.kind === "pipeline" || e.kind === "model") {
16
+ let t = e.detail ? v(e.detail) : null;
17
+ return t ? /* @__PURE__ */ (0, b.jsx)(y, {
18
+ identity: t,
19
+ size: "sm"
20
+ }) : void 0;
21
+ }
22
+ let t = e.icon ?? (e.kind === "tool" ? e.detail : void 0);
23
+ return t ? /* @__PURE__ */ (0, b.jsx)(l, {
24
+ id: t,
25
+ displayName: t,
26
+ size: 14,
27
+ className: "rounded-[3px]"
28
+ }) : void 0;
29
+ }
30
+ function C({ renderIcon: e = S, ...t }) {
31
+ return /* @__PURE__ */ (0, b.jsx)(g, {
32
+ renderIcon: e,
33
+ ...t
34
+ });
35
+ }
36
+ var w = /* @__PURE__ */ new Set([
37
+ "bash",
38
+ "read",
39
+ "write",
40
+ "edit",
41
+ "glob",
42
+ "grep",
43
+ "list",
44
+ "download",
45
+ "inspect",
46
+ "audit"
47
+ ]), T = (e) => {
48
+ let t = (e ?? "").toLowerCase();
49
+ return w.has(t) ? t : "unknown";
50
+ }, E = (e) => {
51
+ if (e != null) return typeof e == "string" ? e : JSON.stringify(e);
52
+ }, D = (e) => typeof e == "object" && !!e && ("error" in e || e.is_error === !0), O = (e) => {
53
+ try {
54
+ let t = JSON.parse(e);
55
+ return typeof t == "object" && t ? `\`\`\`json\n${e}\n\`\`\`` : e;
56
+ } catch {
57
+ return e;
58
+ }
59
+ };
60
+ function k(e, t) {
61
+ let n = [...e];
62
+ for (let e of t) {
63
+ let t = Date.parse(e.at), { event: r } = e, i = n[n.length - 1];
64
+ if (r.kind === "text" && r.text) i?.kind === "message" && i.role === "assistant" && !i.sealed ? n[n.length - 1] = {
65
+ ...i,
66
+ content: i.content + r.text
67
+ } : n.push({
68
+ id: `m-${e.seq}`,
69
+ at: t,
70
+ kind: "message",
71
+ role: "assistant",
72
+ content: r.text
73
+ });
74
+ else if (r.kind === "user" && r.text) n.push({
75
+ id: `u-${e.seq}`,
76
+ at: t,
77
+ kind: "message",
78
+ role: "user",
79
+ content: r.text
80
+ });
81
+ else if (r.kind === "notice" && r.text) r.provenance === "delegated-input" ? n.push({
82
+ id: `u-${e.seq}`,
83
+ at: t,
84
+ kind: "message",
85
+ role: "user",
86
+ content: O(r.text)
87
+ }) : r.provenance === "recorded-result" ? n.push({
88
+ id: `m-${e.seq}`,
89
+ at: t,
90
+ kind: "message",
91
+ role: "assistant",
92
+ content: O(r.text),
93
+ sealed: !0
94
+ }) : n.push({
95
+ id: `n-${e.seq}`,
96
+ at: t,
97
+ kind: "notice",
98
+ text: r.text
99
+ });
100
+ else if (r.kind === "reasoning" && r.text) i?.kind === "reasoning" ? n[n.length - 1] = {
101
+ ...i,
102
+ text: i.text + r.text
103
+ } : n.push({
104
+ id: `r-${e.seq}`,
105
+ at: t,
106
+ kind: "reasoning",
107
+ text: r.text
108
+ });
109
+ else if (r.kind === "tool-call") {
110
+ let i = r.toolCallId ?? `t-${e.seq}`;
111
+ n.push({
112
+ id: i,
113
+ at: t,
114
+ kind: "tool",
115
+ call: {
116
+ id: i,
117
+ type: T(r.toolName),
118
+ label: r.toolName ?? "tool",
119
+ status: "running",
120
+ detail: E(r.args)
121
+ }
122
+ });
123
+ } else if (r.kind === "tool-result") {
124
+ let e = n.findIndex((e) => e.kind === "tool" && e.call.id === r.toolCallId), i = n[e];
125
+ i?.kind === "tool" && (n[e] = {
126
+ ...i,
127
+ call: {
128
+ ...i.call,
129
+ status: D(r.result) ? "error" : "success",
130
+ output: E(r.result),
131
+ duration: Math.max(0, t - i.at)
132
+ }
133
+ });
134
+ }
135
+ }
136
+ return n;
137
+ }
138
+ function A(e, t) {
139
+ switch (t.type) {
140
+ case "reset": return {
141
+ generation: t.generation,
142
+ entries: [],
143
+ lastSeq: 0,
144
+ alive: !0
145
+ };
146
+ case "rows": {
147
+ let n = t.generation !== void 0 && t.generation !== e.generation ? {
148
+ entries: [],
149
+ lastSeq: 0
150
+ } : e, r = t.rows.filter((e) => e.seq > n.lastSeq);
151
+ return {
152
+ generation: t.generation ?? e.generation,
153
+ entries: k(n.entries, r),
154
+ lastSeq: r.reduce((e, t) => Math.max(e, t.seq), n.lastSeq),
155
+ alive: t.alive ?? e.alive,
156
+ error: void 0
157
+ };
158
+ }
159
+ case "end": return {
160
+ ...e,
161
+ alive: !1,
162
+ error: void 0
163
+ };
164
+ case "error": return {
165
+ ...e,
166
+ error: t.message
167
+ };
168
+ case "unreachable": return {
169
+ ...e,
170
+ error: "The agent stream is unreachable; the viewer may be closed."
171
+ };
172
+ }
173
+ }
174
+ function j(e, t) {
175
+ let [n, r] = (0, x.useReducer)(A, {
176
+ entries: [],
177
+ lastSeq: 0,
178
+ alive: !1
179
+ });
180
+ return (0, x.useEffect)(() => {
181
+ if (!e || !t && typeof EventSource > "u") return;
182
+ r({ type: "reset" });
183
+ let n = 0, i = !1, a, o, s = () => {
184
+ let c = new URL(e, globalThis.location?.href);
185
+ n > 0 && c.searchParams.set("after", String(n)), a = t ? t(c.toString(), (e) => {
186
+ !i && !e && r({ type: "unreachable" });
187
+ }) : new EventSource(c.toString());
188
+ let l = !1;
189
+ t || (a.onopen = () => {
190
+ l = !0;
191
+ }), a.addEventListener("rows", (e) => {
192
+ let t = JSON.parse(e.data);
193
+ n = Math.max(n, t.lastSeq ?? 0, ...t.events.map((e) => e.seq)), r({
194
+ type: "rows",
195
+ generation: t.generation,
196
+ rows: t.events,
197
+ alive: t.alive
198
+ });
199
+ }), a.addEventListener("reset", (e) => {
200
+ n = 0, r({
201
+ type: "reset",
202
+ generation: JSON.parse(e.data).generation
203
+ });
204
+ }), a.addEventListener("end", () => {
205
+ i = !0, a?.close(), r({ type: "end" });
206
+ }), t || (a.onerror = () => {
207
+ a?.close(), !i && (l || r({ type: "unreachable" }), o = setTimeout(s, 1e3));
208
+ });
209
+ };
210
+ return s(), () => {
211
+ i = !0, clearTimeout(o), a?.close();
212
+ };
213
+ }, [e, t]), n;
214
+ }
215
+ function M(e, t) {
216
+ for (let n = e; n; n = n.parentId ? t.get(n.parentId) : void 0) if (n.kind === "pipeline") return n;
217
+ }
218
+ function N(e, t, n, r, i, a = []) {
219
+ let o = [], s = [], c = /* @__PURE__ */ new Set(), l = new Set(e.flatMap((e) => e.kind === "pipeline" && e.id ? [e.id] : [])), u = /* @__PURE__ */ new Map();
220
+ for (let [i, a] of e.entries()) {
221
+ if (a.kind === "pipeline" || n !== null && a.startMs > n) continue;
222
+ let e = M(a, t);
223
+ if (!e?.id) continue;
224
+ let o = u.get(e.id) ?? [], s = [{
225
+ suffix: "start",
226
+ label: "Started ",
227
+ time: a.startMs
228
+ }];
229
+ a.status !== "running" && a.endMs !== a.startMs && (n === null || a.endMs <= n) && s.push({
230
+ suffix: "end",
231
+ label: "Recorded ",
232
+ time: a.endMs
233
+ });
234
+ for (let e of s) o.push({
235
+ id: (a.id ?? String(i)) + ":" + e.suffix,
236
+ label: e.label + a.name,
237
+ at: r == null || !Number.isFinite(r) ? void 0 : r + e.time
238
+ });
239
+ u.set(e.id, o);
240
+ }
241
+ for (let a of e) {
242
+ if (a.kind !== "pipeline" || !a.id || c.has(a.id) || n !== null && a.startMs > n) continue;
243
+ c.add(a.id);
244
+ let e = i?.[a.id], l = n !== null && (a.endMs > n || a.status === "running") ? "running" : m(a.status ?? "unknown"), f = (a.activityAt ?? []).reduce((e, t) => Number.isFinite(t) && (n === null || t <= n) ? Math.max(e, t) : e, -Infinity), p = (e?.events ?? u.get(a.id) ?? []).filter((e) => n === null || r != null && e.at != null && e.at <= r + n).sort((e, t) => (e.at ?? 0) - (t.at ?? 0)), h = d({
245
+ events: p,
246
+ lastActivityAt: r != null && Number.isFinite(r) && Number.isFinite(f) ? r + f : n === null ? e?.lastActivityAt : void 0,
247
+ medianEventGapMs: a.medianEventGapMs ?? (n === null ? e?.medianEventGapMs : void 0)
248
+ });
249
+ o.push({
250
+ ...e,
251
+ id: a.id,
252
+ label: e?.label ?? a.name,
253
+ model: e?.model ?? a.detail,
254
+ status: n === null && e?.status ? e.status : l === "done" ? "succeeded" : l,
255
+ costUsd: n === null ? e?.costUsd ?? a.costUsd : a.endMs <= n ? a.costUsd : void 0,
256
+ startedAt: r == null || !Number.isFinite(r) ? n === null ? e?.startedAt : void 0 : r + a.startMs,
257
+ ...h,
258
+ events: p.slice(-4),
259
+ turn: n === null ? e?.turn : void 0,
260
+ result: n === null ? e?.result ?? a.output : a.endMs <= n ? a.output : void 0,
261
+ commits: n === null ? e?.commits : void 0,
262
+ tokens: n === null ? e?.tokens : void 0
263
+ });
264
+ let g = a.parentId ? t.get(a.parentId) : void 0, _ = g && M(g, t);
265
+ _?.id && s.push({
266
+ from: _.id,
267
+ to: a.id,
268
+ kind: "spawn"
269
+ });
270
+ }
271
+ for (let [e, t] of Object.entries(i ?? {})) l.has(e) || o.push(n === null ? {
272
+ ...t,
273
+ id: e,
274
+ label: t.label ?? e,
275
+ status: t.status ?? "unknown"
276
+ } : {
277
+ id: e,
278
+ label: t.label ?? e,
279
+ model: t.model,
280
+ harness: t.harness,
281
+ role: t.role,
282
+ status: "unknown",
283
+ turn: "Timing unavailable at this cursor"
284
+ });
285
+ let f = new Set(o.map((e) => e.id));
286
+ for (let e of a) f.has(e.from) && f.has(e.to) && (e.kind !== "spawn" || !s.some((t) => t.kind === "spawn" && t.from === e.from && t.to === e.to)) && s.push(e);
287
+ return {
288
+ nodes: o,
289
+ edges: s
290
+ };
291
+ }
292
+ function ee(e, t) {
293
+ return e.map((n, r) => n.kind === "message" ? {
294
+ id: n.id,
295
+ kind: "message",
296
+ role: n.role,
297
+ content: n.content,
298
+ isStreaming: t && r === e.length - 1
299
+ } : n.kind === "tool" ? {
300
+ id: n.id,
301
+ kind: "tool",
302
+ call: n.call
303
+ } : n.kind === "notice" ? {
304
+ id: n.id,
305
+ kind: "custom",
306
+ content: /* @__PURE__ */ (0, b.jsx)("p", {
307
+ className: "text-xs text-muted-foreground",
308
+ children: n.text
309
+ })
310
+ } : {
311
+ id: n.id,
312
+ kind: "custom",
313
+ content: /* @__PURE__ */ (0, b.jsx)(s, {
314
+ part: {
315
+ type: "reasoning",
316
+ text: n.text
317
+ },
318
+ defaultOpen: !1,
319
+ openWhileActive: !1
320
+ })
321
+ });
322
+ }
323
+ function te({ label: e }) {
324
+ return /* @__PURE__ */ (0, b.jsxs)("p", {
325
+ className: "p-4 text-sm text-muted-foreground",
326
+ children: [e, ": not time-indexed"]
327
+ });
328
+ }
329
+ function P({ trace: e, streamUrl: t, openEventSource: n, events: i, onTimeChange: s, files: l, scoreboard: d, selectedAgentId: m, conversationOpen: h, onSelectAgent: g, agentCards: v, agentGraph: y, className: S, ...w }) {
330
+ let T = (0, x.useMemo)(() => new Map(e.spans.flatMap((e) => e.id ? [[e.id, e]] : [])), [e]), [E, D] = (0, x.useState)(), O = m ?? E, k = (e) => {
331
+ D(e), g?.(e);
332
+ }, A = O ? T.get(O) : void 0, P = O ? v?.[O] : void 0, F = A?.id ?? (P ? O : void 0), I = A?.name ?? P?.label ?? F, L = A?.detail ?? P?.model, R = !!F && h !== !1, { defaultLayout: z = "tree", ...B } = y ?? {}, [V, H] = (0, x.useState)(z), [U, ne] = (0, x.useState)(null), W = j(O && t ? t(O) : void 0, n), G = (0, x.useMemo)(() => {
333
+ if (w.startedAt !== void 0) return w.startedAt;
334
+ let e = W.entries[0]?.at;
335
+ return A && e !== void 0 ? e - A.startMs : void 0;
336
+ }, [
337
+ w.startedAt,
338
+ A,
339
+ W.entries
340
+ ]), K = (0, x.useMemo)(() => N(e.spans, T, U, w.startedAt, v, y?.edges), [
341
+ e,
342
+ T,
343
+ U,
344
+ w.startedAt,
345
+ v,
346
+ y?.edges
347
+ ]), q = K.nodes.find((e) => e.id === F), J = U === null || A && A.endMs <= U ? [...A?.facts ?? []] : [];
348
+ for (let [e, t] of [["Recorded result", q?.result], ["Activity", q?.turn]]) t && !J.some((e) => e.value === t) && J.push({
349
+ label: e,
350
+ value: t
351
+ });
352
+ let re = U !== null && w.startedAt !== void 0 ? w.startedAt + U : void 0, ie = U === null || G === void 0 ? W.entries : W.entries.filter((e) => e.at - G <= U), Y = W.alive && !W.error && U === null, X = (0, x.useMemo)(() => ee(ie, Y), [ie, Y]), Z = (0, x.useRef)(null), Q = (0, x.useRef)(!0), [ae, $] = (0, x.useState)(!1);
353
+ return (0, x.useLayoutEffect)(() => {
354
+ let e = Z.current;
355
+ e && (Q.current ? e.scrollTop = e.scrollHeight : $(!0));
356
+ }, [X.length, X[X.length - 1]]), (0, x.useEffect)(() => {
357
+ Q.current = !0, $(!1);
358
+ }, [O]), /* @__PURE__ */ (0, b.jsxs)("div", {
359
+ className: r("sandbox-trace-workspace flex min-h-0 flex-col gap-3", S),
360
+ children: [
361
+ /* @__PURE__ */ (0, b.jsx)("div", {
362
+ className: R ? "min-w-0 lg:mr-[420px]" : "min-w-0",
363
+ children: /* @__PURE__ */ (0, b.jsx)(C, {
364
+ ...w,
365
+ trace: e,
366
+ markers: i,
367
+ selectedId: F,
368
+ onDeselect: () => k(void 0),
369
+ onSelect: (e) => {
370
+ let t = M(e, T);
371
+ t?.id && k(t.id);
372
+ },
373
+ onTimeChange: (e) => {
374
+ ne(e), s?.(e);
375
+ },
376
+ latestEvents: /* @__PURE__ */ (0, b.jsx)(u, {
377
+ agents: K.nodes,
378
+ now: re,
379
+ live: U === null,
380
+ selectedId: F,
381
+ onSelect: k
382
+ }),
383
+ graph: /* @__PURE__ */ (0, b.jsxs)("section", {
384
+ className: "flex h-[60vh] min-h-[480px] flex-col",
385
+ "aria-label": "Agent graph",
386
+ children: [/* @__PURE__ */ (0, b.jsxs)("label", {
387
+ className: "flex h-8 shrink-0 items-center justify-end gap-2 px-3 text-xs text-muted-foreground",
388
+ children: ["Layout", /* @__PURE__ */ (0, b.jsxs)("select", {
389
+ "aria-label": "Graph layout",
390
+ value: V,
391
+ onChange: (e) => H(e.currentTarget.value),
392
+ className: "rounded-[var(--radius-control)] border border-border bg-card px-2 py-1 text-foreground",
393
+ children: [/* @__PURE__ */ (0, b.jsx)("option", {
394
+ value: "tree",
395
+ children: "Tree"
396
+ }), /* @__PURE__ */ (0, b.jsx)("option", {
397
+ value: "hub",
398
+ children: "Hub"
399
+ })]
400
+ })]
401
+ }), /* @__PURE__ */ (0, b.jsx)(f, {
402
+ ...B,
403
+ layout: V,
404
+ renderEventIcon: (e) => _(e.label),
405
+ nodes: K.nodes,
406
+ edges: K.edges,
407
+ selectedId: F ?? null,
408
+ onSelect: k,
409
+ showLatestEvents: !1,
410
+ now: re,
411
+ live: U === null && K.nodes.some((e) => [
412
+ "running",
413
+ "waiting",
414
+ "needs-you",
415
+ "failed"
416
+ ].includes(e.status)),
417
+ className: r("min-h-0 flex-1", B.className)
418
+ })]
419
+ })
420
+ })
421
+ }),
422
+ l && /* @__PURE__ */ (0, b.jsx)("section", {
423
+ "aria-label": "Code at the cursor",
424
+ className: "flex h-[70vh] min-h-0 flex-col overflow-hidden rounded-xl border border-border bg-card",
425
+ children: l
426
+ }),
427
+ d && /* @__PURE__ */ (0, b.jsx)("section", {
428
+ "aria-label": "Scoreboard at the cursor",
429
+ className: "overflow-hidden rounded-xl border border-border bg-card",
430
+ children: d
431
+ }),
432
+ R && /* @__PURE__ */ (0, b.jsxs)("aside", {
433
+ "aria-label": `${I} conversation`,
434
+ onKeyDown: (e) => {
435
+ e.key === "Escape" && k(void 0);
436
+ },
437
+ className: "fixed inset-y-0 right-0 z-40 flex w-full max-w-[420px] flex-col border-l border-border bg-card shadow-2xl",
438
+ children: [
439
+ /* @__PURE__ */ (0, b.jsxs)("header", {
440
+ className: "flex shrink-0 items-center gap-2 border-b border-border px-3 py-2",
441
+ children: [
442
+ /* @__PURE__ */ (0, b.jsx)("span", {
443
+ className: r("h-1.5 w-1.5 shrink-0 rounded-full", Y ? "bg-[var(--surface-info-text)]" : "bg-muted-foreground"),
444
+ "aria-hidden": !0,
445
+ "data-motion": Y ? "essential" : void 0,
446
+ style: Y ? c : void 0,
447
+ onAnimationStart: p
448
+ }),
449
+ /* @__PURE__ */ (0, b.jsx)("h3", {
450
+ className: "min-w-0 flex-1 truncate text-sm font-semibold",
451
+ children: I
452
+ }),
453
+ L && /* @__PURE__ */ (0, b.jsx)("span", {
454
+ className: "truncate text-xs text-muted-foreground",
455
+ children: L
456
+ }),
457
+ /* @__PURE__ */ (0, b.jsx)("button", {
458
+ type: "button",
459
+ "aria-label": "Close conversation",
460
+ title: "Close (Esc)",
461
+ onClick: () => k(void 0),
462
+ className: "shrink-0 rounded-md p-1 text-muted-foreground hover:bg-muted hover:text-foreground",
463
+ children: /* @__PURE__ */ (0, b.jsx)(a, {
464
+ "aria-hidden": !0,
465
+ className: "h-4 w-4"
466
+ })
467
+ })
468
+ ]
469
+ }),
470
+ J.length > 0 && /* @__PURE__ */ (0, b.jsx)("section", {
471
+ "aria-label": "Recorded agent details",
472
+ tabIndex: 0,
473
+ className: "max-h-[35vh] shrink-0 overflow-y-auto border-b border-border px-3 py-2 text-sm",
474
+ children: /* @__PURE__ */ (0, b.jsx)("dl", {
475
+ className: "space-y-2",
476
+ children: J.map((e, t) => /* @__PURE__ */ (0, b.jsxs)("div", { children: [/* @__PURE__ */ (0, b.jsx)("dt", {
477
+ className: "text-xs text-muted-foreground",
478
+ children: e.label
479
+ }), /* @__PURE__ */ (0, b.jsx)("dd", {
480
+ className: "m-0 whitespace-pre-wrap break-words",
481
+ children: e.value
482
+ })] }, t))
483
+ })
484
+ }),
485
+ /* @__PURE__ */ (0, b.jsx)("div", {
486
+ ref: Z,
487
+ onScroll: (e) => {
488
+ let t = e.currentTarget;
489
+ Q.current = t.scrollHeight - t.scrollTop - t.clientHeight < 48, Q.current && $(!1);
490
+ },
491
+ "data-primary-content": "",
492
+ className: "min-h-0 flex-1 overflow-y-auto px-3 py-2",
493
+ children: t && (U === null || G !== void 0) ? /* @__PURE__ */ (0, b.jsx)(o, {
494
+ items: X,
495
+ isThinking: Y && X.length === 0,
496
+ emptyState: /* @__PURE__ */ (0, b.jsx)("p", {
497
+ className: "p-4 text-sm text-muted-foreground",
498
+ children: W.error ?? "No messages yet."
499
+ })
500
+ }) : /* @__PURE__ */ (0, b.jsx)(te, { label: "Conversation" })
501
+ }),
502
+ ae && /* @__PURE__ */ (0, b.jsx)("button", {
503
+ type: "button",
504
+ onClick: () => {
505
+ let e = Z.current;
506
+ e && (e.scrollTop = e.scrollHeight), Q.current = !0, $(!1);
507
+ },
508
+ className: "absolute bottom-3 left-1/2 -translate-x-1/2 rounded-full border border-border bg-background px-3 py-1 text-xs shadow-sm",
509
+ children: "New output"
510
+ })
511
+ ]
512
+ })
513
+ ]
514
+ });
515
+ }
516
+ //#endregion
517
+ //#region src/workspace/LiveInspection.tsx
518
+ function F(e, t, n) {
519
+ let r = h(e ?? null, t ? 3e3 : void 0, !1, n), [a, o] = (0, x.useState)(), [s, c] = (0, x.useState)(), l = r.data?.files?.entries ?? [], u = l.find((e) => e.path === a) ?? l[0], d = u && e ? `${e}/file?path=${encodeURIComponent(u.path)}` : null, f = h(d, t ? 3e3 : void 0, !1, n), p = f.data?.file, m = p && u && p.path === u.path && p.sha256 === u.sha256 && p.byteLength === u.byteLength, g = m ? `${u.path}:${u.sha256}` : void 0;
520
+ (0, x.useEffect)(() => {
521
+ if (!g || !p) return;
522
+ let e = URL.createObjectURL(new Blob([p.content], { type: "text/plain;charset=utf-8" }));
523
+ return c({
524
+ key: g,
525
+ href: e
526
+ }), () => URL.revokeObjectURL(e);
527
+ }, [g, p?.content]);
528
+ let _ = r.data?.coverage, v = r.status === 404 ? void 0 : _ ? /* @__PURE__ */ (0, b.jsxs)("details", {
529
+ className: "ws-status",
530
+ open: _.status !== "complete",
531
+ "data-capture-status": _.status,
532
+ children: [
533
+ /* @__PURE__ */ (0, b.jsx)("summary", { children: _.status === "complete" ? "Conversation retained" : "Conversation incomplete" }),
534
+ /* @__PURE__ */ (0, b.jsx)("p", { children: _.reason ?? _.source }),
535
+ !!r.data?.context?.length && /* @__PURE__ */ (0, b.jsxs)("details", { children: [/* @__PURE__ */ (0, b.jsx)("summary", { children: "Recorded context" }), r.data.context.map((e, t) => /* @__PURE__ */ (0, b.jsx)("pre", {
536
+ className: "ws-code",
537
+ children: e.event.text
538
+ }, `${e.at}:${t}`))] }),
539
+ r.data?.files?.scope === "none" && /* @__PURE__ */ (0, b.jsx)("p", { children: r.data.files.reason ?? "No workspace inventory was captured." })
540
+ ]
541
+ }) : r.error ? /* @__PURE__ */ (0, b.jsxs)("p", {
542
+ className: "ws-status",
543
+ role: "alert",
544
+ children: ["Conversation inspection unavailable: ", r.error]
545
+ }) : void 0;
546
+ return {
547
+ scoreboard: /* @__PURE__ */ (0, b.jsxs)(b.Fragment, { children: [v, r.data?.files && !r.data.files.complete && /* @__PURE__ */ (0, b.jsxs)("p", {
548
+ className: "ws-status",
549
+ role: "alert",
550
+ children: ["Workspace inventory incomplete: ", r.data.files.reason ?? "Some files could not be retained."]
551
+ })] }),
552
+ files: u ? /* @__PURE__ */ (0, b.jsx)("section", {
553
+ "aria-label": "Retained files",
554
+ className: "flex min-h-0 flex-1 flex-col",
555
+ "data-file-scope": r.data?.files?.scope,
556
+ "data-file-complete": r.data?.files?.complete,
557
+ "data-file": u.path,
558
+ "data-file-hash": u.sha256,
559
+ children: m ? /* @__PURE__ */ (0, b.jsxs)(b.Fragment, { children: [/* @__PURE__ */ (0, b.jsx)(i, {
560
+ className: "min-h-0 flex-1",
561
+ artifact: {
562
+ id: `${u.path}:${u.sha256}`,
563
+ path: u.path,
564
+ filename: u.path.split("/").at(-1) ?? u.path,
565
+ content: p.content,
566
+ ...p.before ? { baselineContent: p.before.content } : {}
567
+ },
568
+ paths: l.map((e) => e.path),
569
+ showTree: !0,
570
+ onFileSelect: o
571
+ }), /* @__PURE__ */ (0, b.jsxs)("details", {
572
+ className: "ws-status",
573
+ children: [
574
+ /* @__PURE__ */ (0, b.jsx)("summary", { children: "Provenance" }),
575
+ /* @__PURE__ */ (0, b.jsx)("code", { children: u.sha256 }),
576
+ p.before && /* @__PURE__ */ (0, b.jsxs)("p", { children: [
577
+ "Compared with ",
578
+ p.before.source.kind,
579
+ " ",
580
+ /* @__PURE__ */ (0, b.jsx)("code", { children: p.before.source.ref }),
581
+ ": ",
582
+ /* @__PURE__ */ (0, b.jsx)("code", { children: p.before.sha256 })
583
+ ] }),
584
+ /* @__PURE__ */ (0, b.jsx)("p", { children: /* @__PURE__ */ (0, b.jsx)("a", {
585
+ href: s && s.key === g ? s.href : void 0,
586
+ download: u.path.split("/").at(-1),
587
+ children: "Download"
588
+ }) })
589
+ ]
590
+ })] }) : /* @__PURE__ */ (0, b.jsx)("p", {
591
+ className: "ws-status",
592
+ role: f.loading ? "status" : "alert",
593
+ children: f.loading ? `Reading ${u.path}…` : `This retained file is unavailable: ${f.error ?? "its content identity did not match the inventory"}`
594
+ })
595
+ }) : void 0
596
+ };
597
+ }
598
+ //#endregion
599
+ //#region src/workspace/LiveRun.tsx
600
+ var I = (e) => {
601
+ let t = e ? Date.parse(e) : NaN;
602
+ return Number.isFinite(t) ? t : void 0;
603
+ }, L = (e) => e !== void 0 && Number.isFinite(e) ? new Date(e).toISOString() : void 0, R = (e, t) => [...e.workers.map((e) => {
604
+ let n = t.find((t) => t.id === e.id);
605
+ return {
606
+ ...e,
607
+ startedAt: e.startedAt ?? L(n?.timing?.startedAt),
608
+ endedAt: e.endedAt ?? L(n?.timing?.settledAt ?? n?.settledAt)
609
+ };
610
+ }), ...t.filter((t) => t.id !== e.id && !e.workers.some((e) => e.id === t.id)).map((e) => ({
611
+ id: e.id,
612
+ parent: e.parentId,
613
+ label: e.label ?? e.id,
614
+ runtime: e.runtime,
615
+ status: e.status ?? "unknown",
616
+ startedAt: L(e.timing?.startedAt),
617
+ endedAt: L(e.timing?.settledAt ?? e.settledAt)
618
+ }))], z = (...e) => e.every((e) => e && e.usdKnown !== !1 && Number.isFinite(e.usd) && e.usd >= 0) ? e.reduce((e, t) => e + (t?.usd ?? 0), 0) : void 0, B = (e) => m(e === "down" ? "failed" : e === "cancelled" ? "stopped" : e), V = (e) => {
619
+ let t = B(e);
620
+ return t === "done" ? "succeeded" : t;
621
+ }, H = (e) => [
622
+ "running",
623
+ "waiting",
624
+ "needs-you"
625
+ ].includes(B(e));
626
+ function U({ api: e, transport: t }) {
627
+ let [n, r] = (0, x.useState)([]), [i, a] = (0, x.useState)(null), [o, s] = (0, x.useState)(!1), [c, l] = (0, x.useState)(!1), [u, d] = (0, x.useState)(""), [f, p] = (0, x.useState)(0), [m, h] = (0, x.useState)(), [g, _] = (0, x.useState)(!0);
628
+ (0, x.useEffect)(() => {
629
+ let n = t?.openEventSource ? t.openEventSource(`${e}/events`, s) : new EventSource(`${e}/events`);
630
+ return n.addEventListener("snapshot", (e) => {
631
+ try {
632
+ let t = JSON.parse(e.data);
633
+ if (!Array.isArray(t.snapshots)) throw Error("Invalid snapshot stream");
634
+ r((e) => {
635
+ let n = new Map((t.reset ? [] : e).map((e) => [e.root, e]));
636
+ for (let e of t.snapshots) n.set(e.root, e);
637
+ return [...n.values()];
638
+ }), p(t.sequence), a(null), s(!0);
639
+ } catch (e) {
640
+ a(String(e));
641
+ }
642
+ }), n.addEventListener("unavailable", () => a("The run snapshot is unavailable")), n.addEventListener("end", () => {
643
+ n.close(), l(!0);
644
+ }), t?.openEventSource || (n.onerror = () => s(!1)), () => n.close();
645
+ }, [e, t?.openEventSource]);
646
+ let v = n.flatMap((e, t) => e.supervisors.map((n) => ({
647
+ snapshot: e,
648
+ root: t,
649
+ run: n,
650
+ key: JSON.stringify([e.root, n.id])
651
+ }))), y = v.find((e) => e.key === u) ?? v[0], S = y?.snapshot.pursuit?.nodes.filter((e) => e.runId === y.run.id) ?? [], C = (e) => {
652
+ let t = S.find((t) => t.id === e), n = y?.run.workers.find((t) => t.id === e)?.materialization;
653
+ return [t?.model ?? (n?.model?.status === "known" ? n.model.id : void 0), t?.backend ?? n?.backend].filter(Boolean).join(" · ") || void 0;
654
+ }, w = y && {
655
+ ...y.run,
656
+ workers: R(y.run, S)
657
+ }, T = w ? Math.min(...[w.startedAt, ...w.workers.map((e) => e.startedAt)].flatMap((e) => e && Number.isFinite(Date.parse(e)) ? [Date.parse(e)] : [])) : void 0, E = (0, x.useMemo)(() => {
658
+ let e = y?.snapshot.generatedAt ?? Date.now(), t = T !== void 0 && Number.isFinite(T) ? T : e, n = (w?.workers ?? []).flatMap((n) => {
659
+ if (!n.startedAt || !Number.isFinite(Date.parse(n.startedAt))) return [];
660
+ let r = Math.max(0, Date.parse(n.startedAt) - t), i = I(n.endedAt) ?? (H(n.status) ? e : Date.parse(n.startedAt)), a = z(n.spend, n.metered);
661
+ return [{
662
+ id: n.id,
663
+ parentId: n.parent && n.parent !== n.id ? n.parent : w.id,
664
+ name: n.label,
665
+ kind: "pipeline",
666
+ startMs: r,
667
+ endMs: Math.max(r, i - t),
668
+ status: B(n.status),
669
+ ...a === void 0 ? {} : { costUsd: a },
670
+ ...n.lastActivityAt === void 0 ? {} : {
671
+ activityAt: [n.lastActivityAt - t],
672
+ medianEventGapMs: n.medianEventGapMs
673
+ },
674
+ ...C(n.id) ? { detail: C(n.id) } : {},
675
+ ...B(n.status) === "failed" && n.reason ? { facts: [{
676
+ label: "Failure",
677
+ value: n.reason
678
+ }] } : {},
679
+ ...n.status === "cancelled" ? { outcome: {
680
+ tone: "neutral",
681
+ label: "Cancelled"
682
+ } } : {}
683
+ }];
684
+ });
685
+ w?.startedAt && w.status !== "unobserved" && !n.some((e) => e.id === w.id) && n.unshift({
686
+ id: w.id,
687
+ name: "root",
688
+ kind: "pipeline",
689
+ detail: C(w.id),
690
+ startMs: Math.max(0, Date.parse(w.startedAt) - t),
691
+ endMs: Math.max(0, Date.parse(w.completedAt ?? new Date(e).toISOString()) - t),
692
+ status: B(w.status),
693
+ ...B(w.status) === "failed" && w.reason ? { facts: [{
694
+ label: "Failure",
695
+ value: w.reason
696
+ }] } : {},
697
+ ...w.lastActivityAt === void 0 ? {} : {
698
+ activityAt: [w.lastActivityAt - t],
699
+ medianEventGapMs: w.medianEventGapMs
700
+ },
701
+ ...z(w.driverSpend) === void 0 ? {} : { costUsd: z(w.driverSpend) },
702
+ ...w.status === "cancelled" ? { outcome: {
703
+ tone: "neutral",
704
+ label: "Cancelled"
705
+ } } : {}
706
+ });
707
+ let r = w?.totals;
708
+ return {
709
+ spans: n,
710
+ totalMs: Math.max(0, ...n.map((e) => e.endMs)),
711
+ ...r?.tokensKnown !== !1 && typeof r?.tokensInput == "number" && Number.isFinite(r.tokensInput) && r.tokensInput >= 0 ? { promptTokens: r.tokensInput } : {},
712
+ ...r?.tokensKnown !== !1 && typeof r?.tokensOutput == "number" && Number.isFinite(r.tokensOutput) && r.tokensOutput >= 0 ? { completionTokens: r.tokensOutput } : {},
713
+ errors: n.filter((e) => e.status === "failed").length
714
+ };
715
+ }, [
716
+ y?.snapshot,
717
+ y?.run,
718
+ T
719
+ ]), D = w?.workers.filter((e) => e.id !== w.id) ?? [], O = w ? [{
720
+ id: w.id,
721
+ label: "root",
722
+ status: V(w.status),
723
+ model: C(w.id),
724
+ costUsd: z(w.driverSpend),
725
+ startedAt: I(w.startedAt),
726
+ lastActivityAt: w.lastActivityAt,
727
+ medianEventGapMs: w.medianEventGapMs,
728
+ result: w.status === "cancelled" ? "Cancelled" : V(w.status) === "failed" ? w.reason || "Failure cause not recorded" : void 0
729
+ }, ...D.map((e) => ({
730
+ id: e.id,
731
+ label: e.label,
732
+ harness: e.runtime,
733
+ model: C(e.id),
734
+ status: V(e.status),
735
+ costUsd: z(e.spend, e.metered),
736
+ startedAt: I(e.startedAt),
737
+ lastActivityAt: e.lastActivityAt,
738
+ medianEventGapMs: e.medianEventGapMs,
739
+ turn: e.liveTail?.at(-1),
740
+ events: e.liveTail?.slice(-3).map((t, n) => ({
741
+ id: `${e.id}:${n}:${t}`,
742
+ label: t
743
+ })),
744
+ result: e.status === "cancelled" ? "Cancelled" : V(e.status) === "failed" ? e.reason || "Failure cause not recorded" : e.verdict
745
+ }))] : [], k = m, A = F(y && k ? `${e}/agents/${y.root}/${encodeURIComponent(y.run.id)}/${encodeURIComponent(k)}` : void 0, !!w && H(w.status), t?.fetch), j = new Set(O.map((e) => e.id)), M = D.map((e) => ({
746
+ from: e.parent && e.parent !== e.id && j.has(e.parent) ? e.parent : w.id,
747
+ to: e.id,
748
+ kind: "spawn"
749
+ })), N = Object.fromEntries(O.map(({ id: e, label: t, harness: n, model: r, turn: i, events: a, result: o, status: s, costUsd: c, startedAt: l, lastActivityAt: u, medianEventGapMs: d }) => [e, {
750
+ label: t,
751
+ harness: n,
752
+ model: r,
753
+ turn: i,
754
+ events: a,
755
+ result: o,
756
+ ...l === void 0 ? {
757
+ status: s,
758
+ costUsd: c,
759
+ lastActivityAt: u,
760
+ medianEventGapMs: d
761
+ } : {}
762
+ }]));
763
+ return /* @__PURE__ */ (0, b.jsxs)("main", {
764
+ className: "ws-live",
765
+ "data-api": e,
766
+ "data-top-sequence": f,
767
+ children: [
768
+ /* @__PURE__ */ (0, b.jsxs)("header", { children: [/* @__PURE__ */ (0, b.jsxs)("label", { children: ["Run", /* @__PURE__ */ (0, b.jsx)("select", {
769
+ "aria-label": "Run",
770
+ value: y?.key ?? "",
771
+ onChange: (e) => {
772
+ d(e.target.value), h(void 0);
773
+ },
774
+ children: v.map((e) => /* @__PURE__ */ (0, b.jsx)("option", {
775
+ value: e.key,
776
+ children: e.run.id
777
+ }, e.key))
778
+ })] }), /* @__PURE__ */ (0, b.jsx)("span", {
779
+ role: "status",
780
+ children: c ? "Finished · viewer closed" : o ? "● Connected" : n.length ? "○ Reconnecting" : "Connecting…"
781
+ })] }),
782
+ y?.run.task && y.run.task !== y.run.id && /* @__PURE__ */ (0, b.jsx)("p", { children: y.run.task }),
783
+ i && /* @__PURE__ */ (0, b.jsx)("p", {
784
+ role: "alert",
785
+ children: i
786
+ }),
787
+ (y ? [y.snapshot] : n).filter((e) => e.completeness === "partial").map((e) => /* @__PURE__ */ (0, b.jsxs)("p", {
788
+ role: "alert",
789
+ children: ["Partial capture: ", e.diagnostics.map((e) => `${e.source}: ${e.reason}`).join(" · ")]
790
+ }, e.root)),
791
+ y ? /* @__PURE__ */ (0, b.jsx)(P, {
792
+ trace: E,
793
+ label: "Run",
794
+ selectedAgentId: k,
795
+ conversationOpen: g,
796
+ openEventSource: t?.openEventSource,
797
+ onSelectAgent: (e) => {
798
+ e && h(e), _(e !== void 0);
799
+ },
800
+ live: H(y.run.status) || w.workers.some((e) => H(e.status)),
801
+ startedAt: Number.isFinite(T) ? T : void 0,
802
+ agentCards: N,
803
+ agentGraph: {
804
+ defaultLayout: "tree",
805
+ edges: M
806
+ },
807
+ defaultView: "graph",
808
+ maxHeight: 650,
809
+ files: A.files,
810
+ scoreboard: A.scoreboard,
811
+ streamUrl: (t) => `${e}/agents/${y.root}/${encodeURIComponent(y.run.id)}/${encodeURIComponent(t)}/stream`
812
+ }, y.key) : o && !n.some((e) => e.completeness === "partial") && /* @__PURE__ */ (0, b.jsx)("p", {
813
+ role: "status",
814
+ children: "No recorded agents in these roots."
815
+ })
816
+ ]
817
+ });
818
+ }
819
+ //#endregion
820
+ export { U as LiveRun };