@generacy-ai/generacy-plugin-claude-code 0.0.0-preview-20260304013206
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/LICENSE +191 -0
- package/dist/container/container-manager.d.ts +82 -0
- package/dist/container/container-manager.d.ts.map +1 -0
- package/dist/container/container-manager.js +420 -0
- package/dist/container/container-manager.js.map +1 -0
- package/dist/container/types.d.ts +160 -0
- package/dist/container/types.d.ts.map +1 -0
- package/dist/container/types.js +24 -0
- package/dist/container/types.js.map +1 -0
- package/dist/errors.d.ts +106 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +180 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/invocation/invoker.d.ts +59 -0
- package/dist/invocation/invoker.d.ts.map +1 -0
- package/dist/invocation/invoker.js +271 -0
- package/dist/invocation/invoker.js.map +1 -0
- package/dist/invocation/types.d.ts +129 -0
- package/dist/invocation/types.d.ts.map +1 -0
- package/dist/invocation/types.js +57 -0
- package/dist/invocation/types.js.map +1 -0
- package/dist/plugin/claude-code-plugin.d.ts +144 -0
- package/dist/plugin/claude-code-plugin.d.ts.map +1 -0
- package/dist/plugin/claude-code-plugin.js +416 -0
- package/dist/plugin/claude-code-plugin.js.map +1 -0
- package/dist/schemas.d.ts +198 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +75 -0
- package/dist/schemas.js.map +1 -0
- package/dist/session/session-manager.d.ts +117 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +243 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/session.d.ts +99 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +271 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session/types.d.ts +107 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +33 -0
- package/dist/session/types.js.map +1 -0
- package/dist/streaming/output-parser.d.ts +91 -0
- package/dist/streaming/output-parser.d.ts.map +1 -0
- package/dist/streaming/output-parser.js +321 -0
- package/dist/streaming/output-parser.js.map +1 -0
- package/dist/streaming/output-stream.d.ts +45 -0
- package/dist/streaming/output-stream.d.ts.map +1 -0
- package/dist/streaming/output-stream.js +222 -0
- package/dist/streaming/output-stream.js.map +1 -0
- package/dist/streaming/types.d.ts +89 -0
- package/dist/streaming/types.d.ts.map +1 -0
- package/dist/streaming/types.js +47 -0
- package/dist/streaming/types.js.map +1 -0
- package/dist/types.d.ts +267 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +33 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @generacy-ai/generacy-plugin-claude-code
|
|
3
|
+
*
|
|
4
|
+
* Output parser for Claude Code JSON Lines format.
|
|
5
|
+
*/
|
|
6
|
+
import { OUTPUT_TYPE_MAP, parseUrgency, createInitialParserState, } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Parser for Claude Code JSON Lines output.
|
|
9
|
+
*/
|
|
10
|
+
export class OutputParser {
|
|
11
|
+
state;
|
|
12
|
+
constructor() {
|
|
13
|
+
this.state = createInitialParserState();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Reset parser state.
|
|
17
|
+
*/
|
|
18
|
+
reset() {
|
|
19
|
+
this.state = createInitialParserState();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parse a chunk of data (may contain multiple lines or partial lines).
|
|
23
|
+
*/
|
|
24
|
+
parseChunk(data) {
|
|
25
|
+
const chunks = [];
|
|
26
|
+
// Add to buffer
|
|
27
|
+
this.state.buffer += data;
|
|
28
|
+
// Process complete lines
|
|
29
|
+
const lines = this.state.buffer.split('\n');
|
|
30
|
+
// Keep the last incomplete line in the buffer
|
|
31
|
+
this.state.buffer = lines.pop() ?? '';
|
|
32
|
+
for (const line of lines) {
|
|
33
|
+
const trimmed = line.trim();
|
|
34
|
+
if (!trimmed)
|
|
35
|
+
continue;
|
|
36
|
+
const chunk = this.parseLine(trimmed);
|
|
37
|
+
if (chunk) {
|
|
38
|
+
chunks.push(chunk);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return chunks;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Flush any remaining buffered content.
|
|
45
|
+
*/
|
|
46
|
+
flush() {
|
|
47
|
+
const chunks = [];
|
|
48
|
+
if (this.state.buffer.trim()) {
|
|
49
|
+
const chunk = this.parseLine(this.state.buffer.trim());
|
|
50
|
+
if (chunk) {
|
|
51
|
+
chunks.push(chunk);
|
|
52
|
+
}
|
|
53
|
+
this.state.buffer = '';
|
|
54
|
+
}
|
|
55
|
+
return chunks;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parse a single line of JSON output.
|
|
59
|
+
*/
|
|
60
|
+
parseLine(line) {
|
|
61
|
+
try {
|
|
62
|
+
const raw = JSON.parse(line);
|
|
63
|
+
return this.parseRawOutput(raw);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Not valid JSON - treat as raw stdout
|
|
67
|
+
return this.createStdoutChunk(line);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Parse a raw Claude output object into an OutputChunk.
|
|
72
|
+
*/
|
|
73
|
+
parseRawOutput(raw) {
|
|
74
|
+
const timestamp = raw.timestamp ? new Date(raw.timestamp) : new Date();
|
|
75
|
+
// Check for question first (special handling)
|
|
76
|
+
if (this.isQuestion(raw)) {
|
|
77
|
+
return this.createQuestionChunk(raw, timestamp);
|
|
78
|
+
}
|
|
79
|
+
// Map type to OutputChunkType
|
|
80
|
+
const type = this.mapType(raw.type);
|
|
81
|
+
// Build metadata
|
|
82
|
+
const metadata = this.buildMetadata(raw, type);
|
|
83
|
+
// Build data based on type
|
|
84
|
+
const data = this.buildData(raw, type);
|
|
85
|
+
return {
|
|
86
|
+
type,
|
|
87
|
+
timestamp,
|
|
88
|
+
data,
|
|
89
|
+
metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create a stdout chunk from raw text.
|
|
94
|
+
*/
|
|
95
|
+
createStdoutChunk(content) {
|
|
96
|
+
return {
|
|
97
|
+
type: 'stdout',
|
|
98
|
+
timestamp: new Date(),
|
|
99
|
+
data: { content },
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Create a stderr chunk from raw text.
|
|
104
|
+
*/
|
|
105
|
+
createStderrChunk(content) {
|
|
106
|
+
return {
|
|
107
|
+
type: 'stderr',
|
|
108
|
+
timestamp: new Date(),
|
|
109
|
+
data: { content },
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create an error chunk.
|
|
114
|
+
*/
|
|
115
|
+
createErrorChunk(message, code, isTransient) {
|
|
116
|
+
return {
|
|
117
|
+
type: 'error',
|
|
118
|
+
timestamp: new Date(),
|
|
119
|
+
data: {
|
|
120
|
+
message,
|
|
121
|
+
code: code ?? 'UNKNOWN',
|
|
122
|
+
isTransient: isTransient ?? false,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Create a completion chunk.
|
|
128
|
+
*/
|
|
129
|
+
createCompleteChunk(exitCode, summary, filesModified) {
|
|
130
|
+
return {
|
|
131
|
+
type: 'complete',
|
|
132
|
+
timestamp: new Date(),
|
|
133
|
+
data: {
|
|
134
|
+
exitCode,
|
|
135
|
+
summary,
|
|
136
|
+
filesModified,
|
|
137
|
+
},
|
|
138
|
+
metadata: {
|
|
139
|
+
isSuccess: exitCode === 0,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Detect if a raw output is a question requiring human input.
|
|
145
|
+
*/
|
|
146
|
+
isQuestion(raw) {
|
|
147
|
+
// Explicit question flag
|
|
148
|
+
if (raw.is_question === true) {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
// Check for question in content
|
|
152
|
+
if (raw.type === 'assistant' && typeof raw.content === 'string') {
|
|
153
|
+
return this.detectQuestionInContent(raw.content);
|
|
154
|
+
}
|
|
155
|
+
// Check for question field
|
|
156
|
+
if (raw.question) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Detect question patterns in content.
|
|
163
|
+
*/
|
|
164
|
+
detectQuestionInContent(content) {
|
|
165
|
+
// Patterns that indicate a question requiring human input
|
|
166
|
+
const questionPatterns = [
|
|
167
|
+
/\?\s*$/m, // Ends with question mark
|
|
168
|
+
/please\s+(confirm|choose|select|decide)/i,
|
|
169
|
+
/which\s+(option|approach|method)/i,
|
|
170
|
+
/should\s+I/i,
|
|
171
|
+
/do\s+you\s+want/i,
|
|
172
|
+
/would\s+you\s+like/i,
|
|
173
|
+
/awaiting\s+(your\s+)?(input|response|decision)/i,
|
|
174
|
+
/\[waiting\s+for\s+(input|response)\]/i,
|
|
175
|
+
];
|
|
176
|
+
return questionPatterns.some((pattern) => pattern.test(content));
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Detect urgency level from content.
|
|
180
|
+
*/
|
|
181
|
+
detectUrgency(raw) {
|
|
182
|
+
// Explicit urgency
|
|
183
|
+
if (raw.urgency) {
|
|
184
|
+
return parseUrgency(raw.urgency);
|
|
185
|
+
}
|
|
186
|
+
// Detect from content
|
|
187
|
+
const content = typeof raw.content === 'string' ? raw.content : '';
|
|
188
|
+
if (/urgent|immediate|critical|blocking/i.test(content)) {
|
|
189
|
+
return 'blocking_now';
|
|
190
|
+
}
|
|
191
|
+
if (/soon|shortly|when\s+possible/i.test(content)) {
|
|
192
|
+
return 'blocking_soon';
|
|
193
|
+
}
|
|
194
|
+
return 'when_available';
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Create a question chunk.
|
|
198
|
+
*/
|
|
199
|
+
createQuestionChunk(raw, timestamp) {
|
|
200
|
+
const content = typeof raw.content === 'string' ? raw.content : '';
|
|
201
|
+
const question = raw.question ?? this.extractQuestion(content);
|
|
202
|
+
const urgency = this.detectUrgency(raw);
|
|
203
|
+
const payload = {
|
|
204
|
+
question,
|
|
205
|
+
urgency,
|
|
206
|
+
choices: raw.choices,
|
|
207
|
+
context: content !== question ? content : undefined,
|
|
208
|
+
askedAt: timestamp,
|
|
209
|
+
};
|
|
210
|
+
return {
|
|
211
|
+
type: 'question',
|
|
212
|
+
timestamp,
|
|
213
|
+
data: payload,
|
|
214
|
+
metadata: {
|
|
215
|
+
urgency,
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Extract the question text from content.
|
|
221
|
+
*/
|
|
222
|
+
extractQuestion(content) {
|
|
223
|
+
// Find sentences ending with ?
|
|
224
|
+
const sentences = content.split(/(?<=[.!?])\s+/);
|
|
225
|
+
const questions = sentences.filter((s) => s.trim().endsWith('?'));
|
|
226
|
+
if (questions.length > 0) {
|
|
227
|
+
return questions.join(' ');
|
|
228
|
+
}
|
|
229
|
+
// Return first line if no explicit question
|
|
230
|
+
const firstLine = content.split('\n')[0];
|
|
231
|
+
return firstLine ?? content;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Map raw type to OutputChunkType.
|
|
235
|
+
*/
|
|
236
|
+
mapType(rawType) {
|
|
237
|
+
return OUTPUT_TYPE_MAP[rawType] ?? 'stdout';
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Build metadata for a chunk.
|
|
241
|
+
*/
|
|
242
|
+
buildMetadata(raw, type) {
|
|
243
|
+
const metadata = {};
|
|
244
|
+
if (raw.tool) {
|
|
245
|
+
metadata.toolName = raw.tool;
|
|
246
|
+
}
|
|
247
|
+
if (raw.file) {
|
|
248
|
+
metadata.filePath = raw.file;
|
|
249
|
+
}
|
|
250
|
+
if (type === 'tool_result' && raw.result !== undefined) {
|
|
251
|
+
metadata.isSuccess = !this.isErrorResult(raw.result);
|
|
252
|
+
}
|
|
253
|
+
if (type === 'complete') {
|
|
254
|
+
metadata.isSuccess = raw.exit_code === 0;
|
|
255
|
+
}
|
|
256
|
+
return metadata;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Build data payload for a chunk.
|
|
260
|
+
*/
|
|
261
|
+
buildData(raw, type) {
|
|
262
|
+
switch (type) {
|
|
263
|
+
case 'stdout':
|
|
264
|
+
case 'stderr':
|
|
265
|
+
return { content: this.extractContent(raw) };
|
|
266
|
+
case 'tool_call':
|
|
267
|
+
return {
|
|
268
|
+
tool: raw.tool,
|
|
269
|
+
input: raw.input ?? raw.content,
|
|
270
|
+
};
|
|
271
|
+
case 'tool_result':
|
|
272
|
+
return {
|
|
273
|
+
tool: raw.tool,
|
|
274
|
+
result: raw.result ?? raw.content,
|
|
275
|
+
success: !this.isErrorResult(raw.result),
|
|
276
|
+
};
|
|
277
|
+
case 'error':
|
|
278
|
+
return {
|
|
279
|
+
message: raw.error ?? this.extractContent(raw),
|
|
280
|
+
code: 'UNKNOWN',
|
|
281
|
+
isTransient: false,
|
|
282
|
+
};
|
|
283
|
+
case 'complete':
|
|
284
|
+
return {
|
|
285
|
+
exitCode: raw.exit_code ?? 0,
|
|
286
|
+
summary: typeof raw.content === 'string' ? raw.content : undefined,
|
|
287
|
+
};
|
|
288
|
+
default:
|
|
289
|
+
return raw.content;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Extract content from raw output.
|
|
294
|
+
*/
|
|
295
|
+
extractContent(raw) {
|
|
296
|
+
if (typeof raw.content === 'string') {
|
|
297
|
+
return raw.content;
|
|
298
|
+
}
|
|
299
|
+
if (raw.content !== undefined) {
|
|
300
|
+
return JSON.stringify(raw.content);
|
|
301
|
+
}
|
|
302
|
+
return '';
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Check if a result indicates an error.
|
|
306
|
+
*/
|
|
307
|
+
isErrorResult(result) {
|
|
308
|
+
if (result === null || result === undefined) {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
if (typeof result === 'object') {
|
|
312
|
+
const obj = result;
|
|
313
|
+
return obj.error !== undefined || obj.success === false;
|
|
314
|
+
}
|
|
315
|
+
if (typeof result === 'string') {
|
|
316
|
+
return /error|failed|exception/i.test(result);
|
|
317
|
+
}
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=output-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-parser.js","sourceRoot":"","sources":["../../src/streaming/output-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @generacy-ai/generacy-plugin-claude-code
|
|
3
|
+
*
|
|
4
|
+
* Async generator for streaming output from Claude Code.
|
|
5
|
+
*/
|
|
6
|
+
import type { Readable } from 'stream';
|
|
7
|
+
import type { OutputChunk, QuestionPayload } from '../types.js';
|
|
8
|
+
import type { OutputStreamOptions } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create an async iterable from a readable stream that yields OutputChunks.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createOutputStream(stdout: Readable, stderr?: Readable, options?: OutputStreamOptions): AsyncIterable<OutputChunk>;
|
|
13
|
+
/**
|
|
14
|
+
* Create an output stream from raw data (for testing or replay).
|
|
15
|
+
*/
|
|
16
|
+
export declare function createOutputStreamFromData(data: string[], _options?: OutputStreamOptions): AsyncIterable<OutputChunk>;
|
|
17
|
+
/**
|
|
18
|
+
* Collect all chunks from an output stream into an array.
|
|
19
|
+
*/
|
|
20
|
+
export declare function collectOutputChunks(stream: AsyncIterable<OutputChunk>): Promise<OutputChunk[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Find the first question chunk in a stream.
|
|
23
|
+
* Yields all chunks until a question is found, then returns the question.
|
|
24
|
+
*/
|
|
25
|
+
export declare function findQuestion(stream: AsyncIterable<OutputChunk>): Promise<{
|
|
26
|
+
question: QuestionPayload | null;
|
|
27
|
+
chunks: OutputChunk[];
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Filter chunks by type.
|
|
31
|
+
*/
|
|
32
|
+
export declare function filterChunksByType(stream: AsyncIterable<OutputChunk>, types: OutputChunk['type'][]): AsyncIterable<OutputChunk>;
|
|
33
|
+
/**
|
|
34
|
+
* Wait for a completion chunk.
|
|
35
|
+
* Returns all chunks and the completion result.
|
|
36
|
+
*/
|
|
37
|
+
export declare function waitForCompletion(stream: AsyncIterable<OutputChunk>, options?: {
|
|
38
|
+
timeout?: number;
|
|
39
|
+
}): Promise<{
|
|
40
|
+
completed: boolean;
|
|
41
|
+
exitCode?: number;
|
|
42
|
+
chunks: OutputChunk[];
|
|
43
|
+
error?: Error;
|
|
44
|
+
}>;
|
|
45
|
+
//# sourceMappingURL=output-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-stream.d.ts","sourceRoot":"","sources":["../../src/streaming/output-stream.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAUtD;;GAEG;AACH,wBAAuB,kBAAkB,CACvC,MAAM,EAAE,QAAQ,EAChB,MAAM,CAAC,EAAE,QAAQ,EACjB,OAAO,GAAE,mBAAwB,GAChC,aAAa,CAAC,WAAW,CAAC,CA6F5B;AAED;;GAEG;AACH,wBAAuB,0BAA0B,CAC/C,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,GAAE,mBAAwB,GACjC,aAAa,CAAC,WAAW,CAAC,CAc5B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,GACjC,OAAO,CAAC,WAAW,EAAE,CAAC,CAQxB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,GACjC,OAAO,CAAC;IACT,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC,CAkBD;AAED;;GAEG;AACH,wBAAuB,kBAAkB,CACvC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,EAClC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,GAC3B,aAAa,CAAC,WAAW,CAAC,CAM5B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,EAClC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACjC,OAAO,CAAC;IACT,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC,CAiED"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @generacy-ai/generacy-plugin-claude-code
|
|
3
|
+
*
|
|
4
|
+
* Async generator for streaming output from Claude Code.
|
|
5
|
+
*/
|
|
6
|
+
import { OutputParser } from './output-parser.js';
|
|
7
|
+
/**
|
|
8
|
+
* Default stream options.
|
|
9
|
+
*/
|
|
10
|
+
const DEFAULT_OPTIONS = {
|
|
11
|
+
includeRaw: false,
|
|
12
|
+
parseTools: true,
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Create an async iterable from a readable stream that yields OutputChunks.
|
|
16
|
+
*/
|
|
17
|
+
export async function* createOutputStream(stdout, stderr, options = {}) {
|
|
18
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
19
|
+
const parser = new OutputParser();
|
|
20
|
+
// Create a combined async iterator from both streams
|
|
21
|
+
const chunks = [];
|
|
22
|
+
let resolveNext = null;
|
|
23
|
+
let rejectNext = null;
|
|
24
|
+
let done = false;
|
|
25
|
+
let streamsClosed = 0;
|
|
26
|
+
const totalStreams = stderr ? 2 : 1;
|
|
27
|
+
const pushChunk = (chunk) => {
|
|
28
|
+
if (resolveNext) {
|
|
29
|
+
resolveNext(chunk);
|
|
30
|
+
resolveNext = null;
|
|
31
|
+
rejectNext = null;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
chunks.push(chunk);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const handleData = (data, isStderr) => {
|
|
38
|
+
const text = typeof data === 'string' ? data : data.toString('utf8');
|
|
39
|
+
if (isStderr && !opts.includeRaw) {
|
|
40
|
+
// Parse stderr as potential error
|
|
41
|
+
pushChunk(parser.createStderrChunk(text));
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Parse stdout as JSON Lines
|
|
45
|
+
const parsed = parser.parseChunk(text);
|
|
46
|
+
for (const chunk of parsed) {
|
|
47
|
+
pushChunk(chunk);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const handleEnd = () => {
|
|
52
|
+
streamsClosed++;
|
|
53
|
+
if (streamsClosed >= totalStreams) {
|
|
54
|
+
// Flush any remaining buffered content
|
|
55
|
+
const remaining = parser.flush();
|
|
56
|
+
for (const chunk of remaining) {
|
|
57
|
+
pushChunk(chunk);
|
|
58
|
+
}
|
|
59
|
+
done = true;
|
|
60
|
+
if (resolveNext) {
|
|
61
|
+
resolveNext(null);
|
|
62
|
+
resolveNext = null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const handleError = (error) => {
|
|
67
|
+
if (rejectNext) {
|
|
68
|
+
rejectNext(error);
|
|
69
|
+
resolveNext = null;
|
|
70
|
+
rejectNext = null;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
pushChunk(parser.createErrorChunk(error.message));
|
|
74
|
+
}
|
|
75
|
+
done = true;
|
|
76
|
+
};
|
|
77
|
+
// Attach listeners
|
|
78
|
+
stdout.on('data', (data) => handleData(data, false));
|
|
79
|
+
stdout.on('end', handleEnd);
|
|
80
|
+
stdout.on('error', handleError);
|
|
81
|
+
if (stderr) {
|
|
82
|
+
stderr.on('data', (data) => handleData(data, true));
|
|
83
|
+
stderr.on('end', handleEnd);
|
|
84
|
+
stderr.on('error', handleError);
|
|
85
|
+
}
|
|
86
|
+
// Yield chunks as they arrive
|
|
87
|
+
while (!done || chunks.length > 0) {
|
|
88
|
+
if (chunks.length > 0) {
|
|
89
|
+
yield chunks.shift();
|
|
90
|
+
}
|
|
91
|
+
else if (!done) {
|
|
92
|
+
const chunk = await new Promise((resolve, reject) => {
|
|
93
|
+
resolveNext = resolve;
|
|
94
|
+
rejectNext = reject;
|
|
95
|
+
});
|
|
96
|
+
if (chunk === null) {
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
yield chunk;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Create an output stream from raw data (for testing or replay).
|
|
105
|
+
*/
|
|
106
|
+
export async function* createOutputStreamFromData(data, _options = {}) {
|
|
107
|
+
const parser = new OutputParser();
|
|
108
|
+
for (const line of data) {
|
|
109
|
+
const chunks = parser.parseChunk(line + '\n');
|
|
110
|
+
for (const chunk of chunks) {
|
|
111
|
+
yield chunk;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const remaining = parser.flush();
|
|
115
|
+
for (const chunk of remaining) {
|
|
116
|
+
yield chunk;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Collect all chunks from an output stream into an array.
|
|
121
|
+
*/
|
|
122
|
+
export async function collectOutputChunks(stream) {
|
|
123
|
+
const chunks = [];
|
|
124
|
+
for await (const chunk of stream) {
|
|
125
|
+
chunks.push(chunk);
|
|
126
|
+
}
|
|
127
|
+
return chunks;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Find the first question chunk in a stream.
|
|
131
|
+
* Yields all chunks until a question is found, then returns the question.
|
|
132
|
+
*/
|
|
133
|
+
export async function findQuestion(stream) {
|
|
134
|
+
const chunks = [];
|
|
135
|
+
for await (const chunk of stream) {
|
|
136
|
+
chunks.push(chunk);
|
|
137
|
+
if (chunk.type === 'question') {
|
|
138
|
+
return {
|
|
139
|
+
question: chunk.data,
|
|
140
|
+
chunks,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
question: null,
|
|
146
|
+
chunks,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Filter chunks by type.
|
|
151
|
+
*/
|
|
152
|
+
export async function* filterChunksByType(stream, types) {
|
|
153
|
+
for await (const chunk of stream) {
|
|
154
|
+
if (types.includes(chunk.type)) {
|
|
155
|
+
yield chunk;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Wait for a completion chunk.
|
|
161
|
+
* Returns all chunks and the completion result.
|
|
162
|
+
*/
|
|
163
|
+
export async function waitForCompletion(stream, options = {}) {
|
|
164
|
+
const chunks = [];
|
|
165
|
+
const timeout = options.timeout ?? 0;
|
|
166
|
+
let timeoutId;
|
|
167
|
+
let timedOut = false;
|
|
168
|
+
const timeoutPromise = timeout > 0
|
|
169
|
+
? new Promise((_, reject) => {
|
|
170
|
+
timeoutId = setTimeout(() => {
|
|
171
|
+
timedOut = true;
|
|
172
|
+
reject(new Error(`Stream timed out after ${timeout}ms`));
|
|
173
|
+
}, timeout);
|
|
174
|
+
})
|
|
175
|
+
: null;
|
|
176
|
+
try {
|
|
177
|
+
const iteratorPromise = (async () => {
|
|
178
|
+
for await (const chunk of stream) {
|
|
179
|
+
if (timedOut)
|
|
180
|
+
break;
|
|
181
|
+
chunks.push(chunk);
|
|
182
|
+
if (chunk.type === 'complete') {
|
|
183
|
+
const data = chunk.data;
|
|
184
|
+
return {
|
|
185
|
+
completed: true,
|
|
186
|
+
exitCode: data.exitCode,
|
|
187
|
+
chunks,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
if (chunk.type === 'error') {
|
|
191
|
+
const data = chunk.data;
|
|
192
|
+
return {
|
|
193
|
+
completed: false,
|
|
194
|
+
chunks,
|
|
195
|
+
error: new Error(data.message ?? 'Unknown error'),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
completed: false,
|
|
201
|
+
chunks,
|
|
202
|
+
};
|
|
203
|
+
})();
|
|
204
|
+
if (timeoutPromise) {
|
|
205
|
+
return await Promise.race([
|
|
206
|
+
iteratorPromise,
|
|
207
|
+
timeoutPromise.then(() => ({
|
|
208
|
+
completed: false,
|
|
209
|
+
chunks,
|
|
210
|
+
error: new Error(`Stream timed out after ${timeout}ms`),
|
|
211
|
+
})),
|
|
212
|
+
]);
|
|
213
|
+
}
|
|
214
|
+
return await iteratorPromise;
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
if (timeoutId) {
|
|
218
|
+
clearTimeout(timeoutId);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=output-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-stream.js","sourceRoot":"","sources":["../../src/streaming/output-stream.ts"],"names":[],"mappings":"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"}
|