@tangle-network/agent-eval 0.202.1 → 0.203.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/adapters/http.d.ts +2 -2
  3. package/dist/analyst/index.d.ts +5 -5
  4. package/dist/analyst/index.js +1 -1
  5. package/dist/benchmarks/index.d.ts +4 -4
  6. package/dist/campaign/index.d.ts +5 -5
  7. package/dist/campaign/index.js +2 -2
  8. package/dist/{claude-jsonl-CxZZrDJ3.js → claude-jsonl-DoQJBCVR.js} +49 -15
  9. package/dist/claude-jsonl-DoQJBCVR.js.map +1 -0
  10. package/dist/cli.js +2 -2
  11. package/dist/contract/index.d.ts +7 -7
  12. package/dist/contract/index.js +1 -1
  13. package/dist/{default-registry-D1rNS2yB.d.ts → default-registry-B-utjsmX.d.ts} +3 -3
  14. package/dist/{default-registry-D1rNS2yB.d.ts.map → default-registry-B-utjsmX.d.ts.map} +1 -1
  15. package/dist/{default-registry-D4qXx2aG.js → default-registry-CpswV_S2.js} +2 -2
  16. package/dist/{default-registry-D4qXx2aG.js.map → default-registry-CpswV_S2.js.map} +1 -1
  17. package/dist/{define-agent-eval-CNkCzx6h.d.ts → define-agent-eval-MAc6BQrq.d.ts} +5 -5
  18. package/dist/{define-agent-eval-CNkCzx6h.d.ts.map → define-agent-eval-MAc6BQrq.d.ts.map} +1 -1
  19. package/dist/{engine-DlKIzDKo.d.ts → engine-4_Q4oujc.d.ts} +2 -2
  20. package/dist/{engine-DlKIzDKo.d.ts.map → engine-4_Q4oujc.d.ts.map} +1 -1
  21. package/dist/evaluation.d.ts +1 -1
  22. package/dist/experiment/index.d.ts +1 -1
  23. package/dist/{exporters-XMCYJlqT.d.ts → exporters-ChTnR90l.d.ts} +2 -2
  24. package/dist/{exporters-XMCYJlqT.d.ts.map → exporters-ChTnR90l.d.ts.map} +1 -1
  25. package/dist/{exporters-Coiv-qO2.js → exporters-X4xwla8A.js} +10 -4
  26. package/dist/{exporters-Coiv-qO2.js.map → exporters-X4xwla8A.js.map} +1 -1
  27. package/dist/{hf-dataset-kjIfIK_e.js → hf-dataset-BR2yhuNn.js} +3 -3
  28. package/dist/{hf-dataset-kjIfIK_e.js.map → hf-dataset-BR2yhuNn.js.map} +1 -1
  29. package/dist/{index-D4pC7Tvd.d.ts → index-BoVEyQwH.d.ts} +18 -14
  30. package/dist/{index-D4pC7Tvd.d.ts.map → index-BoVEyQwH.d.ts.map} +1 -1
  31. package/dist/{index-BzSeeKNp.d.ts → index-CAtNOBQY.d.ts} +16 -5
  32. package/dist/index-CAtNOBQY.d.ts.map +1 -0
  33. package/dist/{index-DWDvp-6z.d.ts → index-Cuhxk05B.d.ts} +6 -6
  34. package/dist/{index-DWDvp-6z.d.ts.map → index-Cuhxk05B.d.ts.map} +1 -1
  35. package/dist/{index-Bi2fLITd.d.ts → index-DBk_4UPs.d.ts} +4 -4
  36. package/dist/{index-Bi2fLITd.d.ts.map → index-DBk_4UPs.d.ts.map} +1 -1
  37. package/dist/index.d.ts +12 -12
  38. package/dist/index.js +3 -3
  39. package/dist/{integrity-uwK7XC-8.js → integrity-BV1ZDf42.js} +38 -6
  40. package/dist/{integrity-uwK7XC-8.js.map → integrity-BV1ZDf42.js.map} +1 -1
  41. package/dist/{jev-protocol-CpKI7XSu.d.ts → jev-protocol-BQLxwbqD.d.ts} +24 -7
  42. package/dist/jev-protocol-BQLxwbqD.d.ts.map +1 -0
  43. package/dist/jev-protocol.d.ts +2 -2
  44. package/dist/jev-protocol.js +19 -4
  45. package/dist/jev-protocol.js.map +1 -1
  46. package/dist/{jev-review-D4ynCORp.d.ts → jev-review-DX6MI_jq.d.ts} +2 -2
  47. package/dist/{jev-review-D4ynCORp.d.ts.map → jev-review-DX6MI_jq.d.ts.map} +1 -1
  48. package/dist/jev.d.ts +4 -4
  49. package/dist/jev.js +2 -2
  50. package/dist/{matrix--IZKROxD.d.ts → matrix-BucOjLF1.d.ts} +2 -2
  51. package/dist/{matrix--IZKROxD.d.ts.map → matrix-BucOjLF1.d.ts.map} +1 -1
  52. package/dist/{mint-C9Lojt1V.d.ts → mint-C1W8w5wo.d.ts} +10 -2
  53. package/dist/mint-C1W8w5wo.d.ts.map +1 -0
  54. package/dist/{mint-vlRckJEX.js → mint-CWG-s2mI.js} +26 -7
  55. package/dist/mint-CWG-s2mI.js.map +1 -0
  56. package/dist/multishot/golden/index.d.ts +1 -1
  57. package/dist/multishot/index.d.ts +2 -2
  58. package/dist/openapi.json +1 -1
  59. package/dist/{report-command-DzPpFgjB.js → report-command-D0XL2Cvi.js} +128 -15
  60. package/dist/report-command-D0XL2Cvi.js.map +1 -0
  61. package/dist/rl.d.ts +6 -6
  62. package/dist/rl.js +3 -3
  63. package/dist/rollout/index.d.ts +5 -5
  64. package/dist/rollout/index.js +6 -6
  65. package/dist/{rollout-BUQixCoc.js → rollout-BdCoWV9n.js} +41 -21
  66. package/dist/{rollout-BUQixCoc.js.map → rollout-BdCoWV9n.js.map} +1 -1
  67. package/dist/{schema-DAMp77zB.js → schema-BuiujZ-g.js} +37 -1
  68. package/dist/schema-BuiujZ-g.js.map +1 -0
  69. package/dist/{schema-B5LtYvn9.d.ts → schema-C-ziyJD7.d.ts} +40 -5
  70. package/dist/schema-C-ziyJD7.d.ts.map +1 -0
  71. package/dist/search/index.d.ts +2 -2
  72. package/dist/{search-kernel-C9CXvFR7.d.ts → search-kernel-B8RC6BlK.d.ts} +2 -2
  73. package/dist/{search-kernel-C9CXvFR7.d.ts.map → search-kernel-B8RC6BlK.d.ts.map} +1 -1
  74. package/dist/{statistical-heldout-HswMvzbP.d.ts → statistical-heldout-DJtQAUZB.d.ts} +2 -2
  75. package/dist/{statistical-heldout-HswMvzbP.d.ts.map → statistical-heldout-DJtQAUZB.d.ts.map} +1 -1
  76. package/dist/{store-tool-spans-Dv9x4XYG.d.ts → store-tool-spans-fkNF7Q9Y.d.ts} +3 -3
  77. package/dist/{store-tool-spans-Dv9x4XYG.d.ts.map → store-tool-spans-fkNF7Q9Y.d.ts.map} +1 -1
  78. package/dist/supervisor-run/index.d.ts +2 -2
  79. package/dist/supervisor-run/index.d.ts.map +1 -1
  80. package/dist/supervisor-run/index.js +23 -15
  81. package/dist/supervisor-run/index.js.map +1 -1
  82. package/dist/terminal-record-BHocwFw1.js.map +1 -1
  83. package/dist/{tool-groups-BY1MdSIE.d.ts → tool-groups-Zm84Pqpk.d.ts} +2 -2
  84. package/dist/tool-groups-Zm84Pqpk.d.ts.map +1 -0
  85. package/dist/{trace-questions-DnqdmwyV.d.ts → trace-questions--lnJTaou.d.ts} +2 -2
  86. package/dist/{trace-questions-DnqdmwyV.d.ts.map → trace-questions--lnJTaou.d.ts.map} +1 -1
  87. package/dist/trace-repair/index.d.ts +1 -1
  88. package/dist/traces.d.ts +2 -2
  89. package/dist/{types-C4hH69a9.d.ts → types-B6JadxWL.d.ts} +2 -2
  90. package/dist/{types-C4hH69a9.d.ts.map → types-B6JadxWL.d.ts.map} +1 -1
  91. package/dist/{types-DfvQOe91.d.ts → types-khIUQ0O5.d.ts} +2 -2
  92. package/dist/{types-DfvQOe91.d.ts.map → types-khIUQ0O5.d.ts.map} +1 -1
  93. package/dist/{types-DRNlLbBR.d.ts → types-v6nRcIqg.d.ts} +11 -3
  94. package/dist/types-v6nRcIqg.d.ts.map +1 -0
  95. package/docs/campaign-coverage.md +20 -0
  96. package/docs/changes/jev-recorded-evidence.md +24 -0
  97. package/docs/jev-replay.md +50 -0
  98. package/docs/rollout.md +35 -1
  99. package/package.json +1 -1
  100. package/dist/claude-jsonl-CxZZrDJ3.js.map +0 -1
  101. package/dist/index-BzSeeKNp.d.ts.map +0 -1
  102. package/dist/jev-protocol-CpKI7XSu.d.ts.map +0 -1
  103. package/dist/mint-C9Lojt1V.d.ts.map +0 -1
  104. package/dist/mint-vlRckJEX.js.map +0 -1
  105. package/dist/report-command-DzPpFgjB.js.map +0 -1
  106. package/dist/schema-B5LtYvn9.d.ts.map +0 -1
  107. package/dist/schema-DAMp77zB.js.map +0 -1
  108. package/dist/tool-groups-BY1MdSIE.d.ts.map +0 -1
  109. package/dist/types-DRNlLbBR.d.ts.map +0 -1
