ridgeline 0.2.11 → 0.2.13
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/dist/engine/claude/claude.exec.d.ts +4 -0
- package/dist/engine/claude/claude.exec.js +38 -0
- package/dist/engine/claude/claude.exec.js.map +1 -1
- package/dist/engine/claude/stream.decode.d.ts +3 -0
- package/dist/engine/claude/stream.decode.js +32 -0
- package/dist/engine/claude/stream.decode.js.map +1 -1
- package/dist/ui/spinner.d.ts +2 -0
- package/dist/ui/spinner.js +8 -2
- package/dist/ui/spinner.js.map +1 -1
- package/package.json +1 -1
|
@@ -13,6 +13,10 @@ export type InvokeOptions = {
|
|
|
13
13
|
pluginDirs?: string[];
|
|
14
14
|
cwd: string;
|
|
15
15
|
timeoutMs?: number;
|
|
16
|
+
/** Kill if no stdout within this many ms of spawn (default: 2 min). */
|
|
17
|
+
startupTimeoutMs?: number;
|
|
18
|
+
/** Kill if no stdout for this many ms during execution (default: 5 min). */
|
|
19
|
+
stallTimeoutMs?: number;
|
|
16
20
|
sessionId?: string;
|
|
17
21
|
jsonSchema?: string;
|
|
18
22
|
onStdout?: (chunk: string) => void;
|
|
@@ -3,6 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.invokeClaude = void 0;
|
|
4
4
|
const node_child_process_1 = require("node:child_process");
|
|
5
5
|
const stream_decode_1 = require("./stream.decode");
|
|
6
|
+
/** Default: kill if no stdout arrives within 2 minutes of spawn. */
|
|
7
|
+
const DEFAULT_STARTUP_TIMEOUT_MS = 2 * 60 * 1000;
|
|
8
|
+
/** Default: kill if no stdout arrives for 5 minutes during execution. */
|
|
9
|
+
const DEFAULT_STALL_TIMEOUT_MS = 5 * 60 * 1000;
|
|
6
10
|
const invokeClaude = (opts) => {
|
|
7
11
|
return new Promise((resolve, reject) => {
|
|
8
12
|
const args = [
|
|
@@ -41,14 +45,42 @@ const invokeClaude = (opts) => {
|
|
|
41
45
|
});
|
|
42
46
|
let stdoutData = "";
|
|
43
47
|
let stderrData = "";
|
|
48
|
+
// --- Stall / startup detection ---
|
|
49
|
+
let stalled = false;
|
|
50
|
+
let stallReason = "";
|
|
51
|
+
const startupMs = opts.startupTimeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS;
|
|
52
|
+
const stallMs = opts.stallTimeoutMs ?? DEFAULT_STALL_TIMEOUT_MS;
|
|
53
|
+
const killOnStall = (reason) => {
|
|
54
|
+
stalled = true;
|
|
55
|
+
stallReason = reason;
|
|
56
|
+
proc.kill("SIGTERM");
|
|
57
|
+
setTimeout(() => proc.kill("SIGKILL"), 5000);
|
|
58
|
+
};
|
|
59
|
+
// Startup probe: short fuse for the very first stdout event
|
|
60
|
+
let stallTimer = setTimeout(() => {
|
|
61
|
+
killOnStall(`No output received within ${Math.round(startupMs / 1000)}s of spawn (startup timeout)`);
|
|
62
|
+
}, startupMs);
|
|
63
|
+
const resetStallTimer = () => {
|
|
64
|
+
if (stalled)
|
|
65
|
+
return;
|
|
66
|
+
if (stallTimer)
|
|
67
|
+
clearTimeout(stallTimer);
|
|
68
|
+
stallTimer = setTimeout(() => {
|
|
69
|
+
killOnStall(`No output received for ${Math.round(stallMs / 1000)}s (stall timeout)`);
|
|
70
|
+
}, stallMs);
|
|
71
|
+
};
|
|
44
72
|
proc.stdout?.on("data", (chunk) => {
|
|
45
73
|
const text = chunk.toString("utf-8");
|
|
46
74
|
stdoutData += text;
|
|
75
|
+
resetStallTimer();
|
|
47
76
|
opts.onStdout?.(text);
|
|
48
77
|
});
|
|
49
78
|
proc.stderr?.on("data", (chunk) => {
|
|
50
79
|
stderrData += chunk.toString("utf-8");
|
|
80
|
+
// stderr activity also resets the stall timer — the process is alive
|
|
81
|
+
resetStallTimer();
|
|
51
82
|
});
|
|
83
|
+
// --- Global timeout ---
|
|
52
84
|
let timedOut = false;
|
|
53
85
|
let timer = null;
|
|
54
86
|
if (opts.timeoutMs) {
|
|
@@ -61,10 +93,16 @@ const invokeClaude = (opts) => {
|
|
|
61
93
|
proc.on("close", (code) => {
|
|
62
94
|
if (timer)
|
|
63
95
|
clearTimeout(timer);
|
|
96
|
+
if (stallTimer)
|
|
97
|
+
clearTimeout(stallTimer);
|
|
64
98
|
if (timedOut) {
|
|
65
99
|
reject(new Error("Claude invocation timed out"));
|
|
66
100
|
return;
|
|
67
101
|
}
|
|
102
|
+
if (stalled) {
|
|
103
|
+
reject(new Error(`Claude invocation stalled: ${stallReason}`));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
68
106
|
if (code !== 0 && !stdoutData.trim()) {
|
|
69
107
|
reject(new Error(`claude exited with code ${code}: ${stderrData}`));
|
|
70
108
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.exec.js","sourceRoot":"","sources":["../../../src/engine/claude/claude.exec.ts"],"names":[],"mappings":";;;AAAA,2DAAwD;AAExD,mDAA+C;
|
|
1
|
+
{"version":3,"file":"claude.exec.js","sourceRoot":"","sources":["../../../src/engine/claude/claude.exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@ const parseStreamLine = (line) => {
|
|
|
20
20
|
catch {
|
|
21
21
|
return { type: "other" };
|
|
22
22
|
}
|
|
23
|
+
// Legacy format: {"type":"assistant","subtype":"text","text":"..."}
|
|
23
24
|
if (parsed.type === "assistant" && parsed.subtype === "text") {
|
|
24
25
|
const text = parsed.text;
|
|
25
26
|
if (typeof text === "string" && text.length > 0) {
|
|
@@ -27,6 +28,34 @@ const parseStreamLine = (line) => {
|
|
|
27
28
|
}
|
|
28
29
|
return { type: "other" };
|
|
29
30
|
}
|
|
31
|
+
// Legacy format: {"type":"assistant","subtype":"tool_use","tool":"Read"}
|
|
32
|
+
if (parsed.type === "assistant" && parsed.subtype === "tool_use") {
|
|
33
|
+
const tool = parsed.tool;
|
|
34
|
+
if (typeof tool === "string" && tool.length > 0) {
|
|
35
|
+
return { type: "tool_use", tool };
|
|
36
|
+
}
|
|
37
|
+
return { type: "other" };
|
|
38
|
+
}
|
|
39
|
+
// Current format: {"type":"assistant","message":{"content":[...]}}
|
|
40
|
+
if (parsed.type === "assistant" && parsed.message) {
|
|
41
|
+
const message = parsed.message;
|
|
42
|
+
const content = message.content;
|
|
43
|
+
if (Array.isArray(content)) {
|
|
44
|
+
const textParts = content
|
|
45
|
+
.filter((c) => c.type === "text" && typeof c.text === "string")
|
|
46
|
+
.map((c) => c.text)
|
|
47
|
+
.join("");
|
|
48
|
+
if (textParts.length > 0) {
|
|
49
|
+
return { type: "text", text: textParts };
|
|
50
|
+
}
|
|
51
|
+
// No text found — check for tool_use blocks
|
|
52
|
+
const toolBlock = content.find((c) => c.type === "tool_use" && typeof c.name === "string");
|
|
53
|
+
if (toolBlock) {
|
|
54
|
+
return { type: "tool_use", tool: toolBlock.name };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { type: "other" };
|
|
58
|
+
}
|
|
30
59
|
if (parsed.type === "result") {
|
|
31
60
|
return { type: "result", result: parseClaudeResult(parsed) };
|
|
32
61
|
}
|
|
@@ -88,6 +117,9 @@ const createDisplayCallbacks = () => {
|
|
|
88
117
|
}
|
|
89
118
|
process.stdout.write(event.text);
|
|
90
119
|
}
|
|
120
|
+
else if (event.type === "tool_use") {
|
|
121
|
+
spinner.setDetail(event.tool);
|
|
122
|
+
}
|
|
91
123
|
});
|
|
92
124
|
return {
|
|
93
125
|
onStdout: handler,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.decode.js","sourceRoot":"","sources":["../../../src/engine/claude/stream.decode.ts"],"names":[],"mappings":";;;AACA,8CAA+C;
|
|
1
|
+
{"version":3,"file":"stream.decode.js","sourceRoot":"","sources":["../../../src/engine/claude/stream.decode.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/spinner.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export interface Spinner {
|
|
|
5
5
|
pause(): void;
|
|
6
6
|
/** Resume the spinner after a pause. */
|
|
7
7
|
resume(): void;
|
|
8
|
+
/** Show a tool name or detail next to the spinner (e.g. "Read", "Bash"). */
|
|
9
|
+
setDetail(detail: string): void;
|
|
8
10
|
}
|
|
9
11
|
export declare const pickVerb: () => string;
|
|
10
12
|
export declare const formatElapsed: (ms: number) => string;
|
package/dist/ui/spinner.js
CHANGED
|
@@ -88,19 +88,22 @@ exports.formatElapsed = formatElapsed;
|
|
|
88
88
|
const startSpinner = (verb) => {
|
|
89
89
|
// If stderr is not a TTY (e.g. piped to a file), skip animation entirely.
|
|
90
90
|
if (!process.stderr.isTTY) {
|
|
91
|
-
return { stop() { }, pause() { }, resume() { } };
|
|
91
|
+
return { stop() { }, pause() { }, resume() { }, setDetail() { } };
|
|
92
92
|
}
|
|
93
93
|
let frameIndex = 0;
|
|
94
94
|
let direction = 1;
|
|
95
95
|
let pauseFrames = 0;
|
|
96
96
|
let stopped = false;
|
|
97
|
+
let detail = "";
|
|
97
98
|
const label = verb ?? (0, exports.pickVerb)();
|
|
98
99
|
const startTime = Date.now();
|
|
99
100
|
const tick = () => {
|
|
100
101
|
const frame = FRAMES[frameIndex];
|
|
101
102
|
const elapsed = (0, exports.formatElapsed)(Date.now() - startTime);
|
|
103
|
+
const suffix = detail ? ` [${detail}]` : "";
|
|
102
104
|
// \r moves cursor to start of line; the frame overwrites previous output.
|
|
103
|
-
|
|
105
|
+
// \x1b[K clears to end of line to avoid artifacts from longer previous lines.
|
|
106
|
+
process.stderr.write(`\r\x1b[K${frame} ${label}... (${elapsed})${suffix}`);
|
|
104
107
|
if (pauseFrames > 0) {
|
|
105
108
|
pauseFrames--;
|
|
106
109
|
return;
|
|
@@ -138,6 +141,9 @@ const startSpinner = (verb) => {
|
|
|
138
141
|
return;
|
|
139
142
|
timer = setInterval(tick, DEFAULT_INTERVAL_MS);
|
|
140
143
|
},
|
|
144
|
+
setDetail(text) {
|
|
145
|
+
detail = text;
|
|
146
|
+
},
|
|
141
147
|
};
|
|
142
148
|
};
|
|
143
149
|
exports.startSpinner = startSpinner;
|
package/dist/ui/spinner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":";AAAA,kEAAkE;AAClE,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;;;AAE5E,MAAM,MAAM,GAAG;IACb,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;CACT,CAAA;AAED,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAE/B,MAAM,KAAK,GAAG;IACZ,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,kBAAkB;IAClB,eAAe;IACf,WAAW;IACX,aAAa;IACb,iBAAiB;IACjB,aAAa;IACb,UAAU;IACV,QAAQ;IACR,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,gBAAgB;IAChB,eAAe;IACf,YAAY;IACZ,cAAc;IACd,aAAa;IACb,YAAY;IACZ,aAAa;IACb,cAAc;IACd,eAAe;IACf,cAAc;IACd,aAAa;IACb,kBAAkB;IAClB,QAAQ;IACR,aAAa;IACb,cAAc;IACd,aAAa;IACb,aAAa;IACb,eAAe;IACf,WAAW;IACX,aAAa;IACb,aAAa;IACb,YAAY;IACZ,eAAe;IACf,aAAa;IACb,aAAa;IACb,eAAe;IACf,aAAa;IACb,eAAe;IACf,aAAa;IACb,eAAe;IACf,WAAW;IACX,iBAAiB;IACjB,eAAe;IACf,eAAe;CAChB,CAAA;
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"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"}
|