@scottwalker/claude-connector 0.2.0 → 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.
Files changed (51) hide show
  1. package/README.md +77 -20
  2. package/dist/builder/args-builder.d.ts +2 -1
  3. package/dist/builder/args-builder.d.ts.map +1 -1
  4. package/dist/builder/args-builder.js +38 -31
  5. package/dist/builder/args-builder.js.map +1 -1
  6. package/dist/client/chat-handle.d.ts +115 -0
  7. package/dist/client/chat-handle.d.ts.map +1 -0
  8. package/dist/client/chat-handle.js +246 -0
  9. package/dist/client/chat-handle.js.map +1 -0
  10. package/dist/client/claude.d.ts +51 -53
  11. package/dist/client/claude.d.ts.map +1 -1
  12. package/dist/client/claude.js +72 -45
  13. package/dist/client/claude.js.map +1 -1
  14. package/dist/client/session.d.ts +4 -2
  15. package/dist/client/session.d.ts.map +1 -1
  16. package/dist/client/session.js +19 -12
  17. package/dist/client/session.js.map +1 -1
  18. package/dist/client/stream-handle.d.ts +99 -0
  19. package/dist/client/stream-handle.d.ts.map +1 -0
  20. package/dist/client/stream-handle.js +158 -0
  21. package/dist/client/stream-handle.js.map +1 -0
  22. package/dist/constants.d.ts +116 -0
  23. package/dist/constants.d.ts.map +1 -0
  24. package/dist/constants.js +160 -0
  25. package/dist/constants.js.map +1 -0
  26. package/dist/errors/errors.d.ts.map +1 -1
  27. package/dist/errors/errors.js +7 -6
  28. package/dist/errors/errors.js.map +1 -1
  29. package/dist/executor/cli-executor.d.ts.map +1 -1
  30. package/dist/executor/cli-executor.js +7 -11
  31. package/dist/executor/cli-executor.js.map +1 -1
  32. package/dist/executor/sdk-executor.d.ts +5 -4
  33. package/dist/executor/sdk-executor.d.ts.map +1 -1
  34. package/dist/executor/sdk-executor.js +33 -38
  35. package/dist/executor/sdk-executor.js.map +1 -1
  36. package/dist/index.d.ts +3 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +18 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/parser/json-parser.d.ts.map +1 -1
  41. package/dist/parser/json-parser.js +20 -19
  42. package/dist/parser/json-parser.js.map +1 -1
  43. package/dist/parser/stream-parser.d.ts.map +1 -1
  44. package/dist/parser/stream-parser.js +26 -25
  45. package/dist/parser/stream-parser.js.map +1 -1
  46. package/dist/scheduler/scheduler.js +6 -11
  47. package/dist/scheduler/scheduler.js.map +1 -1
  48. package/dist/utils/validation.d.ts.map +1 -1
  49. package/dist/utils/validation.js +5 -6
  50. package/dist/utils/validation.js.map +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1,246 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { Readable, Duplex } from 'node:stream';
