@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,904 @@
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 { i as r, n as i, t as a } from "./record-DZnT6SWN-H-ul3U3a.js";
4
+ import { t as o } from "./dashboard-D3JhmRhe-DSl0zhkw.js";
5
+ import { E as s, T as c, a as l, i as u, m as d, s as f, v as p, x as m } from "./ui-Co03nZUX.js";
6
+ import { i as h, n as g, t as _ } from "./record-part-CbweyYoV.js";
7
+ import "./record-W39D5MO-.js";
8
+ import { n as v } from "./model-brand-bTcMjQtB-RSb7EbGB.js";
9
+ //#region node_modules/.pnpm/@tangle-network+sandbox-ui@2.0.15_b185337ee4bca5ec0279ca525649b58b/node_modules/@tangle-network/sandbox-ui/dist/dashboard.js
10
+ var y = /* @__PURE__ */ e(t(), 1), b = (e) => typeof e == "string" ? e : e == null ? "" : JSON.stringify(e), x = (e) => typeof e == "number" && Number.isFinite(e) ? e : void 0, S = (e) => {
11
+ if (typeof e != "string" && typeof e != "number") return null;
12
+ let t = new Date(typeof e == "number" && e < 1e11 ? e * 1e3 : e);
13
+ return Number.isFinite(t.valueOf()) && t.valueOf() >= Date.UTC(2001, 0, 1) && t.valueOf() < Date.UTC(2100, 0, 1) ? t.toISOString() : null;
14
+ };
15
+ function C(e, t, n, r, i, a, o) {
16
+ let s = 0, c = [], l = /* @__PURE__ */ new Map(), u = /* @__PURE__ */ new Map(), d = /* @__PURE__ */ new Map(), f = [], p = t.start ? Date.parse(t.start) : null, m, h = null, g = [];
17
+ i.forEach((e, t) => {
18
+ let n = e?.data ?? {};
19
+ if (e?.type === "message.updated" && n.info?.id && n.info?.role) l.set(n.info.id, n.info.role);
20
+ else if (e?.type === "message.part.updated" && n.part?.id) {
21
+ let e = n.part, r = x(e.state?.time?.start) ?? x(e.time?.start);
22
+ r !== void 0 && (p = Math.max(p ?? 0, r)), u.has(e.id) || c.push(e.id);
23
+ let i = u.get(e.id);
24
+ u.set(e.id, {
25
+ part: e,
26
+ index: t,
27
+ firstMs: i?.firstMs ?? p
28
+ });
29
+ let a = x(e.state?.time?.end) ?? x(e.time?.end);
30
+ a !== void 0 && (p = Math.max(p ?? 0, a));
31
+ } else if (e?.type === "raw" && n.event?.type === "item.completed" && n.event.item?.id) {
32
+ let e = n.event.item;
33
+ d.has(e.id) || f.push(e.id), d.set(e.id, {
34
+ item: e,
35
+ index: t,
36
+ firstMs: p
37
+ });
38
+ } else e?.type === "raw" && n.event?.role === "tool" && typeof n.event.tool_call_id == "string" ? g.push({
39
+ index: t,
40
+ at: p,
41
+ kind: "tool-result",
42
+ data: n.event
43
+ }) : e?.type === "raw" && n.event?.type === "rate_limit_event" ? g.push({
44
+ index: t,
45
+ at: p,
46
+ kind: "rate-limit",
47
+ data: n.event.rate_limit_info ?? {}
48
+ }) : e?.type === "done" ? h = {
49
+ data: n,
50
+ usage: e.usage,
51
+ index: t
52
+ } : e?.type === "result" && n.outcome && n.outcome.type !== "completed" && g.push({
53
+ index: t,
54
+ at: p,
55
+ kind: "execution-error",
56
+ data: n.outcome
57
+ });
58
+ });
59
+ let _ = (e) => S(e ?? void 0) ?? t.start ?? null;
60
+ for (let i of c) {
61
+ let { part: c, index: d } = u.get(i), f = u.get(i).firstMs, p = l.get(c.messageID) === "user" ? "user" : "assistant";
62
+ if (c.type === "text" || c.type === "reasoning") {
63
+ let o = b(c.text);
64
+ if (!o) continue;
65
+ let l = e.clip(o, () => a.full(d, [
66
+ "data",
67
+ "part",
68
+ "text"
69
+ ], o)), u = _(x(c.time?.start) ?? f);
70
+ if (!u) continue;
71
+ e.emit({
72
+ node: t.id,
73
+ at: u,
74
+ kind: "message",
75
+ category: "reasoning",
76
+ label: p,
77
+ source: {
78
+ path: n,
79
+ sha256: r.sha256,
80
+ ...a.where(d)
81
+ },
82
+ detail: {
83
+ role: p,
84
+ nativeRecordId: i,
85
+ ...c.type === "text" ? { publicText: l.text } : { reasoning: l.text },
86
+ ...l.clip ? { clip: l.clip } : {},
87
+ ...c.time?.start ? {} : { atBasis: "carried" }
88
+ }
89
+ }), s++, p === "assistant" && (m = e.events.at(-1));
90
+ } else if (c.type === "tool") {
91
+ let l = c.state ?? {}, u = b(c.tool), p = b(c.callID || i), m = o(u, l.input), h = e.clip(JSON.stringify(l.input ?? {}), () => a.full(d, [
92
+ "data",
93
+ "part",
94
+ "state",
95
+ "input"
96
+ ], l.input ?? {})), g = x(l.time?.start) ?? f, v = _(g);
97
+ if (!v) continue;
98
+ let y = l.status === "completed" || l.status === "error";
99
+ if (e.emit({
100
+ node: t.id,
101
+ at: v,
102
+ kind: "message",
103
+ category: m,
104
+ label: `assistant · ${u}`,
105
+ source: {
106
+ path: n,
107
+ sha256: r.sha256,
108
+ ...a.where(d),
109
+ ...y ? { item: 0 } : {}
110
+ },
111
+ detail: {
112
+ role: "assistant",
113
+ nativeRecordId: i,
114
+ publicToolCalls: [{
115
+ id: p,
116
+ name: u,
117
+ input: h.text,
118
+ ...h.clip ? { clip: h.clip } : {}
119
+ }]
120
+ }
121
+ }), s++, y) {
122
+ let o = l.status === "error" ? "error" : "output", s = b(l[o]), c = e.clip(s, () => a.full(d, [
123
+ "data",
124
+ "part",
125
+ "state",
126
+ o
127
+ ], l[o])), f = x(l.time?.end);
128
+ e.emit({
129
+ node: t.id,
130
+ at: _(f ?? g),
131
+ kind: "tool-result",
132
+ category: m,
133
+ label: `tool result · ${u}`,
134
+ source: {
135
+ path: n,
136
+ sha256: r.sha256,
137
+ ...a.where(d),
138
+ item: 1
139
+ },
140
+ detail: {
141
+ role: "toolResult",
142
+ nativeRecordId: i,
143
+ toolCallId: p,
144
+ isError: l.status === "error",
145
+ publicText: c.text,
146
+ ...c.clip ? { clip: c.clip } : {},
147
+ ...f !== void 0 && g != null ? { durationMs: Math.max(0, f - g) } : {}
148
+ }
149
+ });
150
+ }
151
+ }
152
+ }
153
+ for (let i of f) {
154
+ let { item: c, index: l, firstMs: u } = d.get(i);
155
+ if (c.type !== "command_execution" && c.type !== "mcp_tool_call" && c.type !== "web_search" && c.type !== "file_change") continue;
156
+ let f = _(u);
157
+ if (!f) continue;
158
+ let p = c.type === "mcp_tool_call" ? b(c.tool ?? c.name) : c.type, m = c.type === "command_execution" ? { command: c.command } : c.type === "web_search" ? { query: c.query } : c.type === "file_change" ? { changes: c.changes } : c.arguments ?? {}, h = e.clip(JSON.stringify(m), () => a.full(l, [
159
+ "data",
160
+ "event",
161
+ "item"
162
+ ], c)), g = o(p, m);
163
+ e.emit({
164
+ node: t.id,
165
+ at: f,
166
+ kind: "message",
167
+ category: g,
168
+ label: `assistant · ${p}`,
169
+ source: {
170
+ path: n,
171
+ sha256: r.sha256,
172
+ ...a.where(l),
173
+ item: 0
174
+ },
175
+ detail: {
176
+ role: "assistant",
177
+ nativeRecordId: b(i),
178
+ publicToolCalls: [{
179
+ id: b(i),
180
+ name: p,
181
+ input: h.text,
182
+ ...h.clip ? { clip: h.clip } : {}
183
+ }]
184
+ }
185
+ });
186
+ let v = b(c.aggregated_output ?? c.result ?? c.output ?? c.status), y = e.clip(v, () => a.full(l, [
187
+ "data",
188
+ "event",
189
+ "item"
190
+ ], c));
191
+ e.emit({
192
+ node: t.id,
193
+ at: f,
194
+ kind: "tool-result",
195
+ category: g,
196
+ label: `tool result · ${p}`,
197
+ source: {
198
+ path: n,
199
+ sha256: r.sha256,
200
+ ...a.where(l),
201
+ item: 1
202
+ },
203
+ detail: {
204
+ role: "toolResult",
205
+ nativeRecordId: b(i),
206
+ toolCallId: b(i),
207
+ isError: typeof c.exit_code == "number" && c.exit_code !== 0 || c.status === "failed",
208
+ publicText: y.text,
209
+ ...y.clip ? { clip: y.clip } : {},
210
+ atBasis: "carried"
211
+ }
212
+ }), s += 2;
213
+ }
214
+ for (let i of g) {
215
+ let o = _(i.at);
216
+ if (!o) continue;
217
+ if (i.kind === "tool-result") {
218
+ let c = i.data.content, l = typeof c == "string" ? c : Array.isArray(c) ? c.map((e) => b(e?.text ?? e)).join("\n") : b(c), u = e.clip(l, () => a.full(i.index, [
219
+ "data",
220
+ "event",
221
+ "content"
222
+ ], c));
223
+ e.emit({
224
+ node: t.id,
225
+ at: o,
226
+ kind: "tool-result",
227
+ category: "other",
228
+ label: "tool result",
229
+ source: {
230
+ path: n,
231
+ sha256: r.sha256,
232
+ ...a.where(i.index)
233
+ },
234
+ detail: {
235
+ role: "toolResult",
236
+ toolCallId: b(i.data.tool_call_id),
237
+ isError: /<system>ERROR/.test(l),
238
+ publicText: u.text,
239
+ ...u.clip ? { clip: u.clip } : {},
240
+ atBasis: "carried"
241
+ }
242
+ }), s++;
243
+ continue;
244
+ }
245
+ let c = i.data.rateLimitType ?? null, l = c ? x(i.data.unifiedWindows?.[c]?.utilization) ?? null : null;
246
+ e.emit({
247
+ node: t.id,
248
+ at: o,
249
+ kind: i.kind,
250
+ category: "lifecycle",
251
+ label: i.kind === "rate-limit" ? `rate limit · ${c ?? "window unknown"}` : "execution error",
252
+ source: {
253
+ path: n,
254
+ sha256: r.sha256,
255
+ ...a.where(i.index)
256
+ },
257
+ detail: i.kind === "rate-limit" ? {
258
+ rateLimit: {
259
+ window: c,
260
+ utilization: l,
261
+ status: i.data.status ?? null
262
+ },
263
+ data: e.compactValue(i.data)
264
+ } : {
265
+ responseStatus: "error",
266
+ isError: !0,
267
+ publicText: e.clip(b(i.data.error ?? i.data), null).text
268
+ }
269
+ });
270
+ }
271
+ if (h) {
272
+ let r = h.data?.effectiveBackend;
273
+ typeof r?.model == "string" && (t.servedModel ??= r.model, t.modelSource ??= "effective backend");
274
+ let i = h.usage ?? h.data?.tokenUsage, a = x(i?.cost) ?? x(h.data?.totalCostUsd), o = m ?? [...e.events].reverse().find((r) => r.node === t.id && r.source?.path === e.sourcePath(n)), s = (h.data?.tokensKnown === !1 || h.tokensKnown === !1) && !x(i?.inputTokens) && !x(i?.outputTokens) && !x(i?.cacheReadInputTokens) && !x(i?.cacheCreationInputTokens) && !a;
275
+ o && i && !s && (o.detail.usage = {
276
+ input: x(i.inputTokens),
277
+ output: x(i.outputTokens),
278
+ cacheRead: x(i.cacheReadInputTokens),
279
+ cacheWrite: x(i.cacheCreationInputTokens)
280
+ }, o.detail.usageScope = "execution-total", a !== void 0 && (o.detail.costListUsd = a, o.detail.usdKnown = !1));
281
+ }
282
+ return s;
283
+ }
284
+ //#endregion
285
+ //#region src/workspace/LiveTranscript.tsx
286
+ var w = n(), T = 200, E = 2e3;
287
+ function D(e, t, n, r) {
288
+ let i = [], a = /* @__PURE__ */ new Map();
289
+ for (let e of r) {
290
+ if (!e.at || !Number.isFinite(Date.parse(e.at))) continue;
291
+ if (!e.event) {
292
+ let n = e.stream ?? t, r = a.get(n) ?? [];
293
+ r.push(e), a.set(n, r);
294
+ continue;
295
+ }
296
+ let n = e.event, r = `${t}:${e.attempt ?? 1}:${e.seq}`, o = `${e.stream ?? t}:${e.attempt ?? 1}:${n.toolCallId ?? e.seq}`, s = {
297
+ id: r,
298
+ node: t,
299
+ at: e.at,
300
+ kind: "message",
301
+ category: "other",
302
+ label: "assistant"
303
+ }, c = { attempt: e.attempt ?? 1 };
304
+ if (n.kind === "text_delta" || n.kind === "reasoning_delta") {
305
+ let t = n.kind === "text_delta" ? "publicText" : "reasoning", r = i.at(-1);
306
+ r?.detail.streamKind === n.kind && r.detail.attempt === (e.attempt ?? 1) ? r.detail[t] = `${r.detail[t] ?? ""}${n.text ?? ""}` : i.push({
307
+ ...s,
308
+ detail: {
309
+ ...c,
310
+ role: "assistant",
311
+ [t]: n.text ?? "",
312
+ streamKind: n.kind,
313
+ attempt: e.attempt ?? 1
314
+ }
315
+ });
316
+ } else if (n.kind === "tool_call") i.push({
317
+ ...s,
318
+ label: n.toolName ?? "Tool call",
319
+ detail: {
320
+ ...c,
321
+ role: "assistant",
322
+ publicToolCalls: [{
323
+ id: o,
324
+ name: n.toolName ?? "Tool call",
325
+ ...n.args == null ? {} : { input: typeof n.args == "string" ? n.args : JSON.stringify(n.args) }
326
+ }]
327
+ }
328
+ });
329
+ else if (n.kind === "tool_result") {
330
+ let e = n.result;
331
+ i.push({
332
+ ...s,
333
+ kind: "tool-result",
334
+ detail: {
335
+ ...c,
336
+ role: "toolResult",
337
+ toolCallId: o,
338
+ publicText: typeof e == "string" ? e : JSON.stringify(e ?? null),
339
+ isError: !!e && typeof e == "object" && ("error" in e || "isError" in e && e.isError === !0)
340
+ }
341
+ });
342
+ } else i.push({
343
+ ...s,
344
+ kind: n.kind,
345
+ category: "lifecycle",
346
+ label: n.kind.replaceAll("_", " "),
347
+ detail: {
348
+ ...c,
349
+ lifecycle: n.kind,
350
+ ...n.text ? { publicText: n.text } : {}
351
+ }
352
+ });
353
+ }
354
+ for (let [e, n] of a) C({
355
+ events: i,
356
+ clip: (e) => ({ text: e }),
357
+ compactValue: (e) => e,
358
+ sourcePath: (e) => e,
359
+ emit: (t) => {
360
+ let n = t.detail.nativeRecordId ?? t.source?.line, r = { ...t.detail };
361
+ r.publicToolCalls &&= r.publicToolCalls.map((t) => ({
362
+ ...t,
363
+ id: `${e}:${t.id}`
364
+ })), r.toolCallId &&= `${e}:${r.toolCallId}`, i.push({
365
+ ...t,
366
+ detail: r,
367
+ id: `${e}:${n}:${t.kind}:${t.source?.item ?? 0}`
368
+ });
369
+ }
370
+ }, {
371
+ id: t,
372
+ start: n[0].at
373
+ }, e, { sha256: "" }, n, {
374
+ where: (e) => ({ line: n[e].seq + 1 }),
375
+ full: () => null
376
+ }, () => "other");
377
+ return {
378
+ schema: "agent-record.v1",
379
+ runId: e,
380
+ title: e,
381
+ nodes: n.map((e) => ({
382
+ ...e,
383
+ kind: "agent"
384
+ })),
385
+ events: i,
386
+ sources: [],
387
+ assignment: {
388
+ objective: "",
389
+ suppliedKnowledge: "",
390
+ deliverables: "",
391
+ constraints: "",
392
+ source: null
393
+ },
394
+ terminal: null,
395
+ coverage: {
396
+ completeOriginalCapture: !1,
397
+ publicContent: "Live stream window",
398
+ categoryMethod: "Runtime event kind",
399
+ cost: "Unknown"
400
+ }
401
+ };
402
+ }
403
+ function O({ runUrl: e, runId: t, alive: n, selected: i, onSelect: o, onRecorded: s, onEmpty: c, chooser: l = !0, opening: u }) {
404
+ let d = i ?? t, [f, p] = (0, y.useState)({
405
+ rows: [],
406
+ nodes: [],
407
+ earlier: !1,
408
+ more: !1,
409
+ loading: !0,
410
+ error: null,
411
+ ended: !1,
412
+ history: !1,
413
+ emptyTail: !1
414
+ }), [m, g] = (0, y.useState)(0), [_, v] = (0, y.useState)(!1), b = (0, y.useRef)(null), x = (0, y.useRef)(null), S = (0, y.useRef)(n), C = (0, y.useRef)({
415
+ node: d,
416
+ rows: [],
417
+ earlier: !1,
418
+ generation: void 0,
419
+ first: null,
420
+ last: null
421
+ });
422
+ (0, y.useEffect)(() => {
423
+ let t = !1, r = 0, i, a = new AbortController(), o = C.current.node === d && S.current && !n;
424
+ S.current = n;
425
+ let { rows: s, earlier: c, generation: l, first: u, last: f } = o ? C.current : {
426
+ rows: [],
427
+ earlier: !1,
428
+ generation: void 0,
429
+ first: null,
430
+ last: null
431
+ }, m = !1, h = !1, g = _ || !n && !o, v = () => {
432
+ i?.close(), i = void 0, window.clearTimeout(r);
433
+ }, y = (e) => {
434
+ t || p((t) => ({
435
+ ...t,
436
+ loading: !1,
437
+ error: e instanceof Error ? e.message : String(e)
438
+ }));
439
+ };
440
+ p((e) => ({
441
+ ...e,
442
+ rows: s,
443
+ earlier: c,
444
+ more: !1,
445
+ loading: !0,
446
+ error: null,
447
+ history: !1,
448
+ emptyTail: !1,
449
+ ended: !1
450
+ }));
451
+ let w = (e, n) => {
452
+ if (t) return;
453
+ let r = !s.length || n === "tail" || n === "head" || e.reset || e.generation !== void 0 && l !== void 0 && e.generation !== l, i = r ? e.events : n === "before" ? [...e.events, ...s] : [...s, ...e.events];
454
+ l = e.generation ?? l, r ? (u = e.firstSeq ?? e.events[0]?.seq ?? null, f = e.lastSeq ?? e.events.at(-1)?.seq ?? null) : n === "before" ? u = e.firstSeq ?? u : f = e.lastSeq ?? e.events.at(-1)?.seq ?? f, s = [...new Map(i.map((e) => [e.seq, e])).values()].sort((e, t) => e.seq - t.seq);
455
+ let a = s.length > E;
456
+ a && (s = m ? s.slice(0, E) : s.slice(-2e3)), a && !m && (u = s[0]?.seq ?? u), (n !== "after" || r) && (c = e.hasEarlier ?? (u !== null && u > 0)), a && n !== "before" && (c = !0), C.current = {
457
+ node: d,
458
+ rows: s,
459
+ earlier: c,
460
+ generation: l,
461
+ first: u,
462
+ last: f
463
+ }, p((t) => ({
464
+ rows: s,
465
+ nodes: e.nodes ?? t.nodes,
466
+ earlier: c,
467
+ generation: l,
468
+ more: n === "before" ? t.more : g && !!e.hasMore,
469
+ loading: !1,
470
+ error: null,
471
+ history: m,
472
+ emptyTail: e.alive === !1 && !s.length && u === null && f === null,
473
+ ended: e.alive === !1
474
+ }));
475
+ }, D = () => {
476
+ if (t || !n || g || m) return;
477
+ v();
478
+ let a = new URLSearchParams();
479
+ f !== null && a.set("after", String(f)), l && a.set("generation", l);
480
+ let o = i = new EventSource(`${e}/agents/${encodeURIComponent(d)}/stream?${a}`);
481
+ o.onopen = () => {
482
+ t || p((e) => ({
483
+ ...e,
484
+ error: null
485
+ }));
486
+ };
487
+ for (let e of ["rows", "reset"]) o.addEventListener(e, (n) => {
488
+ if (!(t || m || i !== o)) try {
489
+ let t = JSON.parse(n.data);
490
+ if (e === "rows" && !Array.isArray(t.events)) throw Error("Invalid live transcript frame");
491
+ w({
492
+ ...t,
493
+ events: e === "reset" ? [] : t.events,
494
+ reset: e === "reset"
495
+ }, "after");
496
+ } catch (e) {
497
+ y(e);
498
+ }
499
+ });
500
+ o.addEventListener("end", () => {
501
+ i === o && (v(), p((e) => ({
502
+ ...e,
503
+ loading: !1,
504
+ ended: !0,
505
+ emptyTail: !e.rows.length && u === null && f === null
506
+ })));
507
+ }), o.addEventListener("unavailable", () => y("Live updates are temporarily unavailable")), o.onerror = () => {
508
+ i === o && (v(), !t && !m && (r = window.setTimeout(D, 1e3)));
509
+ };
510
+ }, O = async (r) => {
511
+ if (t || h) return;
512
+ h = !0;
513
+ let i = r === "after" ? f : r === "before" ? u : r === "head" ? T : null;
514
+ try {
515
+ let o = new URLSearchParams({
516
+ node: d,
517
+ limit: String(T)
518
+ });
519
+ i !== null && o.set(r === "head" ? "before" : r, String(i)), l && i !== null && o.set("generation", l);
520
+ let s = await fetch(`${e}/transcript?${o}`, {
521
+ signal: a.signal,
522
+ credentials: "same-origin"
523
+ });
524
+ if (!s.ok) throw Error(`Transcript unavailable (HTTP ${s.status})`);
525
+ let c = await s.json();
526
+ if (t) return;
527
+ if (r === "head" && !c.events.length) {
528
+ queueMicrotask(() => void O("tail"));
529
+ return;
530
+ }
531
+ w(c, r), !g && r !== "before" && (!n && c.hasMore && f !== i ? queueMicrotask(() => void O("after")) : D());
532
+ } catch (e) {
533
+ !t && !a.signal.aborted && (y(e), D());
534
+ } finally {
535
+ h = !1;
536
+ }
537
+ };
538
+ return b.current = () => {
539
+ v(), m = !0, p((e) => ({
540
+ ...e,
541
+ history: !g
542
+ })), O("before");
543
+ }, x.current = () => void O("after"), O(o && f !== null ? "after" : g ? "head" : "tail"), () => {
544
+ t = !0, a.abort(), v(), b.current = null, x.current = null;
545
+ };
546
+ }, [
547
+ e,
548
+ d,
549
+ n,
550
+ m,
551
+ _
552
+ ]), (0, y.useEffect)(() => {
553
+ f.emptyTail && c && c();
554
+ }, [f.emptyTail, c]);
555
+ let O = f.nodes.some((e) => e.id === d) ? f.nodes : [...f.nodes, {
556
+ id: d,
557
+ label: d === t ? "Root" : d,
558
+ parent: null
559
+ }], k = (0, y.useMemo)(() => h(r(D(t, d, O, f.rows))), [
560
+ t,
561
+ d,
562
+ f.nodes,
563
+ f.rows
564
+ ]);
565
+ return /* @__PURE__ */ (0, w.jsxs)("section", {
566
+ className: "run-panel live-transcript",
567
+ "aria-label": "Conversations",
568
+ children: [
569
+ (l || s) && /* @__PURE__ */ (0, w.jsxs)("div", {
570
+ className: "message-filters",
571
+ children: [l && /* @__PURE__ */ (0, w.jsxs)("label", { children: ["Agent ", /* @__PURE__ */ (0, w.jsx)("select", {
572
+ "aria-label": "Agent conversation",
573
+ value: d,
574
+ onChange: (e) => o(e.target.value),
575
+ children: O.map((e) => /* @__PURE__ */ (0, w.jsxs)("option", {
576
+ value: e.id,
577
+ children: [e.label, e.parent ? " (child)" : " (root)"]
578
+ }, e.id))
579
+ })] }), s && /* @__PURE__ */ (0, w.jsx)("button", {
580
+ type: "button",
581
+ className: "ui-button",
582
+ onClick: s,
583
+ children: "Timeline and usage"
584
+ })]
585
+ }),
586
+ (f.earlier || f.history || _) && /* @__PURE__ */ (0, w.jsxs)("p", {
587
+ className: "transcript-edge",
588
+ children: [
589
+ n && !_ && f.earlier && /* @__PURE__ */ (0, w.jsx)("button", {
590
+ type: "button",
591
+ className: "link-button",
592
+ onClick: () => v(!0),
593
+ children: "Beginning"
594
+ }),
595
+ f.earlier && /* @__PURE__ */ (0, w.jsx)("button", {
596
+ type: "button",
597
+ className: "link-button",
598
+ disabled: f.loading,
599
+ onClick: () => b.current?.(),
600
+ children: "Load older"
601
+ }),
602
+ (f.history || _) && /* @__PURE__ */ (0, w.jsx)("button", {
603
+ type: "button",
604
+ className: "link-button",
605
+ onClick: () => {
606
+ v(!1), g((e) => e + 1);
607
+ },
608
+ children: "Latest"
609
+ })
610
+ ]
611
+ }),
612
+ f.loading && /* @__PURE__ */ (0, w.jsx)("p", {
613
+ role: "status",
614
+ children: "Loading transcript…"
615
+ }),
616
+ f.error && /* @__PURE__ */ (0, w.jsx)("p", {
617
+ role: "alert",
618
+ children: f.error
619
+ }),
620
+ f.rows.filter((e) => e.event?.kind === "capture_gap" && (!e.at || !Number.isFinite(Date.parse(e.at)))).map((e) => /* @__PURE__ */ (0, w.jsx)("p", {
621
+ className: "faint",
622
+ children: e.event?.text ?? "A stream record could not be displayed."
623
+ }, e.seq)),
624
+ !f.loading && !f.rows.length && !f.error && /* @__PURE__ */ (0, w.jsx)("p", { children: "No stream events have been retained for this agent." }),
625
+ (!f.loading || f.rows.length > 0) && /* @__PURE__ */ (0, w.jsx)(a, {
626
+ index: k,
627
+ actor: d,
628
+ cutoff: Infinity,
629
+ query: "",
630
+ category: "all",
631
+ lifecycle: !0,
632
+ live: n && !f.ended,
633
+ follow: n && !f.ended && !_ && !f.history,
634
+ opening: f.earlier ? void 0 : u
635
+ }, `${d}:${_}:${f.generation ?? ""}`),
636
+ f.more && /* @__PURE__ */ (0, w.jsx)("p", {
637
+ className: "transcript-edge",
638
+ children: /* @__PURE__ */ (0, w.jsx)("button", {
639
+ type: "button",
640
+ className: "link-button",
641
+ disabled: f.loading,
642
+ onClick: () => x.current?.(),
643
+ children: "Load more"
644
+ })
645
+ })
646
+ ]
647
+ });
648
+ }
649
+ //#endregion
650
+ //#region src/workspace/run/Conversations.tsx
651
+ function k(e, t) {
652
+ let n = t.trim().toLowerCase(), r = e.tree.filter((e) => !n || `${e.name} ${e.node.label}`.toLowerCase().includes(n));
653
+ if (!e.teams.length) return r.map((e) => ({
654
+ kind: "agent",
655
+ a: e
656
+ }));
657
+ let i = r.filter((e) => !e.team || e.team === e.id).map((e) => ({
658
+ kind: "agent",
659
+ a: e
660
+ }));
661
+ for (let t of e.teams) {
662
+ let e = r.filter((e) => e.team === t.id && e.id !== t.id);
663
+ if (e.length) {
664
+ i.push({
665
+ kind: "team",
666
+ id: t.id,
667
+ label: t.label,
668
+ n: e.length
669
+ });
670
+ for (let t of e) i.push({
671
+ kind: "agent",
672
+ a: t
673
+ });
674
+ }
675
+ }
676
+ return i;
677
+ }
678
+ function A({ m: e, doc: t, runUrl: n, agent: r, selectAgent: a, route: p }) {
679
+ let [m, h] = (0, y.useState)(""), b = (0, y.useMemo)(() => k(e, m), [e, m]), x = (0, y.useRef)(null), S = (r ? e.byId.get(r) : null) ?? e.root, C = t.run.record.digest ?? null, T = t.run.record.status === "ready" || !!C, E = C ? `&digest=${C}` : "", D = g(T ? `${n}/record?part=nodes${E}` : null), A = D.index, M = !!t.execution?.alive, N = e.agents.length, P = !!p.params.get("agent"), F = S && A && A.nodes.has(A.canonical(S.id)), [I, L] = (0, y.useState)(/* @__PURE__ */ new Set()), R = (0, y.useMemo)(() => {
680
+ let n = [t.input?.objective, t.input?.instruction].filter((e) => typeof e == "string" && e.trim().length > 0).join("\n\n");
681
+ return S && S.id === e.root?.id && n ? {
682
+ text: n,
683
+ at: t.run.startedAt ?? new Date(e.t0).toISOString()
684
+ } : void 0;
685
+ }, [
686
+ t,
687
+ S,
688
+ e
689
+ ]);
690
+ return (0, y.useEffect)(() => L(/* @__PURE__ */ new Set()), [t.run.id]), /* @__PURE__ */ (0, w.jsxs)("div", {
691
+ className: "rp-conv",
692
+ "data-picked": P ? "" : void 0,
693
+ children: [/* @__PURE__ */ (0, w.jsxs)("aside", {
694
+ className: "rp-card",
695
+ "aria-label": "Agents",
696
+ children: [
697
+ /* @__PURE__ */ (0, w.jsx)("div", {
698
+ className: "rp-hd",
699
+ children: /* @__PURE__ */ (0, w.jsxs)("h2", { children: ["Agents", /* @__PURE__ */ (0, w.jsx)("span", {
700
+ className: "ct",
701
+ children: N
702
+ })] })
703
+ }),
704
+ /* @__PURE__ */ (0, w.jsx)("div", {
705
+ className: "rp-fbar",
706
+ children: /* @__PURE__ */ (0, w.jsxs)("label", {
707
+ className: "rp-field",
708
+ children: [/* @__PURE__ */ (0, w.jsx)(l, { name: "search" }), /* @__PURE__ */ (0, w.jsx)("input", {
709
+ value: m,
710
+ onChange: (e) => h(e.target.value),
711
+ placeholder: `Search ${N} agents`,
712
+ "aria-label": "Search agents"
713
+ })]
714
+ })
715
+ }),
716
+ /* @__PURE__ */ (0, w.jsxs)("div", {
717
+ className: "rp-alist",
718
+ ref: x,
719
+ role: "list",
720
+ tabIndex: 0,
721
+ "aria-label": "Run agents",
722
+ children: [/* @__PURE__ */ (0, w.jsx)(i, {
723
+ items: b,
724
+ keyOf: (e) => e.kind === "team" ? `t:${e.id}` : e.a.id,
725
+ scroller: x,
726
+ estimate: () => 52,
727
+ target: r ?? void 0,
728
+ render: (t) => t.kind === "team" ? /* @__PURE__ */ (0, w.jsxs)("div", {
729
+ className: "ag",
730
+ style: { height: 52 },
731
+ children: [
732
+ /* @__PURE__ */ (0, w.jsx)(l, {
733
+ name: "users",
734
+ size: 14
735
+ }),
736
+ t.label,
737
+ /* @__PURE__ */ (0, w.jsx)("span", {
738
+ className: "ct",
739
+ children: t.n
740
+ })
741
+ ]
742
+ }, `t:${t.id}`) : /* @__PURE__ */ (0, w.jsxs)("button", {
743
+ type: "button",
744
+ role: "listitem",
745
+ "aria-current": t.a.id === S?.id,
746
+ style: { height: 52 },
747
+ onClick: () => a(t.a.id),
748
+ children: [
749
+ /* @__PURE__ */ (0, w.jsxs)("span", {
750
+ className: "rp-agent-logos",
751
+ children: [/* @__PURE__ */ (0, w.jsx)(o, {
752
+ type: t.a.harness === "claude" ? "claude-code" : t.a.harness ?? "cli-base",
753
+ size: 18
754
+ }), /* @__PURE__ */ (0, w.jsx)(v, {
755
+ provider: t.a.model ?? void 0,
756
+ size: "xs"
757
+ })]
758
+ }),
759
+ /* @__PURE__ */ (0, w.jsxs)("span", {
760
+ className: "nm",
761
+ title: t.a.name,
762
+ children: [/* @__PURE__ */ (0, w.jsx)(f, { tone: t.a.state.tone }), /* @__PURE__ */ (0, w.jsx)(u, {
763
+ text: t.a.name,
764
+ query: m
765
+ })]
766
+ }),
767
+ /* @__PURE__ */ (0, w.jsx)("span", {
768
+ className: "sb",
769
+ children: t.a.steps.length || t.a.turns ? `${c(t.a.steps.length, "step")}${t.a.first === null ? "" : ` · ${s(e.t0, t.a.first, t.a.state.tone === "live" ? "now" : t.a.last ?? t.a.first)}`}` : t.a.state.label
770
+ }),
771
+ /* @__PURE__ */ (0, w.jsx)("span", {
772
+ className: "n",
773
+ children: t.a.tokens === null ? "" : d(t.a.tokens)
774
+ })
775
+ ]
776
+ }, t.a.id)
777
+ }), !b.length && /* @__PURE__ */ (0, w.jsxs)("p", {
778
+ className: "rp-empty",
779
+ children: [
780
+ "No agent matches “",
781
+ m,
782
+ "”."
783
+ ]
784
+ })]
785
+ })
786
+ ]
787
+ }), S && /* @__PURE__ */ (0, w.jsxs)("article", {
788
+ className: "rp-card",
789
+ "aria-label": `${S.name}: conversation`,
790
+ children: [/* @__PURE__ */ (0, w.jsxs)("div", {
791
+ className: "rp-hd",
792
+ children: [
793
+ /* @__PURE__ */ (0, w.jsx)("button", {
794
+ type: "button",
795
+ className: "rp-back",
796
+ onClick: () => a(null),
797
+ "aria-label": "All agents",
798
+ children: /* @__PURE__ */ (0, w.jsx)(l, {
799
+ name: "arrow",
800
+ size: 16
801
+ })
802
+ }),
803
+ /* @__PURE__ */ (0, w.jsxs)("h2", { children: [/* @__PURE__ */ (0, w.jsx)(f, { tone: S.state.tone }), S.name] }),
804
+ /* @__PURE__ */ (0, w.jsx)("span", {
805
+ className: "muted ph-hide",
806
+ children: [S.model, S.harness].filter(Boolean).join(" · ")
807
+ }),
808
+ S.toolFailures > 0 && /* @__PURE__ */ (0, w.jsx)("span", {
809
+ className: "rp-pill danger",
810
+ children: c(S.toolFailures, "tool error")
811
+ })
812
+ ]
813
+ }), /* @__PURE__ */ (0, w.jsx)("div", {
814
+ className: "rp-scroll rp-tx",
815
+ children: !M && F ? /* @__PURE__ */ (0, w.jsx)(_, {
816
+ runUrl: n,
817
+ version: E,
818
+ index: A,
819
+ actor: A.canonical(S.id),
820
+ opening: R
821
+ }, S.id) : !M && (D.loading || D.pending) ? /* @__PURE__ */ (0, w.jsx)("p", {
822
+ className: "ws-status",
823
+ role: "status",
824
+ children: "Loading the conversation…"
825
+ }) : I.has(S.id) ? /* @__PURE__ */ (0, w.jsx)(j, {
826
+ m: e,
827
+ a: S
828
+ }) : /* @__PURE__ */ (0, w.jsx)(O, {
829
+ runUrl: n,
830
+ runId: t.run.id,
831
+ alive: M,
832
+ selected: S.id,
833
+ onSelect: (e) => a(e),
834
+ chooser: !1,
835
+ opening: R,
836
+ onEmpty: () => L((e) => /* @__PURE__ */ new Set([...e, S.id]))
837
+ }, S.id)
838
+ })]
839
+ })]
840
+ });
841
+ }
842
+ function j({ m: e, a: t }) {
843
+ let n = p(e.t0), r = [];
844
+ for (let e of t.steps) {
845
+ if (e.kind === "waiting") continue;
846
+ let t = e.kind === "model" ? "model call" : e.tool ?? "tool", n = r[r.length - 1];
847
+ n && n.name === t && e.t - n.end < 6e4 ? (n.n++, n.end = e.t + e.d, n.failed += +!!e.failed, e.target && n.targets.add(e.target)) : r.push({
848
+ name: t,
849
+ model: e.kind === "model",
850
+ n: 1,
851
+ at: e.t,
852
+ end: e.t + e.d,
853
+ failed: +!!e.failed,
854
+ targets: new Set(e.target ? [e.target] : [])
855
+ });
856
+ }
857
+ return r.length ? /* @__PURE__ */ (0, w.jsxs)("div", {
858
+ className: "rp-steplog",
859
+ children: [/* @__PURE__ */ (0, w.jsxs)("p", {
860
+ className: "rp-note",
861
+ children: [
862
+ "No conversation was recorded for this agent; these are its ",
863
+ c(t.steps.length, "recorded step"),
864
+ "."
865
+ ]
866
+ }), r.map((e, t) => /* @__PURE__ */ (0, w.jsxs)("div", {
867
+ className: "rp-msg",
868
+ children: [/* @__PURE__ */ (0, w.jsx)("time", { children: n(e.at) }), /* @__PURE__ */ (0, w.jsxs)("div", { children: [/* @__PURE__ */ (0, w.jsxs)("span", {
869
+ className: `rp-tchip${e.failed ? " fail" : ""}`,
870
+ children: [
871
+ /* @__PURE__ */ (0, w.jsx)("i", { className: e.model ? "model" : "" }),
872
+ /* @__PURE__ */ (0, w.jsxs)("span", {
873
+ className: "t",
874
+ children: [e.name, e.n > 1 ? ` ×${e.n}` : ""]
875
+ }),
876
+ e.targets.size > 0 && /* @__PURE__ */ (0, w.jsxs)("span", {
877
+ className: "a",
878
+ children: [[...e.targets].slice(0, 2).join(", "), e.targets.size > 2 ? ` +${e.targets.size - 2}` : ""]
879
+ }),
880
+ /* @__PURE__ */ (0, w.jsx)("span", {
881
+ className: "dim",
882
+ children: m(e.end - e.at)
883
+ })
884
+ ]
885
+ }), e.failed > 0 && /* @__PURE__ */ (0, w.jsxs)("span", {
886
+ className: "rp-errline",
887
+ children: [
888
+ "✕ ",
889
+ e.failed,
890
+ " failed"
891
+ ]
892
+ })] })]
893
+ }, t))]
894
+ }) : /* @__PURE__ */ (0, w.jsxs)("p", {
895
+ className: "ws-status",
896
+ children: [
897
+ "No conversation or step was recorded for ",
898
+ t.name,
899
+ "."
900
+ ]
901
+ });
902
+ }
903
+ //#endregion
904
+ export { A as Conversations };