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.
@@ -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
+ }