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.
Files changed (161) hide show
  1. package/PRIVACY.md +126 -0
  2. package/README.md +24 -23
  3. package/bin/commands/login.js +85 -42
  4. package/bin/commands/logout.js +35 -1
  5. package/bin/commands/status.js +1 -1
  6. package/bin/mstro.js +231 -131
  7. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
  8. package/dist/server/cli/headless/claude-invoker.js +550 -115
  9. package/dist/server/cli/headless/claude-invoker.js.map +1 -1
  10. package/dist/server/cli/headless/index.d.ts +2 -1
  11. package/dist/server/cli/headless/index.d.ts.map +1 -1
  12. package/dist/server/cli/headless/index.js +2 -0
  13. package/dist/server/cli/headless/index.js.map +1 -1
  14. package/dist/server/cli/headless/prompt-utils.d.ts +5 -8
  15. package/dist/server/cli/headless/prompt-utils.d.ts.map +1 -1
  16. package/dist/server/cli/headless/prompt-utils.js +40 -5
  17. package/dist/server/cli/headless/prompt-utils.js.map +1 -1
  18. package/dist/server/cli/headless/runner.d.ts +1 -1
  19. package/dist/server/cli/headless/runner.d.ts.map +1 -1
  20. package/dist/server/cli/headless/runner.js +52 -7
  21. package/dist/server/cli/headless/runner.js.map +1 -1
  22. package/dist/server/cli/headless/stall-assessor.d.ts +79 -1
  23. package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
  24. package/dist/server/cli/headless/stall-assessor.js +355 -20
  25. package/dist/server/cli/headless/stall-assessor.js.map +1 -1
  26. package/dist/server/cli/headless/tool-watchdog.d.ts +70 -0
  27. package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -0
  28. package/dist/server/cli/headless/tool-watchdog.js +302 -0
  29. package/dist/server/cli/headless/tool-watchdog.js.map +1 -0
  30. package/dist/server/cli/headless/types.d.ts +98 -1
  31. package/dist/server/cli/headless/types.d.ts.map +1 -1
  32. package/dist/server/cli/improvisation-session-manager.d.ts +136 -2
  33. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  34. package/dist/server/cli/improvisation-session-manager.js +929 -132
  35. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  36. package/dist/server/index.js +5 -13
  37. package/dist/server/index.js.map +1 -1
  38. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
  39. package/dist/server/mcp/bouncer-integration.js +18 -0
  40. package/dist/server/mcp/bouncer-integration.js.map +1 -1
  41. package/dist/server/mcp/security-audit.d.ts +2 -2
  42. package/dist/server/mcp/security-audit.d.ts.map +1 -1
  43. package/dist/server/mcp/security-audit.js +12 -8
  44. package/dist/server/mcp/security-audit.js.map +1 -1
  45. package/dist/server/mcp/security-patterns.d.ts.map +1 -1
  46. package/dist/server/mcp/security-patterns.js +9 -4
  47. package/dist/server/mcp/security-patterns.js.map +1 -1
  48. package/dist/server/routes/improvise.js +6 -6
  49. package/dist/server/routes/improvise.js.map +1 -1
  50. package/dist/server/services/analytics.d.ts +2 -0
  51. package/dist/server/services/analytics.d.ts.map +1 -1
  52. package/dist/server/services/analytics.js +26 -4
  53. package/dist/server/services/analytics.js.map +1 -1
  54. package/dist/server/services/platform.d.ts.map +1 -1
  55. package/dist/server/services/platform.js +17 -10
  56. package/dist/server/services/platform.js.map +1 -1
  57. package/dist/server/services/sandbox-utils.d.ts +6 -0
  58. package/dist/server/services/sandbox-utils.d.ts.map +1 -0
  59. package/dist/server/services/sandbox-utils.js +72 -0
  60. package/dist/server/services/sandbox-utils.js.map +1 -0
  61. package/dist/server/services/settings.d.ts +6 -0
  62. package/dist/server/services/settings.d.ts.map +1 -1
  63. package/dist/server/services/settings.js +21 -0
  64. package/dist/server/services/settings.js.map +1 -1
  65. package/dist/server/services/terminal/pty-manager.d.ts +5 -51
  66. package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
  67. package/dist/server/services/terminal/pty-manager.js +63 -102
  68. package/dist/server/services/terminal/pty-manager.js.map +1 -1
  69. package/dist/server/services/websocket/file-explorer-handlers.d.ts +5 -0
  70. package/dist/server/services/websocket/file-explorer-handlers.d.ts.map +1 -0
  71. package/dist/server/services/websocket/file-explorer-handlers.js +518 -0
  72. package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -0
  73. package/dist/server/services/websocket/git-handlers.d.ts +36 -0
  74. package/dist/server/services/websocket/git-handlers.d.ts.map +1 -0
  75. package/dist/server/services/websocket/git-handlers.js +797 -0
  76. package/dist/server/services/websocket/git-handlers.js.map +1 -0
  77. package/dist/server/services/websocket/git-pr-handlers.d.ts +4 -0
  78. package/dist/server/services/websocket/git-pr-handlers.d.ts.map +1 -0
  79. package/dist/server/services/websocket/git-pr-handlers.js +299 -0
  80. package/dist/server/services/websocket/git-pr-handlers.js.map +1 -0
  81. package/dist/server/services/websocket/git-worktree-handlers.d.ts +4 -0
  82. package/dist/server/services/websocket/git-worktree-handlers.d.ts.map +1 -0
  83. package/dist/server/services/websocket/git-worktree-handlers.js +353 -0
  84. package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -0
  85. package/dist/server/services/websocket/handler-context.d.ts +32 -0
  86. package/dist/server/services/websocket/handler-context.d.ts.map +1 -0
  87. package/dist/server/services/websocket/handler-context.js +4 -0
  88. package/dist/server/services/websocket/handler-context.js.map +1 -0
  89. package/dist/server/services/websocket/handler.d.ts +27 -338
  90. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  91. package/dist/server/services/websocket/handler.js +74 -2106
  92. package/dist/server/services/websocket/handler.js.map +1 -1
  93. package/dist/server/services/websocket/index.d.ts +1 -1
  94. package/dist/server/services/websocket/index.d.ts.map +1 -1
  95. package/dist/server/services/websocket/index.js.map +1 -1
  96. package/dist/server/services/websocket/session-handlers.d.ts +10 -0
  97. package/dist/server/services/websocket/session-handlers.d.ts.map +1 -0
  98. package/dist/server/services/websocket/session-handlers.js +507 -0
  99. package/dist/server/services/websocket/session-handlers.js.map +1 -0
  100. package/dist/server/services/websocket/settings-handlers.d.ts +6 -0
  101. package/dist/server/services/websocket/settings-handlers.d.ts.map +1 -0
  102. package/dist/server/services/websocket/settings-handlers.js +125 -0
  103. package/dist/server/services/websocket/settings-handlers.js.map +1 -0
  104. package/dist/server/services/websocket/tab-handlers.d.ts +10 -0
  105. package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -0
  106. package/dist/server/services/websocket/tab-handlers.js +131 -0
  107. package/dist/server/services/websocket/tab-handlers.js.map +1 -0
  108. package/dist/server/services/websocket/terminal-handlers.d.ts +9 -0
  109. package/dist/server/services/websocket/terminal-handlers.d.ts.map +1 -0
  110. package/dist/server/services/websocket/terminal-handlers.js +220 -0
  111. package/dist/server/services/websocket/terminal-handlers.js.map +1 -0
  112. package/dist/server/services/websocket/types.d.ts +67 -2
  113. package/dist/server/services/websocket/types.d.ts.map +1 -1
  114. package/hooks/bouncer.sh +11 -4
  115. package/package.json +7 -2
  116. package/server/README.md +176 -159
  117. package/server/cli/headless/claude-invoker.ts +740 -133
  118. package/server/cli/headless/index.ts +7 -1
  119. package/server/cli/headless/output-utils.test.ts +225 -0
  120. package/server/cli/headless/prompt-utils.ts +37 -5
  121. package/server/cli/headless/runner.ts +55 -8
  122. package/server/cli/headless/stall-assessor.test.ts +165 -0
  123. package/server/cli/headless/stall-assessor.ts +478 -22
  124. package/server/cli/headless/tool-watchdog.test.ts +429 -0
  125. package/server/cli/headless/tool-watchdog.ts +398 -0
  126. package/server/cli/headless/types.ts +93 -1
  127. package/server/cli/improvisation-session-manager.ts +1133 -145
  128. package/server/index.ts +5 -14
  129. package/server/mcp/README.md +59 -67
  130. package/server/mcp/bouncer-integration.test.ts +161 -0
  131. package/server/mcp/bouncer-integration.ts +28 -0
  132. package/server/mcp/security-audit.ts +12 -8
  133. package/server/mcp/security-patterns.test.ts +258 -0
  134. package/server/mcp/security-patterns.ts +8 -2
  135. package/server/routes/improvise.ts +6 -6
  136. package/server/services/analytics.ts +26 -4
  137. package/server/services/platform.test.ts +0 -10
  138. package/server/services/platform.ts +16 -11
  139. package/server/services/sandbox-utils.ts +78 -0
  140. package/server/services/settings.ts +25 -0
  141. package/server/services/terminal/pty-manager.ts +68 -129
  142. package/server/services/websocket/autocomplete.test.ts +194 -0
  143. package/server/services/websocket/file-explorer-handlers.ts +587 -0
  144. package/server/services/websocket/git-handlers.ts +924 -0
  145. package/server/services/websocket/git-pr-handlers.ts +363 -0
  146. package/server/services/websocket/git-worktree-handlers.ts +403 -0
  147. package/server/services/websocket/handler-context.ts +44 -0
  148. package/server/services/websocket/handler.test.ts +1 -1
  149. package/server/services/websocket/handler.ts +90 -2421
  150. package/server/services/websocket/index.ts +1 -1
  151. package/server/services/websocket/session-handlers.ts +574 -0
  152. package/server/services/websocket/settings-handlers.ts +150 -0
  153. package/server/services/websocket/tab-handlers.ts +150 -0
  154. package/server/services/websocket/terminal-handlers.ts +277 -0
  155. package/server/services/websocket/types.ts +145 -4
  156. package/bin/release.sh +0 -110
  157. package/dist/server/services/terminal/tmux-manager.d.ts +0 -82
  158. package/dist/server/services/terminal/tmux-manager.d.ts.map +0 -1
  159. package/dist/server/services/terminal/tmux-manager.js +0 -352
  160. package/dist/server/services/terminal/tmux-manager.js.map +0 -1
  161. 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":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../server/cli/headless/types.ts"],"names":[],"mappings":"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"}