@coralai/claude-code-agent 0.1.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 (78) hide show
  1. package/README.md +111 -0
  2. package/dist/agent.d.ts +240 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +592 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/errors.d.ts +27 -0
  7. package/dist/errors.d.ts.map +1 -0
  8. package/dist/errors.js +33 -0
  9. package/dist/errors.js.map +1 -0
  10. package/dist/hooks/fs.d.ts +26 -0
  11. package/dist/hooks/fs.d.ts.map +1 -0
  12. package/dist/hooks/fs.js +61 -0
  13. package/dist/hooks/fs.js.map +1 -0
  14. package/dist/hooks/index.d.ts +18 -0
  15. package/dist/hooks/index.d.ts.map +1 -0
  16. package/dist/hooks/index.js +2 -0
  17. package/dist/hooks/index.js.map +1 -0
  18. package/dist/hooks/permissions.d.ts +42 -0
  19. package/dist/hooks/permissions.d.ts.map +1 -0
  20. package/dist/hooks/permissions.js +79 -0
  21. package/dist/hooks/permissions.js.map +1 -0
  22. package/dist/hooks/terminal.d.ts +56 -0
  23. package/dist/hooks/terminal.d.ts.map +1 -0
  24. package/dist/hooks/terminal.js +127 -0
  25. package/dist/hooks/terminal.js.map +1 -0
  26. package/dist/index.d.ts +32 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +31 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/internal/acp-client-interface.d.ts +107 -0
  31. package/dist/internal/acp-client-interface.d.ts.map +1 -0
  32. package/dist/internal/acp-client-interface.js +17 -0
  33. package/dist/internal/acp-client-interface.js.map +1 -0
  34. package/dist/internal/acp-types.d.ts +64 -0
  35. package/dist/internal/acp-types.d.ts.map +1 -0
  36. package/dist/internal/acp-types.js +17 -0
  37. package/dist/internal/acp-types.js.map +1 -0
  38. package/dist/internal/agent-runtime-interface.d.ts +40 -0
  39. package/dist/internal/agent-runtime-interface.d.ts.map +1 -0
  40. package/dist/internal/agent-runtime-interface.js +17 -0
  41. package/dist/internal/agent-runtime-interface.js.map +1 -0
  42. package/dist/internal/local-acp-client.d.ts +27 -0
  43. package/dist/internal/local-acp-client.d.ts.map +1 -0
  44. package/dist/internal/local-acp-client.js +26 -0
  45. package/dist/internal/local-acp-client.js.map +1 -0
  46. package/dist/internal/sdk-adapter.d.ts +24 -0
  47. package/dist/internal/sdk-adapter.d.ts.map +1 -0
  48. package/dist/internal/sdk-adapter.js +453 -0
  49. package/dist/internal/sdk-adapter.js.map +1 -0
  50. package/dist/internal/session-accumulator.d.ts +55 -0
  51. package/dist/internal/session-accumulator.d.ts.map +1 -0
  52. package/dist/internal/session-accumulator.js +133 -0
  53. package/dist/internal/session-accumulator.js.map +1 -0
  54. package/dist/prompt-handle.d.ts +70 -0
  55. package/dist/prompt-handle.d.ts.map +1 -0
  56. package/dist/prompt-handle.js +137 -0
  57. package/dist/prompt-handle.js.map +1 -0
  58. package/dist/recording/index.d.ts +10 -0
  59. package/dist/recording/index.d.ts.map +1 -0
  60. package/dist/recording/index.js +10 -0
  61. package/dist/recording/index.js.map +1 -0
  62. package/dist/recording/replayer.d.ts +17 -0
  63. package/dist/recording/replayer.d.ts.map +1 -0
  64. package/dist/recording/replayer.js +68 -0
  65. package/dist/recording/replayer.js.map +1 -0
  66. package/dist/recording/writer.d.ts +32 -0
  67. package/dist/recording/writer.d.ts.map +1 -0
  68. package/dist/recording/writer.js +122 -0
  69. package/dist/recording/writer.js.map +1 -0
  70. package/dist/telemetry/index.d.ts +8 -0
  71. package/dist/telemetry/index.d.ts.map +1 -0
  72. package/dist/telemetry/index.js +8 -0
  73. package/dist/telemetry/index.js.map +1 -0
  74. package/dist/telemetry/otel-adapter.d.ts +105 -0
  75. package/dist/telemetry/otel-adapter.d.ts.map +1 -0
  76. package/dist/telemetry/otel-adapter.js +153 -0
  77. package/dist/telemetry/otel-adapter.js.map +1 -0
  78. package/package.json +45 -0
