mstro-app 0.1.57 → 0.2.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 (100) hide show
  1. package/bin/commands/login.js +27 -14
  2. package/bin/commands/logout.js +35 -1
  3. package/bin/commands/status.js +1 -1
  4. package/bin/mstro.js +5 -108
  5. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
  6. package/dist/server/cli/headless/claude-invoker.js +432 -103
  7. package/dist/server/cli/headless/claude-invoker.js.map +1 -1
  8. package/dist/server/cli/headless/index.d.ts +2 -1
  9. package/dist/server/cli/headless/index.d.ts.map +1 -1
  10. package/dist/server/cli/headless/index.js +2 -0
  11. package/dist/server/cli/headless/index.js.map +1 -1
  12. package/dist/server/cli/headless/prompt-utils.d.ts +5 -8
  13. package/dist/server/cli/headless/prompt-utils.d.ts.map +1 -1
  14. package/dist/server/cli/headless/prompt-utils.js +40 -5
  15. package/dist/server/cli/headless/prompt-utils.js.map +1 -1
  16. package/dist/server/cli/headless/runner.d.ts +1 -1
  17. package/dist/server/cli/headless/runner.d.ts.map +1 -1
  18. package/dist/server/cli/headless/runner.js +29 -7
  19. package/dist/server/cli/headless/runner.js.map +1 -1
  20. package/dist/server/cli/headless/stall-assessor.d.ts +77 -1
  21. package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
  22. package/dist/server/cli/headless/stall-assessor.js +336 -20
  23. package/dist/server/cli/headless/stall-assessor.js.map +1 -1
  24. package/dist/server/cli/headless/tool-watchdog.d.ts +67 -0
  25. package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -0
  26. package/dist/server/cli/headless/tool-watchdog.js +296 -0
  27. package/dist/server/cli/headless/tool-watchdog.js.map +1 -0
  28. package/dist/server/cli/headless/types.d.ts +80 -1
  29. package/dist/server/cli/headless/types.d.ts.map +1 -1
  30. package/dist/server/cli/improvisation-session-manager.d.ts +109 -2
  31. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  32. package/dist/server/cli/improvisation-session-manager.js +737 -132
  33. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  34. package/dist/server/index.js +5 -10
  35. package/dist/server/index.js.map +1 -1
  36. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
  37. package/dist/server/mcp/bouncer-integration.js +18 -0
  38. package/dist/server/mcp/bouncer-integration.js.map +1 -1
  39. package/dist/server/mcp/security-audit.d.ts +2 -2
  40. package/dist/server/mcp/security-audit.d.ts.map +1 -1
  41. package/dist/server/mcp/security-audit.js +12 -8
  42. package/dist/server/mcp/security-audit.js.map +1 -1
  43. package/dist/server/mcp/security-patterns.d.ts.map +1 -1
  44. package/dist/server/mcp/security-patterns.js +9 -4
  45. package/dist/server/mcp/security-patterns.js.map +1 -1
  46. package/dist/server/routes/improvise.js +6 -6
  47. package/dist/server/routes/improvise.js.map +1 -1
  48. package/dist/server/services/analytics.d.ts +2 -0
  49. package/dist/server/services/analytics.d.ts.map +1 -1
  50. package/dist/server/services/analytics.js +13 -3
  51. package/dist/server/services/analytics.js.map +1 -1
  52. package/dist/server/services/platform.d.ts.map +1 -1
  53. package/dist/server/services/platform.js +4 -9
  54. package/dist/server/services/platform.js.map +1 -1
  55. package/dist/server/services/sandbox-utils.d.ts +6 -0
  56. package/dist/server/services/sandbox-utils.d.ts.map +1 -0
  57. package/dist/server/services/sandbox-utils.js +72 -0
  58. package/dist/server/services/sandbox-utils.js.map +1 -0
  59. package/dist/server/services/settings.d.ts +6 -0
  60. package/dist/server/services/settings.d.ts.map +1 -1
  61. package/dist/server/services/settings.js +21 -0
  62. package/dist/server/services/settings.js.map +1 -1
  63. package/dist/server/services/terminal/pty-manager.d.ts +3 -51
  64. package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
  65. package/dist/server/services/terminal/pty-manager.js +14 -100
  66. package/dist/server/services/terminal/pty-manager.js.map +1 -1
  67. package/dist/server/services/websocket/handler.d.ts +36 -15
  68. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  69. package/dist/server/services/websocket/handler.js +452 -223
  70. package/dist/server/services/websocket/handler.js.map +1 -1
  71. package/dist/server/services/websocket/types.d.ts +6 -2
  72. package/dist/server/services/websocket/types.d.ts.map +1 -1
  73. package/hooks/bouncer.sh +11 -4
  74. package/package.json +4 -1
  75. package/server/cli/headless/claude-invoker.ts +602 -119
  76. package/server/cli/headless/index.ts +7 -1
  77. package/server/cli/headless/prompt-utils.ts +37 -5
  78. package/server/cli/headless/runner.ts +30 -8
  79. package/server/cli/headless/stall-assessor.ts +453 -22
  80. package/server/cli/headless/tool-watchdog.ts +390 -0
  81. package/server/cli/headless/types.ts +84 -1
  82. package/server/cli/improvisation-session-manager.ts +884 -143
  83. package/server/index.ts +5 -10
  84. package/server/mcp/bouncer-integration.ts +28 -0
  85. package/server/mcp/security-audit.ts +12 -8
  86. package/server/mcp/security-patterns.ts +8 -2
  87. package/server/routes/improvise.ts +6 -6
  88. package/server/services/analytics.ts +13 -3
  89. package/server/services/platform.test.ts +0 -10
  90. package/server/services/platform.ts +4 -10
  91. package/server/services/sandbox-utils.ts +78 -0
  92. package/server/services/settings.ts +25 -0
  93. package/server/services/terminal/pty-manager.ts +16 -127
  94. package/server/services/websocket/handler.ts +515 -251
  95. package/server/services/websocket/types.ts +10 -4
  96. package/dist/server/services/terminal/tmux-manager.d.ts +0 -82
  97. package/dist/server/services/terminal/tmux-manager.d.ts.map +0 -1
  98. package/dist/server/services/terminal/tmux-manager.js +0 -352
  99. package/dist/server/services/terminal/tmux-manager.js.map +0 -1
  100. package/server/services/terminal/tmux-manager.ts +0 -426