3
+ import { parseStreamLine } from '../parser/stream-parser.js';
4
+ import { EVENT_TEXT, EVENT_TOOL_USE, EVENT_RESULT, EVENT_ERROR, EVENT_SYSTEM, CHAT_USER_MESSAGE, SIGNAL_SIGTERM, } from '../constants.js';
5
+ /**
6
+ * Bidirectional streaming handle for real-time conversation.
7
+ *
8
+ * Uses `--input-format stream-json` to maintain a persistent CLI process.
9
+ * Send prompts with `.send()`, receive responses via callbacks or Node.js streams.
10
+ *
11
+ * ## Fluent callbacks
12
+ *
13
+ * ```ts
14
+ * const chat = claude.chat()
15
+ * .on('text', (text) => process.stdout.write(text))
16
+ * .on('result', (event) => console.log('Turn done'))
17
+ *
18
+ * await chat.send('What files are in src?')
19
+ * await chat.send('Fix the largest one')
20
+ * chat.end()
21
+ * ```
22
+ *
23
+ * ## Node.js Duplex stream
24
+ *
25
+ * ```ts
26
+ * const duplex = claude.chat().toDuplex()
27
+ * inputStream.pipe(duplex).pipe(process.stdout)
28
+ * ```
29
+ */
30
+ export class ChatHandle {
31
+ child;
32
+ textCallbacks = [];
33
+ toolUseCallbacks = [];
34
+ resultCallbacks = [];
35
+ errorCallbacks = [];
36
+ systemCallbacks = [];
37
+ buffer = '';
38
+ _closed = false;
39
+ _sessionId = null;
40
+ _turnCount = 0;
41
+ constructor(executable, args, options) {
42
+ this.child = spawn(executable, args, {
43
+ cwd: options.cwd,
44
+ env: { ...process.env, ...options.env },
45
+ stdio: ['pipe', 'pipe', 'pipe'],
46
+ });
47
+ this.startReading();
48
+ }
49
+ /** Session ID (populated after the first result). */
50
+ get sessionId() {
51
+ return this._sessionId;
52
+ }
53
+ /** Number of completed turns. */
54
+ get turnCount() {
55
+ return this._turnCount;
56
+ }
57
+ /** Whether the chat has been closed. */
58
+ get closed() {
59
+ return this._closed;
60
+ }
61
+ on(type, callback) {
62
+ switch (type) {
63
+ case EVENT_TEXT:
64
+ this.textCallbacks.push(callback);
65
+ break;
66
+ case EVENT_TOOL_USE:
67
+ this.toolUseCallbacks.push(callback);
68
+ break;
69
+ case EVENT_RESULT:
70
+ this.resultCallbacks.push(callback);
71
+ break;
72
+ case EVENT_ERROR:
73
+ this.errorCallbacks.push(callback);
74
+ break;
75
+ case EVENT_SYSTEM:
76
+ this.systemCallbacks.push(callback);
77
+ break;
78
+ }
79
+ return this;
80
+ }
81
+ /**
82
+ * Send a prompt and wait for the complete response.
83
+ * Returns the result event when this turn finishes.
84
+ *
85
+ * ```ts
86
+ * const result = await chat.send('Find bugs in auth.ts')
87
+ * console.log(result.durationMs)
88
+ *
89
+ * const result2 = await chat.send('Now fix them')
90
+ * ```
91
+ */
92
+ send(prompt) {
93
+ if (this._closed) {
94
+ return Promise.reject(new Error('Chat is closed'));
95
+ }
96
+ const message = JSON.stringify({ type: CHAT_USER_MESSAGE, content: prompt });
97
+ this.child.stdin.write(message + '\n');
98
+ return new Promise((resolve, reject) => {
99
+ const onResult = (event) => {
100
+ const idx = this.resultCallbacks.indexOf(onResult);
101
+ if (idx >= 0)
102
+ this.resultCallbacks.splice(idx, 1);
103
+ resolve(event);
104
+ };
105
+ const onError = (event) => {
106
+ const idx = this.errorCallbacks.indexOf(onError);
107
+ if (idx >= 0)
108
+ this.errorCallbacks.splice(idx, 1);
109
+ reject(new Error(event.message));
110
+ };
111
+ this.resultCallbacks.push(onResult);
112
+ this.errorCallbacks.push(onError);
113
+ });
114
+ }
115
+ /**
116
+ * Pipe text output to a writable stream.
117
+ * Returns the destination for chaining (Node.js convention).
118
+ *
119
+ * ```ts
120
+ * chat.pipe(process.stdout)
121
+ * chat.pipe(fs.createWriteStream('log.txt'))
122
+ * ```
123
+ */
124
+ pipe(dest) {
125
+ this.textCallbacks.push((text) => dest.write(text));
126
+ return dest;
127
+ }
128
+ /**
129
+ * Get a Node.js Readable that emits text chunks.
130
+ *
131
+ * ```ts
132
+ * claude.chat().toReadable().pipe(res)
133
+ * ```
134
+ */
135
+ toReadable() {
136
+ const readable = new Readable({
137
+ encoding: 'utf-8',
138
+ read() { },
139
+ });
140
+ this.textCallbacks.push((text) => readable.push(text));
141
+ this.child.on('close', () => readable.push(null));
142
+ return readable;
143
+ }
144
+ /**
145
+ * Get a Node.js Duplex stream.
146
+ * Write side accepts prompts (one per write). Read side emits text.
147
+ *
148
+ * ```ts
149
+ * const duplex = claude.chat().toDuplex()
150
+ * inputStream.pipe(duplex).pipe(process.stdout)
151
+ * ```
152
+ */
153
+ toDuplex() {
154
+ const chat = this;
155
+ const duplex = new Duplex({
156
+ encoding: 'utf-8',
157
+ write(chunk, _encoding, callback) {
158
+ const prompt = chunk.toString().trim();
159
+ if (prompt) {
160
+ const message = JSON.stringify({ type: CHAT_USER_MESSAGE, content: prompt });
161
+ chat.child.stdin.write(message + '\n');
162
+ }
163
+ callback();
164
+ },
165
+ read() { },
166
+ });
167
+ this.textCallbacks.push((text) => duplex.push(text));
168
+ this.child.on('close', () => duplex.push(null));
169
+ return duplex;
170
+ }
171
+ /**
172
+ * Close the chat gracefully — signals EOF to the CLI process.
173
+ */
174
+ end() {
175
+ if (this._closed)
176
+ return;
177
+ this._closed = true;
178
+ if (this.child.stdin && !this.child.stdin.destroyed) {
179
+ this.child.stdin.end();
180
+ }
181
+ }
182
+ /**
183
+ * Abort the chat — kills the CLI process immediately.
184
+ */
185
+ abort() {
186
+ this._closed = true;
187
+ if (!this.child.killed) {
188
+ this.child.kill(SIGNAL_SIGTERM);
189
+ }
190
+ }
191
+ // ── Private ───────────────────────────────────────────────────────
192
+ startReading() {
193
+ this.child.stdout.on('data', (chunk) => {
194
+ this.buffer += chunk.toString('utf-8');
195
+ const lines = this.buffer.split('\n');
196
+ this.buffer = lines.pop() ?? '';
197
+ for (const line of lines) {
198
+ const trimmed = line.trim();
199
+ if (!trimmed)
200
+ continue;
201
+ const event = parseStreamLine(trimmed);
202
+ if (event) {
203
+ if (event.type === EVENT_RESULT) {
204
+ this._sessionId = event.sessionId || this._sessionId;
205
+ this._turnCount++;
206
+ }
207
+ this.dispatch(event);
208
+ }
209
+ }
210
+ });
211
+ // Flush remaining buffer on close
212
+ this.child.stdout.on('end', () => {
213
+ const trimmed = this.buffer.trim();
214
+ if (trimmed) {
215
+ const event = parseStreamLine(trimmed);
216
+ if (event)
217
+ this.dispatch(event);
218
+ }
219
+ });
220
+ }
221
+ dispatch(event) {
222
+ switch (event.type) {
223
+ case EVENT_TEXT:
224
+ for (const cb of this.textCallbacks)
225
+ cb(event.text);
226
+ break;
227
+ case EVENT_TOOL_USE:
228
+ for (const cb of this.toolUseCallbacks)
229
+ cb(event);
230
+ break;
231
+ case EVENT_RESULT:
232
+ for (const cb of this.resultCallbacks)
233
+ cb(event);
234
+ break;
235
+ case EVENT_ERROR:
236
+ for (const cb of this.errorCallbacks)
237
+ cb(event);
238
+ break;
239
+ case EVENT_SYSTEM:
240
+ for (const cb of this.systemCallbacks)
241
+ cb(event);
242
+ break;
243
+ }
244
+ }
245
+ }
246
+ //# sourceMappingURL=chat-handle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-handle.js","sourceRoot":"","sources":["../../src/client/chat-handle.ts"],"names":[],"mappings":"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"}
@@ -1,93 +1,92 @@
1
- import type { ClientOptions, QueryOptions, QueryResult, StreamEvent } from '../types/index.js';
1
+ import type { ClientOptions, QueryOptions, QueryResult } from '../types/index.js';
2
2
  import type { SessionOptions } from '../types/session.js';
