mstro-app 0.4.52 → 0.5.1
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/LICENSE +129 -190
- package/PRIVACY.md +3 -3
- package/README.md +15 -6
- package/bin/commands/config.js +0 -1
- package/bin/mstro.js +1 -2
- package/bin/postinstall.js +0 -1
- package/dist/server/cli/headless/claude-invoker-process.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker-process.js +0 -1
- package/dist/server/cli/headless/claude-invoker-process.js.map +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 -3
- package/dist/server/cli/headless/claude-invoker-stall.js.map +1 -1
- package/dist/server/cli/headless/claude-invoker-stream.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker-stream.js +0 -1
- package/dist/server/cli/headless/claude-invoker-stream.js.map +1 -1
- package/dist/server/cli/headless/claude-invoker-tools.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker-tools.js +0 -1
- package/dist/server/cli/headless/claude-invoker-tools.js.map +1 -1
- package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker.js +1 -2
- package/dist/server/cli/headless/claude-invoker.js.map +1 -1
- package/dist/server/cli/headless/haiku-assessments.d.ts.map +1 -1
- package/dist/server/cli/headless/haiku-assessments.js +0 -1
- package/dist/server/cli/headless/haiku-assessments.js.map +1 -1
- package/dist/server/cli/headless/headless-logger.d.ts.map +1 -1
- package/dist/server/cli/headless/headless-logger.js +0 -1
- package/dist/server/cli/headless/headless-logger.js.map +1 -1
- package/dist/server/cli/headless/index.d.ts.map +1 -1
- package/dist/server/cli/headless/index.js +0 -1
- package/dist/server/cli/headless/index.js.map +1 -1
- package/dist/server/cli/headless/native-timeout-detector.d.ts.map +1 -1
- package/dist/server/cli/headless/native-timeout-detector.js +0 -1
- package/dist/server/cli/headless/native-timeout-detector.js.map +1 -1
- package/dist/server/cli/headless/output-utils.d.ts.map +1 -1
- package/dist/server/cli/headless/output-utils.js +0 -1
- package/dist/server/cli/headless/output-utils.js.map +1 -1
- package/dist/server/cli/headless/prompt-utils.d.ts.map +1 -1
- package/dist/server/cli/headless/prompt-utils.js +0 -1
- package/dist/server/cli/headless/prompt-utils.js.map +1 -1
- package/dist/server/cli/headless/resilient-runner.d.ts.map +1 -1
- package/dist/server/cli/headless/resilient-runner.js +0 -1
- package/dist/server/cli/headless/resilient-runner.js.map +1 -1
- package/dist/server/cli/headless/retry-strategies.d.ts.map +1 -1
- package/dist/server/cli/headless/retry-strategies.js +0 -1
- package/dist/server/cli/headless/retry-strategies.js.map +1 -1
- package/dist/server/cli/headless/runner.d.ts.map +1 -1
- package/dist/server/cli/headless/runner.js +63 -68
- 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 -5
- package/dist/server/cli/headless/stall-assessor.js.map +1 -1
- package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -1
- package/dist/server/cli/headless/tool-watchdog.js +0 -1
- package/dist/server/cli/headless/tool-watchdog.js.map +1 -1
- package/dist/server/cli/headless/types.d.ts.map +1 -1
- package/dist/server/cli/headless/types.js +0 -1
- package/dist/server/cli/headless/types.js.map +1 -1
- package/dist/server/cli/improvisation-attachments.d.ts.map +1 -1
- package/dist/server/cli/improvisation-attachments.js +0 -1
- package/dist/server/cli/improvisation-attachments.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 +51 -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 +92 -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 +39 -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 -434
- 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 -149
- package/dist/server/cli/improvisation-session-manager.js.map +1 -1
- package/dist/server/cli/improvisation-types.d.ts.map +1 -1
- package/dist/server/cli/improvisation-types.js +0 -1
- package/dist/server/cli/improvisation-types.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 +60 -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 +67 -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 +80 -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 +165 -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 +21 -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 +59 -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 +23 -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 +3 -0
- package/dist/server/cli/retry/retry-types.js.map +1 -0
- package/dist/server/index.js +21 -110
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp/bouncer-cli.js +0 -1
- package/dist/server/mcp/bouncer-cli.js.map +1 -1
- package/dist/server/mcp/bouncer-haiku.d.ts.map +1 -1
- package/dist/server/mcp/bouncer-haiku.js +0 -1
- package/dist/server/mcp/bouncer-haiku.js.map +1 -1
- package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
- package/dist/server/mcp/bouncer-integration.js +0 -1
- package/dist/server/mcp/bouncer-integration.js.map +1 -1
- package/dist/server/mcp/security-analysis.d.ts.map +1 -1
- package/dist/server/mcp/security-analysis.js +0 -1
- package/dist/server/mcp/security-analysis.js.map +1 -1
- package/dist/server/mcp/security-audit.d.ts.map +1 -1
- package/dist/server/mcp/security-audit.js +0 -1
- package/dist/server/mcp/security-audit.js.map +1 -1
- package/dist/server/mcp/security-patterns.d.ts.map +1 -1
- package/dist/server/mcp/security-patterns.js +0 -1
- package/dist/server/mcp/security-patterns.js.map +1 -1
- package/dist/server/mcp/server.js +0 -1
- package/dist/server/mcp/server.js.map +1 -1
- package/dist/server/routes/files.d.ts.map +1 -1
- package/dist/server/routes/files.js +0 -1
- package/dist/server/routes/files.js.map +1 -1
- package/dist/server/routes/improvise.d.ts.map +1 -1
- package/dist/server/routes/improvise.js +0 -1
- package/dist/server/routes/improvise.js.map +1 -1
- package/dist/server/routes/index.d.ts.map +1 -1
- package/dist/server/routes/index.js +0 -1
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/instances.d.ts.map +1 -1
- package/dist/server/routes/instances.js +0 -1
- package/dist/server/routes/instances.js.map +1 -1
- package/dist/server/routes/notifications.d.ts.map +1 -1
- package/dist/server/routes/notifications.js +0 -1
- package/dist/server/routes/notifications.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 -1
- package/dist/server/server-setup.js.map +1 -1
- package/dist/server/services/analytics.d.ts.map +1 -1
- package/dist/server/services/analytics.js +0 -1
- package/dist/server/services/analytics.js.map +1 -1
- package/dist/server/services/auth.d.ts.map +1 -1
- package/dist/server/services/auth.js +0 -1
- package/dist/server/services/auth.js.map +1 -1
- package/dist/server/services/client-id.d.ts.map +1 -1
- package/dist/server/services/client-id.js +0 -1
- package/dist/server/services/client-id.js.map +1 -1
- package/dist/server/services/file-explorer-ops.d.ts.map +1 -1
- package/dist/server/services/file-explorer-ops.js +0 -1
- package/dist/server/services/file-explorer-ops.js.map +1 -1
- package/dist/server/services/files.d.ts.map +1 -1
- package/dist/server/services/files.js +0 -1
- package/dist/server/services/files.js.map +1 -1
- package/dist/server/services/instances.d.ts.map +1 -1
- package/dist/server/services/instances.js +0 -1
- package/dist/server/services/instances.js.map +1 -1
- package/dist/server/services/pathUtils.d.ts.map +1 -1
- package/dist/server/services/pathUtils.js +0 -1
- package/dist/server/services/pathUtils.js.map +1 -1
- package/dist/server/services/plan/agent-loader.d.ts.map +1 -1
- package/dist/server/services/plan/agent-loader.js +0 -1
- package/dist/server/services/plan/agent-loader.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 +111 -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 -6
- package/dist/server/services/plan/composer.js.map +1 -1
- package/dist/server/services/plan/config-installer.d.ts.map +1 -1
- package/dist/server/services/plan/config-installer.js +0 -1
- package/dist/server/services/plan/config-installer.js.map +1 -1
- package/dist/server/services/plan/dependency-resolver.d.ts.map +1 -1
- package/dist/server/services/plan/dependency-resolver.js +0 -1
- package/dist/server/services/plan/dependency-resolver.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 +202 -458
- package/dist/server/services/plan/executor.js.map +1 -1
- package/dist/server/services/plan/front-matter.d.ts.map +1 -1
- package/dist/server/services/plan/front-matter.js +0 -1
- package/dist/server/services/plan/front-matter.js.map +1 -1
- package/dist/server/services/plan/issue-classification.d.ts.map +1 -1
- package/dist/server/services/plan/issue-classification.js +0 -1
- package/dist/server/services/plan/issue-classification.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 +45 -0
- package/dist/server/services/plan/issue-loader.js.map +1 -0
- package/dist/server/services/plan/issue-prompt-builder.d.ts.map +1 -1
- package/dist/server/services/plan/issue-prompt-builder.js +0 -1
- package/dist/server/services/plan/issue-prompt-builder.js.map +1 -1
- package/dist/server/services/plan/issue-retry.d.ts +3 -1
- package/dist/server/services/plan/issue-retry.d.ts.map +1 -1
- package/dist/server/services/plan/issue-retry.js +2 -1
- package/dist/server/services/plan/issue-retry.js.map +1 -1
- 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 +109 -0
- package/dist/server/services/plan/issue-writer.js.map +1 -0
- package/dist/server/services/plan/output-manager.js +2 -2
- package/dist/server/services/plan/output-manager.js.map +1 -1
- package/dist/server/services/plan/parser-core.d.ts.map +1 -1
- package/dist/server/services/plan/parser-core.js +0 -1
- package/dist/server/services/plan/parser-core.js.map +1 -1
- package/dist/server/services/plan/parser-migration.d.ts.map +1 -1
- package/dist/server/services/plan/parser-migration.js +0 -1
- package/dist/server/services/plan/parser-migration.js.map +1 -1
- package/dist/server/services/plan/parser.d.ts.map +1 -1
- package/dist/server/services/plan/parser.js +0 -1
- package/dist/server/services/plan/parser.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 +80 -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 -32
- 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 +40 -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 -3
- package/dist/server/services/plan/review-gate.js.map +1 -1
- package/dist/server/services/plan/state-reconciler.d.ts.map +1 -1
- package/dist/server/services/plan/state-reconciler.js +0 -1
- package/dist/server/services/plan/state-reconciler.js.map +1 -1
- package/dist/server/services/plan/types.d.ts.map +1 -1
- package/dist/server/services/plan/types.js +0 -1
- package/dist/server/services/plan/types.js.map +1 -1
- package/dist/server/services/plan/watcher.d.ts.map +1 -1
- package/dist/server/services/plan/watcher.js +0 -1
- package/dist/server/services/plan/watcher.js.map +1 -1
- package/dist/server/services/platform-credentials.d.ts.map +1 -1
- package/dist/server/services/platform-credentials.js +0 -1
- package/dist/server/services/platform-credentials.js.map +1 -1
- package/dist/server/services/platform-token-lifecycle.d.ts +70 -0
- package/dist/server/services/platform-token-lifecycle.d.ts.map +1 -0
- package/dist/server/services/platform-token-lifecycle.js +156 -0
- package/dist/server/services/platform-token-lifecycle.js.map +1 -0
- package/dist/server/services/platform.d.ts +25 -4
- package/dist/server/services/platform.d.ts.map +1 -1
- package/dist/server/services/platform.js +150 -92
- package/dist/server/services/platform.js.map +1 -1
- package/dist/server/services/sentry.d.ts.map +1 -1
- package/dist/server/services/sentry.js +0 -1
- package/dist/server/services/sentry.js.map +1 -1
- package/dist/server/services/settings.d.ts.map +1 -1
- package/dist/server/services/settings.js +0 -1
- package/dist/server/services/settings.js.map +1 -1
- package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
- package/dist/server/services/terminal/pty-manager.js +0 -1
- package/dist/server/services/terminal/pty-manager.js.map +1 -1
- package/dist/server/services/terminal/pty-utils.d.ts.map +1 -1
- package/dist/server/services/terminal/pty-utils.js +0 -1
- package/dist/server/services/terminal/pty-utils.js.map +1 -1
- package/dist/server/services/websocket/autocomplete.d.ts.map +1 -1
- package/dist/server/services/websocket/autocomplete.js +0 -1
- package/dist/server/services/websocket/autocomplete.js.map +1 -1
- package/dist/server/services/websocket/file-definition-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/file-definition-handlers.js +0 -1
- package/dist/server/services/websocket/file-definition-handlers.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 +164 -0
- package/dist/server/services/websocket/file-download-handler.js.map +1 -0
- package/dist/server/services/websocket/file-explorer-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/file-explorer-handlers.js +0 -1
- package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -1
- package/dist/server/services/websocket/file-search-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/file-search-handlers.js +0 -1
- package/dist/server/services/websocket/file-search-handlers.js.map +1 -1
- package/dist/server/services/websocket/file-upload-handler.d.ts +2 -3
- package/dist/server/services/websocket/file-upload-handler.d.ts.map +1 -1
- package/dist/server/services/websocket/file-upload-handler.js +4 -7
- package/dist/server/services/websocket/file-upload-handler.js.map +1 -1
- package/dist/server/services/websocket/file-utils.d.ts.map +1 -1
- package/dist/server/services/websocket/file-utils.js +0 -1
- package/dist/server/services/websocket/file-utils.js.map +1 -1
- package/dist/server/services/websocket/git-branch-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-branch-handlers.js +0 -1
- package/dist/server/services/websocket/git-branch-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-diff-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-diff-handlers.js +0 -1
- package/dist/server/services/websocket/git-diff-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-handlers.js +58 -6
- package/dist/server/services/websocket/git-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-head-watcher.d.ts.map +1 -1
- package/dist/server/services/websocket/git-head-watcher.js +0 -1
- package/dist/server/services/websocket/git-head-watcher.js.map +1 -1
- package/dist/server/services/websocket/git-log-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-log-handlers.js +0 -1
- package/dist/server/services/websocket/git-log-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-pr-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-pr-handlers.js +0 -1
- package/dist/server/services/websocket/git-pr-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-tag-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-tag-handlers.js +0 -1
- package/dist/server/services/websocket/git-tag-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-utils.d.ts +18 -3
- package/dist/server/services/websocket/git-utils.d.ts.map +1 -1
- package/dist/server/services/websocket/git-utils.js +58 -8
- package/dist/server/services/websocket/git-utils.js.map +1 -1
- package/dist/server/services/websocket/git-worktree-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-worktree-handlers.js +258 -16
- 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-context.js +0 -1
- package/dist/server/services/websocket/handler-context.js.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 +76 -15
- package/dist/server/services/websocket/handler.js.map +1 -1
- package/dist/server/services/websocket/index.d.ts.map +1 -1
- package/dist/server/services/websocket/index.js +0 -1
- package/dist/server/services/websocket/index.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 +76 -0
- package/dist/server/services/websocket/msg-id-tracker.js.map +1 -0
- package/dist/server/services/websocket/plan-board-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-board-handlers.js +0 -1
- package/dist/server/services/websocket/plan-board-handlers.js.map +1 -1
- package/dist/server/services/websocket/plan-execution-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-execution-handlers.js +6 -2
- package/dist/server/services/websocket/plan-execution-handlers.js.map +1 -1
- package/dist/server/services/websocket/plan-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-handlers.js +0 -1
- package/dist/server/services/websocket/plan-handlers.js.map +1 -1
- package/dist/server/services/websocket/plan-helpers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-helpers.js +0 -1
- package/dist/server/services/websocket/plan-helpers.js.map +1 -1
- package/dist/server/services/websocket/plan-issue-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-issue-handlers.js +0 -1
- package/dist/server/services/websocket/plan-issue-handlers.js.map +1 -1
- package/dist/server/services/websocket/plan-sprint-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-sprint-handlers.js +0 -1
- package/dist/server/services/websocket/plan-sprint-handlers.js.map +1 -1
- package/dist/server/services/websocket/quality-complexity.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-complexity.js +0 -1
- package/dist/server/services/websocket/quality-complexity.js.map +1 -1
- package/dist/server/services/websocket/quality-grading.d.ts +46 -0
- package/dist/server/services/websocket/quality-grading.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-grading.js +482 -0
- package/dist/server/services/websocket/quality-grading.js.map +1 -0
- package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-handlers.js +15 -4
- package/dist/server/services/websocket/quality-handlers.js.map +1 -1
- package/dist/server/services/websocket/quality-linting.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-linting.js +0 -1
- package/dist/server/services/websocket/quality-linting.js.map +1 -1
- package/dist/server/services/websocket/quality-persistence.d.ts +14 -0
- package/dist/server/services/websocket/quality-persistence.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-persistence.js +28 -12
- package/dist/server/services/websocket/quality-persistence.js.map +1 -1
- package/dist/server/services/websocket/quality-review-agent.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-review-agent.js +2 -3
- package/dist/server/services/websocket/quality-review-agent.js.map +1 -1
- package/dist/server/services/websocket/quality-service.d.ts +3 -1
- package/dist/server/services/websocket/quality-service.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-service.js +53 -58
- package/dist/server/services/websocket/quality-service.js.map +1 -1
- package/dist/server/services/websocket/quality-tools.d.ts +1 -1
- package/dist/server/services/websocket/quality-tools.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-tools.js +6 -3
- package/dist/server/services/websocket/quality-tools.js.map +1 -1
- package/dist/server/services/websocket/quality-types.d.ts +18 -2
- package/dist/server/services/websocket/quality-types.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-types.js +0 -1
- package/dist/server/services/websocket/quality-types.js.map +1 -1
- 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 -66
- package/dist/server/services/websocket/session-handlers.js.map +1 -1
- package/dist/server/services/websocket/session-history.d.ts.map +1 -1
- package/dist/server/services/websocket/session-history.js +0 -1
- package/dist/server/services/websocket/session-history.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 -18
- 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 -5
- package/dist/server/services/websocket/session-registry.js.map +1 -1
- package/dist/server/services/websocket/settings-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/settings-handlers.js +0 -1
- package/dist/server/services/websocket/settings-handlers.js.map +1 -1
- package/dist/server/services/websocket/skill-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/skill-handlers.js +0 -1
- package/dist/server/services/websocket/skill-handlers.js.map +1 -1
- package/dist/server/services/websocket/skill-watcher.d.ts.map +1 -1
- package/dist/server/services/websocket/skill-watcher.js +0 -1
- package/dist/server/services/websocket/skill-watcher.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 +12 -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 +106 -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 +20 -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 -10
- package/dist/server/services/websocket/tab-handlers.js.map +1 -1
- package/dist/server/services/websocket/terminal-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/terminal-handlers.js +39 -4
- package/dist/server/services/websocket/terminal-handlers.js.map +1 -1
- package/dist/server/services/websocket/types.d.ts +17 -8
- package/dist/server/services/websocket/types.d.ts.map +1 -1
- package/dist/server/services/websocket/types.js +8 -7
- package/dist/server/services/websocket/types.js.map +1 -1
- package/dist/server/utils/agent-manager.d.ts.map +1 -1
- package/dist/server/utils/agent-manager.js +0 -1
- package/dist/server/utils/agent-manager.js.map +1 -1
- package/dist/server/utils/paths.d.ts.map +1 -1
- package/dist/server/utils/paths.js +0 -1
- package/dist/server/utils/paths.js.map +1 -1
- package/dist/server/utils/port-manager.d.ts.map +1 -1
- package/dist/server/utils/port-manager.js +0 -1
- package/dist/server/utils/port-manager.js.map +1 -1
- package/dist/server/utils/port.d.ts.map +1 -1
- package/dist/server/utils/port.js +0 -1
- package/dist/server/utils/port.js.map +1 -1
- package/package.json +2 -2
- package/server/README.md +1 -1
- package/server/cli/headless/claude-invoker-process.ts +0 -1
- package/server/cli/headless/claude-invoker-stall.ts +7 -3
- package/server/cli/headless/claude-invoker-stream.ts +0 -1
- package/server/cli/headless/claude-invoker-tools.ts +0 -1
- package/server/cli/headless/claude-invoker.ts +1 -2
- package/server/cli/headless/haiku-assessments.ts +0 -1
- package/server/cli/headless/headless-logger.ts +0 -1
- package/server/cli/headless/index.ts +0 -1
- package/server/cli/headless/native-timeout-detector.ts +0 -1
- package/server/cli/headless/output-utils.ts +0 -1
- package/server/cli/headless/prompt-utils.ts +0 -1
- package/server/cli/headless/resilient-runner.ts +0 -1
- package/server/cli/headless/retry-strategies.ts +0 -1
- package/server/cli/headless/runner.ts +67 -73
- package/server/cli/headless/stall-assessor.ts +9 -5
- package/server/cli/headless/tool-watchdog.ts +0 -1
- package/server/cli/headless/types.ts +1 -2
- package/server/cli/improvisation-attachments.ts +0 -1
- package/server/cli/improvisation-history-store.ts +61 -0
- package/server/cli/improvisation-movements.ts +119 -0
- package/server/cli/improvisation-output-queue.ts +41 -0
- package/server/cli/improvisation-retry.ts +25 -601
- package/server/cli/improvisation-session-manager.ts +74 -161
- package/server/cli/improvisation-types.ts +0 -1
- package/server/cli/retry/retry-best-result.ts +69 -0
- package/server/cli/retry/retry-context-loss.ts +86 -0
- package/server/cli/retry/retry-premature-completion.ts +112 -0
- package/server/cli/retry/retry-recovery-strategies.ts +246 -0
- package/server/cli/retry/retry-resume-strategy.ts +32 -0
- package/server/cli/retry/retry-runner-factory.ts +69 -0
- package/server/cli/retry/retry-tool-results.ts +30 -0
- package/server/cli/retry/retry-types.ts +31 -0
- package/server/index.ts +37 -124
- package/server/mcp/bouncer-cli.ts +0 -1
- package/server/mcp/bouncer-haiku.ts +0 -1
- package/server/mcp/bouncer-integration.ts +0 -1
- package/server/mcp/security-analysis.ts +0 -1
- package/server/mcp/security-audit.ts +0 -1
- package/server/mcp/security-patterns.ts +0 -1
- package/server/mcp/server.ts +0 -1
- package/server/routes/files.ts +0 -1
- package/server/routes/improvise.ts +0 -1
- package/server/routes/index.ts +0 -1
- package/server/routes/instances.ts +0 -1
- package/server/routes/notifications.ts +0 -1
- package/server/server-setup.ts +126 -2
- package/server/services/analytics.ts +0 -1
- package/server/services/auth.ts +0 -1
- package/server/services/client-id.ts +0 -1
- package/server/services/file-explorer-ops.ts +0 -1
- package/server/services/files.ts +0 -1
- package/server/services/instances.ts +0 -1
- package/server/services/pathUtils.ts +0 -1
- package/server/services/plan/agent-loader.ts +0 -1
- package/server/services/plan/agents/assess-stall.md +11 -4
- package/server/services/plan/agents/code-review.md +13 -11
- package/server/services/plan/board-config.ts +121 -0
- package/server/services/plan/composer.ts +7 -6
- package/server/services/plan/config-installer.ts +0 -1
- package/server/services/plan/dependency-resolver.ts +0 -1
- package/server/services/plan/executor.ts +259 -470
- package/server/services/plan/front-matter.ts +0 -1
- package/server/services/plan/issue-classification.ts +0 -1
- package/server/services/plan/issue-loader.ts +63 -0
- package/server/services/plan/issue-prompt-builder.ts +0 -1
- package/server/services/plan/issue-retry.ts +5 -2
- package/server/services/plan/issue-writer.ts +136 -0
- package/server/services/plan/output-manager.ts +2 -2
- package/server/services/plan/parser-core.ts +0 -1
- package/server/services/plan/parser-migration.ts +0 -1
- package/server/services/plan/parser.ts +0 -1
- package/server/services/plan/progress-log.ts +91 -0
- package/server/services/plan/prompt-builder.ts +73 -36
- package/server/services/plan/readiness-planner.ts +49 -0
- package/server/services/plan/review-gate.ts +102 -3
- package/server/services/plan/state-reconciler.ts +0 -1
- package/server/services/plan/types.ts +0 -1
- package/server/services/plan/watcher.ts +0 -1
- package/server/services/platform-credentials.ts +0 -1
- package/server/services/platform-token-lifecycle.ts +171 -0
- package/server/services/platform.ts +168 -105
- package/server/services/sentry.ts +0 -1
- package/server/services/settings.ts +0 -1
- package/server/services/terminal/pty-manager.ts +0 -1
- package/server/services/terminal/pty-utils.ts +0 -1
- package/server/services/websocket/autocomplete.ts +0 -1
- package/server/services/websocket/file-definition-handlers.ts +0 -1
- package/server/services/websocket/file-download-handler.ts +190 -0
- package/server/services/websocket/file-explorer-handlers.ts +0 -1
- package/server/services/websocket/file-search-handlers.ts +0 -1
- package/server/services/websocket/file-upload-handler.ts +6 -5
- package/server/services/websocket/file-utils.ts +0 -1
- package/server/services/websocket/git-branch-handlers.ts +0 -1
- package/server/services/websocket/git-diff-handlers.ts +0 -1
- package/server/services/websocket/git-handlers.ts +66 -10
- package/server/services/websocket/git-head-watcher.ts +0 -1
- package/server/services/websocket/git-log-handlers.ts +0 -1
- package/server/services/websocket/git-pr-handlers.ts +0 -1
- package/server/services/websocket/git-tag-handlers.ts +0 -1
- package/server/services/websocket/git-utils.ts +69 -9
- package/server/services/websocket/git-worktree-handlers.ts +289 -19
- package/server/services/websocket/handler-context.ts +15 -1
- package/server/services/websocket/handler.ts +79 -16
- package/server/services/websocket/index.ts +0 -1
- package/server/services/websocket/msg-id-tracker.ts +83 -0
- package/server/services/websocket/plan-board-handlers.ts +0 -1
- package/server/services/websocket/plan-execution-handlers.ts +6 -2
- package/server/services/websocket/plan-handlers.ts +0 -1
- package/server/services/websocket/plan-helpers.ts +0 -1
- package/server/services/websocket/plan-issue-handlers.ts +0 -1
- package/server/services/websocket/plan-sprint-handlers.ts +0 -1
- package/server/services/websocket/quality-complexity.ts +0 -1
- package/server/services/websocket/quality-grading.ts +611 -0
- package/server/services/websocket/quality-handlers.ts +16 -4
- package/server/services/websocket/quality-linting.ts +0 -1
- package/server/services/websocket/quality-persistence.ts +30 -8
- package/server/services/websocket/quality-review-agent.ts +2 -3
- package/server/services/websocket/quality-service.ts +54 -55
- package/server/services/websocket/quality-tools.ts +11 -3
- package/server/services/websocket/quality-types.ts +21 -3
- package/server/services/websocket/session-handlers.ts +213 -69
- package/server/services/websocket/session-history.ts +0 -1
- package/server/services/websocket/session-initialization.ts +83 -20
- package/server/services/websocket/session-registry.ts +61 -5
- package/server/services/websocket/settings-handlers.ts +0 -1
- package/server/services/websocket/skill-handlers.ts +0 -1
- package/server/services/websocket/skill-watcher.ts +0 -1
- package/server/services/websocket/tab-broadcast.ts +37 -0
- package/server/services/websocket/tab-event-buffer.ts +158 -0
- package/server/services/websocket/tab-event-replay.ts +41 -0
- package/server/services/websocket/tab-handlers.ts +2 -10
- package/server/services/websocket/terminal-handlers.ts +39 -3
- package/server/services/websocket/types.ts +19 -7
- package/server/utils/agent-manager.ts +0 -1
- package/server/utils/paths.ts +0 -1
- package/server/utils/port-manager.ts +0 -1
- package/server/utils/port.ts +0 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
-
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
2
|
|
|
4
3
|
/**
|
|
5
4
|
* Headless Runner
|
|
@@ -13,8 +12,9 @@ import { type ClaudeInvokerOptions, executeClaudeCommand } from './claude-invoke
|
|
|
13
12
|
import { estimateTokensFromOutput } from './output-utils.js';
|
|
14
13
|
import { enrichPromptWithContext } from './prompt-utils.js';
|
|
15
14
|
import type {
|
|
15
|
+
ExecutionResult,
|
|
16
16
|
HeadlessConfig,
|
|
17
|
-
PromptContext,
|
|
17
|
+
PromptContext,
|
|
18
18
|
ResolvedHeadlessConfig,
|
|
19
19
|
SessionResult,
|
|
20
20
|
} from './types.js';
|
|
@@ -35,6 +35,64 @@ export function killProcessGroup(pid: number, signal: NodeJS.Signals): void {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
/** Shared result fields carried over from an ExecutionResult into a SessionResult. */
|
|
39
|
+
function sharedResultFields(result: ExecutionResult) {
|
|
40
|
+
return {
|
|
41
|
+
signalName: result.signalName,
|
|
42
|
+
assistantResponse: result.assistantResponse,
|
|
43
|
+
thinkingOutput: result.thinkingOutput,
|
|
44
|
+
toolUseHistory: result.toolUseHistory,
|
|
45
|
+
claudeSessionId: result.claudeSessionId,
|
|
46
|
+
nativeTimeoutCount: result.nativeTimeoutCount,
|
|
47
|
+
postTimeoutOutput: result.postTimeoutOutput,
|
|
48
|
+
resumeBufferedOutput: result.resumeBufferedOutput,
|
|
49
|
+
stopReason: result.stopReason,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Signal exits (128+) with meaningful output are successful completions —
|
|
55
|
+
* Claude finished its work but the process was killed by signal (e.g. stall watchdog SIGTERM).
|
|
56
|
+
*/
|
|
57
|
+
function isSignalExitWithOutput(result: ExecutionResult): boolean {
|
|
58
|
+
if (result.exitCode < 128) return false;
|
|
59
|
+
return !!(result.assistantResponse || (result.toolUseHistory && result.toolUseHistory.length > 0));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Build meaningful error message: prefer stderr, fall back to non-JSON stdout lines. */
|
|
63
|
+
function deriveErrorMessage(result: ExecutionResult): string {
|
|
64
|
+
if (result.error) return result.error;
|
|
65
|
+
if (result.output) {
|
|
66
|
+
const plainLines = result.output.split('\n')
|
|
67
|
+
.filter(l => l.trim() && !l.trim().startsWith('{'))
|
|
68
|
+
.join('\n')
|
|
69
|
+
.trim();
|
|
70
|
+
if (plainLines) return plainLines.slice(0, 500);
|
|
71
|
+
}
|
|
72
|
+
return `Claude exited with code ${result.exitCode}`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function buildSuccessResult(sessionId: string, result: ExecutionResult): SessionResult {
|
|
76
|
+
return {
|
|
77
|
+
completed: true,
|
|
78
|
+
needsHandoff: false,
|
|
79
|
+
totalTokens: estimateTokensFromOutput(result.output),
|
|
80
|
+
sessionId,
|
|
81
|
+
...sharedResultFields(result),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function buildErrorResult(sessionId: string, result: ExecutionResult): SessionResult {
|
|
86
|
+
return {
|
|
87
|
+
completed: false,
|
|
88
|
+
needsHandoff: false,
|
|
89
|
+
totalTokens: 0,
|
|
90
|
+
sessionId,
|
|
91
|
+
error: deriveErrorMessage(result),
|
|
92
|
+
...sharedResultFields(result),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
38
96
|
export class HeadlessRunner {
|
|
39
97
|
private config: ResolvedHeadlessConfig;
|
|
40
98
|
private runningProcesses: Map<number, ChildProcess> = new Map();
|
|
@@ -62,7 +120,7 @@ export class HeadlessRunner {
|
|
|
62
120
|
stallKillMs: config.stallKillMs ?? 1_800_000,
|
|
63
121
|
stallAssessEnabled: config.stallAssessEnabled !== false,
|
|
64
122
|
stallMaxExtensions: config.stallMaxExtensions ?? 3,
|
|
65
|
-
stallHardCapMs: config.stallHardCapMs ??
|
|
123
|
+
stallHardCapMs: config.stallHardCapMs ?? 14_400_000,
|
|
66
124
|
model: config.model,
|
|
67
125
|
effortLevel: config.effortLevel,
|
|
68
126
|
toolTimeoutProfiles: config.toolTimeoutProfiles,
|
|
@@ -103,77 +161,13 @@ export class HeadlessRunner {
|
|
|
103
161
|
|
|
104
162
|
const result = await this.executePromptCommand(enrichedPrompt, 'main', 1);
|
|
105
163
|
|
|
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
|
-
};
|
|
164
|
+
if (result.exitCode === 0) {
|
|
165
|
+
return buildSuccessResult(sessionId, result);
|
|
158
166
|
}
|
|
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
|
-
};
|
|
167
|
+
if (isSignalExitWithOutput(result)) {
|
|
168
|
+
return buildSuccessResult(sessionId, result);
|
|
169
|
+
}
|
|
170
|
+
return buildErrorResult(sessionId, result);
|
|
177
171
|
}
|
|
178
172
|
|
|
179
173
|
/**
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
-
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
2
|
|
|
4
3
|
/**
|
|
5
4
|
* Stall Assessor — Two-layer stall detection (heuristic + Haiku AI).
|
|
@@ -139,7 +138,7 @@ function buildAssessmentPrompt(ctx: StallContext): string {
|
|
|
139
138
|
if (fromSkill) return fromSkill;
|
|
140
139
|
|
|
141
140
|
return [
|
|
142
|
-
'You are a process health monitor. A Claude Code subprocess has
|
|
141
|
+
'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
142
|
'',
|
|
144
143
|
`Silent for: ${silenceMin} minutes`,
|
|
145
144
|
`Total runtime: ${totalMin} minutes`,
|
|
@@ -150,10 +149,15 @@ function buildAssessmentPrompt(ctx: StallContext): string {
|
|
|
150
149
|
tokenLine,
|
|
151
150
|
`Task being executed: ${promptPreview}`,
|
|
152
151
|
'',
|
|
152
|
+
'Weigh BOTH silence and total runtime against task complexity.',
|
|
153
|
+
'- 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.',
|
|
154
|
+
'- 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.',
|
|
155
|
+
'- Recent token activity = process is alive; favor WORKING.',
|
|
156
|
+
'',
|
|
153
157
|
'Respond in EXACTLY this format (3 lines, no extra text):',
|
|
154
158
|
'VERDICT: WORKING or STALLED',
|
|
155
|
-
'MINUTES: <
|
|
156
|
-
'REASON: <brief one-line explanation>',
|
|
159
|
+
'MINUTES: <integer 5-180, only if WORKING, how many more minutes to allow>',
|
|
160
|
+
'REASON: <brief one-line explanation that references task complexity vs elapsed time>',
|
|
157
161
|
].filter(Boolean).join('\n');
|
|
158
162
|
}
|
|
159
163
|
|
|
@@ -169,7 +173,7 @@ function parseAssessmentResponse(output: string): StallVerdict {
|
|
|
169
173
|
verdict = trimmed.slice('VERDICT:'.length).trim().toUpperCase();
|
|
170
174
|
} else if (trimmed.startsWith('MINUTES:')) {
|
|
171
175
|
const parsed = parseInt(trimmed.slice('MINUTES:'.length).trim(), 10);
|
|
172
|
-
if (!Number.isNaN(parsed) && parsed >= 1 && parsed <=
|
|
176
|
+
if (!Number.isNaN(parsed) && parsed >= 1 && parsed <= 180) {
|
|
173
177
|
minutes = parsed;
|
|
174
178
|
}
|
|
175
179
|
} else if (trimmed.startsWith('REASON:')) {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
-
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
2
|
|
|
4
3
|
/**
|
|
5
4
|
* Headless Runner Types
|
|
@@ -108,7 +107,7 @@ export interface HeadlessConfig {
|
|
|
108
107
|
stallKillMs?: number; // No stdout before kill (default: 1800000 = 30 min)
|
|
109
108
|
stallAssessEnabled?: boolean; // Use Haiku to assess stalls (default: true)
|
|
110
109
|
stallMaxExtensions?: number; // Max number of Haiku-granted extensions (default: 3)
|
|
111
|
-
stallHardCapMs?: number; //
|
|
110
|
+
stallHardCapMs?: number; // Wall-clock backstop; only fires after stall signals have flagged the run (default: 14400000 = 4 h)
|
|
112
111
|
/** Claude model for main execution (e.g., 'opus', 'sonnet'). 'default' = no --model flag. */
|
|
113
112
|
model?: string;
|
|
114
113
|
/**
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Persistence helpers for improvisation session history.
|
|
5
|
+
*
|
|
6
|
+
* Resolves the `.mstro/history/<timestamp>.json` location for a session
|
|
7
|
+
* and reads/writes its JSON payload. No in-memory state — callers pass
|
|
8
|
+
* the current `SessionHistory` object.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { herror } from './headless/headless-logger.js';
|
|
14
|
+
import type { SessionHistory } from './improvisation-types.js';
|
|
15
|
+
|
|
16
|
+
export interface HistoryPaths {
|
|
17
|
+
improviseDir: string;
|
|
18
|
+
historyPath: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function resolveHistoryPaths(workingDir: string, sessionId: string): HistoryPaths {
|
|
22
|
+
const improviseDir = join(workingDir, '.mstro', 'history');
|
|
23
|
+
const historyPath = join(improviseDir, `${sessionId.replace('improv-', '')}.json`);
|
|
24
|
+
return { improviseDir, historyPath };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Create the `.mstro/history/` directory if missing. */
|
|
28
|
+
export function ensureHistoryDir(improviseDir: string): void {
|
|
29
|
+
if (!existsSync(improviseDir)) {
|
|
30
|
+
mkdirSync(improviseDir, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Load a session's history JSON. Returns a fresh empty history if the file
|
|
36
|
+
* doesn't exist or is unreadable (errors are logged but not thrown).
|
|
37
|
+
*/
|
|
38
|
+
export function loadHistory(historyPath: string, sessionId: string): SessionHistory {
|
|
39
|
+
if (existsSync(historyPath)) {
|
|
40
|
+
try {
|
|
41
|
+
const data = readFileSync(historyPath, 'utf-8');
|
|
42
|
+
return JSON.parse(data) as SessionHistory;
|
|
43
|
+
} catch (error) {
|
|
44
|
+
herror('Failed to load history:', error);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const now = new Date().toISOString();
|
|
48
|
+
return {
|
|
49
|
+
sessionId,
|
|
50
|
+
startedAt: now,
|
|
51
|
+
lastActivityAt: now,
|
|
52
|
+
totalTokens: 0,
|
|
53
|
+
movements: [],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Write history to disk after bumping `lastActivityAt`. */
|
|
58
|
+
export function saveHistory(historyPath: string, history: SessionHistory): void {
|
|
59
|
+
history.lastActivityAt = new Date().toISOString();
|
|
60
|
+
writeFileSync(historyPath, JSON.stringify(history, null, 2));
|
|
61
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Pure builders for the MovementRecord snapshots that session-manager
|
|
5
|
+
* writes after each executePrompt outcome — normal completion, user
|
|
6
|
+
* cancel, hard error — plus the auto-continue decision heuristic.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { HeadlessRunResult, MovementRecord, RetryLogEntry } from './improvisation-types.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Fallback `HeadlessRunResult` used when a cancellation fires before any
|
|
13
|
+
* run produces one. Shape matches the minimum fields the emit helpers
|
|
14
|
+
* look at downstream.
|
|
15
|
+
*/
|
|
16
|
+
export const CANCELLED_FALLBACK_RESULT: HeadlessRunResult = {
|
|
17
|
+
completed: false, needsHandoff: false, totalTokens: 0, sessionId: '',
|
|
18
|
+
output: '', exitCode: 1, signalName: 'SIGTERM',
|
|
19
|
+
} as HeadlessRunResult;
|
|
20
|
+
|
|
21
|
+
export interface MovementBuildArgs {
|
|
22
|
+
sequenceNumber: number;
|
|
23
|
+
userPrompt: string;
|
|
24
|
+
execStart: number;
|
|
25
|
+
isAutoContinue?: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Build a MovementRecord representing a successful execution. */
|
|
29
|
+
export function buildSuccessMovement(
|
|
30
|
+
result: HeadlessRunResult,
|
|
31
|
+
args: MovementBuildArgs,
|
|
32
|
+
retryLog: RetryLogEntry[] | undefined,
|
|
33
|
+
): MovementRecord {
|
|
34
|
+
return {
|
|
35
|
+
id: `prompt-${args.sequenceNumber}`,
|
|
36
|
+
sequenceNumber: args.sequenceNumber,
|
|
37
|
+
userPrompt: args.userPrompt,
|
|
38
|
+
timestamp: new Date().toISOString(),
|
|
39
|
+
tokensUsed: result.totalTokens,
|
|
40
|
+
summary: '',
|
|
41
|
+
filesModified: [],
|
|
42
|
+
assistantResponse: result.assistantResponse,
|
|
43
|
+
thinkingOutput: result.thinkingOutput,
|
|
44
|
+
toolUseHistory: result.toolUseHistory?.map(t => ({
|
|
45
|
+
toolName: t.toolName, toolId: t.toolId, toolInput: t.toolInput,
|
|
46
|
+
result: t.result, isError: t.isError, duration: t.duration,
|
|
47
|
+
})),
|
|
48
|
+
errorOutput: result.error,
|
|
49
|
+
durationMs: Date.now() - args.execStart,
|
|
50
|
+
retryLog: retryLog && retryLog.length > 0 ? retryLog : undefined,
|
|
51
|
+
...(args.isAutoContinue && { isAutoContinue: true }),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Build a MovementRecord representing a user-initiated cancel mid-run. */
|
|
56
|
+
export function buildCancelledMovement(
|
|
57
|
+
result: HeadlessRunResult | undefined,
|
|
58
|
+
args: MovementBuildArgs,
|
|
59
|
+
): MovementRecord {
|
|
60
|
+
return {
|
|
61
|
+
id: `prompt-${args.sequenceNumber}`,
|
|
62
|
+
sequenceNumber: args.sequenceNumber,
|
|
63
|
+
userPrompt: args.userPrompt,
|
|
64
|
+
timestamp: new Date().toISOString(),
|
|
65
|
+
tokensUsed: result ? result.totalTokens : 0,
|
|
66
|
+
summary: '',
|
|
67
|
+
filesModified: [],
|
|
68
|
+
assistantResponse: result?.assistantResponse,
|
|
69
|
+
thinkingOutput: result?.thinkingOutput,
|
|
70
|
+
toolUseHistory: result?.toolUseHistory?.map(t => ({
|
|
71
|
+
toolName: t.toolName, toolId: t.toolId, toolInput: t.toolInput,
|
|
72
|
+
result: t.result,
|
|
73
|
+
})),
|
|
74
|
+
errorOutput: 'Execution cancelled by user',
|
|
75
|
+
durationMs: Date.now() - args.execStart,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Build a MovementRecord for a thrown error inside executePrompt. */
|
|
80
|
+
export function buildErrorMovement(errorMessage: string, args: MovementBuildArgs): MovementRecord {
|
|
81
|
+
return {
|
|
82
|
+
id: `prompt-${args.sequenceNumber}`,
|
|
83
|
+
sequenceNumber: args.sequenceNumber,
|
|
84
|
+
userPrompt: args.userPrompt,
|
|
85
|
+
timestamp: new Date().toISOString(),
|
|
86
|
+
tokensUsed: 0,
|
|
87
|
+
summary: '',
|
|
88
|
+
filesModified: [],
|
|
89
|
+
errorOutput: errorMessage,
|
|
90
|
+
durationMs: Date.now() - args.execStart,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Heuristic for auto-continuing "end_turn" runs that appear incomplete:
|
|
96
|
+
* lots of thinking, not much visible output, and no tool work that
|
|
97
|
+
* already justifies the short response.
|
|
98
|
+
*/
|
|
99
|
+
export function shouldAutoContinue(
|
|
100
|
+
result: HeadlessRunResult,
|
|
101
|
+
autoContinueCount: number,
|
|
102
|
+
maxAutoContinues: number,
|
|
103
|
+
cancelled: boolean,
|
|
104
|
+
): boolean {
|
|
105
|
+
if (autoContinueCount >= maxAutoContinues) return false;
|
|
106
|
+
if (cancelled) return false;
|
|
107
|
+
if (!result.completed || result.signalName) return false;
|
|
108
|
+
if (result.stopReason !== 'end_turn') return false;
|
|
109
|
+
|
|
110
|
+
const thinkingLen = result.thinkingOutput?.length ?? 0;
|
|
111
|
+
const responseLen = result.assistantResponse?.length ?? 0;
|
|
112
|
+
const successfulToolCalls = result.toolUseHistory?.filter(t => t.result !== undefined && !t.isError).length ?? 0;
|
|
113
|
+
|
|
114
|
+
if (thinkingLen < 500 || responseLen > 1000) return false;
|
|
115
|
+
// When the agent executed tool calls and produced a non-trivial response,
|
|
116
|
+
// long thinking is expected — the work happened in the tools, not the text.
|
|
117
|
+
if (successfulToolCalls > 0 && responseLen > 200) return false;
|
|
118
|
+
return thinkingLen >= responseLen * 3;
|
|
119
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Small FIFO output buffer with a fixed-interval flush timer, used by the
|
|
5
|
+
* improvisation session manager to coalesce rapid stdout writes into
|
|
6
|
+
* steady `onOutput` emissions.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const FLUSH_INTERVAL_MS = 50;
|
|
10
|
+
|
|
11
|
+
export class OutputQueue {
|
|
12
|
+
private queue: Array<{ text: string; timestamp: number }> = [];
|
|
13
|
+
private timer: NodeJS.Timeout | null = null;
|
|
14
|
+
|
|
15
|
+
constructor(private readonly onEmit: (text: string) => void) {}
|
|
16
|
+
|
|
17
|
+
start(): void {
|
|
18
|
+
if (this.timer) return;
|
|
19
|
+
this.timer = setInterval(() => { this.flush(); }, FLUSH_INTERVAL_MS);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
queue_(text: string): void {
|
|
23
|
+
this.queue.push({ text, timestamp: Date.now() });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Drain all buffered entries, emitting each via `onEmit` in order. */
|
|
27
|
+
flush(): void {
|
|
28
|
+
while (this.queue.length > 0) {
|
|
29
|
+
const item = this.queue.shift();
|
|
30
|
+
if (item) this.onEmit(item.text);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Stop the flush timer. Does NOT drain; call `flush()` first if needed. */
|
|
35
|
+
destroy(): void {
|
|
36
|
+
if (this.timer) {
|
|
37
|
+
clearInterval(this.timer);
|
|
38
|
+
this.timer = null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|