mstro-app 0.4.51 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -5
- package/bin/mstro.js +1 -1
- package/dist/server/cli/headless/claude-invoker-stall.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker-stall.js +7 -2
- package/dist/server/cli/headless/claude-invoker-stall.js.map +1 -1
- package/dist/server/cli/headless/claude-invoker.js +1 -1
- package/dist/server/cli/headless/claude-invoker.js.map +1 -1
- package/dist/server/cli/headless/runner.d.ts.map +1 -1
- package/dist/server/cli/headless/runner.js +63 -67
- package/dist/server/cli/headless/runner.js.map +1 -1
- package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
- package/dist/server/cli/headless/stall-assessor.js +9 -4
- package/dist/server/cli/headless/stall-assessor.js.map +1 -1
- package/dist/server/cli/improvisation-history-store.d.ts +16 -0
- package/dist/server/cli/improvisation-history-store.d.ts.map +1 -0
- package/dist/server/cli/improvisation-history-store.js +52 -0
- package/dist/server/cli/improvisation-history-store.js.map +1 -0
- package/dist/server/cli/improvisation-movements.d.ts +31 -0
- package/dist/server/cli/improvisation-movements.d.ts.map +1 -0
- package/dist/server/cli/improvisation-movements.js +93 -0
- package/dist/server/cli/improvisation-movements.js.map +1 -0
- package/dist/server/cli/improvisation-output-queue.d.ts +13 -0
- package/dist/server/cli/improvisation-output-queue.d.ts.map +1 -0
- package/dist/server/cli/improvisation-output-queue.js +40 -0
- package/dist/server/cli/improvisation-output-queue.js.map +1 -0
- package/dist/server/cli/improvisation-retry.d.ts +21 -51
- package/dist/server/cli/improvisation-retry.d.ts.map +1 -1
- package/dist/server/cli/improvisation-retry.js +18 -433
- package/dist/server/cli/improvisation-retry.js.map +1 -1
- package/dist/server/cli/improvisation-session-manager.d.ts +10 -8
- package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.js +53 -148
- package/dist/server/cli/improvisation-session-manager.js.map +1 -1
- package/dist/server/cli/retry/retry-best-result.d.ts +4 -0
- package/dist/server/cli/retry/retry-best-result.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-best-result.js +61 -0
- package/dist/server/cli/retry/retry-best-result.js.map +1 -0
- package/dist/server/cli/retry/retry-context-loss.d.ts +6 -0
- package/dist/server/cli/retry/retry-context-loss.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-context-loss.js +68 -0
- package/dist/server/cli/retry/retry-context-loss.js.map +1 -0
- package/dist/server/cli/retry/retry-premature-completion.d.ts +5 -0
- package/dist/server/cli/retry/retry-premature-completion.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-premature-completion.js +81 -0
- package/dist/server/cli/retry/retry-premature-completion.js.map +1 -0
- package/dist/server/cli/retry/retry-recovery-strategies.d.ts +13 -0
- package/dist/server/cli/retry/retry-recovery-strategies.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-recovery-strategies.js +166 -0
- package/dist/server/cli/retry/retry-recovery-strategies.js.map +1 -0
- package/dist/server/cli/retry/retry-resume-strategy.d.ts +12 -0
- package/dist/server/cli/retry/retry-resume-strategy.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-resume-strategy.js +22 -0
- package/dist/server/cli/retry/retry-resume-strategy.js.map +1 -0
- package/dist/server/cli/retry/retry-runner-factory.d.ts +11 -0
- package/dist/server/cli/retry/retry-runner-factory.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-runner-factory.js +60 -0
- package/dist/server/cli/retry/retry-runner-factory.js.map +1 -0
- package/dist/server/cli/retry/retry-tool-results.d.ts +9 -0
- package/dist/server/cli/retry/retry-tool-results.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-tool-results.js +24 -0
- package/dist/server/cli/retry/retry-tool-results.js.map +1 -0
- package/dist/server/cli/retry/retry-types.d.ts +30 -0
- package/dist/server/cli/retry/retry-types.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-types.js +4 -0
- package/dist/server/cli/retry/retry-types.js.map +1 -0
- package/dist/server/index.js +21 -109
- package/dist/server/index.js.map +1 -1
- package/dist/server/server-setup.d.ts +16 -1
- package/dist/server/server-setup.d.ts.map +1 -1
- package/dist/server/server-setup.js +107 -0
- package/dist/server/server-setup.js.map +1 -1
- package/dist/server/services/plan/board-config.d.ts +21 -0
- package/dist/server/services/plan/board-config.d.ts.map +1 -0
- package/dist/server/services/plan/board-config.js +112 -0
- package/dist/server/services/plan/board-config.js.map +1 -0
- package/dist/server/services/plan/composer.d.ts +1 -1
- package/dist/server/services/plan/composer.d.ts.map +1 -1
- package/dist/server/services/plan/composer.js +7 -5
- package/dist/server/services/plan/composer.js.map +1 -1
- package/dist/server/services/plan/executor.d.ts +48 -48
- package/dist/server/services/plan/executor.d.ts.map +1 -1
- package/dist/server/services/plan/executor.js +157 -455
- package/dist/server/services/plan/executor.js.map +1 -1
- package/dist/server/services/plan/issue-loader.d.ts +16 -0
- package/dist/server/services/plan/issue-loader.d.ts.map +1 -0
- package/dist/server/services/plan/issue-loader.js +46 -0
- package/dist/server/services/plan/issue-loader.js.map +1 -0
- package/dist/server/services/plan/issue-writer.d.ts +34 -0
- package/dist/server/services/plan/issue-writer.d.ts.map +1 -0
- package/dist/server/services/plan/issue-writer.js +110 -0
- package/dist/server/services/plan/issue-writer.js.map +1 -0
- package/dist/server/services/plan/output-manager.d.ts.map +1 -1
- package/dist/server/services/plan/output-manager.js +2 -1
- package/dist/server/services/plan/output-manager.js.map +1 -1
- package/dist/server/services/plan/progress-log.d.ts +11 -0
- package/dist/server/services/plan/progress-log.d.ts.map +1 -0
- package/dist/server/services/plan/progress-log.js +81 -0
- package/dist/server/services/plan/progress-log.js.map +1 -0
- package/dist/server/services/plan/prompt-builder.d.ts.map +1 -1
- package/dist/server/services/plan/prompt-builder.js +48 -31
- package/dist/server/services/plan/prompt-builder.js.map +1 -1
- package/dist/server/services/plan/readiness-planner.d.ts +15 -0
- package/dist/server/services/plan/readiness-planner.d.ts.map +1 -0
- package/dist/server/services/plan/readiness-planner.js +41 -0
- package/dist/server/services/plan/readiness-planner.js.map +1 -0
- package/dist/server/services/plan/review-gate.d.ts +31 -0
- package/dist/server/services/plan/review-gate.d.ts.map +1 -1
- package/dist/server/services/plan/review-gate.js +52 -2
- package/dist/server/services/plan/review-gate.js.map +1 -1
- package/dist/server/services/platform.d.ts +56 -0
- package/dist/server/services/platform.d.ts.map +1 -1
- package/dist/server/services/platform.js +154 -52
- package/dist/server/services/platform.js.map +1 -1
- package/dist/server/services/websocket/file-download-handler.d.ts +17 -0
- package/dist/server/services/websocket/file-download-handler.d.ts.map +1 -0
- package/dist/server/services/websocket/file-download-handler.js +165 -0
- package/dist/server/services/websocket/file-download-handler.js.map +1 -0
- package/dist/server/services/websocket/git-branch-handlers.d.ts +1 -1
- package/dist/server/services/websocket/git-branch-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-branch-handlers.js +21 -1
- package/dist/server/services/websocket/git-branch-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-handlers.js +1 -1
- package/dist/server/services/websocket/git-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-worktree-handlers.d.ts +2 -0
- package/dist/server/services/websocket/git-worktree-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-worktree-handlers.js +30 -4
- package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -1
- package/dist/server/services/websocket/handler-context.d.ts +15 -0
- package/dist/server/services/websocket/handler-context.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.d.ts +7 -0
- package/dist/server/services/websocket/handler.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.js +73 -11
- package/dist/server/services/websocket/handler.js.map +1 -1
- package/dist/server/services/websocket/msg-id-tracker.d.ts +21 -0
- package/dist/server/services/websocket/msg-id-tracker.d.ts.map +1 -0
- package/dist/server/services/websocket/msg-id-tracker.js +77 -0
- package/dist/server/services/websocket/msg-id-tracker.js.map +1 -0
- package/dist/server/services/websocket/quality-handlers.js +15 -3
- package/dist/server/services/websocket/quality-handlers.js.map +1 -1
- package/dist/server/services/websocket/quality-review-agent.js +2 -2
- package/dist/server/services/websocket/session-handlers.d.ts +48 -2
- package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/session-handlers.js +204 -65
- package/dist/server/services/websocket/session-handlers.js.map +1 -1
- package/dist/server/services/websocket/session-initialization.d.ts +2 -2
- package/dist/server/services/websocket/session-initialization.d.ts.map +1 -1
- package/dist/server/services/websocket/session-initialization.js +75 -17
- package/dist/server/services/websocket/session-initialization.js.map +1 -1
- package/dist/server/services/websocket/session-registry.d.ts +29 -1
- package/dist/server/services/websocket/session-registry.d.ts.map +1 -1
- package/dist/server/services/websocket/session-registry.js +53 -4
- package/dist/server/services/websocket/session-registry.js.map +1 -1
- package/dist/server/services/websocket/tab-broadcast.d.ts +24 -0
- package/dist/server/services/websocket/tab-broadcast.d.ts.map +1 -0
- package/dist/server/services/websocket/tab-broadcast.js +13 -0
- package/dist/server/services/websocket/tab-broadcast.js.map +1 -0
- package/dist/server/services/websocket/tab-event-buffer.d.ts +103 -0
- package/dist/server/services/websocket/tab-event-buffer.d.ts.map +1 -0
- package/dist/server/services/websocket/tab-event-buffer.js +107 -0
- package/dist/server/services/websocket/tab-event-buffer.js.map +1 -0
- package/dist/server/services/websocket/tab-event-replay.d.ts +20 -0
- package/dist/server/services/websocket/tab-event-replay.d.ts.map +1 -0
- package/dist/server/services/websocket/tab-event-replay.js +21 -0
- package/dist/server/services/websocket/tab-event-replay.js.map +1 -0
- package/dist/server/services/websocket/tab-handlers.d.ts +0 -1
- package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/tab-handlers.js +2 -9
- package/dist/server/services/websocket/tab-handlers.js.map +1 -1
- package/dist/server/services/websocket/types.d.ts +15 -6
- package/dist/server/services/websocket/types.d.ts.map +1 -1
- package/dist/server/services/websocket/types.js +6 -4
- package/dist/server/services/websocket/types.js.map +1 -1
- package/package.json +1 -1
- package/server/README.md +1 -1
- package/server/cli/headless/claude-invoker-stall.ts +7 -2
- package/server/cli/headless/claude-invoker.ts +1 -1
- package/server/cli/headless/runner.ts +67 -72
- package/server/cli/headless/stall-assessor.ts +9 -4
- package/server/cli/headless/types.ts +1 -1
- package/server/cli/improvisation-history-store.ts +62 -0
- package/server/cli/improvisation-movements.ts +120 -0
- package/server/cli/improvisation-output-queue.ts +42 -0
- package/server/cli/improvisation-retry.ts +25 -600
- package/server/cli/improvisation-session-manager.ts +74 -160
- package/server/cli/retry/retry-best-result.ts +70 -0
- package/server/cli/retry/retry-context-loss.ts +87 -0
- package/server/cli/retry/retry-premature-completion.ts +113 -0
- package/server/cli/retry/retry-recovery-strategies.ts +247 -0
- package/server/cli/retry/retry-resume-strategy.ts +33 -0
- package/server/cli/retry/retry-runner-factory.ts +70 -0
- package/server/cli/retry/retry-tool-results.ts +31 -0
- package/server/cli/retry/retry-types.ts +32 -0
- package/server/index.ts +37 -123
- package/server/server-setup.ts +126 -1
- package/server/services/plan/agents/assess-stall.md +11 -4
- package/server/services/plan/board-config.ts +122 -0
- package/server/services/plan/composer.ts +7 -5
- package/server/services/plan/executor.ts +214 -467
- package/server/services/plan/issue-loader.ts +64 -0
- package/server/services/plan/issue-writer.ts +137 -0
- package/server/services/plan/output-manager.ts +2 -1
- package/server/services/plan/progress-log.ts +92 -0
- package/server/services/plan/prompt-builder.ts +73 -35
- package/server/services/plan/readiness-planner.ts +50 -0
- package/server/services/plan/review-gate.ts +102 -2
- package/server/services/platform.ts +163 -58
- package/server/services/websocket/file-download-handler.ts +191 -0
- package/server/services/websocket/git-branch-handlers.ts +28 -1
- package/server/services/websocket/git-handlers.ts +1 -1
- package/server/services/websocket/git-worktree-handlers.ts +31 -4
- package/server/services/websocket/handler-context.ts +15 -0
- package/server/services/websocket/handler.ts +76 -12
- package/server/services/websocket/msg-id-tracker.ts +84 -0
- package/server/services/websocket/quality-handlers.ts +16 -3
- package/server/services/websocket/quality-review-agent.ts +2 -2
- package/server/services/websocket/session-handlers.ts +213 -68
- package/server/services/websocket/session-initialization.ts +83 -19
- package/server/services/websocket/session-registry.ts +61 -4
- package/server/services/websocket/tab-broadcast.ts +38 -0
- package/server/services/websocket/tab-event-buffer.ts +159 -0
- package/server/services/websocket/tab-event-replay.ts +42 -0
- package/server/services/websocket/tab-handlers.ts +2 -9
- package/server/services/websocket/types.ts +17 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../../../server/services/plan/prompt-builder.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE;AAEhE;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAajC;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAiC;IACtE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;IACzF,MAAM,MAAM,GAAG,
|
|
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":"
|
|
1
|
+
{"version":3,"file":"review-gate.d.ts","sourceRoot":"","sources":["../../../../server/services/plan/review-gate.ts"],"names":[],"mappings":"AAiBA,OAAO,EAA0B,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAExE,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;AAkED,0DAA0D;AAC1D,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,cAAc,CAAC;AAEtF,oEAAoE;AACpE,MAAM,WAAW,uBAAuB;IACtC,qDAAqD;IACrD,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC1E,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9E,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,6EAA6E;AAC7E,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,uBAAuB,GACjC,OAAO,CAAC,OAAO,CAAC,CA0DlB"}
|
|
@@ -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 =
|
|
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;
|
|
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;
|
|
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
|
|
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
|
-
|
|
88
|
-
console.warn(
|
|
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
|
|
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
|
|
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 =
|
|
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
|
-
|
|
283
|
+
}
|
|
284
|
+
attachSocketHandlers(ws, authToken, connectionTimeout) {
|
|
285
|
+
ws.onopen = () => {
|
|
187
286
|
clearTimeout(connectionTimeout);
|
|
188
|
-
|
|
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
|
-
|
|
293
|
+
ws.onmessage = (event) => {
|
|
195
294
|
try {
|
|
196
|
-
|
|
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
|
-
|
|
301
|
+
ws.onclose = (event) => {
|
|
204
302
|
clearTimeout(connectionTimeout);
|
|
205
|
-
this.
|
|
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
|
-
|
|
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':
|