@autonome-research/thread-phase-agents 3.0.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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +207 -0
  3. package/dist/acp/adapter.d.ts +89 -0
  4. package/dist/acp/adapter.d.ts.map +1 -0
  5. package/dist/acp/adapter.js +461 -0
  6. package/dist/acp/adapter.js.map +1 -0
  7. package/dist/acp/index.d.ts +12 -0
  8. package/dist/acp/index.d.ts.map +1 -0
  9. package/dist/acp/index.js +10 -0
  10. package/dist/acp/index.js.map +1 -0
  11. package/dist/acp/transport.d.ts +82 -0
  12. package/dist/acp/transport.d.ts.map +1 -0
  13. package/dist/acp/transport.js +199 -0
  14. package/dist/acp/transport.js.map +1 -0
  15. package/dist/acp/types.d.ts +157 -0
  16. package/dist/acp/types.d.ts.map +1 -0
  17. package/dist/acp/types.js +34 -0
  18. package/dist/acp/types.js.map +1 -0
  19. package/dist/anthropic/adapter.d.ts +55 -0
  20. package/dist/anthropic/adapter.d.ts.map +1 -0
  21. package/dist/anthropic/adapter.js +259 -0
  22. package/dist/anthropic/adapter.js.map +1 -0
  23. package/dist/anthropic/index.d.ts +8 -0
  24. package/dist/anthropic/index.d.ts.map +1 -0
  25. package/dist/anthropic/index.js +8 -0
  26. package/dist/anthropic/index.js.map +1 -0
  27. package/dist/claude-code/adapter.d.ts +56 -0
  28. package/dist/claude-code/adapter.d.ts.map +1 -0
  29. package/dist/claude-code/adapter.js +319 -0
  30. package/dist/claude-code/adapter.js.map +1 -0
  31. package/dist/claude-code/index.d.ts +8 -0
  32. package/dist/claude-code/index.d.ts.map +1 -0
  33. package/dist/claude-code/index.js +8 -0
  34. package/dist/claude-code/index.js.map +1 -0
  35. package/dist/codex/adapter.d.ts +62 -0
  36. package/dist/codex/adapter.d.ts.map +1 -0
  37. package/dist/codex/adapter.js +258 -0
  38. package/dist/codex/adapter.js.map +1 -0
  39. package/dist/codex/index.d.ts +9 -0
  40. package/dist/codex/index.d.ts.map +1 -0
  41. package/dist/codex/index.js +9 -0
  42. package/dist/codex/index.js.map +1 -0
  43. package/dist/codex-cli/adapter.d.ts +70 -0
  44. package/dist/codex-cli/adapter.d.ts.map +1 -0
  45. package/dist/codex-cli/adapter.js +368 -0
  46. package/dist/codex-cli/adapter.js.map +1 -0
  47. package/dist/codex-cli/index.d.ts +10 -0
  48. package/dist/codex-cli/index.d.ts.map +1 -0
  49. package/dist/codex-cli/index.js +10 -0
  50. package/dist/codex-cli/index.js.map +1 -0
  51. package/dist/hermes/index.d.ts +50 -0
  52. package/dist/hermes/index.d.ts.map +1 -0
  53. package/dist/hermes/index.js +43 -0
  54. package/dist/hermes/index.js.map +1 -0
  55. package/dist/index.d.ts +11 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +14 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/injectors.d.ts +104 -0
  60. package/dist/injectors.d.ts.map +1 -0
  61. package/dist/injectors.js +219 -0
  62. package/dist/injectors.js.map +1 -0
  63. package/dist/openclaw/index.d.ts +54 -0
  64. package/dist/openclaw/index.d.ts.map +1 -0
  65. package/dist/openclaw/index.js +61 -0
  66. package/dist/openclaw/index.js.map +1 -0
  67. package/dist/pi/adapter.d.ts +79 -0
  68. package/dist/pi/adapter.d.ts.map +1 -0
  69. package/dist/pi/adapter.js +396 -0
  70. package/dist/pi/adapter.js.map +1 -0
  71. package/dist/pi/index.d.ts +14 -0
  72. package/dist/pi/index.d.ts.map +1 -0
  73. package/dist/pi/index.js +14 -0
  74. package/dist/pi/index.js.map +1 -0
  75. package/dist/thread-bridge.d.ts +83 -0
  76. package/dist/thread-bridge.d.ts.map +1 -0
  77. package/dist/thread-bridge.js +143 -0
  78. package/dist/thread-bridge.js.map +1 -0
  79. package/package.json +46 -0
