mstro-app 0.1.58 → 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/PRIVACY.md +126 -0
- package/README.md +24 -23
- package/bin/commands/login.js +85 -42
- package/bin/commands/logout.js +35 -1
- package/bin/commands/status.js +1 -1
- package/bin/mstro.js +231 -131
- package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker.js +550 -115
- package/dist/server/cli/headless/claude-invoker.js.map +1 -1
- package/dist/server/cli/headless/index.d.ts +2 -1
- package/dist/server/cli/headless/index.d.ts.map +1 -1
- package/dist/server/cli/headless/index.js +2 -0
- package/dist/server/cli/headless/index.js.map +1 -1
- package/dist/server/cli/headless/prompt-utils.d.ts +5 -8
- package/dist/server/cli/headless/prompt-utils.d.ts.map +1 -1
- package/dist/server/cli/headless/prompt-utils.js +40 -5
- package/dist/server/cli/headless/prompt-utils.js.map +1 -1
- package/dist/server/cli/headless/runner.d.ts +1 -1
- package/dist/server/cli/headless/runner.d.ts.map +1 -1
- package/dist/server/cli/headless/runner.js +52 -7
- package/dist/server/cli/headless/runner.js.map +1 -1
- package/dist/server/cli/headless/stall-assessor.d.ts +79 -1
- package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
- package/dist/server/cli/headless/stall-assessor.js +355 -20
- package/dist/server/cli/headless/stall-assessor.js.map +1 -1
- package/dist/server/cli/headless/tool-watchdog.d.ts +70 -0
- package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -0
- package/dist/server/cli/headless/tool-watchdog.js +302 -0
- package/dist/server/cli/headless/tool-watchdog.js.map +1 -0
- package/dist/server/cli/headless/types.d.ts +98 -1
- package/dist/server/cli/headless/types.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.d.ts +136 -2
- package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.js +929 -132
- package/dist/server/cli/improvisation-session-manager.js.map +1 -1
- package/dist/server/index.js +5 -13
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
- package/dist/server/mcp/bouncer-integration.js +18 -0
- package/dist/server/mcp/bouncer-integration.js.map +1 -1
- package/dist/server/mcp/security-audit.d.ts +2 -2
- package/dist/server/mcp/security-audit.d.ts.map +1 -1
- package/dist/server/mcp/security-audit.js +12 -8
- package/dist/server/mcp/security-audit.js.map +1 -1
- package/dist/server/mcp/security-patterns.d.ts.map +1 -1
- package/dist/server/mcp/security-patterns.js +9 -4
- package/dist/server/mcp/security-patterns.js.map +1 -1
- package/dist/server/routes/improvise.js +6 -6
- package/dist/server/routes/improvise.js.map +1 -1
- package/dist/server/services/analytics.d.ts +2 -0
- package/dist/server/services/analytics.d.ts.map +1 -1
- package/dist/server/services/analytics.js +26 -4
- package/dist/server/services/analytics.js.map +1 -1
- package/dist/server/services/platform.d.ts.map +1 -1
- package/dist/server/services/platform.js +17 -10
- package/dist/server/services/platform.js.map +1 -1
- package/dist/server/services/sandbox-utils.d.ts +6 -0
- package/dist/server/services/sandbox-utils.d.ts.map +1 -0
- package/dist/server/services/sandbox-utils.js +72 -0
- package/dist/server/services/sandbox-utils.js.map +1 -0
- package/dist/server/services/settings.d.ts +6 -0
- package/dist/server/services/settings.d.ts.map +1 -1
- package/dist/server/services/settings.js +21 -0
- package/dist/server/services/settings.js.map +1 -1
- package/dist/server/services/terminal/pty-manager.d.ts +5 -51
- package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
- package/dist/server/services/terminal/pty-manager.js +63 -102
- package/dist/server/services/terminal/pty-manager.js.map +1 -1
- package/dist/server/services/websocket/file-explorer-handlers.d.ts +5 -0
- package/dist/server/services/websocket/file-explorer-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/file-explorer-handlers.js +518 -0
- package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -0
- package/dist/server/services/websocket/git-handlers.d.ts +36 -0
- package/dist/server/services/websocket/git-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/git-handlers.js +797 -0
- package/dist/server/services/websocket/git-handlers.js.map +1 -0
- package/dist/server/services/websocket/git-pr-handlers.d.ts +4 -0
- package/dist/server/services/websocket/git-pr-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/git-pr-handlers.js +299 -0
- package/dist/server/services/websocket/git-pr-handlers.js.map +1 -0
- package/dist/server/services/websocket/git-worktree-handlers.d.ts +4 -0
- package/dist/server/services/websocket/git-worktree-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/git-worktree-handlers.js +353 -0
- package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -0
- package/dist/server/services/websocket/handler-context.d.ts +32 -0
- package/dist/server/services/websocket/handler-context.d.ts.map +1 -0
- package/dist/server/services/websocket/handler-context.js +4 -0
- package/dist/server/services/websocket/handler-context.js.map +1 -0
- package/dist/server/services/websocket/handler.d.ts +27 -338
- package/dist/server/services/websocket/handler.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.js +74 -2106
- package/dist/server/services/websocket/handler.js.map +1 -1
- package/dist/server/services/websocket/index.d.ts +1 -1
- package/dist/server/services/websocket/index.d.ts.map +1 -1
- package/dist/server/services/websocket/index.js.map +1 -1
- package/dist/server/services/websocket/session-handlers.d.ts +10 -0
- package/dist/server/services/websocket/session-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/session-handlers.js +507 -0
- package/dist/server/services/websocket/session-handlers.js.map +1 -0
- package/dist/server/services/websocket/settings-handlers.d.ts +6 -0
- package/dist/server/services/websocket/settings-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/settings-handlers.js +125 -0
- package/dist/server/services/websocket/settings-handlers.js.map +1 -0
- package/dist/server/services/websocket/tab-handlers.d.ts +10 -0
- package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/tab-handlers.js +131 -0
- package/dist/server/services/websocket/tab-handlers.js.map +1 -0
- package/dist/server/services/websocket/terminal-handlers.d.ts +9 -0
- package/dist/server/services/websocket/terminal-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/terminal-handlers.js +220 -0
- package/dist/server/services/websocket/terminal-handlers.js.map +1 -0
- package/dist/server/services/websocket/types.d.ts +67 -2
- package/dist/server/services/websocket/types.d.ts.map +1 -1
- package/hooks/bouncer.sh +11 -4
- package/package.json +7 -2
- package/server/README.md +176 -159
- package/server/cli/headless/claude-invoker.ts +740 -133
- package/server/cli/headless/index.ts +7 -1
- package/server/cli/headless/output-utils.test.ts +225 -0
- package/server/cli/headless/prompt-utils.ts +37 -5
- package/server/cli/headless/runner.ts +55 -8
- package/server/cli/headless/stall-assessor.test.ts +165 -0
- package/server/cli/headless/stall-assessor.ts +478 -22
- package/server/cli/headless/tool-watchdog.test.ts +429 -0
- package/server/cli/headless/tool-watchdog.ts +398 -0
- package/server/cli/headless/types.ts +93 -1
- package/server/cli/improvisation-session-manager.ts +1133 -145
- package/server/index.ts +5 -14
- package/server/mcp/README.md +59 -67
- package/server/mcp/bouncer-integration.test.ts +161 -0
- package/server/mcp/bouncer-integration.ts +28 -0
- package/server/mcp/security-audit.ts +12 -8
- package/server/mcp/security-patterns.test.ts +258 -0
- package/server/mcp/security-patterns.ts +8 -2
- package/server/routes/improvise.ts +6 -6
- package/server/services/analytics.ts +26 -4
- package/server/services/platform.test.ts +0 -10
- package/server/services/platform.ts +16 -11
- package/server/services/sandbox-utils.ts +78 -0
- package/server/services/settings.ts +25 -0
- package/server/services/terminal/pty-manager.ts +68 -129
- package/server/services/websocket/autocomplete.test.ts +194 -0
- package/server/services/websocket/file-explorer-handlers.ts +587 -0
- package/server/services/websocket/git-handlers.ts +924 -0
- package/server/services/websocket/git-pr-handlers.ts +363 -0
- package/server/services/websocket/git-worktree-handlers.ts +403 -0
- package/server/services/websocket/handler-context.ts +44 -0
- package/server/services/websocket/handler.test.ts +1 -1
- package/server/services/websocket/handler.ts +90 -2421
- package/server/services/websocket/index.ts +1 -1
- package/server/services/websocket/session-handlers.ts +574 -0
- package/server/services/websocket/settings-handlers.ts +150 -0
- package/server/services/websocket/tab-handlers.ts +150 -0
- package/server/services/websocket/terminal-handlers.ts +277 -0
- package/server/services/websocket/types.ts +145 -4
- package/bin/release.sh +0 -110
- package/dist/server/services/terminal/tmux-manager.d.ts +0 -82
- package/dist/server/services/terminal/tmux-manager.d.ts.map +0 -1
- package/dist/server/services/terminal/tmux-manager.js +0 -352
- package/dist/server/services/terminal/tmux-manager.js.map +0 -1
- package/server/services/terminal/tmux-manager.ts +0 -426
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
|
+
// RFC 6298 smoothing constants
|
|
4
|
+
const ALPHA = 0.125; // smoothing factor for duration EMA
|
|
5
|
+
const BETA = 0.25; // smoothing factor for deviation EMA
|
|
6
|
+
const DEVIATION_MULTIPLIER = 4; // timeout = est + 4*dev (same as TCP)
|
|
7
|
+
/** Default timeout profiles per tool type */
|
|
8
|
+
export const DEFAULT_TOOL_TIMEOUT_PROFILES = {
|
|
9
|
+
WebFetch: {
|
|
10
|
+
coldStartMs: 180_000, // 3 min — accounts for slow sites + Haiku inference
|
|
11
|
+
floorMs: 120_000, // 2 min absolute minimum
|
|
12
|
+
ceilingMs: 300_000, // 5 min hard cap
|
|
13
|
+
useAdaptive: true,
|
|
14
|
+
useHaikuTiebreaker: true,
|
|
15
|
+
},
|
|
16
|
+
WebSearch: {
|
|
17
|
+
coldStartMs: 90_000, // 1.5 min
|
|
18
|
+
floorMs: 60_000, // 1 min minimum
|
|
19
|
+
ceilingMs: 180_000, // 3 min hard cap
|
|
20
|
+
useAdaptive: true,
|
|
21
|
+
useHaikuTiebreaker: false,
|
|
22
|
+
},
|
|
23
|
+
Task: {
|
|
24
|
+
coldStartMs: 900_000, // 15 min — subagents are inherently long-running
|
|
25
|
+
floorMs: 600_000, // 10 min minimum (research agents routinely take 7-10 min)
|
|
26
|
+
ceilingMs: 2_700_000, // 45 min hard cap
|
|
27
|
+
useAdaptive: true, // learn from past Task durations via EMA
|
|
28
|
+
useHaikuTiebreaker: true,
|
|
29
|
+
},
|
|
30
|
+
Bash: {
|
|
31
|
+
coldStartMs: 300_000, // 5 min
|
|
32
|
+
floorMs: 120_000, // 2 min minimum
|
|
33
|
+
ceilingMs: 600_000, // 10 min hard cap
|
|
34
|
+
useAdaptive: false,
|
|
35
|
+
useHaikuTiebreaker: true,
|
|
36
|
+
},
|
|
37
|
+
// Local filesystem tools — these go through Claude Code's streaming stdio protocol,
|
|
38
|
+
// NOT direct filesystem I/O. Large files/results can take 30-60s+ to stream.
|
|
39
|
+
// Read/Grep have bimodal distributions (tiny vs huge responses) that defeat EMA,
|
|
40
|
+
// so adaptive is disabled for them. Floors are generous to prevent premature kills.
|
|
41
|
+
Read: {
|
|
42
|
+
coldStartMs: 120_000, // 2 min — large files stream slowly through stdio protocol
|
|
43
|
+
floorMs: 60_000, // 1 min minimum — prevents EMA-driven premature kills
|
|
44
|
+
ceilingMs: 300_000, // 5 min ceiling (very large files, slow mounts)
|
|
45
|
+
useAdaptive: false, // bimodal: 1-line file vs 2000-line file defeats EMA
|
|
46
|
+
useHaikuTiebreaker: true, // safety net: assess before killing the whole process
|
|
47
|
+
},
|
|
48
|
+
Grep: {
|
|
49
|
+
coldStartMs: 120_000, // 2 min — broad searches return large result sets
|
|
50
|
+
floorMs: 60_000, // 1 min minimum
|
|
51
|
+
ceilingMs: 300_000, // 5 min ceiling
|
|
52
|
+
useAdaptive: false, // bimodal: single-file vs codebase-wide search
|
|
53
|
+
useHaikuTiebreaker: true, // safety net before killing
|
|
54
|
+
},
|
|
55
|
+
Glob: {
|
|
56
|
+
coldStartMs: 60_000, // 1 min — pattern matching can be slow on large trees
|
|
57
|
+
floorMs: 30_000, // 30s minimum
|
|
58
|
+
ceilingMs: 180_000, // 3 min ceiling
|
|
59
|
+
useAdaptive: true,
|
|
60
|
+
useHaikuTiebreaker: true,
|
|
61
|
+
},
|
|
62
|
+
Edit: {
|
|
63
|
+
coldStartMs: 60_000, // 1 min — edits go through streaming protocol too
|
|
64
|
+
floorMs: 30_000, // 30s minimum
|
|
65
|
+
ceilingMs: 180_000, // 3 min ceiling
|
|
66
|
+
useAdaptive: true,
|
|
67
|
+
useHaikuTiebreaker: true,
|
|
68
|
+
},
|
|
69
|
+
Write: {
|
|
70
|
+
coldStartMs: 60_000, // 1 min
|
|
71
|
+
floorMs: 30_000, // 30s minimum
|
|
72
|
+
ceilingMs: 180_000, // 3 min ceiling
|
|
73
|
+
useAdaptive: true,
|
|
74
|
+
useHaikuTiebreaker: true,
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
const DEFAULT_TOOL_TIMEOUT_PROFILE = {
|
|
78
|
+
coldStartMs: 300_000,
|
|
79
|
+
floorMs: 120_000,
|
|
80
|
+
ceilingMs: 600_000,
|
|
81
|
+
useAdaptive: false,
|
|
82
|
+
useHaikuTiebreaker: true,
|
|
83
|
+
};
|
|
84
|
+
export class ToolWatchdog {
|
|
85
|
+
trackers = new Map();
|
|
86
|
+
profiles;
|
|
87
|
+
activeWatches = new Map();
|
|
88
|
+
verbose;
|
|
89
|
+
onTiebreaker;
|
|
90
|
+
getTokenSilenceMs;
|
|
91
|
+
constructor(options = {}) {
|
|
92
|
+
this.verbose = options.verbose ?? false;
|
|
93
|
+
this.onTiebreaker = options.onTiebreaker;
|
|
94
|
+
this.getTokenSilenceMs = options.getTokenSilenceMs;
|
|
95
|
+
// Merge user profiles with defaults
|
|
96
|
+
this.profiles = { ...DEFAULT_TOOL_TIMEOUT_PROFILES };
|
|
97
|
+
if (options.profiles) {
|
|
98
|
+
for (const [name, partial] of Object.entries(options.profiles)) {
|
|
99
|
+
const base = this.profiles[name] || DEFAULT_TOOL_TIMEOUT_PROFILE;
|
|
100
|
+
this.profiles[name] = { ...base, ...partial };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** Record a tool completion — updates the EMA tracker for its type */
|
|
105
|
+
recordCompletion(toolName, durationMs) {
|
|
106
|
+
const profile = this.getProfile(toolName);
|
|
107
|
+
if (!profile.useAdaptive)
|
|
108
|
+
return;
|
|
109
|
+
const tracker = this.trackers.get(toolName);
|
|
110
|
+
if (!tracker) {
|
|
111
|
+
this.trackers.set(toolName, {
|
|
112
|
+
estimatedDuration: durationMs,
|
|
113
|
+
deviation: durationMs / 2,
|
|
114
|
+
sampleCount: 1,
|
|
115
|
+
});
|
|
116
|
+
if (this.verbose) {
|
|
117
|
+
console.log(`[WATCHDOG] ${toolName}: first sample ${durationMs}ms, initial timeout ${this.getTimeout(toolName)}ms`);
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// RFC 6298 update
|
|
122
|
+
tracker.deviation = (1 - BETA) * tracker.deviation + BETA * Math.abs(durationMs - tracker.estimatedDuration);
|
|
123
|
+
tracker.estimatedDuration = (1 - ALPHA) * tracker.estimatedDuration + ALPHA * durationMs;
|
|
124
|
+
tracker.sampleCount++;
|
|
125
|
+
if (this.verbose) {
|
|
126
|
+
console.log(`[WATCHDOG] ${toolName}: sample #${tracker.sampleCount} ${durationMs}ms, est=${Math.round(tracker.estimatedDuration)}ms, dev=${Math.round(tracker.deviation)}ms, timeout=${this.getTimeout(toolName)}ms`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** Compute the current timeout for a tool type */
|
|
130
|
+
getTimeout(toolName) {
|
|
131
|
+
const profile = this.getProfile(toolName);
|
|
132
|
+
if (!profile.useAdaptive)
|
|
133
|
+
return profile.coldStartMs;
|
|
134
|
+
const tracker = this.trackers.get(toolName);
|
|
135
|
+
if (!tracker || tracker.sampleCount < 1)
|
|
136
|
+
return profile.coldStartMs;
|
|
137
|
+
const adaptive = tracker.estimatedDuration + DEVIATION_MULTIPLIER * tracker.deviation;
|
|
138
|
+
return Math.max(profile.floorMs, Math.min(profile.ceilingMs, adaptive));
|
|
139
|
+
}
|
|
140
|
+
/** Get the profile for a tool (with fallback to default) */
|
|
141
|
+
getProfile(toolName) {
|
|
142
|
+
return this.profiles[toolName] || DEFAULT_TOOL_TIMEOUT_PROFILE;
|
|
143
|
+
}
|
|
144
|
+
/** Start watching a tool call */
|
|
145
|
+
startWatch(toolId, toolName, toolInput, onTimeout) {
|
|
146
|
+
// Clear any existing watch for this ID
|
|
147
|
+
this.clearWatch(toolId);
|
|
148
|
+
const timeoutMs = this.getTimeout(toolName);
|
|
149
|
+
const profile = this.getProfile(toolName);
|
|
150
|
+
if (this.verbose) {
|
|
151
|
+
console.log(`[WATCHDOG] Starting watch: ${toolName} (${toolId}), timeout=${Math.round(timeoutMs / 1000)}s`);
|
|
152
|
+
}
|
|
153
|
+
const timer = setTimeout(async () => {
|
|
154
|
+
const extended = await this.handleTimeoutWithTiebreaker(toolId, toolName, toolInput, profile, onTimeout);
|
|
155
|
+
if (!extended) {
|
|
156
|
+
// Don't delete the watch here — buildCheckpoint() needs it.
|
|
157
|
+
// handleToolTimeout() calls clearAll() after building the checkpoint.
|
|
158
|
+
onTimeout();
|
|
159
|
+
}
|
|
160
|
+
}, timeoutMs);
|
|
161
|
+
this.activeWatches.set(toolId, {
|
|
162
|
+
toolName,
|
|
163
|
+
toolInput,
|
|
164
|
+
startTime: Date.now(),
|
|
165
|
+
timer,
|
|
166
|
+
timeoutMs,
|
|
167
|
+
tiebreakerAttempted: false,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/** Handle timeout expiry: attempt tiebreaker if configured, return true if extended */
|
|
171
|
+
async handleTimeoutWithTiebreaker(toolId, toolName, toolInput, profile, onTimeout) {
|
|
172
|
+
const watch = this.activeWatches.get(toolId);
|
|
173
|
+
if (!watch)
|
|
174
|
+
return true;
|
|
175
|
+
const elapsedMs = Date.now() - watch.startTime;
|
|
176
|
+
if (!profile.useHaikuTiebreaker || !this.onTiebreaker || watch.tiebreakerAttempted) {
|
|
177
|
+
if (this.verbose) {
|
|
178
|
+
console.log(`[WATCHDOG] ${toolName} (${toolId}) timed out after ${Math.round(elapsedMs / 1000)}s, killing`);
|
|
179
|
+
}
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
return this.runTiebreaker(watch, toolId, toolName, toolInput, elapsedMs, onTimeout);
|
|
183
|
+
}
|
|
184
|
+
/** Execute the Haiku tiebreaker and reschedule if extended */
|
|
185
|
+
async runTiebreaker(watch, toolId, toolName, toolInput, elapsedMs, onTimeout) {
|
|
186
|
+
watch.tiebreakerAttempted = true;
|
|
187
|
+
if (this.verbose) {
|
|
188
|
+
console.log(`[WATCHDOG] ${toolName} (${toolId}) hit timeout after ${Math.round(elapsedMs / 1000)}s, running tiebreaker...`);
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
const tokenSilenceMs = this.getTokenSilenceMs?.();
|
|
192
|
+
const verdict = await this.onTiebreaker(toolName, toolInput, elapsedMs, tokenSilenceMs);
|
|
193
|
+
if (verdict.action === 'extend') {
|
|
194
|
+
if (this.verbose) {
|
|
195
|
+
console.log(`[WATCHDOG] Tiebreaker: extend ${toolName} by ${Math.round(verdict.extensionMs / 1000)}s — ${verdict.reason}`);
|
|
196
|
+
}
|
|
197
|
+
this.scheduleExtensionTimeout(watch, toolId, toolName, verdict.extensionMs, onTimeout);
|
|
198
|
+
watch.timeoutMs = elapsedMs + verdict.extensionMs;
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
if (this.verbose) {
|
|
202
|
+
console.log(`[WATCHDOG] Tiebreaker: kill ${toolName} — ${verdict.reason}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
if (this.verbose) {
|
|
207
|
+
console.log(`[WATCHDOG] Tiebreaker failed: ${err}, proceeding with kill`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
/** Schedule a post-extension timeout that kills without another tiebreaker */
|
|
213
|
+
scheduleExtensionTimeout(watch, toolId, toolName, extensionMs, onTimeout) {
|
|
214
|
+
watch.timer = setTimeout(() => {
|
|
215
|
+
const w = this.activeWatches.get(toolId);
|
|
216
|
+
if (!w)
|
|
217
|
+
return;
|
|
218
|
+
if (this.verbose) {
|
|
219
|
+
console.log(`[WATCHDOG] ${toolName} (${toolId}) still running after extension, killing`);
|
|
220
|
+
}
|
|
221
|
+
// Don't delete the watch — buildCheckpoint() needs it.
|
|
222
|
+
// handleToolTimeout() calls clearAll() after building the checkpoint.
|
|
223
|
+
onTimeout();
|
|
224
|
+
}, extensionMs);
|
|
225
|
+
}
|
|
226
|
+
/** Stop watching a tool (it completed normally) */
|
|
227
|
+
clearWatch(toolId) {
|
|
228
|
+
const watch = this.activeWatches.get(toolId);
|
|
229
|
+
if (watch) {
|
|
230
|
+
clearTimeout(watch.timer);
|
|
231
|
+
this.activeWatches.delete(toolId);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/** Clear all active watches (process ending) */
|
|
235
|
+
clearAll() {
|
|
236
|
+
for (const [_id, watch] of this.activeWatches) {
|
|
237
|
+
clearTimeout(watch.timer);
|
|
238
|
+
}
|
|
239
|
+
this.activeWatches.clear();
|
|
240
|
+
}
|
|
241
|
+
/** Get the active watch for a tool ID (for checkpoint building) */
|
|
242
|
+
getActiveWatch(toolId) {
|
|
243
|
+
return this.activeWatches.get(toolId);
|
|
244
|
+
}
|
|
245
|
+
/** Get all active watches */
|
|
246
|
+
getActiveWatches() {
|
|
247
|
+
return this.activeWatches;
|
|
248
|
+
}
|
|
249
|
+
/** Build an ExecutionCheckpoint from the current state */
|
|
250
|
+
buildCheckpoint(originalPrompt, assistantText, thinkingText, accumulatedToolUse, hungToolId, claudeSessionId, processStartTime) {
|
|
251
|
+
const hungWatch = this.activeWatches.get(hungToolId);
|
|
252
|
+
if (!hungWatch)
|
|
253
|
+
return null;
|
|
254
|
+
// Find the matching tool entry
|
|
255
|
+
const hungToolEntry = accumulatedToolUse.find(t => t.toolId === hungToolId);
|
|
256
|
+
// Build completed tools list (exclude the hung one)
|
|
257
|
+
const completedTools = accumulatedToolUse
|
|
258
|
+
.filter(t => t.toolId !== hungToolId && t.result !== undefined)
|
|
259
|
+
.map(t => ({
|
|
260
|
+
toolName: t.toolName,
|
|
261
|
+
toolId: t.toolId,
|
|
262
|
+
input: t.toolInput,
|
|
263
|
+
result: t.result || '',
|
|
264
|
+
isError: t.isError || false,
|
|
265
|
+
durationMs: t.duration || 0,
|
|
266
|
+
}));
|
|
267
|
+
// Build in-progress tools list (started but no result, excluding the hung one)
|
|
268
|
+
const inProgressTools = accumulatedToolUse
|
|
269
|
+
.filter(t => t.toolId !== hungToolId && t.result === undefined)
|
|
270
|
+
.map(t => ({
|
|
271
|
+
toolName: t.toolName,
|
|
272
|
+
toolId: t.toolId,
|
|
273
|
+
input: t.toolInput,
|
|
274
|
+
}));
|
|
275
|
+
// Extract URL from tool input if WebFetch/WebSearch
|
|
276
|
+
let url;
|
|
277
|
+
const toolInput = hungToolEntry?.toolInput || hungWatch.toolInput;
|
|
278
|
+
if (toolInput.url) {
|
|
279
|
+
url = String(toolInput.url);
|
|
280
|
+
}
|
|
281
|
+
else if (toolInput.query) {
|
|
282
|
+
url = String(toolInput.query);
|
|
283
|
+
}
|
|
284
|
+
return {
|
|
285
|
+
originalPrompt,
|
|
286
|
+
assistantText,
|
|
287
|
+
thinkingText,
|
|
288
|
+
completedTools,
|
|
289
|
+
inProgressTools,
|
|
290
|
+
hungTool: {
|
|
291
|
+
toolName: hungWatch.toolName,
|
|
292
|
+
toolId: hungToolId,
|
|
293
|
+
input: toolInput,
|
|
294
|
+
timeoutMs: hungWatch.timeoutMs,
|
|
295
|
+
url,
|
|
296
|
+
},
|
|
297
|
+
claudeSessionId,
|
|
298
|
+
elapsedMs: Date.now() - processStartTime,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=tool-watchdog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-watchdog.js","sourceRoot":"","sources":["../../../../server/cli/headless/tool-watchdog.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,54 @@ export interface ImageAttachment {
|
|
|
25
25
|
isImage: boolean;
|
|
26
26
|
mimeType?: string;
|
|
27
27
|
}
|
|
28
|
+
/** Per-tool-type timeout configuration with adaptive tracking */
|
|
29
|
+
export interface ToolTimeoutProfile {
|
|
30
|
+
/** Initial timeout when no prior samples exist (ms) */
|
|
31
|
+
coldStartMs: number;
|
|
32
|
+
/** Minimum timeout — never kill before this (ms) */
|
|
33
|
+
floorMs: number;
|
|
34
|
+
/** Maximum timeout — always kill after this (ms) */
|
|
35
|
+
ceilingMs: number;
|
|
36
|
+
/** Track EMA of past durations and adapt timeout dynamically */
|
|
37
|
+
useAdaptive: boolean;
|
|
38
|
+
/** Spawn a Haiku call to assess before killing */
|
|
39
|
+
useHaikuTiebreaker: boolean;
|
|
40
|
+
}
|
|
41
|
+
/** Snapshot of execution state at the moment a tool times out */
|
|
42
|
+
export interface ExecutionCheckpoint {
|
|
43
|
+
originalPrompt: string;
|
|
44
|
+
assistantText: string;
|
|
45
|
+
thinkingText: string;
|
|
46
|
+
completedTools: Array<{
|
|
47
|
+
toolName: string;
|
|
48
|
+
toolId: string;
|
|
49
|
+
input: Record<string, unknown>;
|
|
50
|
+
result: string;
|
|
51
|
+
isError: boolean;
|
|
52
|
+
durationMs: number;
|
|
53
|
+
}>;
|
|
54
|
+
/** Tools that were still running (not the hung tool) when the process was killed */
|
|
55
|
+
inProgressTools: Array<{
|
|
56
|
+
toolName: string;
|
|
57
|
+
toolId: string;
|
|
58
|
+
input: Record<string, unknown>;
|
|
59
|
+
}>;
|
|
60
|
+
hungTool: {
|
|
61
|
+
toolName: string;
|
|
62
|
+
toolId: string;
|
|
63
|
+
input: Record<string, unknown>;
|
|
64
|
+
timeoutMs: number;
|
|
65
|
+
url?: string;
|
|
66
|
+
};
|
|
67
|
+
claudeSessionId?: string;
|
|
68
|
+
elapsedMs: number;
|
|
69
|
+
}
|
|
70
|
+
/** EMA tracker for a single tool type's completion times */
|
|
71
|
+
export interface ToolDurationTracker {
|
|
72
|
+
estimatedDuration: number;
|
|
73
|
+
deviation: number;
|
|
74
|
+
sampleCount: number;
|
|
75
|
+
}
|
|
28
76
|
export interface HeadlessConfig {
|
|
29
77
|
workingDir: string;
|
|
30
78
|
tokenBudgetThreshold: number;
|
|
@@ -38,6 +86,11 @@ export interface HeadlessConfig {
|
|
|
38
86
|
outputCallback?: (text: string) => void;
|
|
39
87
|
thinkingCallback?: (text: string) => void;
|
|
40
88
|
toolUseCallback?: (event: ToolUseEvent) => void;
|
|
89
|
+
/** Called with cumulative API token counts as they arrive from the stream */
|
|
90
|
+
tokenUsageCallback?: (usage: {
|
|
91
|
+
inputTokens: number;
|
|
92
|
+
outputTokens: number;
|
|
93
|
+
}) => void;
|
|
41
94
|
directPrompt?: string;
|
|
42
95
|
promptContext?: PromptContext;
|
|
43
96
|
continueSession?: boolean;
|
|
@@ -50,6 +103,16 @@ export interface HeadlessConfig {
|
|
|
50
103
|
stallHardCapMs?: number;
|
|
51
104
|
/** Claude model for main execution (e.g., 'opus', 'sonnet'). 'default' = no --model flag. */
|
|
52
105
|
model?: string;
|
|
106
|
+
/** Per-tool timeout profiles (merge with defaults) */
|
|
107
|
+
toolTimeoutProfiles?: Record<string, Partial<ToolTimeoutProfile>>;
|
|
108
|
+
/** Enable per-tool adaptive timeout watchdog (default: true) */
|
|
109
|
+
enableToolWatchdog?: boolean;
|
|
110
|
+
/** Max auto-retries on tool timeout (default: 2) */
|
|
111
|
+
maxAutoRetries?: number;
|
|
112
|
+
/** Called when a tool times out with checkpoint data */
|
|
113
|
+
onToolTimeout?: (checkpoint: ExecutionCheckpoint) => void;
|
|
114
|
+
/** When true, spawn Claude with sanitized env (strips secrets, HOME=workingDir) */
|
|
115
|
+
sandboxed?: boolean;
|
|
53
116
|
}
|
|
54
117
|
export interface SessionState {
|
|
55
118
|
sessionId: string;
|
|
@@ -66,6 +129,8 @@ export interface SessionResult {
|
|
|
66
129
|
totalTokens: number;
|
|
67
130
|
sessionId: string;
|
|
68
131
|
error?: string;
|
|
132
|
+
/** Signal name if Claude process was killed (e.g., 'SIGTERM', 'SIGKILL') */
|
|
133
|
+
signalName?: string;
|
|
69
134
|
conflicts?: Array<{
|
|
70
135
|
filePath: string;
|
|
71
136
|
modifiedBy: string[];
|
|
@@ -82,6 +147,14 @@ export interface SessionResult {
|
|
|
82
147
|
duration?: number;
|
|
83
148
|
}>;
|
|
84
149
|
claudeSessionId?: string;
|
|
150
|
+
/** Number of Claude Code native tool timeouts detected during this execution */
|
|
151
|
+
nativeTimeoutCount?: number;
|
|
152
|
+
/** Assistant text buffered after native timeouts — not yet shown to user.
|
|
153
|
+
* Flush to output if context is OK, discard if context was lost and recovery starts. */
|
|
154
|
+
postTimeoutOutput?: string;
|
|
155
|
+
/** Assistant text buffered during resume assessment — held back until thinking/tool activity
|
|
156
|
+
* confirms Claude has context. Undefined when not in resume mode or buffer was flushed. */
|
|
157
|
+
resumeBufferedOutput?: string;
|
|
85
158
|
}
|
|
86
159
|
export interface ToolUseAccumulator {
|
|
87
160
|
toolName: string;
|
|
@@ -92,23 +165,47 @@ export interface ToolUseAccumulator {
|
|
|
92
165
|
startTime: number;
|
|
93
166
|
duration?: number;
|
|
94
167
|
}
|
|
168
|
+
/** Map of toolId -> toolName for currently pending (started but not yet returned) tools */
|
|
169
|
+
export type PendingToolMap = Map<string, string>;
|
|
95
170
|
export interface ExecutionResult {
|
|
96
171
|
output: string;
|
|
97
172
|
error?: string;
|
|
98
173
|
exitCode: number;
|
|
174
|
+
/** Signal name if process was killed (e.g., 'SIGTERM', 'SIGKILL') */
|
|
175
|
+
signalName?: string;
|
|
99
176
|
assistantResponse?: string;
|
|
100
177
|
thinkingOutput?: string;
|
|
101
178
|
toolUseHistory?: ToolUseAccumulator[];
|
|
102
179
|
claudeSessionId?: string;
|
|
180
|
+
/** Number of Claude Code native tool timeouts detected during this execution */
|
|
181
|
+
nativeTimeoutCount?: number;
|
|
182
|
+
/** Assistant text buffered after native timeouts — not yet sent to outputCallback.
|
|
183
|
+
* The session manager should flush this to the client if context is OK, or discard if recovering. */
|
|
184
|
+
postTimeoutOutput?: string;
|
|
185
|
+
/** Assistant text buffered during resume assessment — held back until thinking/tool activity
|
|
186
|
+
* confirms Claude has context. Undefined when not in resume mode or buffer was flushed. */
|
|
187
|
+
resumeBufferedOutput?: string;
|
|
188
|
+
/** Actual API token usage from Claude Code stream events (summed across all turns) */
|
|
189
|
+
apiTokenUsage?: {
|
|
190
|
+
inputTokens: number;
|
|
191
|
+
outputTokens: number;
|
|
192
|
+
};
|
|
103
193
|
}
|
|
104
194
|
/** Resolved config with all defaults applied */
|
|
105
|
-
export type ResolvedHeadlessConfig = Omit<Required<HeadlessConfig>, 'outputCallback' | 'thinkingCallback' | 'toolUseCallback' | 'continueSession' | 'claudeSessionId' | 'imageAttachments' | 'model'> & {
|
|
195
|
+
export type ResolvedHeadlessConfig = Omit<Required<HeadlessConfig>, 'outputCallback' | 'thinkingCallback' | 'toolUseCallback' | 'tokenUsageCallback' | 'continueSession' | 'claudeSessionId' | 'imageAttachments' | 'model' | 'toolTimeoutProfiles' | 'onToolTimeout' | 'sandboxed'> & {
|
|
106
196
|
outputCallback?: (text: string) => void;
|
|
107
197
|
thinkingCallback?: (text: string) => void;
|
|
108
198
|
toolUseCallback?: (event: ToolUseEvent) => void;
|
|
199
|
+
tokenUsageCallback?: (usage: {
|
|
200
|
+
inputTokens: number;
|
|
201
|
+
outputTokens: number;
|
|
202
|
+
}) => void;
|
|
109
203
|
continueSession?: boolean;
|
|
110
204
|
claudeSessionId?: string;
|
|
111
205
|
imageAttachments?: ImageAttachment[];
|
|
112
206
|
model?: string;
|
|
207
|
+
toolTimeoutProfiles?: Record<string, Partial<ToolTimeoutProfile>>;
|
|
208
|
+
onToolTimeout?: (checkpoint: ExecutionCheckpoint) => void;
|
|
209
|
+
sandboxed?: boolean;
|
|
113
210
|
};
|
|
114
211
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../server/cli/headless/types.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,YAAY,GAAG,kBAAkB,GAAG,eAAe,GAAG,aAAa,CAAC;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAGD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6FAA6F;IAC7F,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../server/cli/headless/types.ts"],"names":[],"mappings":"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"}
|