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.
Files changed (214) hide show
  1. package/README.md +10 -5
  2. package/bin/mstro.js +1 -1
  3. package/dist/server/cli/headless/claude-invoker-stall.d.ts.map +1 -1
  4. package/dist/server/cli/headless/claude-invoker-stall.js +7 -2
  5. package/dist/server/cli/headless/claude-invoker-stall.js.map +1 -1
  6. package/dist/server/cli/headless/claude-invoker.js +1 -1
  7. package/dist/server/cli/headless/claude-invoker.js.map +1 -1
  8. package/dist/server/cli/headless/runner.d.ts.map +1 -1
  9. package/dist/server/cli/headless/runner.js +63 -67
  10. package/dist/server/cli/headless/runner.js.map +1 -1
  11. package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
  12. package/dist/server/cli/headless/stall-assessor.js +9 -4
  13. package/dist/server/cli/headless/stall-assessor.js.map +1 -1
  14. package/dist/server/cli/improvisation-history-store.d.ts +16 -0
  15. package/dist/server/cli/improvisation-history-store.d.ts.map +1 -0
  16. package/dist/server/cli/improvisation-history-store.js +52 -0
  17. package/dist/server/cli/improvisation-history-store.js.map +1 -0
  18. package/dist/server/cli/improvisation-movements.d.ts +31 -0
  19. package/dist/server/cli/improvisation-movements.d.ts.map +1 -0
  20. package/dist/server/cli/improvisation-movements.js +93 -0
  21. package/dist/server/cli/improvisation-movements.js.map +1 -0
  22. package/dist/server/cli/improvisation-output-queue.d.ts +13 -0
  23. package/dist/server/cli/improvisation-output-queue.d.ts.map +1 -0
  24. package/dist/server/cli/improvisation-output-queue.js +40 -0
  25. package/dist/server/cli/improvisation-output-queue.js.map +1 -0
  26. package/dist/server/cli/improvisation-retry.d.ts +21 -51
  27. package/dist/server/cli/improvisation-retry.d.ts.map +1 -1
  28. package/dist/server/cli/improvisation-retry.js +18 -433
  29. package/dist/server/cli/improvisation-retry.js.map +1 -1
  30. package/dist/server/cli/improvisation-session-manager.d.ts +10 -8
  31. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  32. package/dist/server/cli/improvisation-session-manager.js +53 -148
  33. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  34. package/dist/server/cli/retry/retry-best-result.d.ts +4 -0
  35. package/dist/server/cli/retry/retry-best-result.d.ts.map +1 -0
  36. package/dist/server/cli/retry/retry-best-result.js +61 -0
  37. package/dist/server/cli/retry/retry-best-result.js.map +1 -0
  38. package/dist/server/cli/retry/retry-context-loss.d.ts +6 -0
  39. package/dist/server/cli/retry/retry-context-loss.d.ts.map +1 -0
  40. package/dist/server/cli/retry/retry-context-loss.js +68 -0
  41. package/dist/server/cli/retry/retry-context-loss.js.map +1 -0
  42. package/dist/server/cli/retry/retry-premature-completion.d.ts +5 -0
  43. package/dist/server/cli/retry/retry-premature-completion.d.ts.map +1 -0
  44. package/dist/server/cli/retry/retry-premature-completion.js +81 -0
  45. package/dist/server/cli/retry/retry-premature-completion.js.map +1 -0
  46. package/dist/server/cli/retry/retry-recovery-strategies.d.ts +13 -0
  47. package/dist/server/cli/retry/retry-recovery-strategies.d.ts.map +1 -0
  48. package/dist/server/cli/retry/retry-recovery-strategies.js +166 -0
  49. package/dist/server/cli/retry/retry-recovery-strategies.js.map +1 -0
  50. package/dist/server/cli/retry/retry-resume-strategy.d.ts +12 -0
  51. package/dist/server/cli/retry/retry-resume-strategy.d.ts.map +1 -0
  52. package/dist/server/cli/retry/retry-resume-strategy.js +22 -0
  53. package/dist/server/cli/retry/retry-resume-strategy.js.map +1 -0
  54. package/dist/server/cli/retry/retry-runner-factory.d.ts +11 -0
  55. package/dist/server/cli/retry/retry-runner-factory.d.ts.map +1 -0
  56. package/dist/server/cli/retry/retry-runner-factory.js +60 -0
  57. package/dist/server/cli/retry/retry-runner-factory.js.map +1 -0
  58. package/dist/server/cli/retry/retry-tool-results.d.ts +9 -0
  59. package/dist/server/cli/retry/retry-tool-results.d.ts.map +1 -0
  60. package/dist/server/cli/retry/retry-tool-results.js +24 -0
  61. package/dist/server/cli/retry/retry-tool-results.js.map +1 -0
  62. package/dist/server/cli/retry/retry-types.d.ts +30 -0
  63. package/dist/server/cli/retry/retry-types.d.ts.map +1 -0
  64. package/dist/server/cli/retry/retry-types.js +4 -0
  65. package/dist/server/cli/retry/retry-types.js.map +1 -0
  66. package/dist/server/index.js +21 -109
  67. package/dist/server/index.js.map +1 -1
  68. package/dist/server/server-setup.d.ts +16 -1
  69. package/dist/server/server-setup.d.ts.map +1 -1
  70. package/dist/server/server-setup.js +107 -0
  71. package/dist/server/server-setup.js.map +1 -1
  72. package/dist/server/services/plan/board-config.d.ts +21 -0
  73. package/dist/server/services/plan/board-config.d.ts.map +1 -0
  74. package/dist/server/services/plan/board-config.js +112 -0
  75. package/dist/server/services/plan/board-config.js.map +1 -0
  76. package/dist/server/services/plan/composer.d.ts +1 -1
  77. package/dist/server/services/plan/composer.d.ts.map +1 -1
  78. package/dist/server/services/plan/composer.js +7 -5
  79. package/dist/server/services/plan/composer.js.map +1 -1
  80. package/dist/server/services/plan/executor.d.ts +48 -48
  81. package/dist/server/services/plan/executor.d.ts.map +1 -1
  82. package/dist/server/services/plan/executor.js +157 -455
  83. package/dist/server/services/plan/executor.js.map +1 -1
  84. package/dist/server/services/plan/issue-loader.d.ts +16 -0
  85. package/dist/server/services/plan/issue-loader.d.ts.map +1 -0
  86. package/dist/server/services/plan/issue-loader.js +46 -0
  87. package/dist/server/services/plan/issue-loader.js.map +1 -0
  88. package/dist/server/services/plan/issue-writer.d.ts +34 -0
  89. package/dist/server/services/plan/issue-writer.d.ts.map +1 -0
  90. package/dist/server/services/plan/issue-writer.js +110 -0
  91. package/dist/server/services/plan/issue-writer.js.map +1 -0
  92. package/dist/server/services/plan/output-manager.d.ts.map +1 -1
  93. package/dist/server/services/plan/output-manager.js +2 -1
  94. package/dist/server/services/plan/output-manager.js.map +1 -1
  95. package/dist/server/services/plan/progress-log.d.ts +11 -0
  96. package/dist/server/services/plan/progress-log.d.ts.map +1 -0
  97. package/dist/server/services/plan/progress-log.js +81 -0
  98. package/dist/server/services/plan/progress-log.js.map +1 -0
  99. package/dist/server/services/plan/prompt-builder.d.ts.map +1 -1
  100. package/dist/server/services/plan/prompt-builder.js +48 -31
  101. package/dist/server/services/plan/prompt-builder.js.map +1 -1
  102. package/dist/server/services/plan/readiness-planner.d.ts +15 -0
  103. package/dist/server/services/plan/readiness-planner.d.ts.map +1 -0
  104. package/dist/server/services/plan/readiness-planner.js +41 -0
  105. package/dist/server/services/plan/readiness-planner.js.map +1 -0
  106. package/dist/server/services/plan/review-gate.d.ts +31 -0
  107. package/dist/server/services/plan/review-gate.d.ts.map +1 -1
  108. package/dist/server/services/plan/review-gate.js +52 -2
  109. package/dist/server/services/plan/review-gate.js.map +1 -1
  110. package/dist/server/services/platform.d.ts +56 -0
  111. package/dist/server/services/platform.d.ts.map +1 -1
  112. package/dist/server/services/platform.js +154 -52
  113. package/dist/server/services/platform.js.map +1 -1
  114. package/dist/server/services/websocket/file-download-handler.d.ts +17 -0
  115. package/dist/server/services/websocket/file-download-handler.d.ts.map +1 -0
  116. package/dist/server/services/websocket/file-download-handler.js +165 -0
  117. package/dist/server/services/websocket/file-download-handler.js.map +1 -0
  118. package/dist/server/services/websocket/git-worktree-handlers.d.ts.map +1 -1
  119. package/dist/server/services/websocket/git-worktree-handlers.js +28 -2
  120. package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -1
  121. package/dist/server/services/websocket/handler-context.d.ts +15 -0
  122. package/dist/server/services/websocket/handler-context.d.ts.map +1 -1
  123. package/dist/server/services/websocket/handler.d.ts +7 -0
  124. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  125. package/dist/server/services/websocket/handler.js +73 -11
  126. package/dist/server/services/websocket/handler.js.map +1 -1
  127. package/dist/server/services/websocket/msg-id-tracker.d.ts +21 -0
  128. package/dist/server/services/websocket/msg-id-tracker.d.ts.map +1 -0
  129. package/dist/server/services/websocket/msg-id-tracker.js +77 -0
  130. package/dist/server/services/websocket/msg-id-tracker.js.map +1 -0
  131. package/dist/server/services/websocket/quality-handlers.js +15 -3
  132. package/dist/server/services/websocket/quality-handlers.js.map +1 -1
  133. package/dist/server/services/websocket/quality-review-agent.js +2 -2
  134. package/dist/server/services/websocket/session-handlers.d.ts +48 -2
  135. package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
  136. package/dist/server/services/websocket/session-handlers.js +204 -65
  137. package/dist/server/services/websocket/session-handlers.js.map +1 -1
  138. package/dist/server/services/websocket/session-initialization.d.ts +2 -2
  139. package/dist/server/services/websocket/session-initialization.d.ts.map +1 -1
  140. package/dist/server/services/websocket/session-initialization.js +75 -17
  141. package/dist/server/services/websocket/session-initialization.js.map +1 -1
  142. package/dist/server/services/websocket/session-registry.d.ts +29 -1
  143. package/dist/server/services/websocket/session-registry.d.ts.map +1 -1
  144. package/dist/server/services/websocket/session-registry.js +53 -4
  145. package/dist/server/services/websocket/session-registry.js.map +1 -1
  146. package/dist/server/services/websocket/tab-broadcast.d.ts +24 -0
  147. package/dist/server/services/websocket/tab-broadcast.d.ts.map +1 -0
  148. package/dist/server/services/websocket/tab-broadcast.js +13 -0
  149. package/dist/server/services/websocket/tab-broadcast.js.map +1 -0
  150. package/dist/server/services/websocket/tab-event-buffer.d.ts +103 -0
  151. package/dist/server/services/websocket/tab-event-buffer.d.ts.map +1 -0
  152. package/dist/server/services/websocket/tab-event-buffer.js +107 -0
  153. package/dist/server/services/websocket/tab-event-buffer.js.map +1 -0
  154. package/dist/server/services/websocket/tab-event-replay.d.ts +20 -0
  155. package/dist/server/services/websocket/tab-event-replay.d.ts.map +1 -0
  156. package/dist/server/services/websocket/tab-event-replay.js +21 -0
  157. package/dist/server/services/websocket/tab-event-replay.js.map +1 -0
  158. package/dist/server/services/websocket/tab-handlers.d.ts +0 -1
  159. package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -1
  160. package/dist/server/services/websocket/tab-handlers.js +2 -9
  161. package/dist/server/services/websocket/tab-handlers.js.map +1 -1
  162. package/dist/server/services/websocket/types.d.ts +15 -6
  163. package/dist/server/services/websocket/types.d.ts.map +1 -1
  164. package/dist/server/services/websocket/types.js +6 -4
  165. package/dist/server/services/websocket/types.js.map +1 -1
  166. package/package.json +1 -1
  167. package/server/README.md +1 -1
  168. package/server/cli/headless/claude-invoker-stall.ts +7 -2
  169. package/server/cli/headless/claude-invoker.ts +1 -1
  170. package/server/cli/headless/runner.ts +67 -72
  171. package/server/cli/headless/stall-assessor.ts +9 -4
  172. package/server/cli/headless/types.ts +1 -1
  173. package/server/cli/improvisation-history-store.ts +62 -0
  174. package/server/cli/improvisation-movements.ts +120 -0
  175. package/server/cli/improvisation-output-queue.ts +42 -0
  176. package/server/cli/improvisation-retry.ts +25 -600
  177. package/server/cli/improvisation-session-manager.ts +74 -160
  178. package/server/cli/retry/retry-best-result.ts +70 -0
  179. package/server/cli/retry/retry-context-loss.ts +87 -0
  180. package/server/cli/retry/retry-premature-completion.ts +113 -0
  181. package/server/cli/retry/retry-recovery-strategies.ts +247 -0
  182. package/server/cli/retry/retry-resume-strategy.ts +33 -0
  183. package/server/cli/retry/retry-runner-factory.ts +70 -0
  184. package/server/cli/retry/retry-tool-results.ts +31 -0
  185. package/server/cli/retry/retry-types.ts +32 -0
  186. package/server/index.ts +37 -123
  187. package/server/server-setup.ts +126 -1
  188. package/server/services/plan/agents/assess-stall.md +11 -4
  189. package/server/services/plan/board-config.ts +122 -0
  190. package/server/services/plan/composer.ts +7 -5
  191. package/server/services/plan/executor.ts +214 -467
  192. package/server/services/plan/issue-loader.ts +64 -0
  193. package/server/services/plan/issue-writer.ts +137 -0
  194. package/server/services/plan/output-manager.ts +2 -1
  195. package/server/services/plan/progress-log.ts +92 -0
  196. package/server/services/plan/prompt-builder.ts +73 -35
  197. package/server/services/plan/readiness-planner.ts +50 -0
  198. package/server/services/plan/review-gate.ts +102 -2
  199. package/server/services/platform.ts +163 -58
  200. package/server/services/websocket/file-download-handler.ts +191 -0
  201. package/server/services/websocket/git-worktree-handlers.ts +29 -2
  202. package/server/services/websocket/handler-context.ts +15 -0
  203. package/server/services/websocket/handler.ts +76 -12
  204. package/server/services/websocket/msg-id-tracker.ts +84 -0
  205. package/server/services/websocket/quality-handlers.ts +16 -3
  206. package/server/services/websocket/quality-review-agent.ts +2 -2
  207. package/server/services/websocket/session-handlers.ts +213 -68
  208. package/server/services/websocket/session-initialization.ts +83 -19
  209. package/server/services/websocket/session-registry.ts +61 -4
  210. package/server/services/websocket/tab-broadcast.ts +38 -0
  211. package/server/services/websocket/tab-event-buffer.ts +159 -0
  212. package/server/services/websocket/tab-event-replay.ts +42 -0
  213. package/server/services/websocket/tab-handlers.ts +2 -9
  214. 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,4 @@
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_RETRIES = 3;
4
+ //# sourceMappingURL=retry-types.js.map
@@ -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"}