@tangle-network/agent-eval 0.126.6 → 0.127.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 (129) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +2 -2
  3. package/dist/analyst/index.d.ts +52 -40
  4. package/dist/analyst/index.js +4 -4
  5. package/dist/belief-state/index.d.ts +34 -36
  6. package/dist/belief-state/index.js +2 -2
  7. package/dist/benchmarks/index.d.ts +30 -12
  8. package/dist/benchmarks/index.js +12 -10
  9. package/dist/builder-eval/index.js +1 -1
  10. package/dist/campaign/index.d.ts +432 -146
  11. package/dist/campaign/index.js +11 -9
  12. package/dist/{chunk-ARU2PZFM.js → chunk-424XHVKV.js} +43 -23
  13. package/dist/chunk-424XHVKV.js.map +1 -0
  14. package/dist/{chunk-NUKSVU3W.js → chunk-5DTSBUL2.js} +2 -2
  15. package/dist/{chunk-BTACVO2W.js → chunk-65QETEKG.js} +542 -258
  16. package/dist/chunk-65QETEKG.js.map +1 -0
  17. package/dist/{chunk-CGG5SLH3.js → chunk-ARCFIY7U.js} +2 -2
  18. package/dist/{chunk-P22LJ3Y2.js → chunk-CLELFRQG.js} +6 -4
  19. package/dist/chunk-CLELFRQG.js.map +1 -0
  20. package/dist/{chunk-LUNF2SEL.js → chunk-DJKY2TSY.js} +3 -3
  21. package/dist/chunk-DPUHNQLN.js +232 -0
  22. package/dist/chunk-DPUHNQLN.js.map +1 -0
  23. package/dist/{chunk-IPYXE555.js → chunk-EJGRPCO3.js} +36 -13
  24. package/dist/chunk-EJGRPCO3.js.map +1 -0
  25. package/dist/{chunk-K6IAZZ6L.js → chunk-FA3MFYNA.js} +132 -110
  26. package/dist/chunk-FA3MFYNA.js.map +1 -0
  27. package/dist/chunk-IG35YDN3.js +614 -0
  28. package/dist/chunk-IG35YDN3.js.map +1 -0
  29. package/dist/{chunk-DPZAEKA6.js → chunk-IMGJZBFG.js} +84 -56
  30. package/dist/chunk-IMGJZBFG.js.map +1 -0
  31. package/dist/{chunk-H5UD2323.js → chunk-IN455XKS.js} +53 -1
  32. package/dist/chunk-IN455XKS.js.map +1 -0
  33. package/dist/{chunk-PJQFMIOX.js → chunk-MHELPNRP.js} +31 -1
  34. package/dist/chunk-MHELPNRP.js.map +1 -0
  35. package/dist/{chunk-IILEIWGW.js → chunk-NL33OXEP.js} +41 -36
  36. package/dist/chunk-NL33OXEP.js.map +1 -0
  37. package/dist/{chunk-474LBSOX.js → chunk-OD5NQ2CS.js} +41 -16
  38. package/dist/chunk-OD5NQ2CS.js.map +1 -0
  39. package/dist/{chunk-QOTFXW5L.js → chunk-P5W7RQKK.js} +2 -2
  40. package/dist/{chunk-IR3KBHOY.js → chunk-P6FYH6K4.js} +39 -3
  41. package/dist/chunk-P6FYH6K4.js.map +1 -0
  42. package/dist/{chunk-J5SQWP6Y.js → chunk-PBE2LOSS.js} +18 -2
  43. package/dist/chunk-PBE2LOSS.js.map +1 -0
  44. package/dist/{chunk-E3IADPLG.js → chunk-PRB53E3J.js} +50 -224
  45. package/dist/chunk-PRB53E3J.js.map +1 -0
  46. package/dist/{chunk-X4UCIOTZ.js → chunk-S5YLIBFX.js} +2 -2
  47. package/dist/{chunk-7VYEGHWF.js → chunk-SZLVEKMJ.js} +41 -20
  48. package/dist/chunk-SZLVEKMJ.js.map +1 -0
  49. package/dist/{chunk-LKKT3IVV.js → chunk-TSN7JT6D.js} +6 -4
  50. package/dist/{chunk-LKKT3IVV.js.map → chunk-TSN7JT6D.js.map} +1 -1
  51. package/dist/{chunk-M7AH34KV.js → chunk-UTA2TGC4.js} +32 -16
  52. package/dist/chunk-UTA2TGC4.js.map +1 -0
  53. package/dist/{chunk-MAX3TN3C.js → chunk-UWZZKKU7.js} +7 -19
  54. package/dist/chunk-UWZZKKU7.js.map +1 -0
  55. package/dist/{chunk-ZVCHKKOP.js → chunk-WED5KLZQ.js} +39 -15
  56. package/dist/chunk-WED5KLZQ.js.map +1 -0
  57. package/dist/{chunk-OCFJACJU.js → chunk-X6VOPMLD.js} +74 -14
  58. package/dist/chunk-X6VOPMLD.js.map +1 -0
  59. package/dist/{chunk-MOXWMGPC.js → chunk-Y5CYOL42.js} +159 -70
  60. package/dist/chunk-Y5CYOL42.js.map +1 -0
  61. package/dist/{chunk-FO7HEH76.js → chunk-YJBNWCAA.js} +2 -2
  62. package/dist/chunk-ZPUEEM5U.js +179 -0
  63. package/dist/chunk-ZPUEEM5U.js.map +1 -0
  64. package/dist/{chunk-KE2VWPZX.js → chunk-ZUUWPZCV.js} +3 -3
  65. package/dist/cli.js +4 -4
  66. package/dist/contract/index.d.ts +464 -126
  67. package/dist/contract/index.js +425 -211
  68. package/dist/contract/index.js.map +1 -1
  69. package/dist/control.d.ts +34 -32
  70. package/dist/control.js +2 -2
  71. package/dist/hosted/index.d.ts +142 -41
  72. package/dist/hosted/index.js +23 -1
  73. package/dist/index.d.ts +365 -256
  74. package/dist/index.js +315 -226
  75. package/dist/index.js.map +1 -1
  76. package/dist/meta-eval/index.d.ts +32 -32
  77. package/dist/meta-eval/index.js +2 -2
  78. package/dist/multishot/index.d.ts +1 -0
  79. package/dist/openapi.json +1 -1
  80. package/dist/pipelines/index.js +2 -2
  81. package/dist/reporting.d.ts +97 -74
  82. package/dist/reporting.js +5 -4
  83. package/dist/rl.d.ts +177 -131
  84. package/dist/rl.js +232 -126
  85. package/dist/rl.js.map +1 -1
  86. package/dist/rollout/index.d.ts +53 -63
  87. package/dist/rollout/index.js +7 -5
  88. package/dist/{run-campaign-FFRM3RH5.js → run-campaign-3A2EBYBE.js} +4 -3
  89. package/dist/supervisor-run/index.d.ts +7 -15
  90. package/dist/supervisor-run/index.js +2 -2
  91. package/dist/traces.d.ts +66 -41
  92. package/dist/traces.js +9 -5
  93. package/dist/wire/index.d.ts +1 -0
  94. package/dist/wire/index.js +2 -2
  95. package/docs/concepts.md +18 -1
  96. package/docs/hosted-ingest-spec.md +37 -40
  97. package/docs/insight-report.md +57 -7
  98. package/docs/research-report-methodology.md +20 -21
  99. package/docs/rollout.md +13 -8
  100. package/package.json +21 -14
  101. package/dist/chunk-474LBSOX.js.map +0 -1
  102. package/dist/chunk-7VYEGHWF.js.map +0 -1
  103. package/dist/chunk-ARU2PZFM.js.map +0 -1
  104. package/dist/chunk-BTACVO2W.js.map +0 -1
  105. package/dist/chunk-DPZAEKA6.js.map +0 -1
  106. package/dist/chunk-E3IADPLG.js.map +0 -1
  107. package/dist/chunk-H5UD2323.js.map +0 -1
  108. package/dist/chunk-IILEIWGW.js.map +0 -1
  109. package/dist/chunk-IPYXE555.js.map +0 -1
  110. package/dist/chunk-IR3KBHOY.js.map +0 -1
  111. package/dist/chunk-J5SQWP6Y.js.map +0 -1
  112. package/dist/chunk-K6IAZZ6L.js.map +0 -1
  113. package/dist/chunk-M7AH34KV.js.map +0 -1
  114. package/dist/chunk-MAX3TN3C.js.map +0 -1
  115. package/dist/chunk-MOXWMGPC.js.map +0 -1
  116. package/dist/chunk-OCFJACJU.js.map +0 -1
  117. package/dist/chunk-P22LJ3Y2.js.map +0 -1
  118. package/dist/chunk-PJQFMIOX.js.map +0 -1
  119. package/dist/chunk-ZVCHKKOP.js.map +0 -1
  120. package/dist/chunk-ZZUXHH3R.js +0 -99
  121. package/dist/chunk-ZZUXHH3R.js.map +0 -1
  122. /package/dist/{chunk-NUKSVU3W.js.map → chunk-5DTSBUL2.js.map} +0 -0
  123. /package/dist/{chunk-CGG5SLH3.js.map → chunk-ARCFIY7U.js.map} +0 -0
  124. /package/dist/{chunk-LUNF2SEL.js.map → chunk-DJKY2TSY.js.map} +0 -0
  125. /package/dist/{chunk-QOTFXW5L.js.map → chunk-P5W7RQKK.js.map} +0 -0
  126. /package/dist/{chunk-X4UCIOTZ.js.map → chunk-S5YLIBFX.js.map} +0 -0
  127. /package/dist/{chunk-FO7HEH76.js.map → chunk-YJBNWCAA.js.map} +0 -0
  128. /package/dist/{chunk-KE2VWPZX.js.map → chunk-ZUUWPZCV.js.map} +0 -0
  129. /package/dist/{run-campaign-FFRM3RH5.js.map → run-campaign-3A2EBYBE.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  pearsonR,
3
3
  spearmanR
4
- } from "./chunk-PJQFMIOX.js";
4
+ } from "./chunk-MHELPNRP.js";
5
5
 
6
6
  // src/meta-eval/rubric-predictive-validity.ts
