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
|
* Session Registry — Persistent tab-to-session mapping
|
|
@@ -21,6 +20,13 @@ export interface RegisteredTab {
|
|
|
21
20
|
lastActivityAt: string
|
|
22
21
|
order: number
|
|
23
22
|
hasUnviewedCompletion: boolean
|
|
23
|
+
/**
|
|
24
|
+
* True once the session's history file has existed on disk (first prompt
|
|
25
|
+
* ran, or the tab was resumed from an existing file). Guards `sweepGhostTabs`
|
|
26
|
+
* so brand-new tabs that haven't had a first prompt are not confused with
|
|
27
|
+
* tabs whose history file was deleted.
|
|
28
|
+
*/
|
|
29
|
+
hasPersistedHistory?: boolean
|
|
24
30
|
worktreePath?: string
|
|
25
31
|
worktreeBranch?: string
|
|
26
32
|
}
|
|
@@ -31,6 +37,7 @@ interface RegistryData {
|
|
|
31
37
|
|
|
32
38
|
export class SessionRegistry {
|
|
33
39
|
private registryPath: string
|
|
40
|
+
private historyDir: string
|
|
34
41
|
private data: RegistryData
|
|
35
42
|
|
|
36
43
|
constructor(workingDir: string) {
|
|
@@ -39,7 +46,9 @@ export class SessionRegistry {
|
|
|
39
46
|
mkdirSync(mstroDir, { recursive: true })
|
|
40
47
|
}
|
|
41
48
|
this.registryPath = join(mstroDir, 'session-registry.json')
|
|
49
|
+
this.historyDir = join(mstroDir, 'history')
|
|
42
50
|
this.data = this.load()
|
|
51
|
+
this.sweepGhostTabs()
|
|
43
52
|
}
|
|
44
53
|
|
|
45
54
|
private load(): RegistryData {
|
|
@@ -68,6 +77,36 @@ export class SessionRegistry {
|
|
|
68
77
|
return { tabs: {} }
|
|
69
78
|
}
|
|
70
79
|
|
|
80
|
+
/**
|
|
81
|
+
* Drop registry entries whose backing history file no longer exists.
|
|
82
|
+
*
|
|
83
|
+
* The history file may have been deleted via `clearHistory`, pruned by the
|
|
84
|
+
* user, or lost on disk. Without a sweep, `getActiveTabs` returns the tab
|
|
85
|
+
* to the web, the web tries to `initTab` it, `resumeFromHistory` throws,
|
|
86
|
+
* and the tab re-creates as an empty new session — confusing the user with
|
|
87
|
+
* a "restored" tab that lost its content.
|
|
88
|
+
*
|
|
89
|
+
* Only sweeps tabs that were previously persisted (`hasPersistedHistory`).
|
|
90
|
+
* Tabs that have never had a first prompt have no file on disk by design;
|
|
91
|
+
* removing them here would wipe a freshly opened tab after a CLI restart.
|
|
92
|
+
*/
|
|
93
|
+
private sweepGhostTabs(): void {
|
|
94
|
+
const removed: string[] = []
|
|
95
|
+
for (const [tabId, tab] of Object.entries(this.data.tabs)) {
|
|
96
|
+
if (tab.hasPersistedHistory !== true) continue
|
|
97
|
+
const timestamp = tab.sessionId.replace('improv-', '')
|
|
98
|
+
const historyPath = join(this.historyDir, `${timestamp}.json`)
|
|
99
|
+
if (!existsSync(historyPath)) {
|
|
100
|
+
removed.push(tabId)
|
|
101
|
+
delete this.data.tabs[tabId]
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (removed.length > 0) {
|
|
105
|
+
console.log(`[SessionRegistry] Swept ${removed.length} ghost tab(s) whose history file was missing`)
|
|
106
|
+
this.save()
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
71
110
|
private save(): void {
|
|
72
111
|
try {
|
|
73
112
|
writeFileSync(this.registryPath, JSON.stringify(this.data, null, 2))
|
|
@@ -86,13 +125,16 @@ export class SessionRegistry {
|
|
|
86
125
|
|
|
87
126
|
registerTab(tabId: string, sessionId: string, tabName?: string): void {
|
|
88
127
|
const now = new Date().toISOString()
|
|
128
|
+
const existing = this.data.tabs[tabId]
|
|
129
|
+
const sessionChanged = existing?.sessionId !== sessionId
|
|
89
130
|
this.data.tabs[tabId] = {
|
|
90
131
|
sessionId,
|
|
91
132
|
tabName: tabName || `Chat ${this.getNextChatNumber()}`,
|
|
92
|
-
createdAt:
|
|
133
|
+
createdAt: existing?.createdAt || now,
|
|
93
134
|
lastActivityAt: now,
|
|
94
|
-
order:
|
|
95
|
-
hasUnviewedCompletion:
|
|
135
|
+
order: existing?.order ?? this.getNextOrder(),
|
|
136
|
+
hasUnviewedCompletion: existing?.hasUnviewedCompletion ?? false,
|
|
137
|
+
hasPersistedHistory: sessionChanged ? false : existing?.hasPersistedHistory,
|
|
96
138
|
}
|
|
97
139
|
this.save()
|
|
98
140
|
}
|
|
@@ -145,12 +187,26 @@ export class SessionRegistry {
|
|
|
145
187
|
}
|
|
146
188
|
|
|
147
189
|
/**
|
|
148
|
-
* Update session ID for a tab (e.g., when "new session" is started)
|
|
190
|
+
* Update session ID for a tab (e.g., when "new session" is started).
|
|
191
|
+
* Resets `hasPersistedHistory` since the new session has no file on disk yet.
|
|
149
192
|
*/
|
|
150
193
|
updateTabSession(tabId: string, sessionId: string): void {
|
|
151
194
|
if (this.data.tabs[tabId]) {
|
|
152
195
|
this.data.tabs[tabId].sessionId = sessionId
|
|
153
196
|
this.data.tabs[tabId].lastActivityAt = new Date().toISOString()
|
|
197
|
+
this.data.tabs[tabId].hasPersistedHistory = false
|
|
198
|
+
this.save()
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Mark a tab as having persisted its history to disk. Called after the
|
|
204
|
+
* first `persistHistory` or when an existing file is resumed.
|
|
205
|
+
*/
|
|
206
|
+
markTabPersisted(tabId: string): void {
|
|
207
|
+
const tab = this.data.tabs[tabId]
|
|
208
|
+
if (tab && !tab.hasPersistedHistory) {
|
|
209
|
+
tab.hasPersistedHistory = true
|
|
154
210
|
this.save()
|
|
155
211
|
}
|
|
156
212
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Tab-scoped broadcast helper.
|
|
5
|
+
*
|
|
6
|
+
* Session and plan handlers emit streaming events that (a) fan out to all
|
|
7
|
+
* paired web clients and (b) need to survive transport reconnects. Instead of
|
|
8
|
+
* every call site knowing about both concerns, route through
|
|
9
|
+
* `broadcastTabEvent`: it assigns the next monotonic `seq` via the tab's
|
|
10
|
+
* event buffer and broadcasts the wire message with that seq attached.
|
|
11
|
+
*
|
|
12
|
+
* Receiving webs record the seq and ask for replay starting from their
|
|
13
|
+
* highest-seen seq the next time they `initTab` / `resumeSession`. See
|
|
14
|
+
* `tab-event-buffer.ts` for the buffer itself and
|
|
15
|
+
* `session-initialization.ts` for the replay path.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { HandlerContext } from './handler-context.js'
|
|
19
|
+
import type { WebSocketResponse } from './types.js'
|
|
20
|
+
|
|
21
|
+
type TabScopedEventType = WebSocketResponse['type']
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Record + broadcast a tab-scoped event in one call. Returns the assigned
|
|
25
|
+
* sequence number purely for logging/tests — callers rarely need it.
|
|
26
|
+
*/
|
|
27
|
+
export function broadcastTabEvent(
|
|
28
|
+
ctx: HandlerContext,
|
|
29
|
+
tabId: string,
|
|
30
|
+
type: TabScopedEventType,
|
|
31
|
+
data: unknown,
|
|
32
|
+
): number {
|
|
33
|
+
const buffer = ctx.tabEventBuffers.getOrCreate(tabId)
|
|
34
|
+
const seq = buffer.record(type, data)
|
|
35
|
+
ctx.broadcastToAll({ type, tabId, data, seq })
|
|
36
|
+
return seq
|
|
37
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Tab event buffer — monotonic, bounded replay log for tab-scoped broadcasts.
|
|
5
|
+
*
|
|
6
|
+
* ## Why it exists
|
|
7
|
+
*
|
|
8
|
+
* The platform relay only fans out broadcasts to webs currently paired to the
|
|
9
|
+
* CLI's connection key. During a CLI-side platform reconnect the CLI's key
|
|
10
|
+
* rotates (new `connectionId`) and any web whose transport was pointing at
|
|
11
|
+
* the old key sees no events until it completes its own reconnect handshake.
|
|
12
|
+
* The `executionEventLog` on the session manager covers in-flight execution,
|
|
13
|
+
* but smaller lifecycle events — `movementStart`, `movementComplete`,
|
|
14
|
+
* `tabStateChanged`, `sessionUpdate`, approve/reject acknowledgements — can
|
|
15
|
+
* land in that dark window and be lost.
|
|
16
|
+
*
|
|
17
|
+
* This buffer records every tab-scoped broadcast with a monotonic per-tab
|
|
18
|
+
* `seq`. When the web sends `initTab` / `resumeSession` with its
|
|
19
|
+
* `lastSeenSeq`, we replay anything newer before emitting `tabInitialized`.
|
|
20
|
+
*
|
|
21
|
+
* ## Design choices
|
|
22
|
+
*
|
|
23
|
+
* - **Bounded by both count and age** so a long-idle tab doesn't keep ancient
|
|
24
|
+
* events forever, and a chatty session doesn't balloon memory. The limits
|
|
25
|
+
* are intentionally generous: 1000 events + 15 minutes covers a typical
|
|
26
|
+
* reconnect window by orders of magnitude, and events are small objects.
|
|
27
|
+
* - **Per-tab registry, not per-session** because the web identifies replay
|
|
28
|
+
* targets by `tabId`, which is stable across `new` (sessionId rotates, tab
|
|
29
|
+
* doesn't).
|
|
30
|
+
* - **No sequencing gaps**: `nextSeq` strictly increments, even when the
|
|
31
|
+
* buffer drops old events. The web compares `seq > lastSeenSeq`, so stale
|
|
32
|
+
* numbering below the window is fine — everything the web hasn't seen yet
|
|
33
|
+
* has a larger seq.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
export interface BufferedEvent {
|
|
37
|
+
/** Monotonic per-tab sequence (1-based). */
|
|
38
|
+
seq: number
|
|
39
|
+
/** Wire message type, e.g. `output`, `thinking`, `movementComplete`. */
|
|
40
|
+
type: string
|
|
41
|
+
/** Opaque payload for the wire message. */
|
|
42
|
+
data: unknown
|
|
43
|
+
/** `Date.now()` at record time. Used for age-based eviction. */
|
|
44
|
+
timestamp: number
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Bounded replay log for a single tab.
|
|
49
|
+
*
|
|
50
|
+
* Size/age limits are parameterised for testability but defaulted to values
|
|
51
|
+
* that comfortably cover real-world reconnect windows.
|
|
52
|
+
*/
|
|
53
|
+
export class TabEventBuffer {
|
|
54
|
+
private readonly events: BufferedEvent[] = []
|
|
55
|
+
private nextSeq = 1
|
|
56
|
+
|
|
57
|
+
constructor(
|
|
58
|
+
private readonly maxEvents: number = DEFAULT_MAX_EVENTS,
|
|
59
|
+
private readonly maxAgeMs: number = DEFAULT_MAX_AGE_MS,
|
|
60
|
+
private readonly now: () => number = Date.now,
|
|
61
|
+
) {}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Append an event and return its assigned sequence number.
|
|
65
|
+
*
|
|
66
|
+
* Callers include the returned `seq` on the outgoing wire message so the
|
|
67
|
+
* web can record it and ask for replay starting after that seq on a
|
|
68
|
+
* subsequent reconnect.
|
|
69
|
+
*/
|
|
70
|
+
record(type: string, data: unknown): number {
|
|
71
|
+
const seq = this.nextSeq++
|
|
72
|
+
this.events.push({ seq, type, data, timestamp: this.now() })
|
|
73
|
+
this.evict()
|
|
74
|
+
return seq
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Return all still-buffered events with `seq > afterSeq`, in original
|
|
79
|
+
* order. Returns an empty array if nothing newer is buffered (either the
|
|
80
|
+
* web is caught up or the window has rolled past).
|
|
81
|
+
*/
|
|
82
|
+
getSince(afterSeq: number): BufferedEvent[] {
|
|
83
|
+
this.evict()
|
|
84
|
+
const out: BufferedEvent[] = []
|
|
85
|
+
for (const event of this.events) {
|
|
86
|
+
if (event.seq > afterSeq) out.push(event)
|
|
87
|
+
}
|
|
88
|
+
return out
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Current highest assigned seq (monotonic; not reset by eviction). */
|
|
92
|
+
currentSeq(): number {
|
|
93
|
+
return this.nextSeq - 1
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Events currently held in memory. For tests. */
|
|
97
|
+
size(): number {
|
|
98
|
+
return this.events.length
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Drop events older than `maxAgeMs` from the front, then enforce
|
|
103
|
+
* `maxEvents` by trimming the front further if needed. Eviction keeps the
|
|
104
|
+
* newest events — they're the ones the web is most likely to still need.
|
|
105
|
+
*/
|
|
106
|
+
private evict(): void {
|
|
107
|
+
const cutoff = this.now() - this.maxAgeMs
|
|
108
|
+
while (this.events.length > 0 && this.events[0].timestamp < cutoff) {
|
|
109
|
+
this.events.shift()
|
|
110
|
+
}
|
|
111
|
+
while (this.events.length > this.maxEvents) {
|
|
112
|
+
this.events.shift()
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Registry of per-tab buffers. Kept as a thin collection so `HandlerContext`
|
|
119
|
+
* can expose one instance and every broadcast site looks up (or lazily
|
|
120
|
+
* creates) the tab's buffer with a single call.
|
|
121
|
+
*/
|
|
122
|
+
export class TabEventBufferRegistry {
|
|
123
|
+
private readonly buffers = new Map<string, TabEventBuffer>()
|
|
124
|
+
|
|
125
|
+
constructor(
|
|
126
|
+
private readonly bufferFactory: () => TabEventBuffer = () => new TabEventBuffer(),
|
|
127
|
+
) {}
|
|
128
|
+
|
|
129
|
+
/** Get the buffer for `tabId`, creating it on first touch. */
|
|
130
|
+
getOrCreate(tabId: string): TabEventBuffer {
|
|
131
|
+
let buffer = this.buffers.get(tabId)
|
|
132
|
+
if (!buffer) {
|
|
133
|
+
buffer = this.bufferFactory()
|
|
134
|
+
this.buffers.set(tabId, buffer)
|
|
135
|
+
}
|
|
136
|
+
return buffer
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Get the buffer for `tabId` without creating it. */
|
|
140
|
+
get(tabId: string): TabEventBuffer | undefined {
|
|
141
|
+
return this.buffers.get(tabId)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Forget `tabId` entirely — called on `tabRemoved`. */
|
|
145
|
+
delete(tabId: string): void {
|
|
146
|
+
this.buffers.delete(tabId)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** Drop all bookkeeping. Used for tests; no production caller expected. */
|
|
150
|
+
clear(): void {
|
|
151
|
+
this.buffers.clear()
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** 1000 events per tab covers typical reconnect windows comfortably. */
|
|
156
|
+
export const DEFAULT_MAX_EVENTS = 1000
|
|
157
|
+
/** 15 minutes of history is more than enough for the longest plausible web reconnect. */
|
|
158
|
+
export const DEFAULT_MAX_AGE_MS = 15 * 60 * 1000
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Replay tab-scoped events missed during a transport gap.
|
|
5
|
+
*
|
|
6
|
+
* `session-initialization.ts` calls this right before sending `tabInitialized`
|
|
7
|
+
* so the web sees any events with `seq > lastSeenSeq` in-order before the
|
|
8
|
+
* usual initialization payload. Ordering matters: e.g. a `movementComplete`
|
|
9
|
+
* before `outputHistory` would render duplicate content.
|
|
10
|
+
*
|
|
11
|
+
* Delivery is targeted (`ctx.send`) rather than broadcast because only the
|
|
12
|
+
* rejoining web needs the replay; other connected webs already saw these
|
|
13
|
+
* events live.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { HandlerContext } from './handler-context.js'
|
|
17
|
+
import type { WebSocketResponse, WSContext } from './types.js'
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Replay tab events with `seq > lastSeenSeq` to `ws`. Silently no-ops when
|
|
21
|
+
* the buffer is empty or `lastSeenSeq` is unset (full init, not a resume).
|
|
22
|
+
*/
|
|
23
|
+
export function replayTabEventsSince(
|
|
24
|
+
ctx: HandlerContext,
|
|
25
|
+
ws: WSContext,
|
|
26
|
+
tabId: string,
|
|
27
|
+
lastSeenSeq: number | undefined,
|
|
28
|
+
): void {
|
|
29
|
+
if (lastSeenSeq === undefined) return
|
|
30
|
+
|
|
31
|
+
const buffer = ctx.tabEventBuffers.get(tabId)
|
|
32
|
+
if (!buffer) return
|
|
33
|
+
|
|
34
|
+
const events = buffer.getSince(lastSeenSeq)
|
|
35
|
+
for (const event of events) {
|
|
36
|
+
// Types are checked at record time via `broadcastTabEvent`; the buffer
|
|
37
|
+
// stores them as strings but by construction they're always
|
|
38
|
+
// `WebSocketResponse['type']`. Narrow here without an extra runtime check.
|
|
39
|
+
ctx.send(ws, { type: event.type as WebSocketResponse['type'], tabId, data: event.data, seq: event.seq })
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -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
|
import { ImprovisationSessionManager } from '../../cli/improvisation-session-manager.js';
|
|
5
4
|
import { getEffortLevel, getModel } from '../settings.js';
|
|
@@ -78,20 +77,13 @@ export function handleSyncTabMeta(ctx: HandlerContext, _ws: WSContext, msg: WebS
|
|
|
78
77
|
}
|
|
79
78
|
}
|
|
80
79
|
|
|
81
|
-
export function handleSyncPromptText(ctx: HandlerContext, _ws: WSContext, msg: WebSocketMessage, tabId: string): void {
|
|
82
|
-
if (typeof msg.data?.text !== 'string') return;
|
|
83
|
-
ctx.broadcastToAll({
|
|
84
|
-
type: 'promptTextSync',
|
|
85
|
-
tabId,
|
|
86
|
-
data: { tabId, text: msg.data.text }
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
|
|
90
80
|
export function handleRemoveTab(ctx: HandlerContext, _ws: WSContext, tabId: string, workingDir: string): void {
|
|
91
81
|
const registry = ctx.getRegistry(workingDir);
|
|
92
82
|
registry.unregisterTab(tabId);
|
|
93
83
|
ctx.gitDirectories.delete(tabId);
|
|
94
84
|
ctx.gitBranches.delete(tabId);
|
|
85
|
+
ctx.tabEventBuffers.delete(tabId);
|
|
86
|
+
ctx.msgIdTracker.forget(tabId);
|
|
95
87
|
|
|
96
88
|
ctx.broadcastToAll({
|
|
97
89
|
type: 'tabRemoved',
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
-
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
2
|
|
|
3
|
+
import { statSync } from 'node:fs';
|
|
4
4
|
import { platform } from 'node:os';
|
|
5
|
+
import { isAbsolute } from 'node:path';
|
|
5
6
|
import { AnalyticsEvents, trackEvent } from '../analytics.js';
|
|
6
7
|
import { getPTYManager } from '../terminal/pty-manager.js';
|
|
7
8
|
import type { HandlerContext } from './handler-context.js';
|
|
@@ -11,7 +12,7 @@ export async function handleTerminalMessage(ctx: HandlerContext, ws: WSContext,
|
|
|
11
12
|
const termId = msg.terminalId || tabId;
|
|
12
13
|
switch (msg.type) {
|
|
13
14
|
case 'terminalInit':
|
|
14
|
-
await handleTerminalInit(ctx, ws, termId, workingDir, msg.data?.shell, msg.data?.cols, msg.data?.rows);
|
|
15
|
+
await handleTerminalInit(ctx, ws, termId, workingDir, msg.data?.cwd, msg.data?.shell, msg.data?.cols, msg.data?.rows);
|
|
15
16
|
break;
|
|
16
17
|
case 'terminalReconnect':
|
|
17
18
|
handleTerminalReconnect(ctx, ws, termId);
|
|
@@ -36,6 +37,7 @@ async function handleTerminalInit(
|
|
|
36
37
|
ws: WSContext,
|
|
37
38
|
terminalId: string,
|
|
38
39
|
workingDir: string,
|
|
40
|
+
requestedCwd?: string,
|
|
39
41
|
requestedShell?: string,
|
|
40
42
|
cols?: number,
|
|
41
43
|
rows?: number,
|
|
@@ -57,10 +59,16 @@ async function handleTerminalInit(
|
|
|
57
59
|
addTerminalSubscriber(ctx, terminalId, ws);
|
|
58
60
|
setupTerminalBroadcastListeners(ctx, terminalId);
|
|
59
61
|
|
|
62
|
+
// Validate client-supplied cwd. Used by "Open in terminal" on a worktree
|
|
63
|
+
// row to spawn the PTY directly in the worktree path. Falls back silently
|
|
64
|
+
// to the connection-level workingDir on any failure (relative path, missing
|
|
65
|
+
// dir, file path, or stat error from a deleted worktree).
|
|
66
|
+
const effectiveCwd = resolveEffectiveCwd(requestedCwd, workingDir);
|
|
67
|
+
|
|
60
68
|
try {
|
|
61
69
|
const { shell, cwd, isReconnect, platform } = await ptyManager.create(
|
|
62
70
|
terminalId,
|
|
63
|
-
|
|
71
|
+
effectiveCwd,
|
|
64
72
|
cols || 80,
|
|
65
73
|
rows || 24,
|
|
66
74
|
requestedShell,
|
|
@@ -282,6 +290,34 @@ function setupTerminalBroadcastListeners(ctx: HandlerContext, terminalId: string
|
|
|
282
290
|
});
|
|
283
291
|
}
|
|
284
292
|
|
|
293
|
+
/**
|
|
294
|
+
* Validate a client-supplied cwd and return the effective working directory
|
|
295
|
+
* to spawn the PTY in. Falls back to `workingDir` on any failure, so the
|
|
296
|
+
* caller can pass through whatever the client sent without pre-checking.
|
|
297
|
+
*
|
|
298
|
+
* Rejects: non-strings, relative paths, missing/inaccessible paths, file
|
|
299
|
+
* paths (must be a directory). Doesn't try to confirm the path is a known
|
|
300
|
+
* worktree — the threat model is bounded (view-only users are blocked at
|
|
301
|
+
* the relay; owners can `cd` anywhere from a PTY anyway).
|
|
302
|
+
*/
|
|
303
|
+
function resolveEffectiveCwd(requestedCwd: string | undefined, workingDir: string): string {
|
|
304
|
+
if (!requestedCwd || typeof requestedCwd !== 'string') return workingDir;
|
|
305
|
+
if (!isAbsolute(requestedCwd)) {
|
|
306
|
+
console.warn(`[terminalInit] Ignoring non-absolute cwd: ${requestedCwd}`);
|
|
307
|
+
return workingDir;
|
|
308
|
+
}
|
|
309
|
+
try {
|
|
310
|
+
if (!statSync(requestedCwd).isDirectory()) {
|
|
311
|
+
console.warn(`[terminalInit] Ignoring non-directory cwd: ${requestedCwd}`);
|
|
312
|
+
return workingDir;
|
|
313
|
+
}
|
|
314
|
+
} catch {
|
|
315
|
+
console.warn(`[terminalInit] Ignoring inaccessible cwd: ${requestedCwd}`);
|
|
316
|
+
return workingDir;
|
|
317
|
+
}
|
|
318
|
+
return requestedCwd;
|
|
319
|
+
}
|
|
320
|
+
|
|
285
321
|
/**
|
|
286
322
|
* Clean up terminal subscribers for a disconnected WS context.
|
|
287
323
|
* Called from handler.ts handleClose().
|
|
@@ -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
|
* WebSocket Improvise Types
|
|
@@ -36,9 +35,9 @@ const GitTagMessages = ['gitListTags', 'gitCreateTag', 'gitPushTag'] as const;
|
|
|
36
35
|
|
|
37
36
|
const GitWorktreeMessages = ['gitWorktreeList', 'gitWorktreeCreate', 'gitWorktreeCreateAndAssign', 'gitWorktreeRemove', 'tabWorktreeSwitch', 'gitWorktreePush', 'gitWorktreeCreatePR'] as const;
|
|
38
37
|
|
|
39
|
-
const GitMergeMessages = ['gitMergePreview', 'gitWorktreeMerge', 'gitMergeAbort', 'gitMergeComplete'] as const;
|
|
38
|
+
const GitMergeMessages = ['gitMergePreview', 'gitWorktreeMerge', 'gitMergeAbort', 'gitMergeComplete', 'gitMergeStashPop', 'gitMergeDiscardBlockers'] as const;
|
|
40
39
|
|
|
41
|
-
const SessionSyncMessages = ['getActiveTabs', 'createTab', 'reorderTabs', 'syncTabMeta', '
|
|
40
|
+
const SessionSyncMessages = ['getActiveTabs', 'createTab', 'reorderTabs', 'syncTabMeta', 'removeTab', 'markTabViewed'] as const;
|
|
42
41
|
|
|
43
42
|
const SettingsMessages = ['getSettings', 'updateSettings'] as const;
|
|
44
43
|
|
|
@@ -46,6 +45,8 @@ const QualityMessages = ['qualityDetectTools', 'qualityScan', 'qualityInstallToo
|
|
|
46
45
|
|
|
47
46
|
const FileUploadMessages = ['fileUploadStart', 'fileUploadChunk', 'fileUploadComplete', 'fileUploadCancel'] as const;
|
|
48
47
|
|
|
48
|
+
const FileDownloadMessages = ['fileDownloadStart', 'fileDownloadCancel'] as const;
|
|
49
|
+
|
|
49
50
|
const PlanMessages = ['planInit', 'planGetState', 'planListIssues', 'planGetIssue', 'planGetSprint', 'planGetMilestone', 'planCreateIssue', 'planUpdateIssue', 'planDeleteIssue', 'planScaffold', 'planPrompt', 'planExecute', 'planExecuteEpic', 'planPause', 'planStop', 'planResume'] as const;
|
|
50
51
|
|
|
51
52
|
const PlanBoardMessages = ['planCreateBoard', 'planUpdateBoard', 'planArchiveBoard', 'planRestoreBoard', 'planGetBoard', 'planGetBoardState', 'planReorderBoards', 'planSetActiveBoard', 'planGetBoardArtifacts'] as const;
|
|
@@ -68,6 +69,7 @@ type WebSocketMessageType =
|
|
|
68
69
|
| typeof SettingsMessages[number]
|
|
69
70
|
| typeof QualityMessages[number]
|
|
70
71
|
| typeof FileUploadMessages[number]
|
|
72
|
+
| typeof FileDownloadMessages[number]
|
|
71
73
|
| typeof PlanMessages[number]
|
|
72
74
|
| typeof PlanBoardMessages[number]
|
|
73
75
|
| typeof PlanSprintMessages[number]
|
|
@@ -83,7 +85,7 @@ export interface WebSocketMessage {
|
|
|
83
85
|
_permission?: 'view';
|
|
84
86
|
}
|
|
85
87
|
|
|
86
|
-
const CoreResponseMessages = ['output', 'thinking', 'movementStart', 'movementComplete', 'movementError', 'sessionUpdate', 'history', 'sessions', 'sessionsCount', 'sessionDeleted', 'sessionData', 'historyCleared', 'searchResults', 'newSession', 'autocomplete', 'fileContent', 'error', 'pong', 'tabInitialized', 'approvalRequired', 'toolUse', 'streamingTokens', 'notificationSummary'] as const;
|
|
88
|
+
const CoreResponseMessages = ['output', 'thinking', 'movementStart', 'movementComplete', 'movementError', 'sessionUpdate', 'history', 'sessions', 'sessionsCount', 'sessionDeleted', 'sessionData', 'historyCleared', 'searchResults', 'newSession', 'autocomplete', 'fileContent', 'error', 'pong', 'tabInitialized', 'approvalRequired', 'toolUse', 'streamingTokens', 'notificationSummary', 'executeAck', 'clientOffline', 'clientAuthExpired'] as const;
|
|
87
89
|
|
|
88
90
|
const TerminalResponseMessages = ['terminalOutput', 'terminalReady', 'terminalExit', 'terminalError', 'terminalList', 'terminalScrollback', 'terminalCreated', 'terminalClosed'] as const;
|
|
89
91
|
|
|
@@ -99,16 +101,18 @@ const GitTagResponseMessages = ['gitTagList', 'gitTagCreated', 'gitTagPushed'] a
|
|
|
99
101
|
|
|
100
102
|
const GitWorktreeResponseMessages = ['gitWorktreeListResult', 'gitWorktreeCreated', 'gitWorktreeCreatedAndAssigned', 'gitWorktreeRemoved', 'tabWorktreeSwitched', 'gitBranchChanged', 'gitWorktreePushed', 'gitWorktreePRCreated'] as const;
|
|
101
103
|
|
|
102
|
-
const GitMergeResponseMessages = ['gitMergePreviewResult', 'gitWorktreeMergeResult', 'gitMergeAborted', 'gitMergeCompleted'] as const;
|
|
104
|
+
const GitMergeResponseMessages = ['gitMergePreviewResult', 'gitWorktreeMergeResult', 'gitMergeAborted', 'gitMergeCompleted', 'gitMergeStashPopped', 'gitMergeBlockersDiscarded'] as const;
|
|
103
105
|
|
|
104
|
-
const SessionSyncResponseMessages = ['activeTabs', 'tabCreated', 'tabRemoved', 'tabRenamed', 'tabsReordered', '
|
|
106
|
+
const SessionSyncResponseMessages = ['activeTabs', 'tabCreated', 'tabRemoved', 'tabRenamed', 'tabsReordered', 'tabViewed', 'tabStateChanged'] as const;
|
|
105
107
|
|
|
106
108
|
const SettingsResponseMessages = ['settings', 'settingsUpdated'] as const;
|
|
107
109
|
|
|
108
|
-
const QualityResponseMessages = ['qualityToolsDetected', 'qualityScanProgress', 'qualityScanResults', 'qualityInstallProgress', 'qualityInstallComplete', 'qualityCodeReview', 'qualityCodeReviewProgress', 'qualityPostSession', 'qualityError', 'qualityStateLoaded'] as const;
|
|
110
|
+
const QualityResponseMessages = ['qualityToolsDetected', 'qualityScanProgress', 'qualityScanResults', 'qualityInstallProgress', 'qualityInstallComplete', 'qualityCodeReview', 'qualityCodeReviewProgress', 'qualityPostSession', 'qualityError', 'qualityStateLoaded', 'qualityDirectoriesUpdated'] as const;
|
|
109
111
|
|
|
110
112
|
const FileUploadResponseMessages = ['fileUploadAck', 'fileUploadReady', 'fileUploadError'] as const;
|
|
111
113
|
|
|
114
|
+
const FileDownloadResponseMessages = ['fileDownloadReady', 'fileDownloadChunk', 'fileDownloadComplete', 'fileDownloadError'] as const;
|
|
115
|
+
|
|
112
116
|
const PlanResponseMessages = ['planState', 'planIssueList', 'planIssue', 'planSprint', 'planMilestone', 'planNotFound', 'planStateUpdated', 'planIssueUpdated', 'planIssueCreated', 'planIssueDeleted', 'planScaffolded', 'planPromptStreaming', 'planPromptProgress', 'planPromptResponse', 'planExecutionStarted', 'planExecutionProgress', 'planExecutionOutput', 'planExecutionMetrics', 'planExecutionComplete', 'planExecutionError', 'planError'] as const;
|
|
113
117
|
|
|
114
118
|
const PlanBoardResponseMessages = ['planBoardCreated', 'planBoardUpdated', 'planBoardArchived', 'planBoardState', 'planBoardArtifacts', 'planWorkspaceUpdated'] as const;
|
|
@@ -131,6 +135,7 @@ type WebSocketResponseType =
|
|
|
131
135
|
| typeof SettingsResponseMessages[number]
|
|
132
136
|
| typeof QualityResponseMessages[number]
|
|
133
137
|
| typeof FileUploadResponseMessages[number]
|
|
138
|
+
| typeof FileDownloadResponseMessages[number]
|
|
134
139
|
| typeof PlanResponseMessages[number]
|
|
135
140
|
| typeof PlanBoardResponseMessages[number]
|
|
136
141
|
| typeof PlanSprintResponseMessages[number]
|
|
@@ -142,6 +147,13 @@ export interface WebSocketResponse {
|
|
|
142
147
|
terminalId?: string;
|
|
143
148
|
// biome-ignore lint/suspicious/noExplicitAny: message envelope carries heterogeneous payloads — typed per-handler via destructuring
|
|
144
149
|
data?: any;
|
|
150
|
+
/**
|
|
151
|
+
* Monotonic per-tab sequence number assigned by `tab-event-buffer.ts`.
|
|
152
|
+
* Stamped on tab-scoped streaming broadcasts so webs can ask for replay
|
|
153
|
+
* starting after their highest-seen seq on a reconnect (`initTab` /
|
|
154
|
+
* `resumeSession` with `lastSeenSeq` in the payload).
|
|
155
|
+
*/
|
|
156
|
+
seq?: number;
|
|
145
157
|
}
|
|
146
158
|
|
|
147
159
|
export interface ConnectionData {
|
package/server/utils/paths.ts
CHANGED