mstro-app 0.4.52 → 0.5.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/README.md +10 -5
- package/bin/mstro.js +1 -1
- package/dist/server/cli/headless/claude-invoker-stall.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker-stall.js +7 -2
- package/dist/server/cli/headless/claude-invoker-stall.js.map +1 -1
- package/dist/server/cli/headless/claude-invoker.js +1 -1
- package/dist/server/cli/headless/claude-invoker.js.map +1 -1
- package/dist/server/cli/headless/runner.d.ts.map +1 -1
- package/dist/server/cli/headless/runner.js +63 -67
- package/dist/server/cli/headless/runner.js.map +1 -1
- package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
- package/dist/server/cli/headless/stall-assessor.js +9 -4
- package/dist/server/cli/headless/stall-assessor.js.map +1 -1
- package/dist/server/cli/improvisation-history-store.d.ts +16 -0
- package/dist/server/cli/improvisation-history-store.d.ts.map +1 -0
- package/dist/server/cli/improvisation-history-store.js +52 -0
- package/dist/server/cli/improvisation-history-store.js.map +1 -0
- package/dist/server/cli/improvisation-movements.d.ts +31 -0
- package/dist/server/cli/improvisation-movements.d.ts.map +1 -0
- package/dist/server/cli/improvisation-movements.js +93 -0
- package/dist/server/cli/improvisation-movements.js.map +1 -0
- package/dist/server/cli/improvisation-output-queue.d.ts +13 -0
- package/dist/server/cli/improvisation-output-queue.d.ts.map +1 -0
- package/dist/server/cli/improvisation-output-queue.js +40 -0
- package/dist/server/cli/improvisation-output-queue.js.map +1 -0
- package/dist/server/cli/improvisation-retry.d.ts +21 -51
- package/dist/server/cli/improvisation-retry.d.ts.map +1 -1
- package/dist/server/cli/improvisation-retry.js +18 -433
- package/dist/server/cli/improvisation-retry.js.map +1 -1
- package/dist/server/cli/improvisation-session-manager.d.ts +10 -8
- package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.js +53 -148
- package/dist/server/cli/improvisation-session-manager.js.map +1 -1
- package/dist/server/cli/retry/retry-best-result.d.ts +4 -0
- package/dist/server/cli/retry/retry-best-result.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-best-result.js +61 -0
- package/dist/server/cli/retry/retry-best-result.js.map +1 -0
- package/dist/server/cli/retry/retry-context-loss.d.ts +6 -0
- package/dist/server/cli/retry/retry-context-loss.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-context-loss.js +68 -0
- package/dist/server/cli/retry/retry-context-loss.js.map +1 -0
- package/dist/server/cli/retry/retry-premature-completion.d.ts +5 -0
- package/dist/server/cli/retry/retry-premature-completion.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-premature-completion.js +81 -0
- package/dist/server/cli/retry/retry-premature-completion.js.map +1 -0
- package/dist/server/cli/retry/retry-recovery-strategies.d.ts +13 -0
- package/dist/server/cli/retry/retry-recovery-strategies.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-recovery-strategies.js +166 -0
- package/dist/server/cli/retry/retry-recovery-strategies.js.map +1 -0
- package/dist/server/cli/retry/retry-resume-strategy.d.ts +12 -0
- package/dist/server/cli/retry/retry-resume-strategy.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-resume-strategy.js +22 -0
- package/dist/server/cli/retry/retry-resume-strategy.js.map +1 -0
- package/dist/server/cli/retry/retry-runner-factory.d.ts +11 -0
- package/dist/server/cli/retry/retry-runner-factory.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-runner-factory.js +60 -0
- package/dist/server/cli/retry/retry-runner-factory.js.map +1 -0
- package/dist/server/cli/retry/retry-tool-results.d.ts +9 -0
- package/dist/server/cli/retry/retry-tool-results.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-tool-results.js +24 -0
- package/dist/server/cli/retry/retry-tool-results.js.map +1 -0
- package/dist/server/cli/retry/retry-types.d.ts +30 -0
- package/dist/server/cli/retry/retry-types.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-types.js +4 -0
- package/dist/server/cli/retry/retry-types.js.map +1 -0
- package/dist/server/index.js +21 -109
- package/dist/server/index.js.map +1 -1
- package/dist/server/server-setup.d.ts +16 -1
- package/dist/server/server-setup.d.ts.map +1 -1
- package/dist/server/server-setup.js +107 -0
- package/dist/server/server-setup.js.map +1 -1
- package/dist/server/services/plan/board-config.d.ts +21 -0
- package/dist/server/services/plan/board-config.d.ts.map +1 -0
- package/dist/server/services/plan/board-config.js +112 -0
- package/dist/server/services/plan/board-config.js.map +1 -0
- package/dist/server/services/plan/composer.d.ts +1 -1
- package/dist/server/services/plan/composer.d.ts.map +1 -1
- package/dist/server/services/plan/composer.js +7 -5
- package/dist/server/services/plan/composer.js.map +1 -1
- package/dist/server/services/plan/executor.d.ts +48 -48
- package/dist/server/services/plan/executor.d.ts.map +1 -1
- package/dist/server/services/plan/executor.js +157 -455
- package/dist/server/services/plan/executor.js.map +1 -1
- package/dist/server/services/plan/issue-loader.d.ts +16 -0
- package/dist/server/services/plan/issue-loader.d.ts.map +1 -0
- package/dist/server/services/plan/issue-loader.js +46 -0
- package/dist/server/services/plan/issue-loader.js.map +1 -0
- package/dist/server/services/plan/issue-writer.d.ts +34 -0
- package/dist/server/services/plan/issue-writer.d.ts.map +1 -0
- package/dist/server/services/plan/issue-writer.js +110 -0
- package/dist/server/services/plan/issue-writer.js.map +1 -0
- package/dist/server/services/plan/output-manager.d.ts.map +1 -1
- package/dist/server/services/plan/output-manager.js +2 -1
- package/dist/server/services/plan/output-manager.js.map +1 -1
- package/dist/server/services/plan/progress-log.d.ts +11 -0
- package/dist/server/services/plan/progress-log.d.ts.map +1 -0
- package/dist/server/services/plan/progress-log.js +81 -0
- package/dist/server/services/plan/progress-log.js.map +1 -0
- package/dist/server/services/plan/prompt-builder.d.ts.map +1 -1
- package/dist/server/services/plan/prompt-builder.js +48 -31
- package/dist/server/services/plan/prompt-builder.js.map +1 -1
- package/dist/server/services/plan/readiness-planner.d.ts +15 -0
- package/dist/server/services/plan/readiness-planner.d.ts.map +1 -0
- package/dist/server/services/plan/readiness-planner.js +41 -0
- package/dist/server/services/plan/readiness-planner.js.map +1 -0
- package/dist/server/services/plan/review-gate.d.ts +31 -0
- package/dist/server/services/plan/review-gate.d.ts.map +1 -1
- package/dist/server/services/plan/review-gate.js +52 -2
- package/dist/server/services/plan/review-gate.js.map +1 -1
- package/dist/server/services/platform.d.ts +56 -0
- package/dist/server/services/platform.d.ts.map +1 -1
- package/dist/server/services/platform.js +154 -52
- package/dist/server/services/platform.js.map +1 -1
- package/dist/server/services/websocket/file-download-handler.d.ts +17 -0
- package/dist/server/services/websocket/file-download-handler.d.ts.map +1 -0
- package/dist/server/services/websocket/file-download-handler.js +165 -0
- package/dist/server/services/websocket/file-download-handler.js.map +1 -0
- package/dist/server/services/websocket/git-worktree-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-worktree-handlers.js +28 -2
- package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -1
- package/dist/server/services/websocket/handler-context.d.ts +15 -0
- package/dist/server/services/websocket/handler-context.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.d.ts +7 -0
- package/dist/server/services/websocket/handler.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.js +73 -11
- package/dist/server/services/websocket/handler.js.map +1 -1
- package/dist/server/services/websocket/msg-id-tracker.d.ts +21 -0
- package/dist/server/services/websocket/msg-id-tracker.d.ts.map +1 -0
- package/dist/server/services/websocket/msg-id-tracker.js +77 -0
- package/dist/server/services/websocket/msg-id-tracker.js.map +1 -0
- package/dist/server/services/websocket/quality-handlers.js +15 -3
- package/dist/server/services/websocket/quality-handlers.js.map +1 -1
- package/dist/server/services/websocket/quality-review-agent.js +2 -2
- package/dist/server/services/websocket/session-handlers.d.ts +48 -2
- package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/session-handlers.js +204 -65
- package/dist/server/services/websocket/session-handlers.js.map +1 -1
- package/dist/server/services/websocket/session-initialization.d.ts +2 -2
- package/dist/server/services/websocket/session-initialization.d.ts.map +1 -1
- package/dist/server/services/websocket/session-initialization.js +75 -17
- package/dist/server/services/websocket/session-initialization.js.map +1 -1
- package/dist/server/services/websocket/session-registry.d.ts +29 -1
- package/dist/server/services/websocket/session-registry.d.ts.map +1 -1
- package/dist/server/services/websocket/session-registry.js +53 -4
- package/dist/server/services/websocket/session-registry.js.map +1 -1
- package/dist/server/services/websocket/tab-broadcast.d.ts +24 -0
- package/dist/server/services/websocket/tab-broadcast.d.ts.map +1 -0
- package/dist/server/services/websocket/tab-broadcast.js +13 -0
- package/dist/server/services/websocket/tab-broadcast.js.map +1 -0
- package/dist/server/services/websocket/tab-event-buffer.d.ts +103 -0
- package/dist/server/services/websocket/tab-event-buffer.d.ts.map +1 -0
- package/dist/server/services/websocket/tab-event-buffer.js +107 -0
- package/dist/server/services/websocket/tab-event-buffer.js.map +1 -0
- package/dist/server/services/websocket/tab-event-replay.d.ts +20 -0
- package/dist/server/services/websocket/tab-event-replay.d.ts.map +1 -0
- package/dist/server/services/websocket/tab-event-replay.js +21 -0
- package/dist/server/services/websocket/tab-event-replay.js.map +1 -0
- package/dist/server/services/websocket/tab-handlers.d.ts +0 -1
- package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/tab-handlers.js +2 -9
- package/dist/server/services/websocket/tab-handlers.js.map +1 -1
- package/dist/server/services/websocket/types.d.ts +15 -6
- package/dist/server/services/websocket/types.d.ts.map +1 -1
- package/dist/server/services/websocket/types.js +6 -4
- package/dist/server/services/websocket/types.js.map +1 -1
- package/package.json +1 -1
- package/server/README.md +1 -1
- package/server/cli/headless/claude-invoker-stall.ts +7 -2
- package/server/cli/headless/claude-invoker.ts +1 -1
- package/server/cli/headless/runner.ts +67 -72
- package/server/cli/headless/stall-assessor.ts +9 -4
- package/server/cli/headless/types.ts +1 -1
- package/server/cli/improvisation-history-store.ts +62 -0
- package/server/cli/improvisation-movements.ts +120 -0
- package/server/cli/improvisation-output-queue.ts +42 -0
- package/server/cli/improvisation-retry.ts +25 -600
- package/server/cli/improvisation-session-manager.ts +74 -160
- package/server/cli/retry/retry-best-result.ts +70 -0
- package/server/cli/retry/retry-context-loss.ts +87 -0
- package/server/cli/retry/retry-premature-completion.ts +113 -0
- package/server/cli/retry/retry-recovery-strategies.ts +247 -0
- package/server/cli/retry/retry-resume-strategy.ts +33 -0
- package/server/cli/retry/retry-runner-factory.ts +70 -0
- package/server/cli/retry/retry-tool-results.ts +31 -0
- package/server/cli/retry/retry-types.ts +32 -0
- package/server/index.ts +37 -123
- package/server/server-setup.ts +126 -1
- package/server/services/plan/agents/assess-stall.md +11 -4
- package/server/services/plan/board-config.ts +122 -0
- package/server/services/plan/composer.ts +7 -5
- package/server/services/plan/executor.ts +214 -467
- package/server/services/plan/issue-loader.ts +64 -0
- package/server/services/plan/issue-writer.ts +137 -0
- package/server/services/plan/output-manager.ts +2 -1
- package/server/services/plan/progress-log.ts +92 -0
- package/server/services/plan/prompt-builder.ts +73 -35
- package/server/services/plan/readiness-planner.ts +50 -0
- package/server/services/plan/review-gate.ts +102 -2
- package/server/services/platform.ts +163 -58
- package/server/services/websocket/file-download-handler.ts +191 -0
- package/server/services/websocket/git-worktree-handlers.ts +29 -2
- package/server/services/websocket/handler-context.ts +15 -0
- package/server/services/websocket/handler.ts +76 -12
- package/server/services/websocket/msg-id-tracker.ts +84 -0
- package/server/services/websocket/quality-handlers.ts +16 -3
- package/server/services/websocket/quality-review-agent.ts +2 -2
- package/server/services/websocket/session-handlers.ts +213 -68
- package/server/services/websocket/session-initialization.ts +83 -19
- package/server/services/websocket/session-registry.ts +61 -4
- package/server/services/websocket/tab-broadcast.ts +38 -0
- package/server/services/websocket/tab-event-buffer.ts +159 -0
- package/server/services/websocket/tab-event-replay.ts +42 -0
- package/server/services/websocket/tab-handlers.ts +2 -9
- package/server/services/websocket/types.ts +17 -4
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
|
+
/**
|
|
4
|
+
* Detects when a claimed-complete run is actually unfinished (hit
|
|
5
|
+
* max_tokens, abandoned mid-task, or Haiku says the end_turn response is
|
|
6
|
+
* a stop short of the goal) and triggers a continuation retry.
|
|
7
|
+
*/
|
|
8
|
+
import { AnalyticsEvents, trackEvent } from '../../services/analytics.js';
|
|
9
|
+
import { hlog } from '../headless/headless-logger.js';
|
|
10
|
+
import { extractFinalTextBlock, isResponseAbandoned } from '../headless/retry-strategies.js';
|
|
11
|
+
import { assessPrematureCompletion } from '../headless/stall-assessor.js';
|
|
12
|
+
/** Guard checks for premature completion */
|
|
13
|
+
function isPrematureCompletionCandidate(result, state, maxRetries) {
|
|
14
|
+
if (!result.completed || result.signalName || state.retryNumber >= maxRetries)
|
|
15
|
+
return false;
|
|
16
|
+
if (state.checkpointRef.value || state.contextLost)
|
|
17
|
+
return false;
|
|
18
|
+
if (!result.claudeSessionId || !result.stopReason)
|
|
19
|
+
return false;
|
|
20
|
+
return result.stopReason === 'max_tokens' || result.stopReason === 'end_turn';
|
|
21
|
+
}
|
|
22
|
+
/** Use Haiku to assess whether an end_turn response is genuinely complete */
|
|
23
|
+
async function assessEndTurnCompletion(result, verbose) {
|
|
24
|
+
if (!result.assistantResponse)
|
|
25
|
+
return false;
|
|
26
|
+
const successfulToolCalls = result.toolUseHistory?.filter(t => t.result !== undefined && !t.isError).length ?? 0;
|
|
27
|
+
const claudeCmd = process.env.CLAUDE_COMMAND || 'claude';
|
|
28
|
+
const verdict = await assessPrematureCompletion({
|
|
29
|
+
responseTail: extractFinalTextBlock(result.assistantResponse, 800),
|
|
30
|
+
successfulToolCalls,
|
|
31
|
+
hasThinking: !!result.thinkingOutput,
|
|
32
|
+
responseLength: result.assistantResponse.length,
|
|
33
|
+
}, claudeCmd, verbose);
|
|
34
|
+
if (verbose) {
|
|
35
|
+
hlog(`[PREMATURE-COMPLETION] Haiku verdict: ${verdict.isIncomplete ? 'INCOMPLETE' : 'COMPLETE'} — ${verdict.reason}`);
|
|
36
|
+
}
|
|
37
|
+
return verdict.isIncomplete;
|
|
38
|
+
}
|
|
39
|
+
/** Apply premature completion retry */
|
|
40
|
+
function applyPrematureCompletionRetry(result, state, session, maxRetries, stopReason, isMaxTokens, callbacks) {
|
|
41
|
+
state.retryNumber++;
|
|
42
|
+
const reason = isMaxTokens ? 'Output limit reached' : 'Task appears unfinished (AI assessment)';
|
|
43
|
+
state.retryLog.push({
|
|
44
|
+
retryNumber: state.retryNumber,
|
|
45
|
+
path: 'PrematureCompletion',
|
|
46
|
+
reason,
|
|
47
|
+
timestamp: Date.now(),
|
|
48
|
+
});
|
|
49
|
+
callbacks.emit('onAutoRetry', {
|
|
50
|
+
retryNumber: state.retryNumber,
|
|
51
|
+
maxRetries,
|
|
52
|
+
toolName: `PrematureCompletion(${stopReason})`,
|
|
53
|
+
completedCount: result.toolUseHistory?.length ?? 0,
|
|
54
|
+
});
|
|
55
|
+
trackEvent(AnalyticsEvents.IMPROVISE_AUTO_RETRY, {
|
|
56
|
+
retry_number: state.retryNumber,
|
|
57
|
+
hung_tool: `premature_completion:${stopReason}`,
|
|
58
|
+
completed_tools: result.toolUseHistory?.length ?? 0,
|
|
59
|
+
resume_attempted: true,
|
|
60
|
+
});
|
|
61
|
+
callbacks.queueOutput(`\n${reason} — resuming session (retry ${state.retryNumber}/${maxRetries}).\n`);
|
|
62
|
+
callbacks.flushOutputQueue();
|
|
63
|
+
state.contextRecoverySessionId = result.claudeSessionId;
|
|
64
|
+
session.claudeSessionId = result.claudeSessionId;
|
|
65
|
+
state.currentPrompt = 'continue';
|
|
66
|
+
}
|
|
67
|
+
/** Detect and retry premature completion. Returns true if loop should continue. */
|
|
68
|
+
export async function shouldRetryPrematureCompletion(result, state, session, maxRetries, callbacks) {
|
|
69
|
+
if (!isPrematureCompletionCandidate(result, state, maxRetries)) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
const stopReason = result.stopReason;
|
|
73
|
+
const isMaxTokens = stopReason === 'max_tokens';
|
|
74
|
+
const abandoned = isResponseAbandoned(result);
|
|
75
|
+
const isIncomplete = isMaxTokens || abandoned || await assessEndTurnCompletion(result, session.options.verbose);
|
|
76
|
+
if (!isIncomplete)
|
|
77
|
+
return false;
|
|
78
|
+
applyPrematureCompletionRetry(result, state, session, maxRetries, stopReason, isMaxTokens, callbacks);
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=retry-premature-completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-premature-completion.js","sourceRoot":"","sources":["../../../../server/cli/retry/retry-premature-completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HeadlessRunResult, MovementRecord, RetryLoopState } from '../improvisation-types.js';
|
|
2
|
+
import type { RetryCallbacks, RetrySessionState } from './retry-types.js';
|
|
3
|
+
/** Handle inter-movement context loss recovery (resume session expired) */
|
|
4
|
+
export declare function applyInterMovementRecovery(state: RetryLoopState, promptWithAttachments: string, history: MovementRecord[], callbacks: RetryCallbacks): void;
|
|
5
|
+
/** Handle native-timeout context loss recovery (tool timeouts caused confusion) */
|
|
6
|
+
export declare function applyNativeTimeoutRecovery(result: HeadlessRunResult, state: RetryLoopState, promptWithAttachments: string, session: RetrySessionState, callbacks: RetryCallbacks): void;
|
|
7
|
+
/** Check if context loss recovery should trigger. Returns true if loop should continue. */
|
|
8
|
+
export declare function shouldRetryContextLoss(result: HeadlessRunResult, state: RetryLoopState, session: RetrySessionState, useResume: boolean, nativeTimeouts: number, maxRetries: number, promptWithAttachments: string, callbacks: RetryCallbacks): boolean;
|
|
9
|
+
/** Handle tool timeout checkpoint. Returns true if loop should continue. */
|
|
10
|
+
export declare function applyToolTimeoutRetry(state: RetryLoopState, maxRetries: number, promptWithAttachments: string, callbacks: RetryCallbacks, model: string | undefined, effortLevel: string | undefined): boolean;
|
|
11
|
+
/** Detect and retry after a signal crash. Returns true if loop should continue. */
|
|
12
|
+
export declare function shouldRetrySignalCrash(result: HeadlessRunResult, state: RetryLoopState, session: RetrySessionState, maxRetries: number, promptWithAttachments: string, callbacks: RetryCallbacks): boolean;
|
|
13
|
+
//# sourceMappingURL=retry-recovery-strategies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-recovery-strategies.d.ts","sourceRoot":"","sources":["../../../../server/cli/retry/retry-recovery-strategies.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAWnG,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAI1E,2EAA2E;AAC3E,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,cAAc,EACrB,qBAAqB,EAAE,MAAM,EAC7B,OAAO,EAAE,cAAc,EAAE,EACzB,SAAS,EAAE,cAAc,GACxB,IAAI,CAiBN;AAED,mFAAmF;AACnF,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,cAAc,EACrB,qBAAqB,EAAE,MAAM,EAC7B,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,cAAc,GACxB,IAAI,CA0BN;AAED,2FAA2F;AAC3F,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,OAAO,EAClB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,qBAAqB,EAAE,MAAM,EAC7B,SAAS,EAAE,cAAc,GACxB,OAAO,CAmBT;AAID,4EAA4E;AAC5E,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,MAAM,EAClB,qBAAqB,EAAE,MAAM,EAC7B,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,OAAO,CAkDT;AAID,mFAAmF;AACnF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,MAAM,EAClB,qBAAqB,EAAE,MAAM,EAC7B,SAAS,EAAE,cAAc,GACxB,OAAO,CAyDT"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
|
+
/**
|
|
4
|
+
* Recovery strategies: context-loss (inter-movement / native-timeout),
|
|
5
|
+
* tool-timeout checkpoint retry, and signal-crash retry. Each `shouldRetry*`
|
|
6
|
+
* or `apply*Retry` function returns true when the retry loop should loop.
|
|
7
|
+
*/
|
|
8
|
+
import { AnalyticsEvents, trackEvent } from '../../services/analytics.js';
|
|
9
|
+
import { buildContextRecoveryPrompt, buildFreshRecoveryPrompt, buildInterMovementRecoveryPrompt, buildResumeRetryPrompt, buildRetryPrompt, buildSignalCrashRecoveryPrompt, extractHistoricalToolResults, } from '../prompt-builders.js';
|
|
10
|
+
import { accumulateToolResults } from './retry-tool-results.js';
|
|
11
|
+
// ── Context-loss recovery ────────────────────────────────────
|
|
12
|
+
/** Handle inter-movement context loss recovery (resume session expired) */
|
|
13
|
+
export function applyInterMovementRecovery(state, promptWithAttachments, history, callbacks) {
|
|
14
|
+
const historicalResults = extractHistoricalToolResults(history);
|
|
15
|
+
const allResults = [...historicalResults, ...state.accumulatedToolResults];
|
|
16
|
+
callbacks.emit('onAutoRetry', {
|
|
17
|
+
retryNumber: state.retryNumber,
|
|
18
|
+
maxRetries: 3,
|
|
19
|
+
toolName: 'InterMovementRecovery',
|
|
20
|
+
completedCount: allResults.length,
|
|
21
|
+
});
|
|
22
|
+
callbacks.queueOutput(`\n[[MSTRO_CONTEXT_RECOVERY]] Session context expired — continuing with ${allResults.length} preserved results from prior work (retry ${state.retryNumber}/3).\n`);
|
|
23
|
+
callbacks.flushOutputQueue();
|
|
24
|
+
state.freshRecoveryMode = true;
|
|
25
|
+
state.currentPrompt = buildInterMovementRecoveryPrompt(promptWithAttachments, allResults, history);
|
|
26
|
+
}
|
|
27
|
+
/** Handle native-timeout context loss recovery (tool timeouts caused confusion) */
|
|
28
|
+
export function applyNativeTimeoutRecovery(result, state, promptWithAttachments, session, callbacks) {
|
|
29
|
+
const completedCount = state.accumulatedToolResults.length;
|
|
30
|
+
callbacks.emit('onAutoRetry', {
|
|
31
|
+
retryNumber: state.retryNumber,
|
|
32
|
+
maxRetries: 3,
|
|
33
|
+
toolName: 'ContextRecovery',
|
|
34
|
+
completedCount,
|
|
35
|
+
});
|
|
36
|
+
if (result.claudeSessionId && state.retryNumber === 1) {
|
|
37
|
+
callbacks.queueOutput(`\n[[MSTRO_CONTEXT_RECOVERY]] Context loss detected — resuming session with ${completedCount} preserved results (retry ${state.retryNumber}/3).\n`);
|
|
38
|
+
callbacks.flushOutputQueue();
|
|
39
|
+
state.contextRecoverySessionId = result.claudeSessionId;
|
|
40
|
+
session.claudeSessionId = result.claudeSessionId;
|
|
41
|
+
state.currentPrompt = buildContextRecoveryPrompt(promptWithAttachments);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
callbacks.queueOutput(`\n[[MSTRO_CONTEXT_RECOVERY]] Continuing with fresh context — ${completedCount} preserved results injected (retry ${state.retryNumber}/3).\n`);
|
|
45
|
+
callbacks.flushOutputQueue();
|
|
46
|
+
state.freshRecoveryMode = true;
|
|
47
|
+
state.currentPrompt = buildFreshRecoveryPrompt(promptWithAttachments, state.accumulatedToolResults, state.timedOutTools);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Check if context loss recovery should trigger. Returns true if loop should continue. */
|
|
51
|
+
export function shouldRetryContextLoss(result, state, session, useResume, nativeTimeouts, maxRetries, promptWithAttachments, callbacks) {
|
|
52
|
+
if (state.checkpointRef.value || state.retryNumber >= maxRetries || !state.contextLost) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
accumulateToolResults(result, state);
|
|
56
|
+
state.retryNumber++;
|
|
57
|
+
const path = (useResume && nativeTimeouts === 0) ? 'InterMovementRecovery' : 'NativeTimeoutRecovery';
|
|
58
|
+
state.retryLog.push({
|
|
59
|
+
retryNumber: state.retryNumber,
|
|
60
|
+
path,
|
|
61
|
+
reason: `Context lost (${nativeTimeouts} timeouts, ${state.accumulatedToolResults.length} tools preserved)`,
|
|
62
|
+
timestamp: Date.now(),
|
|
63
|
+
});
|
|
64
|
+
if (useResume && nativeTimeouts === 0) {
|
|
65
|
+
applyInterMovementRecovery(state, promptWithAttachments, session.history.movements, callbacks);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
applyNativeTimeoutRecovery(result, state, promptWithAttachments, session, callbacks);
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
// ── Tool-timeout retry ───────────────────────────────────────
|
|
73
|
+
/** Handle tool timeout checkpoint. Returns true if loop should continue. */
|
|
74
|
+
export function applyToolTimeoutRetry(state, maxRetries, promptWithAttachments, callbacks, model, effortLevel) {
|
|
75
|
+
if (!state.checkpointRef.value || state.retryNumber >= maxRetries) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
const cp = state.checkpointRef.value;
|
|
79
|
+
state.retryNumber++;
|
|
80
|
+
state.timedOutTools.push({
|
|
81
|
+
toolName: cp.hungTool.toolName,
|
|
82
|
+
input: cp.hungTool.input ?? {},
|
|
83
|
+
timeoutMs: cp.hungTool.timeoutMs,
|
|
84
|
+
});
|
|
85
|
+
const canResumeSession = cp.inProgressTools.length === 0 && !!cp.claudeSessionId;
|
|
86
|
+
state.retryLog.push({
|
|
87
|
+
retryNumber: state.retryNumber,
|
|
88
|
+
path: 'ToolTimeout',
|
|
89
|
+
reason: `${cp.hungTool.toolName} timed out after ${cp.hungTool.timeoutMs}ms, ${cp.completedTools.length} tools completed, ${canResumeSession ? 'resuming' : 'fresh start'}`,
|
|
90
|
+
timestamp: Date.now(),
|
|
91
|
+
});
|
|
92
|
+
callbacks.emit('onAutoRetry', {
|
|
93
|
+
retryNumber: state.retryNumber,
|
|
94
|
+
maxRetries,
|
|
95
|
+
toolName: cp.hungTool.toolName,
|
|
96
|
+
url: cp.hungTool.url,
|
|
97
|
+
completedCount: cp.completedTools.length,
|
|
98
|
+
});
|
|
99
|
+
trackEvent(AnalyticsEvents.IMPROVISE_AUTO_RETRY, {
|
|
100
|
+
retry_number: state.retryNumber,
|
|
101
|
+
hung_tool: cp.hungTool.toolName,
|
|
102
|
+
hung_url: cp.hungTool.url?.slice(0, 200),
|
|
103
|
+
completed_tools: cp.completedTools.length,
|
|
104
|
+
elapsed_ms: cp.elapsedMs,
|
|
105
|
+
resume_attempted: canResumeSession,
|
|
106
|
+
model: model || 'default',
|
|
107
|
+
effort_level: effortLevel || 'auto',
|
|
108
|
+
});
|
|
109
|
+
state.currentPrompt = canResumeSession
|
|
110
|
+
? buildResumeRetryPrompt(cp, state.timedOutTools)
|
|
111
|
+
: buildRetryPrompt(cp, promptWithAttachments, state.timedOutTools);
|
|
112
|
+
callbacks.queueOutput(`\n[[MSTRO_AUTO_RETRY]] Auto-retry ${state.retryNumber}/${maxRetries}: ${canResumeSession ? 'Resuming session' : 'Continuing'} with ${cp.completedTools.length} successful results, skipping failed ${cp.hungTool.toolName}.\n`);
|
|
113
|
+
callbacks.flushOutputQueue();
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
// ── Signal-crash retry ───────────────────────────────────────
|
|
117
|
+
/** Detect and retry after a signal crash. Returns true if loop should continue. */
|
|
118
|
+
export function shouldRetrySignalCrash(result, state, session, maxRetries, promptWithAttachments, callbacks) {
|
|
119
|
+
const isSignalCrash = !!result.signalName;
|
|
120
|
+
const exitCodeSignal = !result.completed && !result.signalName && result.error?.match(/exited with code (1[2-9]\d|[2-9]\d{2})/);
|
|
121
|
+
if ((!isSignalCrash && !exitCodeSignal) || state.retryNumber >= maxRetries) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
if (state.checkpointRef.value) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
accumulateToolResults(result, state);
|
|
128
|
+
state.retryNumber++;
|
|
129
|
+
const completedCount = state.accumulatedToolResults.length;
|
|
130
|
+
const signalInfo = result.signalName || 'unknown signal';
|
|
131
|
+
const useResume = !!result.claudeSessionId && state.retryNumber === 1;
|
|
132
|
+
state.retryLog.push({
|
|
133
|
+
retryNumber: state.retryNumber,
|
|
134
|
+
path: 'SignalCrash',
|
|
135
|
+
reason: `Process killed (${signalInfo}), ${completedCount} tools preserved, ${useResume ? 'resuming' : 'fresh start'}`,
|
|
136
|
+
timestamp: Date.now(),
|
|
137
|
+
});
|
|
138
|
+
callbacks.emit('onAutoRetry', {
|
|
139
|
+
retryNumber: state.retryNumber,
|
|
140
|
+
maxRetries,
|
|
141
|
+
toolName: `SignalCrash(${signalInfo})`,
|
|
142
|
+
completedCount,
|
|
143
|
+
});
|
|
144
|
+
trackEvent(AnalyticsEvents.IMPROVISE_AUTO_RETRY, {
|
|
145
|
+
retry_number: state.retryNumber,
|
|
146
|
+
hung_tool: `signal_crash:${signalInfo}`,
|
|
147
|
+
completed_tools: completedCount,
|
|
148
|
+
resume_attempted: useResume,
|
|
149
|
+
});
|
|
150
|
+
if (useResume) {
|
|
151
|
+
callbacks.queueOutput(`\n[[MSTRO_SIGNAL_RECOVERY]] Process killed (${signalInfo}) — resuming session with ${completedCount} preserved results (retry ${state.retryNumber}/${maxRetries}).\n`);
|
|
152
|
+
callbacks.flushOutputQueue();
|
|
153
|
+
state.contextRecoverySessionId = result.claudeSessionId;
|
|
154
|
+
session.claudeSessionId = result.claudeSessionId;
|
|
155
|
+
state.currentPrompt = buildSignalCrashRecoveryPrompt(promptWithAttachments, true);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
callbacks.queueOutput(`\n[[MSTRO_SIGNAL_RECOVERY]] Process killed (${signalInfo}) — restarting with ${completedCount} preserved results (retry ${state.retryNumber}/${maxRetries}).\n`);
|
|
159
|
+
callbacks.flushOutputQueue();
|
|
160
|
+
state.freshRecoveryMode = true;
|
|
161
|
+
const allResults = [...extractHistoricalToolResults(session.history.movements), ...state.accumulatedToolResults];
|
|
162
|
+
state.currentPrompt = buildSignalCrashRecoveryPrompt(promptWithAttachments, false, allResults);
|
|
163
|
+
}
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=retry-recovery-strategies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-recovery-strategies.js","sourceRoot":"","sources":["../../../../server/cli/retry/retry-recovery-strategies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Picks how the next retry iteration should resume execution:
|
|
3
|
+
* whether to pass `--resume`, and which Claude session ID (if any) to use.
|
|
4
|
+
*/
|
|
5
|
+
import type { RetryLoopState } from '../improvisation-types.js';
|
|
6
|
+
import type { RetrySessionState } from './retry-types.js';
|
|
7
|
+
/** Determine whether to use --resume and which session ID */
|
|
8
|
+
export declare function determineResumeStrategy(state: RetryLoopState, session: RetrySessionState): {
|
|
9
|
+
useResume: boolean;
|
|
10
|
+
resumeSessionId: string | undefined;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=retry-resume-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-resume-strategy.d.ts","sourceRoot":"","sources":["../../../../server/cli/retry/retry-resume-strategy.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,6DAA6D;AAC7D,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,iBAAiB,GACzB;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAiB7D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
|
+
/** Determine whether to use --resume and which session ID */
|
|
4
|
+
export function determineResumeStrategy(state, session) {
|
|
5
|
+
if (state.freshRecoveryMode) {
|
|
6
|
+
state.freshRecoveryMode = false;
|
|
7
|
+
return { useResume: false, resumeSessionId: undefined };
|
|
8
|
+
}
|
|
9
|
+
if (state.contextRecoverySessionId) {
|
|
10
|
+
const id = state.contextRecoverySessionId;
|
|
11
|
+
state.contextRecoverySessionId = undefined;
|
|
12
|
+
return { useResume: true, resumeSessionId: id };
|
|
13
|
+
}
|
|
14
|
+
if (state.retryNumber === 0) {
|
|
15
|
+
return { useResume: !session.isFirstPrompt, resumeSessionId: session.claudeSessionId };
|
|
16
|
+
}
|
|
17
|
+
if (state.lastWatchdogCheckpoint?.inProgressTools.length === 0 && state.lastWatchdogCheckpoint.claudeSessionId) {
|
|
18
|
+
return { useResume: true, resumeSessionId: state.lastWatchdogCheckpoint.claudeSessionId };
|
|
19
|
+
}
|
|
20
|
+
return { useResume: false, resumeSessionId: undefined };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=retry-resume-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-resume-strategy.js","sourceRoot":"","sources":["../../../../server/cli/retry/retry-resume-strategy.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE;AAUhE,6DAA6D;AAC7D,MAAM,UAAU,uBAAuB,CACrC,KAAqB,EACrB,OAA0B;IAE1B,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC5B,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAChC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;IAC1D,CAAC;IACD,IAAI,KAAK,CAAC,wBAAwB,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,KAAK,CAAC,wBAAwB,CAAC;QAC1C,KAAK,CAAC,wBAAwB,GAAG,SAAS,CAAC;QAC3C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;IACzF,CAAC;IACD,IAAI,KAAK,CAAC,sBAAsB,EAAE,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,eAAe,EAAE,CAAC;QAC/G,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,sBAAsB,CAAC,eAAe,EAAE,CAAC;IAC5F,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory for the HeadlessRunner used in a single retry iteration.
|
|
3
|
+
* Wires session options into HeadlessRunner callbacks that respect the
|
|
4
|
+
* shared cancel flag and forward streaming events via `callbacks`.
|
|
5
|
+
*/
|
|
6
|
+
import { HeadlessRunner } from '../headless/index.js';
|
|
7
|
+
import type { FileAttachment, RetryLoopState } from '../improvisation-types.js';
|
|
8
|
+
import type { RetryCallbacks, RetrySessionState } from './retry-types.js';
|
|
9
|
+
/** Create HeadlessRunner for one retry iteration */
|
|
10
|
+
export declare function createExecutionRunner(state: RetryLoopState, session: RetrySessionState, callbacks: RetryCallbacks, sequenceNumber: number, useResume: boolean, resumeSessionId: string | undefined, imageAttachments: FileAttachment[] | undefined, workingDirOverride?: string): HeadlessRunner;
|
|
11
|
+
//# sourceMappingURL=retry-runner-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-runner-factory.d.ts","sourceRoot":"","sources":["../../../../server/cli/retry/retry-runner-factory.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhF,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1E,oDAAoD;AACpD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,cAAc,EACzB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,OAAO,EAClB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,gBAAgB,EAAE,cAAc,EAAE,GAAG,SAAS,EAC9C,kBAAkB,CAAC,EAAE,MAAM,GAC1B,cAAc,CA4ChB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
|
+
/**
|
|
4
|
+
* Factory for the HeadlessRunner used in a single retry iteration.
|
|
5
|
+
* Wires session options into HeadlessRunner callbacks that respect the
|
|
6
|
+
* shared cancel flag and forward streaming events via `callbacks`.
|
|
7
|
+
*/
|
|
8
|
+
import { HeadlessRunner } from '../headless/index.js';
|
|
9
|
+
import { buildHistoricalContext } from '../prompt-builders.js';
|
|
10
|
+
/** Create HeadlessRunner for one retry iteration */
|
|
11
|
+
export function createExecutionRunner(state, session, callbacks, sequenceNumber, useResume, resumeSessionId, imageAttachments, workingDirOverride) {
|
|
12
|
+
return new HeadlessRunner({
|
|
13
|
+
workingDir: workingDirOverride || session.options.workingDir,
|
|
14
|
+
tokenBudgetThreshold: session.options.tokenBudgetThreshold,
|
|
15
|
+
maxSessions: session.options.maxSessions,
|
|
16
|
+
verbose: session.options.verbose,
|
|
17
|
+
noColor: session.options.noColor,
|
|
18
|
+
model: session.options.model,
|
|
19
|
+
effortLevel: session.options.effortLevel,
|
|
20
|
+
improvisationMode: true,
|
|
21
|
+
movementNumber: sequenceNumber,
|
|
22
|
+
continueSession: useResume,
|
|
23
|
+
claudeSessionId: resumeSessionId,
|
|
24
|
+
outputCallback: (text) => {
|
|
25
|
+
if (callbacks.isCancelled())
|
|
26
|
+
return;
|
|
27
|
+
callbacks.addEventLog({ type: 'output', data: { text, timestamp: Date.now() }, timestamp: Date.now() });
|
|
28
|
+
callbacks.queueOutput(text);
|
|
29
|
+
callbacks.flushOutputQueue();
|
|
30
|
+
},
|
|
31
|
+
thinkingCallback: (text) => {
|
|
32
|
+
if (callbacks.isCancelled())
|
|
33
|
+
return;
|
|
34
|
+
callbacks.addEventLog({ type: 'thinking', data: { text }, timestamp: Date.now() });
|
|
35
|
+
callbacks.emit('onThinking', text);
|
|
36
|
+
callbacks.flushOutputQueue();
|
|
37
|
+
},
|
|
38
|
+
toolUseCallback: (event) => {
|
|
39
|
+
if (callbacks.isCancelled())
|
|
40
|
+
return;
|
|
41
|
+
callbacks.addEventLog({ type: 'toolUse', data: { ...event, timestamp: Date.now() }, timestamp: Date.now() });
|
|
42
|
+
callbacks.emit('onToolUse', event);
|
|
43
|
+
callbacks.flushOutputQueue();
|
|
44
|
+
},
|
|
45
|
+
tokenUsageCallback: (usage) => {
|
|
46
|
+
if (callbacks.isCancelled())
|
|
47
|
+
return;
|
|
48
|
+
callbacks.emit('onTokenUsage', usage);
|
|
49
|
+
},
|
|
50
|
+
directPrompt: state.currentPrompt,
|
|
51
|
+
imageAttachments,
|
|
52
|
+
promptContext: (state.retryNumber === 0 && session.isResumedSession && session.isFirstPrompt)
|
|
53
|
+
? { accumulatedKnowledge: buildHistoricalContext(session.history.movements), filesModified: [] }
|
|
54
|
+
: undefined,
|
|
55
|
+
onToolTimeout: (checkpoint) => {
|
|
56
|
+
state.checkpointRef.value = checkpoint;
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=retry-runner-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-runner-factory.js","sourceRoot":"","sources":["../../../../server/cli/retry/retry-runner-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Running buffer of tool results preserved across retries so recovery
|
|
3
|
+
* prompts can re-inject completed work instead of redoing it.
|
|
4
|
+
*/
|
|
5
|
+
import type { HeadlessRunResult, RetryLoopState } from '../improvisation-types.js';
|
|
6
|
+
export declare const MAX_ACCUMULATED_RESULTS = 50;
|
|
7
|
+
/** Accumulate completed tool results from a run into the retry state */
|
|
8
|
+
export declare function accumulateToolResults(result: HeadlessRunResult, state: RetryLoopState): void;
|
|
9
|
+
//# sourceMappingURL=retry-tool-results.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-tool-results.d.ts","sourceRoot":"","sources":["../../../../server/cli/retry/retry-tool-results.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEnF,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAiB5F"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
|
+
export const MAX_ACCUMULATED_RESULTS = 50;
|
|
4
|
+
/** Accumulate completed tool results from a run into the retry state */
|
|
5
|
+
export function accumulateToolResults(result, state) {
|
|
6
|
+
if (!result.toolUseHistory)
|
|
7
|
+
return;
|
|
8
|
+
for (const t of result.toolUseHistory) {
|
|
9
|
+
if (t.result !== undefined) {
|
|
10
|
+
state.accumulatedToolResults.push({
|
|
11
|
+
toolName: t.toolName,
|
|
12
|
+
toolId: t.toolId,
|
|
13
|
+
toolInput: t.toolInput,
|
|
14
|
+
result: t.result,
|
|
15
|
+
isError: t.isError,
|
|
16
|
+
duration: t.duration,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (state.accumulatedToolResults.length > MAX_ACCUMULATED_RESULTS) {
|
|
21
|
+
state.accumulatedToolResults = state.accumulatedToolResults.slice(-MAX_ACCUMULATED_RESULTS);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=retry-tool-results.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-tool-results.js","sourceRoot":"","sources":["../../../../server/cli/retry/retry-tool-results.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE;AAShE,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C,wEAAwE;AACxE,MAAM,UAAU,qBAAqB,CAAC,MAAyB,EAAE,KAAqB;IACpF,IAAI,CAAC,MAAM,CAAC,cAAc;QAAE,OAAO;IACnC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3B,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC;gBAChC,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,sBAAsB,CAAC,MAAM,GAAG,uBAAuB,EAAE,CAAC;QAClE,KAAK,CAAC,sBAAsB,GAAG,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC;IAC9F,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types used across the retry modules. Defined separately so each
|
|
3
|
+
* strategy file can import them without creating circular dependencies.
|
|
4
|
+
*/
|
|
5
|
+
import type { HeadlessRunner } from '../headless/index.js';
|
|
6
|
+
import type { ImprovisationOptions, SessionHistory } from '../improvisation-types.js';
|
|
7
|
+
/** Callbacks the retry logic needs from the session manager */
|
|
8
|
+
export interface RetryCallbacks {
|
|
9
|
+
isCancelled: () => boolean;
|
|
10
|
+
queueOutput: (text: string) => void;
|
|
11
|
+
flushOutputQueue: () => void;
|
|
12
|
+
emit: (event: string, ...args: unknown[]) => void;
|
|
13
|
+
addEventLog: (entry: {
|
|
14
|
+
type: string;
|
|
15
|
+
data: unknown;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
}) => void;
|
|
18
|
+
setRunner: (runner: HeadlessRunner | null) => void;
|
|
19
|
+
}
|
|
20
|
+
/** Session state the retry logic reads/writes */
|
|
21
|
+
export interface RetrySessionState {
|
|
22
|
+
options: ImprovisationOptions;
|
|
23
|
+
claudeSessionId: string | undefined;
|
|
24
|
+
isFirstPrompt: boolean;
|
|
25
|
+
isResumedSession: boolean;
|
|
26
|
+
history: SessionHistory;
|
|
27
|
+
executionStartTimestamp: number | undefined;
|
|
28
|
+
}
|
|
29
|
+
export declare const MAX_RETRIES = 3;
|
|
30
|
+
//# sourceMappingURL=retry-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-types.d.ts","sourceRoot":"","sources":["../../../../server/cli/retry/retry-types.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEtF,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClD,WAAW,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACjF,SAAS,EAAE,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;CACpD;AAED,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,uBAAuB,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED,eAAO,MAAM,WAAW,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-types.js","sourceRoot":"","sources":["../../../../server/cli/retry/retry-types.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE;AA8BhE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC"}
|