@tangle-network/agent-eval 0.126.7 → 0.128.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 (132) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/README.md +6 -2
  3. package/dist/analyst/index.d.ts +52 -43
  4. package/dist/analyst/index.js +4 -4
  5. package/dist/belief-state/index.d.ts +35 -40
  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 -11
  9. package/dist/builder-eval/index.js +1 -1
  10. package/dist/campaign/index.d.ts +441 -160
  11. package/dist/campaign/index.js +11 -10
  12. package/dist/{chunk-IILEIWGW.js → chunk-2JX3CFMB.js} +100 -40
  13. package/dist/chunk-2JX3CFMB.js.map +1 -0
  14. package/dist/chunk-2MKQIFS4.js +183 -0
  15. package/dist/chunk-2MKQIFS4.js.map +1 -0
  16. package/dist/{chunk-NUKSVU3W.js → chunk-5DTSBUL2.js} +2 -2
  17. package/dist/{chunk-H5UD2323.js → chunk-7ZZMD7UK.js} +102 -2
  18. package/dist/chunk-7ZZMD7UK.js.map +1 -0
  19. package/dist/{chunk-474LBSOX.js → chunk-BYT7ELPS.js} +45 -18
  20. package/dist/chunk-BYT7ELPS.js.map +1 -0
  21. package/dist/{chunk-LUNF2SEL.js → chunk-DJKY2TSY.js} +3 -3
  22. package/dist/chunk-DPUHNQLN.js +232 -0
  23. package/dist/chunk-DPUHNQLN.js.map +1 -0
  24. package/dist/chunk-DRYIUNWY.js +622 -0
  25. package/dist/chunk-DRYIUNWY.js.map +1 -0
  26. package/dist/{chunk-IPYXE555.js → chunk-EJGRPCO3.js} +36 -13
  27. package/dist/chunk-EJGRPCO3.js.map +1 -0
  28. package/dist/{chunk-OCFJACJU.js → chunk-EOSZT7PL.js} +82 -18
  29. package/dist/chunk-EOSZT7PL.js.map +1 -0
  30. package/dist/{chunk-ZVCHKKOP.js → chunk-EZJEIH2R.js} +39 -15
  31. package/dist/chunk-EZJEIH2R.js.map +1 -0
  32. package/dist/{chunk-M7AH34KV.js → chunk-IHQDPH7D.js} +32 -16
  33. package/dist/chunk-IHQDPH7D.js.map +1 -0
  34. package/dist/{chunk-PJQFMIOX.js → chunk-MHELPNRP.js} +31 -1
  35. package/dist/chunk-MHELPNRP.js.map +1 -0
  36. package/dist/{chunk-K6IAZZ6L.js → chunk-NACAGYSY.js} +153 -122
  37. package/dist/chunk-NACAGYSY.js.map +1 -0
  38. package/dist/{chunk-BTACVO2W.js → chunk-NKAGIDE2.js} +542 -258
  39. package/dist/chunk-NKAGIDE2.js.map +1 -0
  40. package/dist/{chunk-ARU2PZFM.js → chunk-NYLOYM6N.js} +43 -23
  41. package/dist/chunk-NYLOYM6N.js.map +1 -0
  42. package/dist/{chunk-QOTFXW5L.js → chunk-P5W7RQKK.js} +2 -2
  43. package/dist/{chunk-IR3KBHOY.js → chunk-P6FYH6K4.js} +39 -3
  44. package/dist/chunk-P6FYH6K4.js.map +1 -0
  45. package/dist/{chunk-J5SQWP6Y.js → chunk-PBE2LOSS.js} +18 -2
  46. package/dist/chunk-PBE2LOSS.js.map +1 -0
  47. package/dist/{chunk-X4UCIOTZ.js → chunk-S5YLIBFX.js} +2 -2
  48. package/dist/{chunk-7VYEGHWF.js → chunk-SZLVEKMJ.js} +41 -20
  49. package/dist/chunk-SZLVEKMJ.js.map +1 -0
  50. package/dist/{chunk-P22LJ3Y2.js → chunk-TBL77AUT.js} +8 -8
  51. package/dist/chunk-TBL77AUT.js.map +1 -0
  52. package/dist/{chunk-LKKT3IVV.js → chunk-TSN7JT6D.js} +6 -4
  53. package/dist/{chunk-LKKT3IVV.js.map → chunk-TSN7JT6D.js.map} +1 -1
  54. package/dist/{chunk-E3IADPLG.js → chunk-UB2LOJ6Q.js} +51 -227
  55. package/dist/chunk-UB2LOJ6Q.js.map +1 -0
  56. package/dist/{chunk-MAX3TN3C.js → chunk-UWZZKKU7.js} +7 -19
  57. package/dist/chunk-UWZZKKU7.js.map +1 -0
  58. package/dist/{chunk-DPZAEKA6.js → chunk-VLOATJQ2.js} +85 -57
  59. package/dist/chunk-VLOATJQ2.js.map +1 -0
  60. package/dist/{chunk-MOXWMGPC.js → chunk-XDWDC2MP.js} +197 -79
  61. package/dist/chunk-XDWDC2MP.js.map +1 -0
  62. package/dist/{chunk-CGG5SLH3.js → chunk-XPRT64IE.js} +2 -2
  63. package/dist/{chunk-FO7HEH76.js → chunk-YJBNWCAA.js} +2 -2
  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 +438 -138
  67. package/dist/contract/index.js +259 -113
  68. package/dist/contract/index.js.map +1 -1
  69. package/dist/control.d.ts +56 -39
  70. package/dist/control.js +2 -3
  71. package/dist/hosted/index.d.ts +152 -51
  72. package/dist/hosted/index.js +24 -1
  73. package/dist/index.d.ts +399 -277
  74. package/dist/index.js +363 -244
  75. package/dist/index.js.map +1 -1
  76. package/dist/meta-eval/index.d.ts +33 -36
  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 +101 -80
  82. package/dist/reporting.js +7 -5
  83. package/dist/rl.d.ts +198 -142
  84. package/dist/rl.js +235 -127
  85. package/dist/rl.js.map +1 -1
  86. package/dist/rollout/index.d.ts +54 -67
  87. package/dist/rollout/index.js +6 -5
  88. package/dist/{run-campaign-FFRM3RH5.js → run-campaign-ISHFZ7FJ.js} +6 -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 +72 -50
  92. package/dist/traces.js +9 -6
  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/customer-journeys.md +7 -6
  97. package/docs/hosted-ingest-spec.md +37 -40
  98. package/docs/insight-report.md +78 -7
  99. package/docs/research-report-methodology.md +20 -21
  100. package/docs/rollout.md +13 -8
  101. package/package.json +4 -3
  102. package/dist/chunk-474LBSOX.js.map +0 -1
  103. package/dist/chunk-7VYEGHWF.js.map +0 -1
  104. package/dist/chunk-ARU2PZFM.js.map +0 -1
  105. package/dist/chunk-BTACVO2W.js.map +0 -1
  106. package/dist/chunk-DPZAEKA6.js.map +0 -1
  107. package/dist/chunk-E3IADPLG.js.map +0 -1
  108. package/dist/chunk-H5UD2323.js.map +0 -1
  109. package/dist/chunk-IILEIWGW.js.map +0 -1
  110. package/dist/chunk-IPYXE555.js.map +0 -1
  111. package/dist/chunk-IR3KBHOY.js.map +0 -1
  112. package/dist/chunk-J5SQWP6Y.js.map +0 -1
  113. package/dist/chunk-K6IAZZ6L.js.map +0 -1
  114. package/dist/chunk-M7AH34KV.js.map +0 -1
  115. package/dist/chunk-MAX3TN3C.js.map +0 -1
  116. package/dist/chunk-MOXWMGPC.js.map +0 -1
  117. package/dist/chunk-OCFJACJU.js.map +0 -1
  118. package/dist/chunk-P22LJ3Y2.js.map +0 -1
  119. package/dist/chunk-PJQFMIOX.js.map +0 -1
  120. package/dist/chunk-VSMTAMNK.js +0 -53
  121. package/dist/chunk-VSMTAMNK.js.map +0 -1
  122. package/dist/chunk-ZVCHKKOP.js.map +0 -1
  123. package/dist/chunk-ZZUXHH3R.js +0 -99
  124. package/dist/chunk-ZZUXHH3R.js.map +0 -1
  125. /package/dist/{chunk-NUKSVU3W.js.map → chunk-5DTSBUL2.js.map} +0 -0
  126. /package/dist/{chunk-LUNF2SEL.js.map → chunk-DJKY2TSY.js.map} +0 -0
  127. /package/dist/{chunk-QOTFXW5L.js.map → chunk-P5W7RQKK.js.map} +0 -0
  128. /package/dist/{chunk-X4UCIOTZ.js.map → chunk-S5YLIBFX.js.map} +0 -0
  129. /package/dist/{chunk-CGG5SLH3.js.map → chunk-XPRT64IE.js.map} +0 -0
  130. /package/dist/{chunk-FO7HEH76.js.map → chunk-YJBNWCAA.js.map} +0 -0
  131. /package/dist/{chunk-KE2VWPZX.js.map → chunk-ZUUWPZCV.js.map} +0 -0
  132. /package/dist/{run-campaign-FFRM3RH5.js.map → run-campaign-ISHFZ7FJ.js.map} +0 -0
