flanders 0.0.1
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/lib/Claude.d.ts +129 -0
- package/lib/Claude.js +390 -0
- package/lib/ClaudeSession.d.ts +34 -0
- package/lib/ClaudeSession.js +293 -0
- package/lib/Flanders.d.ts +21 -0
- package/lib/Flanders.js +64 -0
- package/lib/Git.d.ts +12 -0
- package/lib/Git.js +128 -0
- package/lib/PlanFile.d.ts +38 -0
- package/lib/PlanFile.js +167 -0
- package/lib/ScriptRunner.d.ts +26 -0
- package/lib/ScriptRunner.js +109 -0
- package/lib/Workspace.d.ts +32 -0
- package/lib/Workspace.js +78 -0
- package/lib/cli.d.ts +2 -0
- package/lib/cli.js +328 -0
- package/lib/commands/Implement.d.ts +64 -0
- package/lib/commands/Implement.js +696 -0
- package/lib/commands/Install.d.ts +20 -0
- package/lib/commands/Install.js +126 -0
- package/lib/contexts.d.ts +77 -0
- package/lib/contexts.js +3 -0
- package/lib/fsUtils.d.ts +5 -0
- package/lib/fsUtils.js +51 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +6 -0
- package/lib/prompts.d.ts +18 -0
- package/lib/prompts.js +222 -0
- package/lib/skills.d.ts +3 -0
- package/lib/skills.js +207 -0
- package/lib/ui/BottomBlock.d.ts +70 -0
- package/lib/ui/BottomBlock.js +193 -0
- package/lib/ui/formatters.d.ts +29 -0
- package/lib/ui/formatters.js +222 -0
- package/lib/wait.d.ts +2 -0
- package/lib/wait.js +36 -0
- package/package.json +41 -0
package/lib/Claude.d.ts
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { ClaudeContext, TimeContext } from "./contexts";
|
|
2
|
+
export type ClaudeResult = Readonly<{
|
|
3
|
+
text: string;
|
|
4
|
+
sessionId: string | null;
|
|
5
|
+
inputTokens: number;
|
|
6
|
+
outputTokens: number;
|
|
7
|
+
}>;
|
|
8
|
+
export type ClaudeContentBlock = Readonly<{
|
|
9
|
+
type?: string;
|
|
10
|
+
text?: string;
|
|
11
|
+
thinking?: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
id?: string;
|
|
14
|
+
input?: Readonly<Record<string, unknown>>;
|
|
15
|
+
tool_use_id?: string;
|
|
16
|
+
content?: string | ReadonlyArray<Readonly<{
|
|
17
|
+
type?: string;
|
|
18
|
+
text?: string;
|
|
19
|
+
}>>;
|
|
20
|
+
is_error?: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
export type ClaudeDelta = Readonly<{
|
|
23
|
+
type?: string;
|
|
24
|
+
text?: string;
|
|
25
|
+
partial_json?: string;
|
|
26
|
+
}>;
|
|
27
|
+
export type ClaudeControlRequestBody = Readonly<{
|
|
28
|
+
subtype?: string;
|
|
29
|
+
request_id?: string;
|
|
30
|
+
tool_name?: string;
|
|
31
|
+
input?: unknown;
|
|
32
|
+
tool_input?: unknown;
|
|
33
|
+
}>;
|
|
34
|
+
export type ClaudeEvent = Readonly<{
|
|
35
|
+
type?: string;
|
|
36
|
+
subtype?: string;
|
|
37
|
+
is_error?: boolean;
|
|
38
|
+
api_error_status?: number | null;
|
|
39
|
+
session_id?: string;
|
|
40
|
+
index?: number;
|
|
41
|
+
request_id?: string;
|
|
42
|
+
request?: ClaudeControlRequestBody;
|
|
43
|
+
message?: Readonly<{
|
|
44
|
+
role?: string;
|
|
45
|
+
content?: ReadonlyArray<ClaudeContentBlock>;
|
|
46
|
+
usage?: Readonly<{
|
|
47
|
+
input_tokens?: number;
|
|
48
|
+
output_tokens?: number;
|
|
49
|
+
cache_creation_input_tokens?: number;
|
|
50
|
+
cache_read_input_tokens?: number;
|
|
51
|
+
}>;
|
|
52
|
+
}>;
|
|
53
|
+
content_block?: ClaudeContentBlock;
|
|
54
|
+
delta?: ClaudeDelta;
|
|
55
|
+
event?: ClaudeEvent;
|
|
56
|
+
error?: Readonly<{
|
|
57
|
+
message?: string;
|
|
58
|
+
}>;
|
|
59
|
+
result?: string;
|
|
60
|
+
usage?: Readonly<{
|
|
61
|
+
input_tokens?: number;
|
|
62
|
+
output_tokens?: number;
|
|
63
|
+
cache_creation_input_tokens?: number;
|
|
64
|
+
cache_read_input_tokens?: number;
|
|
65
|
+
}>;
|
|
66
|
+
rate_limit_info?: Readonly<{
|
|
67
|
+
status?: string;
|
|
68
|
+
resetsAt?: number;
|
|
69
|
+
rateLimitType?: string;
|
|
70
|
+
isUsingOverage?: boolean;
|
|
71
|
+
overageStatus?: string;
|
|
72
|
+
overageResetsAt?: number;
|
|
73
|
+
utilization?: number;
|
|
74
|
+
surpassedThreshold?: number;
|
|
75
|
+
}>;
|
|
76
|
+
}>;
|
|
77
|
+
export type PermissionRequest = Readonly<{
|
|
78
|
+
request_id: string;
|
|
79
|
+
tool_name: string;
|
|
80
|
+
tool_input: unknown;
|
|
81
|
+
}>;
|
|
82
|
+
export type PermissionResponse = Readonly<{
|
|
83
|
+
behavior: "allow";
|
|
84
|
+
updatedInput?: unknown;
|
|
85
|
+
updated_permissions?: readonly unknown[];
|
|
86
|
+
}> | Readonly<{
|
|
87
|
+
behavior: "deny";
|
|
88
|
+
message: string;
|
|
89
|
+
interrupt?: boolean;
|
|
90
|
+
}>;
|
|
91
|
+
export type ClaudeRunOptions = Readonly<{
|
|
92
|
+
prompt: string;
|
|
93
|
+
cwd?: string;
|
|
94
|
+
initialSessionId?: string | null;
|
|
95
|
+
forkFromSessionId?: string | null;
|
|
96
|
+
onEvent?(event: ClaudeEvent): void;
|
|
97
|
+
onStderr?(chunk: string): void;
|
|
98
|
+
onPermissionRequest?(req: PermissionRequest): Promise<PermissionResponse>;
|
|
99
|
+
onLongWaitStart?(kind: "rate-limit", endTimeMs: number): void;
|
|
100
|
+
onLongWaitEnd?(): void;
|
|
101
|
+
}>;
|
|
102
|
+
export declare class NonRetryableError extends Error {
|
|
103
|
+
constructor(message: string);
|
|
104
|
+
}
|
|
105
|
+
export declare class Claude {
|
|
106
|
+
readonly options: ClaudeRunOptions;
|
|
107
|
+
private _context;
|
|
108
|
+
private _time;
|
|
109
|
+
private _disposed;
|
|
110
|
+
private _process;
|
|
111
|
+
private _waitAbort;
|
|
112
|
+
private _runPromise;
|
|
113
|
+
private _sessionId;
|
|
114
|
+
private _forkFromSessionId;
|
|
115
|
+
private _killTimer;
|
|
116
|
+
private _transientAttempt;
|
|
117
|
+
constructor(options: ClaudeRunOptions, _context: ClaudeContext, _time: TimeContext);
|
|
118
|
+
result(): Promise<ClaudeResult>;
|
|
119
|
+
sendUserMessage(content: string): void;
|
|
120
|
+
sendControlResponse(requestId: string, response: PermissionResponse): void;
|
|
121
|
+
endSession(): void;
|
|
122
|
+
private _writeStdin;
|
|
123
|
+
private _run;
|
|
124
|
+
private _runOnce;
|
|
125
|
+
private _attachStreamParser;
|
|
126
|
+
private _scheduleWait;
|
|
127
|
+
private _handleControlRequest;
|
|
128
|
+
dispose(): Promise<void>;
|
|
129
|
+
}
|
package/lib/Claude.js
ADDED
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Claude = exports.NonRetryableError = void 0;
|
|
4
|
+
const wait_1 = require("./wait");
|
|
5
|
+
const RATE_LIMIT_CHUNK_MS = 60 * 60 * 1000;
|
|
6
|
+
const INITIAL_TRANSIENT_WAIT_MS = 1_000;
|
|
7
|
+
const TRANSIENT_WAIT_CAP_MS = 60_000;
|
|
8
|
+
class RateLimitError extends Error {
|
|
9
|
+
retryAfterMs;
|
|
10
|
+
inputTokens;
|
|
11
|
+
outputTokens;
|
|
12
|
+
constructor(retryAfterMs, inputTokens = 0, outputTokens = 0) {
|
|
13
|
+
super(`rate_limit: retry after ${retryAfterMs}ms`);
|
|
14
|
+
this.retryAfterMs = retryAfterMs;
|
|
15
|
+
this.inputTokens = inputTokens;
|
|
16
|
+
this.outputTokens = outputTokens;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
class RetryableTransientError extends Error {
|
|
20
|
+
inputTokens;
|
|
21
|
+
outputTokens;
|
|
22
|
+
constructor(inputTokens = 0, outputTokens = 0) {
|
|
23
|
+
super("retryable transient error");
|
|
24
|
+
this.inputTokens = inputTokens;
|
|
25
|
+
this.outputTokens = outputTokens;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
class NonRetryableError extends Error {
|
|
29
|
+
constructor(message) {
|
|
30
|
+
super(message);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.NonRetryableError = NonRetryableError;
|
|
34
|
+
class Claude {
|
|
35
|
+
options;
|
|
36
|
+
_context;
|
|
37
|
+
_time;
|
|
38
|
+
_disposed = false;
|
|
39
|
+
_process = null;
|
|
40
|
+
_waitAbort = null;
|
|
41
|
+
_runPromise;
|
|
42
|
+
_sessionId;
|
|
43
|
+
_forkFromSessionId;
|
|
44
|
+
_killTimer = null;
|
|
45
|
+
_transientAttempt = 0;
|
|
46
|
+
constructor(options, _context, _time) {
|
|
47
|
+
this.options = options;
|
|
48
|
+
this._context = _context;
|
|
49
|
+
this._time = _time;
|
|
50
|
+
this._sessionId = options.initialSessionId ?? null;
|
|
51
|
+
this._forkFromSessionId = options.forkFromSessionId ?? null;
|
|
52
|
+
this._runPromise = this._run();
|
|
53
|
+
this._runPromise.catch(() => { });
|
|
54
|
+
}
|
|
55
|
+
result() {
|
|
56
|
+
return this._runPromise;
|
|
57
|
+
}
|
|
58
|
+
sendUserMessage(content) {
|
|
59
|
+
this._writeStdin({ type: "user", message: { role: "user", content } });
|
|
60
|
+
}
|
|
61
|
+
sendControlResponse(requestId, response) {
|
|
62
|
+
this._writeStdin({
|
|
63
|
+
type: "control_response",
|
|
64
|
+
response: {
|
|
65
|
+
subtype: "success",
|
|
66
|
+
request_id: requestId,
|
|
67
|
+
response
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
endSession() {
|
|
72
|
+
if (this._disposed) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this._process?.stdin?.end();
|
|
76
|
+
}
|
|
77
|
+
_writeStdin(payload) {
|
|
78
|
+
if (this._disposed) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const stdin = this._process?.stdin;
|
|
82
|
+
if (!stdin) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
stdin.write(JSON.stringify(payload) + "\n");
|
|
86
|
+
}
|
|
87
|
+
async _run() {
|
|
88
|
+
if (this._sessionId != null && this._forkFromSessionId != null) {
|
|
89
|
+
throw new Error("Cannot specify both forkFromSessionId and initialSessionId");
|
|
90
|
+
}
|
|
91
|
+
let totalInputTokens = 0;
|
|
92
|
+
let totalOutputTokens = 0;
|
|
93
|
+
for (;;) {
|
|
94
|
+
if (this._disposed) {
|
|
95
|
+
throw new Error("Claude disposed");
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
const result = await this._runOnce();
|
|
99
|
+
totalInputTokens += result.inputTokens;
|
|
100
|
+
totalOutputTokens += result.outputTokens;
|
|
101
|
+
this._transientAttempt = 0;
|
|
102
|
+
return { ...result, inputTokens: totalInputTokens, outputTokens: totalOutputTokens };
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
if (e instanceof RateLimitError) {
|
|
106
|
+
totalInputTokens += e.inputTokens;
|
|
107
|
+
totalOutputTokens += e.outputTokens;
|
|
108
|
+
if (this._disposed) {
|
|
109
|
+
throw new Error("Claude disposed");
|
|
110
|
+
}
|
|
111
|
+
this.options.onLongWaitStart?.("rate-limit", this._time.now() + e.retryAfterMs);
|
|
112
|
+
try {
|
|
113
|
+
await this._scheduleWait(e.retryAfterMs, RATE_LIMIT_CHUNK_MS);
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
this.options.onLongWaitEnd?.();
|
|
117
|
+
}
|
|
118
|
+
if (this._disposed) {
|
|
119
|
+
throw new Error("Claude disposed");
|
|
120
|
+
}
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (e instanceof RetryableTransientError) {
|
|
124
|
+
totalInputTokens += e.inputTokens;
|
|
125
|
+
totalOutputTokens += e.outputTokens;
|
|
126
|
+
this._transientAttempt++;
|
|
127
|
+
const waitMs = Math.min(TRANSIENT_WAIT_CAP_MS, INITIAL_TRANSIENT_WAIT_MS * 2 ** (this._transientAttempt - 1));
|
|
128
|
+
await this._scheduleWait(waitMs, waitMs);
|
|
129
|
+
if (this._disposed) {
|
|
130
|
+
throw new Error("Claude disposed");
|
|
131
|
+
}
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
throw e;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
_runOnce() {
|
|
139
|
+
return new Promise((resolve, reject) => {
|
|
140
|
+
if (this._disposed) {
|
|
141
|
+
return reject(new Error("Claude disposed"));
|
|
142
|
+
}
|
|
143
|
+
const args = [];
|
|
144
|
+
if (this._sessionId) {
|
|
145
|
+
args.push("--resume", this._sessionId);
|
|
146
|
+
}
|
|
147
|
+
else if (this._forkFromSessionId) {
|
|
148
|
+
args.push("--resume", this._forkFromSessionId, "--fork-session");
|
|
149
|
+
this._forkFromSessionId = null;
|
|
150
|
+
}
|
|
151
|
+
args.push("--model=claude-opus-4-6", "--effort=xhigh", "--input-format=stream-json", "--output-format=stream-json", "--include-partial-messages", "--permission-prompt-tool=stdio", "--verbose", "-p");
|
|
152
|
+
const spawnOptions = {
|
|
153
|
+
stdio: "pipe",
|
|
154
|
+
...(this.options.cwd ? { cwd: this.options.cwd } : null)
|
|
155
|
+
};
|
|
156
|
+
const proc = this._context.spawn("claude", args, spawnOptions);
|
|
157
|
+
this._process = proc;
|
|
158
|
+
const initialMessage = {
|
|
159
|
+
type: "user",
|
|
160
|
+
message: { role: "user", content: this.options.prompt }
|
|
161
|
+
};
|
|
162
|
+
proc.stdin?.write(JSON.stringify(initialMessage) + "\n");
|
|
163
|
+
const collected = {
|
|
164
|
+
text: "",
|
|
165
|
+
session: null,
|
|
166
|
+
rateLimit: null,
|
|
167
|
+
isRetryableError: false,
|
|
168
|
+
nonRetryableReason: null,
|
|
169
|
+
inputTokens: 0,
|
|
170
|
+
outputTokens: 0
|
|
171
|
+
};
|
|
172
|
+
this._attachStreamParser(proc, collected);
|
|
173
|
+
let settled = false;
|
|
174
|
+
const settle = (outcome) => {
|
|
175
|
+
if (settled) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
settled = true;
|
|
179
|
+
this._process = null;
|
|
180
|
+
if (outcome.ok) {
|
|
181
|
+
resolve(outcome.value);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
reject(outcome.error);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
proc.on("error", e => {
|
|
188
|
+
settle({ ok: false, error: e instanceof Error ? e : new Error(String(e)) });
|
|
189
|
+
});
|
|
190
|
+
proc.on("exit", code => {
|
|
191
|
+
if (collected.session) {
|
|
192
|
+
this._sessionId = collected.session;
|
|
193
|
+
}
|
|
194
|
+
if (this._disposed) {
|
|
195
|
+
settle({ ok: false, error: new Error("Claude disposed") });
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (collected.rateLimit) {
|
|
199
|
+
settle({ ok: false, error: new RateLimitError(collected.rateLimit.retryAfterMs, collected.inputTokens, collected.outputTokens) });
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (collected.isRetryableError) {
|
|
203
|
+
settle({ ok: false, error: new RetryableTransientError(collected.inputTokens, collected.outputTokens) });
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (collected.nonRetryableReason) {
|
|
207
|
+
settle({ ok: false, error: new NonRetryableError(collected.nonRetryableReason) });
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
if (code === 0 || code === null) {
|
|
211
|
+
settle({ ok: true, value: { text: collected.text, sessionId: collected.session, inputTokens: collected.inputTokens, outputTokens: collected.outputTokens } });
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
settle({ ok: false, error: new NonRetryableError(`Claude process exited with code ${code}`) });
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
_attachStreamParser(proc, collected) {
|
|
220
|
+
let buffer = "";
|
|
221
|
+
const handleLine = (line) => {
|
|
222
|
+
if (!line) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
let parsed = null;
|
|
226
|
+
try {
|
|
227
|
+
parsed = JSON.parse(line);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
if (!parsed) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
if (parsed.session_id && !collected.session) {
|
|
236
|
+
collected.session = parsed.session_id;
|
|
237
|
+
}
|
|
238
|
+
if (parsed.type === "rate_limit_event" && parsed.rate_limit_info?.status === "rejected") {
|
|
239
|
+
const info = parsed.rate_limit_info;
|
|
240
|
+
const target = info.isUsingOverage && typeof info.overageResetsAt === "number"
|
|
241
|
+
? info.overageResetsAt
|
|
242
|
+
: info.resetsAt;
|
|
243
|
+
if (typeof target === "number") {
|
|
244
|
+
const retryAfterMs = Math.max(0, target * 1000 - this._time.now());
|
|
245
|
+
collected.rateLimit = new RateLimitError(retryAfterMs);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
else if (parsed.type === "result") {
|
|
249
|
+
if (typeof parsed.result === "string") {
|
|
250
|
+
collected.text = parsed.result;
|
|
251
|
+
}
|
|
252
|
+
const u = parsed.usage;
|
|
253
|
+
if (u) {
|
|
254
|
+
collected.inputTokens = (u.input_tokens ?? 0) + (u.cache_creation_input_tokens ?? 0) + (u.cache_read_input_tokens ?? 0);
|
|
255
|
+
collected.outputTokens = u.output_tokens ?? 0;
|
|
256
|
+
}
|
|
257
|
+
if (parsed.is_error) {
|
|
258
|
+
const subtype = parsed.subtype;
|
|
259
|
+
const status = parsed.api_error_status;
|
|
260
|
+
if (subtype === "error_max_turns" || subtype === "error_max_budget_usd" || subtype === "error_max_structured_output_retries") {
|
|
261
|
+
collected.nonRetryableReason = subtype;
|
|
262
|
+
}
|
|
263
|
+
else if ((typeof status === "number" && (status >= 500 || status === 408 || status === 425)) ||
|
|
264
|
+
status === null ||
|
|
265
|
+
subtype === "error_during_execution") {
|
|
266
|
+
collected.isRetryableError = true;
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
collected.nonRetryableReason = typeof status === "number" ? `HTTP ${status}` : "unknown error";
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
else if (parsed.type === "assistant" && parsed.message?.content) {
|
|
274
|
+
let text = "";
|
|
275
|
+
for (const block of parsed.message.content) {
|
|
276
|
+
if (block.type === "text" && typeof block.text === "string") {
|
|
277
|
+
text += block.text;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (text) {
|
|
281
|
+
collected.text = text;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
else if (parsed.type === "control_request" || parsed.type === "sdk_control_request") {
|
|
285
|
+
this._handleControlRequest(parsed);
|
|
286
|
+
}
|
|
287
|
+
try {
|
|
288
|
+
this.options.onEvent?.(parsed);
|
|
289
|
+
}
|
|
290
|
+
catch (e) {
|
|
291
|
+
if (this.options.onStderr) {
|
|
292
|
+
this.options.onStderr(`onEvent handler threw: ${String(e)}\n`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
proc.stdout?.on("data", chunk => {
|
|
297
|
+
buffer += String(chunk);
|
|
298
|
+
for (;;) {
|
|
299
|
+
const nl = buffer.indexOf("\n");
|
|
300
|
+
if (nl < 0) {
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
const line = buffer.slice(0, nl).replace(/\r$/, "");
|
|
304
|
+
buffer = buffer.slice(nl + 1);
|
|
305
|
+
handleLine(line);
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
proc.stderr?.on("data", chunk => {
|
|
309
|
+
if (this.options.onStderr) {
|
|
310
|
+
this.options.onStderr(String(chunk));
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
_scheduleWait(totalMs, chunkMs) {
|
|
315
|
+
const abort = new AbortController();
|
|
316
|
+
this._waitAbort = abort;
|
|
317
|
+
return (0, wait_1.wait)(totalMs, chunkMs, this._time, abort.signal).then(() => {
|
|
318
|
+
if (this._waitAbort === abort) {
|
|
319
|
+
this._waitAbort = null;
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
_handleControlRequest(parsed) {
|
|
324
|
+
const req = parsed.request;
|
|
325
|
+
if (!req) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
if (req.subtype !== "can_use_tool" && req.subtype !== "permission") {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const requestId = parsed.request_id ?? req.request_id;
|
|
332
|
+
if (typeof requestId !== "string" || requestId.length === 0) {
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
const toolName = req.tool_name;
|
|
336
|
+
if (typeof toolName !== "string") {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const toolInput = req.input ?? req.tool_input;
|
|
340
|
+
const handler = this.options.onPermissionRequest;
|
|
341
|
+
const responsePromise = handler
|
|
342
|
+
? handler({ request_id: requestId, tool_name: toolName, tool_input: toolInput })
|
|
343
|
+
: Promise.resolve({
|
|
344
|
+
behavior: "allow",
|
|
345
|
+
updatedInput: typeof toolInput === "object" && toolInput !== null ? toolInput : {}
|
|
346
|
+
});
|
|
347
|
+
responsePromise.then(response => {
|
|
348
|
+
this.sendControlResponse(requestId, response);
|
|
349
|
+
}, err => {
|
|
350
|
+
this.sendControlResponse(requestId, {
|
|
351
|
+
behavior: "deny",
|
|
352
|
+
message: err instanceof Error ? err.message : String(err)
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
async dispose() {
|
|
357
|
+
if (this._disposed) {
|
|
358
|
+
try {
|
|
359
|
+
await this._runPromise;
|
|
360
|
+
}
|
|
361
|
+
catch {
|
|
362
|
+
}
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
this._disposed = true;
|
|
366
|
+
this._waitAbort?.abort();
|
|
367
|
+
const proc = this._process;
|
|
368
|
+
if (proc) {
|
|
369
|
+
const exitWaiter = new Promise(resolve => {
|
|
370
|
+
proc.on("exit", () => resolve());
|
|
371
|
+
});
|
|
372
|
+
proc.stdin?.end();
|
|
373
|
+
proc.kill("SIGINT");
|
|
374
|
+
this._killTimer = this._time.setTimeout(() => {
|
|
375
|
+
this._killTimer = null;
|
|
376
|
+
proc.kill("SIGTERM");
|
|
377
|
+
}, 5000);
|
|
378
|
+
await exitWaiter;
|
|
379
|
+
this._killTimer?.cancel();
|
|
380
|
+
this._killTimer = null;
|
|
381
|
+
}
|
|
382
|
+
try {
|
|
383
|
+
await this._runPromise;
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
exports.Claude = Claude;
|
|
390
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xhdWRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0NsYXVkZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxpQ0FBOEI7QUFFOUIsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMzQyxNQUFNLHlCQUF5QixHQUFHLEtBQUssQ0FBQztBQUN4QyxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQXFHckMsTUFBTSxjQUFlLFNBQVEsS0FBSztJQUVqQjtJQUNBO0lBQ0E7SUFIYixZQUNhLFlBQW1CLEVBQ25CLGNBQXFCLENBQUMsRUFDdEIsZUFBc0IsQ0FBQztRQUVoQyxLQUFLLENBQUMsMkJBQTJCLFlBQVksSUFBSSxDQUFDLENBQUM7UUFKMUMsaUJBQVksR0FBWixZQUFZLENBQU87UUFDbkIsZ0JBQVcsR0FBWCxXQUFXLENBQVc7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQVc7SUFHcEMsQ0FBQztDQUNKO0FBRUQsTUFBTSx1QkFBd0IsU0FBUSxLQUFLO0lBRTFCO0lBQ0E7SUFGYixZQUNhLGNBQXFCLENBQUMsRUFDdEIsZUFBc0IsQ0FBQztRQUVoQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUgxQixnQkFBVyxHQUFYLFdBQVcsQ0FBVztRQUN0QixpQkFBWSxHQUFaLFlBQVksQ0FBVztJQUdwQyxDQUFDO0NBQ0o7QUFFRCxNQUFhLGlCQUFrQixTQUFRLEtBQUs7SUFDeEMsWUFBWSxPQUFjO1FBQ3RCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQixDQUFDO0NBQ0o7QUFKRCw4Q0FJQztBQUVELE1BQWEsTUFBTTtJQVVGO0lBQ0Q7SUFDQTtJQVhKLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsUUFBUSxHQUF1QixJQUFJLENBQUM7SUFDcEMsVUFBVSxHQUF3QixJQUFJLENBQUM7SUFDdkMsV0FBVyxDQUF1QjtJQUNsQyxVQUFVLENBQWE7SUFDdkIsa0JB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
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ClaudeResult } from "./Claude";
|
|
2
|
+
import type { AskContext, ClaudeContext, OutputContext, TimeContext } from "./contexts";
|
|
3
|
+
export type ClaudeSessionOptions = Readonly<{
|
|
4
|
+
prompt: string;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
initialSessionId?: string | null;
|
|
7
|
+
forkFromSessionId?: string | null;
|
|
8
|
+
onLongWaitStart?(kind: "rate-limit", endTimeMs: number): void;
|
|
9
|
+
onLongWaitEnd?(): void;
|
|
10
|
+
}>;
|
|
11
|
+
export type ClaudeSessionContexts = Readonly<{
|
|
12
|
+
claude: ClaudeContext;
|
|
13
|
+
time: TimeContext;
|
|
14
|
+
output: OutputContext;
|
|
15
|
+
ask: AskContext;
|
|
16
|
+
}>;
|
|
17
|
+
export declare class ClaudeSession {
|
|
18
|
+
private _options;
|
|
19
|
+
private _contexts;
|
|
20
|
+
private _disposed;
|
|
21
|
+
private _claude;
|
|
22
|
+
private _printedAnyOutputThisRun;
|
|
23
|
+
private _seenTextThisMessage;
|
|
24
|
+
private _textOpen;
|
|
25
|
+
constructor(_options: ClaudeSessionOptions, _contexts: ClaudeSessionContexts);
|
|
26
|
+
run(): Promise<ClaudeResult>;
|
|
27
|
+
dispose(): Promise<void>;
|
|
28
|
+
private _resetState;
|
|
29
|
+
private _onPermissionRequest;
|
|
30
|
+
private _handleAskUserQuestion;
|
|
31
|
+
private _onEvent;
|
|
32
|
+
private _emitText;
|
|
33
|
+
private _closeOpenTextLine;
|
|
34
|
+
}
|