@@ -1,3 +1,4 @@
1
+ import { a as hashCanonical } from "./canonical-BsZVgBhW.js";
1
2
  import { o as summarizeNumberSeries } from "./descriptive-D9LUFk1-.js";
2
3
  import { a as parseJson, c as workerSourceKey, d as SUPERVISOR_RUN_SCHEMA, f as isUnavailable, i as asRecord, l as NO_SOURCE_LIMITS, m as unavailable, o as parseJsonl, p as showMeasured, r as readTerminalRecord, s as parseSupervisorTree, u as SUPERVISOR_RUN_ROLLUP_SCHEMA } from "./terminal-record-BHocwFw1.js";
3
4
  import { basename, join, resolve } from "node:path";
@@ -322,7 +323,18 @@ function analyzeSupervisorRunSources(src, now = Date.now) {
322
323
  unknownNodes: closeUsdUnreported && rootId !== null ? [rootId] : []
323
324
  }
324
325
  };
326
+ const noteCaptureGaps = (owner, captures) => {
327
+ if (captures === null || captures?.length === 0) gaps.push(`${owner} workspaceCapture: no retained output capture evidence`);
328
+ else if (captures !== void 0) for (const [index, capture] of captures.entries()) {
329
+ const source = `${owner} workspaceCapture[${index + 1}]`;
330
+ if (capture.projectionGap !== null) gaps.push(`${source}: ${capture.projectionGap}`);
331
+ if (capture.coverageComplete === false) gaps.push(`${source}: ${capture.incompleteReason ?? "provider reported incomplete coverage"}`);
332
+ if (capture.coverageComplete === null && capture.projectionGap === null) gaps.push(`${source}: capture coverage was not recorded`);
333
+ }
334
+ };
335
+ noteCaptureGaps(`root ${rootId ?? src.runRef}`, src.rootWorkspaceCaptures);
325
336
  const perWorker = (src.workers ?? []).map((w) => {
337
+ noteCaptureGaps(`worker ${w.workerId ?? w.label}`, w.workspaceCaptures);
326
338
  const f = tree.workerLogs.get(workerSourceKey(w));
327
339
  const matchingSpawns = spawnsForSource(w);
328
340
  const spawn = spawnForSource(w);
@@ -347,7 +359,8 @@ function analyzeSupervisorRunSources(src, now = Date.now) {
347
359
  usd: usdLimit !== null ? null : w.workerId === void 0 ? workerUsdByLabel.get(w.label) ?? null : workerUsdById.get(w.workerId) ?? null,
348
360
  patchBytes: w.patchBytes ?? f?.finishedPatchBytes ?? null,
349
361
  passed,
350
- score: close?.score ?? f?.score ?? null
362
+ score: close?.score ?? f?.score ?? null,
363
+ workspaceCaptures: w.workspaceCaptures ?? null
351
364
  };
352
365
  });