@@ -0,0 +1,259 @@
1
+ /**
2
+ * Anthropic adapter — in-process via `@anthropic-ai/sdk`.
3
+ *
4
+ * Single-turn. The adapter streams from `client.messages.stream(...)`,
5
+ * translates Anthropic's RawMessageStreamEvent union to canonical
6
+ * `AgentEvent`s, and returns when the stream ends. Tool-use loops are
7
+ * the caller's responsibility — the adapter surfaces `tool_call` events
8
+ * but does not execute tools; on subsequent calls the caller passes the
9
+ * tool result back in `messages` as a user `tool_result` block.
10
+ *
11
+ * Capabilities:
12
+ * streaming 'text'
13
+ * cancellation 'cooperative' (Anthropic SDK accepts an AbortSignal)
14
+ * resumption 'none' (no native session id; pass history)
15
+ * structuredOutput 'prompted' (uses thread-phase's <response> parser)
16
+ *
17
+ * Extended thinking surfaces as canonical `thinking` events. Vision /
18
+ * citations / cache-control blocks pass through transparently in
19
+ * config.messages; we don't intercept them.
20
+ *
21
+ * @internal
22
+ */
23
+ import Anthropic from '@anthropic-ai/sdk';
24
+ import { applyStructuredOutputPrompt, composeAbort, createEventQueue, defineAgentAdapter, lazyEvents, parseStructuredFromText, serializeError, TurnAccumulator, } from '@autonome-research/thread-phase/agents';
25
+ const ADAPTER_ID = 'anthropic';
26
+ /** @internal */
27
+ export const anthropicAgent = defineAgentAdapter({
28
+ id: ADAPTER_ID,
29
+ capabilities: {
30
+ streaming: 'text',
31
+ cancellation: 'cooperative',
32
+ resumption: 'none',
33
+ structuredOutput: 'prompted',
34
+ },
35
+ adapter: createAnthropicAdapter,
36
+ });
37
+ function createAnthropicAdapter(config, options = {}) {
38
+ const source = ADAPTER_ID;
39
+ const traceId = options.traceId;
40
+ const { signal: compositeSignal, controller } = composeAbort(options.signal);
41
+ const queue = createEventQueue(options.eventBus);
42
+ const turns = new TurnAccumulator(queue.push, source, traceId);
43
+ let started = false;
44
+ let runPromise = null;
45
+ const startIfNeeded = () => {
46
+ if (runPromise)
47
+ return runPromise;
48
+ started = true;
49
+ runPromise = runOnce();
50
+ return runPromise;
51
+ };
52
+ async function runOnce() {
53
+ queue.push({ type: 'agent_start', source, traceId });
54
+ const client = config.client ?? new Anthropic({
55
+ apiKey: config.apiKey,
56
+ baseURL: config.baseURL,
57
+ });
58
+ const systemPrompt = config.outputSchema
59
+ ? applyStructuredOutputPrompt(config.systemPrompt ?? '', config.outputSchema)
60
+ : config.systemPrompt;
61
+ let assembledText = '';
62
+ let stopReason = null;
63
+ let inputTokens = 0;
64
+ let outputTokens = 0;
65
+ const executedToolCalls = [];
66
+ const blocks = {};
67
+ try {
68
+ const stream = client.messages.stream({
69
+ model: config.model,
70
+ max_tokens: config.maxTokens ?? 4096,
71
+ messages: config.messages,
72
+ ...(systemPrompt !== undefined ? { system: systemPrompt } : {}),
73
+ ...(config.tools !== undefined ? { tools: config.tools } : {}),
74
+ ...(config.toolChoice !== undefined ? { tool_choice: config.toolChoice } : {}),
75
+ ...(config.temperature !== undefined ? { temperature: config.temperature } : {}),
76
+ ...(config.thinking !== undefined ? { thinking: config.thinking } : {}),
77
+ }, { signal: compositeSignal });
78
+ for await (const event of stream) {
79
+ switch (event.type) {
80
+ case 'message_start': {
81
+ const m = event.message;
82
+ if (m?.usage) {
83
+ inputTokens = m.usage.input_tokens ?? inputTokens;
84
+ }
85
+ break;
86
+ }
87
+ case 'content_block_start': {
88
+ const cb = event.content_block;
89
+ if (cb.type === 'tool_use') {
90
+ blocks[event.index] = {
91
+ type: 'tool_use',
92
+ toolId: cb.id,
93
+ toolName: cb.name,
94
+ jsonAcc: '',
95
+ };
96
+ }
97
+ else if (cb.type === 'thinking') {
98
+ blocks[event.index] = { type: 'thinking' };
99
+ }
100
+ else if (cb.type === 'text') {
101
+ blocks[event.index] = { type: 'text' };
102
+ }
103
+ else {
104
+ blocks[event.index] = { type: 'other' };
105
+ turns.native('anthropic:content_block_start', cb);
106
+ }
107
+ break;
108
+ }
109
+ case 'content_block_delta': {
110
+ const block = blocks[event.index];
111
+ if (!block)
112
+ break;
113
+ const delta = event.delta;
114
+ if (delta.type === 'text_delta') {
115
+ assembledText += delta.text;
116
+ turns.text(delta.text);
117
+ }
118
+ else if (delta.type === 'thinking_delta') {
119
+ turns.thinking(delta.thinking);
120
+ }
121
+ else if (delta.type === 'input_json_delta') {
122
+ block.jsonAcc = (block.jsonAcc ?? '') + delta.partial_json;
123
+ }
124
+ else {
125
+ // signature_delta, citations_delta, etc. — surface as native.
126
+ turns.native(`anthropic:${delta.type}`, delta);
127
+ }
128
+ break;
129
+ }
130
+ case 'content_block_stop': {
131
+ const block = blocks[event.index];
132
+ if (block?.type === 'tool_use' && block.toolId && block.toolName) {
133
+ let parsedInput = {};
134
+ if (block.jsonAcc && block.jsonAcc.length > 0) {
135
+ try {
136
+ const j = JSON.parse(block.jsonAcc);
137
+ if (j !== null && typeof j === 'object' && !Array.isArray(j)) {
138
+ parsedInput = j;
139
+ }
140
+ }
141
+ catch {
142
+ parsedInput = { _rawJson: block.jsonAcc };
143
+ }
144
+ }
145
+ turns.toolCall(block.toolId, block.toolName, parsedInput);
146
+ executedToolCalls.push({
147
+ id: block.toolId,
148
+ name: block.toolName,
149
+ input: parsedInput,
150
+ });
151
+ }
152
+ delete blocks[event.index];
153
+ break;
154
+ }
155
+ case 'message_delta': {
156
+ if (event.delta?.stop_reason) {
157
+ stopReason = event.delta.stop_reason;
158
+ }
159
+ if (event.usage) {
160
+ outputTokens = event.usage.output_tokens ?? outputTokens;
161
+ }
162
+ break;
163
+ }
164
+ case 'message_stop': {
165
+ // Stream ends after this. Final usage was on message_delta.
166
+ break;
167
+ }
168
+ default: {
169
+ // Forward-compat for new event types.
170
+ turns.native(`anthropic:${event.type ?? 'unknown'}`, event);
171
+ break;
172
+ }
173
+ }
174
+ }
175
+ }
176
+ catch (err) {
177
+ const aborted = compositeSignal.aborted;
178
+ turns.close();
179
+ queue.push({
180
+ type: 'error',
181
+ source,
182
+ traceId,
183
+ error: serializeError(err),
184
+ transient: false,
185
+ });
186
+ const reason = aborted ? 'aborted' : 'error';
187
+ queue.push({ type: 'agent_end', source, traceId, reason });
188
+ queue.close();
189
+ return {
190
+ text: assembledText,
191
+ finishReason: reason,
192
+ usage: {
193
+ promptTokens: inputTokens,
194
+ completionTokens: outputTokens,
195
+ totalTokens: inputTokens + outputTokens,
196
+ },
197
+ executedToolCalls,
198
+ };
199
+ }
200
+ turns.close();
201
+ const finishReason = mapStopReason(stopReason, compositeSignal.aborted);
202
+ let parsed = undefined;
203
+ let parseError = undefined;
204
+ if (config.outputSchema) {
205
+ try {
206
+ parsed = parseStructuredFromText(assembledText, config.outputSchema);
207
+ }
208
+ catch (err) {
209
+ parseError = serializeError(err);
210
+ }
211
+ }
212
+ queue.push({ type: 'agent_end', source, traceId, reason: finishReason });
213
+ queue.close();
214
+ return {
215
+ text: assembledText,
216
+ finishReason,
217
+ usage: {
218
+ promptTokens: inputTokens,
219
+ completionTokens: outputTokens,
220
+ totalTokens: inputTokens + outputTokens,
221
+ },
222
+ executedToolCalls,
223
+ parsed,
224
+ parseError,
225
+ };
226
+ }
227
+ return {
228
+ events: lazyEvents(queue.events, startIfNeeded),
229
+ get result() {
230
+ return startIfNeeded();
231
+ },
232
+ abort(reason) {
233
+ controller.abort(reason);
234
+ if (!started)
235
+ startIfNeeded();
236
+ },
237
+ };
238
+ }
239
+ function mapStopReason(reason, aborted) {
240
+ if (aborted)
241
+ return 'aborted';
242
+ switch (reason) {
243
+ case 'end_turn':
244
+ case 'stop_sequence':
245
+ return 'stop';
246
+ case 'max_tokens':
247
+ return 'length';
248
+ case 'tool_use':
249
+ return 'tool_calls';
250
+ case 'refusal':
251
+ return 'content_filter';
252
+ case 'pause_turn':
253
+ case null:
254
+ return 'unknown';
255
+ default:
256
+ return 'unknown';
257
+ }
258
+ }
259
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/anthropic/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Anthropic adapter entry. In-process; requires @anthropic-ai/sdk and a
3
+ * valid ANTHROPIC_API_KEY (or a pre-built client passed in config).
4
+ *
5
+ * @internal
6
+ */
7
+ export { anthropicAgent, type AnthropicAgentConfig } from './adapter.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/anthropic/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Anthropic adapter entry. In-process; requires @anthropic-ai/sdk and a
3
+ * valid ANTHROPIC_API_KEY (or a pre-built client passed in config).
4
+ *
5
+ * @internal
6
+ */
7
+ export { anthropicAgent } from './adapter.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/anthropic/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAA6B,MAAM,cAAc,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Claude Code adapter — wraps the `claude` CLI in stream-json mode.
3
+ *
4
+ * Spawns the CLI, parses NDJSON output, translates known event shapes
5
+ * to canonical AgentEvents, and surfaces unknown shapes as native
6
+ * events. The Claude Code CLI surface changes with releases — the
7
+ * adapter is forgiving by design: unrecognized lines become
8
+ * `native { kind: 'claude-code:<type>' }` events rather than errors.
9
+ *
10
+ * Default invocation:
11
+ * claude --print --output-format stream-json --verbose [<prompt>]
12
+ *
13
+ * With `resumeSessionId`:
14
+ * claude --print --output-format stream-json --verbose --resume <id> [<prompt>]
15
+ *
16
+ * Override `claudeArgs` to take full control of argv when the CLI
17
+ * version on PATH expects a different shape.
18
+ *
19
+ * Capabilities:
20
+ * streaming 'text'
21
+ * cancellation 'forceful'
22
+ * resumption 'opaque' (session id as the resume token)
23
+ * structuredOutput 'prompted'
24
+ *
25
+ * @internal
26
+ */
27
+ import { type AgentAdapterMeta, type StructuredOutputConfig } from '@autonome-research/thread-phase/agents';
28
+ /** @internal */
29
+ export interface ClaudeCodeAgentConfig {
30
+ /** Working directory passed as the subprocess cwd. */
31
+ cwd: string;
32
+ /** Prompt sent to the agent. Becomes the trailing positional arg by default. */
33
+ prompt: string;
34
+ /** Executable. Default 'claude'. */
35
+ claudeExecutable?: string;
36
+ /**
37
+ * Full argv override. When set, takes precedence over all defaults
38
+ * including --print, --output-format, --resume, and the prompt
39
+ * positional. Useful when wrapping a different CLI version.
40
+ */
41
+ claudeArgs?: string[];
42
+ /**
43
+ * Resume a prior session by id. Adds `--resume <id>` to the default
44
+ * args (ignored if `claudeArgs` is set).
45
+ */
46
+ resumeSessionId?: string;
47
+ /** Environment overrides merged with process.env. */
48
+ env?: Record<string, string>;
49
+ /** SIGTERM-then-SIGKILL grace in ms; default 3000. */
50
+ killGraceMs?: number;
51
+ /** Optional structured-output spec (prompted path). */
52
+ outputSchema?: StructuredOutputConfig;
53
+ }
54
+ /** @internal */
55
+ export declare const claudeCodeAgent: AgentAdapterMeta<ClaudeCodeAgentConfig>;
56
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/claude-code/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAKH,OAAO,EASL,KAAK,gBAAgB,EAMrB,KAAK,sBAAsB,EAC5B,MAAM,wCAAwC,CAAC;AAKhD,gBAAgB;AAChB,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAC;IACZ,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,YAAY,CAAC,EAAE,sBAAsB,CAAC;CACvC;AAED,gBAAgB;AAChB,eAAO,MAAM,eAAe,EAAE,gBAAgB,CAAC,qBAAqB,CASlE,CAAC"}
@@ -0,0 +1,319 @@
1
+ /**
2
+ * Claude Code adapter — wraps the `claude` CLI in stream-json mode.
3
+ *
4
+ * Spawns the CLI, parses NDJSON output, translates known event shapes
5
+ * to canonical AgentEvents, and surfaces unknown shapes as native
6
+ * events. The Claude Code CLI surface changes with releases — the
7
+ * adapter is forgiving by design: unrecognized lines become
8
+ * `native { kind: 'claude-code:<type>' }` events rather than errors.
9
+ *
10
+ * Default invocation:
11
+ * claude --print --output-format stream-json --verbose [<prompt>]
12
+ *
13
+ * With `resumeSessionId`:
14
+ * claude --print --output-format stream-json --verbose --resume <id> [<prompt>]
15
+ *
16
+ * Override `claudeArgs` to take full control of argv when the CLI
17
+ * version on PATH expects a different shape.
18
+ *
19
+ * Capabilities:
20
+ * streaming 'text'
21
+ * cancellation 'forceful'
22
+ * resumption 'opaque' (session id as the resume token)
23
+ * structuredOutput 'prompted'
24
+ *
25
+ * @internal
26
+ */
27
+ import { spawn } from 'node:child_process';
28
+ import { applyStructuredOutputPrompt, composeAbort, createEventQueue, defineAgentAdapter, lazyEvents, parseStructuredFromText, serializeError, TurnAccumulator, } from '@autonome-research/thread-phase/agents';
29
+ const ADAPTER_ID = 'claude-code';
30
+ /** @internal */
31
+ export const claudeCodeAgent = defineAgentAdapter({
32
+ id: ADAPTER_ID,
33
+ capabilities: {
34
+ streaming: 'text',
35
+ cancellation: 'forceful',
36
+ resumption: 'opaque',
37
+ structuredOutput: 'prompted',
38
+ },
39
+ adapter: createClaudeCodeAdapter,
40
+ });
41
+ function createClaudeCodeAdapter(config, options = {}) {
42
+ const source = ADAPTER_ID;
43
+ const traceId = options.traceId;
44
+ const killGraceMs = config.killGraceMs ?? 3000;
45
+ const { signal: compositeSignal, controller } = composeAbort(options.signal);
46
+ const queue = createEventQueue(options.eventBus);
47
+ const turns = new TurnAccumulator(queue.push, source, traceId);
48
+ let started = false;
49
+ let runPromise = null;
50
+ const startIfNeeded = () => {
51
+ if (runPromise)
52
+ return runPromise;
53
+ started = true;
54
+ runPromise = runOnce();
55
+ return runPromise;
56
+ };
57
+ async function runOnce() {
58
+ let resumeToken = config.resumeSessionId
59
+ ? { kind: 'opaque', data: config.resumeSessionId }
60
+ : undefined;
61
+ queue.push({ type: 'agent_start', source, traceId, resumeToken });
62
+ const effectivePrompt = config.outputSchema
63
+ ? `${config.prompt}\n\n${applyStructuredOutputPrompt('', config.outputSchema)}`
64
+ : config.prompt;
65
+ const args = config.claudeArgs ?? buildDefaultArgs(effectivePrompt, config.resumeSessionId);
66
+ const env = config.env ? { ...process.env, ...config.env } : process.env;
67
+ const executable = config.claudeExecutable ?? 'claude';
68
+ let child;
69
+ try {
70
+ child = spawn(executable, args, {
71
+ cwd: config.cwd,
72
+ env,
73
+ stdio: ['pipe', 'pipe', 'pipe'],
74
+ });
75
+ }
76
+ catch (err) {
77
+ turns.close();
78
+ queue.push({
79
+ type: 'error',
80
+ source,
81
+ traceId,
82
+ error: serializeError(err),
83
+ transient: false,
84
+ });
85
+ queue.push({ type: 'agent_end', source, traceId, reason: 'error', resumeToken });
86
+ queue.close();
87
+ return {
88
+ text: '',
89
+ finishReason: 'error',
90
+ usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
91
+ executedToolCalls: [],
92
+ resumeToken,
93
+ };
94
+ }
95
+ let stdoutBuf = '';
96
+ let assembledText = '';
97
+ let sessionId = config.resumeSessionId;
98
+ const executedToolCalls = [];
99
+ const parseLine = (line) => {
100
+ let msg;
101
+ try {
102
+ msg = JSON.parse(line);
103
+ }
104
+ catch {
105
+ turns.native('claude-code:non-json', line);
106
+ return;
107
+ }
108
+ if (msg === null || typeof msg !== 'object') {
109
+ turns.native('claude-code:non-object', msg);
110
+ return;
111
+ }
112
+ handleMessage(msg);
113
+ };
114
+ const handleMessage = (msg) => {
115
+ const type = typeof msg.type === 'string' ? msg.type : 'unknown';
116
+ // Capture session_id whenever it surfaces.
117
+ const sid = typeof msg.session_id === 'string' ? msg.session_id : undefined;
118
+ if (sid) {
119
+ sessionId = sid;
120
+ resumeToken = { kind: 'opaque', data: sid };
121
+ }
122
+ if (type === 'system') {
123
+ // init / config / etc — surface as native; session_id already captured.
124
+ turns.native(`claude-code:system:${msg.subtype ?? 'unknown'}`, msg);
125
+ return;
126
+ }
127
+ if (type === 'assistant') {
128
+ const message = msg.message;
129
+ const content = Array.isArray(message?.content) ? message?.content : [];
130
+ for (const raw of content) {
131
+ if (raw === null || typeof raw !== 'object')
132
+ continue;
133
+ const block = raw;
134
+ const blockType = typeof block.type === 'string' ? block.type : 'unknown';
135
+ if (blockType === 'text' && typeof block.text === 'string') {
136
+ assembledText += block.text;
137
+ turns.text(block.text);
138
+ }
139
+ else if (blockType === 'thinking' && typeof block.thinking === 'string') {
140
+ turns.thinking(block.thinking);
141
+ }
142
+ else if (blockType === 'tool_use') {
143
+ const id = typeof block.id === 'string' ? block.id : `tu_${executedToolCalls.length}`;
144
+ const name = typeof block.name === 'string' ? block.name : 'tool';
145
+ const input = (typeof block.input === 'object' && block.input !== null && !Array.isArray(block.input))
146
+ ? block.input
147
+ : {};
148
+ turns.toolCall(id, name, input);
149
+ executedToolCalls.push({ id, name, input });
150
+ }
151
+ else {
152
+ turns.native(`claude-code:assistant-block:${blockType}`, block);
153
+ }
154
+ }
155
+ return;
156
+ }
157
+ if (type === 'user') {
158
+ const message = msg.message;
159
+ const content = Array.isArray(message?.content) ? message?.content : [];
160
+ for (const raw of content) {
161
+ if (raw === null || typeof raw !== 'object')
162
+ continue;
163
+ const block = raw;
164
+ if (block.type === 'tool_result') {
165
+ const id = typeof block.tool_use_id === 'string' ? block.tool_use_id : '';
166
+ const isError = block.is_error === true;
167
+ const out = block.content ?? null;
168
+ turns.toolResult(id, 'tool', out, isError);
169
+ }
170
+ else {
171
+ turns.native(`claude-code:user-block:${block.type ?? 'unknown'}`, block);
172
+ }
173
+ }
174
+ return;
175
+ }
176
+ if (type === 'result') {
177
+ // Final summary. Captured as native; the close-handler synthesizes
178
+ // the canonical agent_end based on exit code + collected text.
179
+ turns.native('claude-code:result', msg);
180
+ return;
181
+ }
182
+ turns.native(`claude-code:${type}`, msg);
183
+ };
184
+ const onAbortSignal = () => {
185
+ if (child.exitCode !== null || child.signalCode !== null)
186
+ return;
187
+ try {
188
+ child.kill('SIGTERM');
189
+ }
190
+ catch {
191
+ // already gone
192
+ }
193
+ setTimeout(() => {
194
+ if (child.exitCode === null && child.signalCode === null) {
195
+ try {
196
+ child.kill('SIGKILL');
197
+ }
198
+ catch {
199
+ // already gone
200
+ }
201
+ }
202
+ }, killGraceMs);
203
+ };
204
+ if (compositeSignal.aborted) {
205
+ onAbortSignal();
206
+ }
207
+ else {
208
+ compositeSignal.addEventListener('abort', onAbortSignal, { once: true });
209
+ }
210
+ return new Promise((resolve) => {
211
+ child.stdout.setEncoding('utf8');
212
+ child.stdout.on('data', (chunk) => {
213
+ stdoutBuf += chunk;
214
+ let nl;
215
+ while ((nl = stdoutBuf.indexOf('\n')) !== -1) {
216
+ const line = stdoutBuf.slice(0, nl);
217
+ stdoutBuf = stdoutBuf.slice(nl + 1);
218
+ if (line.trim().length > 0)
219
+ parseLine(line);
220
+ }
221
+ });
222
+ child.stderr.setEncoding('utf8');
223
+ child.stderr.on('data', (chunk) => {
224
+ queue.push({
225
+ type: 'native',
226
+ source,
227
+ traceId,
228
+ kind: 'claude-code:stderr',
229
+ payload: chunk,
230
+ });
231
+ });
232
+ child.on('error', (err) => {
233
+ queue.push({
234
+ type: 'error',
235
+ source,
236
+ traceId,
237
+ error: serializeError(err),
238
+ transient: false,
239
+ });
240
+ });
241
+ child.on('close', (code, signal) => {
242
+ if (stdoutBuf.trim().length > 0)
243
+ parseLine(stdoutBuf.trim());
244
+ turns.close();
245
+ const aborted = compositeSignal.aborted;
246
+ let finishReason;
247
+ if (aborted)
248
+ finishReason = 'aborted';
249
+ else if (code === 0)
250
+ finishReason = executedToolCalls.length > 0 ? 'tool_calls' : 'stop';
251
+ else
252
+ finishReason = 'error';
253
+ // Non-zero exit with no prior 'error' event would leave the
254
+ // event stream without a diagnostic. Synthesize one — the
255
+ // conformance suite asserts an error event precedes agent_end
256
+ // on the error path, and consumers expect to see why the run
257
+ // failed without combing through native stderr events.
258
+ if (finishReason === 'error') {
259
+ queue.push({
260
+ type: 'error',
261
+ source,
262
+ traceId,
263
+ error: {
264
+ name: 'ClaudeCodeExitError',
265
+ message: signal
266
+ ? `claude-code exited via signal ${signal}`
267
+ : `claude-code exited with code ${code ?? 'null'}`,
268
+ },
269
+ transient: false,
270
+ });
271
+ }
272
+ if (sessionId) {
273
+ resumeToken = { kind: 'opaque', data: sessionId };
274
+ }
275
+ let parsed = undefined;
276
+ let parseError = undefined;
277
+ if (config.outputSchema && finishReason === 'stop') {
278
+ try {
279
+ parsed = parseStructuredFromText(assembledText, config.outputSchema);
280
+ }
281
+ catch (err) {
282
+ parseError = serializeError(err);
283
+ }
284
+ }
285
+ queue.push({ type: 'agent_end', source, traceId, reason: finishReason, resumeToken });
286
+ queue.close();
287
+ resolve({
288
+ text: assembledText,
289
+ finishReason,
290
+ usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
291
+ executedToolCalls,
292
+ parsed,
293
+ parseError,
294
+ resumeToken,
295
+ });
296
+ });
297
+ });
298
+ }
299
+ return {
300
+ events: lazyEvents(queue.events, startIfNeeded),
301
+ get result() {
302
+ return startIfNeeded();
303
+ },
304
+ abort(reason) {
305
+ controller.abort(reason);
306
+ if (!started)
307
+ startIfNeeded();
308
+ },
309
+ };
310
+ }
311
+ function buildDefaultArgs(prompt, resumeSessionId) {
312
+ const args = ['--print', '--output-format', 'stream-json', '--verbose'];
313
+ if (resumeSessionId) {
314
+ args.push('--resume', resumeSessionId);
315
+ }
316
+ args.push(prompt);
317
+ return args;
318
+ }
319
+ //# sourceMappingURL=adapter.js.map