7
7
  async function rubricPredictiveValidity(input) {
@@ -133,4 +133,4 @@ function makeRng(seed) {
133
133
  export {
134
134
  rubricPredictiveValidity
135
135
  };
136
- //# sourceMappingURL=chunk-X4UCIOTZ.js.map
136
+ //# sourceMappingURL=chunk-S5YLIBFX.js.map
@@ -660,7 +660,6 @@ function fromCodeAgentSession(source, options) {
660
660
  sourcePath: options.sourcePath,
661
661
  entries: 0,
662
662
  malformedLines: options.malformedLines ?? 0,
663
- inferredScore: true,
664
663
  hasExplicitTerminalSignal: false,
665
664
  hasFinalOutput: false,
666
665
  hasQualityLabel: false,
@@ -692,7 +691,8 @@ function fromCodeAgentSession(source, options) {
692
691
  ...metrics.cacheWriteTokens > 0 ? { cacheWrite: metrics.cacheWriteTokens } : {}
693
692
  };
694
693
  const { costUsd, costProvenance } = resolveSessionCost(options.costProvenance, metrics, model);
695
- const score = clamp01(options.score ?? metrics.processScore);
694
+ const qualityScore = finiteScore(options.score);
695
+ const invalidQualityScore = options.score !== void 0 && qualityScore === void 0;
696
696
  const promptHash = options.promptHash ?? hashString(`prompt:${source}:${firstUserText(entries) ?? ""}`);
697
697
  const configHash = options.configHash ?? hashJson({
698
698
  source,
@@ -706,9 +706,13 @@ function fromCodeAgentSession(source, options) {
706
706
  model,
707
707
  explicitTerminal,
708
708
  malformedLines: options.malformedLines ?? 0,
709
- scoreOverridden: options.score !== void 0,
709
+ hasQualityLabel: qualityScore !== void 0,
710
+ invalidQualityScore,
710
711
  costKind: costProvenance.kind
711
712
  });
713
+ const terminalOutcome = terminalOutcomeFromSession(observation.terminal);
714
+ const processExitCode = options.execution?.exitCode;
715
+ const splitTag = options.splitTag ?? "holdout";
712
716
  const run = {
713
717
  runId: `${source}:${sessionId}`,
714
718
  experimentId: options.experimentId ?? `${source}-local-sessions`,
@@ -722,8 +726,12 @@ function fromCodeAgentSession(source, options) {
722
726
  costUsd,
723
727
  costProvenance,
724
728
  tokenUsage,
729
+ terminalOutcome,
730
+ ...terminalOutcome === "failed" ? {
731
+ terminalFailureReason: processExitCode !== void 0 && processExitCode !== 0 ? `process exited with code ${processExitCode}` : metrics.turnsAborted > 0 ? "turn aborted" : "session reported terminal failure"
732
+ } : {},
725
733
  outcome: {
726
- holdoutScore: score,
734
+ ...qualityScore === void 0 ? {} : splitTag === "holdout" ? { holdoutScore: qualityScore } : { searchScore: qualityScore },
727
735
  raw: {
728
736
  entries: metrics.entries,
729
737
  user_messages: metrics.userMessages,
@@ -732,6 +740,10 @@ function fromCodeAgentSession(source, options) {
732
740
  tool_calls: metrics.toolCalls,
733
741
  tool_outputs: metrics.toolOutputs,
734
742
  tool_errors: metrics.toolErrors,
743
+ execution_error_count: metrics.toolErrors,
744
+ process_error_count: terminalOutcome === "failed" ? 1 : 0,
745
+ unclassified_error_count: metrics.unclassifiedErrors,
746
+ ...processExitCode !== void 0 ? { process_exit_code: processExitCode } : {},
735
747
  patch_attempts: metrics.patchAttempts,
736
748
  patch_successes: metrics.patchSuccesses,
737
749
  patch_failures: metrics.patchFailures,
@@ -761,20 +773,18 @@ function fromCodeAgentSession(source, options) {
761
773
  cache_write_tokens: metrics.cacheWriteTokens,
762
774
  observed_cost_usd: metrics.observedCostUsd,
763
775
  observed_cost_captured: metrics.observedCostCaptured ? 1 : 0,
764
- estimated_cost_usd: costProvenance.kind === "estimated" ? costUsd : 0,
765
- process_score: score,
766
- inferred_score: options.score === void 0 ? 1 : 0,
776
+ estimated_cost_usd: costProvenance.kind === "estimated" ? costProvenance.usd : 0,
777
+ process_score: metrics.processScore,
767
778
  explicit_terminal_signal: explicitTerminal ? 1 : 0,
768
- quality_label_present: options.score !== void 0 ? 1 : 0,
779
+ quality_label_present: qualityScore !== void 0 ? 1 : 0,
769
780
  cost_observed: costProvenance.kind === "observed" ? 1 : 0,
770
781
  cost_estimated: costProvenance.kind === "estimated" ? 1 : 0,
771
782
  cost_uncaptured: costProvenance.kind === "uncaptured" ? 1 : 0,
772
783
  cost_unknown: costProvenance.kind === "uncaptured" ? 1 : 0
773
784
  }
774
785
  },
775
- splitTag: options.splitTag ?? "holdout",
776
- ...options.scenarioId ? { scenarioId: options.scenarioId } : {},
777
- ...metrics.toolErrors > 0 || metrics.turnsAborted > 0 ? { failureMode: metrics.turnsAborted > 0 ? "turn_aborted" : "tool_error" } : {}
786
+ splitTag,
787
+ scenarioId: options.scenarioId ?? sessionId
778
788
  };
779
789
  return {
780
790
  runs: [run],
@@ -785,10 +795,9 @@ function fromCodeAgentSession(source, options) {
785
795
  sourcePath: options.sourcePath,
786
796
  entries: entries.length,
787
797
  malformedLines: options.malformedLines ?? 0,
788
- inferredScore: options.score === void 0,
789
798
  hasExplicitTerminalSignal: explicitTerminal,
790
799
  hasFinalOutput: observation.finalText !== null,
791
- hasQualityLabel: options.score !== void 0,
800
+ hasQualityLabel: qualityScore !== void 0,
792
801
  hasTokenUsage: metrics.inputTokens > 0 || metrics.outputTokens > 0 || metrics.reasoningTokens > 0 || metrics.cachedTokens > 0 || metrics.cacheWriteTokens > 0,
793
802
  hasCost: costProvenance.kind !== "uncaptured",
794
803
  costKind: costProvenance.kind,
@@ -799,6 +808,12 @@ function fromCodeAgentSession(source, options) {
799
808
  observations: [{ ...observation, sessionId }]
800
809
  };
801
810
  }
811
+ function terminalOutcomeFromSession(terminal) {
812
+ if (!terminal.explicit) return "unknown";
813
+ if (terminal.status === "completed") return "succeeded";
814
+ if (terminal.status === "failed") return "failed";
815
+ return "unknown";
816
+ }
802
817
  function metricsFor(source, entries) {
803
818
  switch (source) {
804
819
  case "codex":
@@ -833,7 +848,7 @@ function codexMetrics(entries) {
833
848
  addCodexExecUsage(metrics, record2(entry.usage));
834
849
  }
835
850
  if (entryType === "turn.failed") metrics.turnsAborted += 1;
836
- if (entryType === "error") metrics.toolErrors += 1;
851
+ if (entryType === "error") metrics.unclassifiedErrors += 1;
837
852
  const item = record2(entry.item);
838
853
  if (item && (entryType === "item.started" || entryType === "item.completed")) {
839
854
  addCodexExecItem(metrics, startedToolIds, entryType, item);
@@ -885,7 +900,7 @@ function codexMetrics(entries) {
885
900
  if (payloadType === "token_count")
886
901
  setCodexCumulativeUsage(metrics, record2(record2(payload.info)?.total_token_usage));
887
902
  const result = record2(payload.result);
888
- if (result && "Err" in result) metrics.toolErrors += 1;
903
+ if (result && "Err" in result) metrics.unclassifiedErrors += 1;
889
904
  }
890
905
  }
891
906
  if (metrics.wallMs === 0 && startedAt !== void 0 && completedAt !== void 0) {
@@ -918,7 +933,8 @@ function addCodexExecItem(metrics, startedToolIds, eventType, item) {
918
933
  metrics.toolErrors += 1;
919
934
  }
920
935
  }
921
- if (itemType === "error" || codexExecToolFailed(itemType, item)) metrics.toolErrors += 1;
936
+ if (itemType === "error") metrics.unclassifiedErrors += 1;
937
+ else if (codexExecToolFailed(itemType, item)) metrics.toolErrors += 1;
922
938
  }
923
939
  function codexExecToolFailed(itemType, item) {
924
940
  const status = stringField2(item, "status");
@@ -1148,6 +1164,7 @@ function emptyMetrics(entries) {
1148
1164
  toolCalls: 0,
1149
1165
  toolOutputs: 0,
1150
1166
  toolErrors: 0,
1167
+ unclassifiedErrors: 0,
1151
1168
  patchAttempts: 0,
1152
1169
  patchSuccesses: 0,
1153
1170
  patchFailures: 0,
@@ -1236,7 +1253,7 @@ function resolveSessionCost(explicit, metrics, model) {
1236
1253
  if (explicit) {
1237
1254
  if (explicit.kind === "uncaptured") {
1238
1255
  if (explicit.usd !== null) throw new Error("uncaptured cost must have usd: null");
1239
- return { costUsd: 0, costProvenance: explicit };
1256
+ return { costUsd: null, costProvenance: explicit };
1240
1257
  }
1241
1258
  if (!Number.isFinite(explicit.usd) || explicit.usd < 0) {
1242
1259
  throw new Error(`${explicit.kind} cost must be a finite, non-negative USD amount`);
@@ -1252,11 +1269,12 @@ function resolveSessionCost(explicit, metrics, model) {
1252
1269
  const costUsd = estimateCost(metrics.inputTokens, metrics.outputTokens, model);
1253
1270
  return { costUsd, costProvenance: { kind: "estimated", usd: costUsd } };
1254
1271
  }
1255
- return { costUsd: 0, costProvenance: { kind: "uncaptured", usd: null } };
1272
+ return { costUsd: null, costProvenance: { kind: "uncaptured", usd: null } };
1256
1273
  }
1257
1274
  function diagnosticsFor(metrics, options) {
1258
1275
  const warnings = [];
1259
- if (!options.scoreOverridden) warnings.push("outcome score is inferred from process telemetry");
1276
+ if (options.invalidQualityScore) warnings.push("non-finite task quality score omitted");
1277
+ else if (!options.hasQualityLabel) warnings.push("task quality score not supplied");
1260
1278
  if (!options.explicitTerminal) warnings.push("no explicit terminal success/failure signal");
1261
1279
  if (metrics.inputTokens === 0 && metrics.outputTokens === 0 && metrics.reasoningTokens === 0 && metrics.cachedTokens === 0 && metrics.cacheWriteTokens === 0) {
1262
1280
  warnings.push("missing token usage");
@@ -1387,6 +1405,9 @@ function clamp01(value) {
1387
1405
  if (!Number.isFinite(value)) return 0;
1388
1406
  return Math.max(0, Math.min(1, value));
1389
1407
  }
1408
+ function finiteScore(value) {
1409
+ return value !== void 0 && Number.isFinite(value) ? clamp01(value) : void 0;
1410
+ }
1390
1411
  function isRecord2(value) {
1391
1412
  return value !== null && typeof value === "object" && !Array.isArray(value);
1392
1413
  }
@@ -1422,4 +1443,4 @@ export {
1422
1443
  fromPiSession,
1423
1444
  fromPigraphSession
1424
1445
  };
1425
- //# sourceMappingURL=chunk-7VYEGHWF.js.map
1446
+ //# sourceMappingURL=chunk-SZLVEKMJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contract/intake/code-agent-observation.ts","../src/contract/intake/code-agent-session.ts"],"sourcesContent":["export type CodeAgentSessionSource = 'codex' | 'claude-code' | 'opencode' | 'kimi-code' | 'pi'\n\nexport type CodeAgentSessionTerminalStatus = 'completed' | 'failed' | 'unknown'\n\nexport type CodeAgentSessionActionKind = 'tool' | 'patch' | 'terminal' | 'graph-completion'\n\nexport type CodeAgentSessionActionSurface =\n | 'tool'\n | 'mcp'\n | 'subagent'\n | 'skill'\n | 'hook'\n | 'web'\n | 'code'\n\nexport type CodeAgentSessionActionStatus = 'started' | 'completed' | 'failed' | 'unknown'\n\nexport interface CodeAgentSessionExecutionReceipt {\n exitCode: number\n startedAtMs?: number\n completedAtMs?: number\n}\n\nexport interface CodeAgentSessionAction {\n id: string\n stepIndex: number\n kind: CodeAgentSessionActionKind\n surface: CodeAgentSessionActionSurface\n name: string\n status: CodeAgentSessionActionStatus\n timestampMs?: number\n costUsd?: number\n metadata: Record<string, unknown>\n}\n\nexport interface CodeAgentSessionObservation {\n source: CodeAgentSessionSource\n sessionId: string\n finalText: string | null\n terminal: {\n status: CodeAgentSessionTerminalStatus\n explicit: boolean\n }\n actions: CodeAgentSessionAction[]\n}\n\nexport interface ObserveCodeAgentSessionOptions {\n source: CodeAgentSessionSource\n entries: unknown[]\n sourcePath?: string\n execution?: CodeAgentSessionExecutionReceipt\n}\n\ninterface SessionProjection {\n finalText: string | null\n terminal: CodeAgentSessionTerminalStatus\n explicitTerminal: boolean\n actions: CodeAgentSessionAction[]\n}\n\n/**\n * Project one provider session into the exact user-visible answer and a\n * provider-neutral action stream. Raw prompts, tool inputs, and tool outputs\n * stay out of this projection; callers retain the source JSONL as evidence.\n */\nexport function observeCodeAgentSession(\n options: ObserveCodeAgentSessionOptions,\n): CodeAgentSessionObservation {\n const entries = options.entries.filter(isRecord)\n const projection = projectionFor(options.source, entries)\n const terminal = terminalWithExecution(projection, options.execution)\n return {\n source: options.source,\n sessionId:\n sessionIdFromEntries(options.source, entries) ??\n fallbackSessionId(options.source, options.sourcePath),\n finalText: projection.finalText,\n terminal,\n actions: projection.actions,\n }\n}\n\nfunction projectionFor(\n source: CodeAgentSessionSource,\n entries: Record<string, unknown>[],\n): SessionProjection {\n switch (source) {\n case 'codex':\n return codexProjection(entries)\n case 'claude-code':\n return claudeProjection(entries)\n case 'opencode':\n return openCodeProjection(entries)\n case 'kimi-code':\n return kimiProjection(entries)\n case 'pi':\n return piProjection(entries)\n }\n}\n\nfunction codexProjection(entries: Record<string, unknown>[]): SessionProjection {\n const actions: CodeAgentSessionAction[] = []\n const calls = new Map<string, CodeAgentSessionAction>()\n let finalText: string | null = null\n let terminal: CodeAgentSessionTerminalStatus = 'unknown'\n let explicitTerminal = false\n\n for (const entry of entries) {\n const entryType = stringField(entry, 'type')\n const payload = record(entry.payload) ?? {}\n const payloadType = stringField(payload, 'type')\n const timestampMs = timestamp(entry.timestamp)\n const item = record(entry.item)\n\n if (entryType === 'item.started' && item) {\n const itemType = stringField(item, 'type')\n if (isCodexActionItem(itemType)) {\n const id = stringField(item, 'id') ?? `item-${actions.length}`\n const action = actionFor({\n id,\n stepIndex: actions.length,\n kind: itemType === 'file_change' ? 'patch' : 'tool',\n surface: codexItemSurface(itemType, item),\n name: codexItemName(itemType, item),\n status: 'started',\n timestampMs,\n metadata: compactMetadata({ sourceEventType: entryType, itemType }),\n })\n calls.set(id, action)\n actions.push(action)\n }\n }\n\n if (entryType === 'item.completed' && item) {\n const itemType = stringField(item, 'type')\n if (itemType === 'agent_message' || itemType === 'message') {\n finalText = nonEmpty(stringField(item, 'text')) ?? finalText\n }\n if (isCodexActionItem(itemType)) {\n const id = stringField(item, 'id') ?? `item-${actions.length}`\n const status = codexItemStatus(itemType, item)\n const existing = calls.get(id)\n if (existing) {\n existing.status = status\n } else {\n const action = actionFor({\n id,\n stepIndex: actions.length,\n kind: itemType === 'file_change' ? 'patch' : 'tool',\n surface: codexItemSurface(itemType, item),\n name: codexItemName(itemType, item),\n status,\n timestampMs,\n metadata: compactMetadata({ sourceEventType: entryType, itemType }),\n })\n calls.set(id, action)\n actions.push(action)\n }\n }\n }\n\n if (entryType === 'response_item') {\n if (payloadType === 'message' || payloadType === 'agent_message') {\n finalText = textFromMessagePayload(payload) ?? finalText\n }\n if (payloadType === 'function_call' || payloadType === 'custom_tool_call') {\n const id =\n stringField(payload, 'call_id') ?? stringField(payload, 'id') ?? `call-${actions.length}`\n const name = stringField(payload, 'name') ?? payloadType\n const action = actionFor({\n id,\n stepIndex: actions.length,\n kind: 'tool',\n surface: surfaceForTool(name),\n name,\n status: 'started',\n timestampMs,\n metadata: compactMetadata({ sourceEventType: entryType, payloadType }),\n })\n calls.set(id, action)\n actions.push(action)\n }\n if (payloadType === 'function_call_output' || payloadType === 'custom_tool_call_output') {\n const id = stringField(payload, 'call_id') ?? stringField(payload, 'id')\n const existing = id ? calls.get(id) : undefined\n if (existing) existing.status = looksLikeError(payload.output) ? 'failed' : 'completed'\n }\n }\n\n if (entryType === 'event_msg') {\n if (payloadType === 'agent_message') {\n finalText =\n nonEmpty(stringField(payload, 'message')) ??\n nonEmpty(stringField(payload, 'text')) ??\n finalText\n }\n if (payloadType === 'patch_apply_end') {\n const patchStatus =\n typeof payload.success === 'boolean'\n ? payload.success\n ? 'completed'\n : 'failed'\n : 'unknown'\n actions.push(\n actionFor({\n id: stringField(payload, 'call_id') ?? `patch-${actions.length}`,\n stepIndex: actions.length,\n kind: 'patch',\n surface: 'code',\n name: 'patch',\n status: patchStatus,\n timestampMs,\n metadata: compactMetadata({ sourceEventType: entryType, payloadType }),\n }),\n )\n }\n if (payloadType === 'sub_agent_activity') {\n const name = stringField(payload, 'kind') ?? 'subagent'\n actions.push(\n actionFor({\n id: stringField(payload, 'event_id') ?? `subagent-${actions.length}`,\n stepIndex: actions.length,\n kind: 'tool',\n surface: 'subagent',\n name,\n status: statusFrom(payload),\n timestampMs,\n metadata: compactMetadata({ sourceEventType: entryType, payloadType }),\n }),\n )\n }\n if (payloadType === 'task_complete' || payloadType === 'turn_aborted') {\n const completed = payloadType === 'task_complete'\n terminal = completed ? 'completed' : 'failed'\n explicitTerminal = true\n actions.push(terminalAction(actions.length, payloadType, completed, timestampMs))\n }\n }\n\n if (entryType === 'turn.completed' || entryType === 'exec_done') {\n const completed = entry.success !== false\n terminal = completed ? 'completed' : 'failed'\n explicitTerminal = true\n finalText = nonEmpty(stringField(entry, 'message')) ?? finalText\n actions.push(terminalAction(actions.length, entryType, completed, timestampMs))\n }\n if (entryType === 'turn.failed' || entryType === 'error') {\n terminal = 'failed'\n explicitTerminal = true\n actions.push(terminalAction(actions.length, entryType, false, timestampMs))\n }\n }\n\n return { finalText, terminal, explicitTerminal, actions }\n}\n\nfunction claudeProjection(entries: Record<string, unknown>[]): SessionProjection {\n const actions: CodeAgentSessionAction[] = []\n const calls = new Map<string, CodeAgentSessionAction>()\n let finalText: string | null = null\n let resultText: string | null = null\n let terminal: CodeAgentSessionTerminalStatus = 'unknown'\n let explicitTerminal = false\n\n for (const entry of entries) {\n const entryType = stringField(entry, 'type')\n const timestampMs = timestamp(entry.timestamp)\n const message = record(entry.message)\n const content = Array.isArray(message?.content) ? message.content : []\n\n if (entryType === 'assistant') {\n const text = textBlocks(content)\n if (text !== null) finalText = text\n for (const value of content) {\n const part = record(value)\n if (!part) continue\n const partType = stringField(part, 'type')\n if (partType === 'tool_use') {\n const id = stringField(part, 'id') ?? `tool-${actions.length}`\n const name = stringField(part, 'name') ?? 'tool'\n const action = actionFor({\n id,\n stepIndex: actions.length,\n kind: 'tool',\n surface: surfaceForTool(name),\n name,\n status: 'started',\n timestampMs,\n metadata: compactMetadata({ sourceEventType: entryType, partType }),\n })\n calls.set(id, action)\n actions.push(action)\n }\n }\n completeClaudeTools(content, calls)\n const stopReason = stringField(message ?? {}, 'stop_reason')\n if (stopReason === 'end_turn') {\n terminal = 'completed'\n explicitTerminal = true\n actions.push(terminalAction(actions.length, stopReason, true, timestampMs))\n }\n }\n\n if (entryType === 'user') {\n completeClaudeTools(content, calls)\n }\n if (entryType === 'tool_use') {\n const id = stringField(entry, 'id') ?? `tool-${actions.length}`\n const name = stringField(entry, 'name') ?? 'tool'\n const action = actionFor({\n id,\n stepIndex: actions.length,\n kind: 'tool',\n surface: surfaceForTool(name),\n name,\n status: 'started',\n timestampMs,\n metadata: { sourceEventType: entryType },\n })\n calls.set(id, action)\n actions.push(action)\n }\n if (entryType === 'tool_result') {\n const id = stringField(entry, 'tool_use_id')\n const action = id ? calls.get(id) : undefined\n if (action) action.status = entry.is_error === true ? 'failed' : 'completed'\n }\n\n if (entryType === 'system') {\n const subtype = stringField(entry, 'subtype')\n const hookName = stringField(entry, 'hook_name') ?? stringField(entry, 'hookName')\n if (subtype?.toLowerCase().includes('hook') || hookName) {\n actions.push(\n actionFor({\n id: stringField(entry, 'uuid') ?? `hook-${actions.length}`,\n stepIndex: actions.length,\n kind: 'tool',\n surface: 'hook',\n name: hookName ?? subtype ?? 'hook',\n status: statusFrom(entry),\n timestampMs,\n metadata: compactMetadata({ sourceEventType: entryType, subtype }),\n }),\n )\n }\n }\n\n if (entryType === 'pr-link') {\n actions.push(terminalAction(actions.length, entryType, true, timestampMs))\n }\n\n if (entryType === 'result') {\n resultText = nonEmpty(stringField(entry, 'result')) ?? resultText\n const subtype = stringField(entry, 'subtype')\n const completed = entry.is_error !== true && !subtype?.toLowerCase().includes('error')\n terminal = completed ? 'completed' : 'failed'\n explicitTerminal = true\n actions.push(terminalAction(actions.length, subtype ?? entryType, completed, timestampMs))\n }\n if (entryType === 'error') {\n terminal = 'failed'\n explicitTerminal = true\n actions.push(terminalAction(actions.length, entryType, false, timestampMs))\n }\n }\n\n return {\n finalText: resultText ?? finalText,\n terminal,\n explicitTerminal,\n actions,\n }\n}\n\nfunction openCodeProjection(entries: Record<string, unknown>[]): SessionProjection {\n const actions: CodeAgentSessionAction[] = []\n const assistantMessageIds = new Set(\n entries\n .filter((entry) => stringField(entry, 'role') === 'assistant')\n .map((entry) => stringField(entry, 'id'))\n .filter((id): id is string => id !== undefined),\n )\n let finalText: string | null = null\n let terminal: CodeAgentSessionTerminalStatus = 'unknown'\n let explicitTerminal = false\n\n for (const entry of entries) {\n const entryType = stringField(entry, 'type')\n const part = record(entry.part) ?? entry\n const partType = stringField(part, 'type')\n const timestampMs = timestamp(entry.timestamp) ?? timestamp(record(entry.time)?.created)\n\n if (entryType === 'text' && record(entry.part)) {\n finalText = nonEmpty(stringField(part, 'text')) ?? finalText\n } else if (\n partType === 'text' &&\n (assistantMessageIds.size === 0 ||\n assistantMessageIds.has(stringField(part, 'messageID') ?? ''))\n ) {\n finalText = nonEmpty(stringField(part, 'text')) ?? finalText\n }\n\n if (entryType === 'tool_use' || partType === 'tool') {\n const state = record(part.state) ?? {}\n const name = stringField(part, 'tool') ?? 'tool'\n actions.push(\n actionFor({\n id: stringField(part, 'callID') ?? stringField(part, 'id') ?? `tool-${actions.length}`,\n stepIndex: actions.length,\n kind: 'tool',\n surface: surfaceForTool(name),\n name,\n status: statusFrom(state),\n timestampMs,\n metadata: compactMetadata({ sourceEventType: entryType, partType }),\n }),\n )\n }\n if (partType === 'patch') {\n actions.push(\n actionFor({\n id: stringField(part, 'id') ?? `patch-${actions.length}`,\n stepIndex: actions.length,\n kind: 'patch',\n surface: 'code',\n name: 'patch',\n status: 'completed',\n timestampMs,\n metadata: compactMetadata({ sourceEventType: entryType, partType }),\n }),\n )\n }\n\n if (stringField(entry, 'role') === 'assistant') {\n const finish = stringField(entry, 'finish')\n if (finish === 'stop' || finish === 'error') {\n const completed = finish === 'stop'\n terminal = completed ? 'completed' : 'failed'\n explicitTerminal = true\n actions.push(terminalAction(actions.length, finish, completed, timestampMs))\n }\n }\n if (entryType === 'error') {\n terminal = 'failed'\n explicitTerminal = true\n actions.push(terminalAction(actions.length, entryType, false, timestampMs))\n }\n }\n\n return { finalText, terminal, explicitTerminal, actions }\n}\n\nfunction kimiProjection(entries: Record<string, unknown>[]): SessionProjection {\n const actions: CodeAgentSessionAction[] = []\n const calls = new Map<string, CodeAgentSessionAction>()\n let finalText: string | null = null\n let terminal: CodeAgentSessionTerminalStatus = 'unknown'\n let explicitTerminal = false\n\n for (const entry of entries) {\n const timestampMs = timestamp(entry.timestamp)\n const message = record(entry.message)\n const messageType = stringField(message ?? {}, 'type')\n const payload = record(message?.payload) ?? {}\n if (messageType === 'ContentPart' && stringField(payload, 'type') === 'text') {\n finalText =\n nonEmpty(stringField(payload, 'text')) ??\n nonEmpty(stringField(payload, 'content')) ??\n finalText\n }\n if (messageType === 'ToolCall') {\n const fn = record(payload.function) ?? {}\n const id = stringField(payload, 'id') ?? `tool-${actions.length}`\n const name = stringField(fn, 'name') ?? 'tool'\n const action = actionFor({\n id,\n stepIndex: actions.length,\n kind: 'tool',\n surface: surfaceForTool(name),\n name,\n status: 'started',\n timestampMs,\n metadata: { sourceEventType: messageType },\n })\n calls.set(id, action)\n actions.push(action)\n }\n if (messageType === 'ToolResult') {\n const id = stringField(payload, 'tool_call_id')\n const action = id ? calls.get(id) : undefined\n if (action)\n action.status = record(payload.return_value)?.is_error === true ? 'failed' : 'completed'\n }\n if (messageType === 'TurnEnd' || messageType === 'StepInterrupted') {\n const completed = messageType === 'TurnEnd'\n terminal = completed ? 'completed' : 'failed'\n explicitTerminal = true\n actions.push(terminalAction(actions.length, messageType, completed, timestampMs))\n }\n }\n\n return { finalText, terminal, explicitTerminal, actions }\n}\n\nfunction piProjection(entries: Record<string, unknown>[]): SessionProjection {\n const actions: CodeAgentSessionAction[] = []\n let terminal: CodeAgentSessionTerminalStatus = 'unknown'\n let explicitTerminal = false\n for (const entry of entries) {\n const nodes = Array.isArray(entry.nodes) ? entry.nodes : []\n for (const value of nodes) {\n const node = record(value)\n const ir = record(node?.ir) ?? node\n const kind = stringField(ir ?? {}, 'kind')\n if (kind === 'ToolInvocation') {\n actions.push(\n actionFor({\n id:\n stringField(ir ?? {}, 'id') ??\n stringField(node ?? {}, 'id') ??\n `tool-${actions.length}`,\n stepIndex: actions.length,\n kind: 'tool',\n surface: 'tool',\n name: stringField(ir ?? {}, 'name') ?? 'graph-tool',\n status: 'started',\n timestampMs: timestamp(ir?.createdAt),\n metadata: { sourceEventType: 'graph-node', graphKind: kind },\n }),\n )\n }\n if (kind === 'ToolResult') {\n const prior = [...actions].reverse().find((action) => action.kind === 'tool')\n if (prior) prior.status = 'completed'\n }\n if (kind === 'CompletionDecision') {\n terminal = 'completed'\n explicitTerminal = true\n actions.push(\n actionFor({\n id:\n stringField(ir ?? {}, 'id') ??\n stringField(node ?? {}, 'id') ??\n `completion-${actions.length}`,\n stepIndex: actions.length,\n kind: 'graph-completion',\n surface: 'tool',\n name: 'complete',\n status: 'completed',\n timestampMs: timestamp(ir?.createdAt),\n metadata: { sourceEventType: 'graph-node', graphKind: kind },\n }),\n )\n }\n }\n }\n return { finalText: null, terminal, explicitTerminal, actions }\n}\n\nfunction completeClaudeTools(content: unknown[], calls: Map<string, CodeAgentSessionAction>): void {\n for (const value of content) {\n const part = record(value)\n if (!part || stringField(part, 'type') !== 'tool_result') continue\n const id = stringField(part, 'tool_use_id')\n const action = id ? calls.get(id) : undefined\n if (action) action.status = part.is_error === true ? 'failed' : 'completed'\n }\n}\n\nfunction isCodexActionItem(itemType: string | undefined): boolean {\n return (\n itemType === 'command_execution' ||\n itemType === 'mcp_tool_call' ||\n itemType === 'collab_tool_call' ||\n itemType === 'web_search' ||\n itemType === 'file_change'\n )\n}\n\nfunction codexItemSurface(\n itemType: string | undefined,\n item: Record<string, unknown>,\n): CodeAgentSessionActionSurface {\n if (itemType === 'mcp_tool_call') return 'mcp'\n if (itemType === 'collab_tool_call') return 'subagent'\n if (itemType === 'web_search') return 'web'\n if (itemType === 'file_change') return 'code'\n return surfaceForTool(stringField(item, 'name') ?? itemType ?? 'tool')\n}\n\nfunction codexItemName(itemType: string | undefined, item: Record<string, unknown>): string {\n if (itemType === 'mcp_tool_call') {\n const server = stringField(item, 'server')\n const tool = stringField(item, 'tool')\n return [server, tool].filter(Boolean).join('/') || 'mcp'\n }\n if (itemType === 'collab_tool_call') return stringField(item, 'tool') ?? 'subagent'\n if (itemType === 'web_search') return 'web_search'\n if (itemType === 'file_change') return 'file_change'\n return stringField(item, 'name') ?? itemType ?? 'tool'\n}\n\nfunction codexItemStatus(\n itemType: string | undefined,\n item: Record<string, unknown>,\n): CodeAgentSessionActionStatus {\n const status = statusFrom(item)\n if (status === 'failed') return status\n if (itemType === 'command_execution') {\n const exitCode = numberField(item, 'exit_code')\n if (exitCode !== undefined) return exitCode === 0 ? 'completed' : 'failed'\n }\n if (itemType === 'mcp_tool_call' && record(item.error)) return 'failed'\n return status === 'unknown' || status === 'started' ? 'completed' : status\n}\n\nfunction textFromMessagePayload(payload: Record<string, unknown>): string | null {\n const direct = nonEmpty(stringField(payload, 'text'))\n if (direct) return direct\n const content = payload.content\n if (typeof content === 'string') return nonEmpty(content)\n if (Array.isArray(content)) return textBlocks(content)\n return null\n}\n\nfunction textBlocks(values: unknown[]): string | null {\n const text = values\n .map((value) => record(value))\n .filter((value): value is Record<string, unknown> => value !== null)\n .filter((value) => stringField(value, 'type') === 'text')\n .map((value) => stringField(value, 'text'))\n .filter((value): value is string => value !== undefined)\n .join('\\n')\n return nonEmpty(text)\n}\n\nfunction terminalWithExecution(\n projection: SessionProjection,\n execution: CodeAgentSessionExecutionReceipt | undefined,\n): CodeAgentSessionObservation['terminal'] {\n if (!execution) {\n return { status: projection.terminal, explicit: projection.explicitTerminal }\n }\n assertExecutionReceipt(execution)\n return {\n status: execution.exitCode !== 0 || projection.terminal === 'failed' ? 'failed' : 'completed',\n explicit: true,\n }\n}\n\nfunction assertExecutionReceipt(receipt: CodeAgentSessionExecutionReceipt): void {\n if (!Number.isSafeInteger(receipt.exitCode)) {\n throw new Error('code-agent execution exitCode must be a safe integer')\n }\n for (const [name, value] of [\n ['startedAtMs', receipt.startedAtMs],\n ['completedAtMs', receipt.completedAtMs],\n ] as const) {\n if (value !== undefined && (!Number.isFinite(value) || value < 0)) {\n throw new Error(`code-agent execution ${name} must be a non-negative finite number`)\n }\n }\n if (\n receipt.startedAtMs !== undefined &&\n receipt.completedAtMs !== undefined &&\n receipt.completedAtMs < receipt.startedAtMs\n ) {\n throw new Error('code-agent execution completedAtMs precedes startedAtMs')\n }\n}\n\nfunction terminalAction(\n stepIndex: number,\n name: string,\n completed: boolean,\n timestampMs: number | undefined,\n): CodeAgentSessionAction {\n return actionFor({\n id: `terminal-${stepIndex}`,\n stepIndex,\n kind: 'terminal',\n surface: 'tool',\n name,\n status: completed ? 'completed' : 'failed',\n timestampMs,\n metadata: { sourceEventType: name },\n })\n}\n\nfunction actionFor(input: CodeAgentSessionAction): CodeAgentSessionAction {\n return input\n}\n\nfunction surfaceForTool(name: string): CodeAgentSessionActionSurface {\n const normalized = name.toLowerCase()\n if (normalized.startsWith('mcp__') || normalized.includes('mcp_tool')) return 'mcp'\n if (\n normalized === 'task' ||\n normalized === 'agent' ||\n normalized.includes('subagent') ||\n normalized.includes('spawn_agent') ||\n normalized.includes('collab') ||\n normalized.startsWith('multi_agent')\n ) {\n return 'subagent'\n }\n if (normalized === 'skill' || normalized.includes('skill')) return 'skill'\n if (normalized.includes('hook')) return 'hook'\n if (\n normalized.includes('web_search') ||\n normalized.includes('webfetch') ||\n normalized === 'web'\n ) {\n return 'web'\n }\n if (\n normalized === 'edit' ||\n normalized === 'write' ||\n normalized.includes('patch') ||\n normalized.includes('file_change')\n ) {\n return 'code'\n }\n return 'tool'\n}\n\nfunction statusFrom(value: Record<string, unknown>): CodeAgentSessionActionStatus {\n const status = (stringField(value, 'status') ?? '').toLowerCase()\n if (status === 'completed' || status === 'success' || status === 'succeeded') return 'completed'\n if (status === 'error' || status === 'failed' || status === 'declined') return 'failed'\n if (status === 'running' || status === 'started' || status === 'in_progress') return 'started'\n return 'unknown'\n}\n\nfunction compactMetadata(input: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(input).filter((entry) => entry[1] !== undefined))\n}\n\nfunction sessionIdFromEntries(\n source: CodeAgentSessionSource,\n entries: Record<string, unknown>[],\n): string | undefined {\n for (const entry of entries) {\n if (source === 'codex') {\n const threadId = stringField(entry, 'thread_id')\n if (threadId) return threadId\n const payload = record(entry.payload)\n const id = payload ? stringField(payload, 'id') : undefined\n if (id) return id\n }\n const message = record(entry.message)\n const payload = record(message?.payload)\n const sessionId =\n stringField(entry, 'sessionID') ??\n stringField(entry, 'sessionId') ??\n stringField(entry, 'session_id') ??\n stringField(payload ?? {}, 'session_id')\n if (sessionId) return sessionId\n }\n return undefined\n}\n\nfunction fallbackSessionId(source: CodeAgentSessionSource, sourcePath: string | undefined): string {\n return `${source}:${sourcePath ?? 'unknown-session'}`\n}\n\nfunction looksLikeError(value: unknown): boolean {\n if (isRecord(value)) {\n if (value.success === false || value.is_error === true) return true\n const exitCode = numberField(value, 'exit_code')\n if (exitCode !== undefined && exitCode !== 0) return true\n }\n const text = typeof value === 'string' ? value : JSON.stringify(value ?? '')\n return /\\b(?:error|failed|failure)\\b|exit(?:_| )code[\"\\s:]+[1-9]/i.test(text)\n}\n\nfunction nonEmpty(value: string | undefined): string | null {\n return value !== undefined && value.length > 0 ? value : null\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return isRecord(value) ? value : null\n}\n\nfunction stringField(value: Record<string, unknown>, key: string): string | undefined {\n const field = value[key]\n return typeof field === 'string' && field.length > 0 ? field : undefined\n}\n\nfunction numberField(value: Record<string, unknown>, key: string): number | undefined {\n const field = value[key]\n return typeof field === 'number' && Number.isFinite(field) ? field : undefined\n}\n\nfunction timestamp(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value > 1_000_000_000_000 ? value : value * 1_000\n }\n if (typeof value === 'string' && value.length > 0) {\n const parsed = Date.parse(value)\n return Number.isFinite(parsed) ? parsed : undefined\n }\n return undefined\n}\n","import { createHash } from 'node:crypto'\nimport { estimateCost, isModelPriced } from '../../metrics'\nimport type {\n RunCostProvenance,\n RunRecord,\n RunSplitTag,\n RunTerminalOutcome,\n RunTokenUsage,\n} from '../../run-record'\nimport { extractUsage } from '../../trace/extract-usage'\nimport {\n type CodeAgentSessionExecutionReceipt,\n type CodeAgentSessionObservation,\n type CodeAgentSessionSource,\n observeCodeAgentSession,\n} from './code-agent-observation'\n\nexport type {\n CodeAgentSessionAction,\n CodeAgentSessionActionKind,\n CodeAgentSessionActionStatus,\n CodeAgentSessionActionSurface,\n CodeAgentSessionExecutionReceipt,\n CodeAgentSessionObservation,\n CodeAgentSessionSource,\n CodeAgentSessionTerminalStatus,\n ObserveCodeAgentSessionOptions,\n} from './code-agent-observation'\nexport { observeCodeAgentSession } from './code-agent-observation'\n\nexport interface ParsedCodeAgentJsonl {\n entries: unknown[]\n malformedLines: number\n}\n\nexport interface CodeAgentSessionMetrics {\n entries: number\n userMessages: number\n assistantMessages: number\n reasoningItems: number\n toolCalls: number\n toolOutputs: number\n toolErrors: number\n unclassifiedErrors: number\n patchAttempts: number\n patchSuccesses: number\n patchFailures: number\n turnsStarted: number\n turnsCompleted: number\n turnsAborted: number\n contextCompactions: number\n mcpCalls: number\n subagentCalls: number\n skillCalls: number\n hookCalls: number\n webCalls: number\n codeActions: number\n prLinks: number\n fileSnapshots: number\n graphNodes: number\n graphEdges: number\n actionCandidates: number\n verificationReports: number\n completionDecisions: number\n reliabilityRows: number\n reliabilityLift: number\n inputTokens: number\n outputTokens: number\n reasoningTokens: number\n cachedTokens: number\n cacheWriteTokens: number\n observedCostUsd: number\n observedCostCaptured?: boolean\n wallMs: number\n processScore: number\n}\n\nexport interface CodeAgentSessionDiagnostic {\n source: CodeAgentSessionSource\n sessionId: string\n sourcePath?: string\n entries: number\n malformedLines: number\n hasExplicitTerminalSignal: boolean\n hasFinalOutput: boolean\n hasQualityLabel: boolean\n hasTokenUsage: boolean\n hasCost: boolean\n costKind?: RunCostProvenance['kind']\n warnings: string[]\n}\n\nexport interface CodeAgentSessionIntakeResult {\n runs: RunRecord[]\n diagnostics: CodeAgentSessionDiagnostic[]\n metrics: CodeAgentSessionMetrics[]\n observations: CodeAgentSessionObservation[]\n}\n\nexport interface CodeAgentSessionIntakeOptions {\n entries: unknown[]\n malformedLines?: number\n sourcePath?: string\n experimentId?: string\n candidateId?: string\n seed?: number\n splitTag?: RunSplitTag\n scenarioId?: string\n model?: string\n promptHash?: string\n configHash?: string\n commitSha?: string\n score?: number\n /** Explicit cost receipt. When omitted, source-reported cost wins, then a\n * token-priced estimate, then uncaptured. */\n costProvenance?: RunCostProvenance\n /** Exact executor-owned process result. This is required when a provider's\n * JSON stream has no terminal event, as with `opencode run --format json`. */\n execution?: CodeAgentSessionExecutionReceipt\n}\n\nexport function parseCodeAgentJsonl(jsonl: string): ParsedCodeAgentJsonl {\n const entries: unknown[] = []\n let malformedLines = 0\n for (const line of jsonl.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed) continue\n try {\n entries.push(JSON.parse(trimmed))\n } catch {\n malformedLines += 1\n }\n }\n return { entries, malformedLines }\n}\n\nexport function fromCodexSession(\n options: CodeAgentSessionIntakeOptions,\n): CodeAgentSessionIntakeResult {\n return fromCodeAgentSession('codex', options)\n}\n\nexport function fromClaudeCodeSession(\n options: CodeAgentSessionIntakeOptions,\n): CodeAgentSessionIntakeResult {\n return fromCodeAgentSession('claude-code', options)\n}\n\nexport function fromOpenCodeSession(\n options: CodeAgentSessionIntakeOptions,\n): CodeAgentSessionIntakeResult {\n return fromCodeAgentSession('opencode', options)\n}\n\nexport function fromKimiCodeSession(\n options: CodeAgentSessionIntakeOptions,\n): CodeAgentSessionIntakeResult {\n return fromCodeAgentSession('kimi-code', options)\n}\n\nexport function fromPiSession(\n options: CodeAgentSessionIntakeOptions,\n): CodeAgentSessionIntakeResult {\n return fromCodeAgentSession('pi', options)\n}\n\nexport const fromPigraphSession = fromPiSession\n\nfunction fromCodeAgentSession(\n source: CodeAgentSessionSource,\n options: CodeAgentSessionIntakeOptions,\n): CodeAgentSessionIntakeResult {\n const entries = options.entries.filter(isRecord)\n if (entries.length === 0) {\n return {\n runs: [],\n diagnostics: [\n {\n source,\n sessionId: fallbackSessionId(source, options.sourcePath),\n sourcePath: options.sourcePath,\n entries: 0,\n malformedLines: options.malformedLines ?? 0,\n hasExplicitTerminalSignal: false,\n hasFinalOutput: false,\n hasQualityLabel: false,\n hasTokenUsage: false,\n hasCost: false,\n costKind: 'uncaptured',\n warnings: ['no parseable session entries'],\n },\n ],\n metrics: [],\n observations: [],\n }\n }\n\n const metrics = metricsFor(source, entries)\n const sessionId =\n sessionIdFromEntries(source, entries) ?? fallbackSessionId(source, options.sourcePath)\n const observation = observeCodeAgentSession({\n source,\n entries,\n sourcePath: options.sourcePath,\n execution: options.execution,\n })\n applyObservedSurfaceMetrics(metrics, observation)\n const model = withSnapshot(options.model ?? modelFromEntries(source, entries) ?? source)\n const tokenUsage: RunTokenUsage = {\n input: metrics.inputTokens,\n output: metrics.outputTokens,\n ...(metrics.reasoningTokens > 0 ? { reasoning: metrics.reasoningTokens } : {}),\n ...(metrics.cachedTokens > 0 ? { cached: metrics.cachedTokens } : {}),\n ...(metrics.cacheWriteTokens > 0 ? { cacheWrite: metrics.cacheWriteTokens } : {}),\n }\n const { costUsd, costProvenance } = resolveSessionCost(options.costProvenance, metrics, model)\n const qualityScore = finiteScore(options.score)\n const invalidQualityScore = options.score !== undefined && qualityScore === undefined\n const promptHash =\n options.promptHash ?? hashString(`prompt:${source}:${firstUserText(entries) ?? ''}`)\n const configHash =\n options.configHash ??\n hashJson({\n source,\n model,\n sourcePath: options.sourcePath,\n cwd: cwdFromEntries(entries),\n entryCount: entries.length,\n })\n const explicitTerminal = observation.terminal.explicit\n const warnings = diagnosticsFor(metrics, {\n model,\n explicitTerminal,\n malformedLines: options.malformedLines ?? 0,\n hasQualityLabel: qualityScore !== undefined,\n invalidQualityScore,\n costKind: costProvenance.kind,\n })\n\n const terminalOutcome = terminalOutcomeFromSession(observation.terminal)\n const processExitCode = options.execution?.exitCode\n const splitTag = options.splitTag ?? 'holdout'\n const run: RunRecord = {\n runId: `${source}:${sessionId}`,\n experimentId: options.experimentId ?? `${source}-local-sessions`,\n candidateId: options.candidateId ?? model,\n seed: options.seed ?? stableSeed(sessionId),\n model,\n promptHash,\n configHash,\n commitSha: options.commitSha ?? 'local-session',\n wallMs: metrics.wallMs,\n costUsd,\n costProvenance,\n tokenUsage,\n terminalOutcome,\n ...(terminalOutcome === 'failed'\n ? {\n terminalFailureReason:\n processExitCode !== undefined && processExitCode !== 0\n ? `process exited with code ${processExitCode}`\n : metrics.turnsAborted > 0\n ? 'turn aborted'\n : 'session reported terminal failure',\n }\n : {}),\n outcome: {\n ...(qualityScore === undefined\n ? {}\n : splitTag === 'holdout'\n ? { holdoutScore: qualityScore }\n : { searchScore: qualityScore }),\n raw: {\n entries: metrics.entries,\n user_messages: metrics.userMessages,\n assistant_messages: metrics.assistantMessages,\n reasoning_items: metrics.reasoningItems,\n tool_calls: metrics.toolCalls,\n tool_outputs: metrics.toolOutputs,\n tool_errors: metrics.toolErrors,\n execution_error_count: metrics.toolErrors,\n process_error_count: terminalOutcome === 'failed' ? 1 : 0,\n unclassified_error_count: metrics.unclassifiedErrors,\n ...(processExitCode !== undefined ? { process_exit_code: processExitCode } : {}),\n patch_attempts: metrics.patchAttempts,\n patch_successes: metrics.patchSuccesses,\n patch_failures: metrics.patchFailures,\n turns_started: metrics.turnsStarted,\n turns_completed: metrics.turnsCompleted,\n turns_aborted: metrics.turnsAborted,\n context_compactions: metrics.contextCompactions,\n mcp_calls: metrics.mcpCalls,\n subagent_calls: metrics.subagentCalls,\n skill_calls: metrics.skillCalls,\n hook_calls: metrics.hookCalls,\n web_calls: metrics.webCalls,\n code_actions: metrics.codeActions,\n pr_links: metrics.prLinks,\n file_snapshots: metrics.fileSnapshots,\n graph_nodes: metrics.graphNodes,\n graph_edges: metrics.graphEdges,\n action_candidates: metrics.actionCandidates,\n verification_reports: metrics.verificationReports,\n completion_decisions: metrics.completionDecisions,\n reliability_rows: metrics.reliabilityRows,\n reliability_lift: metrics.reliabilityLift,\n input_tokens: metrics.inputTokens,\n output_tokens: metrics.outputTokens,\n reasoning_tokens: metrics.reasoningTokens,\n cached_tokens: metrics.cachedTokens,\n cache_write_tokens: metrics.cacheWriteTokens,\n observed_cost_usd: metrics.observedCostUsd,\n observed_cost_captured: metrics.observedCostCaptured ? 1 : 0,\n estimated_cost_usd: costProvenance.kind === 'estimated' ? costProvenance.usd : 0,\n process_score: metrics.processScore,\n explicit_terminal_signal: explicitTerminal ? 1 : 0,\n quality_label_present: qualityScore !== undefined ? 1 : 0,\n cost_observed: costProvenance.kind === 'observed' ? 1 : 0,\n cost_estimated: costProvenance.kind === 'estimated' ? 1 : 0,\n cost_uncaptured: costProvenance.kind === 'uncaptured' ? 1 : 0,\n cost_unknown: costProvenance.kind === 'uncaptured' ? 1 : 0,\n },\n },\n splitTag,\n scenarioId: options.scenarioId ?? sessionId,\n }\n\n return {\n runs: [run],\n diagnostics: [\n {\n source,\n sessionId,\n sourcePath: options.sourcePath,\n entries: entries.length,\n malformedLines: options.malformedLines ?? 0,\n hasExplicitTerminalSignal: explicitTerminal,\n hasFinalOutput: observation.finalText !== null,\n hasQualityLabel: qualityScore !== undefined,\n hasTokenUsage:\n metrics.inputTokens > 0 ||\n metrics.outputTokens > 0 ||\n metrics.reasoningTokens > 0 ||\n metrics.cachedTokens > 0 ||\n metrics.cacheWriteTokens > 0,\n hasCost: costProvenance.kind !== 'uncaptured',\n costKind: costProvenance.kind,\n warnings,\n },\n ],\n metrics: [metrics],\n observations: [{ ...observation, sessionId }],\n }\n}\n\nfunction terminalOutcomeFromSession(\n terminal: CodeAgentSessionObservation['terminal'],\n): RunTerminalOutcome {\n if (!terminal.explicit) return 'unknown'\n if (terminal.status === 'completed') return 'succeeded'\n if (terminal.status === 'failed') return 'failed'\n return 'unknown'\n}\n\nfunction metricsFor(\n source: CodeAgentSessionSource,\n entries: Record<string, unknown>[],\n): CodeAgentSessionMetrics {\n switch (source) {\n case 'codex':\n return codexMetrics(entries)\n case 'claude-code':\n return claudeCodeMetrics(entries)\n case 'opencode':\n return openCodeMetrics(entries)\n case 'kimi-code':\n return kimiCodeMetrics(entries)\n case 'pi':\n return piMetrics(entries)\n }\n}\n\nfunction codexMetrics(entries: Record<string, unknown>[]): CodeAgentSessionMetrics {\n const metrics = emptyMetrics(entries.length)\n const startedToolIds = new Set<string>()\n let startedAt: number | undefined\n let completedAt: number | undefined\n\n for (const entry of entries) {\n const payload = record(entry.payload) ?? {}\n const entryType = stringField(entry, 'type')\n const payloadType = stringField(payload, 'type')\n const timestamp = timestampMs(entry.timestamp)\n if (timestamp !== undefined) {\n startedAt = startedAt === undefined ? timestamp : Math.min(startedAt, timestamp)\n completedAt = completedAt === undefined ? timestamp : Math.max(completedAt, timestamp)\n }\n\n if (entryType === 'turn.started') metrics.turnsStarted += 1\n if (entryType === 'turn.completed') {\n metrics.turnsCompleted += 1\n addCodexExecUsage(metrics, record(entry.usage))\n }\n if (entryType === 'turn.failed') metrics.turnsAborted += 1\n if (entryType === 'error') metrics.unclassifiedErrors += 1\n\n const item = record(entry.item)\n if (item && (entryType === 'item.started' || entryType === 'item.completed')) {\n addCodexExecItem(metrics, startedToolIds, entryType, item)\n }\n\n if (entryType === 'response_item') {\n if (payloadType === 'function_call' || payloadType === 'custom_tool_call')\n metrics.toolCalls += 1\n if (payloadType === 'function_call_output' || payloadType === 'custom_tool_call_output')\n metrics.toolOutputs += 1\n if (payloadType === 'reasoning') metrics.reasoningItems += 1\n if (payloadType === 'message' && stringField(payload, 'role') === 'assistant')\n metrics.assistantMessages += 1\n }\n\n if (entryType === 'event_msg') {\n if (payloadType === 'user_message') metrics.userMessages += 1\n if (payloadType === 'agent_message') metrics.assistantMessages += 1\n if (payloadType === 'task_started') {\n metrics.turnsStarted += 1\n const started = timestampMs(payload.started_at)\n if (started !== undefined) {\n startedAt = startedAt === undefined ? started : Math.min(startedAt, started)\n }\n }\n if (payloadType === 'task_complete') {\n metrics.turnsCompleted += 1\n const completed = timestampMs(payload.completed_at)\n if (completed !== undefined) {\n completedAt = completedAt === undefined ? completed : Math.max(completedAt, completed)\n }\n const duration = numberField(payload, 'duration_ms')\n if (duration !== undefined) metrics.wallMs = Math.max(metrics.wallMs, duration)\n }\n if (payloadType === 'turn_aborted') {\n metrics.turnsAborted += 1\n const completed = timestampMs(payload.completed_at)\n if (completed !== undefined) {\n completedAt = completedAt === undefined ? completed : Math.max(completedAt, completed)\n }\n }\n if (payloadType === 'context_compacted') metrics.contextCompactions += 1\n if (payloadType === 'patch_apply_end') {\n metrics.patchAttempts += 1\n if (payload.success === true) metrics.patchSuccesses += 1\n else {\n metrics.patchFailures += 1\n metrics.toolErrors += 1\n }\n }\n if (payloadType === 'token_count')\n setCodexCumulativeUsage(metrics, record(record(payload.info)?.total_token_usage))\n const result = record(payload.result)\n if (result && 'Err' in result) metrics.unclassifiedErrors += 1\n }\n }\n\n if (metrics.wallMs === 0 && startedAt !== undefined && completedAt !== undefined) {\n metrics.wallMs = Math.max(0, completedAt - startedAt)\n }\n metrics.processScore = codexProcessScore(metrics)\n return metrics\n}\n\nfunction addCodexExecItem(\n metrics: CodeAgentSessionMetrics,\n startedToolIds: Set<string>,\n eventType: 'item.started' | 'item.completed',\n item: Record<string, unknown>,\n): void {\n const itemType = stringField(item, 'type')\n const itemId = stringField(item, 'id')\n const isTool =\n itemType === 'command_execution' ||\n itemType === 'mcp_tool_call' ||\n itemType === 'collab_tool_call' ||\n itemType === 'web_search'\n\n if (eventType === 'item.started' && isTool) {\n metrics.toolCalls += 1\n if (itemId) startedToolIds.add(itemId)\n }\n if (eventType === 'item.completed' && isTool) {\n if (!itemId || !startedToolIds.has(itemId)) metrics.toolCalls += 1\n metrics.toolOutputs += 1\n }\n if (eventType !== 'item.completed') return\n\n if (itemType === 'agent_message' || itemType === 'message') metrics.assistantMessages += 1\n if (itemType === 'reasoning') metrics.reasoningItems += 1\n if (itemType === 'file_change') {\n metrics.patchAttempts += 1\n const status = stringField(item, 'status')\n if (status === 'completed') metrics.patchSuccesses += 1\n if (status === 'failed') {\n metrics.patchFailures += 1\n metrics.toolErrors += 1\n }\n }\n if (itemType === 'error') metrics.unclassifiedErrors += 1\n else if (codexExecToolFailed(itemType, item)) metrics.toolErrors += 1\n}\n\nfunction codexExecToolFailed(itemType: string | undefined, item: Record<string, unknown>): boolean {\n const status = stringField(item, 'status')\n if (itemType === 'command_execution') {\n const exitCode = numberField(item, 'exit_code')\n return (\n status === 'failed' || status === 'declined' || (exitCode !== undefined && exitCode !== 0)\n )\n }\n if (itemType === 'mcp_tool_call') return status === 'failed' || record(item.error) !== null\n return itemType === 'collab_tool_call' && status === 'failed'\n}\n\nfunction addCodexExecUsage(\n metrics: CodeAgentSessionMetrics,\n usage: Record<string, unknown> | null,\n): void {\n const parsed = readUsage(usage)\n metrics.inputTokens += parsed.input\n metrics.outputTokens += parsed.output\n metrics.reasoningTokens += parsed.reasoning\n metrics.cachedTokens += parsed.cached\n metrics.cacheWriteTokens += parsed.cacheWrite\n}\n\nfunction setCodexCumulativeUsage(\n metrics: CodeAgentSessionMetrics,\n usage: Record<string, unknown> | null,\n): void {\n const parsed = readUsage(usage)\n metrics.inputTokens = Math.max(metrics.inputTokens, parsed.input)\n metrics.outputTokens = Math.max(metrics.outputTokens, parsed.output)\n metrics.reasoningTokens = Math.max(metrics.reasoningTokens, parsed.reasoning)\n metrics.cachedTokens = Math.max(metrics.cachedTokens, parsed.cached)\n metrics.cacheWriteTokens = Math.max(metrics.cacheWriteTokens, parsed.cacheWrite)\n}\n\nfunction claudeCodeMetrics(entries: Record<string, unknown>[]): CodeAgentSessionMetrics {\n const metrics = emptyMetrics(entries.length)\n let startedAt: number | undefined\n let completedAt: number | undefined\n\n for (const entry of entries) {\n const type = stringField(entry, 'type')\n const timestamp = timestampMs(entry.timestamp)\n if (timestamp !== undefined) {\n startedAt = startedAt === undefined ? timestamp : Math.min(startedAt, timestamp)\n completedAt = completedAt === undefined ? timestamp : Math.max(completedAt, timestamp)\n }\n\n if (type === 'user') metrics.userMessages += 1\n if (type === 'assistant') metrics.assistantMessages += 1\n if (type === 'pr-link') metrics.prLinks += 1\n if (type === 'file-history-snapshot') metrics.fileSnapshots += 1\n\n const message = record(entry.message)\n if (message) addUsage(metrics, record(message.usage))\n const content = Array.isArray(message?.content) ? message.content : []\n for (const item of content) {\n const part = record(item)\n if (!part) continue\n const partType = stringField(part, 'type')\n if (partType === 'thinking') metrics.reasoningItems += 1\n if (partType === 'tool_use') metrics.toolCalls += 1\n if (partType === 'tool_result') {\n metrics.toolOutputs += 1\n if (part.is_error === true) metrics.toolErrors += 1\n }\n }\n }\n\n if (startedAt !== undefined && completedAt !== undefined)\n metrics.wallMs = Math.max(0, completedAt - startedAt)\n metrics.processScore = claudeProcessScore(metrics)\n return metrics\n}\n\nfunction openCodeMetrics(entries: Record<string, unknown>[]): CodeAgentSessionMetrics {\n const metrics = emptyMetrics(entries.length)\n const messageUsage = emptyTokenTotals()\n const partUsage = emptyTokenTotals()\n let messageCost = 0\n let partCost = 0\n let messageCostCaptured = false\n let partCostCaptured = false\n let startedAt: number | undefined\n let completedAt: number | undefined\n\n for (const entry of entries) {\n const time = record(entry.time)\n const created = timestampMs(time?.created)\n const completed = timestampMs(time?.completed)\n if (created !== undefined)\n startedAt = startedAt === undefined ? created : Math.min(startedAt, created)\n if (completed !== undefined)\n completedAt = completedAt === undefined ? completed : Math.max(completedAt, completed)\n\n const role = stringField(entry, 'role')\n if (role === 'user') metrics.userMessages += 1\n if (role === 'assistant') {\n metrics.assistantMessages += 1\n const finish = stringField(entry, 'finish')\n if (finish === 'stop') metrics.turnsCompleted += 1\n if (finish === 'error') metrics.turnsAborted += 1\n }\n\n const type = stringField(entry, 'type')\n if (type === 'reasoning') metrics.reasoningItems += 1\n if (type === 'tool') {\n metrics.toolCalls += 1\n const status = stringField(record(entry.state) ?? {}, 'status')\n if (status === 'completed') metrics.toolOutputs += 1\n if (status === 'error') {\n metrics.toolOutputs += 1\n metrics.toolErrors += 1\n }\n }\n if (type === 'patch') {\n metrics.patchAttempts += 1\n metrics.patchSuccesses += 1\n }\n\n const cost = numberField(entry, 'cost')\n if (record(entry.tokens) && role) {\n addUsageTo(messageUsage, record(entry.tokens))\n if (cost !== undefined) {\n messageCost += cost\n messageCostCaptured = true\n }\n } else if (record(entry.tokens)) {\n addUsageTo(partUsage, record(entry.tokens))\n if (cost !== undefined) {\n partCost += cost\n partCostCaptured = true\n }\n }\n }\n\n const usage = hasTokenTotals(messageUsage) ? messageUsage : partUsage\n metrics.inputTokens = usage.input\n metrics.outputTokens = usage.output\n metrics.reasoningTokens = usage.reasoning\n metrics.cachedTokens = usage.cached\n metrics.cacheWriteTokens = usage.cacheWrite\n metrics.observedCostUsd = messageCostCaptured ? messageCost : partCost\n metrics.observedCostCaptured = messageCostCaptured || partCostCaptured\n if (metrics.wallMs === 0 && startedAt !== undefined && completedAt !== undefined)\n metrics.wallMs = Math.max(0, completedAt - startedAt)\n metrics.processScore = terminalProcessScore(metrics)\n return metrics\n}\n\nfunction kimiCodeMetrics(entries: Record<string, unknown>[]): CodeAgentSessionMetrics {\n const metrics = emptyMetrics(entries.length)\n let startedAt: number | undefined\n let completedAt: number | undefined\n\n for (const entry of entries) {\n const timestamp = timestampMs(entry.timestamp)\n if (timestamp !== undefined) {\n startedAt = startedAt === undefined ? timestamp : Math.min(startedAt, timestamp)\n completedAt = completedAt === undefined ? timestamp : Math.max(completedAt, timestamp)\n }\n\n const role = stringField(entry, 'role')\n if (role === 'user') metrics.userMessages += 1\n if (role === 'assistant') metrics.assistantMessages += 1\n if (role === '_usage') addUsage(metrics, entry)\n\n const message = record(entry.message)\n const messageType = message ? stringField(message, 'type') : undefined\n const payload = record(message?.payload) ?? {}\n if (messageType === 'TurnBegin') {\n metrics.userMessages += 1\n metrics.turnsStarted += 1\n }\n if (messageType === 'TurnEnd') metrics.turnsCompleted += 1\n if (messageType === 'StepInterrupted') metrics.turnsAborted += 1\n if (messageType === 'StepBegin') metrics.reasoningItems += 1\n if (messageType === 'ContentPart') {\n const payloadType = stringField(payload, 'type')\n if (payloadType === 'think') metrics.reasoningItems += 1\n if (payloadType === 'text') metrics.assistantMessages += 1\n }\n if (messageType === 'ToolCall') metrics.toolCalls += 1\n if (messageType === 'ToolResult') {\n metrics.toolOutputs += 1\n if (record(payload.return_value)?.is_error === true) metrics.toolErrors += 1\n }\n if (messageType === 'StatusUpdate') addUsage(metrics, record(payload.token_usage))\n if (messageType === 'Notification') {\n const notification = record(payload.payload)\n const exitCode = numberField(notification ?? {}, 'exit_code')\n if (notification?.timed_out === true || (exitCode !== undefined && exitCode !== 0)) {\n metrics.toolErrors += 1\n }\n }\n }\n\n if (startedAt !== undefined && completedAt !== undefined)\n metrics.wallMs = Math.max(0, completedAt - startedAt)\n metrics.processScore = terminalProcessScore(metrics)\n return metrics\n}\n\nfunction piMetrics(entries: Record<string, unknown>[]): CodeAgentSessionMetrics {\n const metrics = emptyMetrics(entries.length)\n let bestReliabilityScore: number | undefined\n\n for (const entry of entries) {\n const nodes = Array.isArray(entry.nodes) ? entry.nodes : []\n const edges = Array.isArray(entry.edges) ? entry.edges : []\n metrics.graphNodes += nodes.length\n metrics.graphEdges += edges.length\n\n for (const node of nodes) {\n const obj = record(node)\n const ir = record(obj?.ir) ?? obj\n const kind = stringField(ir ?? {}, 'kind')\n if (kind === 'ActionCandidate') metrics.actionCandidates += 1\n if (kind === 'ToolInvocation') metrics.toolCalls += 1\n if (kind === 'ToolResult') metrics.toolOutputs += 1\n if (kind === 'VerificationReport') metrics.verificationReports += 1\n if (kind === 'CompletionDecision') {\n metrics.completionDecisions += 1\n metrics.turnsCompleted += 1\n }\n }\n\n const averageReliability = numberField(entry, 'averageNodeReliability')\n if (averageReliability !== undefined)\n bestReliabilityScore = maxOptional(bestReliabilityScore, averageReliability)\n const pessimisticPath = numberField(entry, 'pessimisticPathEstimate')\n if (pessimisticPath !== undefined)\n bestReliabilityScore = maxOptional(bestReliabilityScore, pessimisticPath)\n\n const rows = Array.isArray(entry.rows) ? entry.rows : []\n metrics.reliabilityRows += rows.length\n for (const row of rows) {\n const obj = record(row)\n if (!obj) continue\n const lift = numberField(obj, 'lift')\n if (lift !== undefined) metrics.reliabilityLift = Math.max(metrics.reliabilityLift, lift)\n const validated = numberField(obj, 'validatedSuccessEstimate')\n if (validated !== undefined)\n bestReliabilityScore = maxOptional(bestReliabilityScore, validated)\n }\n }\n\n metrics.processScore =\n bestReliabilityScore !== undefined\n ? clamp01(bestReliabilityScore)\n : metrics.completionDecisions > 0\n ? 1\n : 0\n return metrics\n}\n\nfunction emptyMetrics(entries: number): CodeAgentSessionMetrics {\n return {\n entries,\n userMessages: 0,\n assistantMessages: 0,\n reasoningItems: 0,\n toolCalls: 0,\n toolOutputs: 0,\n toolErrors: 0,\n unclassifiedErrors: 0,\n patchAttempts: 0,\n patchSuccesses: 0,\n patchFailures: 0,\n turnsStarted: 0,\n turnsCompleted: 0,\n turnsAborted: 0,\n contextCompactions: 0,\n mcpCalls: 0,\n subagentCalls: 0,\n skillCalls: 0,\n hookCalls: 0,\n webCalls: 0,\n codeActions: 0,\n prLinks: 0,\n fileSnapshots: 0,\n graphNodes: 0,\n graphEdges: 0,\n actionCandidates: 0,\n verificationReports: 0,\n completionDecisions: 0,\n reliabilityRows: 0,\n reliabilityLift: 0,\n inputTokens: 0,\n outputTokens: 0,\n reasoningTokens: 0,\n cachedTokens: 0,\n cacheWriteTokens: 0,\n observedCostUsd: 0,\n observedCostCaptured: false,\n wallMs: 0,\n processScore: 0,\n }\n}\n\nfunction codexProcessScore(metrics: CodeAgentSessionMetrics): number {\n const terminalTurns = metrics.turnsCompleted + metrics.turnsAborted\n const base =\n terminalTurns > 0\n ? metrics.turnsCompleted / terminalTurns\n : metrics.assistantMessages > 0\n ? 0.5\n : 0\n return penalizeErrors(base, metrics)\n}\n\nfunction claudeProcessScore(metrics: CodeAgentSessionMetrics): number {\n const base = metrics.prLinks > 0 ? 1 : metrics.assistantMessages > 0 ? 0.75 : 0\n return penalizeErrors(base, metrics)\n}\n\nfunction terminalProcessScore(metrics: CodeAgentSessionMetrics): number {\n const terminalTurns = metrics.turnsCompleted + metrics.turnsAborted\n const base =\n terminalTurns > 0\n ? metrics.turnsCompleted / terminalTurns\n : metrics.assistantMessages > 0\n ? 0.75\n : metrics.toolCalls > 0\n ? 0.5\n : 0\n return penalizeErrors(base, metrics)\n}\n\nfunction penalizeErrors(base: number, metrics: CodeAgentSessionMetrics): number {\n const operations = Math.max(1, metrics.toolCalls + metrics.patchAttempts)\n const errorRate = Math.min(1, (metrics.toolErrors + metrics.patchFailures) / operations)\n return clamp01(base * (1 - 0.5 * errorRate))\n}\n\ntype TokenTotals = Required<RunTokenUsage>\n\nfunction emptyTokenTotals(): TokenTotals {\n return { input: 0, output: 0, reasoning: 0, cached: 0, cacheWrite: 0 }\n}\n\nfunction hasTokenTotals(usage: TokenTotals): boolean {\n return (\n usage.input > 0 ||\n usage.output > 0 ||\n usage.reasoning > 0 ||\n usage.cached > 0 ||\n usage.cacheWrite > 0\n )\n}\n\nfunction addUsage(\n metrics: CodeAgentSessionMetrics,\n usage: Record<string, unknown> | null | undefined,\n): void {\n const parsed = readUsage(usage)\n metrics.inputTokens += parsed.input\n metrics.outputTokens += parsed.output\n metrics.reasoningTokens += parsed.reasoning\n metrics.cachedTokens += parsed.cached\n metrics.cacheWriteTokens += parsed.cacheWrite\n}\n\nfunction addUsageTo(totals: TokenTotals, usage: Record<string, unknown> | null | undefined): void {\n const parsed = readUsage(usage)\n totals.input += parsed.input\n totals.output += parsed.output\n totals.reasoning += parsed.reasoning\n totals.cached += parsed.cached\n totals.cacheWrite += parsed.cacheWrite\n}\n\nfunction readUsage(usage: Record<string, unknown> | null | undefined): TokenTotals {\n const parsed = extractUsage(usage)\n return {\n input: parsed?.input ?? 0,\n output: parsed?.output ?? 0,\n reasoning: parsed?.reasoning ?? 0,\n cached: parsed?.cached ?? 0,\n cacheWrite: parsed?.cacheWrite ?? 0,\n }\n}\n\nfunction resolveSessionCost(\n explicit: RunCostProvenance | undefined,\n metrics: CodeAgentSessionMetrics,\n model: string,\n): { costUsd: number | null; costProvenance: RunCostProvenance } {\n if (explicit) {\n if (explicit.kind === 'uncaptured') {\n if (explicit.usd !== null) throw new Error('uncaptured cost must have usd: null')\n return { costUsd: null, costProvenance: explicit }\n }\n if (!Number.isFinite(explicit.usd) || explicit.usd < 0) {\n throw new Error(`${explicit.kind} cost must be a finite, non-negative USD amount`)\n }\n return { costUsd: explicit.usd, costProvenance: explicit }\n }\n\n if (metrics.observedCostCaptured) {\n const costProvenance = { kind: 'observed', usd: metrics.observedCostUsd } as const\n return { costUsd: metrics.observedCostUsd, costProvenance }\n }\n\n const hasUsage = metrics.inputTokens > 0 || metrics.outputTokens > 0\n if (hasUsage && isModelPriced(model)) {\n const costUsd = estimateCost(metrics.inputTokens, metrics.outputTokens, model)\n return { costUsd, costProvenance: { kind: 'estimated', usd: costUsd } }\n }\n\n return { costUsd: null, costProvenance: { kind: 'uncaptured', usd: null } }\n}\n\nfunction diagnosticsFor(\n metrics: CodeAgentSessionMetrics,\n options: {\n model: string\n explicitTerminal: boolean\n malformedLines: number\n hasQualityLabel: boolean\n invalidQualityScore: boolean\n costKind: RunCostProvenance['kind']\n },\n): string[] {\n const warnings: string[] = []\n if (options.invalidQualityScore) warnings.push('non-finite task quality score omitted')\n else if (!options.hasQualityLabel) warnings.push('task quality score not supplied')\n if (!options.explicitTerminal) warnings.push('no explicit terminal success/failure signal')\n if (\n metrics.inputTokens === 0 &&\n metrics.outputTokens === 0 &&\n metrics.reasoningTokens === 0 &&\n metrics.cachedTokens === 0 &&\n metrics.cacheWriteTokens === 0\n ) {\n warnings.push('missing token usage')\n }\n if (options.costKind === 'estimated')\n warnings.push('USD cost estimated from token usage and model pricing')\n if (options.costKind === 'uncaptured') warnings.push('USD cost uncaptured')\n if (options.costKind === 'uncaptured' && !isModelPriced(options.model))\n warnings.push('model pricing unknown')\n if (options.malformedLines > 0)\n warnings.push(`${options.malformedLines} malformed JSONL lines skipped`)\n return warnings\n}\n\nfunction applyObservedSurfaceMetrics(\n metrics: CodeAgentSessionMetrics,\n observation: CodeAgentSessionObservation,\n): void {\n const actions = observation.actions.filter(\n (action) => action.kind === 'tool' || action.kind === 'patch',\n )\n metrics.mcpCalls = actions.filter((action) => action.surface === 'mcp').length\n metrics.subagentCalls = actions.filter((action) => action.surface === 'subagent').length\n metrics.skillCalls = actions.filter((action) => action.surface === 'skill').length\n metrics.hookCalls = actions.filter((action) => action.surface === 'hook').length\n metrics.webCalls = actions.filter((action) => action.surface === 'web').length\n metrics.codeActions = actions.filter((action) => action.surface === 'code').length\n}\n\nfunction sessionIdFromEntries(\n source: CodeAgentSessionSource,\n entries: Record<string, unknown>[],\n): string | undefined {\n for (const entry of entries) {\n if (source === 'codex') {\n const threadId = stringField(entry, 'thread_id')\n if (threadId) return threadId\n const payload = record(entry.payload)\n const id = payload ? stringField(payload, 'id') : undefined\n if (id) return id\n }\n const message = record(entry.message)\n const payload = record(message?.payload)\n const sessionId =\n stringField(entry, 'sessionID') ??\n stringField(entry, 'sessionId') ??\n stringField(entry, 'session_id') ??\n stringField(payload ?? {}, 'session_id')\n if (sessionId) return sessionId\n }\n return undefined\n}\n\nfunction modelFromEntries(\n source: CodeAgentSessionSource,\n entries: Record<string, unknown>[],\n): string | undefined {\n let providerModel: string | undefined\n for (const entry of entries) {\n if (source === 'codex') {\n const payload = record(entry.payload)\n const model = payload ? stringField(payload, 'model') : undefined\n if (model) return model\n providerModel =\n providerModel ?? (payload ? stringField(payload, 'model_provider') : undefined)\n }\n const openCodeModel = stringField(entry, 'modelID')\n if (openCodeModel) {\n const provider = stringField(entry, 'providerID')\n return provider ? `${provider}/${openCodeModel}` : openCodeModel\n }\n const modelObject = record(entry.model)\n const nestedModel = stringField(modelObject ?? {}, 'modelID')\n if (nestedModel) {\n const provider = stringField(modelObject ?? {}, 'providerID')\n return provider ? `${provider}/${nestedModel}` : nestedModel\n }\n const message = record(entry.message)\n const model = message ? stringField(message, 'model') : undefined\n if (model) return model\n }\n return providerModel\n}\n\nfunction cwdFromEntries(entries: Record<string, unknown>[]): string | undefined {\n for (const entry of entries) {\n const path = record(entry.path)\n const cwd =\n stringField(entry, 'cwd') ??\n stringField(path ?? {}, 'cwd') ??\n stringField(path ?? {}, 'root') ??\n (record(entry.payload) ? stringField(record(entry.payload)!, 'cwd') : undefined)\n if (cwd) return cwd\n }\n return undefined\n}\n\nfunction firstUserText(entries: Record<string, unknown>[]): string | undefined {\n for (const entry of entries) {\n const payload = record(entry.payload)\n const payloadType = payload ? stringField(payload, 'type') : undefined\n if (payloadType === 'user_message') return stringField(payload!, 'message')\n\n if (stringField(entry, 'role') === 'user') {\n const content = entry.content\n if (typeof content === 'string') return content\n }\n\n const wirePayload = record(record(entry.message)?.payload)\n const userInput = wirePayload ? stringField(wirePayload, 'user_input') : undefined\n if (userInput) return userInput\n\n const message = record(entry.message)\n if (message && stringField(message, 'role') === 'user') {\n const content = message.content\n if (typeof content === 'string') return content\n if (Array.isArray(content)) {\n const text = content\n .map((part) => {\n const obj = record(part)\n return obj ? stringField(obj, 'text') : undefined\n })\n .filter((part): part is string => part !== undefined)\n .join('\\n')\n if (text) return text\n }\n }\n }\n return undefined\n}\n\nfunction fallbackSessionId(source: CodeAgentSessionSource, sourcePath: string | undefined): string {\n return hashString(`${source}:${sourcePath ?? 'unknown-session'}`).slice(\n 'sha256:'.length,\n 'sha256:'.length + 20,\n )\n}\n\nfunction withSnapshot(model: string): string {\n const trimmed = model.trim() || 'unknown'\n if (trimmed.includes('@') || /-\\d{8}$/.test(trimmed) || /-\\d{4}-\\d{2}-\\d{2}$/.test(trimmed)) {\n return trimmed\n }\n return `${trimmed}@observed-local`\n}\n\nfunction hashJson(value: unknown): string {\n return hashString(JSON.stringify(value))\n}\n\nfunction hashString(value: string): string {\n return `sha256:${createHash('sha256').update(value).digest('hex')}`\n}\n\nfunction stableSeed(value: string): number {\n return createHash('sha256').update(value).digest().readUInt32BE(0)\n}\n\nfunction maxOptional(current: number | undefined, next: number): number {\n return current === undefined ? next : Math.max(current, next)\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n return Math.max(0, Math.min(1, value))\n}\n\nfunction finiteScore(value: number | undefined): number | undefined {\n return value !== undefined && Number.isFinite(value) ? clamp01(value) : undefined\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return isRecord(value) ? value : null\n}\n\nfunction stringField(obj: Record<string, unknown>, key: string): string | undefined {\n const value = obj[key]\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction numberField(obj: Record<string, unknown>, key: string): number | undefined {\n const value = obj[key]\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction timestampMs(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value > 1_000_000_000_000 ? value : value * 1000\n }\n if (typeof value === 'string' && value.length > 0) {\n const parsed = Date.parse(value)\n return Number.isFinite(parsed) ? parsed : undefined\n }\n return undefined\n}\n"],"mappings":"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","names":["timestampMs","payload","isRecord","fallbackSessionId","sessionIdFromEntries","record","stringField","timestamp","numberField","payload","model"]}
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  ROLLOUT_SCHEMA,
10
10
  isRolloutLine
11
- } from "./chunk-MAX3TN3C.js";
11
+ } from "./chunk-UWZZKKU7.js";
12
12
 
13
13
  // src/supervisor-run/types.ts
14
14
  function unavailable(reason) {
@@ -1504,7 +1504,8 @@ function supervisorRunRolloutLines(src, opts = {}) {
1504
1504
  },
1505
1505
  is_completed: state?.status === "completed",
1506
1506
  is_truncated: false,
1507
- error: null
1507
+ error: null,
1508
+ realness_gated: false
1508
1509
  },
1509
1510
  cost: {
1510
1511
  ...EMPTY_COST,
@@ -1572,7 +1573,8 @@ function supervisorRunRolloutLines(src, opts = {}) {
1572
1573
  },
1573
1574
  is_completed: close?.kind === "settled",
1574
1575
  is_truncated: close?.kind === "cancelled",
1575
- error: close?.kind === "cancelled" ? close.verdict ?? "cancelled" : null
1576
+ error: close?.kind === "cancelled" ? close.verdict ?? "cancelled" : null,
1577
+ realness_gated: false
1576
1578
  },
1577
1579
  // `close.spend` is only a measurement when the close event carried one;
1578
1580
  // a store that never priced this worker must leave null, not 0.
@@ -1641,4 +1643,4 @@ export {
1641
1643
  findSupervisorRunDirs,
1642
1644
  supervisorRunRolloutLines
1643
1645
  };
1644
- //# sourceMappingURL=chunk-LKKT3IVV.js.map
1646
+ //# sourceMappingURL=chunk-TSN7JT6D.js.map