3
3
  import type { IExecutor } from '../executor/interface.js';
4
4
  import { type InitStage } from '../executor/sdk-executor.js';
5
+ import { INIT_EVENT_STAGE, INIT_EVENT_READY, INIT_EVENT_ERROR } from '../constants.js';
5
6
  import { Session } from './session.js';
7
+ import { StreamHandle } from './stream-handle.js';
8
+ import { ChatHandle } from './chat-handle.js';
6
9
  import { type ScheduledJob } from '../scheduler/scheduler.js';
7
10
  /**
8
11
  * Main entry point for claude-connector.
9
12
  *
10
- * `Claude` is a **facade** that orchestrates the executor, argument builder,
11
- * and parsers behind a clean, minimal API.
12
- *
13
- * ## Execution modes
14
- *
15
- * - **CLI mode** (default): each query spawns a new `claude -p` process.
16
- * Simple, no warm-up needed, but slower for interactive use.
17
- *
18
- * - **SDK mode** (`useSdk: true`): creates a persistent session via the
19
- * Claude Agent SDK. First query requires warm-up (~5-10s), but subsequent
20
- * queries are near-instant. Best for interactive and high-throughput use.
21
- *
22
13
  * @example
23
14
  * ```ts
24
- * // CLI mode (default)
25
15
  * const claude = new Claude({ model: 'sonnet' })
16
+ * const result = await claude.query('Fix bugs')
26
17
  *
27
- * // SDK mode (persistent session, fast queries)
28
- * const claude = new Claude({ useSdk: true, model: 'sonnet' })
29
- * claude.on('init:stage', (stage, msg) => console.log(`[${stage}] ${msg}`))
30
- * await claude.init() // warm up once
31
- * const result = await claude.query('Fix bugs') // fast!
18
+ * // Streaming with fluent API
19
+ * await claude.stream('Explain auth.ts')
20
+ * .on('text', (t) => process.stdout.write(t))
21
+ * .done()
22
+ *
23
+ * // Bidirectional chat
24
+ * const chat = claude.chat()
25
+ * await chat.send('What files are in src?')
26
+ * await chat.send('Fix the largest one')
27
+ * chat.end()
32
28
  * ```
33
29
  */