package/dist/agent.js ADDED
@@ -0,0 +1,592 @@
1
+ /**
2
+ * ClaudeCodeAgent — public class for embedding ACP-compatible Claude Code in
3
+ * Node.js applications. Built from scratch on top of AcpSdkAdapter (per
4
+ * Step 1.3.3 finding: ACPWorkerRuntime is SPS-slot-adapter, not reusable).
5
+ *
6
+ * v0.1.0-alpha.0 (Step 1.4.3): constructor + state machine + start/stop only.
7
+ * Other methods (prompt / cancelAll / fork / promptJson / usage / static
8
+ * resumeSession/replay/checkRuntime) throw NOT_IMPLEMENTED — filled in
9
+ * Steps 1.4.4-1.4.8.
10
+ *
11
+ * Spec: vision doc §3 (Full API Surface), §5 (state machine).
12
+ */
13
+ import { randomUUID } from 'node:crypto';
14
+ import { AgentError } from './errors.js';
15
+ import { aggregateResult, createPromptHandle, } from './prompt-handle.js';
16
+ import { AcpSdkAdapter, } from './internal/sdk-adapter.js';
17
+ import { RecordingWriter } from './recording/writer.js';
18
+ import { SpanManager } from './telemetry/otel-adapter.js';
19
+ // ─── Main class ────────────────────────────────────────
20
+ const DEFAULT_SPAWN_TIMEOUT_MS = 60_000;
21
+ const DEFAULT_ELICITATION_TIMEOUT_MS = 60_000;
22
+ const DEFAULT_MAX_QUEUE_LENGTH = 32;
23
+ export class ClaudeCodeAgent {
24
+ options;
25
+ // State machine
26
+ _status = 'idle';
27
+ _sessionId;
28
+ _pid;
29
+ // Internal transport
30
+ _sessionName;
31
+ _client = null;
32
+ // Idempotency caches: returning the same in-flight Promise from repeated
33
+ // start()/stop() prevents duplicate ACP handshakes.
34
+ _startPromise = null;
35
+ _stopPromise = null;
36
+ // Capability flags read from initialize response. Populated in start().
37
+ // Used by Step 1.4.4 prompt() to decide whether to queue or throw BUSY.
38
+ _supportsPromptQueueing = false;
39
+ // Current in-flight turn. v0.1: at most one active per session.
40
+ // 1.4.4 enforces this via BUSY / queue. Cleared when turn settles or cancels.
41
+ _currentTurn = null;
42
+ // Optional recording writer; null when options.recording is unset.
43
+ _recording = null;
44
+ // Optional OTel span manager; null when options.tracer is unset.
45
+ _spans = null;
46
+ // Cumulative usage across all turns in this session. Updated on each settle.
47
+ _cumUsage = {
48
+ inputTokens: 0,
49
+ outputTokens: 0,
50
+ };
51
+ constructor(options) {
52
+ this.options = options;
53
+ if (!options || typeof options.cwd !== 'string' || options.cwd.length === 0) {
54
+ throw new AgentError('CALL_AFTER_STOP', // best-fit code; constructor-level config is pre-lifecycle
55
+ 'AgentOptions.cwd is required and must be a non-empty string', { context: { reason: 'invalid_options' } });
56
+ }
57
+ // Stable per-instance session name. Internal to the agent — never surfaced
58
+ // to callers. Step 1.5 will gate exposure if SPS needs slot-name parity.
59
+ this._sessionName = `cca-${randomUUID()}`;
60
+ }
61
+ // ─── Getters ─────────────────────────────────────────
62
+ get status() {
63
+ return this._status;
64
+ }
65
+ get sessionId() {
66
+ return this._sessionId;
67
+ }
68
+ get pid() {
69
+ return this._pid;
70
+ }
71
+ /** Whether the shim advertised promptQueueing capability at initialize.
72
+ * Read after start() completes successfully. Used by Step 1.4.4. */
73
+ get supportsPromptQueueing() {
74
+ return this._supportsPromptQueueing;
75
+ }
76
+ // ─── Lifecycle ───────────────────────────────────────
77
+ /**
78
+ * Spawn shim + ACP initialize + newSession. Idempotent: repeated calls
79
+ * return the same Promise. `eager: true` is a documentation signal that
80
+ * the caller wants the spawn to happen now (vs lazy "spawn on first
81
+ * prompt") — in v0.1, start() always spawns now, so the flag only
82
+ * controls the displayed status ('warming' vs 'starting').
83
+ *
84
+ * Throws AgentError with code SPAWN_FAILED / SPAWN_TIMEOUT / INIT_FAILED /
85
+ * SESSION_FAILED / AUTH_ERROR / PROTOCOL_ERROR depending on failure point.
86
+ */
87
+ async start(opts) {
88
+ if (this._status === 'stopped' || this._status === 'error') {
89
+ throw new AgentError('CALL_AFTER_STOP', `Cannot start agent in terminal state '${this._status}'`, { context: { status: this._status } });
90
+ }
91
+ if (this._startPromise)
92
+ return this._startPromise;
93
+ this._startPromise = this._doStart(opts?.eager === true);
94
+ return this._startPromise;
95
+ }
96
+ async _doStart(eager) {
97
+ this._status = eager ? 'warming' : 'starting';
98
+ try {
99
+ const internalMode = this._mapPermissionMode(this.options.permissionMode ?? 'auto');
100
+ this._client = new AcpSdkAdapter(internalMode);
101
+ const result = await this._client.ensureSession({
102
+ sessionName: this._sessionName,
103
+ tool: 'claude',
104
+ cwd: this.options.cwd,
105
+ ...(this.options.env ? { extraEnv: this.options.env } : {}),
106
+ });
107
+ this._sessionId = result.sessionId;
108
+ this._pid = result.pid ?? undefined;
109
+ this._status = 'ready';
110
+ // Open OTel session span (if configured). Errors don't abort start.
111
+ if (this.options.tracer) {
112
+ try {
113
+ this._spans = new SpanManager(this.options.tracer);
114
+ this._spans.startSession({
115
+ sessionId: this._sessionId,
116
+ cwd: this.options.cwd,
117
+ ...(this._pid !== undefined ? { pid: this._pid } : {}),
118
+ });
119
+ }
120
+ catch (e) {
121
+ this._log('warn', `OTel tracer failed: ${e instanceof Error ? e.message : String(e)}`);
122
+ this._spans = null;
123
+ }
124
+ }
125
+ // Open recording writer (if configured) and emit session_start.
126
+ // Failure here logs but does not abort start — recording is best-effort.
127
+ if (this.options.recording) {
128
+ try {
129
+ this._recording = new RecordingWriter(this.options.recording);
130
+ this._recording.write({
131
+ type: 'session_start',
132
+ sessionId: this._sessionId,
133
+ ...(this._pid !== undefined ? { pid: this._pid } : {}),
134
+ cwd: this.options.cwd,
135
+ });
136
+ }
137
+ catch (e) {
138
+ this._log('warn', `Recording open failed (${this.options.recording}): ${e instanceof Error ? e.message : String(e)}`);
139
+ this._recording = null;
140
+ }
141
+ }
142
+ // Notify caller. Hook exceptions never poison the start contract.
143
+ this._safeFire('onStart', () => this.options.hooks?.onStart?.({
144
+ pid: this._pid,
145
+ sessionId: this._sessionId,
146
+ }));
147
+ }
148
+ catch (e) {
149
+ this._status = 'error';
150
+ const err = this._wrapStartError(e);
151
+ this._safeFire('onError', () => this.options.hooks?.onError?.(err));
152
+ throw err;
153
+ }
154
+ }
155
+ /**
156
+ * Close session (v0.20 stable closeSession) + drain in-flight prompts +
157
+ * kill shim. Idempotent. An agent that was never started transitions
158
+ * directly to 'stopped'.
159
+ */
160
+ async stop() {
161
+ if (this._status === 'idle') {
162
+ // Never started — go straight to stopped without invoking transport.
163
+ this._status = 'stopped';
164
+ return;
165
+ }
166
+ if (this._status === 'stopped')
167
+ return;
168
+ if (this._stopPromise)
169
+ return this._stopPromise;
170
+ this._stopPromise = this._doStop();
171
+ return this._stopPromise;
172
+ }
173
+ async _doStop() {
174
+ const previousStatus = this._status;
175
+ this._status = 'stopping';
176
+ try {
177
+ if (this._client) {
178
+ await this._client.stopSession({
179
+ sessionName: this._sessionName,
180
+ tool: 'claude',
181
+ });
182
+ }
183
+ this._status = 'stopped';
184
+ // Close OTel session span
185
+ if (this._spans) {
186
+ try {
187
+ this._spans.endSession({ code: 0 });
188
+ }
189
+ catch { /* best effort */ }
190
+ this._spans = null;
191
+ }
192
+ // Force-flush recording (D4 contract: stop() drains pending bytes)
193
+ if (this._recording) {
194
+ const rec = this._recording;
195
+ rec.write({ type: 'session_stop', code: 0 });
196
+ try {
197
+ await rec.close();
198
+ }
199
+ catch {
200
+ /* best effort */
201
+ }
202
+ this._recording = null;
203
+ }
204
+ this._safeFire('onStop', () => this.options.hooks?.onStop?.({ code: 0 }));
205
+ }
206
+ catch (e) {
207
+ this._status = 'error';
208
+ const err = new AgentError('SHIM_DIED', `stop() failed: ${e instanceof Error ? e.message : String(e)}`, {
209
+ ...(e instanceof Error ? { cause: e } : {}),
210
+ context: { previousStatus, sessionId: this._sessionId },
211
+ });
212
+ this._safeFire('onError', () => this.options.hooks?.onError?.(err));
213
+ throw err;
214
+ }
215
+ finally {
216
+ this._client = null;
217
+ }
218
+ }
219
+ // ─── prompt / cancelAll (Step 1.4.4) ─────────────────
220
+ /**
221
+ * Submit a prompt. Returns a PromptHandle whose `result` resolves with the
222
+ * aggregated PromptResult, and whose `updates` AsyncIterable broadcasts
223
+ * every SessionUpdate (D1 broadcast semantics).
224
+ *
225
+ * v0.1: single in-flight prompt per agent. Concurrent prompt() throws BUSY
226
+ * unless queuePrompts='always' (queue implementation lands in 1.4.4+).
227
+ * For v0.1.0-alpha we accept the simplest behavior: BUSY on overlap.
228
+ */
229
+ prompt(text, opts) {
230
+ if (!this._client || !this._sessionId) {
231
+ throw new AgentError('CALL_AFTER_STOP', `Cannot prompt: agent not started (status=${this._status})`, { context: { status: this._status } });
232
+ }
233
+ if (this._status === 'stopped' || this._status === 'error') {
234
+ throw new AgentError('CALL_AFTER_STOP', `Cannot prompt in terminal state '${this._status}'`);
235
+ }
236
+ if (this._currentTurn) {
237
+ // v0.1: no queueing yet. Will refine in later sub-tasks.
238
+ throw new AgentError('BUSY', 'Agent already has an in-flight prompt; await handle.result or call cancelAll() first', { context: { currentTurnId: this._currentTurn.turnId } });
239
+ }
240
+ const turnId = randomUUID();
241
+ const ctrl = createPromptHandle(turnId, this._sessionId);
242
+ const collected = [];
243
+ const client = this._client;
244
+ const sessionName = this._sessionName;
245
+ // Subscribe BEFORE startRun so we don't miss early events. The shim
246
+ // emits notifications serially after `conn.prompt()` begins, so the
247
+ // listener attached in the same tick captures everything.
248
+ const unsubscribe = client.subscribe(sessionName, (event) => {
249
+ if (event.type === 'complete') {
250
+ const stopReason = this._mapStopReason(event.stopReason);
251
+ const finalResult = aggregateResult(turnId, collected, stopReason);
252
+ this._recording?.write({
253
+ type: 'turn_end',
254
+ turnId,
255
+ stopReason: finalResult.stopReason,
256
+ ...(finalResult.usage ? { usage: finalResult.usage } : {}),
257
+ });
258
+ this._spans?.endPrompt({
259
+ stopReason: finalResult.stopReason,
260
+ ...(finalResult.usage ? { usage: finalResult.usage } : {}),
261
+ });
262
+ // Accumulate usage for usage() getter
263
+ if (finalResult.usage)
264
+ this._addUsage(finalResult.usage);
265
+ ctrl.settle(finalResult);
266
+ this._endTurn();
267
+ return;
268
+ }
269
+ const update = this._accumulatorToSessionUpdate(event);
270
+ if (update !== null) {
271
+ collected.push(update);
272
+ ctrl.pushUpdate(update);
273
+ this._recording?.write({ type: 'session_update', turnId, update });
274
+ this._safeFire('onSessionUpdate', () => this.options.hooks?.onSessionUpdate?.(update, turnId));
275
+ }
276
+ });
277
+ this._currentTurn = { turnId, controller: ctrl, unsubscribe };
278
+ this._status = 'busy';
279
+ this._recording?.write({ type: 'turn_start', turnId, prompt: text });
280
+ this._spans?.startPrompt({ turnId, promptPreview: text });
281
+ // Per-handle cancel routes to ACP cancelRun. The accumulator emits
282
+ // 'complete' with stopReason='cancelled' after the cancel ACK, which
283
+ // settles the handle through the same path as normal completion.
284
+ ctrl.setCancelImpl(async () => {
285
+ try {
286
+ await client.cancelRun(sessionName);
287
+ }
288
+ catch (e) {
289
+ // Best-effort: even if cancel RPC fails, fail the handle so the
290
+ // caller's await unblocks. The session may be in a weird state;
291
+ // surface it via onError.
292
+ const err = new AgentError('PROMPT_CANCELLED', `cancelRun failed but handle is being failed anyway: ${e instanceof Error ? e.message : String(e)}`, { ...(e instanceof Error ? { cause: e } : {}), context: { turnId } });
293
+ ctrl.fail(err);
294
+ this._endTurn();
295
+ return;
296
+ }
297
+ ctrl.fail(new AgentError('PROMPT_CANCELLED', 'Cancelled via handle.cancel()', {
298
+ context: { turnId },
299
+ }));
300
+ this._endTurn();
301
+ });
302
+ // Wire optional AbortSignal to the same cancel path
303
+ if (opts?.signal) {
304
+ const signal = opts.signal;
305
+ if (signal.aborted) {
306
+ // Already aborted — fire cancel on next tick so caller receives handle first
307
+ queueMicrotask(() => { void ctrl.handle.cancel(); });
308
+ }
309
+ else {
310
+ const onAbort = () => { void ctrl.handle.cancel(); };
311
+ signal.addEventListener('abort', onAbort, { once: true });
312
+ }
313
+ }
314
+ // Fire-and-forget: actual completion comes via accumulator 'complete'.
315
+ // startRun returns the synthetic 'running' state immediately; rejecting
316
+ // here means the prompt couldn't be submitted at all.
317
+ client
318
+ .startRun({ sessionName, tool: 'claude', prompt: text })
319
+ .catch((e) => {
320
+ const err = new AgentError('CLAUDE_ERROR', `startRun failed: ${e instanceof Error ? e.message : String(e)}`, {
321
+ ...(e instanceof Error ? { cause: e } : {}),
322
+ context: { turnId, sessionId: this._sessionId },
323
+ });
324
+ ctrl.fail(err);
325
+ this._safeFire('onError', () => this.options.hooks?.onError?.(err));
326
+ this._endTurn();
327
+ });
328
+ return ctrl.handle;
329
+ }
330
+ /**
331
+ * Cancel the in-flight prompt (and, when v1.x queueing lands, the queued
332
+ * prompts too). v0.1: same effect as `handle.cancel()` for the current
333
+ * turn. Safe to call when no turn is active (no-op).
334
+ */
335
+ async cancelAll() {
336
+ if (!this._currentTurn)
337
+ return;
338
+ await this._currentTurn.controller.handle.cancel();
339
+ }
340
+ /** Step 1.4.8 will implement fork via v0.20 session.fork + resumeSession. */
341
+ async fork() {
342
+ throw new Error('NOT_IMPLEMENTED: fork() lands in Step 1.4.8 (depends on resumeSession)');
343
+ }
344
+ /**
345
+ * Structured output helper. Sends a prompt that asks Claude to return JSON
346
+ * matching the supplied zod schema. Parses + validates the result.
347
+ *
348
+ * v0.1: claude-only. Non-claude agents throw UNSUPPORTED_ON_AGENT (the
349
+ * agent registry doesn't expose JSON mode capability uniformly yet).
350
+ *
351
+ * The supplied schema must have a `.parse(input): T` method (zod-compatible
352
+ * structural interface — works with zod v3 + v4).
353
+ */
354
+ async promptJson(text, schema, opts) {
355
+ if (!schema || typeof schema.parse !== 'function') {
356
+ throw new AgentError('CLAUDE_ERROR', 'promptJson schema must expose a .parse(input) method (e.g. zod schema)');
357
+ }
358
+ // v1: claude-only. v1.1+ will route via agent registry capabilities.
359
+ const wrappedPrompt = `${text}\n\nReply with ONLY a JSON object matching the requested schema. No prose, no fences.`;
360
+ const handle = this.prompt(wrappedPrompt, opts);
361
+ const result = await handle.result;
362
+ let parsed;
363
+ try {
364
+ parsed = JSON.parse(result.text.trim());
365
+ }
366
+ catch (e) {
367
+ throw new AgentError('CLAUDE_ERROR', `promptJson: response was not valid JSON: ${e instanceof Error ? e.message : String(e)}`, {
368
+ ...(e instanceof Error ? { cause: e } : {}),
369
+ context: { text: result.text.slice(0, 200) },
370
+ });
371
+ }
372
+ try {
373
+ return schema.parse(parsed);
374
+ }
375
+ catch (e) {
376
+ throw new AgentError('CLAUDE_ERROR', `promptJson: schema validation failed: ${e instanceof Error ? e.message : String(e)}`, {
377
+ ...(e instanceof Error ? { cause: e } : {}),
378
+ context: { parsed },
379
+ });
380
+ }
381
+ }
382
+ /** Cumulative token + cost usage across all turns settled so far. */
383
+ usage() {
384
+ // Return a copy so callers can't mutate internal state.
385
+ return { ...this._cumUsage };
386
+ }
387
+ // ─── Static methods ──────────────────────────────────
388
+ /**
389
+ * Detect runtime prerequisites: local `claude` CLI binary, the
390
+ * `claude-agent-acp` shim, and the active auth mode.
391
+ * Step 1.4.8 ships best-effort detection; refined in v0.2 with
392
+ * shim version detection.
393
+ */
394
+ static async checkRuntime() {
395
+ const { execFileSync } = await import('node:child_process');
396
+ const { existsSync } = await import('node:fs');
397
+ const { homedir } = await import('node:os');
398
+ const { resolve } = await import('node:path');
399
+ const probeBinary = (name) => {
400
+ try {
401
+ const path = execFileSync('which', [name], { encoding: 'utf-8' }).trim();
402
+ return path.length > 0 ? { ok: true, path } : { ok: false };
403
+ }
404
+ catch {
405
+ return { ok: false };
406
+ }
407
+ };
408
+ const claudeBinary = probeBinary('claude');
409
+ const shim = probeBinary('claude-agent-acp');
410
+ const authPath = resolve(homedir(), '.claude', '.credentials.json');
411
+ let authMode = 'none';
412
+ if (process.env.ANTHROPIC_API_KEY) {
413
+ authMode = 'env_api_key';
414
+ }
415
+ else if (existsSync(authPath)) {
416
+ authMode = 'oauth_subscription';
417
+ }
418
+ return {
419
+ claudeBinary: claudeBinary.ok
420
+ ? { ok: true, ...(claudeBinary.path ? { path: claudeBinary.path } : {}) }
421
+ : { ok: false },
422
+ shim: shim.ok
423
+ ? { ok: true, mode: 'global', ...(shim.path ? { path: shim.path } : {}) }
424
+ : { ok: false, mode: 'npx' },
425
+ auth: { mode: authMode },
426
+ };
427
+ }
428
+ /** Resume an existing session by id. Deferred to v1.1 — requires the
429
+ * AcpSdkAdapter to expose a `loadSession` method against the shim's
430
+ * v0.20 loadSession capability. */
431
+ static async resumeSession(_sessionId, _options) {
432
+ throw new AgentError('UNSUPPORTED_ON_AGENT', 'resumeSession() is reserved for v1.1 (needs AcpSdkAdapter.loadSession wiring)');
433
+ }
434
+ /** Replay a session from a recording file. Minimal v0.1 implementation
435
+ * reads the jsonl; full hook-divergence validation (REPLAY_MISMATCH)
436
+ * lands in v0.2 once the public agent surface supports replay-driven
437
+ * hook injection. */
438
+ static async replay(_recordingPath, _options) {
439
+ throw new AgentError('UNSUPPORTED_ON_AGENT', 'replay() returns a real ClaudeCodeAgent only in v0.2; for now use new RecordingReplayer(path) directly');
440
+ }
441
+ // ─── Private helpers ─────────────────────────────────
442
+ /** Map public permission mode to internal hooks/permissions PermissionMode.
443
+ * 'manual' currently maps to 'deny-all' — Step 1.4.5 will properly route
444
+ * through onPermissionRequest hook instead. */
445
+ _mapPermissionMode(mode) {
446
+ switch (mode) {
447
+ case 'auto':
448
+ return 'approve-all';
449
+ case 'readonly':
450
+ return 'approve-reads';
451
+ case 'manual':
452
+ // TODO 1.4.5: route through hooks.onPermissionRequest. Until then
453
+ // 'deny-all' is the safe default (callers without the hook want
454
+ // safety; callers with the hook will get the proper wiring soon).
455
+ return 'deny-all';
456
+ }
457
+ }
458
+ /** Wrap an AcpSdkAdapter error into the appropriate AgentError code.
459
+ * Best-effort string matching; refinement lives in Step 1.4.5 when we
460
+ * surface structured errors from the adapter. */
461
+ _wrapStartError(e) {
462
+ if (e instanceof AgentError)
463
+ return e;
464
+ const msg = e instanceof Error ? e.message : String(e);
465
+ const cause = e instanceof Error ? e : new Error(String(e));
466
+ // Heuristic mapping. Replaceable when adapter exposes typed errors.
467
+ const lowered = msg.toLowerCase();
468
+ let code = 'SESSION_FAILED';
469
+ if (lowered.includes('spawn') && lowered.includes('timeout')) {
470
+ code = 'SPAWN_TIMEOUT';
471
+ }
472
+ else if (lowered.includes('spawn') || lowered.includes('enoent')) {
473
+ code = 'SPAWN_FAILED';
474
+ }
475
+ else if (lowered.includes('initialize')) {
476
+ code = 'INIT_FAILED';
477
+ }
478
+ else if (lowered.includes('auth') || lowered.includes('credentials')) {
479
+ code = 'AUTH_ERROR';
480
+ }
481
+ else if (lowered.includes('protocol') || lowered.includes('json-rpc')) {
482
+ code = 'PROTOCOL_ERROR';
483
+ }
484
+ return new AgentError(code, `Failed to start agent: ${msg}`, {
485
+ cause,
486
+ context: { sessionName: this._sessionName, cwd: this.options.cwd },
487
+ });
488
+ }
489
+ /** Accumulate turn usage into the cumulative session usage tally. */
490
+ _addUsage(delta) {
491
+ this._cumUsage.inputTokens += delta.inputTokens;
492
+ this._cumUsage.outputTokens += delta.outputTokens;
493
+ if (delta.cacheReadTokens !== undefined) {
494
+ this._cumUsage.cacheReadTokens =
495
+ (this._cumUsage.cacheReadTokens ?? 0) + delta.cacheReadTokens;
496
+ }
497
+ if (delta.cacheWriteTokens !== undefined) {
498
+ this._cumUsage.cacheWriteTokens =
499
+ (this._cumUsage.cacheWriteTokens ?? 0) + delta.cacheWriteTokens;
500
+ }
501
+ if (delta.estimatedCostUsd !== undefined) {
502
+ this._cumUsage.estimatedCostUsd =
503
+ (this._cumUsage.estimatedCostUsd ?? 0) + delta.estimatedCostUsd;
504
+ }
505
+ }
506
+ /** Tear down the current turn's subscription and reset status to ready. */
507
+ _endTurn() {
508
+ if (!this._currentTurn)
509
+ return;
510
+ try {
511
+ this._currentTurn.unsubscribe();
512
+ }
513
+ catch {
514
+ /* unsubscribe is best-effort */
515
+ }
516
+ this._currentTurn = null;
517
+ if (this._status === 'busy')
518
+ this._status = 'ready';
519
+ }
520
+ /** Map accumulator stopReason string to PromptResult stopReason union. */
521
+ _mapStopReason(s) {
522
+ switch (s) {
523
+ case 'end_turn':
524
+ return 'end_turn';
525
+ case 'cancelled':
526
+ return 'cancelled';
527
+ case 'max_tokens':
528
+ return 'max_tokens';
529
+ default:
530
+ return 'error';
531
+ }
532
+ }
533
+ /** Convert pre-parsed AccumulatorEvent back to a raw-SDK-shape SessionUpdate.
534
+ * prompt-handle.ts uses raw SDK shape so consumers see ACP-native fields.
535
+ * Returns null if the event has no SessionUpdate analogue (e.g. complete). */
536
+ _accumulatorToSessionUpdate(event) {
537
+ switch (event.type) {
538
+ case 'text':
539
+ return {
540
+ sessionUpdate: 'agent_message_chunk',
541
+ content: { type: 'text', text: event.text },
542
+ };
543
+ case 'tool_use':
544
+ return {
545
+ sessionUpdate: 'tool_call',
546
+ toolCallId: event.id,
547
+ title: event.title,
548
+ kind: event.kind,
549
+ status: event.status,
550
+ };
551
+ case 'tool_update':
552
+ return {
553
+ sessionUpdate: 'tool_call_update',
554
+ toolCallId: event.id,
555
+ status: event.status,
556
+ };
557
+ case 'usage':
558
+ return {
559
+ sessionUpdate: 'usage_update',
560
+ used: event.used,
561
+ size: event.size,
562
+ };
563
+ case 'complete':
564
+ return null;
565
+ }
566
+ }
567
+ /** Run a hook callback and swallow any throw so a misbehaving hook never
568
+ * poisons the lifecycle contract. Hook errors get logged. */
569
+ _safeFire(name, fn) {
570
+ try {
571
+ fn();
572
+ }
573
+ catch (e) {
574
+ this._log('warn', `Hook ${name} threw: ${e instanceof Error ? e.message : String(e)}`);
575
+ }
576
+ }
577
+ _log(level, msg) {
578
+ if (this.options.logger) {
579
+ this.options.logger(level, msg);
580
+ }
581
+ else if (level !== 'info') {
582
+ process.stderr.write(`[claude-code-agent] ${level}: ${msg}\n`);
583
+ }
584
+ }
585
+ // Reserved for Step 1.4.4-1.4.8 (avoid unused-var noise during scaffolding)
586
+ _DEFAULTS = {
587
+ spawnTimeoutMs: DEFAULT_SPAWN_TIMEOUT_MS,
588
+ elicitationTimeoutMs: DEFAULT_ELICITATION_TIMEOUT_MS,
589
+ maxQueueLength: DEFAULT_MAX_QUEUE_LENGTH,
590
+ };
591
+ }
592
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * AgentError + error codes — single error class for all failure modes
3
+ * across spawn, transport, session, prompt, recording, replay, and auth.
4
+ *
5
+ * Spec: vision doc §3 (Error Model). Total 18 codes (initial 16 + spike-added
6
+ * REPLAY_MISMATCH / REPLAY_EOF for v0.1 Recording feature).
7
+ */
8
+ /** All possible failure modes the agent surfaces to callers. */
9
+ export type AgentErrorCode = 'SPAWN_FAILED' | 'SPAWN_TIMEOUT' | 'INIT_FAILED' | 'PROTOCOL_ERROR' | 'SESSION_FAILED' | 'SESSION_LOST' | 'PROMPT_TIMEOUT' | 'PROMPT_CANCELLED' | 'QUEUE_FULL' | 'BUSY' | 'ELICITATION_TIMEOUT' | 'CLAUDE_ERROR' | 'AUTH_ERROR' | 'SHIM_DIED' | 'CALL_AFTER_STOP' | 'UNSUPPORTED_ON_AGENT' | 'REPLAY_MISMATCH' | 'REPLAY_EOF';
10
+ /** Standardized error for all agent operations. */
11
+ export declare class AgentError extends Error {
12
+ readonly code: AgentErrorCode;
13
+ /** Original error captured at the failure site, if any. */
14
+ readonly cause?: Error;
15
+ /** Debug context: pid, sessionId, turnId, lastUpdate, etc. */
16
+ readonly context?: Record<string, unknown>;
17
+ /** Actionable fix guidance — auto-populated for AUTH_ERROR (calls checkRuntime). */
18
+ readonly diagnostic?: string;
19
+ constructor(code: AgentErrorCode, message: string, options?: {
20
+ cause?: Error;
21
+ context?: Record<string, unknown>;
22
+ diagnostic?: string;
23
+ });
24
+ }
25
+ /** Type-narrowing helper for callers handling errors. */
26
+ export declare function isAgentError(err: unknown): err is AgentError;
27
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,gEAAgE;AAChE,MAAM,MAAM,cAAc,GAEtB,cAAc,GACd,eAAe,GAGf,aAAa,GACb,gBAAgB,GAGhB,gBAAgB,GAChB,cAAc,GAGd,gBAAgB,GAChB,kBAAkB,GAClB,YAAY,GACZ,MAAM,GACN,qBAAqB,GAGrB,cAAc,GACd,YAAY,GACZ,WAAW,GAGX,iBAAiB,GAGjB,sBAAsB,GAGtB,iBAAiB,GACjB,YAAY,CAAC;AAEjB,mDAAmD;AACnD,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,oFAAoF;IACpF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAG3B,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;CASJ;AAED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,UAAU,CAE5D"}