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
package/server/routes/index.ts
CHANGED
package/server/server-setup.ts
CHANGED
|
@@ -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
|
* Server Setup Utilities — Helpers for the main server entry point.
|
|
@@ -9,8 +8,13 @@
|
|
|
9
8
|
*/
|
|
10
9
|
|
|
11
10
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
|
|
11
|
+
import type { IncomingMessage } from 'node:http'
|
|
12
12
|
import { basename, join } from 'node:path'
|
|
13
|
-
import type { WebSocket as NodeWebSocket } from 'ws'
|
|
13
|
+
import type { WebSocket as NodeWebSocket, WebSocketServer } from 'ws'
|
|
14
|
+
import type { AuthService } from './services/auth.js'
|
|
15
|
+
import { PlatformConnection } from './services/platform.js'
|
|
16
|
+
import { captureException } from './services/sentry.js'
|
|
17
|
+
import type { WebSocketImproviseHandler } from './services/websocket/index.js'
|
|
14
18
|
import type { WSContext } from './services/websocket/types.js'
|
|
15
19
|
|
|
16
20
|
/**
|
|
@@ -112,3 +116,123 @@ export function createPlatformRelayContext(
|
|
|
112
116
|
_isPlatformRelay: true
|
|
113
117
|
} as WSContext
|
|
114
118
|
}
|
|
119
|
+
|
|
120
|
+
/** Strip the privileged `_permission` field from inbound local messages. */
|
|
121
|
+
function sanitizeLocalMessage(raw: Buffer | string): string {
|
|
122
|
+
const message = typeof raw === 'string' ? raw : raw.toString('utf-8')
|
|
123
|
+
if (!message.includes('_permission')) return message
|
|
124
|
+
try {
|
|
125
|
+
const parsed = JSON.parse(message)
|
|
126
|
+
if ('_permission' in parsed) {
|
|
127
|
+
delete parsed._permission
|
|
128
|
+
return JSON.stringify(parsed)
|
|
129
|
+
}
|
|
130
|
+
} catch { /* not JSON — pass through */ }
|
|
131
|
+
return message
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** Attach the local WebSocket connection handler to the WebSocketServer. */
|
|
135
|
+
export function attachLocalWebSocketRouting(opts: {
|
|
136
|
+
wss: WebSocketServer
|
|
137
|
+
port: number
|
|
138
|
+
workingDir: string
|
|
139
|
+
authService: AuthService
|
|
140
|
+
wsHandler: WebSocketImproviseHandler
|
|
141
|
+
}): void {
|
|
142
|
+
const { wss, port, workingDir, authService, wsHandler } = opts
|
|
143
|
+
|
|
144
|
+
wss.on('connection', (ws: NodeWebSocket, req: IncomingMessage) => {
|
|
145
|
+
const url = new URL(req.url || '/', `http://localhost:${port}`)
|
|
146
|
+
if (url.pathname !== '/ws') {
|
|
147
|
+
ws.close(1008, 'Invalid WebSocket path')
|
|
148
|
+
return
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const wsToken = url.searchParams.get('token')
|
|
152
|
+
if (!wsToken || !authService.validateLocalToken(wsToken)) {
|
|
153
|
+
ws.close(4001, 'Unauthorized')
|
|
154
|
+
return
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const wrappedWs = wrapWebSocket(ws, workingDir)
|
|
158
|
+
wsHandler.handleConnection(wrappedWs, workingDir)
|
|
159
|
+
|
|
160
|
+
ws.on('message', (data: Buffer | string) => {
|
|
161
|
+
wsHandler.handleMessage(wrappedWs, sanitizeLocalMessage(data), workingDir)
|
|
162
|
+
})
|
|
163
|
+
ws.on('close', () => wsHandler.handleClose(wrappedWs))
|
|
164
|
+
ws.on('error', (error: Error) => {
|
|
165
|
+
console.error('[WebSocket] Error:', error)
|
|
166
|
+
captureException(error, { context: 'websocket.connection' })
|
|
167
|
+
})
|
|
168
|
+
})
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** Connect to the platform relay and wire up message bridging to the local wsHandler. */
|
|
172
|
+
export function createPlatformRelay(workingDir: string, wsHandler: WebSocketImproviseHandler): PlatformConnection {
|
|
173
|
+
let platformRelayContext: WSContext | null = null
|
|
174
|
+
let pendingRelayMessages: unknown[] = []
|
|
175
|
+
|
|
176
|
+
const platformConnection = new PlatformConnection(workingDir, {
|
|
177
|
+
onConnected: () => {
|
|
178
|
+
console.log(`Connected: https://mstro.app`)
|
|
179
|
+
wsHandler.setUsageReporter((report) => {
|
|
180
|
+
platformConnection.send({ type: 'reportUsage', data: report })
|
|
181
|
+
})
|
|
182
|
+
},
|
|
183
|
+
onDisconnected: () => {
|
|
184
|
+
if (platformRelayContext) {
|
|
185
|
+
wsHandler.handleClose(platformRelayContext)
|
|
186
|
+
platformRelayContext = null
|
|
187
|
+
}
|
|
188
|
+
pendingRelayMessages = []
|
|
189
|
+
},
|
|
190
|
+
onWebConnected: () => {
|
|
191
|
+
if (platformRelayContext) {
|
|
192
|
+
wsHandler.handleClose(platformRelayContext)
|
|
193
|
+
}
|
|
194
|
+
platformRelayContext = createPlatformRelayContext(
|
|
195
|
+
(message) => platformConnection.send(message),
|
|
196
|
+
workingDir
|
|
197
|
+
)
|
|
198
|
+
wsHandler.handleConnection(platformRelayContext, workingDir)
|
|
199
|
+
if (pendingRelayMessages.length > 0) {
|
|
200
|
+
for (const message of pendingRelayMessages) {
|
|
201
|
+
wsHandler.handleMessage(platformRelayContext, JSON.stringify(message), workingDir)
|
|
202
|
+
}
|
|
203
|
+
pendingRelayMessages = []
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
onWebDisconnected: () => {
|
|
207
|
+
if (platformRelayContext) {
|
|
208
|
+
wsHandler.handleClose(platformRelayContext)
|
|
209
|
+
platformRelayContext = null
|
|
210
|
+
}
|
|
211
|
+
pendingRelayMessages = []
|
|
212
|
+
},
|
|
213
|
+
onRelayedMessage: (message) => {
|
|
214
|
+
if (platformRelayContext) {
|
|
215
|
+
wsHandler.handleMessage(platformRelayContext, JSON.stringify(message), workingDir)
|
|
216
|
+
} else {
|
|
217
|
+
// Cap pending messages to prevent unbounded memory growth while disconnected
|
|
218
|
+
if (pendingRelayMessages.length < 100) {
|
|
219
|
+
pendingRelayMessages.push(message)
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
})
|
|
224
|
+
platformConnection.connect()
|
|
225
|
+
return platformConnection
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/** Install process-level error handlers that capture to Sentry. */
|
|
229
|
+
export function registerProcessErrorHandlers(): void {
|
|
230
|
+
process.on('uncaughtException', (err) => {
|
|
231
|
+
console.error('[Server] Uncaught exception:', err)
|
|
232
|
+
captureException(err, { context: 'uncaughtException' })
|
|
233
|
+
})
|
|
234
|
+
process.on('unhandledRejection', (reason) => {
|
|
235
|
+
console.error('[Server] Unhandled rejection:', reason)
|
|
236
|
+
captureException(reason instanceof Error ? reason : new Error(String(reason)), { context: 'unhandledRejection' })
|
|
237
|
+
})
|
|
238
|
+
}
|
package/server/services/auth.ts
CHANGED
package/server/services/files.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: assess-stall
|
|
3
|
-
description: "Process health monitor that determines if a Claude Code subprocess is working or stalled based on silence duration, tool activity, and task
|
|
3
|
+
description: "Process health monitor that determines if a Claude Code subprocess is working or stalled based on silence duration, total elapsed runtime, tool activity, and task complexity. Internal Haiku assessment."
|
|
4
4
|
user-invocable: false
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
You are a process health monitor. A Claude Code subprocess has
|
|
7
|
+
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.
|
|
8
8
|
|
|
9
9
|
Silent for: {{silenceMin}} minutes
|
|
10
10
|
Total runtime: {{totalMin}} minutes
|
|
@@ -15,7 +15,14 @@ Total tool calls this session: {{totalToolCalls}}
|
|
|
15
15
|
{{tokenLine}}
|
|
16
16
|
Task being executed: {{promptPreview}}
|
|
17
17
|
|
|
18
|
+
Weigh BOTH silence and total runtime against task complexity.
|
|
19
|
+
|
|
20
|
+
- Simple tasks (single Read/Write, one-liner edit, `ls` a directory, trivial greps) should finish in a minute or two. If total runtime has already far exceeded what the task should need, verdict STALLED even if silence is short — something has clearly gone wrong.
|
|
21
|
+
- Complex tasks (agent teams with subagents, multi-step migrations, large refactors, dependency installs, board implementations) can legitimately run for hours. Extend generously when pending tool activity, subagents, or the prompt itself justify a long run.
|
|
22
|
+
- Recent token activity (see token line above) = process is alive and streaming; strongly favor WORKING.
|
|
23
|
+
- Absence of any tool calls + long runtime + no token activity = strong STALLED signal.
|
|
24
|
+
|
|
18
25
|
Respond in EXACTLY this format (3 lines, no extra text):
|
|
19
26
|
VERDICT: WORKING or STALLED
|
|
20
|
-
MINUTES: <
|
|
21
|
-
REASON: <brief one-line explanation>
|
|
27
|
+
MINUTES: <integer 5-180, only if WORKING, how many more minutes to allow>
|
|
28
|
+
REASON: <brief one-line explanation that references task complexity vs elapsed time>
|
|
@@ -74,14 +74,19 @@ For each finding, use this reasoning process:
|
|
|
74
74
|
|
|
75
75
|
## Scoring Guidelines
|
|
76
76
|
|
|
77
|
-
|
|
78
|
-
- **A (90-100)**: Excellent — clean architecture, minimal issues, well-tested, follows best practices
|
|
79
|
-
- **B (80-89)**: Good — solid code with minor issues, mostly well-structured
|
|
80
|
-
- **C (70-79)**: Adequate — functional but has notable quality issues that should be addressed
|
|
81
|
-
- **D (60-69)**: Below average — significant issues in architecture, testing, or code quality
|
|
82
|
-
- **F (0-59)**: Poor — serious problems: security vulnerabilities, broken architecture, major bugs, or unmaintainable code
|
|
77
|
+
The overall grade is computed deterministically from your findings, not from a number you supply. Severity and category on each finding are what drive the grade — pick them carefully.
|
|
83
78
|
|
|
84
|
-
|
|
79
|
+
Three independent dimension grades are computed:
|
|
80
|
+
|
|
81
|
+
- **Security** (category: `security`) — uses a severity-threshold rule: A = 0 findings, B = only low, C = ≥1 medium, D = ≥1 high, F = ≥1 critical.
|
|
82
|
+
- **Reliability** (categories: `bugs`, `logic`, `performance`) — severity-threshold rule, slightly more lenient: A = 0 findings or ≤1 low, B = ≥2 low or ≤2 medium, C = ≥3 medium or ≥1 high, D = ≥2 high, F = ≥1 critical.
|
|
83
|
+
- **Maintainability** (categories: `architecture`, `oop`, `maintainability`) — density-based (issues per 1000 lines), with a severity escape hatch: any high finding caps at C, any critical caps at D.
|
|
84
|
+
|
|
85
|
+
Overall grade = the worst of the three dimensions. A single critical security finding caps the entire codebase at F.
|
|
86
|
+
|
|
87
|
+
This means **severity is load-bearing**: marking something `high` when it's really `low` will swing the grade unfairly. When in doubt, downgrade. A finding without clear evidence of harm is `low`.
|
|
88
|
+
|
|
89
|
+
You may still emit `score`, `grade`, and `scoreRationale` for reference — they are persisted but ignored when computing the displayed grade. Focus your effort on accurate findings, not on guessing the overall number.
|
|
85
90
|
|
|
86
91
|
## Output
|
|
87
92
|
|
|
@@ -89,13 +94,10 @@ After your analysis, output EXACTLY one JSON code block with your findings. No o
|
|
|
89
94
|
|
|
90
95
|
```json
|
|
91
96
|
{
|
|
92
|
-
"score": 72,
|
|
93
|
-
"grade": "C",
|
|
94
|
-
"scoreRationale": "Brief explanation of why this score was given, referencing key issues",
|
|
95
97
|
"findings": [
|
|
96
98
|
{
|
|
97
99
|
"severity": "critical|high|medium|low",
|
|
98
|
-
"category": "architecture|oop|security|bugs|performance|logic",
|
|
100
|
+
"category": "architecture|oop|security|bugs|performance|logic|maintainability",
|
|
99
101
|
"file": "relative/path/to/file.ts",
|
|
100
102
|
"line": 42,
|
|
101
103
|
"title": "Short title describing the issue",
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Board configuration helpers: read board.md + workspace.json settings
|
|
5
|
+
* used by the plan executor (max parallel agents, review criteria,
|
|
6
|
+
* active board resolution, board activation/completion).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
10
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { replaceFrontMatterField } from './front-matter.js';
|
|
13
|
+
|
|
14
|
+
/** Emits a warning message — caller typically maps this to executor 'output' events. */
|
|
15
|
+
export type WarnFn = (message: string) => void;
|
|
16
|
+
|
|
17
|
+
export const DEFAULT_MAX_PARALLEL_AGENTS = 3;
|
|
18
|
+
|
|
19
|
+
/** Read the board's maxParallelAgents setting, falling back to default. */
|
|
20
|
+
export async function getBoardMaxParallelAgents(
|
|
21
|
+
pmDir: string | null,
|
|
22
|
+
boardId: string | null,
|
|
23
|
+
warn: WarnFn,
|
|
24
|
+
): Promise<number> {
|
|
25
|
+
if (!pmDir || !boardId) return DEFAULT_MAX_PARALLEL_AGENTS;
|
|
26
|
+
const boardMdPath = join(pmDir, 'boards', boardId, 'board.md');
|
|
27
|
+
if (!existsSync(boardMdPath)) return DEFAULT_MAX_PARALLEL_AGENTS;
|
|
28
|
+
try {
|
|
29
|
+
const content = await readFile(boardMdPath, 'utf-8');
|
|
30
|
+
const match = content.match(/^max_parallel_agents:\s*(\d+)/m);
|
|
31
|
+
return match ? Math.max(1, Math.min(Number(match[1]), 10)) : DEFAULT_MAX_PARALLEL_AGENTS;
|
|
32
|
+
} catch (err) {
|
|
33
|
+
warn(`Warning: failed to read board max_parallel_agents: ${errMsg(err)}`);
|
|
34
|
+
return DEFAULT_MAX_PARALLEL_AGENTS;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Read the board's custom review criteria, if set. */
|
|
39
|
+
export async function getBoardReviewCriteria(
|
|
40
|
+
pmDir: string | null,
|
|
41
|
+
boardId: string | null,
|
|
42
|
+
warn: WarnFn,
|
|
43
|
+
): Promise<string | undefined> {
|
|
44
|
+
if (!pmDir || !boardId) return undefined;
|
|
45
|
+
const boardMdPath = join(pmDir, 'boards', boardId, 'board.md');
|
|
46
|
+
if (!existsSync(boardMdPath)) return undefined;
|
|
47
|
+
try {
|
|
48
|
+
const content = await readFile(boardMdPath, 'utf-8');
|
|
49
|
+
const match = content.match(/^review_criteria:\s*"(.+)"/m);
|
|
50
|
+
if (!match) return undefined;
|
|
51
|
+
const raw = match[1].replace(/\\"/g, '"').replace(/\\n/g, '\n').trim();
|
|
52
|
+
return raw || undefined;
|
|
53
|
+
} catch (err) {
|
|
54
|
+
warn(`Warning: failed to read board review criteria: ${errMsg(err)}`);
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Read workspace.json to find the currently active board. */
|
|
60
|
+
export function resolveActiveBoardId(pmDir: string | null): string | null {
|
|
61
|
+
if (!pmDir) return null;
|
|
62
|
+
try {
|
|
63
|
+
const workspacePath = join(pmDir, 'workspace.json');
|
|
64
|
+
if (!existsSync(workspacePath)) return null;
|
|
65
|
+
const workspace = JSON.parse(readFileSync(workspacePath, 'utf-8'));
|
|
66
|
+
return workspace.activeBoardId ?? null;
|
|
67
|
+
} catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Resolve the active board's directory path. */
|
|
73
|
+
export function resolveBoardDir(pmDir: string | null, boardId: string | null): string | null {
|
|
74
|
+
if (!pmDir) return null;
|
|
75
|
+
const effective = boardId ?? resolveActiveBoardId(pmDir);
|
|
76
|
+
if (!effective) return null;
|
|
77
|
+
const boardDir = join(pmDir, 'boards', effective);
|
|
78
|
+
return existsSync(boardDir) ? boardDir : null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Activate a draft board by updating its status in board.md. */
|
|
82
|
+
export async function activateBoard(pmDir: string, boardId: string, warn: WarnFn): Promise<void> {
|
|
83
|
+
const boardMdPath = join(pmDir, 'boards', boardId, 'board.md');
|
|
84
|
+
if (!existsSync(boardMdPath)) return;
|
|
85
|
+
try {
|
|
86
|
+
const content = await readFile(boardMdPath, 'utf-8');
|
|
87
|
+
await writeFile(boardMdPath, replaceFrontMatterField(content, 'status', 'active'), 'utf-8');
|
|
88
|
+
} catch (err) {
|
|
89
|
+
warn(`Warning: failed to activate board ${boardId}: ${errMsg(err)}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Mark a board as completed iff all its issues are `done` or `cancelled`.
|
|
95
|
+
* No-op when the board is not fully complete.
|
|
96
|
+
*/
|
|
97
|
+
export async function tryCompleteBoardIfDone(
|
|
98
|
+
pmDir: string,
|
|
99
|
+
boardId: string,
|
|
100
|
+
issues: { status: string }[],
|
|
101
|
+
warn: WarnFn,
|
|
102
|
+
): Promise<void> {
|
|
103
|
+
const allDone = issues.length > 0 && issues.every(i => i.status === 'done' || i.status === 'cancelled');
|
|
104
|
+
if (!allDone) return;
|
|
105
|
+
|
|
106
|
+
const boardMdPath = join(pmDir, 'boards', boardId, 'board.md');
|
|
107
|
+
if (!existsSync(boardMdPath)) return;
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
let content = await readFile(boardMdPath, 'utf-8');
|
|
111
|
+
content = replaceFrontMatterField(content, 'status', 'completed');
|
|
112
|
+
content = replaceFrontMatterField(content, 'completed_at', `"${new Date().toISOString()}"`);
|
|
113
|
+
await writeFile(boardMdPath, content, 'utf-8');
|
|
114
|
+
} catch (err) {
|
|
115
|
+
warn(`Warning: failed to mark board ${boardId} as completed: ${errMsg(err)}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function errMsg(err: unknown): string {
|
|
120
|
+
return err instanceof Error ? err.message : String(err);
|
|
121
|
+
}
|
|
@@ -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
|
* Plan Composer — Handles natural language prompts for PPS creation/editing.
|
|
@@ -156,7 +155,7 @@ Backlog directory: ${pmDir}/boards/${effectiveBoardId}/backlog/\n`;
|
|
|
156
155
|
|
|
157
156
|
export async function handlePlanPrompt(
|
|
158
157
|
ctx: HandlerContext,
|
|
159
|
-
|
|
158
|
+
_ws: WSContext,
|
|
160
159
|
userPrompt: string,
|
|
161
160
|
workingDir: string,
|
|
162
161
|
boardId?: string,
|
|
@@ -301,11 +300,13 @@ User request: ${userPrompt}`;
|
|
|
301
300
|
policy: 'STANDARD',
|
|
302
301
|
stallWarningMs: 300_000,
|
|
303
302
|
stallKillMs: 900_000,
|
|
304
|
-
stallHardCapMs:
|
|
303
|
+
stallHardCapMs: 7_200_000,
|
|
305
304
|
verbose: true,
|
|
306
305
|
imageAttachments,
|
|
307
306
|
outputCallback: (text: string) => {
|
|
308
|
-
ctx.send
|
|
307
|
+
// Broadcast (not ctx.send) so the stream survives a relay reconnect
|
|
308
|
+
// and reaches every paired web client; mirrors session-handlers.ts.
|
|
309
|
+
ctx.broadcastToAll({
|
|
309
310
|
type: 'planPromptStreaming',
|
|
310
311
|
data: { token: text, boardId: streamBoardId },
|
|
311
312
|
});
|
|
@@ -338,7 +339,7 @@ User request: ${userPrompt}`;
|
|
|
338
339
|
data: { message: 'Finalizing project plan...', boardId: streamBoardId },
|
|
339
340
|
});
|
|
340
341
|
|
|
341
|
-
ctx.
|
|
342
|
+
ctx.broadcastToAll({
|
|
342
343
|
type: 'planPromptResponse',
|
|
343
344
|
data: {
|
|
344
345
|
response: result.completed ? 'Prompt executed successfully.' : (result.error || 'Unknown error'),
|
|
@@ -354,7 +355,7 @@ User request: ${userPrompt}`;
|
|
|
354
355
|
ctx.broadcastToAll({ type: 'planStateUpdated', data: updatedState });
|
|
355
356
|
}
|
|
356
357
|
} catch (error) {
|
|
357
|
-
ctx.
|
|
358
|
+
ctx.broadcastToAll({
|
|
358
359
|
type: 'planError',
|
|
359
360
|
data: { error: error instanceof Error ? error.message : String(error), boardId: streamBoardId },
|
|
360
361
|
});
|