@post-print/agent-harness 0.2.7 → 0.3.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.
package/README.md CHANGED
@@ -24,14 +24,18 @@ const session = await runAgent({
24
24
  });
25
25
  ```
26
26
 
27
- `runAgent` / `runCursorAgent` accept optional `timeoutMs` (hard cap on `stream` + `wait`; cancels the SDK run on expiry) and `failOnUserInput` (default `true` — rejects `AskQuestion`-style tools in headless runs).
27
+ `runAgent` / `runCursorAgent` / `runClaudeAgent` accept optional `timeoutMs` (hard cap; cancels the Cursor SDK run or kills the Claude CLI process group on expiry) and `failOnUserInput` (default `true` — rejects AskQuestion / AskUserQuestion-style tools in headless runs).
28
28
 
29
- Live Cursor runs capture optional `trace.usage` (`inputTokens` / `outputTokens` / `totalTokens`, plus provider cache/reasoning fields when present) from SDK stream `usage` events and `run.wait()`.
29
+ Live Cursor runs use `@cursor/sdk` + `CURSOR_API_KEY`. Live Claude runs use the Claude Code CLI (`claude -p --bare --output-format stream-json`) + `ANTHROPIC_API_KEY` (binary via `CLAUDE_CODE_BIN` or `claude` on `PATH`). `--bare` skips ambient CLAUDE.md / skills discovery; the harness injects context via `loadContext` preamble instead. Claude tool names are Claude-native (`Bash`, `Read`, `Edit`, …).
30
+
31
+ Live Cursor/Claude runs capture optional `trace.usage` (`inputTokens` / `outputTokens` / `totalTokens`, plus provider cache/reasoning fields when present).
30
32
 
31
33
  Context profiles: `shared` | `cursor` | `claude` | `skeleton`. `skeleton` loads `.skeleton/registry.md`, a short `.skeleton/config.yaml` summary, and optional `customize.alwaysInclude` basenames under `.skeleton/customize/`. Additive paths via `loadContext({ contextSources })` work on any profile; default `shared`/`cursor`/`claude` profiles stay unchanged for toolbox compatibility.
32
34
 
33
- Live Cursor runs accept inline `mcpServers` (stdio or HTTP/SSE), passed through to `Agent.create`. Replay ignores them and scores committed `toolCalls` only. Ambient MCP via `local.settingSources` is not enabled.
35
+ Live runs accept inline `mcpServers` (stdio or HTTP/SSE). Cursor passes them to `Agent.create`; Claude writes a temp `--mcp-config` JSON. Replay ignores them and scores committed `toolCalls` only. Ambient MCP via `local.settingSources` is not enabled.
34
36
 
35
37
  When `outputContract` is set, `buildRoutingContract` injects hands-on / hands-off routing announce rules and requires continuing the task after the announce (do not end the turn at Routing alone).
36
38
 
39
+ Judge classifiers remain Cursor SDK–backed (`CURSOR_API_KEY`) for all hosts.
40
+
37
41
  Consumer: `@post-print/agent-test`.
@@ -5,10 +5,10 @@ export declare class CursorAdapter implements HostAdapter {
5
5
  readonly host: "cursor";
6
6
  run(options: RunAgentOptions): Promise<AgentSession>;
7
7
  }
8
- /** Claude Code CLI adapter — stub until structured headless output is wired. */
8
+ /** Claude Code CLI adapter — requires `claude` on PATH (or CLAUDE_CODE_BIN) + ANTHROPIC_API_KEY. */
9
9
  export declare class ClaudeAdapter implements HostAdapter {
10
10
  readonly host: "claude";
11
- run(_options: RunAgentOptions): Promise<AgentSession>;
11
+ run(options: RunAgentOptions): Promise<AgentSession>;
12
12
  }
13
13
  export declare function createAdapter(host: RunAgentOptions["host"]): HostAdapter;
14
14
  export { ReplayAdapter };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAc,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA2B5C,gFAAgF;AAChF,qBAAa,aAAc,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CA4EzD;CACD;AAED,gFAAgF;AAChF,qBAAa,aAAc,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,GAAG,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAK1D;CACD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,WAAW,CASxE;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAc,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA2B5C,gFAAgF;AAChF,qBAAa,aAAc,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CA+EzD;CACD;AAED,oGAAoG;AACpG,qBAAa,aAAc,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CA6EzD;CACD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,WAAW,CASxE;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { captureGitDiff, enrichTrace } from "../capture.js";
2
+ import { formatClaudeRunFailure, runClaudeAgent, takeLastClaudeRunTrace } from "../claude-run.js";
2
3
  import { formatCursorRunFailure, runCursorAgent, takeLastCursorRunTrace } from "../cursor-run.js";
3
4
  import { buildRoutingContract } from "../routing-contract.js";
4
5
  import { getPartialTrace } from "../run-guards.js";
@@ -34,7 +35,7 @@ export class CursorAdapter {
34
35
  ? `\n\n${buildRoutingContract(options.outputContract)}\n`
35
36
  : "";
36
37
  const prompt = `${options.context.preamble}\n\n---\n${contract}Task:\n${options.prompt}`;
37
- const { trace: streamedTrace, status, rawStatus, sdkError, } = await runCursorAgent({
38
+ const { trace: streamedTrace, status, rawStatus, sdkError, usage, } = await runCursorAgent({
38
39
  cwd: options.cwd,
39
40
  prompt,
40
41
  mcpServers: options.mcpServers,
@@ -61,6 +62,7 @@ export class CursorAdapter {
61
62
  status: "completed",
62
63
  trace,
63
64
  durationMs,
65
+ usage: usage ?? trace.usage,
64
66
  };
65
67
  }
66
68
  return {
@@ -68,6 +70,7 @@ export class CursorAdapter {
68
70
  status: "failed",
69
71
  trace,
70
72
  durationMs,
73
+ usage: usage ?? trace.usage,
71
74
  error: formatCursorRunFailure({ status, rawStatus, sdkError }),
72
75
  };
73
76
  }
@@ -86,11 +89,74 @@ export class CursorAdapter {
86
89
  }
87
90
  }
88
91
  }
89
- /** Claude Code CLI adapter — stub until structured headless output is wired. */
92
+ /** Claude Code CLI adapter — requires `claude` on PATH (or CLAUDE_CODE_BIN) + ANTHROPIC_API_KEY. */
90
93
  export class ClaudeAdapter {
91
94
  host = "claude";
92
- async run(_options) {
93
- return emptyFailed(this.host, "Claude Code adapter not implemented — use host replay or export session to trace JSON");
95
+ async run(options) {
96
+ if (!process.env.ANTHROPIC_API_KEY?.trim()) {
97
+ return emptyFailed(this.host, "ANTHROPIC_API_KEY not set — use host replay or set API key for live runs");
98
+ }
99
+ const started = performance.now();
100
+ try {
101
+ const contract = options.outputContract
102
+ ? `\n\n${buildRoutingContract(options.outputContract)}\n`
103
+ : "";
104
+ const prompt = `${options.context.preamble}\n\n---\n${contract}Task:\n${options.prompt}`;
105
+ const { trace: streamedTrace, status, rawStatus, exitCode, stderr, } = await runClaudeAgent({
106
+ cwd: options.cwd,
107
+ prompt,
108
+ mcpServers: options.mcpServers,
109
+ timeoutMs: options.timeoutMs,
110
+ failOnUserInput: options.failOnUserInput,
111
+ onDeadlineStart: options.onDeadlineStart,
112
+ });
113
+ const gitDiffResult = await captureGitDiff(options.cwd);
114
+ const resultError = streamedTrace.artifacts.claudeResultError;
115
+ const trace = enrichTrace({
116
+ ...streamedTrace,
117
+ gitDiff: gitDiffResult.diff,
118
+ artifacts: {
119
+ ...streamedTrace.artifacts,
120
+ ...(gitDiffResult.truncated ? { gitDiffTruncated: "true" } : {}),
121
+ ...(exitCode !== undefined && exitCode !== null
122
+ ? { claudeExitCode: String(exitCode) }
123
+ : {}),
124
+ },
125
+ });
126
+ const durationMs = Math.round(performance.now() - started);
127
+ if (status === "completed") {
128
+ return {
129
+ host: this.host,
130
+ status: "completed",
131
+ trace,
132
+ durationMs,
133
+ usage: trace.usage,
134
+ };
135
+ }
136
+ return {
137
+ host: this.host,
138
+ status: "failed",
139
+ trace,
140
+ durationMs,
141
+ usage: trace.usage,
142
+ error: formatClaudeRunFailure({
143
+ status,
144
+ rawStatus,
145
+ exitCode,
146
+ stderr,
147
+ resultError,
148
+ }),
149
+ };
150
+ }
151
+ catch (error) {
152
+ const message = error instanceof Error ? error.message : "Failed to run Claude Code CLI";
153
+ const durationMs = Math.round(performance.now() - started);
154
+ const partial = getPartialTrace(error) ?? takeLastClaudeRunTrace();
155
+ if (partial && (partial.messages.length > 0 || partial.toolCalls.length > 0)) {
156
+ return sessionFromTrace(this.host, partial, message, durationMs);
157
+ }
158
+ return emptyFailed(this.host, message);
159
+ }
94
160
  }
95
161
  }
96
162
  export function createAdapter(host) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { type TraceAccumulator } from "./capture.js";
2
+ import type { AgentTrace, AgentUsage } from "./types.js";
3
+ /** One NDJSON line from `claude -p --output-format stream-json`. */
4
+ export interface ClaudeStreamEvent {
5
+ type?: string;
6
+ subtype?: string;
7
+ message?: {
8
+ role?: string;
9
+ content?: ClaudeContentBlock[];
10
+ };
11
+ event?: {
12
+ type?: string;
13
+ delta?: {
14
+ type?: string;
15
+ text?: string;
16
+ };
17
+ };
18
+ result?: string;
19
+ is_error?: boolean;
20
+ usage?: unknown;
21
+ error?: string;
22
+ errors?: string[];
23
+ }
24
+ export interface ClaudeContentBlock {
25
+ type?: string;
26
+ text?: string;
27
+ id?: string;
28
+ name?: string;
29
+ input?: unknown;
30
+ tool_use_id?: string;
31
+ content?: unknown;
32
+ }
33
+ export interface ClaudeTraceAccumulator extends TraceAccumulator {
34
+ /** Pending tool_use ids awaiting tool_result. */
35
+ toolCallIndexByToolUseId: Map<string, number>;
36
+ /** Terminal result event fields. */
37
+ resultText?: string;
38
+ resultIsError?: boolean;
39
+ resultError?: string;
40
+ /** Unnormalized CLI exit / result subtype. */
41
+ rawStatus?: string;
42
+ }
43
+ export declare function createClaudeTraceAccumulator(): ClaudeTraceAccumulator;
44
+ /** Map Anthropic snake_case usage into AgentUsage. */
45
+ export declare function normalizeClaudeUsage(raw: unknown): AgentUsage | undefined;
46
+ /** Ensure Bash/shell tool args expose `command` for extractShellCommandsFromToolCalls. */
47
+ export declare function normalizeClaudeToolArgs(name: string, args: Record<string, unknown> | undefined): Record<string, unknown> | undefined;
48
+ /** Fold one Claude stream-json event into trace fields. */
49
+ export declare function accumulateClaudeEvent(acc: ClaudeTraceAccumulator, event: ClaudeStreamEvent): void;
50
+ export declare function finalizeClaudeTraceAccumulator(acc: ClaudeTraceAccumulator, options?: {
51
+ gitDiff?: string;
52
+ gitDiffTruncated?: boolean;
53
+ }): AgentTrace;
54
+ /** Normalize Claude NDJSON events into AgentTrace fields. */
55
+ export declare function buildTraceFromClaudeEvents(events: ClaudeStreamEvent[], options?: {
56
+ gitDiff?: string;
57
+ }): AgentTrace;
58
+ export declare function parseClaudeNdjsonLine(line: string): ClaudeStreamEvent | undefined;
59
+ //# sourceMappingURL=claude-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-capture.d.ts","sourceRoot":"","sources":["../src/claude-capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAMN,KAAK,gBAAgB,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAiB,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExE,oEAAoE;AACpE,MAAM,WAAW,iBAAiB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;KAC/B,CAAC;IACF,KAAK,CAAC,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACzC,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC/D,iDAAiD;IACjD,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,4BAA4B,IAAI,sBAAsB,CAKrE;AAED,sDAAsD;AACtD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAuCzE;AAuBD,0FAA0F;AAC1F,wBAAgB,uBAAuB,CACtC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACvC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAWrC;AAqFD,2DAA2D;AAC3D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CA2CjG;AAED,wBAAgB,8BAA8B,CAC7C,GAAG,EAAE,sBAAsB,EAC3B,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,GACxD,UAAU,CAgBZ;AAED,6DAA6D;AAC7D,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,iBAAiB,EAAE,EAC3B,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B,UAAU,CAMZ;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAUjF"}
@@ -0,0 +1,232 @@
1
+ import { createTraceAccumulator, finalizeTraceAccumulator, mergeAgentUsage, normalizeAgentUsage, serializeToolResult, } from "./capture.js";
2
+ export function createClaudeTraceAccumulator() {
3
+ return {
4
+ ...createTraceAccumulator(),
5
+ toolCallIndexByToolUseId: new Map(),
6
+ };
7
+ }
8
+ /** Map Anthropic snake_case usage into AgentUsage. */
9
+ export function normalizeClaudeUsage(raw) {
10
+ const camel = normalizeAgentUsage(raw);
11
+ if (!raw || typeof raw !== "object") {
12
+ return camel;
13
+ }
14
+ const record = raw;
15
+ const snake = {};
16
+ const input = record.input_tokens;
17
+ const output = record.output_tokens;
18
+ const cacheRead = record.cache_read_input_tokens;
19
+ const cacheWrite = record.cache_creation_input_tokens;
20
+ if (typeof input === "number" && Number.isFinite(input)) {
21
+ snake.inputTokens = input;
22
+ }
23
+ if (typeof output === "number" && Number.isFinite(output)) {
24
+ snake.outputTokens = output;
25
+ }
26
+ if (typeof cacheRead === "number" && Number.isFinite(cacheRead)) {
27
+ snake.cacheReadTokens = cacheRead;
28
+ }
29
+ if (typeof cacheWrite === "number" && Number.isFinite(cacheWrite)) {
30
+ snake.cacheWriteTokens = cacheWrite;
31
+ }
32
+ if (snake.inputTokens !== undefined ||
33
+ snake.outputTokens !== undefined ||
34
+ snake.cacheReadTokens !== undefined ||
35
+ snake.cacheWriteTokens !== undefined) {
36
+ const total = (snake.inputTokens ?? 0) +
37
+ (snake.outputTokens ?? 0) +
38
+ (snake.cacheReadTokens ?? 0) +
39
+ (snake.cacheWriteTokens ?? 0);
40
+ if (total > 0 && snake.totalTokens === undefined) {
41
+ snake.totalTokens = total;
42
+ }
43
+ }
44
+ return mergeAgentUsage(camel, Object.keys(snake).length > 0 ? snake : undefined);
45
+ }
46
+ function asArgs(input) {
47
+ if (input === undefined) {
48
+ return undefined;
49
+ }
50
+ if (input && typeof input === "object" && !Array.isArray(input)) {
51
+ return input;
52
+ }
53
+ if (typeof input === "string") {
54
+ try {
55
+ const parsed = JSON.parse(input);
56
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
57
+ return parsed;
58
+ }
59
+ }
60
+ catch {
61
+ return { command: input };
62
+ }
63
+ return { value: input };
64
+ }
65
+ return { value: input };
66
+ }
67
+ /** Ensure Bash/shell tool args expose `command` for extractShellCommandsFromToolCalls. */
68
+ export function normalizeClaudeToolArgs(name, args) {
69
+ if (!args) {
70
+ return undefined;
71
+ }
72
+ if (/^(bash|shell)$/i.test(name) && typeof args.command !== "string") {
73
+ const cmd = args.cmd ?? args.script ?? args.input;
74
+ if (typeof cmd === "string") {
75
+ return { ...args, command: cmd };
76
+ }
77
+ }
78
+ return args;
79
+ }
80
+ function pushAssistantText(acc, text) {
81
+ if (!text) {
82
+ return;
83
+ }
84
+ const last = acc.agentMessages.at(-1);
85
+ if (last?.role === "assistant" && last.seq === acc.nextSeq - 1) {
86
+ last.content += text;
87
+ }
88
+ else {
89
+ acc.agentMessages.push({ role: "assistant", content: text, seq: acc.nextSeq++ });
90
+ }
91
+ acc.inferenceChunks.push(text);
92
+ acc.textChunks.push(text);
93
+ if (!acc.hasSeenTool) {
94
+ acc.preToolAssistantChunks.push(text);
95
+ }
96
+ }
97
+ function pushToolCall(acc, toolCall, toolUseId) {
98
+ acc.hasSeenTool = true;
99
+ const existingIndex = toolUseId !== undefined ? acc.toolCallIndexByToolUseId.get(toolUseId) : undefined;
100
+ if (existingIndex !== undefined) {
101
+ const previous = acc.toolCalls[existingIndex];
102
+ if (previous) {
103
+ acc.toolCalls[existingIndex] = {
104
+ ...previous,
105
+ name: toolCall.name,
106
+ args: toolCall.args ?? previous.args,
107
+ result: toolCall.result ?? previous.result,
108
+ };
109
+ }
110
+ return;
111
+ }
112
+ const index = acc.toolCalls.length;
113
+ acc.toolCalls.push({ ...toolCall, seq: acc.nextSeq++ });
114
+ if (toolUseId !== undefined) {
115
+ acc.toolCallIndexByToolUseId.set(toolUseId, index);
116
+ }
117
+ }
118
+ function handleContentBlocks(acc, blocks) {
119
+ for (const block of blocks) {
120
+ const type = block.type ?? "";
121
+ if (type === "text" && typeof block.text === "string") {
122
+ pushAssistantText(acc, block.text);
123
+ continue;
124
+ }
125
+ if (type === "tool_use" && typeof block.name === "string") {
126
+ const args = normalizeClaudeToolArgs(block.name, asArgs(block.input));
127
+ pushToolCall(acc, {
128
+ name: block.name,
129
+ ...(args ? { args } : {}),
130
+ }, typeof block.id === "string" ? block.id : undefined);
131
+ continue;
132
+ }
133
+ if (type === "tool_result") {
134
+ const toolUseId = typeof block.tool_use_id === "string" ? block.tool_use_id : undefined;
135
+ const result = serializeToolResult(block.content);
136
+ if (toolUseId !== undefined) {
137
+ const existingIndex = acc.toolCallIndexByToolUseId.get(toolUseId);
138
+ if (existingIndex !== undefined) {
139
+ const previous = acc.toolCalls[existingIndex];
140
+ if (previous && result !== undefined) {
141
+ acc.toolCalls[existingIndex] = { ...previous, result };
142
+ }
143
+ continue;
144
+ }
145
+ }
146
+ if (result !== undefined) {
147
+ acc.toolOutputChunks.push(result);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ /** Fold one Claude stream-json event into trace fields. */
153
+ export function accumulateClaudeEvent(acc, event) {
154
+ if (event.type === "stream_event") {
155
+ const delta = event.event?.delta;
156
+ if (delta?.type === "text_delta" && typeof delta.text === "string") {
157
+ pushAssistantText(acc, delta.text);
158
+ }
159
+ return;
160
+ }
161
+ if (event.type === "assistant" || event.message?.role === "assistant") {
162
+ if (Array.isArray(event.message?.content)) {
163
+ handleContentBlocks(acc, event.message.content);
164
+ }
165
+ return;
166
+ }
167
+ if (event.type === "user" || event.message?.role === "user") {
168
+ if (Array.isArray(event.message?.content)) {
169
+ handleContentBlocks(acc, event.message.content);
170
+ }
171
+ return;
172
+ }
173
+ if (event.type === "result") {
174
+ acc.rawStatus = event.subtype ?? (event.is_error ? "error" : "success");
175
+ acc.resultIsError = Boolean(event.is_error) || event.subtype === "error";
176
+ if (typeof event.result === "string" && event.result.length > 0) {
177
+ acc.resultText = event.result;
178
+ // Final assistant prose when stream omitted message events.
179
+ if (acc.agentMessages.length === 0) {
180
+ pushAssistantText(acc, event.result);
181
+ }
182
+ }
183
+ if (typeof event.error === "string" && event.error.length > 0) {
184
+ acc.resultError = event.error;
185
+ }
186
+ else if (Array.isArray(event.errors) && event.errors.length > 0) {
187
+ acc.resultError = event.errors.join("; ");
188
+ }
189
+ const usage = normalizeClaudeUsage(event.usage);
190
+ if (usage) {
191
+ acc.usage = mergeAgentUsage(acc.usage, usage);
192
+ }
193
+ }
194
+ }
195
+ export function finalizeClaudeTraceAccumulator(acc, options) {
196
+ const trace = finalizeTraceAccumulator(acc, options);
197
+ const artifacts = { ...trace.artifacts };
198
+ if (acc.rawStatus) {
199
+ artifacts.claudeRawStatus = acc.rawStatus;
200
+ }
201
+ if (acc.resultIsError) {
202
+ artifacts.claudeResultIsError = "true";
203
+ }
204
+ if (acc.resultError) {
205
+ artifacts.claudeResultError = acc.resultError;
206
+ }
207
+ return {
208
+ ...trace,
209
+ artifacts,
210
+ };
211
+ }
212
+ /** Normalize Claude NDJSON events into AgentTrace fields. */
213
+ export function buildTraceFromClaudeEvents(events, options) {
214
+ const acc = createClaudeTraceAccumulator();
215
+ for (const event of events) {
216
+ accumulateClaudeEvent(acc, event);
217
+ }
218
+ return finalizeClaudeTraceAccumulator(acc, options);
219
+ }
220
+ export function parseClaudeNdjsonLine(line) {
221
+ const trimmed = line.trim();
222
+ if (!trimmed) {
223
+ return undefined;
224
+ }
225
+ try {
226
+ return JSON.parse(trimmed);
227
+ }
228
+ catch {
229
+ return undefined;
230
+ }
231
+ }
232
+ //# sourceMappingURL=claude-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-capture.js","sourceRoot":"","sources":["../src/claude-capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type McpServerConfig } from "./mcp.js";
2
+ import type { AgentTrace } from "./types.js";
3
+ export interface ClaudeRunOptions {
4
+ cwd: string;
5
+ prompt: string;
6
+ apiKey?: string;
7
+ model?: string;
8
+ mcpServers?: Record<string, McpServerConfig>;
9
+ /** Hard cap on the CLI process; omit for no harness deadline. */
10
+ timeoutMs?: number;
11
+ /** Fail fast when the agent invokes AskUserQuestion-style tools (default true). */
12
+ failOnUserInput?: boolean;
13
+ /** Fires immediately before the harness deadline timer arms (after spawn setup). */
14
+ onDeadlineStart?: () => void | Promise<void>;
15
+ /** Override binary path; defaults to CLAUDE_CODE_BIN or `claude`. */
16
+ bin?: string;
17
+ /** Override --allowedTools; defaults to CLAUDE_CODE_ALLOWED_TOOLS or built-in list. */
18
+ allowedTools?: string;
19
+ }
20
+ export interface ClaudeRunResult {
21
+ status: "completed" | "failed";
22
+ trace: AgentTrace;
23
+ rawStatus?: string;
24
+ exitCode?: number | null;
25
+ stderr?: string;
26
+ }
27
+ /** Best-effort cancel of the in-flight Claude CLI process (no-op when idle). */
28
+ export declare function cancelActiveClaudeRun(): void;
29
+ /** Consume the most recent partial/full Claude trace (clears the stash). */
30
+ export declare function takeLastClaudeRunTrace(): AgentTrace | undefined;
31
+ export declare function formatClaudeRunFailure(options: {
32
+ status: string;
33
+ rawStatus?: string;
34
+ exitCode?: number | null;
35
+ stderr?: string;
36
+ resultError?: string;
37
+ }): string;
38
+ /** Resolve Claude Code binary from options / env / PATH name. */
39
+ export declare function resolveClaudeBin(override?: string): Promise<string>;
40
+ /** Convert harness MCP configs into Claude CLI `--mcp-config` JSON. */
41
+ export declare function buildClaudeMcpConfigJson(servers: Record<string, McpServerConfig>): Record<string, unknown>;
42
+ /** Shared Claude Code CLI path — spawn + stream-json → AgentTrace. */
43
+ export declare function runClaudeAgent(options: ClaudeRunOptions): Promise<ClaudeRunResult>;
44
+ //# sourceMappingURL=claude-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-run.d.ts","sourceRoot":"","sources":["../src/claude-run.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,eAAe,EAAqB,MAAM,UAAU,CAAC;AAQnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,MAAM,WAAW,gBAAgB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oFAAoF;IACpF,eAAe,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAsBD,gFAAgF;AAChF,wBAAgB,qBAAqB,IAAI,IAAI,CAQ5C;AAED,4EAA4E;AAC5E,wBAAgB,sBAAsB,IAAI,UAAU,GAAG,SAAS,CAI/D;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAgBT;AA2CD,iEAAiE;AACjE,wBAAsB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQzE;AAMD,uEAAuE;AACvE,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACtC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBzB;AAqHD,sEAAsE;AACtE,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4HxF"}