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
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../../../server/services/plan/prompt-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../../../server/services/plan/prompt-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Pure helpers for wave readiness: human-readable completion reasons
3
+ * and detection of "dead" issues stuck in non-terminal states.
4
+ */
5
+ import type { Issue } from './types.js';
6
+ /** Build the user-facing completion message shown when no issues remain. */
7
+ export declare function buildCompletionReason(issues: Issue[], epicScope: string | null): string;
8
+ /**
9
+ * Detect issues stuck in non-terminal states with no path to completion.
10
+ * Returns a human-readable reason, or null when the board is healthy.
11
+ */
12
+ export declare function detectDeadState(issues: Issue[]): string | null;
13
+ /** True iff any non-epic issue is stuck in a non-terminal, non-todo state. */
14
+ export declare function hasBlockedIssues(issues: Issue[]): boolean;
15
+ //# sourceMappingURL=readiness-planner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness-planner.d.ts","sourceRoot":"","sources":["../../../../server/services/plan/readiness-planner.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,4EAA4E;AAC5E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAOvF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,IAAI,CAkB9D;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAEzD"}
@@ -0,0 +1,41 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ const TERMINAL_STATUSES = new Set(['done', 'cancelled']);
4
+ /** Build the user-facing completion message shown when no issues remain. */
5
+ export function buildCompletionReason(issues, epicScope) {
6
+ const nonEpic = issues.filter(i => i.type !== 'epic');
7
+ const done = nonEpic.filter(i => TERMINAL_STATUSES.has(i.status)).length;
8
+ const blocked = nonEpic.filter(i => i.status === 'todo').length;
9
+ if (done === nonEpic.length)
10
+ return epicScope ? 'All epic issues are done' : 'All issues are done';
11
+ if (blocked > 0)
12
+ return `${done}/${nonEpic.length} issues done, ${blocked} blocked by incomplete dependencies`;
13
+ return epicScope ? 'All epic issues are done or blocked' : 'All work is done or blocked';
14
+ }
15
+ /**
16
+ * Detect issues stuck in non-terminal states with no path to completion.
17
+ * Returns a human-readable reason, or null when the board is healthy.
18
+ */
19
+ export function detectDeadState(issues) {
20
+ const nonEpic = issues.filter(i => i.type !== 'epic');
21
+ const stuck = nonEpic.filter(i => !TERMINAL_STATUSES.has(i.status) && i.status !== 'todo');
22
+ if (stuck.length === 0)
23
+ return null;
24
+ const stuckIds = stuck.map(i => `${i.id} (${i.status})`).join(', ');
25
+ const issueByPath = new Map(issues.map(i => [i.path, i]));
26
+ const blockedByStuck = nonEpic.filter(i => {
27
+ if (i.status !== 'todo')
28
+ return false;
29
+ return i.blockedBy.some(bp => {
30
+ const blocker = issueByPath.get(bp);
31
+ return blocker && !TERMINAL_STATUSES.has(blocker.status);
32
+ });
33
+ });
34
+ const blockedIds = blockedByStuck.map(i => i.id).join(', ');
35
+ return `Board stuck: ${stuckIds} cannot progress${blockedIds ? `. Blocking: ${blockedIds}` : ''}`;
36
+ }
37
+ /** True iff any non-epic issue is stuck in a non-terminal, non-todo state. */
38
+ export function hasBlockedIssues(issues) {
39
+ return issues.some(i => i.type !== 'epic' && !TERMINAL_STATUSES.has(i.status) && i.status !== 'todo');
40
+ }
41
+ //# sourceMappingURL=readiness-planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness-planner.js","sourceRoot":"","sources":["../../../../server/services/plan/readiness-planner.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type WarnFn } from './issue-writer.js';
1
2
  import type { Issue, ReviewResult } from './types.js';
2
3
  /** Max review attempts per issue per sprint before giving up */
3
4
  export declare const MAX_REVIEW_ATTEMPTS = 3;
