@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
@@ -1,13 +1,13 @@
1
- import { recordSchema as e } from "./record.js";
2
- import { t } from "./part-events-BrLrg_EV.js";
1
+ import { n as e, r as t } from "./record-CsP_3NJS.js";
3
2
  import { n, t as r } from "./anchor-C4i5SrB9.js";
4
3
  import { createHash as i } from "node:crypto";
5
4
  import { closeSync as a, copyFileSync as o, existsSync as s, mkdtempSync as c, openSync as l, readFileSync as u, readSync as d, readdirSync as f, rmSync as p, statSync as m } from "node:fs";
6
5
  import { tmpdir as h } from "node:os";
7
6
  import { basename as g, dirname as _, join as v } from "node:path";
7
+ import { pathToFileURL as y } from "node:url";
8
8
  //#region src/adapters/agent-runtime.ts
9
- var y = "2.7.0", b = 134217728;
10
- function x({ maxBytes: e = 1073741824 } = {}) {
9
+ var b = "2.7.0", x = 134217728;
10
+ function S({ maxBytes: e = 1073741824 } = {}) {
11
11
  let t = /* @__PURE__ */ new Map(), n = 0;
12
12
  return {
13
13
  read(r) {
@@ -16,7 +16,7 @@ function x({ maxBytes: e = 1073741824 } = {}) {
16
16
  let s = u(r), c = {
17
17
  key: a,
18
18
  bytes: s,
19
- sha256: T(s)
19
+ sha256: E(s)
20
20
  };
21
21
  s.length <= e / 4 && (t.set(r, c), n += s.length);
22
22
  for (let [r, i] of t) {
@@ -28,17 +28,17 @@ function x({ maxBytes: e = 1073741824 } = {}) {
28
28
  heldBytes: () => n
29
29
  };
30
30
  }
31
- var S = class extends Error {
31
+ var C = class extends Error {
32
32
  exitCode = 2;
33
- }, C = class extends Error {
33
+ }, w = class extends Error {
34
34
  exitCode = 3;
35
35
  code = "record-too-large";
36
- }, w = class extends Error {
36
+ }, T = class extends Error {
37
37
  exitCode = 4;
38
- }, T = (e) => i("sha256").update(e).digest("hex"), E = (e) => typeof e == "string" && /^(sha256[:-])?[0-9a-f]{64}$/.test(e) ? e.slice(-64) : null, D = /(^|\/)\.claude\/projects\/[^/]+\/[^/]+\.jsonl$/, O = (e) => D.test(e) ? e.slice(e.lastIndexOf(".claude/projects/")) : null, k = /(^|\/)\.local\/share\/opencode\/opencode\.db$/, A = "evidence/native-index.jsonl", j = "evidence/live-stream", M = Date.UTC(2001, 0, 1), N = Date.UTC(2100, 0, 1), P = (e) => {
38
+ }, E = (e) => i("sha256").update(e).digest("hex"), D = (e) => typeof e == "string" && /^(sha256[:-])?[0-9a-f]{64}$/.test(e) ? e.slice(-64) : null, O = /(^|\/)\.claude\/projects\/[^/]+\/[^/]+\.jsonl$/, k = (e) => O.test(e) ? e.slice(e.lastIndexOf(".claude/projects/")) : null, A = /(^|\/)\.local\/share\/opencode\/opencode\.db$/, j = "evidence/native-index.jsonl", M = "evidence/live-stream", N = Date.UTC(2001, 0, 1), ee = Date.UTC(2100, 0, 1), P = (e) => {
39
39
  if (typeof e != "string" && typeof e != "number") return null;
40
40
  let t = new Date(typeof e == "number" && e < 1e11 ? e * 1e3 : e), n = t.valueOf();
41
- return Number.isFinite(n) && n >= M && n < N ? t.toISOString() : null;
41
+ return Number.isFinite(n) && n >= N && n < ee ? t.toISOString() : null;
42
42
  };
43
43
  function F(e) {
44
44
  if (e == null) return "null";
@@ -67,7 +67,7 @@ function I(e) {
67
67
  t += [...typeof e == "string" ? e : e === null ? "None" : String(e)].length;
68
68
  }
69
69
  return {
70
- contentSha256: T(F(e)),
70
+ contentSha256: E(F(e)),
71
71
  contentCharacters: t
72
72
  };
73
73
  }
@@ -191,18 +191,18 @@ var J = class {
191
191
  if (n) return n;
192
192
  let r = this.options.files?.read(t), i = r?.bytes ?? u(t), a, o = {
193
193
  bytes: i,
194
- sha256: r?.sha256 ?? T(i),
194
+ sha256: r?.sha256 ?? E(i),
195
195
  get text() {
196
196
  return a ??= i.toString("utf8");
197
197
  }
198
198
  }, s = this.manifestFiles.get(this.sourcePath(e));
199
- if (s && E(s.sha256) !== o.sha256) throw new w(`${e} does not match its snapshot manifest`);
199
+ if (s && D(s.sha256) !== o.sha256) throw new T(`${e} does not match its snapshot manifest`);
200
200
  return this.fileCache.set(t, o), o;
201
201
  }
202
202
  digestOnly(e, t = v(this.runDir, e)) {
203
203
  let n = this.manifestFiles.get(this.sourcePath(e));
204
204
  if (n) return {
205
- sha256: E(n.sha256),
205
+ sha256: D(n.sha256),
206
206
  bytes: n.bytes
207
207
  };
208
208
  if (this.options.files) try {
@@ -259,7 +259,7 @@ var J = class {
259
259
  return this.addSource({
260
260
  path: e,
261
261
  line: t,
262
- sha256: T(r),
262
+ sha256: E(r),
263
263
  bytes: r.length
264
264
  });
265
265
  }
@@ -268,7 +268,7 @@ var J = class {
268
268
  return this.addSource({
269
269
  path: e,
270
270
  pointer: t,
271
- sha256: T(i),
271
+ sha256: E(i),
272
272
  bytes: i.length,
273
273
  ...r ? { label: r } : {}
274
274
  });
@@ -341,7 +341,7 @@ var J = class {
341
341
  e && typeof t == "string" && /^sandbox-/.test(t) && !e.sandboxes.includes(t) && e.sandboxes.push(t);
342
342
  }
343
343
  blob(e) {
344
- let t = E(e);
344
+ let t = D(e);
345
345
  if (!t) return null;
346
346
  let n = `blobs/sha256-${t}.json`, r = v(this.runDir, n);
347
347
  if (!s(r)) return null;
@@ -513,9 +513,9 @@ var J = class {
513
513
  if (n?.value?.kind !== "retained-harness-transcript") continue;
514
514
  let o = n.value;
515
515
  this.fileSource(n.rel);
516
- let c = E(o.snapshot?.archive?.sha256 ?? o.snapshot?.archive?.locator?.digest), l = typeof o.source?.nativeSessionId == "string" ? o.source.nativeSessionId : null;
516
+ let c = D(o.snapshot?.archive?.sha256 ?? o.snapshot?.archive?.locator?.digest), l = typeof o.source?.nativeSessionId == "string" ? o.source.nativeSessionId : null;
517
517
  e.nativeSessionId ??= l ?? void 0, typeof o.harness == "string" && (e.harness ??= o.harness), this.addSandbox(e, o.source?.environmentId);
518
- let u = (Array.isArray(o.files) ? o.files : []).filter((e) => typeof e?.path == "string" && D.test(e.path)).filter((e) => !l || e.path.endsWith(`/${l}.jsonl`));
518
+ let u = (Array.isArray(o.files) ? o.files : []).filter((e) => typeof e?.path == "string" && O.test(e.path)).filter((e) => !l || e.path.endsWith(`/${l}.jsonl`));
519
519
  if (!c || !u.length) continue;
520
520
  let d = a(c);
521
521
  if (!d) {
@@ -537,7 +537,7 @@ var J = class {
537
537
  });
538
538
  continue;
539
539
  }
540
- let a = v(d, r), o = `native:${c}/${r}`, u = this.file(o, a), f = E(t.sha256);
540
+ let a = v(d, r), o = `native:${c}/${r}`, u = this.file(o, a), f = D(t.sha256);
541
541
  if (f && f !== u.sha256) {
542
542
  this.gaps.push({
543
543
  nodeId: e.id,
@@ -546,17 +546,17 @@ var J = class {
546
546
  });
547
547
  continue;
548
548
  }
549
- i(O(t.path), o, a, c, l);
549
+ i(k(t.path), o, a, c, l);
550
550
  }
551
551
  }
552
552
  let o = this.nativeIndex().get(e.id);
553
553
  if (o) {
554
- let t = E(o.snapshot?.archive);
554
+ let t = D(o.snapshot?.archive);
555
555
  this.addSandbox(e, o.environmentId), typeof o.harness == "string" && (e.harness ??= o.harness);
556
556
  let n = t ? a(t) : void 0;
557
557
  t && !n && (r = !0);
558
558
  for (let e of n && Array.isArray(o.native?.sessions) ? o.native.sessions : []) {
559
- let r = typeof e?.path == "string" ? O(e.path) : null;
559
+ let r = typeof e?.path == "string" ? k(e.path) : null;
560
560
  if (!r || typeof e.sandboxSessionId != "string" || typeof e.rootScope != "string") continue;
561
561
  let a = [
562
562
  "workspace/__retention__/sessions",
@@ -584,7 +584,7 @@ var J = class {
584
584
  ].map((e) => v(this.nativeRoot, e)).find((e) => s(e)) : void 0;
585
585
  }
586
586
  nativeStore(e) {
587
- let t = this.nativeIndex().get(e.id), n = E(t?.snapshot?.archive), r = n ? this.nativeCacheDir(n) : void 0, i = (Array.isArray(t?.native?.sessions) ? t.native.sessions : []).filter((e) => typeof e?.path == "string" && k.test(e.path) && typeof e.sandboxSessionId == "string" && typeof e.rootScope == "string");
587
+ let t = this.nativeIndex().get(e.id), n = D(t?.snapshot?.archive), r = n ? this.nativeCacheDir(n) : void 0, i = (Array.isArray(t?.native?.sessions) ? t.native.sessions : []).filter((e) => typeof e?.path == "string" && A.test(e.path) && typeof e.sandboxSessionId == "string" && typeof e.rootScope == "string");
588
588
  if (!r || !i.length) return null;
589
589
  let a = (e) => [
590
590
  "workspace/__retention__/sessions",
@@ -608,9 +608,9 @@ var J = class {
608
608
  }
609
609
  nativeIndex() {
610
610
  if (this.nativeIndexCache) return this.nativeIndexCache;
611
- let e = /* @__PURE__ */ new Map(), t = v(this.runDir, A);
611
+ let e = /* @__PURE__ */ new Map(), t = v(this.runDir, j);
612
612
  if (s(t)) {
613
- this.listSource(A);
613
+ this.listSource(j);
614
614
  for (let n of H(this.options.files?.read(t).bytes ?? u(t))) {
615
615
  let t = n.value;
616
616
  if (t?.schema !== "disco.native-capture.v1" || typeof t.nodeId != "string") continue;
@@ -808,7 +808,7 @@ var J = class {
808
808
  });
809
809
  }
810
810
  readLiveStream(e) {
811
- let t = `${j}/${encodeURIComponent(e.id)}`, n = G(v(this.runDir, t)).filter((e) => e.endsWith(".jsonl")), r = 0;
811
+ let t = `${M}/${encodeURIComponent(e.id)}`, n = G(v(this.runDir, t)).filter((e) => e.endsWith(".jsonl")), r = 0;
812
812
  for (let i of n) {
813
813
  let n = `${t}/${i}`, a = this.file(n);
814
814
  if (!this.claim(a.sha256, e.id, n)) continue;
@@ -843,14 +843,14 @@ var J = class {
843
843
  code: "no-transcript:opencode-store-unreadable",
844
844
  detail: "this Node has no node:sqlite"
845
845
  }), !1;
846
- let i = c(v(h(), "agent-record-opencode-")), a;
846
+ let i = s(`${t.abs}-wal`) ? c(v(h(), "agent-record-opencode-")) : null, a;
847
847
  try {
848
- for (let e of [
848
+ if (i) for (let e of [
849
849
  "",
850
850
  "-wal",
851
851
  "-shm"
852
852
  ]) s(t.abs + e) && o(t.abs + e, v(i, `opencode.db${e}`));
853
- let e = new r.DatabaseSync(v(i, "opencode.db"), { readOnly: !0 });
853
+ let e = new r.DatabaseSync(i ? v(i, "opencode.db") : `${y(t.abs).href}?immutable=1`, { readOnly: !0 });
854
854
  try {
855
855
  let n = JSON.stringify(t.sessionIds), r = "session_id IN (SELECT value FROM json_each(?))";
856
856
  a = {
@@ -868,7 +868,7 @@ var J = class {
868
868
  detail: `${this.sourcePath(t.rel)}: ${String(n?.message ?? n).slice(0, 200)}`
869
869
  }), !1;
870
870
  } finally {
871
- p(i, {
871
+ i && p(i, {
872
872
  recursive: !0,
873
873
  force: !0
874
874
  });
@@ -1008,7 +1008,7 @@ var J = class {
1008
1008
  return {
1009
1009
  rel: t,
1010
1010
  sessionId: L(i?.id) || g(e, ".jsonl"),
1011
- digest: o === null ? null : `sha256:${T(JSON.stringify(o))}`,
1011
+ digest: o === null ? null : `sha256:${E(JSON.stringify(o))}`,
1012
1012
  rows: r,
1013
1013
  sha256: n.sha256
1014
1014
  };
@@ -1414,7 +1414,7 @@ var J = class {
1414
1414
  this.fileSource(t);
1415
1415
  let a = (e) => {
1416
1416
  let t = e.value.event;
1417
- return `${t.kind}\0${t.toolCallId ?? ""}\0${T(JSON.stringify(t.text ?? t.args ?? t.result ?? ""))}`;
1417
+ return `${t.kind}\0${t.toolCallId ?? ""}\0${E(JSON.stringify(t.text ?? t.args ?? t.result ?? ""))}`;
1418
1418
  }, o = /* @__PURE__ */ new Map();
1419
1419
  for (let e of i) {
1420
1420
  let t = Number(e.value.attempt ?? 1), n = o.get(t) ?? [];
@@ -1582,7 +1582,7 @@ var J = class {
1582
1582
  ...c ? { atBasis: "snapshot-mtime" } : {},
1583
1583
  ...a("kind") ? { pageKind: a("kind") } : {},
1584
1584
  bodyLine: p,
1585
- contentSha256: T(f),
1585
+ contentSha256: E(f),
1586
1586
  recordedClaim: m.text,
1587
1587
  ...m.clip ? { clip: m.clip } : {}
1588
1588
  }
@@ -1595,9 +1595,9 @@ var J = class {
1595
1595
  try {
1596
1596
  t = m(e);
1597
1597
  } catch {
1598
- throw new S(`Run directory is unreadable: ${e}`);
1598
+ throw new C(`Run directory is unreadable: ${e}`);
1599
1599
  }
1600
- if (!t.isDirectory()) throw new S(`Not a directory: ${e}`);
1600
+ if (!t.isDirectory()) throw new C(`Not a directory: ${e}`);
1601
1601
  this.readRunInput(), this.readJournal();
1602
1602
  let n = this.result = this.resultJson(), r = this.nodes.size > 0, i = G(v(e, "kb/pages")).filter((e) => e.endsWith(".md"));
1603
1603
  if (!r) {
@@ -1656,7 +1656,7 @@ var J = class {
1656
1656
  let u = this.piSessions(), d = /* @__PURE__ */ new Map(), f = /* @__PURE__ */ new Map();
1657
1657
  for (let e of this.nodes.values()) e.taskDigest && f.set(e.taskDigest, e.id);
1658
1658
  let p = /* @__PURE__ */ new Map();
1659
- for (let [e, t] of this.executionOf) p.set(T(`cli-bridge/pi-session\0${e}`), {
1659
+ for (let [e, t] of this.executionOf) p.set(E(`cli-bridge/pi-session\0${e}`), {
1660
1660
  ...t,
1661
1661
  sessionId: e
1662
1662
  });
@@ -1880,14 +1880,14 @@ var J = class {
1880
1880
  t && n && !t.status && typeof n.kind == "string" && (t.status = n.kind, t.end ??= s.get(t.id)?.[1]), this.events.sort((e, t) => e.at < t.at ? -1 : e.at > t.at ? 1 : o.get(e.node) - o.get(t.node) || e.order - t.order);
1881
1881
  let c = /* @__PURE__ */ new Set();
1882
1882
  for (let e of this.events) {
1883
- if (c.has(e.id)) throw new w(`duplicate anchor ${e.id} (${e.source.path}${e.source.line ? `:${e.source.line}` : e.source.pointer ?? ""})`);
1883
+ if (c.has(e.id)) throw new T(`duplicate anchor ${e.id} (${e.source.path}${e.source.line ? `:${e.source.line}` : e.source.pointer ?? ""})`);
1884
1884
  c.add(e.id);
1885
1885
  }
1886
1886
  let l = /* @__PURE__ */ new Map();
1887
1887
  for (let e of this.sources.values()) {
1888
1888
  if (!e.sha256 || e.line !== void 0 || e.pointer !== void 0) continue;
1889
1889
  let t = e.sha256.slice(0, 12), n = l.get(t);
1890
- if (n && n !== e.sha256) throw new w(`object prefix ${t} names two objects`);
1890
+ if (n && n !== e.sha256) throw new T(`object prefix ${t} names two objects`);
1891
1891
  l.set(t, e.sha256);
1892
1892
  }
1893
1893
  let u = [...this.nodes.values()].map((e) => ({
@@ -1907,7 +1907,7 @@ var J = class {
1907
1907
  title: e.title ?? this.runId,
1908
1908
  producer: {
1909
1909
  name: "@drewstone/agent-record/adapters/agent-runtime",
1910
- version: y
1910
+ version: b
1911
1911
  },
1912
1912
  idScheme: r,
1913
1913
  input: {
@@ -1996,21 +1996,21 @@ function Y(e, t, n = "") {
1996
1996
  } finally {
1997
1997
  a(p);
1998
1998
  }
1999
- (c.digest("hex") !== E(o.sha256) || f !== o.bytes) && u.push(`${n}${t} does not match its sha256 or length`);
1999
+ (c.digest("hex") !== D(o.sha256) || f !== o.bytes) && u.push(`${n}${t} does not match its sha256 or length`);
2000
2000
  }
2001
- if (u.length) throw new w(`${u.length} files differ from the snapshot: ${u.slice(0, 5).join("; ")}`);
2001
+ if (u.length) throw new T(`${u.length} files differ from the snapshot: ${u.slice(0, 5).join("; ")}`);
2002
2002
  }
2003
2003
  function X(t, n) {
2004
2004
  let r = e.safeParse(t);
2005
2005
  if (!r.success) throw Error(`Produced record is invalid: ${r.error.message.slice(0, 2e3)}`);
2006
2006
  let i = JSON.stringify(t), a = Buffer.byteLength(i);
2007
- if (a > 134217728) throw new C(`record-too-large: ${a} bytes`);
2007
+ if (a > 134217728) throw new w(`record-too-large: ${a} bytes`);
2008
2008
  return {
2009
2009
  record: t,
2010
2010
  json: i,
2011
2011
  summary: {
2012
2012
  runId: t.runId,
2013
- recordDigest: T(i),
2013
+ recordDigest: E(i),
2014
2014
  bytes: a,
2015
2015
  nodes: t.nodes.length,
2016
2016
  events: t.events.length,
@@ -2047,22 +2047,22 @@ var Q = "agent-record.bundle.v1", $ = (e, t) => ({
2047
2047
  transcriptRefs: [],
2048
2048
  ...t
2049
2049
  });
2050
- function ee(e) {
2051
- if (e?.schema !== "agent-record.bundle.v1") throw new S(`bundle.json is not ${Q}`);
2052
- if (typeof e.recordId != "string" || !e.recordId) throw new S("bundle.json names no recordId");
2053
- if (!Array.isArray(e.sessions)) throw new S("bundle.json lists no sessions");
2050
+ function te(e) {
2051
+ if (e?.schema !== "agent-record.bundle.v1") throw new C(`bundle.json is not ${Q}`);
2052
+ if (typeof e.recordId != "string" || !e.recordId) throw new C("bundle.json names no recordId");
2053
+ if (!Array.isArray(e.sessions)) throw new C("bundle.json lists no sessions");
2054
2054
  let t = (e) => typeof e == "string" && e !== "" && !e.startsWith("/") && !e.split("/").includes("..");
2055
2055
  for (let n of [
2056
2056
  ...e.sessions,
2057
2057
  ...e.journals ?? [],
2058
2058
  ...e.runs ?? [],
2059
2059
  ...e.findings ?? []
2060
- ]) if (!t(n?.path)) throw new S(`bundle.json path ${JSON.stringify(n?.path)} leaves the bundle`);
2060
+ ]) if (!t(n?.path)) throw new C(`bundle.json path ${JSON.stringify(n?.path)} leaves the bundle`);
2061
2061
  return e;
2062
2062
  }
2063
- function te(e, t = {}) {
2063
+ function ne(e, t = {}) {
2064
2064
  t.manifest && Y(e, t.manifest);
2065
- let n = u(v(e, "bundle.json"), "utf8"), r = ee(JSON.parse(n)), i = Math.max(1024, t.maxText ?? 16384), a = new J(e, t.native, i, {
2065
+ let n = u(v(e, "bundle.json"), "utf8"), r = te(JSON.parse(n)), i = Math.max(1024, t.maxText ?? 16384), a = new J(e, t.native, i, {
2066
2066
  runId: r.recordId,
2067
2067
  manifest: t.manifest,
2068
2068
  manifestSha256: t.manifestSha256
@@ -2076,7 +2076,7 @@ function te(e, t = {}) {
2076
2076
  });
2077
2077
  r.convert();
2078
2078
  for (let [e, t] of r.nodes) {
2079
- if (a.nodes.has(e)) throw new w(`node ${e} appears twice in the bundle`);
2079
+ if (a.nodes.has(e)) throw new T(`node ${e} appears twice in the bundle`);
2080
2080
  a.nodes.set(e, t);
2081
2081
  }
2082
2082
  for (let e of r.events) a.events.push({
@@ -2188,7 +2188,7 @@ function te(e, t = {}) {
2188
2188
  rows: r,
2189
2189
  sha256: e.sha256
2190
2190
  }]);
2191
- } else throw new S(`bundle.json session ${t.path} has an unknown harness`);
2191
+ } else throw new C(`bundle.json session ${t.path} has an unknown harness`);
2192
2192
  l.set(t.path, n.id), d.push({
2193
2193
  session: t,
2194
2194
  node: n
@@ -2285,9 +2285,9 @@ function te(e, t = {}) {
2285
2285
  constraints: "",
2286
2286
  source: null
2287
2287
  },
2288
- input: { bundle: `sha256:${T(n)}` }
2288
+ input: { bundle: `sha256:${E(n)}` }
2289
2289
  });
2290
2290
  return X(h, y);
2291
2291
  }
2292
2292
  //#endregion
2293
- export { y as ADAPTER_VERSION, Q as BUNDLE_SCHEMA, r as ID_SCHEME, J as Ingest, b as MAX_RECORD_BYTES, C as RecordTooLargeError, S as RunUnreadableError, w as SnapshotMismatchError, V as categoryOf, x as createFileCache, X as finishRecord, te as ingestBundle, Z as ingestRun, Y as verifySnapshot };
2293
+ export { b as ADAPTER_VERSION, Q as BUNDLE_SCHEMA, r as ID_SCHEME, J as Ingest, x as MAX_RECORD_BYTES, w as RecordTooLargeError, C as RunUnreadableError, T as SnapshotMismatchError, V as categoryOf, S as createFileCache, X as finishRecord, ne as ingestBundle, Z as ingestRun, Y as verifySnapshot };
@@ -1,14 +1,14 @@
1
- import { a as e, l as t } from "./run-receipt-Bvi4-KVM.js";
1
+ import { a as e, l as t } from "./run-receipt-Bt2iXJUy.js";
2
2
  import { Fragment as n, createElement as r, useEffect as i, useRef as a, useState as o } from "react";
3
3
  //#region src/workspace/data.ts
4
4
  var s = 2500, c = 6, l = 4;
5
- function u(e, t, n = !1) {
6
- let [r, u] = o({
5
+ function u(e, t, n = !1, r = globalThis.fetch) {
6
+ let [u, d] = o({
7
7
  url: e,
8
8
  loading: !!e
9
- }), d = a(null), f = a(void 0);
9
+ }), f = a(null), p = a(void 0);
10
10
  return i(() => {
11
- if (f.current !== e && (f.current = e, d.current = null, u((t) => n && e && t.data !== void 0 ? {
11
+ if (p.current !== e && (p.current = e, f.current = null, d((t) => n && e && t.data !== void 0 ? {
12
12
  ...t,
13
13
  url: e,
14
14
  loading: !0,
@@ -17,21 +17,21 @@ function u(e, t, n = !1) {
17
17
  url: e,
18
18
  loading: !!e
19
19
  })), !e) return;
20
- let r = !0, i = 0, a = !1, o = 0, p = 0, m = !1, h = new AbortController(), g = async () => {
21
- m = !1;
20
+ let i = !0, a = 0, o = !1, u = 0, m = 0, h = !1, g = new AbortController(), _ = async () => {
21
+ h = !1;
22
22
  try {
23
- let t = await fetch(e, {
23
+ let t = await r(e, {
24
24
  credentials: "same-origin",
25
- signal: h.signal,
26
- headers: d.current ? { "If-None-Match": d.current } : {}
25
+ signal: g.signal,
26
+ headers: f.current ? { "If-None-Match": f.current } : {}
27
27
  });
28
- if (!r) return;
29
- p = 0, a = t.headers.get("X-Workspace-Stale") === "1";
28
+ if (!i) return;
29
+ m = 0, o = t.headers.get("X-Workspace-Stale") === "1";
30
30
  let n = t.headers.get("X-Workspace-Compose-Error") ?? void 0;
31
- if (!a && (t.ok || t.status === 304) && (o = 0), t.status === 304) {
32
- u((e) => e.stale === a && e.failing === n ? e : {
31
+ if (!o && (t.ok || t.status === 304) && (u = 0), t.status === 304) {
32
+ d((e) => e.stale === o && e.failing === n ? e : {
33
33
  ...e,
34
- stale: a,
34
+ stale: o,
35
35
  failing: n
36
36
  });
37
37
  return;
@@ -42,7 +42,7 @@ function u(e, t, n = !1) {
42
42
  let n = await t.json();
43
43
  n && typeof n == "object" && typeof n.reason == "string" && (e = n.reason);
44
44
  } catch {}
45
- u((n) => ({
45
+ d((n) => ({
46
46
  ...n,
47
47
  loading: !1,
48
48
  error: e,
@@ -50,30 +50,34 @@ function u(e, t, n = !1) {
50
50
  }));
51
51
  return;
52
52
  }
53
- d.current = t.headers.get("ETag");
54
- let i = await t.json();
55
- r && u({
53
+ f.current = t.headers.get("ETag");
54
+ let a = await t.json();
55
+ i && d({
56
56
  url: e,
57
- data: i,
57
+ data: a,
58
58
  loading: !1,
59
59
  status: t.status,
60
- stale: a,
60
+ stale: o,
61
61
  failing: n
62
62
  });
63
63
  } catch (e) {
64
- r && !h.signal.aborted && p < l ? m = !0 : r && !h.signal.aborted && u((t) => ({
64
+ i && !g.signal.aborted && m < l ? h = !0 : i && !g.signal.aborted && d((t) => ({
65
65
  ...t,
66
66
  loading: !1,
67
67
  error: e instanceof Error ? e.message : "Request failed"
68
68
  }));
69
69
  } finally {
70
- r && m ? (i = window.setTimeout(g, 1e3 * 2 ** p), p += 1) : r && a && o < c ? (i = window.setTimeout(g, s * 1.5 ** o), o += 1) : r && t && (i = window.setTimeout(g, t));
70
+ i && h ? (a = window.setTimeout(_, 1e3 * 2 ** m), m += 1) : i && o && u < c ? (a = window.setTimeout(_, s * 1.5 ** u), u += 1) : i && t && (a = window.setTimeout(_, t));
71
71
  }
72
72
  };
73
- return g(), () => {
74
- r = !1, h.abort(), window.clearTimeout(i);
73
+ return _(), () => {
74
+ i = !1, g.abort(), window.clearTimeout(a);
75
75
  };
76
- }, [e, t]), n || r.url === e ? r : {
76
+ }, [
77
+ e,
78
+ t,
79
+ r
80
+ ]), n || u.url === e ? u : {
77
81
  url: e,
78
82
  loading: !!e
79
83
  };
@@ -113,7 +117,7 @@ function S(t) {
113
117
  switch (n) {
114
118
  case "running":
115
119
  case "building":
116
- case "live": return g("run", `Running${a != null && a > 0 ? ` ${m(a)}` : ""}`, "attention", e.live);
120
+ case "live": return g("run", `Running${a != null && a > 0 ? ` ${m(a)}` : ""}`, "live", e.live);
117
121
  case "winner":
118
122
  case "solved": return g("result", "Passed", "pass", e.solved);
119
123
  case "stalled": return g("run", "Stopped by Lab (stall)", "neutral", e.stalled);
@@ -1,4 +1,4 @@
1
- import { parseRecord as e } from "./record.js";
1
+ import { t as e } from "./record-CsP_3NJS.js";
2
2
  //#region src/adapters/harness-sessions.ts
3
3
  var t = (e, t) => `session:${encodeURIComponent(e)}:${encodeURIComponent(t)}`, n = (e, t, n) => `${e}:${t}:${encodeURIComponent(n)}`, r = (e) => {
4
4
  if (!e) return null;