mstro-app 0.4.52 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -5
- package/bin/mstro.js +1 -1
- package/dist/server/cli/headless/claude-invoker-stall.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker-stall.js +7 -2
- package/dist/server/cli/headless/claude-invoker-stall.js.map +1 -1
- package/dist/server/cli/headless/claude-invoker.js +1 -1
- package/dist/server/cli/headless/claude-invoker.js.map +1 -1
- package/dist/server/cli/headless/runner.d.ts.map +1 -1
- package/dist/server/cli/headless/runner.js +63 -67
- package/dist/server/cli/headless/runner.js.map +1 -1
- package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
- package/dist/server/cli/headless/stall-assessor.js +9 -4
- package/dist/server/cli/headless/stall-assessor.js.map +1 -1
- package/dist/server/cli/improvisation-history-store.d.ts +16 -0
- package/dist/server/cli/improvisation-history-store.d.ts.map +1 -0
- package/dist/server/cli/improvisation-history-store.js +52 -0
- package/dist/server/cli/improvisation-history-store.js.map +1 -0
- package/dist/server/cli/improvisation-movements.d.ts +31 -0
- package/dist/server/cli/improvisation-movements.d.ts.map +1 -0
- package/dist/server/cli/improvisation-movements.js +93 -0
- package/dist/server/cli/improvisation-movements.js.map +1 -0
- package/dist/server/cli/improvisation-output-queue.d.ts +13 -0
- package/dist/server/cli/improvisation-output-queue.d.ts.map +1 -0
- package/dist/server/cli/improvisation-output-queue.js +40 -0
- package/dist/server/cli/improvisation-output-queue.js.map +1 -0
- package/dist/server/cli/improvisation-retry.d.ts +21 -51
- package/dist/server/cli/improvisation-retry.d.ts.map +1 -1
- package/dist/server/cli/improvisation-retry.js +18 -433
- package/dist/server/cli/improvisation-retry.js.map +1 -1
- package/dist/server/cli/improvisation-session-manager.d.ts +10 -8
- package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.js +53 -148
- package/dist/server/cli/improvisation-session-manager.js.map +1 -1
- package/dist/server/cli/retry/retry-best-result.d.ts +4 -0
- package/dist/server/cli/retry/retry-best-result.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-best-result.js +61 -0
- package/dist/server/cli/retry/retry-best-result.js.map +1 -0
- package/dist/server/cli/retry/retry-context-loss.d.ts +6 -0
- package/dist/server/cli/retry/retry-context-loss.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-context-loss.js +68 -0
- package/dist/server/cli/retry/retry-context-loss.js.map +1 -0
- package/dist/server/cli/retry/retry-premature-completion.d.ts +5 -0
- package/dist/server/cli/retry/retry-premature-completion.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-premature-completion.js +81 -0
- package/dist/server/cli/retry/retry-premature-completion.js.map +1 -0
- package/dist/server/cli/retry/retry-recovery-strategies.d.ts +13 -0
- package/dist/server/cli/retry/retry-recovery-strategies.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-recovery-strategies.js +166 -0
- package/dist/server/cli/retry/retry-recovery-strategies.js.map +1 -0
- package/dist/server/cli/retry/retry-resume-strategy.d.ts +12 -0
- package/dist/server/cli/retry/retry-resume-strategy.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-resume-strategy.js +22 -0
- package/dist/server/cli/retry/retry-resume-strategy.js.map +1 -0
- package/dist/server/cli/retry/retry-runner-factory.d.ts +11 -0
- package/dist/server/cli/retry/retry-runner-factory.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-runner-factory.js +60 -0
- package/dist/server/cli/retry/retry-runner-factory.js.map +1 -0
- package/dist/server/cli/retry/retry-tool-results.d.ts +9 -0
- package/dist/server/cli/retry/retry-tool-results.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-tool-results.js +24 -0
- package/dist/server/cli/retry/retry-tool-results.js.map +1 -0
- package/dist/server/cli/retry/retry-types.d.ts +30 -0
- package/dist/server/cli/retry/retry-types.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-types.js +4 -0
- package/dist/server/cli/retry/retry-types.js.map +1 -0
- package/dist/server/index.js +21 -109
- package/dist/server/index.js.map +1 -1
- package/dist/server/server-setup.d.ts +16 -1
- package/dist/server/server-setup.d.ts.map +1 -1
- package/dist/server/server-setup.js +107 -0
- package/dist/server/server-setup.js.map +1 -1
- package/dist/server/services/plan/board-config.d.ts +21 -0
- package/dist/server/services/plan/board-config.d.ts.map +1 -0
- package/dist/server/services/plan/board-config.js +112 -0
- package/dist/server/services/plan/board-config.js.map +1 -0
- package/dist/server/services/plan/composer.d.ts +1 -1
- package/dist/server/services/plan/composer.d.ts.map +1 -1
- package/dist/server/services/plan/composer.js +7 -5
- package/dist/server/services/plan/composer.js.map +1 -1
- package/dist/server/services/plan/executor.d.ts +48 -48
- package/dist/server/services/plan/executor.d.ts.map +1 -1
- package/dist/server/services/plan/executor.js +157 -455
- package/dist/server/services/plan/executor.js.map +1 -1
- package/dist/server/services/plan/issue-loader.d.ts +16 -0
- package/dist/server/services/plan/issue-loader.d.ts.map +1 -0
- package/dist/server/services/plan/issue-loader.js +46 -0
- package/dist/server/services/plan/issue-loader.js.map +1 -0
- package/dist/server/services/plan/issue-writer.d.ts +34 -0
- package/dist/server/services/plan/issue-writer.d.ts.map +1 -0
- package/dist/server/services/plan/issue-writer.js +110 -0
- package/dist/server/services/plan/issue-writer.js.map +1 -0
- package/dist/server/services/plan/output-manager.d.ts.map +1 -1
- package/dist/server/services/plan/output-manager.js +2 -1
- package/dist/server/services/plan/output-manager.js.map +1 -1
- package/dist/server/services/plan/progress-log.d.ts +11 -0
- package/dist/server/services/plan/progress-log.d.ts.map +1 -0
- package/dist/server/services/plan/progress-log.js +81 -0
- package/dist/server/services/plan/progress-log.js.map +1 -0
- package/dist/server/services/plan/prompt-builder.d.ts.map +1 -1
- package/dist/server/services/plan/prompt-builder.js +48 -31
- package/dist/server/services/plan/prompt-builder.js.map +1 -1
- package/dist/server/services/plan/readiness-planner.d.ts +15 -0
- package/dist/server/services/plan/readiness-planner.d.ts.map +1 -0
- package/dist/server/services/plan/readiness-planner.js +41 -0
- package/dist/server/services/plan/readiness-planner.js.map +1 -0
- package/dist/server/services/plan/review-gate.d.ts +31 -0
- package/dist/server/services/plan/review-gate.d.ts.map +1 -1
- package/dist/server/services/plan/review-gate.js +52 -2
- package/dist/server/services/plan/review-gate.js.map +1 -1
- package/dist/server/services/platform.d.ts +56 -0
- package/dist/server/services/platform.d.ts.map +1 -1
- package/dist/server/services/platform.js +154 -52
- package/dist/server/services/platform.js.map +1 -1
- package/dist/server/services/websocket/file-download-handler.d.ts +17 -0
- package/dist/server/services/websocket/file-download-handler.d.ts.map +1 -0
- package/dist/server/services/websocket/file-download-handler.js +165 -0
- package/dist/server/services/websocket/file-download-handler.js.map +1 -0
- package/dist/server/services/websocket/git-worktree-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-worktree-handlers.js +28 -2
- package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -1
- package/dist/server/services/websocket/handler-context.d.ts +15 -0
- package/dist/server/services/websocket/handler-context.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.d.ts +7 -0
- package/dist/server/services/websocket/handler.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.js +73 -11
- package/dist/server/services/websocket/handler.js.map +1 -1
- package/dist/server/services/websocket/msg-id-tracker.d.ts +21 -0
- package/dist/server/services/websocket/msg-id-tracker.d.ts.map +1 -0
- package/dist/server/services/websocket/msg-id-tracker.js +77 -0
- package/dist/server/services/websocket/msg-id-tracker.js.map +1 -0
- package/dist/server/services/websocket/quality-handlers.js +15 -3
- package/dist/server/services/websocket/quality-handlers.js.map +1 -1
- package/dist/server/services/websocket/quality-review-agent.js +2 -2
- package/dist/server/services/websocket/session-handlers.d.ts +48 -2
- package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/session-handlers.js +204 -65
- package/dist/server/services/websocket/session-handlers.js.map +1 -1
- package/dist/server/services/websocket/session-initialization.d.ts +2 -2
- package/dist/server/services/websocket/session-initialization.d.ts.map +1 -1
- package/dist/server/services/websocket/session-initialization.js +75 -17
- package/dist/server/services/websocket/session-initialization.js.map +1 -1
- package/dist/server/services/websocket/session-registry.d.ts +29 -1
- package/dist/server/services/websocket/session-registry.d.ts.map +1 -1
- package/dist/server/services/websocket/session-registry.js +53 -4
- package/dist/server/services/websocket/session-registry.js.map +1 -1
- package/dist/server/services/websocket/tab-broadcast.d.ts +24 -0
- package/dist/server/services/websocket/tab-broadcast.d.ts.map +1 -0
- package/dist/server/services/websocket/tab-broadcast.js +13 -0
- package/dist/server/services/websocket/tab-broadcast.js.map +1 -0
- package/dist/server/services/websocket/tab-event-buffer.d.ts +103 -0
- package/dist/server/services/websocket/tab-event-buffer.d.ts.map +1 -0
- package/dist/server/services/websocket/tab-event-buffer.js +107 -0
- package/dist/server/services/websocket/tab-event-buffer.js.map +1 -0
- package/dist/server/services/websocket/tab-event-replay.d.ts +20 -0
- package/dist/server/services/websocket/tab-event-replay.d.ts.map +1 -0
- package/dist/server/services/websocket/tab-event-replay.js +21 -0
- package/dist/server/services/websocket/tab-event-replay.js.map +1 -0
- package/dist/server/services/websocket/tab-handlers.d.ts +0 -1
- package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/tab-handlers.js +2 -9
- package/dist/server/services/websocket/tab-handlers.js.map +1 -1
- package/dist/server/services/websocket/types.d.ts +15 -6
- package/dist/server/services/websocket/types.d.ts.map +1 -1
- package/dist/server/services/websocket/types.js +6 -4
- package/dist/server/services/websocket/types.js.map +1 -1
- package/package.json +1 -1
- package/server/README.md +1 -1
- package/server/cli/headless/claude-invoker-stall.ts +7 -2
- package/server/cli/headless/claude-invoker.ts +1 -1
- package/server/cli/headless/runner.ts +67 -72
- package/server/cli/headless/stall-assessor.ts +9 -4
- package/server/cli/headless/types.ts +1 -1
- package/server/cli/improvisation-history-store.ts +62 -0
- package/server/cli/improvisation-movements.ts +120 -0
- package/server/cli/improvisation-output-queue.ts +42 -0
- package/server/cli/improvisation-retry.ts +25 -600
- package/server/cli/improvisation-session-manager.ts +74 -160
- package/server/cli/retry/retry-best-result.ts +70 -0
- package/server/cli/retry/retry-context-loss.ts +87 -0
- package/server/cli/retry/retry-premature-completion.ts +113 -0
- package/server/cli/retry/retry-recovery-strategies.ts +247 -0
- package/server/cli/retry/retry-resume-strategy.ts +33 -0
- package/server/cli/retry/retry-runner-factory.ts +70 -0
- package/server/cli/retry/retry-tool-results.ts +31 -0
- package/server/cli/retry/retry-types.ts +32 -0
- package/server/index.ts +37 -123
- package/server/server-setup.ts +126 -1
- package/server/services/plan/agents/assess-stall.md +11 -4
- package/server/services/plan/board-config.ts +122 -0
- package/server/services/plan/composer.ts +7 -5
- package/server/services/plan/executor.ts +214 -467
- package/server/services/plan/issue-loader.ts +64 -0
- package/server/services/plan/issue-writer.ts +137 -0
- package/server/services/plan/output-manager.ts +2 -1
- package/server/services/plan/progress-log.ts +92 -0
- package/server/services/plan/prompt-builder.ts +73 -35
- package/server/services/plan/readiness-planner.ts +50 -0
- package/server/services/plan/review-gate.ts +102 -2
- package/server/services/platform.ts +163 -58
- package/server/services/websocket/file-download-handler.ts +191 -0
- package/server/services/websocket/git-worktree-handlers.ts +29 -2
- package/server/services/websocket/handler-context.ts +15 -0
- package/server/services/websocket/handler.ts +76 -12
- package/server/services/websocket/msg-id-tracker.ts +84 -0
- package/server/services/websocket/quality-handlers.ts +16 -3
- package/server/services/websocket/quality-review-agent.ts +2 -2
- package/server/services/websocket/session-handlers.ts +213 -68
- package/server/services/websocket/session-initialization.ts +83 -19
- package/server/services/websocket/session-registry.ts +61 -4
- package/server/services/websocket/tab-broadcast.ts +38 -0
- package/server/services/websocket/tab-event-buffer.ts +159 -0
- package/server/services/websocket/tab-event-replay.ts +42 -0
- package/server/services/websocket/tab-handlers.ts +2 -9
- package/server/services/websocket/types.ts +17 -4
|
@@ -23,15 +23,16 @@ declare const GitDiffMessages: readonly ["gitDiff", "gitShowCommit", "gitCommitD
|
|
|
23
23
|
declare const GitTagMessages: readonly ["gitListTags", "gitCreateTag", "gitPushTag"];
|
|
24
24
|
declare const GitWorktreeMessages: readonly ["gitWorktreeList", "gitWorktreeCreate", "gitWorktreeCreateAndAssign", "gitWorktreeRemove", "tabWorktreeSwitch", "gitWorktreePush", "gitWorktreeCreatePR"];
|
|
25
25
|
declare const GitMergeMessages: readonly ["gitMergePreview", "gitWorktreeMerge", "gitMergeAbort", "gitMergeComplete"];
|
|
26
|
-
declare const SessionSyncMessages: readonly ["getActiveTabs", "createTab", "reorderTabs", "syncTabMeta", "
|
|
26
|
+
declare const SessionSyncMessages: readonly ["getActiveTabs", "createTab", "reorderTabs", "syncTabMeta", "removeTab", "markTabViewed"];
|
|
27
27
|
declare const SettingsMessages: readonly ["getSettings", "updateSettings"];
|
|
28
28
|
declare const QualityMessages: readonly ["qualityDetectTools", "qualityScan", "qualityInstallTools", "qualityCodeReview", "qualityLoadState", "qualitySaveDirectories"];
|
|
29
29
|
declare const FileUploadMessages: readonly ["fileUploadStart", "fileUploadChunk", "fileUploadComplete", "fileUploadCancel"];
|
|
30
|
+
declare const FileDownloadMessages: readonly ["fileDownloadStart", "fileDownloadCancel"];
|
|
30
31
|
declare const PlanMessages: readonly ["planInit", "planGetState", "planListIssues", "planGetIssue", "planGetSprint", "planGetMilestone", "planCreateIssue", "planUpdateIssue", "planDeleteIssue", "planScaffold", "planPrompt", "planExecute", "planExecuteEpic", "planPause", "planStop", "planResume"];
|
|
31
32
|
declare const PlanBoardMessages: readonly ["planCreateBoard", "planUpdateBoard", "planArchiveBoard", "planRestoreBoard", "planGetBoard", "planGetBoardState", "planReorderBoards", "planSetActiveBoard", "planGetBoardArtifacts"];
|
|
32
33
|
declare const PlanSprintMessages: readonly ["planCreateSprint", "planActivateSprint", "planCompleteSprint", "planGetSprintArtifacts"];
|
|
33
34
|
declare const SkillMessages: readonly ["listSkills", "chatToBoard"];
|
|
34
|
-
type WebSocketMessageType = typeof CoreMessages[number] | typeof TerminalMessages[number] | typeof FileExplorerMessages[number] | typeof GitMessages[number] | typeof GitBranchMessages[number] | typeof GitDiffMessages[number] | typeof GitTagMessages[number] | typeof GitWorktreeMessages[number] | typeof GitMergeMessages[number] | typeof SessionSyncMessages[number] | typeof SettingsMessages[number] | typeof QualityMessages[number] | typeof FileUploadMessages[number] | typeof PlanMessages[number] | typeof PlanBoardMessages[number] | typeof PlanSprintMessages[number] | typeof SkillMessages[number];
|
|
35
|
+
type WebSocketMessageType = typeof CoreMessages[number] | typeof TerminalMessages[number] | typeof FileExplorerMessages[number] | typeof GitMessages[number] | typeof GitBranchMessages[number] | typeof GitDiffMessages[number] | typeof GitTagMessages[number] | typeof GitWorktreeMessages[number] | typeof GitMergeMessages[number] | typeof SessionSyncMessages[number] | typeof SettingsMessages[number] | typeof QualityMessages[number] | typeof FileUploadMessages[number] | typeof FileDownloadMessages[number] | typeof PlanMessages[number] | typeof PlanBoardMessages[number] | typeof PlanSprintMessages[number] | typeof SkillMessages[number];
|
|
35
36
|
export interface WebSocketMessage {
|
|
36
37
|
type: WebSocketMessageType;
|
|
37
38
|
tabId?: string;
|
|
@@ -40,7 +41,7 @@ export interface WebSocketMessage {
|
|
|
40
41
|
/** Injected by server relay for view-only shared users */
|
|
41
42
|
_permission?: 'view';
|
|
42
43
|
}
|
|
43
|
-
declare const CoreResponseMessages: readonly ["output", "thinking", "movementStart", "movementComplete", "movementError", "sessionUpdate", "history", "sessions", "sessionsCount", "sessionDeleted", "sessionData", "historyCleared", "searchResults", "newSession", "autocomplete", "fileContent", "error", "pong", "tabInitialized", "approvalRequired", "toolUse", "streamingTokens", "notificationSummary"];
|
|
44
|
+
declare const CoreResponseMessages: readonly ["output", "thinking", "movementStart", "movementComplete", "movementError", "sessionUpdate", "history", "sessions", "sessionsCount", "sessionDeleted", "sessionData", "historyCleared", "searchResults", "newSession", "autocomplete", "fileContent", "error", "pong", "tabInitialized", "approvalRequired", "toolUse", "streamingTokens", "notificationSummary", "executeAck", "clientOffline", "clientAuthExpired"];
|
|
44
45
|
declare const TerminalResponseMessages: readonly ["terminalOutput", "terminalReady", "terminalExit", "terminalError", "terminalList", "terminalScrollback", "terminalCreated", "terminalClosed"];
|
|
45
46
|
declare const FileExplorerResponseMessages: readonly ["directoryListing", "fileWritten", "fileCreated", "directoryCreated", "fileDeleted", "fileRenamed", "fileOpened", "fileContentChanged", "contentSearchResults", "contentSearchComplete", "contentSearchError", "definitionResult", "fileError"];
|
|
46
47
|
declare const GitResponseMessages: readonly ["gitStatus", "gitStaged", "gitUnstaged", "gitCommitted", "gitCommitMessage", "gitPushed", "gitPulled", "gitLog", "gitError", "gitReposDiscovered", "gitDirectorySet", "gitRemoteInfo", "gitPRCreated", "gitPRDescription"];
|
|
@@ -49,20 +50,28 @@ declare const GitDiffResponseMessages: readonly ["gitDiffResult", "gitCommitDeta
|
|
|
49
50
|
declare const GitTagResponseMessages: readonly ["gitTagList", "gitTagCreated", "gitTagPushed"];
|
|
50
51
|
declare const GitWorktreeResponseMessages: readonly ["gitWorktreeListResult", "gitWorktreeCreated", "gitWorktreeCreatedAndAssigned", "gitWorktreeRemoved", "tabWorktreeSwitched", "gitBranchChanged", "gitWorktreePushed", "gitWorktreePRCreated"];
|
|
51
52
|
declare const GitMergeResponseMessages: readonly ["gitMergePreviewResult", "gitWorktreeMergeResult", "gitMergeAborted", "gitMergeCompleted"];
|
|
52
|
-
declare const SessionSyncResponseMessages: readonly ["activeTabs", "tabCreated", "tabRemoved", "tabRenamed", "tabsReordered", "
|
|
53
|
+
declare const SessionSyncResponseMessages: readonly ["activeTabs", "tabCreated", "tabRemoved", "tabRenamed", "tabsReordered", "tabViewed", "tabStateChanged"];
|
|
53
54
|
declare const SettingsResponseMessages: readonly ["settings", "settingsUpdated"];
|
|
54
|
-
declare const QualityResponseMessages: readonly ["qualityToolsDetected", "qualityScanProgress", "qualityScanResults", "qualityInstallProgress", "qualityInstallComplete", "qualityCodeReview", "qualityCodeReviewProgress", "qualityPostSession", "qualityError", "qualityStateLoaded"];
|
|
55
|
+
declare const QualityResponseMessages: readonly ["qualityToolsDetected", "qualityScanProgress", "qualityScanResults", "qualityInstallProgress", "qualityInstallComplete", "qualityCodeReview", "qualityCodeReviewProgress", "qualityPostSession", "qualityError", "qualityStateLoaded", "qualityDirectoriesUpdated"];
|
|
55
56
|
declare const FileUploadResponseMessages: readonly ["fileUploadAck", "fileUploadReady", "fileUploadError"];
|
|
57
|
+
declare const FileDownloadResponseMessages: readonly ["fileDownloadReady", "fileDownloadChunk", "fileDownloadComplete", "fileDownloadError"];
|
|
56
58
|
declare const PlanResponseMessages: readonly ["planState", "planIssueList", "planIssue", "planSprint", "planMilestone", "planNotFound", "planStateUpdated", "planIssueUpdated", "planIssueCreated", "planIssueDeleted", "planScaffolded", "planPromptStreaming", "planPromptProgress", "planPromptResponse", "planExecutionStarted", "planExecutionProgress", "planExecutionOutput", "planExecutionMetrics", "planExecutionComplete", "planExecutionError", "planError"];
|
|
57
59
|
declare const PlanBoardResponseMessages: readonly ["planBoardCreated", "planBoardUpdated", "planBoardArchived", "planBoardState", "planBoardArtifacts", "planWorkspaceUpdated"];
|
|
58
60
|
declare const PlanSprintResponseMessages: readonly ["planSprintCreated", "planSprintUpdated", "planSprintCompleted", "planSprintArtifacts", "planReviewProgress"];
|
|
59
61
|
declare const SkillResponseMessages: readonly ["skillsList", "chatToBoardCreated"];
|
|
60
|
-
type WebSocketResponseType = typeof CoreResponseMessages[number] | typeof TerminalResponseMessages[number] | typeof FileExplorerResponseMessages[number] | typeof GitResponseMessages[number] | typeof GitBranchResponseMessages[number] | typeof GitDiffResponseMessages[number] | typeof GitTagResponseMessages[number] | typeof GitWorktreeResponseMessages[number] | typeof GitMergeResponseMessages[number] | typeof SessionSyncResponseMessages[number] | typeof SettingsResponseMessages[number] | typeof QualityResponseMessages[number] | typeof FileUploadResponseMessages[number] | typeof PlanResponseMessages[number] | typeof PlanBoardResponseMessages[number] | typeof PlanSprintResponseMessages[number] | typeof SkillResponseMessages[number];
|
|
62
|
+
type WebSocketResponseType = typeof CoreResponseMessages[number] | typeof TerminalResponseMessages[number] | typeof FileExplorerResponseMessages[number] | typeof GitResponseMessages[number] | typeof GitBranchResponseMessages[number] | typeof GitDiffResponseMessages[number] | typeof GitTagResponseMessages[number] | typeof GitWorktreeResponseMessages[number] | typeof GitMergeResponseMessages[number] | typeof SessionSyncResponseMessages[number] | typeof SettingsResponseMessages[number] | typeof QualityResponseMessages[number] | typeof FileUploadResponseMessages[number] | typeof FileDownloadResponseMessages[number] | typeof PlanResponseMessages[number] | typeof PlanBoardResponseMessages[number] | typeof PlanSprintResponseMessages[number] | typeof SkillResponseMessages[number];
|
|
61
63
|
export interface WebSocketResponse {
|
|
62
64
|
type: WebSocketResponseType;
|
|
63
65
|
tabId?: string;
|
|
64
66
|
terminalId?: string;
|
|
65
67
|
data?: any;
|
|
68
|
+
/**
|
|
69
|
+
* Monotonic per-tab sequence number assigned by `tab-event-buffer.ts`.
|
|
70
|
+
* Stamped on tab-scoped streaming broadcasts so webs can ask for replay
|
|
71
|
+
* starting after their highest-seen seq on a reconnect (`initTab` /
|
|
72
|
+
* `resumeSession` with `lastSeenSeq` in the payload).
|
|
73
|
+
*/
|
|
74
|
+
seq?: number;
|
|
66
75
|
}
|
|
67
76
|
export interface ConnectionData {
|
|
68
77
|
tabId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/types.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACjC,KAAK,IAAI,IAAI,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAElB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED,QAAA,MAAM,YAAY,kSAAmS,CAAC;AAEtT,QAAA,MAAM,gBAAgB,oHAAqH,CAAC;AAE5I,QAAA,MAAM,oBAAoB,kLAAmL,CAAC;AAE9M,QAAA,MAAM,WAAW,wNAAyN,CAAC;AAE3O,QAAA,MAAM,iBAAiB,mFAAoF,CAAC;AAE5G,QAAA,MAAM,eAAe,wDAAyD,CAAC;AAE/E,QAAA,MAAM,cAAc,wDAAyD,CAAC;AAE9E,QAAA,MAAM,mBAAmB,qKAAsK,CAAC;AAEhM,QAAA,MAAM,gBAAgB,uFAAwF,CAAC;AAE/G,QAAA,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,15 +9,16 @@ const GitDiffMessages = ['gitDiff', 'gitShowCommit', 'gitCommitDiff'];
|
|
|
9
9
|
const GitTagMessages = ['gitListTags', 'gitCreateTag', 'gitPushTag'];
|
|
10
10
|
const GitWorktreeMessages = ['gitWorktreeList', 'gitWorktreeCreate', 'gitWorktreeCreateAndAssign', 'gitWorktreeRemove', 'tabWorktreeSwitch', 'gitWorktreePush', 'gitWorktreeCreatePR'];
|
|
11
11
|
const GitMergeMessages = ['gitMergePreview', 'gitWorktreeMerge', 'gitMergeAbort', 'gitMergeComplete'];
|
|
12
|
-
const SessionSyncMessages = ['getActiveTabs', 'createTab', 'reorderTabs', 'syncTabMeta', '
|
|
12
|
+
const SessionSyncMessages = ['getActiveTabs', 'createTab', 'reorderTabs', 'syncTabMeta', 'removeTab', 'markTabViewed'];
|
|
13
13
|
const SettingsMessages = ['getSettings', 'updateSettings'];
|
|
14
14
|
const QualityMessages = ['qualityDetectTools', 'qualityScan', 'qualityInstallTools', 'qualityCodeReview', 'qualityLoadState', 'qualitySaveDirectories'];
|
|
15
15
|
const FileUploadMessages = ['fileUploadStart', 'fileUploadChunk', 'fileUploadComplete', 'fileUploadCancel'];
|
|
16
|
+
const FileDownloadMessages = ['fileDownloadStart', 'fileDownloadCancel'];
|
|
16
17
|
const PlanMessages = ['planInit', 'planGetState', 'planListIssues', 'planGetIssue', 'planGetSprint', 'planGetMilestone', 'planCreateIssue', 'planUpdateIssue', 'planDeleteIssue', 'planScaffold', 'planPrompt', 'planExecute', 'planExecuteEpic', 'planPause', 'planStop', 'planResume'];
|
|
17
18
|
const PlanBoardMessages = ['planCreateBoard', 'planUpdateBoard', 'planArchiveBoard', 'planRestoreBoard', 'planGetBoard', 'planGetBoardState', 'planReorderBoards', 'planSetActiveBoard', 'planGetBoardArtifacts'];
|
|
18
19
|
const PlanSprintMessages = ['planCreateSprint', 'planActivateSprint', 'planCompleteSprint', 'planGetSprintArtifacts'];
|
|
19
20
|
const SkillMessages = ['listSkills', 'chatToBoard'];
|
|
20
|
-
const CoreResponseMessages = ['output', 'thinking', 'movementStart', 'movementComplete', 'movementError', 'sessionUpdate', 'history', 'sessions', 'sessionsCount', 'sessionDeleted', 'sessionData', 'historyCleared', 'searchResults', 'newSession', 'autocomplete', 'fileContent', 'error', 'pong', 'tabInitialized', 'approvalRequired', 'toolUse', 'streamingTokens', 'notificationSummary'];
|
|
21
|
+
const CoreResponseMessages = ['output', 'thinking', 'movementStart', 'movementComplete', 'movementError', 'sessionUpdate', 'history', 'sessions', 'sessionsCount', 'sessionDeleted', 'sessionData', 'historyCleared', 'searchResults', 'newSession', 'autocomplete', 'fileContent', 'error', 'pong', 'tabInitialized', 'approvalRequired', 'toolUse', 'streamingTokens', 'notificationSummary', 'executeAck', 'clientOffline', 'clientAuthExpired'];
|
|
21
22
|
const TerminalResponseMessages = ['terminalOutput', 'terminalReady', 'terminalExit', 'terminalError', 'terminalList', 'terminalScrollback', 'terminalCreated', 'terminalClosed'];
|
|
22
23
|
const FileExplorerResponseMessages = ['directoryListing', 'fileWritten', 'fileCreated', 'directoryCreated', 'fileDeleted', 'fileRenamed', 'fileOpened', 'fileContentChanged', 'contentSearchResults', 'contentSearchComplete', 'contentSearchError', 'definitionResult', 'fileError'];
|
|
23
24
|
const GitResponseMessages = ['gitStatus', 'gitStaged', 'gitUnstaged', 'gitCommitted', 'gitCommitMessage', 'gitPushed', 'gitPulled', 'gitLog', 'gitError', 'gitReposDiscovered', 'gitDirectorySet', 'gitRemoteInfo', 'gitPRCreated', 'gitPRDescription'];
|
|
@@ -26,10 +27,11 @@ const GitDiffResponseMessages = ['gitDiffResult', 'gitCommitDetail', 'gitCommitD
|
|
|
26
27
|
const GitTagResponseMessages = ['gitTagList', 'gitTagCreated', 'gitTagPushed'];
|
|
27
28
|
const GitWorktreeResponseMessages = ['gitWorktreeListResult', 'gitWorktreeCreated', 'gitWorktreeCreatedAndAssigned', 'gitWorktreeRemoved', 'tabWorktreeSwitched', 'gitBranchChanged', 'gitWorktreePushed', 'gitWorktreePRCreated'];
|
|
28
29
|
const GitMergeResponseMessages = ['gitMergePreviewResult', 'gitWorktreeMergeResult', 'gitMergeAborted', 'gitMergeCompleted'];
|
|
29
|
-
const SessionSyncResponseMessages = ['activeTabs', 'tabCreated', 'tabRemoved', 'tabRenamed', 'tabsReordered', '
|
|
30
|
+
const SessionSyncResponseMessages = ['activeTabs', 'tabCreated', 'tabRemoved', 'tabRenamed', 'tabsReordered', 'tabViewed', 'tabStateChanged'];
|
|
30
31
|
const SettingsResponseMessages = ['settings', 'settingsUpdated'];
|
|
31
|
-
const QualityResponseMessages = ['qualityToolsDetected', 'qualityScanProgress', 'qualityScanResults', 'qualityInstallProgress', 'qualityInstallComplete', 'qualityCodeReview', 'qualityCodeReviewProgress', 'qualityPostSession', 'qualityError', 'qualityStateLoaded'];
|
|
32
|
+
const QualityResponseMessages = ['qualityToolsDetected', 'qualityScanProgress', 'qualityScanResults', 'qualityInstallProgress', 'qualityInstallComplete', 'qualityCodeReview', 'qualityCodeReviewProgress', 'qualityPostSession', 'qualityError', 'qualityStateLoaded', 'qualityDirectoriesUpdated'];
|
|
32
33
|
const FileUploadResponseMessages = ['fileUploadAck', 'fileUploadReady', 'fileUploadError'];
|
|
34
|
+
const FileDownloadResponseMessages = ['fileDownloadReady', 'fileDownloadChunk', 'fileDownloadComplete', 'fileDownloadError'];
|
|
33
35
|
const PlanResponseMessages = ['planState', 'planIssueList', 'planIssue', 'planSprint', 'planMilestone', 'planNotFound', 'planStateUpdated', 'planIssueUpdated', 'planIssueCreated', 'planIssueDeleted', 'planScaffolded', 'planPromptStreaming', 'planPromptProgress', 'planPromptResponse', 'planExecutionStarted', 'planExecutionProgress', 'planExecutionOutput', 'planExecutionMetrics', 'planExecutionComplete', 'planExecutionError', 'planError'];
|
|
34
36
|
const PlanBoardResponseMessages = ['planBoardCreated', 'planBoardUpdated', 'planBoardArchived', 'planBoardState', 'planBoardArtifacts', 'planWorkspaceUpdated'];
|
|
35
37
|
const PlanSprintResponseMessages = ['planSprintCreated', 'planSprintUpdated', 'planSprintCompleted', 'planSprintArtifacts', 'planReviewProgress'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../server/services/websocket/types.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE;AAqBhE,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,4BAA4B,CAAU,CAAC;AAEtT,MAAM,gBAAgB,GAAG,CAAC,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,CAAU,CAAC;AAE5I,MAAM,oBAAoB,GAAG,CAAC,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,cAAc,EAAE,gBAAgB,CAAU,CAAC;AAE9M,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,aAAa,EAAE,0BAA0B,CAAU,CAAC;AAE3O,MAAM,iBAAiB,GAAG,CAAC,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,CAAU,CAAC;AAE5G,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE,eAAe,CAAU,CAAC;AAE/E,MAAM,cAAc,GAAG,CAAC,aAAa,EAAE,cAAc,EAAE,YAAY,CAAU,CAAC;AAE9E,MAAM,mBAAmB,GAAG,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,qBAAqB,CAAU,CAAC;AAEhM,MAAM,gBAAgB,GAAG,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,kBAAkB,CAAU,CAAC;AAE/G,MAAM,mBAAmB,GAAG,CAAC,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../server/services/websocket/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mstro-app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Browser-based IDE + AI agent orchestration CLI. Run Claude Code in parallel across git worktrees, auto-approve safe tools with the Security Bouncer, and control long-running AI work from any device at app.mstro.app.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
package/server/README.md
CHANGED
|
@@ -152,7 +152,7 @@ The WebSocket endpoint handles real-time communication for the web interface. Me
|
|
|
152
152
|
|
|
153
153
|
### Tabs
|
|
154
154
|
|
|
155
|
-
`getActiveTabs`, `createTab`, `reorderTabs`, `syncTabMeta`, `
|
|
155
|
+
`getActiveTabs`, `createTab`, `reorderTabs`, `syncTabMeta`, `removeTab`, `markTabViewed`
|
|
156
156
|
|
|
157
157
|
### Settings
|
|
158
158
|
|
|
@@ -109,9 +109,14 @@ export async function runStallCheckTick(
|
|
|
109
109
|
const totalElapsed = now - opts.perfStart;
|
|
110
110
|
const tokenSilenceMs = now - opts.lastTokenActivityTime;
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
// Hard cap is a contextual backstop: only fire when other stall signals have
|
|
113
|
+
// already flagged concern. A healthy streaming process is never killed by
|
|
114
|
+
// wall-clock alone — it is killed only if it has been warned as stalled OR
|
|
115
|
+
// Haiku has already exhausted its extension grants.
|
|
116
|
+
const stallFlagged = state.stallWarningEmitted || state.extensionsGranted >= opts.maxExtensions;
|
|
117
|
+
if (totalElapsed >= opts.stallHardCapMs && stallFlagged) {
|
|
113
118
|
terminateStallProcess(opts.claudeProcess, opts.stallCheckInterval, opts.config,
|
|
114
|
-
`\n[[MSTRO_ERROR:EXECUTION_STALLED]] Hard time limit reached (${Math.round(opts.stallHardCapMs / 60000)} min total). Terminating process.\n`
|
|
119
|
+
`\n[[MSTRO_ERROR:EXECUTION_STALLED]] Hard time limit reached (${Math.round(opts.stallHardCapMs / 60000)} min total) after stall signals fired. Terminating process.\n`
|
|
115
120
|
);
|
|
116
121
|
return;
|
|
117
122
|
}
|
|
@@ -117,7 +117,7 @@ export async function executeClaudeCommand(
|
|
|
117
117
|
|
|
118
118
|
// Stall detection with intelligent assessment
|
|
119
119
|
const stallWarningMs = config.stallWarningMs ?? 300_000;
|
|
120
|
-
const stallHardCapMs = config.stallHardCapMs ??
|
|
120
|
+
const stallHardCapMs = config.stallHardCapMs ?? 14_400_000;
|
|
121
121
|
const maxExtensions = config.stallMaxExtensions ?? 3;
|
|
122
122
|
const stallAssessEnabled = config.stallAssessEnabled !== false;
|
|
123
123
|
|
|
@@ -13,8 +13,9 @@ import { type ClaudeInvokerOptions, executeClaudeCommand } from './claude-invoke
|
|
|
13
13
|
import { estimateTokensFromOutput } from './output-utils.js';
|
|
14
14
|
import { enrichPromptWithContext } from './prompt-utils.js';
|
|
15
15
|
import type {
|
|
16
|
+
ExecutionResult,
|
|
16
17
|
HeadlessConfig,
|
|
17
|
-
PromptContext,
|
|
18
|
+
PromptContext,
|
|
18
19
|
ResolvedHeadlessConfig,
|
|
19
20
|
SessionResult,
|
|
20
21
|
} from './types.js';
|
|
@@ -35,6 +36,64 @@ export function killProcessGroup(pid: number, signal: NodeJS.Signals): void {
|
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
|
|
39
|
+
/** Shared result fields carried over from an ExecutionResult into a SessionResult. */
|
|
40
|
+
function sharedResultFields(result: ExecutionResult) {
|
|
41
|
+
return {
|
|
42
|
+
signalName: result.signalName,
|
|
43
|
+
assistantResponse: result.assistantResponse,
|
|
44
|
+
thinkingOutput: result.thinkingOutput,
|
|
45
|
+
toolUseHistory: result.toolUseHistory,
|
|
46
|
+
claudeSessionId: result.claudeSessionId,
|
|
47
|
+
nativeTimeoutCount: result.nativeTimeoutCount,
|
|
48
|
+
postTimeoutOutput: result.postTimeoutOutput,
|
|
49
|
+
resumeBufferedOutput: result.resumeBufferedOutput,
|
|
50
|
+
stopReason: result.stopReason,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Signal exits (128+) with meaningful output are successful completions —
|
|
56
|
+
* Claude finished its work but the process was killed by signal (e.g. stall watchdog SIGTERM).
|
|
57
|
+
*/
|
|
58
|
+
function isSignalExitWithOutput(result: ExecutionResult): boolean {
|
|
59
|
+
if (result.exitCode < 128) return false;
|
|
60
|
+
return !!(result.assistantResponse || (result.toolUseHistory && result.toolUseHistory.length > 0));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Build meaningful error message: prefer stderr, fall back to non-JSON stdout lines. */
|
|
64
|
+
function deriveErrorMessage(result: ExecutionResult): string {
|
|
65
|
+
if (result.error) return result.error;
|
|
66
|
+
if (result.output) {
|
|
67
|
+
const plainLines = result.output.split('\n')
|
|
68
|
+
.filter(l => l.trim() && !l.trim().startsWith('{'))
|
|
69
|
+
.join('\n')
|
|
70
|
+
.trim();
|
|
71
|
+
if (plainLines) return plainLines.slice(0, 500);
|
|
72
|
+
}
|
|
73
|
+
return `Claude exited with code ${result.exitCode}`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function buildSuccessResult(sessionId: string, result: ExecutionResult): SessionResult {
|
|
77
|
+
return {
|
|
78
|
+
completed: true,
|
|
79
|
+
needsHandoff: false,
|
|
80
|
+
totalTokens: estimateTokensFromOutput(result.output),
|
|
81
|
+
sessionId,
|
|
82
|
+
...sharedResultFields(result),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function buildErrorResult(sessionId: string, result: ExecutionResult): SessionResult {
|
|
87
|
+
return {
|
|
88
|
+
completed: false,
|
|
89
|
+
needsHandoff: false,
|
|
90
|
+
totalTokens: 0,
|
|
91
|
+
sessionId,
|
|
92
|
+
error: deriveErrorMessage(result),
|
|
93
|
+
...sharedResultFields(result),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
38
97
|
export class HeadlessRunner {
|
|
39
98
|
private config: ResolvedHeadlessConfig;
|
|
40
99
|
private runningProcesses: Map<number, ChildProcess> = new Map();
|
|
@@ -62,7 +121,7 @@ export class HeadlessRunner {
|
|
|
62
121
|
stallKillMs: config.stallKillMs ?? 1_800_000,
|
|
63
122
|
stallAssessEnabled: config.stallAssessEnabled !== false,
|
|
64
123
|
stallMaxExtensions: config.stallMaxExtensions ?? 3,
|
|
65
|
-
stallHardCapMs: config.stallHardCapMs ??
|
|
124
|
+
stallHardCapMs: config.stallHardCapMs ?? 14_400_000,
|
|
66
125
|
model: config.model,
|
|
67
126
|
effortLevel: config.effortLevel,
|
|
68
127
|
toolTimeoutProfiles: config.toolTimeoutProfiles,
|
|
@@ -103,77 +162,13 @@ export class HeadlessRunner {
|
|
|
103
162
|
|
|
104
163
|
const result = await this.executePromptCommand(enrichedPrompt, 'main', 1);
|
|
105
164
|
|
|
106
|
-
if (result.exitCode
|
|
107
|
-
|
|
108
|
-
// Claude finished its work but the process was killed by signal (e.g., stall watchdog SIGTERM)
|
|
109
|
-
const isSignalExit = result.exitCode >= 128;
|
|
110
|
-
const hasOutput = !!(result.assistantResponse || (result.toolUseHistory && result.toolUseHistory.length > 0));
|
|
111
|
-
|
|
112
|
-
if (isSignalExit && hasOutput) {
|
|
113
|
-
const tokens = estimateTokensFromOutput(result.output);
|
|
114
|
-
return {
|
|
115
|
-
completed: true,
|
|
116
|
-
needsHandoff: false,
|
|
117
|
-
totalTokens: tokens,
|
|
118
|
-
sessionId,
|
|
119
|
-
signalName: result.signalName,
|
|
120
|
-
assistantResponse: result.assistantResponse,
|
|
121
|
-
thinkingOutput: result.thinkingOutput,
|
|
122
|
-
toolUseHistory: result.toolUseHistory,
|
|
123
|
-
claudeSessionId: result.claudeSessionId,
|
|
124
|
-
nativeTimeoutCount: result.nativeTimeoutCount,
|
|
125
|
-
postTimeoutOutput: result.postTimeoutOutput,
|
|
126
|
-
resumeBufferedOutput: result.resumeBufferedOutput,
|
|
127
|
-
stopReason: result.stopReason,
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Build meaningful error: prefer stderr, fall back to non-JSON stdout lines
|
|
132
|
-
let errorMessage = result.error;
|
|
133
|
-
if (!errorMessage && result.output) {
|
|
134
|
-
const plainLines = result.output.split('\n')
|
|
135
|
-
.filter(l => l.trim() && !l.trim().startsWith('{'))
|
|
136
|
-
.join('\n')
|
|
137
|
-
.trim();
|
|
138
|
-
if (plainLines) {
|
|
139
|
-
errorMessage = plainLines.slice(0, 500);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
return {
|
|
143
|
-
completed: false,
|
|
144
|
-
needsHandoff: false,
|
|
145
|
-
totalTokens: 0,
|
|
146
|
-
sessionId,
|
|
147
|
-
error: errorMessage || `Claude exited with code ${result.exitCode}`,
|
|
148
|
-
signalName: result.signalName,
|
|
149
|
-
assistantResponse: result.assistantResponse,
|
|
150
|
-
thinkingOutput: result.thinkingOutput,
|
|
151
|
-
toolUseHistory: result.toolUseHistory,
|
|
152
|
-
claudeSessionId: result.claudeSessionId,
|
|
153
|
-
nativeTimeoutCount: result.nativeTimeoutCount,
|
|
154
|
-
postTimeoutOutput: result.postTimeoutOutput,
|
|
155
|
-
resumeBufferedOutput: result.resumeBufferedOutput,
|
|
156
|
-
stopReason: result.stopReason,
|
|
157
|
-
};
|
|
165
|
+
if (result.exitCode === 0) {
|
|
166
|
+
return buildSuccessResult(sessionId, result);
|
|
158
167
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
return
|
|
163
|
-
completed: true,
|
|
164
|
-
needsHandoff: false,
|
|
165
|
-
totalTokens: tokens,
|
|
166
|
-
sessionId,
|
|
167
|
-
signalName: result.signalName,
|
|
168
|
-
assistantResponse: result.assistantResponse,
|
|
169
|
-
thinkingOutput: result.thinkingOutput,
|
|
170
|
-
toolUseHistory: result.toolUseHistory,
|
|
171
|
-
claudeSessionId: result.claudeSessionId,
|
|
172
|
-
nativeTimeoutCount: result.nativeTimeoutCount,
|
|
173
|
-
postTimeoutOutput: result.postTimeoutOutput,
|
|
174
|
-
resumeBufferedOutput: result.resumeBufferedOutput,
|
|
175
|
-
stopReason: result.stopReason,
|
|
176
|
-
};
|
|
168
|
+
if (isSignalExitWithOutput(result)) {
|
|
169
|
+
return buildSuccessResult(sessionId, result);
|
|
170
|
+
}
|
|
171
|
+
return buildErrorResult(sessionId, result);
|
|
177
172
|
}
|
|
178
173
|
|
|
179
174
|
/**
|
|
@@ -139,7 +139,7 @@ function buildAssessmentPrompt(ctx: StallContext): string {
|
|
|
139
139
|
if (fromSkill) return fromSkill;
|
|
140
140
|
|
|
141
141
|
return [
|
|
142
|
-
'You are a process health monitor. A Claude Code subprocess has
|
|
142
|
+
'You are a process health monitor. A Claude Code subprocess has gone silent (no stdout) and you must determine if it is working or stalled.',
|
|
143
143
|
'',
|
|
144
144
|
`Silent for: ${silenceMin} minutes`,
|
|
145
145
|
`Total runtime: ${totalMin} minutes`,
|
|
@@ -150,10 +150,15 @@ function buildAssessmentPrompt(ctx: StallContext): string {
|
|
|
150
150
|
tokenLine,
|
|
151
151
|
`Task being executed: ${promptPreview}`,
|
|
152
152
|
'',
|
|
153
|
+
'Weigh BOTH silence and total runtime against task complexity.',
|
|
154
|
+
'- Simple tasks (single Read/Write, one-liner edit, ls a directory) should finish in minutes. If total runtime has already far exceeded what the task should need, verdict STALLED even if silence is short.',
|
|
155
|
+
'- Complex tasks (agent teams, multi-step migrations, large refactors, dependency installs) can legitimately run hours. Extend generously when pending tool activity or subagents justify it.',
|
|
156
|
+
'- Recent token activity = process is alive; favor WORKING.',
|
|
157
|
+
'',
|
|
153
158
|
'Respond in EXACTLY this format (3 lines, no extra text):',
|
|
154
159
|
'VERDICT: WORKING or STALLED',
|
|
155
|
-
'MINUTES: <
|
|
156
|
-
'REASON: <brief one-line explanation>',
|
|
160
|
+
'MINUTES: <integer 5-180, only if WORKING, how many more minutes to allow>',
|
|
161
|
+
'REASON: <brief one-line explanation that references task complexity vs elapsed time>',
|
|
157
162
|
].filter(Boolean).join('\n');
|
|
158
163
|
}
|
|
159
164
|
|
|
@@ -169,7 +174,7 @@ function parseAssessmentResponse(output: string): StallVerdict {
|
|
|
169
174
|
verdict = trimmed.slice('VERDICT:'.length).trim().toUpperCase();
|
|
170
175
|
} else if (trimmed.startsWith('MINUTES:')) {
|
|
171
176
|
const parsed = parseInt(trimmed.slice('MINUTES:'.length).trim(), 10);
|
|
172
|
-
if (!Number.isNaN(parsed) && parsed >= 1 && parsed <=
|
|
177
|
+
if (!Number.isNaN(parsed) && parsed >= 1 && parsed <= 180) {
|
|
173
178
|
minutes = parsed;
|
|
174
179
|
}
|
|
175
180
|
} else if (trimmed.startsWith('REASON:')) {
|
|
@@ -108,7 +108,7 @@ export interface HeadlessConfig {
|
|
|
108
108
|
stallKillMs?: number; // No stdout before kill (default: 1800000 = 30 min)
|
|
109
109
|
stallAssessEnabled?: boolean; // Use Haiku to assess stalls (default: true)
|
|
110
110
|
stallMaxExtensions?: number; // Max number of Haiku-granted extensions (default: 3)
|
|
111
|
-
stallHardCapMs?: number; //
|
|
111
|
+
stallHardCapMs?: number; // Wall-clock backstop; only fires after stall signals have flagged the run (default: 14400000 = 4 h)
|
|
112
112
|
/** Claude model for main execution (e.g., 'opus', 'sonnet'). 'default' = no --model flag. */
|
|
113
113
|
model?: string;
|
|
114
114
|
/**
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Persistence helpers for improvisation session history.
|
|
6
|
+
*
|
|
7
|
+
* Resolves the `.mstro/history/<timestamp>.json` location for a session
|
|
8
|
+
* and reads/writes its JSON payload. No in-memory state — callers pass
|
|
9
|
+
* the current `SessionHistory` object.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { herror } from './headless/headless-logger.js';
|
|
15
|
+
import type { SessionHistory } from './improvisation-types.js';
|
|
16
|
+
|
|
17
|
+
export interface HistoryPaths {
|
|
18
|
+
improviseDir: string;
|
|
19
|
+
historyPath: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function resolveHistoryPaths(workingDir: string, sessionId: string): HistoryPaths {
|
|
23
|
+
const improviseDir = join(workingDir, '.mstro', 'history');
|
|
24
|
+
const historyPath = join(improviseDir, `${sessionId.replace('improv-', '')}.json`);
|
|
25
|
+
return { improviseDir, historyPath };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Create the `.mstro/history/` directory if missing. */
|
|
29
|
+
export function ensureHistoryDir(improviseDir: string): void {
|
|
30
|
+
if (!existsSync(improviseDir)) {
|
|
31
|
+
mkdirSync(improviseDir, { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Load a session's history JSON. Returns a fresh empty history if the file
|
|
37
|
+
* doesn't exist or is unreadable (errors are logged but not thrown).
|
|
38
|
+
*/
|
|
39
|
+
export function loadHistory(historyPath: string, sessionId: string): SessionHistory {
|
|
40
|
+
if (existsSync(historyPath)) {
|
|
41
|
+
try {
|
|
42
|
+
const data = readFileSync(historyPath, 'utf-8');
|
|
43
|
+
return JSON.parse(data) as SessionHistory;
|
|
44
|
+
} catch (error) {
|
|
45
|
+
herror('Failed to load history:', error);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const now = new Date().toISOString();
|
|
49
|
+
return {
|
|
50
|
+
sessionId,
|
|
51
|
+
startedAt: now,
|
|
52
|
+
lastActivityAt: now,
|
|
53
|
+
totalTokens: 0,
|
|
54
|
+
movements: [],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Write history to disk after bumping `lastActivityAt`. */
|
|
59
|
+
export function saveHistory(historyPath: string, history: SessionHistory): void {
|
|
60
|
+
history.lastActivityAt = new Date().toISOString();
|
|
61
|
+
writeFileSync(historyPath, JSON.stringify(history, null, 2));
|
|
62
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Pure builders for the MovementRecord snapshots that session-manager
|
|
6
|
+
* writes after each executePrompt outcome — normal completion, user
|
|
7
|
+
* cancel, hard error — plus the auto-continue decision heuristic.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { HeadlessRunResult, MovementRecord, RetryLogEntry } from './improvisation-types.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Fallback `HeadlessRunResult` used when a cancellation fires before any
|
|
14
|
+
* run produces one. Shape matches the minimum fields the emit helpers
|
|
15
|
+
* look at downstream.
|
|
16
|
+
*/
|
|
17
|
+
export const CANCELLED_FALLBACK_RESULT: HeadlessRunResult = {
|
|
18
|
+
completed: false, needsHandoff: false, totalTokens: 0, sessionId: '',
|
|
19
|
+
output: '', exitCode: 1, signalName: 'SIGTERM',
|
|
20
|
+
} as HeadlessRunResult;
|
|
21
|
+
|
|
22
|
+
export interface MovementBuildArgs {
|
|
23
|
+
sequenceNumber: number;
|
|
24
|
+
userPrompt: string;
|
|
25
|
+
execStart: number;
|
|
26
|
+
isAutoContinue?: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Build a MovementRecord representing a successful execution. */
|
|
30
|
+
export function buildSuccessMovement(
|
|
31
|
+
result: HeadlessRunResult,
|
|
32
|
+
args: MovementBuildArgs,
|
|
33
|
+
retryLog: RetryLogEntry[] | undefined,
|
|
34
|
+
): MovementRecord {
|
|
35
|
+
return {
|
|
36
|
+
id: `prompt-${args.sequenceNumber}`,
|
|
37
|
+
sequenceNumber: args.sequenceNumber,
|
|
38
|
+
userPrompt: args.userPrompt,
|
|
39
|
+
timestamp: new Date().toISOString(),
|
|
40
|
+
tokensUsed: result.totalTokens,
|
|
41
|
+
summary: '',
|
|
42
|
+
filesModified: [],
|
|
43
|
+
assistantResponse: result.assistantResponse,
|
|
44
|
+
thinkingOutput: result.thinkingOutput,
|
|
45
|
+
toolUseHistory: result.toolUseHistory?.map(t => ({
|
|
46
|
+
toolName: t.toolName, toolId: t.toolId, toolInput: t.toolInput,
|
|
47
|
+
result: t.result, isError: t.isError, duration: t.duration,
|
|
48
|
+
})),
|
|
49
|
+
errorOutput: result.error,
|
|
50
|
+
durationMs: Date.now() - args.execStart,
|
|
51
|
+
retryLog: retryLog && retryLog.length > 0 ? retryLog : undefined,
|
|
52
|
+
...(args.isAutoContinue && { isAutoContinue: true }),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Build a MovementRecord representing a user-initiated cancel mid-run. */
|
|
57
|
+
export function buildCancelledMovement(
|
|
58
|
+
result: HeadlessRunResult | undefined,
|
|
59
|
+
args: MovementBuildArgs,
|
|
60
|
+
): MovementRecord {
|
|
61
|
+
return {
|
|
62
|
+
id: `prompt-${args.sequenceNumber}`,
|
|
63
|
+
sequenceNumber: args.sequenceNumber,
|
|
64
|
+
userPrompt: args.userPrompt,
|
|
65
|
+
timestamp: new Date().toISOString(),
|
|
66
|
+
tokensUsed: result ? result.totalTokens : 0,
|
|
67
|
+
summary: '',
|
|
68
|
+
filesModified: [],
|
|
69
|
+
assistantResponse: result?.assistantResponse,
|
|
70
|
+
thinkingOutput: result?.thinkingOutput,
|
|
71
|
+
toolUseHistory: result?.toolUseHistory?.map(t => ({
|
|
72
|
+
toolName: t.toolName, toolId: t.toolId, toolInput: t.toolInput,
|
|
73
|
+
result: t.result,
|
|
74
|
+
})),
|
|
75
|
+
errorOutput: 'Execution cancelled by user',
|
|
76
|
+
durationMs: Date.now() - args.execStart,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Build a MovementRecord for a thrown error inside executePrompt. */
|
|
81
|
+
export function buildErrorMovement(errorMessage: string, args: MovementBuildArgs): MovementRecord {
|
|
82
|
+
return {
|
|
83
|
+
id: `prompt-${args.sequenceNumber}`,
|
|
84
|
+
sequenceNumber: args.sequenceNumber,
|
|
85
|
+
userPrompt: args.userPrompt,
|
|
86
|
+
timestamp: new Date().toISOString(),
|
|
87
|
+
tokensUsed: 0,
|
|
88
|
+
summary: '',
|
|
89
|
+
filesModified: [],
|
|
90
|
+
errorOutput: errorMessage,
|
|
91
|
+
durationMs: Date.now() - args.execStart,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Heuristic for auto-continuing "end_turn" runs that appear incomplete:
|
|
97
|
+
* lots of thinking, not much visible output, and no tool work that
|
|
98
|
+
* already justifies the short response.
|
|
99
|
+
*/
|
|
100
|
+
export function shouldAutoContinue(
|
|
101
|
+
result: HeadlessRunResult,
|
|
102
|
+
autoContinueCount: number,
|
|
103
|
+
maxAutoContinues: number,
|
|
104
|
+
cancelled: boolean,
|
|
105
|
+
): boolean {
|
|
106
|
+
if (autoContinueCount >= maxAutoContinues) return false;
|
|
107
|
+
if (cancelled) return false;
|
|
108
|
+
if (!result.completed || result.signalName) return false;
|
|
109
|
+
if (result.stopReason !== 'end_turn') return false;
|
|
110
|
+
|
|
111
|
+
const thinkingLen = result.thinkingOutput?.length ?? 0;
|
|
112
|
+
const responseLen = result.assistantResponse?.length ?? 0;
|
|
113
|
+
const successfulToolCalls = result.toolUseHistory?.filter(t => t.result !== undefined && !t.isError).length ?? 0;
|
|
114
|
+
|
|
115
|
+
if (thinkingLen < 500 || responseLen > 1000) return false;
|
|
116
|
+
// When the agent executed tool calls and produced a non-trivial response,
|
|
117
|
+
// long thinking is expected — the work happened in the tools, not the text.
|
|
118
|
+
if (successfulToolCalls > 0 && responseLen > 200) return false;
|
|
119
|
+
return thinkingLen >= responseLen * 3;
|
|
120
|
+
}
|