@@ -31,4 +32,34 @@ export declare function appendReviewFeedback(pmDir: string, issue: Issue, result
31
32
  export declare function parseReviewOutput(issueId: string, issueType: ReviewResult['issueType'], output: string): ReviewResult;
32
33
  /** Create a passing review result for infrastructure failures. */
33
34
  export declare function autoPassResult(issueId: string, issueType: ReviewResult['issueType'], reason: string): ReviewResult;
35
+ /** Status messages emitted during the review pipeline. */
36
+ export type ReviewProgressStatus = 'reviewing' | 'passed' | 'failed' | 'max_attempts';
37
+ /** Callbacks for the executor to observe review pipeline events. */
38
+ export interface ReviewPipelineCallbacks {
39
+ /** Update an issue's front-matter status on disk. */
40
+ setStatus: (issuePath: string, status: string) => Promise<void>;
41
+ onOutput: (issueId: string, text: string) => void;
42
+ onReviewProgress: (issueId: string, status: ReviewProgressStatus) => void;
43
+ onIssueAbandoned: (issueId: string, reason: string, attempts: number) => void;
44
+ onIssueCompleted: (issue: Issue) => void;
45
+ onIssueError: (issueId: string, error: string) => void;
46
+ warn: WarnFn;
47
+ }
48
+ /** Configuration for running the full review pipeline for a single issue. */
49
+ export interface ReviewPipelineOptions {
50
+ issue: Issue;
51
+ pmDir: string;
52
+ workingDir: string;
53
+ executionDir: string | null;
54
+ boardDir: string | null;
55
+ boardId: string | null;
56
+ extraEnv?: Record<string, string>;
57
+ }
58
+ /**
59
+ * Full review pipeline for a completed issue: attempt-count guard, status
60
+ * transitions, AI review, persistence, and event emission through the
61
+ * caller's callbacks. Returns `true` when the review passes and the issue is
62
+ * marked `done`, `false` otherwise (reverted, cancelled, or errored).
63
+ */
64
+ export declare function runReviewPipeline(options: ReviewPipelineOptions, callbacks: ReviewPipelineCallbacks): Promise<boolean>;
34
65
  //# sourceMappingURL=review-gate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"review-gate.d.ts","sourceRoot":"","sources":["../../../../server/services/plan/review-gate.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,KAAK,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnE,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAOrC,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,kGAAkG;IAClG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yFAAyF;IACzF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAgCpF;AAED,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAS5F;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAW9G;AAED,kEAAkE;AAClE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAe5F;AA0BD,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAqBrH;AAED,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CASlH"}
1
+ {"version":3,"file":"review-gate.d.ts","sourceRoot":"","sources":["../../../../server/services/plan/review-gate.ts"],"names":[],"mappings":"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"}
@@ -11,13 +11,16 @@ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from
11
11
  import { join } from 'node:path';
12
12
  import { ResilientRunner } from '../../cli/headless/resilient-runner.js';
13
13
  import { loadAgentPrompt } from './agent-loader.js';
14
+ import { getBoardReviewCriteria, resolveActiveBoardId } from './board-config.js';
14
15
  import { resolveIsCodeTask } from './issue-classification.js';
16
+ import { appendCancellationNote } from './issue-writer.js';
17
+ import { resolveOutputPath } from './output-manager.js';
15
18
  /** Max review attempts per issue per sprint before giving up */
16
19
  export const MAX_REVIEW_ATTEMPTS = 3;
17
- /** Review runner stall timeouts (ms) */
20
+ /** Review runner stall timeouts (ms) — hard cap is a backstop that only fires after stall signals flag the run */
18
21
  const REVIEW_STALL_WARNING_MS = 300_000; // 5 min
19
22
  const REVIEW_STALL_KILL_MS = 600_000; // 10 min
20
- const REVIEW_STALL_HARD_CAP_MS = 900_000; // 15 min
23
+ const REVIEW_STALL_HARD_CAP_MS = 2_700_000; // 45 min backstop
21
24
  /**
22
25
  * Run an AI review for a completed issue.
23
26
  * Returns auto-pass on infrastructure failures to avoid blocking execution.
@@ -213,4 +216,51 @@ function buildReviewPrompt(issue, pmDir, outputPath, isCodeTask, reviewCriteria,
213
216
  // Should not reach here if Skills are installed, but provide a minimal fallback
214
217
  return `You are a reviewer. Review the work done for issue ${issue.id}: ${issue.title}.\n\n## Acceptance Criteria\n${criteriaStr}\n\nOutput EXACTLY one JSON object on its own line (no markdown fencing):\n{"passed": true, "checks": [{"name": "criteria_met", "passed": true, "details": "..."}]}`;
215
218
  }
219
+ /**
220
+ * Full review pipeline for a completed issue: attempt-count guard, status
221
+ * transitions, AI review, persistence, and event emission through the
222
+ * caller's callbacks. Returns `true` when the review passes and the issue is
223
+ * marked `done`, `false` otherwise (reverted, cancelled, or errored).
224
+ */
225
+ export async function runReviewPipeline(options, callbacks) {
226
+ const { issue, pmDir, workingDir, executionDir, boardDir, boardId, extraEnv } = options;
227
+ const reviewDir = boardDir ?? pmDir;
228
+ const attempts = getReviewAttemptCount(reviewDir, issue);
229
+ if (attempts >= MAX_REVIEW_ATTEMPTS) {
230
+ await callbacks.setStatus(issue.path, 'cancelled');
231
+ await appendCancellationNote(pmDir, issue, `Cancelled after ${MAX_REVIEW_ATTEMPTS} failed reviews — issue may need restructuring`, callbacks.warn);
232
+ callbacks.onReviewProgress(issue.id, 'max_attempts');
233
+ callbacks.onIssueAbandoned(issue.id, `Review failed ${MAX_REVIEW_ATTEMPTS} times — cancelled to unblock dependents`, attempts);
234
+ callbacks.onOutput(issue.id, 'Review: max attempts reached, cancelling issue to unblock dependents');
235
+ return false;
236
+ }
237
+ await callbacks.setStatus(issue.path, 'in_review');
238
+ callbacks.onReviewProgress(issue.id, 'reviewing');
239
+ const outputPath = resolveOutputPath(issue, workingDir, boardDir);
240
+ const effectiveBoardId = boardId ?? resolveActiveBoardId(pmDir);
241
+ const reviewCriteria = await getBoardReviewCriteria(pmDir, effectiveBoardId, callbacks.warn);
242
+ const result = await reviewIssue({
243
+ workingDir: executionDir || workingDir,
244
+ issue,
245
+ pmDir,
246
+ outputPath,
247
+ onOutput: (text) => callbacks.onOutput(issue.id, text),
248
+ logDir: boardDir ? join(boardDir, 'logs') : undefined,
249
+ reviewCriteria,
250
+ boardDir,
251
+ extraEnv,
252
+ });
253
+ persistReviewResult(reviewDir, issue, result);
254
+ if (result.passed) {
255
+ await callbacks.setStatus(issue.path, 'done');
256
+ callbacks.onReviewProgress(issue.id, 'passed');
257
+ callbacks.onIssueCompleted(issue);
258
+ return true;
259
+ }
260
+ await callbacks.setStatus(issue.path, 'todo');
261
+ appendReviewFeedback(pmDir, issue, result);
262
+ callbacks.onReviewProgress(issue.id, 'failed');
263
+ callbacks.onIssueError(issue.id, `Review failed: ${result.checks.filter(c => !c.passed).map(c => c.name).join(', ')}`);
264
+ return false;
265
+ }
216
266
  //# sourceMappingURL=review-gate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"review-gate.js","sourceRoot":"","sources":["../../../../server/services/plan/review-gate.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE;AAEhE;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,gEAAgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,wCAAwC;AACxC,MAAM,uBAAuB,GAAG,OAAO,CAAC,CAAG,QAAQ;AACnD,MAAM,oBAAoB,GAAG,OAAO,CAAC,CAAM,SAAS;AACpD,MAAM,wBAAwB,GAAG,OAAO,CAAC,CAAE,SAAS;AAkBpD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACrG,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,SAAS,GAA8B,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IAE9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAE7G,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,UAAU;YACV,MAAM;YACN,MAAM,EAAE,UAAU;YAClB,cAAc,EAAE,uBAAuB;YACvC,WAAW,EAAE,oBAAoB;YACjC,cAAc,EAAE,wBAAwB;YACxC,OAAO,EAAE,IAAI;YACb,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YACpF,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,WAAW;YACrB,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QAElC,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACjD,OAAO,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,gCAAgC,CAAC,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,qBAAqB,CAAC,iBAAgC,EAAE,KAAY;IAClF,IAAI,CAAC,iBAAiB;QAAE,OAAO,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACnG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB,CAAC,iBAAgC,EAAE,KAAY,EAAE,MAAoB;IACtG,IAAI,CAAC,iBAAiB;QAAE,OAAO;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC;QACH,aAAa,CACX,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAClD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAC/B,OAAO,CACR,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;AAC7B,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,KAAY,EAAE,MAAoB;IACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,IAAI,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,MAAM,KAAK,GAAG,oBAAoB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,MAAM,qBAAqB,QAAQ,EAAE,CAAC;QAEjI,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACpC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,gBAAgB,KAAK,EAAE,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,oBAAoB,KAAK,EAAE,CAAC;QACzC,CAAC;QACD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;AAC7B,CAAC;AAED,oGAAoG;AACpG,SAAS,cAAc,CAAC,IAAY,EAAE,IAAY;IAChD,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAAC,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QACxC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED,8EAA8E;AAC9E,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC9D,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACnB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;QAC7B,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,SAAoC,EAAE,MAAc;IACrG,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC5E,OAAO;oBACL,OAAO;oBACP,SAAS;oBACT,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;oBACvB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC;wBACxF,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC;wBACjC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM;wBAClB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;qBACV,CAAA,CAAC,CAAC,CAAC,CAAC,EAAE;oBAC9B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACrC,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,+BAA+B,CAAC,CAAC;AAC7E,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,SAAoC,EAAE,MAAc;IAClG,OAAO;QACL,OAAO;QACP,SAAS;QACT,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC7F,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC;AACJ,CAAC;AAED,+DAA+D;AAE/D,SAAS,iBAAiB,CACxB,KAAY,EACZ,KAAa,EACb,UAAkB,EAClB,UAAmB,EACnB,cAAuB,EACvB,QAAwB,EACxB,UAAmB;IAEnB,MAAM,QAAQ,GAAG,KAAK,CAAC,kBAAkB;SACtC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;SAClD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,WAAW,GAAG,QAAQ,IAAI,+BAA+B,CAAC;IAChE,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAE9C,oEAAoE;IACpE,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,cAAc,GAAG,UAAU;YAC/B,CAAC,CAAC,wBAAwB,aAAa,EAAE;YACzC,CAAC,CAAC,qBAAqB,UAAU,sBAAsB,aAAa,EAAE,CAAC;QACzE,MAAM,eAAe,GAAG,UAAU;YAChC,CAAC,CAAC,sCAAsC;YACxC,CAAC,CAAC,wDAAwD,CAAC;QAE7D,MAAM,MAAM,GAAG,eAAe,CAAC,eAAe,EAAE;YAC9C,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClB,WAAW,EAAE,KAAK,CAAC,KAAK;YACxB,eAAe,EAAE,cAAc;YAC/B,mBAAmB,EAAE,WAAW;YAChC,eAAe,EAAE,cAAc;YAC/B,gBAAgB,EAAE,eAAe;SAClC,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACzB,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC5B,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,EAAE;YAC5C,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClB,WAAW,EAAE,KAAK,CAAC,KAAK;YACxB,cAAc,EAAE,aAAa;YAC7B,mBAAmB,EAAE,WAAW;YAChC,WAAW,EAAE,UAAU;SACxB,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACzB,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC5B,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,gBAAgB,EAAE;QAC/C,QAAQ,EAAE,KAAK,CAAC,EAAE;QAClB,WAAW,EAAE,KAAK,CAAC,KAAK;QACxB,WAAW,EAAE,UAAU;QACvB,eAAe,EAAE,aAAa;QAC9B,mBAAmB,EAAE,WAAW;KACjC,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,gFAAgF;IAChF,OAAO,sDAAsD,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,gCAAgC,WAAW,qKAAqK,CAAC;AACxS,CAAC"}
1
+ {"version":3,"file":"review-gate.js","sourceRoot":"","sources":["../../../../server/services/plan/review-gate.ts"],"names":[],"mappings":"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"}
@@ -28,13 +28,69 @@ export declare class PlatformConnection {
28
28
  private everConnected;
29
29
  private readonly startedAt;
30
30
  constructor(workingDirectory: string, callbacks?: ConnectionCallbacks, platformUrl?: string);
31
+ /**
32
+ * Refresh the device token if it's older than the refresh interval.
33
+ * Returns `true` if the token is (still) valid after this call, `false`
34
+ * if refresh was attempted and rejected with an auth error — in which
35
+ * case the caller should surface an auth-expired signal to the web
36
+ * rather than silently reusing a dead token.
37
+ */
31
38
  private maybeRefreshToken;
39
+ /**
40
+ * Verify the current token against the platform. A rejection (401/403)
41
+ * means the token is permanently invalid (revoked, signing-key rotation,
42
+ * account deleted); the caller should stop looping reconnects and tell
43
+ * the user to run `mstro login --force`.
44
+ *
45
+ * Returns `true` when the token is valid or the verification endpoint
46
+ * is unreachable (we prefer false negatives to false positives — a
47
+ * network blip shouldn't force a re-login).
48
+ */
49
+ private verifyToken;
50
+ /**
51
+ * Surface an auth-expired condition to any paired web clients.
52
+ *
53
+ * Two cooperating paths deliver this signal — either alone is enough,
54
+ * both together cover every timing edge:
55
+ *
56
+ * 1. **CLI-initiated (this method):** we detected a 401 from the
57
+ * `/refresh` or `/verify` endpoint *while the relay socket is
58
+ * still open*. `this.send` pushes the message upstream so the
59
+ * server relays it to paired webs before we intentionally close.
60
+ * A no-op if the socket is already closed.
61
+ *
62
+ * 2. **Server-initiated:** when the platform closes a CLI socket
63
+ * with 4001 or 4008, `handleAuthClose` in `clientHandlers.ts`
64
+ * broadcasts the same `clientAuthExpired` to paired webs. This
65
+ * covers the cases where the CLI never had a chance to detect
66
+ * the rejection itself (e.g. token revoked while the socket was
67
+ * idle, server-side token rotation).
68
+ *
69
+ * IMPORTANT: never call `this.callbacks.onRelayedMessage` here —
70
+ * that callback feeds INCOMING web→CLI requests into the local handler,
71
+ * which would treat `clientAuthExpired` as an unknown inbound request.
72
+ */
73
+ private notifyAuthExpired;
32
74
  private startTokenRefreshCheck;
33
75
  private startHeartbeat;
34
76
  private heartbeatTick;
35
77
  private stopHeartbeat;
36
78
  private stopTokenRefreshCheck;
37
79
  connect(): void;
80
+ /**
81
+ * Best-effort token verification, fired in parallel with the socket
82
+ * open so a slow verify endpoint never delays reconnect.
83
+ *
84
+ * Only runs when the token is stale enough that we'd be about to
85
+ * refresh anyway — keeps the hot path free of an extra network call.
86
+ * A truly-revoked token that slips past this check still hits 4001
87
+ * on the WebSocket, which also triggers `notifyAuthExpired`.
88
+ */
89
+ private maybeVerifyTokenInParallel;
90
+ private buildConnectionUrl;
91
+ private startConnectionTimeout;
92
+ private attachSocketHandlers;
93
+ private handleSocketClose;
38
94
  private handleMessage;
39
95
  private scheduleReconnect;
40
96
  send(message: unknown): void;
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../../server/services/platform.ts"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAkBD,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC9C;AAKD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,gBAAgB,CAA6C;IACrE,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,oBAAoB,CAA8C;IAC1E,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAGhC,gBAAgB,EAAE,MAAM,EACxB,SAAS,GAAE,mBAAwB,EACnC,WAAW,CAAC,EAAE,MAAM;YAQR,iBAAiB;IA2B/B,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,qBAAqB;IAO7B,OAAO,IAAI,IAAI;IAuGf,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,iBAAiB;IAmBzB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAM5B,qBAAqB,IAAI,OAAO;IAIhC,UAAU,IAAI,IAAI;CAkBnB"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../../server/services/platform.ts"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAkBD,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC9C;AAKD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,gBAAgB,CAA6C;IACrE,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,oBAAoB,CAA8C;IAC1E,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAGhC,gBAAgB,EAAE,MAAM,EACxB,SAAS,GAAE,mBAAwB,EACnC,WAAW,CAAC,EAAE,MAAM;IAQtB;;;;;;OAMG;YACW,iBAAiB;IAmC/B;;;;;;;;;OASG;YACW,WAAW;IAqBzB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,qBAAqB;IAO7B,OAAO,IAAI,IAAI;IA0Bf;;;;;;;;OAQG;IACH,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,oBAAoB;IAiC5B,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,iBAAiB;IAmBzB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAM5B,qBAAqB,IAAI,OAAO;IAIhC,UAAU,IAAI,IAAI;CAkBnB"}
@@ -65,10 +65,19 @@ export class PlatformConnection {
65
65
  this.callbacks = callbacks;
66
66
  this.startedAt = new Date().toISOString();
67
67
  }
68
+ /**
69
+ * Refresh the device token if it's older than the refresh interval.
70
+ * Returns `true` if the token is (still) valid after this call, `false`
71
+ * if refresh was attempted and rejected with an auth error — in which
72
+ * case the caller should surface an auth-expired signal to the web
73
+ * rather than silently reusing a dead token.
74
+ */
68
75
  async maybeRefreshToken() {
69
76
  const creds = getCredentials();
70
- if (!creds || !shouldRefreshToken(creds))
71
- return;
77
+ if (!creds)
78
+ return false;
79
+ if (!shouldRefreshToken(creds))
80
+ return true;
72
81
  try {
73
82
  const response = await fetch(`${this.platformUrl}/api/auth/device/refresh`, {
74
83
  method: 'POST',
@@ -83,15 +92,85 @@ export class PlatformConnection {
83
92
  token: data.accessToken,
84
93
  lastRefreshedAt: new Date().toISOString()
85
94
  });
95
+ return true;
86
96
  }
87
- else {
88
- console.warn('[Platform] Token refresh failed, will retry later');
97
+ if (response.status === 401 || response.status === 403) {
98
+ console.warn(`[Platform] Token refresh failed auth is expired (${response.status}). Run \`mstro login --force\`.`);
99
+ this.notifyAuthExpired();
100
+ return false;
89
101
  }
102
+ console.warn(`[Platform] Token refresh failed with status ${response.status}, will retry later`);
103
+ return true;
90
104
  }
91
105
  catch (err) {
92
106
  console.warn('[Platform] Token refresh error:', err);
107
+ return true;
108
+ }
109
+ }
110
+ /**
111
+ * Verify the current token against the platform. A rejection (401/403)
112
+ * means the token is permanently invalid (revoked, signing-key rotation,
113
+ * account deleted); the caller should stop looping reconnects and tell
114
+ * the user to run `mstro login --force`.
115
+ *
116
+ * Returns `true` when the token is valid or the verification endpoint
117
+ * is unreachable (we prefer false negatives to false positives — a
118
+ * network blip shouldn't force a re-login).
119
+ */
120
+ async verifyToken() {
121
+ const creds = getCredentials();
122
+ if (!creds?.token)
123
+ return false;
124
+ try {
125
+ const response = await fetch(`${this.platformUrl}/api/auth/device/verify`, {
126
+ method: 'POST',
127
+ headers: { 'Authorization': `Bearer ${creds.token}` },
128
+ });
129
+ if (response.status === 401 || response.status === 403) {
130
+ console.warn(`[Platform] Token verify rejected (${response.status}) — auth is expired.`);
131
+ return false;
132
+ }
133
+ return true;
134
+ }
135
+ catch {
136
+ // Network error: treat as "probably valid" so a flaky connection
137
+ // doesn't force users to re-login. The WebSocket open itself will
138
+ // catch a truly bad token via the 4001 path.
139
+ return true;
93
140
  }
94
141
  }
142
+ /**
143
+ * Surface an auth-expired condition to any paired web clients.
144
+ *
145
+ * Two cooperating paths deliver this signal — either alone is enough,
146
+ * both together cover every timing edge:
147
+ *
148
+ * 1. **CLI-initiated (this method):** we detected a 401 from the
149
+ * `/refresh` or `/verify` endpoint *while the relay socket is
150
+ * still open*. `this.send` pushes the message upstream so the
151
+ * server relays it to paired webs before we intentionally close.
152
+ * A no-op if the socket is already closed.
153
+ *
154
+ * 2. **Server-initiated:** when the platform closes a CLI socket
155
+ * with 4001 or 4008, `handleAuthClose` in `clientHandlers.ts`
156
+ * broadcasts the same `clientAuthExpired` to paired webs. This
157
+ * covers the cases where the CLI never had a chance to detect
158
+ * the rejection itself (e.g. token revoked while the socket was
159
+ * idle, server-side token rotation).
160
+ *
161
+ * IMPORTANT: never call `this.callbacks.onRelayedMessage` here —
162
+ * that callback feeds INCOMING web→CLI requests into the local handler,
163
+ * which would treat `clientAuthExpired` as an unknown inbound request.
164
+ */
165
+ notifyAuthExpired() {
166
+ this.send({
167
+ type: 'clientAuthExpired',
168
+ data: {
169
+ connectionId: this.connectionId,
170
+ message: 'The CLI\'s device token is invalid — run `mstro login --force` on the machine.',
171
+ },
172
+ });
173
+ }
95
174
  startTokenRefreshCheck() {
96
175
  this.tokenRefreshInterval = setInterval(() => {
97
176
  this.maybeRefreshToken();
@@ -136,34 +215,13 @@ export class PlatformConnection {
136
215
  }
137
216
  connect() {
138
217
  this.isIntentionallyClosed = false;
139
- const name = basename(this.workingDirectory);
140
- const machineHostname = hostname();
141
- const clientId = getClientId();
142
- const machineId = getMachineIdentifier();
143
- const nodeVersion = process.version;
144
- const osType = type().toLowerCase();
145
- const cpuArch = arch();
146
- const credentials = getCredentials();
147
- const authToken = credentials?.token;
218
+ const authToken = getCredentials()?.token;
148
219
  if (!authToken) {
149
220
  console.error('\n❌ Not logged in. Run `mstro login` first.\n');
150
221
  this.callbacks.onError?.('Not logged in - run `mstro login` first');
151
222
  return;
152
223
  }
153
- const params = new URLSearchParams({
154
- name,
155
- workingDirectory: this.workingDirectory,
156
- machineHostname,
157
- clientId,
158
- machineId,
159
- nodeVersion,
160
- osType,
161
- cpuArch,
162
- cliVersion: CLI_VERSION,
163
- capabilities: JSON.stringify({}),
164
- startedAt: this.startedAt,
165
- });
166
- const wsUrl = `${this.platformUrl.replace(/^http/, 'ws')}/ws/client?${params}`;
224
+ const wsUrl = this.buildConnectionUrl();
167
225
  try {
168
226
  this.ws = new WebSocketImpl(wsUrl);
169
227
  }
@@ -174,7 +232,46 @@ export class PlatformConnection {
174
232
  this.scheduleReconnect();
175
233
  return;
176
234
  }
177
- const connectionTimeout = setTimeout(() => {
235
+ const connectionTimeout = this.startConnectionTimeout();
236
+ this.attachSocketHandlers(this.ws, authToken, connectionTimeout);
237
+ this.maybeVerifyTokenInParallel();
238
+ }
239
+ /**
240
+ * Best-effort token verification, fired in parallel with the socket
241
+ * open so a slow verify endpoint never delays reconnect.
242
+ *
243
+ * Only runs when the token is stale enough that we'd be about to
244
+ * refresh anyway — keeps the hot path free of an extra network call.
245
+ * A truly-revoked token that slips past this check still hits 4001
246
+ * on the WebSocket, which also triggers `notifyAuthExpired`.
247
+ */
248
+ maybeVerifyTokenInParallel() {
249
+ const creds = getCredentials();
250
+ if (!creds || !shouldRefreshToken(creds))
251
+ return;
252
+ this.verifyToken().then((valid) => {
253
+ if (!valid)
254
+ this.notifyAuthExpired();
255
+ }).catch(() => { });
256
+ }
257
+ buildConnectionUrl() {
258
+ const params = new URLSearchParams({
259
+ name: basename(this.workingDirectory),
260
+ workingDirectory: this.workingDirectory,
261
+ machineHostname: hostname(),
262
+ clientId: getClientId(),
263
+ machineId: getMachineIdentifier(),
264
+ nodeVersion: process.version,
265
+ osType: type().toLowerCase(),
266
+ cpuArch: arch(),
267
+ cliVersion: CLI_VERSION,
268
+ capabilities: JSON.stringify({}),
269
+ startedAt: this.startedAt,
270
+ });
271
+ return `${this.platformUrl.replace(/^http/, 'ws')}/ws/client?${params}`;
272
+ }
273
+ startConnectionTimeout() {
274
+ return setTimeout(() => {
178
275
  const state = this.ws?.readyState;
179
276
  if (this.ws && (state === 0 || state === undefined)) {
180
277
  console.error('\n❌ Connection timeout. The platform may have rejected your credentials.');
@@ -183,48 +280,53 @@ export class PlatformConnection {
183
280
  this.callbacks.onError?.('Connection timeout - run `mstro login --force`');
184
281
  }
185
282
  }, 10000);
186
- this.ws.onopen = () => {
283
+ }
284
+ attachSocketHandlers(ws, authToken, connectionTimeout) {
285
+ ws.onopen = () => {
187
286
  clearTimeout(connectionTimeout);
188
- this.ws.send(JSON.stringify({ type: 'auth', token: authToken }));
287
+ ws.send(JSON.stringify({ type: 'auth', token: authToken }));
189
288
  this.maybeRefreshToken();
190
289
  this.startTokenRefreshCheck();
191
290
  this.reconnectAttempts = 0;
192
291
  trackEvent(AnalyticsEvents.PLATFORM_CONNECTED);
193
292
  };
194
- this.ws.onmessage = (event) => {
293
+ ws.onmessage = (event) => {
195
294
  try {
196
- const message = JSON.parse(event.data.toString());
197
- this.handleMessage(message);
295
+ this.handleMessage(JSON.parse(event.data.toString()));
198
296
  }
199
297
  catch (err) {
200
298
  console.error('Failed to parse platform message:', err);
201
299
  }
202
300
  };
203
- this.ws.onclose = (event) => {
301
+ ws.onclose = (event) => {
204
302
  clearTimeout(connectionTimeout);
205
- this.stopHeartbeat();
206
- this.isConnected = false;
207
- if (!this.isIntentionallyClosed) {
208
- const isAuthFailure = event.code === 4001 ||
209
- event.reason?.includes('Unauthorized') ||
210
- (event.code === 1006 && !this.everConnected);
211
- if (isAuthFailure) {
212
- console.error('\n❌ Authentication failed. Your device token may be invalid or expired.');
213
- console.error(' Run `mstro login --force` to re-authenticate.\n');
214
- this.callbacks.onError?.('Authentication failed - run `mstro login --force`');
215
- return;
216
- }
217
- console.log('Disconnected, reconnecting...');
218
- this.callbacks.onDisconnected?.();
219
- trackEvent(AnalyticsEvents.PLATFORM_DISCONNECTED);
220
- this.scheduleReconnect();
221
- }
303
+ this.handleSocketClose(event);
222
304
  };
223
- this.ws.onerror = () => {
305
+ ws.onerror = () => {
224
306
  clearTimeout(connectionTimeout);
225
307
  // onclose will be called after this
226
308
  };
227
309
  }
310
+ handleSocketClose(event) {
311
+ this.stopHeartbeat();
312
+ this.isConnected = false;
313
+ if (this.isIntentionallyClosed)
314
+ return;
315
+ const isAuthFailure = event.code === 4001 ||
316
+ event.reason?.includes('Unauthorized') ||
317
+ (event.code === 1006 && !this.everConnected);
318
+ if (isAuthFailure) {
319
+ console.error('\n❌ Authentication failed. Your device token may be invalid or expired.');
320
+ console.error(' Run `mstro login --force` to re-authenticate.\n');
321
+ this.notifyAuthExpired();
322
+ this.callbacks.onError?.('Authentication failed - run `mstro login --force`');
323
+ return;
324
+ }
325
+ console.log('Disconnected, reconnecting...');
326
+ this.callbacks.onDisconnected?.();
327
+ trackEvent(AnalyticsEvents.PLATFORM_DISCONNECTED);
328
+ this.scheduleReconnect();
329
+ }
228
330
  handleMessage(message) {
229
331
  switch (message.type) {
230
332
  case 'paired':