34
30
  export declare class Claude {
35
- /** Frozen client-level options. */
36
31
  private readonly options;
37
- /** Executor responsible for running CLI commands. */
38
32
  private readonly executor;
39
- /** SdkExecutor reference (only when useSdk: true) for lifecycle control. */
40
33
  private readonly sdkExecutor;
41
34
  constructor(options?: ClientOptions, executor?: IExecutor);
42
35
  /**
43
36
  * Initialize the SDK session (warm up).
44
- *
45
37
  * Only needed when `useSdk: true`. In CLI mode this is a no-op.
46
- *
47
- * Subscribe to initialization events before calling:
48
- * ```ts
49
- * claude.on('init:stage', (stage, message) => {
50
- * console.log(`[${stage}] ${message}`)
51
- * })
52
- * claude.on('init:ready', () => console.log('Ready!'))
53
- * claude.on('init:error', (err) => console.error(err))
54
- *
55
- * await claude.init()
56
- * ```
57
- *
58
- * Safe to call multiple times — only initializes once.
59
38
  */
60
39
  init(): Promise<void>;
61
40
  /** Whether the SDK session is initialized and ready (always true for CLI mode). */
62
41
  get ready(): boolean;
63
42
  /**
64
43
  * Subscribe to initialization events.
65
- *
66
- * Events:
67
- * - `init:stage` `(stage: InitStage, message: string)` — progress updates
68
- * Stages: `'importing'` → `'creating'` → `'connecting'` → `'ready'`
69
- * - `init:ready` — session is warm and queries will be fast
70
- * - `init:error` `(error: Error)` — initialization failed
71
- *
72
- * Only meaningful when `useSdk: true`. In CLI mode, listeners are never called.
73
44
  */
74
- on(event: 'init:stage', listener: (stage: InitStage, message: string) => void): this;
75
- on(event: 'init:ready', listener: () => void): this;
76
- on(event: 'init:error', listener: (error: Error) => void): this;
45
+ on(event: typeof INIT_EVENT_STAGE, listener: (stage: InitStage, message: string) => void): this;
46
+ on(event: typeof INIT_EVENT_READY, listener: () => void): this;
47
+ on(event: typeof INIT_EVENT_ERROR, listener: (error: Error) => void): this;
77
48
  on(event: string, listener: (...args: never[]) => void): this;
78
49
  /**
79
50
  * Execute a one-shot query and return the complete result.
80
- *
81
- * In SDK mode, auto-initializes if `init()` hasn't been called yet.
82
51
  */
83
52
  query(prompt: string, options?: QueryOptions): Promise<QueryResult>;
84
53
  /**
85
54
  * Execute a query with streaming response.
55
+ * Returns a {@link StreamHandle} with fluent callbacks, Node.js stream support,
56
+ * and backward-compatible async iteration.
86
57
  *
87
- * Returns an async iterable that yields events as they arrive.
88
- * The final event is always `type: 'result'` or `type: 'error'`.
58
+ * ```ts
59
+ * // Fluent
60
+ * await claude.stream('Fix bugs').on('text', t => process.stdout.write(t)).done()
61
+ *
62
+ * // Collect text
63
+ * const text = await claude.stream('Summarize').text()
64
+ *
65
+ * // Pipe
66
+ * const result = await claude.stream('Explain').pipe(process.stdout)
67
+ *
68
+ * // Node.js Readable
69
+ * claude.stream('Generate').toReadable().pipe(createWriteStream('out.txt'))
70
+ *
71
+ * // Raw iteration (backward compat)
72
+ * for await (const event of claude.stream('Analyze')) { ... }
73
+ * ```
89
74
  */
90
- stream(prompt: string, options?: QueryOptions): AsyncIterable<StreamEvent>;
75
+ stream(prompt: string, options?: QueryOptions): StreamHandle;
76
+ /**
77
+ * Open a bidirectional chat — a persistent CLI process for real-time conversation.
78
+ * Uses `--input-format stream-json` for multi-turn dialogue over a single process.
79
+ *
80
+ * ```ts
81
+ * const chat = claude.chat()
82
+ * .on('text', (t) => process.stdout.write(t))
83
+ *
84
+ * await chat.send('What files are in src?')
85
+ * await chat.send('Now fix the bugs')
86
+ * chat.end()
87
+ * ```
88
+ */
89
+ chat(options?: QueryOptions): ChatHandle;
91
90
  /**
92
91
  * Create a session for multi-turn conversation.
93
92
  */
@@ -109,7 +108,6 @@ export declare class Claude {
109
108
  abort(): void;
110
109
  /**
111
110
  * Close the SDK session and free resources.
112
- * Only needed when `useSdk: true`. In CLI mode this is a no-op.
113
111
  */
114
112
  close(): void;
115
113
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/client/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAe,KAAK,SAAS,EAA2B,MAAM,6BAA6B,CAAC;AAGnG,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,MAAM;IACjB,mCAAmC;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAElD,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IAErC,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;gBAE5C,OAAO,GAAE,aAAkB,EAAE,QAAQ,CAAC,EAAE,SAAS;IA2B7D;;;;;;;;;;;;;;;;;OAiBG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,mFAAmF;IACnF,IAAI,KAAK,IAAI,OAAO,CAGnB;IAED;;;;;;;;;;OAUG;IACH,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IACpF,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IACnD,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAC/D,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,IAAI;IAQ7D;;;;OAIG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAmBzE;;;;;OAKG;IACI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC;IAmBjF;;OAEG;IACH,OAAO,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO;IAIjD;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY;IAKrF;;OAEG;IACG,QAAQ,CACZ,OAAO,EAAE,SAAS;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,YAAY,CAAA;KAAE,EAAE,GAC7D,OAAO,CAAC,WAAW,EAAE,CAAC;IAMzB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,WAAW,IAAI,SAAS;CAGzB"}
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/client/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAe,MAAM,mBAAmB,CAAC;AAC/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAe,KAAK,SAAS,EAA2B,MAAM,6BAA6B,CAAC;AAGnG,OAAO,EAIL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;gBAE5C,OAAO,GAAE,aAAkB,EAAE,QAAQ,CAAC,EAAE,SAAS;IA2B7D;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,mFAAmF;IACnF,IAAI,KAAK,IAAI,OAAO,CAGnB;IAED;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,OAAO,gBAAgB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAC/F,EAAE,CAAC,KAAK,EAAE,OAAO,gBAAgB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAC9D,EAAE,CAAC,KAAK,EAAE,OAAO,gBAAgB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAC1E,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,IAAI;IAQ7D;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAmBzE;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY;IAsB5D;;;;;;;;;;;;OAYG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,UAAU;IAwBxC;;OAEG;IACH,OAAO,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO;IAIjD;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY;IAKrF;;OAEG;IACG,QAAQ,CACZ,OAAO,EAAE,SAAS;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,YAAY,CAAA;KAAE,EAAE,GAC7D,OAAO,CAAC,WAAW,EAAE,CAAC;IAMzB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,WAAW,IAAI,SAAS;CAGzB"}
@@ -2,46 +2,39 @@ import { CliExecutor } from '../executor/cli-executor.js';
2
2
  import { SdkExecutor } from '../executor/sdk-executor.js';
3
3
  import { buildArgs, mergeOptions, resolveEnv } from '../builder/args-builder.js';
4
4
  import { validateClientOptions, validateQueryOptions, validatePrompt } from '../utils/validation.js';
5
+ import { FORMAT_JSON, FORMAT_STREAM_JSON, DEFAULT_EXECUTABLE, } from '../constants.js';
5
6
  import { Session } from './session.js';
7
+ import { StreamHandle } from './stream-handle.js';
8
+ import { ChatHandle } from './chat-handle.js';
6
9
  import { Scheduler } from '../scheduler/scheduler.js';
7
10
  /**
8
11
  * Main entry point for claude-connector.
9
12
  *
10
- * `Claude` is a **facade** that orchestrates the executor, argument builder,
11
- * and parsers behind a clean, minimal API.
12
- *
13
- * ## Execution modes
14
- *
15
- * - **CLI mode** (default): each query spawns a new `claude -p` process.
16
- * Simple, no warm-up needed, but slower for interactive use.
17
- *
18
- * - **SDK mode** (`useSdk: true`): creates a persistent session via the
19
- * Claude Agent SDK. First query requires warm-up (~5-10s), but subsequent
20
- * queries are near-instant. Best for interactive and high-throughput use.
21
- *
22
13
  * @example
23
14
  * ```ts
24
- * // CLI mode (default)
25
15
  * const claude = new Claude({ model: 'sonnet' })
16
+ * const result = await claude.query('Fix bugs')
17
+ *
18
+ * // Streaming with fluent API
19
+ * await claude.stream('Explain auth.ts')
20
+ * .on('text', (t) => process.stdout.write(t))
21
+ * .done()
26
22
  *
27
- * // SDK mode (persistent session, fast queries)
28
- * const claude = new Claude({ useSdk: true, model: 'sonnet' })
29
- * claude.on('init:stage', (stage, msg) => console.log(`[${stage}] ${msg}`))
30
- * await claude.init() // warm up once
31
- * const result = await claude.query('Fix bugs') // fast!
23
+ * // Bidirectional chat
24
+ * const chat = claude.chat()
25
+ * await chat.send('What files are in src?')
26
+ * await chat.send('Fix the largest one')
27
+ * chat.end()
32
28
  * ```
33
29
  */
34
30
  export class Claude {
35
- /** Frozen client-level options. */
36
31
  options;
37
- /** Executor responsible for running CLI commands. */
38
32
  executor;
39
- /** SdkExecutor reference (only when useSdk: true) for lifecycle control. */
40
33
  sdkExecutor = null;
41
34
  constructor(options = {}, executor) {
42
35
  validateClientOptions(options);
43
36
  this.options = Object.freeze({ ...options });
44
- const useSdk = options.useSdk !== false; // default: true
37
+ const useSdk = options.useSdk !== false;
45
38
  if (executor) {
46
39
  this.executor = executor;
47
40
  }
@@ -66,21 +59,7 @@ export class Claude {
66
59
  }
67
60
  /**
68
61
  * Initialize the SDK session (warm up).
69
- *
70
62
  * Only needed when `useSdk: true`. In CLI mode this is a no-op.
71
- *
72
- * Subscribe to initialization events before calling:
73
- * ```ts
74
- * claude.on('init:stage', (stage, message) => {
75
- * console.log(`[${stage}] ${message}`)
76
- * })
77
- * claude.on('init:ready', () => console.log('Ready!'))
78
- * claude.on('init:error', (err) => console.error(err))
79
- *
80
- * await claude.init()
81
- * ```
82
- *
83
- * Safe to call multiple times — only initializes once.
84
63
  */
85
64
  async init() {
86
65
  if (this.sdkExecutor) {
@@ -101,8 +80,6 @@ export class Claude {
101
80
  }
102
81
  /**
103
82
  * Execute a one-shot query and return the complete result.
104
- *
105
- * In SDK mode, auto-initializes if `init()` hasn't been called yet.
106
83
  */
107
84
  async query(prompt, options) {
108
85
  validatePrompt(prompt);
@@ -110,7 +87,7 @@ export class Claude {
110
87
  validateQueryOptions(options);
111
88
  const resolved = mergeOptions(this.options, options, {
112
89
  prompt,
113
- outputFormat: 'json',
90
+ outputFormat: FORMAT_JSON,
114
91
  });
115
92
  const args = buildArgs(resolved);
116
93
  const env = resolveEnv(this.options, options);
@@ -123,25 +100,76 @@ export class Claude {
123
100
  }
124
101
  /**
125
102
  * Execute a query with streaming response.
103
+ * Returns a {@link StreamHandle} with fluent callbacks, Node.js stream support,
104
+ * and backward-compatible async iteration.
105
+ *
106
+ * ```ts
107
+ * // Fluent
108
+ * await claude.stream('Fix bugs').on('text', t => process.stdout.write(t)).done()
109
+ *
110
+ * // Collect text
111
+ * const text = await claude.stream('Summarize').text()
112
+ *
113
+ * // Pipe
114
+ * const result = await claude.stream('Explain').pipe(process.stdout)
115
+ *
116
+ * // Node.js Readable
117
+ * claude.stream('Generate').toReadable().pipe(createWriteStream('out.txt'))
126
118
  *
127
- * Returns an async iterable that yields events as they arrive.
128
- * The final event is always `type: 'result'` or `type: 'error'`.
119
+ * // Raw iteration (backward compat)
120
+ * for await (const event of claude.stream('Analyze')) { ... }
121
+ * ```
129
122
  */
130
- async *stream(prompt, options) {
123
+ stream(prompt, options) {
131
124
  validatePrompt(prompt);
132
125
  if (options)
133
126
  validateQueryOptions(options);
134
127
  const resolved = mergeOptions(this.options, options, {
135
128
  prompt,
136
- outputFormat: 'stream-json',
129
+ outputFormat: FORMAT_STREAM_JSON,
137
130
  });
138
131
  const args = buildArgs(resolved);
139
132
  const env = resolveEnv(this.options, options);
140
- yield* this.executor.stream(args, {
133
+ const executor = this.executor;
134
+ const execOpts = {
141
135
  cwd: resolved.cwd,
142
136
  env,
143
137
  input: options?.input,
144
138
  systemPrompt: resolved.systemPrompt,
139
+ };
140
+ return new StreamHandle(() => executor.stream(args, execOpts));
141
+ }
142
+ /**
143
+ * Open a bidirectional chat — a persistent CLI process for real-time conversation.
144
+ * Uses `--input-format stream-json` for multi-turn dialogue over a single process.
145
+ *
146
+ * ```ts
147
+ * const chat = claude.chat()
148
+ * .on('text', (t) => process.stdout.write(t))
149
+ *
150
+ * await chat.send('What files are in src?')
151
+ * await chat.send('Now fix the bugs')
152
+ * chat.end()
153
+ * ```
154
+ */
155
+ chat(options) {
156
+ if (options)
157
+ validateQueryOptions(options);
158
+ const resolved = mergeOptions(this.options, options, {
159
+ prompt: undefined,
160
+ outputFormat: FORMAT_STREAM_JSON,
161
+ });
162
+ // Override: chat mode uses bidirectional stream-json
163
+ const args = buildArgs({
164
+ ...resolved,
165
+ prompt: undefined,
166
+ inputFormat: FORMAT_STREAM_JSON,
167
+ });
168
+ const env = resolveEnv(this.options, options);
169
+ const executable = this.options.executable ?? DEFAULT_EXECUTABLE;
170
+ return new ChatHandle(executable, args, {
171
+ cwd: resolved.cwd,
172
+ env: { ...process.env, ...env },
145
173
  });
146
174
  }
147
175
  /**
@@ -171,7 +199,6 @@ export class Claude {
171
199
  }
172
200
  /**
173
201
  * Close the SDK session and free resources.
174
- * Only needed when `useSdk: true`. In CLI mode this is a no-op.
175
202
  */
176
203
  close() {
177
204
  if (this.sdkExecutor) {
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/client/claude.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/client/claude.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
- import type { ClientOptions, QueryOptions, QueryResult, StreamEvent } from '../types/index.js';
1
+ import type { ClientOptions, QueryOptions, QueryResult } from '../types/index.js';
2
2
  import type { SessionOptions } from '../types/session.js';
3
3
  import type { IExecutor } from '../executor/interface.js';
4
+ import { StreamHandle } from './stream-handle.js';
4
5
  /**
5
6
  * A stateful conversation session.
6
7
  *
@@ -52,8 +53,9 @@ export declare class Session {
52
53
  query(prompt: string, options?: QueryOptions): Promise<QueryResult>;
53
54
  /**
54
55
  * Send a query with streaming response within this session.
56
+ * Returns a {@link StreamHandle} with fluent callbacks and Node.js stream support.
55
57
  */
56
- stream(prompt: string, options?: QueryOptions): AsyncIterable<StreamEvent>;
58
+ stream(prompt: string, options?: QueryOptions): StreamHandle;
57
59
  /**
58
60
  * Abort the current running query in this session.
59
61
  */
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAI1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAEhD,6DAA6D;IAC7D,OAAO,CAAC,UAAU,CAAgB;IAElC,kDAAkD;IAClD,OAAO,CAAC,WAAW,CAAK;gBAGtB,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,EACtC,QAAQ,EAAE,SAAS,EACnB,cAAc,GAAE,cAAmB;IAQrC,iEAAiE;IACjE,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAED,yCAAyC;IACzC,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;;;OAIG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAsBzE;;OAEG;IACI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC;IAyBjF;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,kBAAkB;CAM3B"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAe,MAAM,mBAAmB,CAAC;AAC/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAI1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAEhD,6DAA6D;IAC7D,OAAO,CAAC,UAAU,CAAgB;IAElC,kDAAkD;IAClD,OAAO,CAAC,WAAW,CAAK;gBAGtB,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,EACtC,QAAQ,EAAE,SAAS,EACnB,cAAc,GAAE,cAAmB;IAQrC,iEAAiE;IACjE,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAED,yCAAyC;IACzC,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;;;OAIG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAsBzE;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY;IA8B5D;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,kBAAkB;CAM3B"}