@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.
- package/README.md +77 -20
- package/dist/builder/args-builder.d.ts +2 -1
- package/dist/builder/args-builder.d.ts.map +1 -1
- package/dist/builder/args-builder.js +38 -31
- package/dist/builder/args-builder.js.map +1 -1
- package/dist/client/chat-handle.d.ts +115 -0
- package/dist/client/chat-handle.d.ts.map +1 -0
- package/dist/client/chat-handle.js +246 -0
- package/dist/client/chat-handle.js.map +1 -0
- package/dist/client/claude.d.ts +51 -53
- package/dist/client/claude.d.ts.map +1 -1
- package/dist/client/claude.js +72 -45
- package/dist/client/claude.js.map +1 -1
- package/dist/client/session.d.ts +4 -2
- package/dist/client/session.d.ts.map +1 -1
- package/dist/client/session.js +19 -12
- package/dist/client/session.js.map +1 -1
- package/dist/client/stream-handle.d.ts +99 -0
- package/dist/client/stream-handle.d.ts.map +1 -0
- package/dist/client/stream-handle.js +158 -0
- package/dist/client/stream-handle.js.map +1 -0
- package/dist/constants.d.ts +116 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +160 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors/errors.d.ts.map +1 -1
- package/dist/errors/errors.js +7 -6
- package/dist/errors/errors.js.map +1 -1
- package/dist/executor/cli-executor.d.ts.map +1 -1
- package/dist/executor/cli-executor.js +7 -11
- package/dist/executor/cli-executor.js.map +1 -1
- package/dist/executor/sdk-executor.d.ts +5 -4
- package/dist/executor/sdk-executor.d.ts.map +1 -1
- package/dist/executor/sdk-executor.js +33 -38
- package/dist/executor/sdk-executor.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/dist/parser/json-parser.d.ts.map +1 -1
- package/dist/parser/json-parser.js +20 -19
- package/dist/parser/json-parser.js.map +1 -1
- package/dist/parser/stream-parser.d.ts.map +1 -1
- package/dist/parser/stream-parser.js +26 -25
- package/dist/parser/stream-parser.js.map +1 -1
- package/dist/scheduler/scheduler.js +6 -11
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +5 -6
- package/dist/utils/validation.js.map +1 -1
- 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":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EACL,UAAU,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,cAAc,GACf,MAAM,iBAAiB,CAAC;AAezB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,OAAO,UAAU;IACJ,KAAK,CAAe;IACpB,aAAa,GAAmB,EAAE,CAAC;IACnC,gBAAgB,GAAsB,EAAE,CAAC;IACzC,eAAe,GAAqB,EAAE,CAAC;IACvC,cAAc,GAAoB,EAAE,CAAC;IACrC,eAAe,GAAqB,EAAE,CAAC;IAEhD,MAAM,GAAG,EAAE,CAAC;IACZ,OAAO,GAAG,KAAK,CAAC;IAChB,UAAU,GAAkB,IAAI,CAAC;IACjC,UAAU,GAAG,CAAC,CAAC;IAEvB,YACE,UAAkB,EAClB,IAAuB,EACvB,OAAqD;QAErD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,IAAgB,EAAE;YAC/C,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;YACvC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,qDAAqD;IACrD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,iCAAiC;IACjC,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,wCAAwC;IACxC,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAUD,EAAE,CAAC,IAAY,EAAE,QAAoC;QACnD,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,UAAU;gBAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAwB,CAAC,CAAC;gBAAC,MAAM;YAC1E,KAAK,cAAc;gBAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAA2B,CAAC,CAAC;gBAAC,MAAM;YACpF,KAAK,YAAY;gBAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAA0B,CAAC,CAAC;gBAAC,MAAM;YAChF,KAAK,WAAW;gBAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAyB,CAAC,CAAC;gBAAC,MAAM;YAC7E,KAAK,YAAY;gBAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAA0B,CAAC,CAAC;gBAAC,MAAM;QAClF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACH,IAAI,CAAC,MAAc;QACjB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,KAAK,CAAC,KAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAExC,OAAO,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxD,MAAM,QAAQ,GAAG,CAAC,KAAwB,EAAE,EAAE;gBAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACnD,IAAI,GAAG,IAAI,CAAC;oBAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAClD,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC;YACF,MAAM,OAAO,GAAG,CAAC,KAAuB,EAAE,EAAE;gBAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACjD,IAAI,GAAG,IAAI,CAAC;oBAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACjD,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACnC,CAAC,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,IAAI,CAAkC,IAAO;QAC3C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACH,UAAU;QACR,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC;YAC5B,QAAQ,EAAE,OAAO;YACjB,IAAI,KAAyC,CAAC;SAC/C,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAElD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;;;OAQG;IACH,QAAQ;QACN,MAAM,IAAI,GAAG,IAAI,CAAC;QAElB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,QAAQ,EAAE,OAAO;YACjB,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ;gBAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;gBACvC,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC7E,IAAI,CAAC,KAAK,CAAC,KAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;gBAC1C,CAAC;gBACD,QAAQ,EAAE,CAAC;YACb,CAAC;YACD,IAAI,KAAyC,CAAC;SAC/C,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEhD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,GAAG;QACD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACpD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,qEAAqE;IAE7D,YAAY;QAClB,IAAI,CAAC,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAC9C,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEvC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC,OAAO;oBAAE,SAAS;gBAEvB,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;gBACvC,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;wBAChC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC;wBACrD,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,CAAC;oBACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,kCAAkC;QAClC,IAAI,CAAC,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAChC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;gBACvC,IAAI,KAAK;oBAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,KAAkB;QACjC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,UAAU;gBACb,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,aAAa;oBAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACpD,MAAM;YACR,KAAK,cAAc;gBACjB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB;oBAAE,EAAE,CAAC,KAAK,CAAC,CAAC;gBAClD,MAAM;YACR,KAAK,YAAY;gBACf,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,eAAe;oBAAE,EAAE,CAAC,KAAK,CAAC,CAAC;gBACjD,MAAM;YACR,KAAK,WAAW;gBACd,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc;oBAAE,EAAE,CAAC,KAAK,CAAC,CAAC;gBAChD,MAAM;YACR,KAAK,YAAY;gBACf,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,eAAe;oBAAE,EAAE,CAAC,KAAK,CAAC,CAAC;gBACjD,MAAM;QACV,CAAC;IACH,CAAC;CACF"}
|
package/dist/client/claude.d.ts
CHANGED
|
@@ -1,93 +1,92 @@
|
|
|
1
|
-
import type { ClientOptions, QueryOptions, QueryResult
|
|
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
|
-
* //
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
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:
|
|
75
|
-
on(event:
|
|
76
|
-
on(event:
|
|
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
|
-
*
|
|
88
|
-
*
|
|
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):
|
|
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,
|
|
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"}
|
package/dist/client/claude.js
CHANGED
|
@@ -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
|
-
* //
|
|
28
|
-
* const
|
|
29
|
-
*
|
|
30
|
-
* await
|
|
31
|
-
*
|
|
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;
|
|
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:
|
|
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
|
-
*
|
|
128
|
-
*
|
|
119
|
+
* // Raw iteration (backward compat)
|
|
120
|
+
* for await (const event of claude.stream('Analyze')) { ... }
|
|
121
|
+
* ```
|
|
129
122
|
*/
|
|
130
|
-
|
|
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:
|
|
129
|
+
outputFormat: FORMAT_STREAM_JSON,
|
|
137
130
|
});
|
|
138
131
|
const args = buildArgs(resolved);
|
|
139
132
|
const env = resolveEnv(this.options, options);
|
|
140
|
-
|
|
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":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAA2C,MAAM,6BAA6B,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACrG,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAqB,MAAM,2BAA2B,CAAC;AAEzE
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/client/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/client/session.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { ClientOptions, QueryOptions, QueryResult
|
|
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):
|
|
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,
|
|
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"}
|