353
366
  const wallDistribution = summarizeNumberSeries(perWorker.map((w) => w.wallMs).filter((w) => w !== null));
@@ -408,6 +421,7 @@ function analyzeSupervisorRunSources(src, now = Date.now) {
408
421
  decision,
409
422
  economics,
410
423
  outcome,
424
+ rootWorkspaceCaptures: src.rootWorkspaceCaptures ?? null,
411
425
  gaps,
412
426
  traceCommand: src.traceCommand ?? "npx --yes @tangle-network/traces@latest analyze --harness opencode --cwd <worker-clone-cwd>"
413
427
  };
@@ -750,7 +764,7 @@ function renderSupervisorRollupMarkdown(rollup, title = "Round rollup") {
750
764
  *
751
765
  * Transcripts come from Runtime's own records too: `root-stream.jsonl` is the root's, each
752
766
  * worker's turn outputs and native-session receipt are read from the journal, and every blob
753
- * a record names is checked on disk (see `workerTranscripts`).
767
+ * a record names is checked on disk (see `nodeTranscripts`).
754
768
  *
755
769
  * The run's terminal record is Runtime's own: `result.json` is the
756
770
  * `SupervisedResult` that `supervise()` returned, verbatim, and its `kind`
@@ -1043,13 +1057,87 @@ function runtimeBeginState(root, startedAt) {
1043
1057
  function blobFile(runDir, ref) {
1044
1058
  return typeof ref === "string" && /^sha256:[0-9a-f]{64}$/u.test(ref) ? join(runDir, BLOB_DIR, `${ref.replace(":", "-")}.json`) : null;
1045
1059
  }
1060
+ async function workspaceCapturesFromOutput(runDir, ref) {
1061
+ const outRef = typeof ref === "string" ? ref : null;
1062
+ const blobPath = blobFile(runDir, ref);
1063
+ const missing = (projectionGap) => ({
1064
+ outRef,
1065
+ blobPath,
1066
+ receiptPointer: null,
1067
+ receipt: null,
1068
+ attempts: null,
1069
+ coverageComplete: null,
1070
+ incompleteReason: null,
1071
+ projectionGap
1072
+ });
1073
+ if (blobPath === null) return [missing("Runtime output has no valid content address")];
1074
+ if (!await isFile(blobPath)) return [missing("Runtime output blob is missing or not a file")];
1075
+ const raw = await readMaybe(blobPath);
1076
+ if (raw === null) return [missing("Runtime output blob is missing")];
1077
+ let output;
1078
+ try {
1079
+ output = JSON.parse(raw);
1080
+ } catch {
1081
+ return [missing("Runtime output blob is not JSON")];
1082
+ }
1083
+ let addressGap = null;
1084
+ try {
1085
+ if (hashCanonical(output) !== outRef) addressGap = "Runtime output content address does not match output blob";
1086
+ } catch {
1087
+ addressGap = "Runtime output cannot be canonically hashed";
1088
+ }
1089
+ const project = (rawReceipt, receiptPointer) => {
1090
+ const receipt = record(rawReceipt);
1091
+ if (receipt === null) return {
1092
+ ...missing(`workspaceCapture receipt is absent or malformed${addressGap === null ? "" : `; ${addressGap}`}`),
1093
+ receiptPointer,
1094
+ receipt: rawReceipt
1095
+ };
1096
+ const provenance = record(receipt.provenance);
1097
+ const attempts = Array.isArray(provenance?.attempts) ? provenance.attempts : null;
1098
+ const coverageComplete = typeof receipt.coverageComplete === "boolean" ? receipt.coverageComplete : null;
1099
+ const incompleteReason = typeof receipt.incompleteReason === "string" ? receipt.incompleteReason : null;
1100
+ const gaps = [];
1101
+ if (addressGap !== null) gaps.push(addressGap);
1102
+ if (coverageComplete === null) gaps.push("workspaceCapture.coverageComplete is absent");
1103
+ if (record(receipt.snapshot) === null) gaps.push("workspaceCapture.snapshot is absent");
1104
+ if (provenance === null) gaps.push("workspaceCapture.provenance is absent");
1105
+ if (attempts === null) gaps.push("workspaceCapture.provenance.attempts is absent");
1106
+ else if (attempts.length === 0 || attempts.some((attempt) => record(attempt) === null)) gaps.push("workspaceCapture.provenance.attempts is empty or malformed");
1107
+ return {
1108
+ outRef,
1109
+ blobPath,
1110
+ receiptPointer,
1111
+ receipt,
1112
+ attempts,
1113
+ coverageComplete,
1114
+ incompleteReason,
1115
+ projectionGap: gaps.length > 0 ? gaps.join("; ") : null
1116
+ };
1117
+ };
1118
+ const result = record(output);
1119
+ const captures = [];
1120
+ for (const key of Object.keys(result ?? {})) if (key === "workspaceCapture") captures.push(project(result?.[key], "/workspaceCapture"));
1121
+ else if (key === "workspaceCaptures") {
1122
+ const receipts = result?.[key];
1123
+ if (Array.isArray(receipts) && receipts.length > 0) for (const [index, receipt] of receipts.entries()) captures.push(project(receipt, `/workspaceCaptures/${index}`));
1124
+ else captures.push({
1125
+ ...missing(`workspaceCaptures is empty or malformed${addressGap === null ? "" : `; ${addressGap}`}`),
1126
+ receiptPointer: "/workspaceCaptures",
1127
+ receipt: receipts ?? null
1128
+ });
1129
+ }
1130
+ return captures.length > 0 ? captures : [project(null, null)];
1131
+ }
1046
1132
  /**
1047
- * What Runtime retained of each worker's decisions, from its own records.
1133
+ * What Runtime retained of each node's decisions, from its own records.
1048
1134
  *
1049
1135
  * - A turn is one `execution-admitted` event in the `dispatched` phase. Its `execution-result`
1050
1136
  * names an output blob holding that turn's provider event stream (reasoning, tool calls and
1051
1137
  * results as the harness reported them). A dispatched turn with no retained output lost its
1052
1138
  * record, which is how a worker that went down mid-turn shows up.
1139
+ * - Every event's `outRef` enters the same collector, once per node and address. Terminal
1140
+ * records retain ordinary and steerable results; they are not counted as dispatched turns.
1053
1141
  * - The terminal event's `harnessTranscript` receipt covers the harness's native session files.
1054
1142
  * Those are the only record of the harness's own subagents, so an unavailable receipt is a
1055
1143
  * separate gap from a missing turn, and its reason is Runtime's, verbatim.
@@ -1057,14 +1145,15 @@ function blobFile(runDir, ref) {
1057
1145
  * Blob files are checked on disk: a receipt that names a blob the directory no longer holds is
1058
1146
  * not a retained transcript.
1059
1147
  */
1060
- async function workerTranscripts(runDir, events, workerIds) {
1148
+ async function nodeTranscripts(runDir, events, nodeIds) {
1061
1149
  const facts = /* @__PURE__ */ new Map();
1062
1150
  const entry = (id) => {
1063
1151
  let found = facts.get(id);
1064
1152
  if (found === void 0) {
1065
1153
  found = {
1066
1154
  dispatched: 0,
1067
- outputFiles: [],
1155
+ outputRefs: [],
1156
+ outputPositions: /* @__PURE__ */ new Map(),
1068
1157
  receipt: null
1069
1158
  };
1070
1159
  facts.set(id, found);
@@ -1073,12 +1162,23 @@ async function workerTranscripts(runDir, events, workerIds) {
1073
1162
  };
1074
1163
  for (const event of events) {
1075
1164
  const id = nonEmptyString(event.id);
1076
- if (id === null || !workerIds.has(id)) continue;
1165
+ if (id === null || !nodeIds.has(id)) continue;
1166
+ if (Object.hasOwn(event, "outRef")) {
1167
+ const fact = entry(id);
1168
+ const ref = event.outRef;
1169
+ const position = typeof ref === "string" ? fact.outputPositions.get(ref) : void 0;
1170
+ if (position !== void 0) {
1171
+ if (event.kind === "execution-result") fact.outputRefs[position].turn = true;
1172
+ } else {
1173
+ if (typeof ref === "string") fact.outputPositions.set(ref, fact.outputRefs.length);
1174
+ fact.outputRefs.push({
1175
+ value: ref,
1176
+ turn: event.kind === "execution-result"
1177
+ });
1178
+ }
1179
+ }
1077
1180
  if (event.kind === "execution-admitted" && record(event.admission)?.phase === "dispatched") entry(id).dispatched += 1;
1078
- else if (event.kind === "execution-result") {
1079
- const file = blobFile(runDir, event.outRef);
1080
- if (file !== null) entry(id).outputFiles.push(file);
1081
- } else if (event.kind === "settled" || event.kind === "cancelled") {
1181
+ else if (event.kind === "settled" || event.kind === "cancelled") {
1082
1182
  const receipt = record(event.harnessTranscript);
1083
1183
  if (receipt !== null) entry(id).receipt = receipt;
1084
1184
  }
@@ -1086,7 +1186,16 @@ async function workerTranscripts(runDir, events, workerIds) {
1086
1186
  const out = /* @__PURE__ */ new Map();
1087
1187
  for (const [id, fact] of facts) {
1088
1188
  const retained = [];
1089
- for (const file of fact.outputFiles) if (await isFile(file)) retained.push(file);
1189
+ let retainedTurns = 0;
1190
+ const workspaceCaptures = [];
1191
+ for (const { value: ref, turn } of fact.outputRefs) {
1192
+ const file = blobFile(runDir, ref);
1193
+ if (file !== null && await isFile(file)) {
1194
+ retained.push(file);
1195
+ if (turn) retainedTurns += 1;
1196
+ }
1197
+ workspaceCaptures.push(...await workspaceCapturesFromOutput(runDir, ref));
1198
+ }
1090
1199
  let nativeSession = null;
1091
1200
  if (fact.receipt !== null) {
1092
1201
  if (fact.receipt.status === "available") {
@@ -1107,9 +1216,10 @@ async function workerTranscripts(runDir, events, workerIds) {
1107
1216
  transcriptRef: nativeSession?.status === "available" ? nativeSession.ref : retained.at(-1) ?? null,
1108
1217
  turns: {
1109
1218
  dispatched: fact.dispatched,
1110
- retained: retained.length
1219
+ retained: retainedTurns
1111
1220
  },
1112
- nativeSession
1221
+ nativeSession,
1222
+ workspaceCaptures: workspaceCaptures.length > 0 ? workspaceCaptures : null
1113
1223
  });
1114
1224
  }
1115
1225
  return out;
@@ -1153,6 +1263,7 @@ function absentRuntimeSupervisorRun(runDir, resultText, failureText, instanceId)
1153
1263
  harnessMissingReason: "Runtime FileRunContext has no external worker-token join",
1154
1264
  limits: NO_SOURCE_LIMITS,
1155
1265
  rootTranscriptRef: null,
1266
+ rootWorkspaceCaptures: null,
1156
1267
  traceCommand: "unavailable — Runtime FileRunContext records no provider-session trace identity"
1157
1268
  };
1158
1269
  }
@@ -1188,7 +1299,7 @@ async function readRuntimeSupervisorRun(runDir, opts = {}) {
1188
1299
  assertResultMatchesJournal(normalized.root, result, resultPath);
1189
1300
  const childSpawns = normalized.events.filter((event) => event.kind === "spawned" && nonEmptyString(event.id) !== null).filter((event) => event.id !== normalized.root);
1190
1301
  const workerIds = new Set(childSpawns.map((event) => nonEmptyString(event.id)).filter((id) => id !== null));
1191
- const transcripts = await workerTranscripts(runDir, normalized.events, workerIds);
1302
+ const transcripts = await nodeTranscripts(runDir, normalized.events, /* @__PURE__ */ new Set([normalized.root, ...workerIds]));
1192
1303
  const workers = childSpawns.map((event) => {
1193
1304
  const workerId = nonEmptyString(event.id);
1194
1305
  const transcript = transcripts.get(workerId);
@@ -1204,6 +1315,7 @@ async function readRuntimeSupervisorRun(runDir, opts = {}) {
1204
1315
  retained: 0
1205
1316
  },
1206
1317
  nativeSession: transcript?.nativeSession ?? null,
1318
+ workspaceCaptures: transcript?.workspaceCaptures ?? null,
1207
1319
  patchPath: null
1208
1320
  };
1209
1321
  });
@@ -1230,6 +1342,7 @@ async function readRuntimeSupervisorRun(runDir, opts = {}) {
1230
1342
  harnessMissingReason: "Runtime FileRunContext has no external worker-token join",
1231
1343
  limits: sourceLimits(normalized.root, normalized.events, workerIds),
1232
1344
  rootTranscriptRef: await isFile(rootStream) ? rootStream : null,
1345
+ rootWorkspaceCaptures: transcripts.get(normalized.root)?.workspaceCaptures ?? null,
1233
1346
  traceCommand: "unavailable — Runtime FileRunContext records no provider-session trace identity"
1234
1347
  };
1235
1348
  }
@@ -1484,4 +1597,4 @@ async function runSupervisorRunCommand(argv, io = PROCESS_IO) {
1484
1597
  //#endregion
1485
1598
  export { writeSupervisorRunReport as a, readRuntimeSupervisorRun as c, renderSupervisorRunHeadline as d, renderSupervisorRunMarkdown as f, rollupSupervisorRuns as h, reportSupervisorRound as i, runtimeSupervisorRunReader as l, parsePatch as m, analyzeSupervisorRun as n, writeSupervisorRunReportSafe as o, analyzeSupervisorRunSources as p, findSupervisorRunDirs as r, isRuntimeSupervisorRunDir as s, runSupervisorRunCommand as t, renderSupervisorRollupMarkdown as u };
1486
1599
 
1487
- //# sourceMappingURL=report-command-DzPpFgjB.js.map
1600
+ //# sourceMappingURL=report-command-D0XL2Cvi.js.map