@@ -0,0 +1,296 @@
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 — adaptive EMA learns actual durations, short cold starts
38
+ Read: {
39
+ coldStartMs: 60_000, // 1 min — local reads should be fast
40
+ floorMs: 15_000, // 15s minimum
41
+ ceilingMs: 300_000, // 5 min ceiling (large files, slow mounts)
42
+ useAdaptive: true,
43
+ useHaikuTiebreaker: false, // local ops don't need AI assessment
44
+ },
45
+ Grep: {
46
+ coldStartMs: 60_000,
47
+ floorMs: 15_000,
48
+ ceilingMs: 300_000,
49
+ useAdaptive: true,
50
+ useHaikuTiebreaker: false,
51
+ },
52
+ Glob: {
53
+ coldStartMs: 30_000, // 30s — pattern matching is fast
54
+ floorMs: 10_000,
55
+ ceilingMs: 120_000,
56
+ useAdaptive: true,
57
+ useHaikuTiebreaker: false,
58
+ },
59
+ Edit: {
60
+ coldStartMs: 30_000,
61
+ floorMs: 10_000,
62
+ ceilingMs: 120_000,
63
+ useAdaptive: true,
64
+ useHaikuTiebreaker: false,
65
+ },
66
+ Write: {
67
+ coldStartMs: 30_000,
68
+ floorMs: 10_000,
69
+ ceilingMs: 120_000,
70
+ useAdaptive: true,
71
+ useHaikuTiebreaker: false,
72
+ },
73
+ };
74
+ const DEFAULT_TOOL_TIMEOUT_PROFILE = {
75
+ coldStartMs: 300_000,
76
+ floorMs: 120_000,
77
+ ceilingMs: 600_000,
78
+ useAdaptive: false,
79
+ useHaikuTiebreaker: true,
80
+ };
81
+ export class ToolWatchdog {
82
+ trackers = new Map();
83
+ profiles;
84
+ activeWatches = new Map();
85
+ verbose;
86
+ onTiebreaker;
87
+ constructor(options = {}) {
88
+ this.verbose = options.verbose ?? false;
89
+ this.onTiebreaker = options.onTiebreaker;
90
+ // Merge user profiles with defaults
91
+ this.profiles = { ...DEFAULT_TOOL_TIMEOUT_PROFILES };
92
+ if (options.profiles) {
93
+ for (const [name, partial] of Object.entries(options.profiles)) {
94
+ const base = this.profiles[name] || DEFAULT_TOOL_TIMEOUT_PROFILE;
95
+ this.profiles[name] = { ...base, ...partial };
96
+ }
97
+ }
98
+ }
99
+ /** Record a tool completion — updates the EMA tracker for its type */
100
+ recordCompletion(toolName, durationMs) {
101
+ const profile = this.getProfile(toolName);
102
+ if (!profile.useAdaptive)
103
+ return;
104
+ const tracker = this.trackers.get(toolName);
105
+ if (!tracker) {
106
+ this.trackers.set(toolName, {
107
+ estimatedDuration: durationMs,
108
+ deviation: durationMs / 2,
109
+ sampleCount: 1,
110
+ });
111
+ if (this.verbose) {
112
+ console.log(`[WATCHDOG] ${toolName}: first sample ${durationMs}ms, initial timeout ${this.getTimeout(toolName)}ms`);
113
+ }
114
+ return;
115
+ }
116
+ // RFC 6298 update
117
+ tracker.deviation = (1 - BETA) * tracker.deviation + BETA * Math.abs(durationMs - tracker.estimatedDuration);
118
+ tracker.estimatedDuration = (1 - ALPHA) * tracker.estimatedDuration + ALPHA * durationMs;
119
+ tracker.sampleCount++;
120
+ if (this.verbose) {
121
+ 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`);
122
+ }
123
+ }
124
+ /** Compute the current timeout for a tool type */
125
+ getTimeout(toolName) {
126
+ const profile = this.getProfile(toolName);
127
+ if (!profile.useAdaptive)
128
+ return profile.coldStartMs;
129
+ const tracker = this.trackers.get(toolName);
130
+ if (!tracker || tracker.sampleCount < 1)
131
+ return profile.coldStartMs;
132
+ const adaptive = tracker.estimatedDuration + DEVIATION_MULTIPLIER * tracker.deviation;
133
+ return Math.max(profile.floorMs, Math.min(profile.ceilingMs, adaptive));
134
+ }
135
+ /** Get the profile for a tool (with fallback to default) */
136
+ getProfile(toolName) {
137
+ return this.profiles[toolName] || DEFAULT_TOOL_TIMEOUT_PROFILE;
138
+ }
139
+ /** Start watching a tool call */
140
+ startWatch(toolId, toolName, toolInput, onTimeout) {
141
+ // Clear any existing watch for this ID
142
+ this.clearWatch(toolId);
143
+ const timeoutMs = this.getTimeout(toolName);
144
+ const profile = this.getProfile(toolName);
145
+ if (this.verbose) {
146
+ console.log(`[WATCHDOG] Starting watch: ${toolName} (${toolId}), timeout=${Math.round(timeoutMs / 1000)}s`);
147
+ }
148
+ const timer = setTimeout(async () => {
149
+ const extended = await this.handleTimeoutWithTiebreaker(toolId, toolName, toolInput, profile, onTimeout);
150
+ if (!extended) {
151
+ // Don't delete the watch here — buildCheckpoint() needs it.
152
+ // handleToolTimeout() calls clearAll() after building the checkpoint.
153
+ onTimeout();
154
+ }
155
+ }, timeoutMs);
156
+ this.activeWatches.set(toolId, {
157
+ toolName,
158
+ toolInput,
159
+ startTime: Date.now(),
160
+ timer,
161
+ timeoutMs,
162
+ tiebreakerAttempted: false,
163
+ });
164
+ }
165
+ /** Handle timeout expiry: attempt tiebreaker if configured, return true if extended */
166
+ async handleTimeoutWithTiebreaker(toolId, toolName, toolInput, profile, onTimeout) {
167
+ const watch = this.activeWatches.get(toolId);
168
+ if (!watch)
169
+ return true;
170
+ const elapsedMs = Date.now() - watch.startTime;
171
+ if (!profile.useHaikuTiebreaker || !this.onTiebreaker || watch.tiebreakerAttempted) {
172
+ if (this.verbose) {
173
+ console.log(`[WATCHDOG] ${toolName} (${toolId}) timed out after ${Math.round(elapsedMs / 1000)}s, killing`);
174
+ }
175
+ return false;
176
+ }
177
+ return this.runTiebreaker(watch, toolId, toolName, toolInput, elapsedMs, onTimeout);
178
+ }
179
+ /** Execute the Haiku tiebreaker and reschedule if extended */
180
+ async runTiebreaker(watch, toolId, toolName, toolInput, elapsedMs, onTimeout) {
181
+ watch.tiebreakerAttempted = true;
182
+ if (this.verbose) {
183
+ console.log(`[WATCHDOG] ${toolName} (${toolId}) hit timeout after ${Math.round(elapsedMs / 1000)}s, running tiebreaker...`);
184
+ }
185
+ try {
186
+ const verdict = await this.onTiebreaker(toolName, toolInput, elapsedMs);
187
+ if (verdict.action === 'extend') {
188
+ if (this.verbose) {
189
+ console.log(`[WATCHDOG] Tiebreaker: extend ${toolName} by ${Math.round(verdict.extensionMs / 1000)}s — ${verdict.reason}`);
190
+ }
191
+ this.scheduleExtensionTimeout(watch, toolId, toolName, verdict.extensionMs, onTimeout);
192
+ watch.timeoutMs = elapsedMs + verdict.extensionMs;
193
+ return true;
194
+ }
195
+ if (this.verbose) {
196
+ console.log(`[WATCHDOG] Tiebreaker: kill ${toolName} — ${verdict.reason}`);
197
+ }
198
+ }
199
+ catch (err) {
200
+ if (this.verbose) {
201
+ console.log(`[WATCHDOG] Tiebreaker failed: ${err}, proceeding with kill`);
202
+ }
203
+ }
204
+ return false;
205
+ }
206
+ /** Schedule a post-extension timeout that kills without another tiebreaker */
207
+ scheduleExtensionTimeout(watch, toolId, toolName, extensionMs, onTimeout) {
208
+ watch.timer = setTimeout(() => {
209
+ const w = this.activeWatches.get(toolId);
210
+ if (!w)
211
+ return;
212
+ if (this.verbose) {
213
+ console.log(`[WATCHDOG] ${toolName} (${toolId}) still running after extension, killing`);
214
+ }
215
+ // Don't delete the watch — buildCheckpoint() needs it.
216
+ // handleToolTimeout() calls clearAll() after building the checkpoint.
217
+ onTimeout();
218
+ }, extensionMs);
219
+ }
220
+ /** Stop watching a tool (it completed normally) */
221
+ clearWatch(toolId) {
222
+ const watch = this.activeWatches.get(toolId);
223
+ if (watch) {
224
+ clearTimeout(watch.timer);
225
+ this.activeWatches.delete(toolId);
226
+ }
227
+ }
228
+ /** Clear all active watches (process ending) */
229
+ clearAll() {
230
+ for (const [_id, watch] of this.activeWatches) {
231
+ clearTimeout(watch.timer);
232
+ }
233
+ this.activeWatches.clear();
234
+ }
235
+ /** Get the active watch for a tool ID (for checkpoint building) */
236
+ getActiveWatch(toolId) {
237
+ return this.activeWatches.get(toolId);
238
+ }
239
+ /** Get all active watches */
240
+ getActiveWatches() {
241
+ return this.activeWatches;
242
+ }
243
+ /** Build an ExecutionCheckpoint from the current state */
244
+ buildCheckpoint(originalPrompt, assistantText, thinkingText, accumulatedToolUse, hungToolId, claudeSessionId, processStartTime) {
245
+ const hungWatch = this.activeWatches.get(hungToolId);
246
+ if (!hungWatch)
247
+ return null;
248
+ // Find the matching tool entry
249
+ const hungToolEntry = accumulatedToolUse.find(t => t.toolId === hungToolId);
250
+ // Build completed tools list (exclude the hung one)
251
+ const completedTools = accumulatedToolUse
252
+ .filter(t => t.toolId !== hungToolId && t.result !== undefined)
253
+ .map(t => ({
254
+ toolName: t.toolName,
255
+ toolId: t.toolId,
256
+ input: t.toolInput,
257
+ result: t.result || '',
258
+ isError: t.isError || false,
259
+ durationMs: t.duration || 0,
260
+ }));
261
+ // Build in-progress tools list (started but no result, excluding the hung one)
262
+ const inProgressTools = accumulatedToolUse
263
+ .filter(t => t.toolId !== hungToolId && t.result === undefined)
264
+ .map(t => ({
265
+ toolName: t.toolName,
266
+ toolId: t.toolId,
267
+ input: t.toolInput,
268
+ }));
269
+ // Extract URL from tool input if WebFetch/WebSearch
270
+ let url;
271
+ const toolInput = hungToolEntry?.toolInput || hungWatch.toolInput;
272
+ if (toolInput.url) {
273
+ url = String(toolInput.url);
274
+ }
275
+ else if (toolInput.query) {
276
+ url = String(toolInput.query);
277
+ }
278
+ return {
279
+ originalPrompt,
280
+ assistantText,
281
+ thinkingText,
282
+ completedTools,
283
+ inProgressTools,
284
+ hungTool: {
285
+ toolName: hungWatch.toolName,
286
+ toolId: hungToolId,
287
+ input: toolInput,
288
+ timeoutMs: hungWatch.timeoutMs,
289
+ url,
290
+ },
291
+ claudeSessionId,
292
+ elapsedMs: Date.now() - processStartTime,
293
+ };
294
+ }
295
+ }
296
+ //# 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;
@@ -50,6 +98,16 @@ export interface HeadlessConfig {
50
98
  stallHardCapMs?: number;
51
99
  /** Claude model for main execution (e.g., 'opus', 'sonnet'). 'default' = no --model flag. */
52
100
  model?: string;
101
+ /** Per-tool timeout profiles (merge with defaults) */
102
+ toolTimeoutProfiles?: Record<string, Partial<ToolTimeoutProfile>>;
103
+ /** Enable per-tool adaptive timeout watchdog (default: true) */
104
+ enableToolWatchdog?: boolean;
105
+ /** Max auto-retries on tool timeout (default: 2) */
106
+ maxAutoRetries?: number;
107
+ /** Called when a tool times out with checkpoint data */
108
+ onToolTimeout?: (checkpoint: ExecutionCheckpoint) => void;
109
+ /** When true, spawn Claude with sanitized env (strips secrets, HOME=workingDir) */
110
+ sandboxed?: boolean;
53
111
  }
54
112
  export interface SessionState {
55
113
  sessionId: string;
@@ -82,6 +140,14 @@ export interface SessionResult {
82
140
  duration?: number;
83
141
  }>;
84
142
  claudeSessionId?: string;
143
+ /** Number of Claude Code native tool timeouts detected during this execution */
144
+ nativeTimeoutCount?: number;
145
+ /** Assistant text buffered after native timeouts — not yet shown to user.
146
+ * Flush to output if context is OK, discard if context was lost and recovery starts. */
147
+ postTimeoutOutput?: string;
148
+ /** Assistant text buffered during resume assessment — held back until thinking/tool activity
149
+ * confirms Claude has context. Undefined when not in resume mode or buffer was flushed. */
150
+ resumeBufferedOutput?: string;
85
151
  }
86
152
  export interface ToolUseAccumulator {
87
153
  toolName: string;
@@ -92,6 +158,8 @@ export interface ToolUseAccumulator {
92
158
  startTime: number;
93
159
  duration?: number;
94
160
  }
161
+ /** Map of toolId -> toolName for currently pending (started but not yet returned) tools */
162
+ export type PendingToolMap = Map<string, string>;
95
163
  export interface ExecutionResult {
96
164
  output: string;
97
165
  error?: string;
@@ -100,9 +168,17 @@ export interface ExecutionResult {
100
168
  thinkingOutput?: string;
101
169
  toolUseHistory?: ToolUseAccumulator[];
102
170
  claudeSessionId?: string;
171
+ /** Number of Claude Code native tool timeouts detected during this execution */
172
+ nativeTimeoutCount?: number;
173
+ /** Assistant text buffered after native timeouts — not yet sent to outputCallback.
174
+ * The session manager should flush this to the client if context is OK, or discard if recovering. */
175
+ postTimeoutOutput?: string;
176
+ /** Assistant text buffered during resume assessment — held back until thinking/tool activity
177
+ * confirms Claude has context. Undefined when not in resume mode or buffer was flushed. */
178
+ resumeBufferedOutput?: string;
103
179
  }
104
180
  /** Resolved config with all defaults applied */
105
- export type ResolvedHeadlessConfig = Omit<Required<HeadlessConfig>, 'outputCallback' | 'thinkingCallback' | 'toolUseCallback' | 'continueSession' | 'claudeSessionId' | 'imageAttachments' | 'model'> & {
181
+ export type ResolvedHeadlessConfig = Omit<Required<HeadlessConfig>, 'outputCallback' | 'thinkingCallback' | 'toolUseCallback' | 'continueSession' | 'claudeSessionId' | 'imageAttachments' | 'model' | 'toolTimeoutProfiles' | 'onToolTimeout' | 'sandboxed'> & {
106
182
  outputCallback?: (text: string) => void;
107
183
  thinkingCallback?: (text: string) => void;
108
184
  toolUseCallback?: (event: ToolUseEvent) => void;
@@ -110,5 +186,8 @@ export type ResolvedHeadlessConfig = Omit<Required<HeadlessConfig>, 'outputCallb
110
186
  claudeSessionId?: string;
111
187
  imageAttachments?: ImageAttachment[];
112
188
  model?: string;
189
+ toolTimeoutProfiles?: Record<string, Partial<ToolTimeoutProfile>>;
190
+ onToolTimeout?: (checkpoint: ExecutionCheckpoint) => void;
191
+ sandboxed?: boolean;
113
192
  };
114
193
  //# 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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"}
@@ -42,6 +42,7 @@ export interface MovementRecord {
42
42
  thinkingOutput?: string;
43
43
  toolUseHistory?: ToolUseRecord[];
44
44
  errorOutput?: string;
45
+ durationMs?: number;
45
46
  }
46
47
  export interface SessionHistory {
47
48
  sessionId: string;
@@ -67,6 +68,8 @@ export declare class ImprovisationSessionManager extends EventEmitter {
67
68
  accumulatedKnowledge: string;
68
69
  /** Whether a prompt is currently executing */
69
70
  private _isExecuting;
71
+ /** Timestamp when current execution started (for accurate elapsed time across reconnects) */
72
+ private _executionStartTimestamp;
70
73
  /** Buffered events during current execution, for replay on reconnect */
71
74
  private executionEventLog;
72
75
  /**
@@ -89,23 +92,123 @@ export declare class ImprovisationSessionManager extends EventEmitter {
89
92
  */
90
93
  private flushOutputQueue;
91
94
  /**
92
- * Build prompt with text file attachments prepended
95
+ * Build prompt with text file attachments prepended and disk path references
93
96
  * Format: each text file is shown as @path followed by content in code block
94
97
  */
95
98
  private buildPromptWithAttachments;
99
+ /**
100
+ * Write attachments to disk at .mstro/tmp/attachments/{sessionId}/
101
+ * Returns array of absolute file paths for each persisted attachment.
102
+ */
103
+ private persistAttachments;
104
+ /**
105
+ * Clean up persisted attachments for this session
106
+ */
107
+ private cleanupAttachments;
96
108
  /**
97
109
  * Execute a user prompt directly (Improvise mode - no score decomposition)
98
110
  * Uses persistent Claude sessions via --resume <sessionId> for conversation continuity
99
111
  * Each tab maintains its own claudeSessionId for proper isolation
100
112
  * Supports file attachments: text files prepended to prompt, images via stream-json multimodal
101
113
  */
102
- executePrompt(userPrompt: string, attachments?: FileAttachment[]): Promise<MovementRecord>;
114
+ executePrompt(userPrompt: string, attachments?: FileAttachment[], options?: {
115
+ sandboxed?: boolean;
116
+ }): Promise<MovementRecord>;
117
+ /** Prepare prompt with attachments and limit image count */
118
+ private preparePromptAndAttachments;
119
+ /** Determine whether to use --resume and which session ID */
120
+ private determineResumeStrategy;
121
+ /** Create HeadlessRunner for one retry iteration */
122
+ private createExecutionRunner;
123
+ /** Save checkpoint and reset per-iteration state before each retry loop pass. */
124
+ private resetIterationState;
125
+ /** Update best result tracking */
126
+ private updateBestResult;
127
+ /** Detect resume context loss (Path 1): session expired on --resume */
128
+ private detectResumeContextLoss;
129
+ /** Detect native timeout context loss (Path 2): tool timeouts caused confusion */
130
+ private detectNativeTimeoutContextLoss;
131
+ /** Flush post-timeout output if context wasn't lost */
132
+ private flushPostTimeoutOutput;
133
+ /** Check if context loss recovery should trigger a retry. Returns true if loop should continue. */
134
+ private shouldRetryContextLoss;
135
+ /** Accumulate completed tool results from a run into the retry state */
136
+ private accumulateToolResults;
137
+ /** Handle inter-movement context loss recovery (resume session expired) */
138
+ private applyInterMovementRecovery;
139
+ /** Handle native-timeout context loss recovery (tool timeouts caused confusion) */
140
+ private applyNativeTimeoutRecovery;
141
+ /** Handle tool timeout checkpoint. Returns true if loop should continue. */
142
+ private applyToolTimeoutRetry;
143
+ /** Select the best result across retries using Haiku assessment */
144
+ private selectBestResult;
145
+ /** Fallback best result selection using numeric scoring */
146
+ private fallbackBestResult;
147
+ /** Replace a result's claudeSessionId with a newer one */
148
+ private mergeResultSessionId;
149
+ /** Capture Claude session ID and surface execution failures */
150
+ private captureSessionAndSurfaceErrors;
151
+ /** Build a MovementRecord from execution result */
152
+ private buildMovementRecord;
153
+ /** Handle file conflicts from execution result */
154
+ private handleConflicts;
155
+ /** Persist movement to history */
156
+ private persistMovement;
157
+ /** Emit movement completion events and analytics */
158
+ private emitMovementComplete;
103
159
  /**
104
160
  * Build historical context for resuming a session.
105
161
  * This creates a summary of the previous conversation that will be injected
106
162
  * into the first prompt of a resumed session.
107
163
  */
108
164
  private buildHistoricalContext;
165
+ /**
166
+ * Build a retry prompt from a tool timeout checkpoint.
167
+ * Injects completed tool results and instructs Claude to skip the failed resource.
168
+ */
169
+ private buildRetryPrompt;
170
+ /**
171
+ * Build a short retry prompt for --resume sessions.
172
+ * The session already has full conversation context, so we only need to
173
+ * explain what timed out and instruct Claude to continue.
174
+ */
175
+ private buildResumeRetryPrompt;
176
+ /**
177
+ * Build a recovery prompt for --resume after context loss.
178
+ * Since we're resuming the same session, Claude has full conversation history
179
+ * (including all preserved tool results). We just need to redirect it back to the task.
180
+ */
181
+ private buildContextRecoveryPrompt;
182
+ /**
183
+ * Build a recovery prompt for a fresh session (no --resume) after repeated context loss.
184
+ * Injects all accumulated tool results from previous attempts so Claude can continue
185
+ * the task without re-fetching data it already gathered.
186
+ */
187
+ private buildFreshRecoveryPrompt;
188
+ /**
189
+ * Extract tool results from the last N movements in history.
190
+ * Used for inter-movement recovery to provide context from prior work
191
+ * when a resume session is corrupted/expired.
192
+ */
193
+ private extractHistoricalToolResults;
194
+ /**
195
+ * Build a recovery prompt for inter-movement context loss.
196
+ * The Claude session expired between movements (not due to native timeouts).
197
+ * Includes prior conversation summary + preserved tool results + anti-timeout guidance.
198
+ */
199
+ private buildInterMovementRecoveryPrompt;
200
+ /** Summarize a tool input for display in retry prompts */
201
+ private summarizeToolInput;
202
+ /** Format a list of timed-out tools for retry prompts */
203
+ private formatTimedOutTools;
204
+ /** Format completed checkpoint tools for retry prompts */
205
+ private formatCompletedTools;
206
+ /** Format in-progress tools for retry prompts */
207
+ private formatInProgressTools;
208
+ /** Format tool results from ToolUseRecord[] for recovery prompts */
209
+ private formatToolResults;
210
+ /** Format conversation history for recovery prompts */
211
+ private formatConversationHistory;
109
212
  /**
110
213
  * Load history from disk
111
214
  */
@@ -155,6 +258,10 @@ export declare class ImprovisationSessionManager extends EventEmitter {
155
258
  * Whether a prompt is currently executing
156
259
  */
157
260
  get isExecuting(): boolean;
261
+ /**
262
+ * Timestamp when current execution started (undefined when not executing)
263
+ */
264
+ get executionStartTimestamp(): number | undefined;
158
265
  /**
159
266
  * Get buffered execution events for replay on reconnect.
160
267
  * Only meaningful while isExecuting is true.
@@ -1 +1 @@
1
- {"version":3,"file":"improvisation-session-manager.d.ts","sourceRoot":"","sources":["../../../server/cli/improvisation-session-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"improvisation-session-manager.d.ts","sourceRoot":"","sources":["../../../server/cli/improvisation-session-manager.ts"],"names":[],"mappings":"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"}