@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
package/README.md
CHANGED
|
@@ -22,6 +22,7 @@ Claude Code is a powerful AI coding agent, but it only runs in a terminal. **cla
|
|
|
22
22
|
- **Two execution modes** — persistent SDK session (fast, default) or CLI process spawning (simple)
|
|
23
23
|
- **Executor abstraction** — swap CLI for SDK or HTTP backend without changing your code
|
|
24
24
|
- **Full CLI parity** — exposes all 45+ Claude Code flags through typed options
|
|
25
|
+
- **Typed handles** — `StreamHandle` (fluent `.on().done()` + `for-await`) and `ChatHandle` (multi-turn conversations)
|
|
25
26
|
|
|
26
27
|
## Requirements
|
|
27
28
|
|
|
@@ -37,9 +38,9 @@ npm install @scottwalker/claude-connector
|
|
|
37
38
|
## Quick Start
|
|
38
39
|
|
|
39
40
|
```typescript
|
|
40
|
-
import { Claude } from '@scottwalker/claude-connector'
|
|
41
|
+
import { Claude, PERMISSION_ACCEPT_EDITS } from '@scottwalker/claude-connector'
|
|
41
42
|
|
|
42
|
-
const claude = new Claude()
|
|
43
|
+
const claude = new Claude({ permissionMode: PERMISSION_ACCEPT_EDITS })
|
|
43
44
|
|
|
44
45
|
// Simple query
|
|
45
46
|
const result = await claude.query('Find and fix bugs in auth.ts')
|
|
@@ -55,6 +56,8 @@ console.log(result.usage) // { inputTokens, outputTokens }
|
|
|
55
56
|
Point to a specific Claude Code installation when multiple versions coexist:
|
|
56
57
|
|
|
57
58
|
```typescript
|
|
59
|
+
import { Claude } from '@scottwalker/claude-connector'
|
|
60
|
+
|
|
58
61
|
const claude = new Claude({
|
|
59
62
|
executable: '/opt/claude-code/v2/bin/claude',
|
|
60
63
|
cwd: '/path/to/project',
|
|
@@ -63,21 +66,41 @@ const claude = new Claude({
|
|
|
63
66
|
|
|
64
67
|
### Streaming
|
|
65
68
|
|
|
66
|
-
Real-time output as Claude works
|
|
69
|
+
Real-time output as Claude works. `stream()` returns a `StreamHandle` — use the fluent `.on().done()` API or classic `for-await`:
|
|
67
70
|
|
|
68
71
|
```typescript
|
|
69
|
-
|
|
72
|
+
import {
|
|
73
|
+
Claude,
|
|
74
|
+
EVENT_TEXT, EVENT_TOOL_USE, EVENT_RESULT, EVENT_ERROR,
|
|
75
|
+
} from '@scottwalker/claude-connector'
|
|
76
|
+
|
|
77
|
+
const claude = new Claude()
|
|
78
|
+
|
|
79
|
+
// Fluent API (.on / .done)
|
|
80
|
+
const result = await claude
|
|
81
|
+
.stream('Rewrite the auth module')
|
|
82
|
+
.on(EVENT_TEXT, (e) => process.stdout.write(e.text))
|
|
83
|
+
.on(EVENT_TOOL_USE, (e) => console.log(`[Tool] ${e.toolName}`))
|
|
84
|
+
.on(EVENT_ERROR, (e) => console.error(e.message))
|
|
85
|
+
.done()
|
|
86
|
+
|
|
87
|
+
console.log(`Done in ${result.durationMs}ms`)
|
|
88
|
+
|
|
89
|
+
// Classic for-await
|
|
90
|
+
const handle = claude.stream('Rewrite the auth module')
|
|
91
|
+
|
|
92
|
+
for await (const event of handle) {
|
|
70
93
|
switch (event.type) {
|
|
71
|
-
case
|
|
94
|
+
case EVENT_TEXT:
|
|
72
95
|
process.stdout.write(event.text)
|
|
73
96
|
break
|
|
74
|
-
case
|
|
97
|
+
case EVENT_TOOL_USE:
|
|
75
98
|
console.log(`[Tool] ${event.toolName}`)
|
|
76
99
|
break
|
|
77
|
-
case
|
|
100
|
+
case EVENT_RESULT:
|
|
78
101
|
console.log(`\nDone in ${event.durationMs}ms`)
|
|
79
102
|
break
|
|
80
|
-
case
|
|
103
|
+
case EVENT_ERROR:
|
|
81
104
|
console.error(event.message)
|
|
82
105
|
break
|
|
83
106
|
}
|
|
@@ -89,6 +112,9 @@ for await (const event of claude.stream('Rewrite the auth module')) {
|
|
|
89
112
|
Maintain conversation context across queries:
|
|
90
113
|
|
|
91
114
|
```typescript
|
|
115
|
+
import { Claude } from '@scottwalker/claude-connector'
|
|
116
|
+
|
|
117
|
+
const claude = new Claude()
|
|
92
118
|
const session = claude.session()
|
|
93
119
|
await session.query('Analyze the architecture of this project')
|
|
94
120
|
await session.query('Now refactor the auth module based on your analysis')
|
|
@@ -107,6 +133,9 @@ const s3 = claude.session({ resume: session.sessionId!, fork: true })
|
|
|
107
133
|
Get typed JSON responses via JSON Schema:
|
|
108
134
|
|
|
109
135
|
```typescript
|
|
136
|
+
import { Claude } from '@scottwalker/claude-connector'
|
|
137
|
+
|
|
138
|
+
const claude = new Claude()
|
|
110
139
|
const result = await claude.query('Extract all API endpoints from the codebase', {
|
|
111
140
|
schema: {
|
|
112
141
|
type: 'object',
|
|
@@ -134,10 +163,14 @@ console.log(result.structured)
|
|
|
134
163
|
Run independent queries concurrently (each spawns a separate CLI process):
|
|
135
164
|
|
|
136
165
|
```typescript
|
|
166
|
+
import { Claude, PERMISSION_PLAN } from '@scottwalker/claude-connector'
|
|
167
|
+
|
|
168
|
+
const claude = new Claude()
|
|
169
|
+
|
|
137
170
|
const [bugs, tests, docs] = await claude.parallel([
|
|
138
171
|
{ prompt: 'Find bugs in src/', options: { cwd: './src' } },
|
|
139
172
|
{ prompt: 'Run the test suite', options: { allowedTools: ['Bash'] } },
|
|
140
|
-
{ prompt: 'Review documentation', options: { permissionMode:
|
|
173
|
+
{ prompt: 'Review documentation', options: { permissionMode: PERMISSION_PLAN } },
|
|
141
174
|
])
|
|
142
175
|
```
|
|
143
176
|
|
|
@@ -146,13 +179,16 @@ const [bugs, tests, docs] = await claude.parallel([
|
|
|
146
179
|
Node.js-level equivalent of the `/loop` CLI command:
|
|
147
180
|
|
|
148
181
|
```typescript
|
|
182
|
+
import { Claude, SCHED_RESULT, SCHED_ERROR } from '@scottwalker/claude-connector'
|
|
183
|
+
|
|
184
|
+
const claude = new Claude()
|
|
149
185
|
const job = claude.loop('5m', 'Check CI pipeline status and report failures')
|
|
150
186
|
|
|
151
|
-
job.on(
|
|
187
|
+
job.on(SCHED_RESULT, (result) => {
|
|
152
188
|
console.log(`[${new Date().toISOString()}] ${result.text}`)
|
|
153
189
|
})
|
|
154
190
|
|
|
155
|
-
job.on(
|
|
191
|
+
job.on(SCHED_ERROR, (err) => {
|
|
156
192
|
console.error('Check failed:', err.message)
|
|
157
193
|
})
|
|
158
194
|
|
|
@@ -167,6 +203,8 @@ Supported intervals: `'30s'`, `'5m'`, `'2h'`, `'1d'`, or raw milliseconds.
|
|
|
167
203
|
Connect Model Context Protocol servers:
|
|
168
204
|
|
|
169
205
|
```typescript
|
|
206
|
+
import { Claude } from '@scottwalker/claude-connector'
|
|
207
|
+
|
|
170
208
|
const claude = new Claude({
|
|
171
209
|
// From config file
|
|
172
210
|
mcpConfig: './mcp.json',
|
|
@@ -190,6 +228,8 @@ const claude = new Claude({
|
|
|
190
228
|
Define specialized agents:
|
|
191
229
|
|
|
192
230
|
```typescript
|
|
231
|
+
import { Claude, PERMISSION_ACCEPT_EDITS } from '@scottwalker/claude-connector'
|
|
232
|
+
|
|
193
233
|
const claude = new Claude({
|
|
194
234
|
agents: {
|
|
195
235
|
reviewer: {
|
|
@@ -201,7 +241,7 @@ const claude = new Claude({
|
|
|
201
241
|
deployer: {
|
|
202
242
|
description: 'Deployment automation agent',
|
|
203
243
|
tools: ['Bash', 'Read'],
|
|
204
|
-
permissionMode:
|
|
244
|
+
permissionMode: PERMISSION_ACCEPT_EDITS,
|
|
205
245
|
},
|
|
206
246
|
},
|
|
207
247
|
})
|
|
@@ -212,6 +252,9 @@ const claude = new Claude({
|
|
|
212
252
|
Run operations in an isolated copy of the repository:
|
|
213
253
|
|
|
214
254
|
```typescript
|
|
255
|
+
import { Claude } from '@scottwalker/claude-connector'
|
|
256
|
+
|
|
257
|
+
const claude = new Claude()
|
|
215
258
|
const result = await claude.query('Refactor the entire auth module', {
|
|
216
259
|
worktree: 'refactor-auth', // or `true` for auto-generated name
|
|
217
260
|
})
|
|
@@ -223,7 +266,9 @@ Pass data alongside the prompt (like `echo data | claude -p "prompt"`):
|
|
|
223
266
|
|
|
224
267
|
```typescript
|
|
225
268
|
import { readFileSync } from 'node:fs'
|
|
269
|
+
import { Claude } from '@scottwalker/claude-connector'
|
|
226
270
|
|
|
271
|
+
const claude = new Claude()
|
|
227
272
|
const result = await claude.query('Analyze this error log and suggest fixes', {
|
|
228
273
|
input: readFileSync('./error.log', 'utf-8'),
|
|
229
274
|
})
|
|
@@ -234,6 +279,8 @@ const result = await claude.query('Analyze this error log and suggest fixes', {
|
|
|
234
279
|
Attach hooks to tool execution:
|
|
235
280
|
|
|
236
281
|
```typescript
|
|
282
|
+
import { Claude } from '@scottwalker/claude-connector'
|
|
283
|
+
|
|
237
284
|
const claude = new Claude({
|
|
238
285
|
hooks: {
|
|
239
286
|
PostToolUse: [
|
|
@@ -257,6 +304,11 @@ const claude = new Claude({
|
|
|
257
304
|
All Claude Code CLI capabilities in one place:
|
|
258
305
|
|
|
259
306
|
```typescript
|
|
307
|
+
import {
|
|
308
|
+
Claude,
|
|
309
|
+
EFFORT_HIGH, PERMISSION_ACCEPT_EDITS, PERMISSION_PLAN,
|
|
310
|
+
} from '@scottwalker/claude-connector'
|
|
311
|
+
|
|
260
312
|
const claude = new Claude({
|
|
261
313
|
// CLI binary
|
|
262
314
|
executable: '/usr/local/bin/claude',
|
|
@@ -264,11 +316,11 @@ const claude = new Claude({
|
|
|
264
316
|
|
|
265
317
|
// Model
|
|
266
318
|
model: 'opus', // 'opus' | 'sonnet' | 'haiku' | full model ID
|
|
267
|
-
effortLevel:
|
|
319
|
+
effortLevel: EFFORT_HIGH, // EFFORT_LOW | EFFORT_MEDIUM | EFFORT_HIGH | EFFORT_MAX
|
|
268
320
|
fallbackModel: 'sonnet', // auto-fallback on failure
|
|
269
321
|
|
|
270
322
|
// Permissions
|
|
271
|
-
permissionMode:
|
|
323
|
+
permissionMode: PERMISSION_ACCEPT_EDITS, // PERMISSION_DEFAULT | PERMISSION_ACCEPT_EDITS | PERMISSION_PLAN | PERMISSION_AUTO | PERMISSION_DONT_ASK | PERMISSION_BYPASS
|
|
272
324
|
allowedTools: ['Read', 'Edit', 'Bash(npm run *)'],
|
|
273
325
|
disallowedTools: ['WebFetch'],
|
|
274
326
|
|
|
@@ -306,7 +358,7 @@ const claude = new Claude({
|
|
|
306
358
|
// Override any option per query
|
|
307
359
|
const result = await claude.query('Analyze this module', {
|
|
308
360
|
model: 'haiku', // cheaper model for this query
|
|
309
|
-
permissionMode:
|
|
361
|
+
permissionMode: PERMISSION_PLAN, // read-only
|
|
310
362
|
maxTurns: 3,
|
|
311
363
|
})
|
|
312
364
|
```
|
|
@@ -326,6 +378,8 @@ import {
|
|
|
326
378
|
ValidationError,
|
|
327
379
|
} from '@scottwalker/claude-connector'
|
|
328
380
|
|
|
381
|
+
const claude = new Claude()
|
|
382
|
+
|
|
329
383
|
try {
|
|
330
384
|
const result = await claude.query('Fix the bug')
|
|
331
385
|
} catch (err) {
|
|
@@ -350,10 +404,13 @@ try {
|
|
|
350
404
|
|
|
351
405
|
## Custom Executor
|
|
352
406
|
|
|
353
|
-
The `IExecutor` abstraction lets you swap the CLI backend for testing, mocking, or
|
|
407
|
+
The `IExecutor` abstraction lets you swap the CLI backend for testing, mocking, or alternative transports:
|
|
354
408
|
|
|
355
409
|
```typescript
|
|
356
|
-
import {
|
|
410
|
+
import {
|
|
411
|
+
Claude, EVENT_TEXT, EVENT_RESULT,
|
|
412
|
+
type IExecutor, type ExecuteOptions, type QueryResult, type StreamEvent,
|
|
413
|
+
} from '@scottwalker/claude-connector'
|
|
357
414
|
|
|
358
415
|
class MockExecutor implements IExecutor {
|
|
359
416
|
async execute(args: readonly string[], options: ExecuteOptions): Promise<QueryResult> {
|
|
@@ -370,9 +427,9 @@ class MockExecutor implements IExecutor {
|
|
|
370
427
|
}
|
|
371
428
|
|
|
372
429
|
async *stream(args: readonly string[], options: ExecuteOptions): AsyncIterable<StreamEvent> {
|
|
373
|
-
yield { type:
|
|
430
|
+
yield { type: EVENT_TEXT, text: 'Mocked stream' }
|
|
374
431
|
yield {
|
|
375
|
-
type:
|
|
432
|
+
type: EVENT_RESULT,
|
|
376
433
|
text: 'Mocked stream',
|
|
377
434
|
sessionId: 'mock-session',
|
|
378
435
|
usage: { inputTokens: 0, outputTokens: 0 },
|
|
@@ -438,7 +495,7 @@ cd claude-connector
|
|
|
438
495
|
npm install
|
|
439
496
|
|
|
440
497
|
npm run build # compile TypeScript
|
|
441
|
-
npm test # run
|
|
498
|
+
npm test # run 122 unit tests
|
|
442
499
|
npm run test:integration # build + run integration test
|
|
443
500
|
npm run typecheck # type-check without emitting
|
|
444
501
|
```
|
|
@@ -16,8 +16,9 @@ import type { ClientOptions, QueryOptions } from '../types/index.js';
|
|
|
16
16
|
*/
|
|
17
17
|
/** Merged options ready for argument building. */
|
|
18
18
|
export interface ResolvedOptions {
|
|
19
|
-
readonly prompt
|
|
19
|
+
readonly prompt?: string;
|
|
20
20
|
readonly outputFormat: 'json' | 'stream-json';
|
|
21
|
+
readonly inputFormat?: 'stream-json';
|
|
21
22
|
readonly cwd: string;
|
|
22
23
|
readonly model?: string;
|
|
23
24
|
readonly effortLevel?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args-builder.d.ts","sourceRoot":"","sources":["../../src/builder/args-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"args-builder.d.ts","sourceRoot":"","sources":["../../src/builder/args-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAarE;;;;;;;;;;;;;;GAcG;AAEH,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,CAAC;IAC9C,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,aAAa,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GACA,eAAe,CA+BjB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,EAAE,CAqI5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWxB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { FLAG_PRINT, FLAG_OUTPUT_FORMAT, FLAG_VERBOSE, FLAG_INPUT_FORMAT, FLAG_CONTINUE, FLAG_RESUME, FLAG_FORK_SESSION, FLAG_MODEL, FLAG_FALLBACK_MODEL, FLAG_EFFORT, FLAG_PERMISSION_MODE, FLAG_ALLOWED_TOOLS, FLAG_DISALLOWED_TOOLS, FLAG_TOOLS, FLAG_SYSTEM_PROMPT, FLAG_APPEND_SYSTEM_PROMPT, FLAG_MAX_TURNS, FLAG_MAX_BUDGET, FLAG_ADD_DIR, FLAG_MCP_CONFIG, FLAG_STRICT_MCP_CONFIG, FLAG_AGENTS, FLAG_AGENT, FLAG_JSON_SCHEMA, FLAG_WORKTREE, FLAG_NO_SESSION_PERSISTENCE, FLAG_NAME, FLAG_SETTINGS, FORMAT_STREAM_JSON, } from '../constants.js';
|
|
1
2
|
/**
|
|
2
3
|
* Merge client-level defaults with per-query overrides.
|
|
3
4
|
*/
|
|
@@ -39,115 +40,121 @@ export function mergeOptions(client, query, extra) {
|
|
|
39
40
|
* @returns Array of strings to pass to `spawn('claude', args)`.
|
|
40
41
|
*/
|
|
41
42
|
export function buildArgs(options) {
|
|
42
|
-
const args = [
|
|
43
|
+
const args = [FLAG_PRINT, FLAG_OUTPUT_FORMAT, options.outputFormat];
|
|
43
44
|
// BUG-1 fix: stream-json requires --verbose
|
|
44
|
-
if (options.outputFormat ===
|
|
45
|
-
args.push(
|
|
45
|
+
if (options.outputFormat === FORMAT_STREAM_JSON) {
|
|
46
|
+
args.push(FLAG_VERBOSE);
|
|
47
|
+
}
|
|
48
|
+
// ── Input format (bidirectional streaming) ─────────────────────
|
|
49
|
+
if (options.inputFormat) {
|
|
50
|
+
args.push(FLAG_INPUT_FORMAT, options.inputFormat);
|
|
46
51
|
}
|
|
47
52
|
// ── Prompt ──────────────────────────────────────────────────────
|
|
48
|
-
|
|
53
|
+
if (options.prompt) {
|
|
54
|
+
args.push(options.prompt);
|
|
55
|
+
}
|
|
49
56
|
// ── Session ─────────────────────────────────────────────────────
|
|
50
57
|
if (options.continueSession) {
|
|
51
|
-
args.push(
|
|
58
|
+
args.push(FLAG_CONTINUE);
|
|
52
59
|
}
|
|
53
60
|
if (options.sessionId) {
|
|
54
|
-
args.push(
|
|
61
|
+
args.push(FLAG_RESUME, options.sessionId);
|
|
55
62
|
}
|
|
56
63
|
if (options.forkSession) {
|
|
57
|
-
args.push(
|
|
64
|
+
args.push(FLAG_FORK_SESSION);
|
|
58
65
|
}
|
|
59
66
|
// ── Model ───────────────────────────────────────────────────────
|
|
60
67
|
if (options.model) {
|
|
61
|
-
args.push(
|
|
68
|
+
args.push(FLAG_MODEL, options.model);
|
|
62
69
|
}
|
|
63
70
|
if (options.fallbackModel) {
|
|
64
|
-
args.push(
|
|
71
|
+
args.push(FLAG_FALLBACK_MODEL, options.fallbackModel);
|
|
65
72
|
}
|
|
66
73
|
if (options.effortLevel) {
|
|
67
|
-
args.push(
|
|
74
|
+
args.push(FLAG_EFFORT, options.effortLevel);
|
|
68
75
|
}
|
|
69
76
|
// ── Permissions ─────────────────────────────────────────────────
|
|
70
77
|
if (options.permissionMode) {
|
|
71
|
-
args.push(
|
|
78
|
+
args.push(FLAG_PERMISSION_MODE, options.permissionMode);
|
|
72
79
|
}
|
|
73
80
|
if (options.allowedTools?.length) {
|
|
74
|
-
args.push(
|
|
81
|
+
args.push(FLAG_ALLOWED_TOOLS, ...options.allowedTools);
|
|
75
82
|
}
|
|
76
83
|
if (options.disallowedTools?.length) {
|
|
77
|
-
args.push(
|
|
84
|
+
args.push(FLAG_DISALLOWED_TOOLS, ...options.disallowedTools);
|
|
78
85
|
}
|
|
79
86
|
// ── Tools (built-in set restriction) ────────────────────────────
|
|
80
87
|
if (options.tools) {
|
|
81
88
|
if (options.tools.length === 0) {
|
|
82
|
-
args.push(
|
|
89
|
+
args.push(FLAG_TOOLS, '');
|
|
83
90
|
}
|
|
84
91
|
else {
|
|
85
|
-
args.push(
|
|
92
|
+
args.push(FLAG_TOOLS, ...options.tools);
|
|
86
93
|
}
|
|
87
94
|
}
|
|
88
95
|
// ── System prompt ───────────────────────────────────────────────
|
|
89
96
|
if (options.systemPrompt) {
|
|
90
|
-
args.push(
|
|
97
|
+
args.push(FLAG_SYSTEM_PROMPT, options.systemPrompt);
|
|
91
98
|
}
|
|
92
99
|
if (options.appendSystemPrompt) {
|
|
93
|
-
args.push(
|
|
100
|
+
args.push(FLAG_APPEND_SYSTEM_PROMPT, options.appendSystemPrompt);
|
|
94
101
|
}
|
|
95
102
|
// ── Limits ──────────────────────────────────────────────────────
|
|
96
103
|
if (options.maxTurns !== undefined) {
|
|
97
|
-
args.push(
|
|
104
|
+
args.push(FLAG_MAX_TURNS, String(options.maxTurns));
|
|
98
105
|
}
|
|
99
106
|
if (options.maxBudget !== undefined) {
|
|
100
|
-
args.push(
|
|
107
|
+
args.push(FLAG_MAX_BUDGET, String(options.maxBudget));
|
|
101
108
|
}
|
|
102
109
|
// ── Directories ─────────────────────────────────────────────────
|
|
103
110
|
if (options.additionalDirs?.length) {
|
|
104
111
|
for (const dir of options.additionalDirs) {
|
|
105
|
-
args.push(
|
|
112
|
+
args.push(FLAG_ADD_DIR, dir);
|
|
106
113
|
}
|
|
107
114
|
}
|
|
108
115
|
// ── MCP ─────────────────────────────────────────────────────────
|
|
109
116
|
if (options.mcpConfig) {
|
|
110
117
|
const configs = Array.isArray(options.mcpConfig) ? options.mcpConfig : [options.mcpConfig];
|
|
111
118
|
for (const cfg of configs) {
|
|
112
|
-
args.push(
|
|
119
|
+
args.push(FLAG_MCP_CONFIG, cfg);
|
|
113
120
|
}
|
|
114
121
|
}
|
|
115
122
|
if (options.mcpServers && Object.keys(options.mcpServers).length > 0) {
|
|
116
|
-
args.push(
|
|
123
|
+
args.push(FLAG_MCP_CONFIG, JSON.stringify({ mcpServers: options.mcpServers }));
|
|
117
124
|
}
|
|
118
125
|
if (options.strictMcpConfig) {
|
|
119
|
-
args.push(
|
|
126
|
+
args.push(FLAG_STRICT_MCP_CONFIG);
|
|
120
127
|
}
|
|
121
128
|
// ── Agents ──────────────────────────────────────────────────────
|
|
122
129
|
if (options.agents && Object.keys(options.agents).length > 0) {
|
|
123
|
-
args.push(
|
|
130
|
+
args.push(FLAG_AGENTS, JSON.stringify(options.agents));
|
|
124
131
|
}
|
|
125
132
|
if (options.agent) {
|
|
126
|
-
args.push(
|
|
133
|
+
args.push(FLAG_AGENT, options.agent);
|
|
127
134
|
}
|
|
128
135
|
// ── Structured output ───────────────────────────────────────────
|
|
129
136
|
if (options.schema) {
|
|
130
|
-
args.push(
|
|
137
|
+
args.push(FLAG_JSON_SCHEMA, JSON.stringify(options.schema));
|
|
131
138
|
}
|
|
132
139
|
// ── Worktree ────────────────────────────────────────────────────
|
|
133
140
|
if (options.worktree) {
|
|
134
141
|
if (typeof options.worktree === 'string') {
|
|
135
|
-
args.push(
|
|
142
|
+
args.push(FLAG_WORKTREE, options.worktree);
|
|
136
143
|
}
|
|
137
144
|
else {
|
|
138
|
-
args.push(
|
|
145
|
+
args.push(FLAG_WORKTREE);
|
|
139
146
|
}
|
|
140
147
|
}
|
|
141
148
|
// ── Misc ────────────────────────────────────────────────────────
|
|
142
149
|
if (options.noSessionPersistence) {
|
|
143
|
-
args.push(
|
|
150
|
+
args.push(FLAG_NO_SESSION_PERSISTENCE);
|
|
144
151
|
}
|
|
145
152
|
if (options.name) {
|
|
146
|
-
args.push(
|
|
153
|
+
args.push(FLAG_NAME, options.name);
|
|
147
154
|
}
|
|
148
155
|
// ── Hooks (via --settings) ──────────────────────────────────────
|
|
149
156
|
if (options.hooks && Object.keys(options.hooks).length > 0) {
|
|
150
|
-
args.push(
|
|
157
|
+
args.push(FLAG_SETTINGS, JSON.stringify({ hooks: options.hooks }));
|
|
151
158
|
}
|
|
152
159
|
return args;
|
|
153
160
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args-builder.js","sourceRoot":"","sources":["../../src/builder/args-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"args-builder.js","sourceRoot":"","sources":["../../src/builder/args-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { Readable, Duplex } from 'node:stream';
|
|
2
|
+
import { EVENT_TEXT, EVENT_TOOL_USE, EVENT_RESULT, EVENT_ERROR, EVENT_SYSTEM } from '../constants.js';
|
|
3
|
+
import type { StreamToolUseEvent, StreamResultEvent, StreamErrorEvent, StreamSystemEvent } from '../types/index.js';
|
|
4
|
+
type TextCallback = (text: string) => void;
|
|
5
|
+
type ToolUseCallback = (event: StreamToolUseEvent) => void;
|
|
6
|
+
type ResultCallback = (event: StreamResultEvent) => void;
|
|
7
|
+
type ErrorCallback = (event: StreamErrorEvent) => void;
|
|
8
|
+
type SystemCallback = (event: StreamSystemEvent) => void;
|
|
9
|
+
/**
|
|
10
|
+
* Bidirectional streaming handle for real-time conversation.
|
|
11
|
+
*
|
|
12
|
+
* Uses `--input-format stream-json` to maintain a persistent CLI process.
|
|
13
|
+
* Send prompts with `.send()`, receive responses via callbacks or Node.js streams.
|
|
14
|
+
*
|
|
15
|
+
* ## Fluent callbacks
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* const chat = claude.chat()
|
|
19
|
+
* .on('text', (text) => process.stdout.write(text))
|
|
20
|
+
* .on('result', (event) => console.log('Turn done'))
|
|
21
|
+
*
|
|
22
|
+
* await chat.send('What files are in src?')
|
|
23
|
+
* await chat.send('Fix the largest one')
|
|
24
|
+
* chat.end()
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* ## Node.js Duplex stream
|
|
28
|
+
*
|
|
29
|
+
* ```ts
|
|
30
|
+
* const duplex = claude.chat().toDuplex()
|
|
31
|
+
* inputStream.pipe(duplex).pipe(process.stdout)
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare class ChatHandle {
|
|
35
|
+
private readonly child;
|
|
36
|
+
private readonly textCallbacks;
|
|
37
|
+
private readonly toolUseCallbacks;
|
|
38
|
+
private readonly resultCallbacks;
|
|
39
|
+
private readonly errorCallbacks;
|
|
40
|
+
private readonly systemCallbacks;
|
|
41
|
+
private buffer;
|
|
42
|
+
private _closed;
|
|
43
|
+
private _sessionId;
|
|
44
|
+
private _turnCount;
|
|
45
|
+
constructor(executable: string, args: readonly string[], options: {
|
|
46
|
+
cwd: string;
|
|
47
|
+
env: Record<string, string>;
|
|
48
|
+
});
|
|
49
|
+
/** Session ID (populated after the first result). */
|
|
50
|
+
get sessionId(): string | null;
|
|
51
|
+
/** Number of completed turns. */
|
|
52
|
+
get turnCount(): number;
|
|
53
|
+
/** Whether the chat has been closed. */
|
|
54
|
+
get closed(): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Register a callback. Returns `this` for chaining.
|
|
57
|
+
*/
|
|
58
|
+
on(type: typeof EVENT_TEXT, callback: TextCallback): this;
|
|
59
|
+
on(type: typeof EVENT_TOOL_USE, callback: ToolUseCallback): this;
|
|
60
|
+
on(type: typeof EVENT_RESULT, callback: ResultCallback): this;
|
|
61
|
+
on(type: typeof EVENT_ERROR, callback: ErrorCallback): this;
|
|
62
|
+
on(type: typeof EVENT_SYSTEM, callback: SystemCallback): this;
|
|
63
|
+
/**
|
|
64
|
+
* Send a prompt and wait for the complete response.
|
|
65
|
+
* Returns the result event when this turn finishes.
|
|
66
|
+
*
|
|
67
|
+
* ```ts
|
|
68
|
+
* const result = await chat.send('Find bugs in auth.ts')
|
|
69
|
+
* console.log(result.durationMs)
|
|
70
|
+
*
|
|
71
|
+
* const result2 = await chat.send('Now fix them')
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
send(prompt: string): Promise<StreamResultEvent>;
|
|
75
|
+
/**
|
|
76
|
+
* Pipe text output to a writable stream.
|
|
77
|
+
* Returns the destination for chaining (Node.js convention).
|
|
78
|
+
*
|
|
79
|
+
* ```ts
|
|
80
|
+
* chat.pipe(process.stdout)
|
|
81
|
+
* chat.pipe(fs.createWriteStream('log.txt'))
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
pipe<T extends NodeJS.WritableStream>(dest: T): T;
|
|
85
|
+
/**
|
|
86
|
+
* Get a Node.js Readable that emits text chunks.
|
|
87
|
+
*
|
|
88
|
+
* ```ts
|
|
89
|
+
* claude.chat().toReadable().pipe(res)
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
toReadable(): Readable;
|
|
93
|
+
/**
|
|
94
|
+
* Get a Node.js Duplex stream.
|
|
95
|
+
* Write side accepts prompts (one per write). Read side emits text.
|
|
96
|
+
*
|
|
97
|
+
* ```ts
|
|
98
|
+
* const duplex = claude.chat().toDuplex()
|
|
99
|
+
* inputStream.pipe(duplex).pipe(process.stdout)
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
toDuplex(): Duplex;
|
|
103
|
+
/**
|
|
104
|
+
* Close the chat gracefully — signals EOF to the CLI process.
|
|
105
|
+
*/
|
|
106
|
+
end(): void;
|
|
107
|
+
/**
|
|
108
|
+
* Abort the chat — kills the CLI process immediately.
|
|
109
|
+
*/
|
|
110
|
+
abort(): void;
|
|
111
|
+
private startReading;
|
|
112
|
+
private dispatch;
|
|
113
|
+
}
|
|
114
|
+
export {};
|
|
115
|
+
//# sourceMappingURL=chat-handle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-handle.d.ts","sourceRoot":"","sources":["../../src/client/chat-handle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EACL,UAAU,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EACX,YAAY,EAGb,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAEV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAE3B,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAC3C,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAC3D,KAAK,cAAc,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;AACzD,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;AACvD,KAAK,cAAc,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;IACpD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;IAC1D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwB;IACxD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;IACtD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwB;IAExD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAAK;gBAGrB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAWvD,qDAAqD;IACrD,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAED,iCAAiC;IACjC,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,wCAAwC;IACxC,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED;;OAEG;IACH,EAAE,CAAC,IAAI,EAAE,OAAO,UAAU,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IACzD,EAAE,CAAC,IAAI,EAAE,OAAO,cAAc,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI;IAChE,EAAE,CAAC,IAAI,EAAE,OAAO,YAAY,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAC7D,EAAE,CAAC,IAAI,EAAE,OAAO,WAAW,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAC3D,EAAE,CAAC,IAAI,EAAE,OAAO,YAAY,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAY7D;;;;;;;;;;OAUG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwBhD;;;;;;;;OAQG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC;IAKjD;;;;;;OAMG;IACH,UAAU,IAAI,QAAQ;IAYtB;;;;;;;;OAQG;IACH,QAAQ,IAAI,MAAM;IAsBlB;;OAEG;IACH,GAAG,IAAI,IAAI;IAQX;;OAEG;IACH,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,QAAQ;CAmBjB"}
|