@@ -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"]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  assertLlmRoute
3
- } from "./chunk-J5SQWP6Y.js";
3
+ } from "./chunk-PBE2LOSS.js";
4
4
  import {
5
5
  researchReport
6
- } from "./chunk-DPZAEKA6.js";
6
+ } from "./chunk-VLOATJQ2.js";
7
7
  import {
8
8
  RunIntegrityError,
9
9
  assertRunCaptured
@@ -16,13 +16,11 @@ import {
16
16
  } from "./chunk-VQMK5FMP.js";
17
17
  import {
18
18
  buildAgentProfileCell,
19
+ canonicalize,
20
+ hashJson,
19
21
  validateRunRecord,
20
22
  verifyAgentProfileCell
21
- } from "./chunk-IILEIWGW.js";
22
- import {
23
- canonicalize,
24
- hashJson
25
- } from "./chunk-VSMTAMNK.js";
23
+ } from "./chunk-2JX3CFMB.js";
26
24
 
27
25
  // src/eval-campaign.ts
28
26
  var DEFAULT_INTEGRITY = {
@@ -223,7 +221,9 @@ async function runEvalCampaign(opts) {
223
221
  commitSha: opts.commitSha,
224
222
  wallMs,
225
223
  costUsd: outcome.costUsd,
224
+ costProvenance: outcome.costProvenance,
226
225
  tokenUsage: outcome.tokenUsage,
226
+ terminalOutcome: "succeeded",
227
227
  judgeMetadata: outcome.judgeMetadata,
228
228
  outcome: recordOutcome,
229
229
  ...outcome.failureClass ? { failureClass: outcome.failureClass } : {},
@@ -352,4 +352,4 @@ function defaultRunId(params) {
352
352
  export {
353
353
  runEvalCampaign
354
354
  };
355
- //# sourceMappingURL=chunk-P22LJ3Y2.js.map
355
+ //# sourceMappingURL=chunk-TBL77AUT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/eval-campaign.ts"],"sourcesContent":["/**\n * EvalCampaign — opinionated matrix runner that wires the four\n * capture-integrity directives by construction.\n *\n * The canonical benchmark shape — matrix runner → for each\n * (variant, scenario, seed) → start a TraceEmitter → call LLMs → end the\n * run → analyze — has a bug class at the integration boundary: raw\n * events not captured, route silently wrong, integrity not asserted,\n * analyst never run. The directives in `SKILL.md § Capture integrity`\n * are the mitigations.\n *\n * `EvalCampaign` is the structural fix — consumers don't wire the\n * integrity surface themselves; the campaign owns it. Specifically:\n *\n * - calls `assertLlmRoute` once at preflight before any work runs\n * - constructs a per-run `TraceStore` and `RawProviderSink` via factories\n * - constructs the `TraceEmitter` with `onRunComplete: [analyst hook]`\n * - hands the runner an `LlmClientOptions` pre-wired with the sink and\n * trace context — the runner can't accidentally call an LLM without\n * capturing the raw HTTP envelope\n * - calls `assertRunCaptured` after every `endRun` and routes failures\n * through a configurable policy (`throw` / `mark_failed` / `log`)\n * - assembles per-run `RunRecord`s and runs `researchReport` at the end\n * so the campaign artifact is launch-decision-grade by default\n * - embeds the campaign fingerprint (a SHA-256 over the canonicalised\n * run set) and optional `preregistrationHash` in the report\n *\n * The runner contract is intentionally narrow: produce a `CampaignRunOutcome`\n * given a fully-wired `CampaignRunContext`. Everything orchestration-shaped\n * lives in the campaign. This is the inversion-of-control point — consumers\n * stop writing matrix runners and start writing scenario-runners.\n *\n * Out of scope for v1 (tracked in `docs/research-report-methodology.md`):\n *\n * - Distributed/cluster execution (concurrency is local async)\n * - Adaptive sampling / sequential interim looks\n * - Resume from partial state across crashes\n * - LLM-call retry beyond what `LlmClient` already does\n */\n\nimport {\n type AgentProfileCell,\n type AgentProfileCellInput,\n buildAgentProfileCell,\n verifyAgentProfileCell,\n} from './agent-profile-cell'\nimport { assertLlmRoute, type LlmClientOptions, type LlmRouteRequirements } from './llm-client'\nimport { canonicalize, hashJson } from './pre-registration'\nimport type {\n JudgeScoresRecord,\n RunCostProvenance,\n RunJudgeMetadata,\n RunOutcome,\n RunRecord,\n RunSplitTag,\n RunTaskFailure,\n RunTokenUsage,\n} from './run-record'\nimport { validateRunRecord } from './run-record'\nimport { type ResearchReport, type ResearchReportOptions, researchReport } from './summary-report'\nimport type { RunCompleteHook } from './trace/emitter'\nimport { TraceEmitter } from './trace/emitter'\nimport {\n assertRunCaptured,\n RunIntegrityError,\n type RunIntegrityExpectations,\n type RunIntegrityReport,\n} from './trace/integrity'\nimport { FileSystemRawProviderSink, type RawProviderSink } from './trace/raw-provider-sink'\nimport type { TraceStore } from './trace/store'\n\n// ── Public types ─────────────────────────────────────────────────────────\n\nexport interface CampaignVariant<V> {\n id: string\n payload: V\n}\n\nexport interface CampaignScenario {\n scenarioId: string\n /** Free-form metadata propagated to runs and reports. */\n tags?: Record<string, string>\n}\n\nexport interface CampaignRunContext<V> {\n /** Stable run id. The campaign generates this; the runner does not. */\n runId: string\n /** Logical experiment id (campaignId by default; overridable per-run via opts). */\n experimentId: string\n variant: V\n variantId: string\n scenarioId: string\n scenarioTags: Record<string, string>\n seed: number\n splitTag: RunSplitTag\n /**\n * The TraceEmitter for this run, with `onRunComplete` hooks pre-wired\n * (analyst auto-execution if configured, plus integrity check). The\n * runner MUST call `emitter.startRun` before doing any work and either\n * `emitter.endRun` or `emitter.abortRun` before returning.\n */\n emitter: TraceEmitter\n store: TraceStore\n rawSink: RawProviderSink\n /**\n * Pre-wired LLM client options — `rawSink` and `traceContext` are populated\n * so any `callLlm(req, ctx.llmOpts)` automatically captures raw HTTP. The\n * runner can spread additional fields if needed.\n */\n llmOpts: LlmClientOptions\n}\n\ninterface CampaignRunOutcomeFields {\n /** Did the run pass? Mirrors `RunOutcome.pass` semantics. */\n pass: boolean\n /** Score for the run on its split. Maps to `searchScore` or `holdoutScore`. */\n score: number\n /** Cost in USD, or null when the runner could not capture it. */\n costUsd: number | null\n /** Source of the cost amount. */\n costProvenance: RunCostProvenance\n tokenUsage: RunTokenUsage\n /** Snapshot model id (e.g. `claude-sonnet-4-6@2025-04-15`). */\n model: string\n /** sha256 of the effective prompt sent to the model. */\n promptHash: string\n /** sha256 of the effective config (model, temperature, tools, judges, splits). */\n configHash: string\n /** Optional extra numeric metrics to land in `outcome.raw`. */\n raw?: Record<string, number>\n /** Optional judge metadata when a judge was used. */\n judgeMetadata?: RunJudgeMetadata\n /**\n * Optional per-judge / per-dim breakdown for ensemble-judged runs.\n * Propagated to `outcome.judgeScores` on the resulting `RunRecord`.\n * Single-judge or scalar-only runs leave this unset.\n */\n judgeScores?: JudgeScoresRecord\n /**\n * Agent profile cell observed by the runner. When supplied, it overrides\n * `EvalCampaignOptions.agentProfile` for this run and must match the\n * outcome's `model` and `promptHash`.\n */\n agentProfile?: AgentProfileCell | AgentProfileCellInput\n}\n\n/** Campaign result with the same task-failure invariant as `RunRecord`. */\nexport type CampaignRunOutcome = CampaignRunOutcomeFields & RunTaskFailure\n\nexport type CampaignRunner<V> = (ctx: CampaignRunContext<V>) => Promise<CampaignRunOutcome>\n\nexport type CampaignIntegrityPolicy = 'throw' | 'mark_failed' | 'log'\n\nexport interface EvalCampaignOptions<V> {\n /**\n * Stable id for the campaign. Used as the default `experimentId` on\n * every run, and folded into the campaign fingerprint.\n */\n campaignId: string\n variants: CampaignVariant<V>[]\n scenarios: CampaignScenario[]\n /** Default `[0, 1, 2]`. */\n seeds?: number[]\n /** Default `'holdout'` — the split that anchors a launch decision. */\n splitTag?: RunSplitTag\n /** Git SHA the campaign is run against. Mandatory; `RunRecord` rejects unset. */\n commitSha: string\n /**\n * LLM client config. Augmented per-run with `rawSink` and `traceContext`\n * before being passed to the runner. The campaign asserts this config\n * matches `routeRequirements` once at preflight.\n */\n llmOpts: LlmClientOptions\n /**\n * Default `{ requireExplicitBaseUrl: true, requireAuth: true }` — fail\n * loud if the campaign would silently fall back to the public router or\n * run unauthenticated. Override with an empty object to disable.\n */\n routeRequirements?: LlmRouteRequirements\n /**\n * Per-run TraceStore factory. Common shape: a fresh store per run keyed\n * on `runId`. Implementations that share a store across the campaign\n * are valid — the campaign only writes through `emitter`.\n */\n storeFactory: (params: CampaignFactoryParams) => TraceStore\n /**\n * Per-run RawProviderSink factory. Defaults to `FileSystemRawProviderSink`\n * rooted at `${workDir}/raw-events/${runId}` if `workDir` is supplied;\n * otherwise required. Forensic capture is non-negotiable in a campaign\n * run — pass `NoopRawProviderSink` explicitly if you want to opt out.\n */\n rawSinkFactory?: (params: CampaignFactoryParams) => RawProviderSink\n /**\n * Filesystem root for default `rawSinkFactory`. Ignored if\n * `rawSinkFactory` is supplied.\n */\n workDir?: string\n /**\n * Extra `onRunComplete` hooks the campaign appends (after its own\n * integrity-check hook). Pass `traceAnalystOnRunComplete(...)` here.\n */\n onRunComplete?: RunCompleteHook[]\n /**\n * Per-run integrity expectations. Defaults to:\n * `{ llmSpansMin: 1, requireRawCoverageOfLlmSpans: true, requireOutcome: true }`.\n * Override (e.g. `{ llmSpansMin: 0 }`) for runs that don't call LLMs.\n */\n integrity?: RunIntegrityExpectations\n /** Behaviour when integrity fails. Default `'mark_failed'`. */\n onIntegrityFailure?: CampaignIntegrityPolicy\n /**\n * Per-run runner. Receives a fully-wired context; produces an outcome\n * the campaign converts into a `RunRecord`.\n */\n runner: CampaignRunner<V>\n /**\n * If set, the campaign computes `researchReport` at the end. `comparator`\n * is a `variantId`. Other fields are forwarded verbatim.\n */\n report?: { comparator?: string } & Omit<\n ResearchReportOptions,\n 'comparator' | 'preregistrationHash' | 'generatedAt'\n >\n /**\n * Hash of a signed `HypothesisManifest` (see `pre-registration.ts`).\n * Embedded in the campaign fingerprint and the research report.\n */\n preregistrationHash?: string\n /** Local concurrency. Default `1` (sequential). */\n concurrency?: number\n /**\n * Override the time source. Tests pass a mock to make wallMs deterministic.\n */\n now?: () => number\n /** Override the runId generator. Tests pin this. */\n runId?: (params: CampaignFactoryParams) => string\n /**\n * Agent profile cell for campaign runs. Static profiles can pass an object;\n * routers or variant-specific harnesses can pass a factory. The campaign\n * stamps the built cell onto every `RunRecord` and rejects profile/model or\n * profile/prompt contradictions.\n */\n agentProfile?:\n | AgentProfileCell\n | AgentProfileCellInput\n | ((\n params: CampaignFactoryParams & {\n variant: V\n scenarioTags: Record<string, string>\n },\n ) =>\n | AgentProfileCell\n | AgentProfileCellInput\n | Promise<AgentProfileCell | AgentProfileCellInput>)\n}\n\nexport interface CampaignFactoryParams {\n campaignId: string\n runId: string\n variantId: string\n scenarioId: string\n seed: number\n}\n\nexport interface FailedRun {\n runId: string\n variantId: string\n scenarioId: string\n seed: number\n reason: string\n error?: string\n}\n\nexport interface EvalCampaignResult {\n campaignId: string\n /** SHA-256 over canonicalised `(variantIds, scenarioIds, seeds, comparator, splitTag, baseUrl, provider, preregistrationHash)`. */\n campaignFingerprint: string\n preregistrationHash: string | null\n /** Successful runs only. Failed runs land in `failedRuns`. */\n runs: RunRecord[]\n /** Integrity reports for every successful run. */\n integrityReports: RunIntegrityReport[]\n failedRuns: FailedRun[]\n /** Computed when `report` is set on options. */\n report?: ResearchReport\n startedAt: string\n endedAt: string\n}\n\n// ── Implementation ───────────────────────────────────────────────────────\n\nconst DEFAULT_INTEGRITY: RunIntegrityExpectations = {\n llmSpansMin: 1,\n requireRawCoverageOfLlmSpans: true,\n requireOutcome: true,\n}\n\nconst DEFAULT_ROUTE: LlmRouteRequirements = {\n requireExplicitBaseUrl: true,\n requireAuth: true,\n}\n\nexport async function runEvalCampaign<V>(\n opts: EvalCampaignOptions<V>,\n): Promise<EvalCampaignResult> {\n // ── Preflight ──────────────────────────────────────────────────────\n assertLlmRoute(opts.llmOpts, opts.routeRequirements ?? DEFAULT_ROUTE)\n\n if (opts.variants.length === 0) {\n throw new Error('runEvalCampaign: variants must be non-empty.')\n }\n if (opts.scenarios.length === 0) {\n throw new Error('runEvalCampaign: scenarios must be non-empty.')\n }\n const variantIds = new Set<string>()\n for (const v of opts.variants) {\n if (variantIds.has(v.id)) {\n throw new Error(`runEvalCampaign: duplicate variant id \"${v.id}\".`)\n }\n variantIds.add(v.id)\n }\n const scenarioIds = new Set<string>()\n for (const s of opts.scenarios) {\n if (scenarioIds.has(s.scenarioId)) {\n throw new Error(`runEvalCampaign: duplicate scenarioId \"${s.scenarioId}\".`)\n }\n scenarioIds.add(s.scenarioId)\n }\n if (opts.report?.comparator && !variantIds.has(opts.report.comparator)) {\n throw new Error(\n `runEvalCampaign: report.comparator \"${opts.report.comparator}\" is not a configured variantId.`,\n )\n }\n if (!opts.commitSha) {\n throw new Error('runEvalCampaign: commitSha is required (every RunRecord needs it).')\n }\n\n const seeds = opts.seeds ?? [0, 1, 2]\n const splitTag: RunSplitTag = opts.splitTag ?? 'holdout'\n const concurrency = Math.max(1, opts.concurrency ?? 1)\n const integrity = { ...DEFAULT_INTEGRITY, ...(opts.integrity ?? {}) }\n const onIntegrityFailure: CampaignIntegrityPolicy = opts.onIntegrityFailure ?? 'mark_failed'\n const now = opts.now ?? (() => Date.now())\n const baseUrl = (opts.llmOpts.baseUrl ?? '').replace(/\\/+$/, '')\n const provider = opts.llmOpts.provider ?? null\n const preregistrationHash = opts.preregistrationHash ?? null\n\n const rawSinkFactory = opts.rawSinkFactory ?? defaultRawSinkFactory(opts.workDir)\n\n // ── Fingerprint ────────────────────────────────────────────────────\n const campaignFingerprint = await hashJson(\n canonicalize({\n campaignId: opts.campaignId,\n variants: opts.variants.map((v) => v.id).sort(),\n scenarios: opts.scenarios.map((s) => s.scenarioId).sort(),\n seeds: [...seeds].sort((a, b) => a - b),\n splitTag,\n comparator: opts.report?.comparator ?? null,\n baseUrl,\n provider,\n preregistrationHash,\n }),\n )\n\n // ── Plan the matrix ────────────────────────────────────────────────\n type Cell = { variant: CampaignVariant<V>; scenario: CampaignScenario; seed: number }\n const cells: Cell[] = []\n for (const variant of opts.variants) {\n for (const scenario of opts.scenarios) {\n for (const seed of seeds) {\n cells.push({ variant, scenario, seed })\n }\n }\n }\n\n const startedAt = new Date(now()).toISOString()\n const runs: RunRecord[] = []\n const integrityReports: RunIntegrityReport[] = []\n const failedRuns: FailedRun[] = []\n\n // ── Execute (bounded-concurrency worker pool) ──────────────────────\n // A genuine (non-CellExecutionError) error from any worker is a bug, not a\n // run-level failure. We must NOT let `Promise.all` reject mid-flight and\n // orphan the other workers' in-progress runs (emitters never finalized,\n // sinks/handles leak, partial work silently discarded). Instead: capture the\n // first genuine error, stop dispatching new cells so in-flight workers wind\n // down, finalize every still-open run, then re-throw the aggregated error.\n let cursor = 0\n let aborting = false\n const genuineErrors: unknown[] = []\n // Emitters for runs that are currently mid-flight, keyed by runId. A worker\n // registers its emitter before invoking the runner and removes it once the\n // run is finalized (via endRun/abortRun, success or failure). Anything left\n // here after the pool settles is an orphan we must abort.\n const openRuns = new Map<string, TraceEmitter>()\n\n async function worker(): Promise<void> {\n while (!aborting) {\n const i = cursor++\n if (i >= cells.length) return\n const cell = cells[i]!\n try {\n const result = await runOneCell(cell)\n runs.push(result.record)\n integrityReports.push(result.integrity)\n } catch (err) {\n if (err instanceof CellExecutionError) {\n failedRuns.push(err.failed)\n if (err.integrity) integrityReports.push(err.integrity)\n } else {\n // Genuine bug — not a runner failure, not an integrity failure.\n // Capture it and stop dispatching so peers wind down gracefully;\n // re-thrown after the pool settles. Do not surface here — that would\n // reject Promise.all and orphan the other workers' runs.\n genuineErrors.push(err)\n aborting = true\n return\n }\n }\n }\n }\n\n async function runOneCell(\n cell: Cell,\n ): Promise<{ record: RunRecord; integrity: RunIntegrityReport }> {\n const runId = (opts.runId ?? defaultRunId)({\n campaignId: opts.campaignId,\n runId: '', // unused by default generator\n variantId: cell.variant.id,\n scenarioId: cell.scenario.scenarioId,\n seed: cell.seed,\n })\n const factoryParams: CampaignFactoryParams = {\n campaignId: opts.campaignId,\n runId,\n variantId: cell.variant.id,\n scenarioId: cell.scenario.scenarioId,\n seed: cell.seed,\n }\n const store = opts.storeFactory(factoryParams)\n const rawSink = rawSinkFactory(factoryParams)\n\n const emitter = new TraceEmitter(store, {\n runId,\n now: opts.now,\n onRunComplete: opts.onRunComplete,\n })\n // Track this run as open so a genuine error elsewhere in the pool can\n // finalize it instead of orphaning it. Removed in the finally below.\n openRuns.set(runId, emitter)\n\n const llmOpts: LlmClientOptions = {\n ...opts.llmOpts,\n rawSink,\n traceContext: { runId },\n }\n\n const ctx: CampaignRunContext<V> = {\n runId,\n experimentId: opts.campaignId,\n variant: cell.variant.payload,\n variantId: cell.variant.id,\n scenarioId: cell.scenario.scenarioId,\n scenarioTags: cell.scenario.tags ?? {},\n seed: cell.seed,\n splitTag,\n emitter,\n store,\n rawSink,\n llmOpts,\n }\n\n try {\n const wallStart = now()\n let outcome: CampaignRunOutcome\n try {\n outcome = await opts.runner(ctx)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n // The runner threw mid-execution. Abort the run so the emitter\n // finalizes. The only benign abortRun failure is \"the runner never\n // started the run\" (nothing to finalize). A store-write failure (disk\n // full, FS error) is a genuine diagnostic — surface it rather than\n // masking it as a plain runner failure.\n await finalizeAbort(emitter, runId, message)\n throw new CellExecutionError({\n runId,\n variantId: cell.variant.id,\n scenarioId: cell.scenario.scenarioId,\n seed: cell.seed,\n reason: 'runner_threw',\n error: message,\n })\n }\n const wallMs = now() - wallStart\n\n const integrityReport = await assertRunCaptured(store, runId, { ...integrity, rawSink })\n if (!integrityReport.ok) {\n switch (onIntegrityFailure) {\n case 'throw':\n throw new RunIntegrityError(integrityReport)\n case 'mark_failed':\n throw new CellExecutionError(\n {\n runId,\n variantId: cell.variant.id,\n scenarioId: cell.scenario.scenarioId,\n seed: cell.seed,\n reason: 'integrity_failed',\n error: integrityReport.issues.map((i) => i.code).join(', '),\n },\n integrityReport,\n )\n case 'log':\n // Caller wants the run admitted with a flagged report; fall through.\n break\n }\n }\n\n const recordOutcome: RunOutcome = {\n raw: outcome.raw ?? {},\n }\n if (splitTag === 'holdout') recordOutcome.holdoutScore = outcome.score\n else recordOutcome.searchScore = outcome.score\n if (outcome.judgeScores !== undefined) recordOutcome.judgeScores = outcome.judgeScores\n\n const record: RunRecord = {\n runId,\n experimentId: opts.campaignId,\n candidateId: cell.variant.id,\n seed: cell.seed,\n model: outcome.model,\n promptHash: outcome.promptHash,\n configHash: outcome.configHash,\n commitSha: opts.commitSha,\n wallMs,\n costUsd: outcome.costUsd,\n costProvenance: outcome.costProvenance,\n tokenUsage: outcome.tokenUsage,\n terminalOutcome: 'succeeded',\n judgeMetadata: outcome.judgeMetadata,\n outcome: recordOutcome,\n ...(outcome.failureClass ? { failureClass: outcome.failureClass } : {}),\n failureMode: outcome.failureMode,\n splitTag,\n scenarioId: cell.scenario.scenarioId,\n }\n const profileSource =\n outcome.agentProfile ??\n (typeof opts.agentProfile === 'function'\n ? await opts.agentProfile({\n campaignId: opts.campaignId,\n runId,\n variantId: cell.variant.id,\n scenarioId: cell.scenario.scenarioId,\n seed: cell.seed,\n variant: cell.variant.payload,\n scenarioTags: cell.scenario.tags ?? {},\n })\n : opts.agentProfile)\n if (profileSource !== undefined) {\n const agentProfile = await resolveAgentProfileCell(profileSource)\n assertAgentProfileMatchesRun(agentProfile, outcome.model, outcome.promptHash)\n record.agentProfile = agentProfile\n }\n return { record: validateRunRecord(record), integrity: integrityReport }\n } finally {\n // This run's worker has finished with it (success, run-level failure, or\n // genuine error). It is no longer the pool's job to finalize — drop it so\n // the post-settle sweep doesn't double-abort a finalized run.\n openRuns.delete(runId)\n }\n }\n\n const workers = Array.from({ length: Math.min(concurrency, cells.length) }, () => worker())\n // allSettled (not all): a genuine error in one worker must not reject the\n // pool mid-flight and orphan the others. Each worker captures its own\n // genuine error into `genuineErrors` and returns; we re-throw below.\n await Promise.allSettled(workers)\n\n // Finalize any run still open after the pool wound down. With the\n // stop-dispatch flag these are the runs that were mid-flight in peer workers\n // when the first genuine error fired — abort them so their emitters finalize\n // (hooks fire, store records a terminal status) instead of leaking.\n for (const [runId, emitter] of openRuns) {\n await finalizeAbort(emitter, runId, 'campaign aborted: genuine error in a sibling run')\n }\n openRuns.clear()\n\n if (genuineErrors.length > 0) {\n throw genuineErrors.length === 1\n ? genuineErrors[0]\n : new AggregateError(\n genuineErrors,\n `runEvalCampaign: ${genuineErrors.length} runs failed with genuine (non-run-level) errors`,\n )\n }\n\n // ── Optional research report ───────────────────────────────────────\n let report: ResearchReport | undefined\n if (opts.report) {\n const reportOpts: ResearchReportOptions = {\n ...opts.report,\n comparator: opts.report.comparator,\n split: splitTag === 'dev' ? 'search' : splitTag,\n generatedAt: new Date(now()).toISOString(),\n preregistrationHash: preregistrationHash ?? undefined,\n }\n report = await researchReport(runs, reportOpts)\n }\n\n const endedAt = new Date(now()).toISOString()\n\n return {\n campaignId: opts.campaignId,\n campaignFingerprint,\n preregistrationHash,\n runs,\n integrityReports,\n failedRuns,\n report,\n startedAt,\n endedAt,\n }\n}\n\n// ── Internal ─────────────────────────────────────────────────────────────\n\nclass CellExecutionError extends Error {\n readonly failed: FailedRun\n readonly integrity?: RunIntegrityReport\n constructor(failed: FailedRun, integrity?: RunIntegrityReport) {\n super(`cell ${failed.variantId}/${failed.scenarioId}@${failed.seed} failed: ${failed.reason}`)\n this.failed = failed\n this.integrity = integrity\n }\n}\n\n/**\n * Abort a run whose owning work threw or was orphaned by a sibling's genuine\n * error, finalizing the emitter so hooks fire and the store records a terminal\n * status. Safe to call unconditionally: it only aborts runs that are still\n * `running`. Two no-op cases are intentional and benign:\n *\n * - the run was never started (absent from the store) — nothing to finalize\n * - the run is already terminal (`completed` / `failed` / `aborted`) —\n * finalizing again would overwrite the real outcome (e.g. flip a passed run\n * to `aborted` with `{ pass: false, notes: reason }`), so we leave it alone\n *\n * Any OTHER failure of the store read or the abort write (disk full, FS fault,\n * backend down) is a genuine diagnostic and propagates rather than being\n * swallowed.\n */\nexport async function finalizeAbort(\n emitter: TraceEmitter,\n runId: string,\n reason: string,\n): Promise<void> {\n const existing = await emitter.traceStore.getRun(runId)\n if (existing === undefined) return // run never started; nothing to abort\n if (existing.status !== 'running') return // already finalized; never overwrite a real outcome\n await emitter.abortRun(reason)\n}\n\nfunction defaultRawSinkFactory(workDir: string | undefined) {\n return (params: CampaignFactoryParams): RawProviderSink => {\n if (!workDir) {\n throw new Error(\n 'runEvalCampaign: rawSinkFactory not supplied and workDir not set. Pass either to enable raw provider capture, or pass `new NoopRawProviderSink()` via rawSinkFactory to opt out explicitly.',\n )\n }\n return new FileSystemRawProviderSink({\n dir: `${workDir}/raw-events/${params.runId}`,\n })\n }\n}\n\nasync function resolveAgentProfileCell(\n input: AgentProfileCell | AgentProfileCellInput,\n): Promise<AgentProfileCell> {\n if (isAgentProfileCell(input)) {\n if (!(await verifyAgentProfileCell(input))) {\n throw new Error(`runEvalCampaign: agentProfile.cellId does not match its content`)\n }\n return input\n }\n return buildAgentProfileCell(input)\n}\n\nfunction isAgentProfileCell(\n input: AgentProfileCell | AgentProfileCellInput,\n): input is AgentProfileCell {\n return 'schemaVersion' in input && 'cellId' in input\n}\n\nfunction assertAgentProfileMatchesRun(\n profile: AgentProfileCell,\n model: string,\n promptHash: string,\n): void {\n if (profile.model !== undefined && profile.model !== model) {\n throw new Error(\n `runEvalCampaign: agentProfile.model \"${profile.model}\" does not match outcome.model \"${model}\"`,\n )\n }\n if (profile.promptHash !== undefined && profile.promptHash !== promptHash) {\n throw new Error(\n `runEvalCampaign: agentProfile.promptHash \"${profile.promptHash}\" does not match outcome.promptHash \"${promptHash}\"`,\n )\n }\n}\n\nfunction defaultRunId(params: CampaignFactoryParams): string {\n // Stable across re-runs: fingerprint of (campaignId, variantId, scenarioId, seed).\n // Caller can override via opts.runId for non-deterministic IDs.\n const base = `${params.campaignId}::${params.variantId}::${params.scenarioId}::${params.seed}`\n // Lightweight hex: we don't need crypto-grade here, just stability + uniqueness.\n let h1 = 0x811c9dc5\n let h2 = 0x12345678\n for (let i = 0; i < base.length; i++) {\n const c = base.charCodeAt(i)\n h1 = Math.imul(h1 ^ c, 0x01000193) >>> 0\n h2 = Math.imul(h2 ^ c, 0x9e3779b1) >>> 0\n }\n return `run-${h1.toString(16).padStart(8, '0')}${h2.toString(16).padStart(8, '0')}`\n}\n"],"mappings":"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","names":[]}
@@ -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