agentic-orchestrator 0.1.28 → 0.2.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/.claude/settings.local.json +46 -1
- package/.cortexrc +28 -0
- package/.github/agents/copilot-instructions.md +29 -0
- package/.github/copilot-instructions.md +93 -0
- package/.vscode/settings.json +13 -0
- package/.vscode/tms.code-snippets +223 -0
- package/AGENTS.md +72 -1
- package/Agentic-Orchestrator.iml +12 -11
- package/CLAUDE.md +72 -1
- package/CONSTITUTION.md +504 -0
- package/FUTURE-ENHANCEMENTS.md +85 -0
- package/NEXT-TASKS.md +25 -0
- package/PROMPTS.md +161 -0
- package/README.md +126 -29
- package/agentic/orchestrator/agents.yaml +4 -3
- package/agentic/orchestrator/defaults/policy.defaults.yaml +39 -3
- package/agentic/orchestrator/gates.yaml +15 -3
- package/agentic/orchestrator/policy.yaml +47 -3
- package/agentic/orchestrator/prompts/builder.system.md +69 -20
- package/agentic/orchestrator/prompts/planner-intake.system.md +149 -0
- package/agentic/orchestrator/prompts/planner.system.md +113 -40
- package/agentic/orchestrator/prompts/qa.system.md +73 -18
- package/agentic/orchestrator/prompts/reconciler.system.md +119 -0
- package/agentic/orchestrator/schemas/agents.schema.json +89 -1
- package/agentic/orchestrator/schemas/execution-control.schema.json +242 -0
- package/agentic/orchestrator/schemas/index.schema.json +234 -0
- package/agentic/orchestrator/schemas/intake.review.schema.json +82 -0
- package/agentic/orchestrator/schemas/organizer-ordering-artifact.schema.json +75 -0
- package/agentic/orchestrator/schemas/plan.schema.json +44 -0
- package/agentic/orchestrator/schemas/policy.schema.json +238 -9
- package/agentic/orchestrator/schemas/policy.user.schema.json +129 -1
- package/agentic/orchestrator/schemas/spec.manifest.bootstrap.schema.json +101 -0
- package/agentic/orchestrator/schemas/spec.manifest.verified.schema.json +80 -0
- package/agentic/orchestrator/schemas/state.schema.json +298 -3
- package/agentic/orchestrator/tools/catalog.json +145 -15
- package/agentic/orchestrator/tools/schemas/input/doctor.run.input.schema.json +18 -0
- package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +4 -0
- package/agentic/orchestrator/tools/schemas/input/evidence.verify_chain.input.schema.json +13 -0
- package/agentic/orchestrator/tools/schemas/input/feature.intake_submit.input.schema.json +11 -0
- package/agentic/orchestrator/tools/schemas/input/feature.question_answer.input.schema.json +15 -0
- package/agentic/orchestrator/tools/schemas/input/feature.question_create.input.schema.json +21 -0
- package/agentic/orchestrator/tools/schemas/input/feature.question_list.input.schema.json +13 -0
- package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +5 -0
- package/agentic/orchestrator/tools/schemas/input/feature.send_message.input.schema.json +1 -1
- package/agentic/orchestrator/tools/schemas/input/replay.timeline_get.input.schema.json +32 -0
- package/agentic/orchestrator/tools/schemas/input/repo.conflict_abort.input.schema.json +16 -0
- package/agentic/orchestrator/tools/schemas/input/repo.conflict_files.input.schema.json +16 -0
- package/agentic/orchestrator/tools/schemas/input/repo.reconcile_mainline.input.schema.json +37 -0
- package/agentic/orchestrator/tools/schemas/input/repo.resolve_conflict.input.schema.json +40 -0
- package/agentic/orchestrator/tools/schemas/input/runtime.execution_request_list.input.schema.json +7 -0
- package/agentic/orchestrator/tools/schemas/input/runtime.execution_request_submit.input.schema.json +25 -0
- package/agentic/orchestrator/tools/schemas/output/doctor.run.output.schema.json +34 -0
- package/agentic/orchestrator/tools/schemas/output/evidence.verify_chain.output.schema.json +23 -0
- package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +62 -2
- package/agentic/orchestrator/tools/schemas/output/feature.intake_submit.output.schema.json +24 -0
- package/agentic/orchestrator/tools/schemas/output/feature.question_answer.output.schema.json +21 -0
- package/agentic/orchestrator/tools/schemas/output/feature.question_create.output.schema.json +12 -0
- package/agentic/orchestrator/tools/schemas/output/feature.question_list.output.schema.json +14 -0
- package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +31 -0
- package/agentic/orchestrator/tools/schemas/output/feature.send_message.output.schema.json +8 -18
- package/agentic/orchestrator/tools/schemas/output/replay.timeline_get.output.schema.json +64 -0
- package/agentic/orchestrator/tools/schemas/output/repo.conflict_abort.output.schema.json +16 -0
- package/agentic/orchestrator/tools/schemas/output/repo.conflict_files.output.schema.json +22 -0
- package/agentic/orchestrator/tools/schemas/output/repo.reconcile_mainline.output.schema.json +61 -0
- package/agentic/orchestrator/tools/schemas/output/repo.resolve_conflict.output.schema.json +19 -0
- package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +26 -0
- package/agentic/orchestrator/tools/schemas/output/runtime.execution_request_list.output.schema.json +17 -0
- package/agentic/orchestrator/tools/schemas/output/runtime.execution_request_submit.output.schema.json +24 -0
- package/agentic/orchestrator/tools.md +13 -0
- package/apps/control-plane/scripts/validate-mcp-contracts.ts +1 -1
- package/apps/control-plane/src/application/kernel-tool-wiring.ts +140 -2
- package/apps/control-plane/src/application/services/activity-monitor-service.ts +44 -1
- package/apps/control-plane/src/application/services/bootstrap-manifest-generator-service.ts +251 -0
- package/apps/control-plane/src/application/services/checkpoint-service.ts +87 -27
- package/apps/control-plane/src/application/services/collision-override-service.ts +906 -0
- package/apps/control-plane/src/application/services/collision-queue-service.ts +129 -38
- package/apps/control-plane/src/application/services/cost-tracking-service.ts +94 -0
- package/apps/control-plane/src/application/services/execution-control-service.ts +599 -0
- package/apps/control-plane/src/application/services/feature-deletion-service.ts +37 -1
- package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +182 -4
- package/apps/control-plane/src/application/services/feature-send-message-service.ts +17 -8
- package/apps/control-plane/src/application/services/feature-state-service.ts +191 -6
- package/apps/control-plane/src/application/services/gate-service.ts +121 -2
- package/apps/control-plane/src/application/services/git-reconciliation-service.ts +1591 -0
- package/apps/control-plane/src/application/services/intake-service.ts +1468 -0
- package/apps/control-plane/src/application/services/merge-service.ts +308 -17
- package/apps/control-plane/src/application/services/notifier-service.ts +3 -1
- package/apps/control-plane/src/application/services/performance-analytics-service.ts +75 -0
- package/apps/control-plane/src/application/services/plan-service.ts +336 -20
- package/apps/control-plane/src/application/services/question-service.ts +693 -0
- package/apps/control-plane/src/application/services/reactions-service.ts +73 -17
- package/apps/control-plane/src/application/services/replay-timeline-service.ts +295 -0
- package/apps/control-plane/src/application/services/reporting-service.ts +194 -10
- package/apps/control-plane/src/application/services/run-lease-service.ts +121 -5
- package/apps/control-plane/src/application/services/worktree-watchdog-service.ts +95 -8
- package/apps/control-plane/src/application/tools/tool-metadata.ts +7 -0
- package/apps/control-plane/src/application/usage-types.ts +138 -0
- package/apps/control-plane/src/cli/add-command-handler.ts +162 -0
- package/apps/control-plane/src/cli/answer-command-handler.ts +113 -0
- package/apps/control-plane/src/cli/attach-command-handler.ts +12 -3
- package/apps/control-plane/src/cli/cli-argument-parser.ts +133 -11
- package/apps/control-plane/src/cli/collision-command-handler.ts +113 -0
- package/apps/control-plane/src/cli/command-catalog.ts +479 -0
- package/apps/control-plane/src/cli/complete-command-handler.ts +23 -0
- package/apps/control-plane/src/cli/completion-command-handler.ts +25 -0
- package/apps/control-plane/src/cli/completion-resolver.ts +319 -0
- package/apps/control-plane/src/cli/completion-shell-renderer.ts +58 -0
- package/apps/control-plane/src/cli/dashboard-command-handler.ts +111 -1
- package/apps/control-plane/src/cli/dashboard-runtime-runner.ts +1036 -0
- package/apps/control-plane/src/cli/dashboard-runtime.ts +31 -0
- package/apps/control-plane/src/cli/help-command-handler.ts +17 -185
- package/apps/control-plane/src/cli/init-command-handler.ts +51 -6
- package/apps/control-plane/src/cli/merge-command-handler.ts +200 -0
- package/apps/control-plane/src/cli/questions-command-handler.ts +70 -0
- package/apps/control-plane/src/cli/replay-command-handler.ts +98 -0
- package/apps/control-plane/src/cli/resume-command-handler.ts +231 -16
- package/apps/control-plane/src/cli/retry-command-handler.ts +229 -17
- package/apps/control-plane/src/cli/retry-resume-decision.ts +75 -0
- package/apps/control-plane/src/cli/rollback-command-handler.ts +4 -2
- package/apps/control-plane/src/cli/run-command-handler.ts +35 -1
- package/apps/control-plane/src/cli/spec-ingestion-service.ts +45 -55
- package/apps/control-plane/src/cli/spec-preparation.ts +114 -0
- package/apps/control-plane/src/cli/spec-utils.ts +90 -11
- package/apps/control-plane/src/cli/status-command-handler.ts +122 -0
- package/apps/control-plane/src/cli/types.ts +41 -3
- package/apps/control-plane/src/core/collisions.ts +150 -31
- package/apps/control-plane/src/core/constants.ts +18 -1
- package/apps/control-plane/src/core/error-codes.ts +39 -0
- package/apps/control-plane/src/core/execution-control.ts +56 -0
- package/apps/control-plane/src/core/feature-resume-phase.ts +118 -0
- package/apps/control-plane/src/core/gate-freshness.ts +359 -0
- package/apps/control-plane/src/core/gate-log-extractor.ts +97 -0
- package/apps/control-plane/src/core/gates.ts +90 -1
- package/apps/control-plane/src/core/intake-artifacts.ts +295 -0
- package/apps/control-plane/src/core/kernel-types.ts +11 -0
- package/apps/control-plane/src/core/kernel.ts +604 -16
- package/apps/control-plane/src/core/mainline-conflict.ts +22 -0
- package/apps/control-plane/src/core/merge-repair.ts +149 -0
- package/apps/control-plane/src/core/path-layout.ts +46 -2
- package/apps/control-plane/src/core/path-rules.ts +11 -3
- package/apps/control-plane/src/core/plan-submit-recovery.ts +130 -0
- package/apps/control-plane/src/core/questions.ts +49 -0
- package/apps/control-plane/src/core/runtime-sessions.ts +4 -0
- package/apps/control-plane/src/core/schemas.ts +40 -1
- package/apps/control-plane/src/core/tool-caller.ts +25 -1
- package/apps/control-plane/src/core/utils/index-normalizer.ts +25 -4
- package/apps/control-plane/src/core/worktree-diff.ts +66 -0
- package/apps/control-plane/src/index.ts +29 -1
- package/apps/control-plane/src/interfaces/cli/bootstrap.ts +300 -6
- package/apps/control-plane/src/mcp/kernel-tool-executor.ts +17 -0
- package/apps/control-plane/src/mcp/tool-runtime.ts +63 -4
- package/apps/control-plane/src/providers/api-worker-provider.ts +62 -15
- package/apps/control-plane/src/providers/cli-worker-provider.ts +1037 -61
- package/apps/control-plane/src/providers/output-parsers/generic-output-parser.ts +99 -1
- package/apps/control-plane/src/providers/output-parsers/types.ts +2 -0
- package/apps/control-plane/src/providers/provider-defaults.ts +116 -7
- package/apps/control-plane/src/providers/providers.ts +225 -21
- package/apps/control-plane/src/providers/worker-provider-factory.ts +26 -2
- package/apps/control-plane/src/supervisor/artifact-stager.ts +52 -0
- package/apps/control-plane/src/supervisor/build-wave-executor.ts +477 -166
- package/apps/control-plane/src/supervisor/execution-enrollment-service.ts +408 -0
- package/apps/control-plane/src/supervisor/organizer-enrollment-scheduler.ts +117 -0
- package/apps/control-plane/src/supervisor/organizer-sidecar-service.ts +394 -0
- package/apps/control-plane/src/supervisor/plan-conformance-scorer.ts +2 -5
- package/apps/control-plane/src/supervisor/planner-phase.ts +85 -0
- package/apps/control-plane/src/supervisor/planning-wave-executor.ts +993 -64
- package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +20 -1
- package/apps/control-plane/src/supervisor/qa-wave-executor.ts +384 -177
- package/apps/control-plane/src/supervisor/run-coordinator.ts +723 -20
- package/apps/control-plane/src/supervisor/runtime.ts +485 -9
- package/apps/control-plane/src/supervisor/session-orchestrator.ts +220 -1
- package/apps/control-plane/src/supervisor/types.ts +152 -1
- package/apps/control-plane/src/supervisor/worker-decision-loop.ts +1030 -92
- package/apps/control-plane/test/activity-monitor.spec.ts +76 -0
- package/apps/control-plane/test/add-command-handler.spec.ts +189 -0
- package/apps/control-plane/test/application/services/feature-state-service.spec.ts +208 -0
- package/apps/control-plane/test/artifact-stager.spec.ts +93 -0
- package/apps/control-plane/test/batch-operations.spec.ts +58 -0
- package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +50 -2
- package/apps/control-plane/test/bootstrap-manifest-generator-service.spec.ts +99 -0
- package/apps/control-plane/test/bootstrap.spec.ts +177 -4
- package/apps/control-plane/test/checkpoint-service.spec.ts +977 -29
- package/apps/control-plane/test/cli-argument-parser.spec.ts +119 -0
- package/apps/control-plane/test/cli-helpers.spec.ts +1202 -12
- package/apps/control-plane/test/cli.unit.spec.ts +797 -16
- package/apps/control-plane/test/collision-command-handler.spec.ts +182 -0
- package/apps/control-plane/test/collision-override-service.spec.ts +878 -0
- package/apps/control-plane/test/collision-queue.spec.ts +430 -2
- package/apps/control-plane/test/collisions.spec.ts +209 -1
- package/apps/control-plane/test/core-utils.spec.ts +61 -0
- package/apps/control-plane/test/cost-tracking.spec.ts +224 -0
- package/apps/control-plane/test/dashboard-api.integration.spec.ts +185 -5
- package/apps/control-plane/test/dashboard-client.spec.ts +948 -0
- package/apps/control-plane/test/dashboard-command.spec.ts +138 -6
- package/apps/control-plane/test/dashboard-runtime-runner.spec.ts +1550 -0
- package/apps/control-plane/test/dashboard-runtime.spec.ts +138 -0
- package/apps/control-plane/test/dashboard-ui-utils.spec.ts +56 -12
- package/apps/control-plane/test/dependency-scheduler.spec.ts +7 -1
- package/apps/control-plane/test/env-file.spec.ts +76 -0
- package/apps/control-plane/test/execution-control-service.spec.ts +535 -0
- package/apps/control-plane/test/execution-enrollment-service.spec.ts +648 -0
- package/apps/control-plane/test/feature-lifecycle.spec.ts +126 -0
- package/apps/control-plane/test/feature-resume-phase.spec.ts +164 -0
- package/apps/control-plane/test/feature-send-message-service.spec.ts +161 -0
- package/apps/control-plane/test/feature-state-service.spec.ts +295 -0
- package/apps/control-plane/test/fs.spec.ts +80 -0
- package/apps/control-plane/test/gate-freshness.spec.ts +590 -0
- package/apps/control-plane/test/gate-log-extractor.spec.ts +170 -0
- package/apps/control-plane/test/gates.spec.ts +108 -0
- package/apps/control-plane/test/git-reconciliation-service.spec.ts +2307 -0
- package/apps/control-plane/test/helpers.ts +65 -0
- package/apps/control-plane/test/incremental-gates.spec.ts +271 -0
- package/apps/control-plane/test/index-normalizer.spec.ts +98 -0
- package/apps/control-plane/test/init-wizard.spec.ts +17 -0
- package/apps/control-plane/test/intake-artifacts.spec.ts +203 -0
- package/apps/control-plane/test/intake-service.spec.ts +3176 -0
- package/apps/control-plane/test/kernel-collision-replay.spec.ts +3 -2
- package/apps/control-plane/test/kernel-tool-executor.spec.ts +77 -0
- package/apps/control-plane/test/kernel-tool-wiring.spec.ts +279 -0
- package/apps/control-plane/test/kernel.branches.spec.ts +15 -2
- package/apps/control-plane/test/kernel.coverage.spec.ts +7 -3
- package/apps/control-plane/test/kernel.coverage2.spec.ts +731 -2
- package/apps/control-plane/test/kernel.spec.ts +464 -2
- package/apps/control-plane/test/mainline-conflict.spec.ts +66 -0
- package/apps/control-plane/test/mcp-helpers.spec.ts +79 -0
- package/apps/control-plane/test/mcp.spec.ts +177 -13
- package/apps/control-plane/test/merge-command-handler.spec.ts +531 -0
- package/apps/control-plane/test/merge-service.spec.ts +570 -4
- package/apps/control-plane/test/notifier-service.spec.ts +26 -0
- package/apps/control-plane/test/organizer-enrollment-scheduler.spec.ts +340 -0
- package/apps/control-plane/test/organizer-ordering-artifact.spec.ts +95 -0
- package/apps/control-plane/test/organizer-sidecar-service.spec.ts +468 -0
- package/apps/control-plane/test/output-loop-detector.spec.ts +6 -0
- package/apps/control-plane/test/path-layout.spec.ts +70 -0
- package/apps/control-plane/test/performance-analytics.spec.ts +124 -0
- package/apps/control-plane/test/plan-conformance-scorer.spec.ts +53 -0
- package/apps/control-plane/test/plan-service.spec.ts +686 -4
- package/apps/control-plane/test/planning-wave-executor.spec.ts +3272 -86
- package/apps/control-plane/test/policy-loader-service.spec.ts +5 -0
- package/apps/control-plane/test/prompt-overlay.spec.ts +65 -0
- package/apps/control-plane/test/provider-command-runner-epipe.spec.ts +64 -0
- package/apps/control-plane/test/providers/api-worker-provider.spec.ts +129 -0
- package/apps/control-plane/test/providers/cli-worker-provider.spec.ts +148 -0
- package/apps/control-plane/test/providers/usage-types.spec.ts +98 -0
- package/apps/control-plane/test/providers.spec.ts +293 -16
- package/apps/control-plane/test/question-command-handlers.spec.ts +156 -0
- package/apps/control-plane/test/question-service.spec.ts +1119 -0
- package/apps/control-plane/test/reactions.spec.ts +114 -0
- package/apps/control-plane/test/replay-command-handler.spec.ts +144 -0
- package/apps/control-plane/test/replay-timeline-service.spec.ts +459 -0
- package/apps/control-plane/test/response.spec.ts +31 -0
- package/apps/control-plane/test/resume-command.spec.ts +757 -9
- package/apps/control-plane/test/retry-resume-decision.spec.ts +133 -0
- package/apps/control-plane/test/rollback-command-handler.spec.ts +334 -0
- package/apps/control-plane/test/rollback-command.spec.ts +120 -0
- package/apps/control-plane/test/run-coordinator.spec.ts +3062 -404
- package/apps/control-plane/test/schemas/state.schema.spec.ts +71 -0
- package/apps/control-plane/test/service-retry-paths.spec.ts +112 -0
- package/apps/control-plane/test/services.spec.ts +472 -2
- package/apps/control-plane/test/session-management.spec.ts +346 -1
- package/apps/control-plane/test/spec-ingestion.spec.ts +102 -28
- package/apps/control-plane/test/spec-preparation.spec.ts +182 -0
- package/apps/control-plane/test/supervisor-collaborators.spec.ts +191 -3
- package/apps/control-plane/test/supervisor.calltool.spec.ts +198 -0
- package/apps/control-plane/test/supervisor.spec.ts +95 -16
- package/apps/control-plane/test/supervisor.unit.spec.ts +385 -18
- package/apps/control-plane/test/tool-runtime.spec.ts +122 -0
- package/apps/control-plane/test/worker-decision-loop.spec.ts +3479 -476
- package/apps/control-plane/test/worker-execution-policy.spec.ts +1416 -6
- package/apps/control-plane/test/worker-provider-adapters.spec.ts +1894 -37
- package/apps/control-plane/test/worker-provider-factory.spec.ts +81 -0
- package/apps/control-plane/test/worktree-watchdog-service.spec.ts +125 -0
- package/apps/control-plane/vitest.config.ts +5 -0
- package/config/agentic/orchestrator/agents.yaml +22 -1
- package/config/agentic/orchestrator/gates.yaml +24 -7
- package/config/agentic/orchestrator/policy.yaml +23 -1
- package/config/agentic/orchestrator/prompts/builder.system.md +69 -20
- package/config/agentic/orchestrator/prompts/organizer.system.md +85 -0
- package/config/agentic/orchestrator/prompts/overrides/builder.claude.md +28 -0
- package/config/agentic/orchestrator/prompts/overrides/builder.codex.md +28 -0
- package/config/agentic/orchestrator/prompts/overrides/planner.claude.md +20 -0
- package/config/agentic/orchestrator/prompts/overrides/planner.codex.md +20 -0
- package/config/agentic/orchestrator/prompts/planner-intake.system.md +149 -0
- package/config/agentic/orchestrator/prompts/planner.system.md +113 -40
- package/config/agentic/orchestrator/prompts/qa.system.md +75 -18
- package/config/agentic/orchestrator/prompts/reconciler.system.md +119 -0
- package/dist/apps/control-plane/application/kernel-tool-wiring.d.ts +26 -2
- package/dist/apps/control-plane/application/kernel-tool-wiring.js +40 -2
- package/dist/apps/control-plane/application/kernel-tool-wiring.js.map +1 -1
- package/dist/apps/control-plane/application/services/activity-monitor-service.js +37 -1
- package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/bootstrap-manifest-generator-service.d.ts +4 -0
- package/dist/apps/control-plane/application/services/bootstrap-manifest-generator-service.js +188 -0
- package/dist/apps/control-plane/application/services/bootstrap-manifest-generator-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/checkpoint-service.d.ts +5 -0
- package/dist/apps/control-plane/application/services/checkpoint-service.js +69 -24
- package/dist/apps/control-plane/application/services/checkpoint-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/collision-override-service.d.ts +139 -0
- package/dist/apps/control-plane/application/services/collision-override-service.js +568 -0
- package/dist/apps/control-plane/application/services/collision-override-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/collision-queue-service.d.ts +15 -0
- package/dist/apps/control-plane/application/services/collision-queue-service.js +92 -33
- package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/cost-tracking-service.d.ts +11 -0
- package/dist/apps/control-plane/application/services/cost-tracking-service.js +75 -0
- package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/execution-control-service.d.ts +75 -0
- package/dist/apps/control-plane/application/services/execution-control-service.js +421 -0
- package/dist/apps/control-plane/application/services/execution-control-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/feature-deletion-service.d.ts +1 -0
- package/dist/apps/control-plane/application/services/feature-deletion-service.js +23 -1
- package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.d.ts +24 -1
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +132 -3
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-send-message-service.js +16 -8
- package/dist/apps/control-plane/application/services/feature-send-message-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-state-service.d.ts +36 -0
- package/dist/apps/control-plane/application/services/feature-state-service.js +163 -6
- package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/gate-service.d.ts +2 -1
- package/dist/apps/control-plane/application/services/gate-service.js +95 -5
- package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/git-reconciliation-service.d.ts +92 -0
- package/dist/apps/control-plane/application/services/git-reconciliation-service.js +1097 -0
- package/dist/apps/control-plane/application/services/git-reconciliation-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/intake-service.d.ts +63 -0
- package/dist/apps/control-plane/application/services/intake-service.js +1050 -0
- package/dist/apps/control-plane/application/services/intake-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/merge-service.d.ts +5 -1
- package/dist/apps/control-plane/application/services/merge-service.js +233 -18
- package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/notifier-service.d.ts +1 -1
- package/dist/apps/control-plane/application/services/notifier-service.js +1 -0
- package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/performance-analytics-service.d.ts +11 -0
- package/dist/apps/control-plane/application/services/performance-analytics-service.js +59 -0
- package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/plan-service.d.ts +5 -0
- package/dist/apps/control-plane/application/services/plan-service.js +254 -15
- package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/question-service.d.ts +72 -0
- package/dist/apps/control-plane/application/services/question-service.js +507 -0
- package/dist/apps/control-plane/application/services/question-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/reactions-service.d.ts +2 -0
- package/dist/apps/control-plane/application/services/reactions-service.js +60 -17
- package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/replay-timeline-service.d.ts +39 -0
- package/dist/apps/control-plane/application/services/replay-timeline-service.js +205 -0
- package/dist/apps/control-plane/application/services/replay-timeline-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/reporting-service.d.ts +59 -0
- package/dist/apps/control-plane/application/services/reporting-service.js +121 -9
- package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/run-lease-service.d.ts +20 -0
- package/dist/apps/control-plane/application/services/run-lease-service.js +81 -4
- package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/worktree-watchdog-service.d.ts +10 -0
- package/dist/apps/control-plane/application/services/worktree-watchdog-service.js +65 -8
- package/dist/apps/control-plane/application/services/worktree-watchdog-service.js.map +1 -1
- package/dist/apps/control-plane/application/tools/tool-metadata.js +7 -0
- package/dist/apps/control-plane/application/tools/tool-metadata.js.map +1 -1
- package/dist/apps/control-plane/application/usage-types.d.ts +65 -0
- package/dist/apps/control-plane/application/usage-types.js +75 -0
- package/dist/apps/control-plane/application/usage-types.js.map +1 -0
- package/dist/apps/control-plane/cli/add-command-handler.d.ts +18 -0
- package/dist/apps/control-plane/cli/add-command-handler.js +110 -0
- package/dist/apps/control-plane/cli/add-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/answer-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/answer-command-handler.js +96 -0
- package/dist/apps/control-plane/cli/answer-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/attach-command-handler.js +8 -3
- package/dist/apps/control-plane/cli/attach-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/cli-argument-parser.js +131 -11
- package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
- package/dist/apps/control-plane/cli/collision-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/collision-command-handler.js +90 -0
- package/dist/apps/control-plane/cli/collision-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/command-catalog.d.ts +21 -0
- package/dist/apps/control-plane/cli/command-catalog.js +416 -0
- package/dist/apps/control-plane/cli/command-catalog.js.map +1 -0
- package/dist/apps/control-plane/cli/complete-command-handler.d.ts +15 -0
- package/dist/apps/control-plane/cli/complete-command-handler.js +26 -0
- package/dist/apps/control-plane/cli/complete-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/completion-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/completion-command-handler.js +20 -0
- package/dist/apps/control-plane/cli/completion-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/completion-resolver.d.ts +1 -0
- package/dist/apps/control-plane/cli/completion-resolver.js +250 -0
- package/dist/apps/control-plane/cli/completion-resolver.js.map +1 -0
- package/dist/apps/control-plane/cli/completion-shell-renderer.d.ts +3 -0
- package/dist/apps/control-plane/cli/completion-shell-renderer.js +53 -0
- package/dist/apps/control-plane/cli/completion-shell-renderer.js.map +1 -0
- package/dist/apps/control-plane/cli/dashboard-command-handler.d.ts +1 -0
- package/dist/apps/control-plane/cli/dashboard-command-handler.js +84 -1
- package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/dashboard-runtime-runner.d.ts +81 -0
- package/dist/apps/control-plane/cli/dashboard-runtime-runner.js +724 -0
- package/dist/apps/control-plane/cli/dashboard-runtime-runner.js.map +1 -0
- package/dist/apps/control-plane/cli/dashboard-runtime.d.ts +1 -0
- package/dist/apps/control-plane/cli/dashboard-runtime.js +26 -0
- package/dist/apps/control-plane/cli/dashboard-runtime.js.map +1 -0
- package/dist/apps/control-plane/cli/help-command-handler.js +13 -172
- package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/init-command-handler.js +51 -6
- package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/merge-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/merge-command-handler.js +139 -0
- package/dist/apps/control-plane/cli/merge-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/questions-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/questions-command-handler.js +59 -0
- package/dist/apps/control-plane/cli/questions-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/replay-command-handler.d.ts +15 -0
- package/dist/apps/control-plane/cli/replay-command-handler.js +55 -0
- package/dist/apps/control-plane/cli/replay-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/resume-command-handler.d.ts +2 -0
- package/dist/apps/control-plane/cli/resume-command-handler.js +180 -17
- package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/retry-command-handler.js +202 -16
- package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/retry-resume-decision.d.ts +26 -0
- package/dist/apps/control-plane/cli/retry-resume-decision.js +61 -0
- package/dist/apps/control-plane/cli/retry-resume-decision.js.map +1 -0
- package/dist/apps/control-plane/cli/rollback-command-handler.js +3 -2
- package/dist/apps/control-plane/cli/rollback-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/run-command-handler.js +26 -2
- package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/spec-ingestion-service.d.ts +2 -0
- package/dist/apps/control-plane/cli/spec-ingestion-service.js +37 -48
- package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
- package/dist/apps/control-plane/cli/spec-preparation.d.ts +14 -0
- package/dist/apps/control-plane/cli/spec-preparation.js +81 -0
- package/dist/apps/control-plane/cli/spec-preparation.js.map +1 -0
- package/dist/apps/control-plane/cli/spec-utils.d.ts +4 -0
- package/dist/apps/control-plane/cli/spec-utils.js +70 -11
- package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
- package/dist/apps/control-plane/cli/status-command-handler.js +69 -0
- package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/types.d.ts +41 -4
- package/dist/apps/control-plane/cli/types.js +9 -1
- package/dist/apps/control-plane/cli/types.js.map +1 -1
- package/dist/apps/control-plane/core/collisions.d.ts +37 -19
- package/dist/apps/control-plane/core/collisions.js +87 -12
- package/dist/apps/control-plane/core/collisions.js.map +1 -1
- package/dist/apps/control-plane/core/constants.d.ts +17 -1
- package/dist/apps/control-plane/core/constants.js +18 -1
- package/dist/apps/control-plane/core/constants.js.map +1 -1
- package/dist/apps/control-plane/core/error-codes.d.ts +39 -0
- package/dist/apps/control-plane/core/error-codes.js +39 -0
- package/dist/apps/control-plane/core/error-codes.js.map +1 -1
- package/dist/apps/control-plane/core/execution-control.d.ts +45 -0
- package/dist/apps/control-plane/core/execution-control.js +2 -0
- package/dist/apps/control-plane/core/execution-control.js.map +1 -0
- package/dist/apps/control-plane/core/feature-resume-phase.d.ts +3 -0
- package/dist/apps/control-plane/core/feature-resume-phase.js +88 -0
- package/dist/apps/control-plane/core/feature-resume-phase.js.map +1 -0
- package/dist/apps/control-plane/core/gate-freshness.d.ts +48 -0
- package/dist/apps/control-plane/core/gate-freshness.js +267 -0
- package/dist/apps/control-plane/core/gate-freshness.js.map +1 -0
- package/dist/apps/control-plane/core/gate-log-extractor.d.ts +22 -0
- package/dist/apps/control-plane/core/gate-log-extractor.js +66 -0
- package/dist/apps/control-plane/core/gate-log-extractor.js.map +1 -0
- package/dist/apps/control-plane/core/gates.d.ts +11 -2
- package/dist/apps/control-plane/core/gates.js +67 -3
- package/dist/apps/control-plane/core/gates.js.map +1 -1
- package/dist/apps/control-plane/core/intake-artifacts.d.ts +109 -0
- package/dist/apps/control-plane/core/intake-artifacts.js +143 -0
- package/dist/apps/control-plane/core/intake-artifacts.js.map +1 -0
- package/dist/apps/control-plane/core/kernel-types.d.ts +8 -0
- package/dist/apps/control-plane/core/kernel.d.ts +256 -8
- package/dist/apps/control-plane/core/kernel.js +400 -14
- package/dist/apps/control-plane/core/kernel.js.map +1 -1
- package/dist/apps/control-plane/core/mainline-conflict.d.ts +7 -0
- package/dist/apps/control-plane/core/mainline-conflict.js +20 -0
- package/dist/apps/control-plane/core/mainline-conflict.js.map +1 -0
- package/dist/apps/control-plane/core/merge-repair.d.ts +35 -0
- package/dist/apps/control-plane/core/merge-repair.js +99 -0
- package/dist/apps/control-plane/core/merge-repair.js.map +1 -0
- package/dist/apps/control-plane/core/path-layout.d.ts +10 -0
- package/dist/apps/control-plane/core/path-layout.js +32 -2
- package/dist/apps/control-plane/core/path-layout.js.map +1 -1
- package/dist/apps/control-plane/core/path-rules.js +9 -3
- package/dist/apps/control-plane/core/path-rules.js.map +1 -1
- package/dist/apps/control-plane/core/plan-submit-recovery.d.ts +22 -0
- package/dist/apps/control-plane/core/plan-submit-recovery.js +78 -0
- package/dist/apps/control-plane/core/plan-submit-recovery.js.map +1 -0
- package/dist/apps/control-plane/core/questions.d.ts +40 -0
- package/dist/apps/control-plane/core/questions.js +2 -0
- package/dist/apps/control-plane/core/questions.js.map +1 -0
- package/dist/apps/control-plane/core/runtime-sessions.d.ts +4 -0
- package/dist/apps/control-plane/core/schemas.d.ts +2 -0
- package/dist/apps/control-plane/core/schemas.js +31 -1
- package/dist/apps/control-plane/core/schemas.js.map +1 -1
- package/dist/apps/control-plane/core/tool-caller.d.ts +18 -1
- package/dist/apps/control-plane/core/utils/index-normalizer.js +17 -4
- package/dist/apps/control-plane/core/utils/index-normalizer.js.map +1 -1
- package/dist/apps/control-plane/core/worktree-diff.d.ts +4 -0
- package/dist/apps/control-plane/core/worktree-diff.js +52 -0
- package/dist/apps/control-plane/core/worktree-diff.js.map +1 -0
- package/dist/apps/control-plane/index.d.ts +10 -2
- package/dist/apps/control-plane/index.js +9 -2
- package/dist/apps/control-plane/index.js.map +1 -1
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js +236 -6
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
- package/dist/apps/control-plane/mcp/kernel-tool-executor.js +16 -0
- package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-runtime.d.ts +5 -0
- package/dist/apps/control-plane/mcp/tool-runtime.js +40 -5
- package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
- package/dist/apps/control-plane/providers/api-worker-provider.d.ts +2 -2
- package/dist/apps/control-plane/providers/api-worker-provider.js +40 -9
- package/dist/apps/control-plane/providers/api-worker-provider.js.map +1 -1
- package/dist/apps/control-plane/providers/cli-worker-provider.d.ts +59 -3
- package/dist/apps/control-plane/providers/cli-worker-provider.js +758 -46
- package/dist/apps/control-plane/providers/cli-worker-provider.js.map +1 -1
- package/dist/apps/control-plane/providers/output-parsers/generic-output-parser.js +91 -1
- package/dist/apps/control-plane/providers/output-parsers/generic-output-parser.js.map +1 -1
- package/dist/apps/control-plane/providers/output-parsers/types.d.ts +2 -0
- package/dist/apps/control-plane/providers/provider-defaults.d.ts +12 -0
- package/dist/apps/control-plane/providers/provider-defaults.js +103 -7
- package/dist/apps/control-plane/providers/provider-defaults.js.map +1 -1
- package/dist/apps/control-plane/providers/providers.d.ts +50 -4
- package/dist/apps/control-plane/providers/providers.js +145 -14
- package/dist/apps/control-plane/providers/providers.js.map +1 -1
- package/dist/apps/control-plane/providers/worker-provider-factory.d.ts +2 -0
- package/dist/apps/control-plane/providers/worker-provider-factory.js +8 -1
- package/dist/apps/control-plane/providers/worker-provider-factory.js.map +1 -1
- package/dist/apps/control-plane/supervisor/artifact-stager.d.ts +5 -0
- package/dist/apps/control-plane/supervisor/artifact-stager.js +45 -0
- package/dist/apps/control-plane/supervisor/artifact-stager.js.map +1 -0
- package/dist/apps/control-plane/supervisor/build-wave-executor.d.ts +24 -1
- package/dist/apps/control-plane/supervisor/build-wave-executor.js +362 -150
- package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/execution-enrollment-service.d.ts +41 -0
- package/dist/apps/control-plane/supervisor/execution-enrollment-service.js +311 -0
- package/dist/apps/control-plane/supervisor/execution-enrollment-service.js.map +1 -0
- package/dist/apps/control-plane/supervisor/organizer-enrollment-scheduler.d.ts +15 -0
- package/dist/apps/control-plane/supervisor/organizer-enrollment-scheduler.js +93 -0
- package/dist/apps/control-plane/supervisor/organizer-enrollment-scheduler.js.map +1 -0
- package/dist/apps/control-plane/supervisor/organizer-sidecar-service.d.ts +44 -0
- package/dist/apps/control-plane/supervisor/organizer-sidecar-service.js +311 -0
- package/dist/apps/control-plane/supervisor/organizer-sidecar-service.js.map +1 -0
- package/dist/apps/control-plane/supervisor/plan-conformance-scorer.js +2 -5
- package/dist/apps/control-plane/supervisor/plan-conformance-scorer.js.map +1 -1
- package/dist/apps/control-plane/supervisor/planner-phase.d.ts +3 -0
- package/dist/apps/control-plane/supervisor/planner-phase.js +70 -0
- package/dist/apps/control-plane/supervisor/planner-phase.js.map +1 -0
- package/dist/apps/control-plane/supervisor/planning-wave-executor.d.ts +42 -0
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js +753 -55
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +19 -1
- package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js.map +1 -1
- package/dist/apps/control-plane/supervisor/qa-wave-executor.d.ts +21 -0
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js +287 -156
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/run-coordinator.d.ts +30 -1
- package/dist/apps/control-plane/supervisor/run-coordinator.js +561 -17
- package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
- package/dist/apps/control-plane/supervisor/runtime.d.ts +84 -0
- package/dist/apps/control-plane/supervisor/runtime.js +393 -3
- package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
- package/dist/apps/control-plane/supervisor/session-orchestrator.d.ts +54 -0
- package/dist/apps/control-plane/supervisor/session-orchestrator.js +176 -1
- package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
- package/dist/apps/control-plane/supervisor/types.d.ts +142 -1
- package/dist/apps/control-plane/supervisor/types.js.map +1 -1
- package/dist/apps/control-plane/supervisor/worker-decision-loop.d.ts +68 -2
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js +723 -89
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
- package/docs/core/ARCHITECTURE.md +227 -0
- package/docs/core/DECISIONS.md +94 -0
- package/docs/core/DOMAIN-LOGIC.md +60 -0
- package/docs/core/PATTERNS.md +201 -0
- package/docs/core/TROUBLESHOOTING.md +347 -0
- package/docs/core/intentgraph-dependencies.json +39860 -0
- package/docs/core/intentgraph.index.json +46580 -0
- package/docs/plans/2026-03-10-gate-failure-targeted-repair-design.md +224 -0
- package/docs/plans/2026-03-10-gate-failure-targeted-repair.md +1032 -0
- package/docs/superpowers/plans/2026-03-16-provider-cli-config.md +743 -0
- package/docs/superpowers/plans/2026-03-23-reconcile-divergence-fix.md +777 -0
- package/docs/superpowers/plans/2026-03-28-ordering-agent-implementation.md +1754 -0
- package/docs/superpowers/plans/2026-03-29-drop-zone-and-provider-optimization.md +1108 -0
- package/docs/superpowers/plans/2026-03-29-merge-target-feature-branch.md +685 -0
- package/docs/superpowers/plans/2026-03-29-organizer-sidecar-runtime-loop.md +1289 -0
- package/docs/superpowers/specs/2026-03-23-reconcile-divergence-fix-design.md +118 -0
- package/docs/superpowers/specs/2026-03-28-ordering-agent-spec-audit-design.md +50 -0
- package/docs/superpowers/specs/2026-03-29-drop-zone-and-provider-optimization-design.md +254 -0
- package/docs/superpowers/specs/2026-03-29-merge-target-feature-branch-design.md +152 -0
- package/docs/superpowers/specs/2026-03-29-organizer-sidecar-runtime-loop-design.md +225 -0
- package/package.json +3 -2
- package/packages/web-dashboard/package.json +2 -1
- package/packages/web-dashboard/src/app/analytics/page.tsx +36 -2
- package/packages/web-dashboard/src/app/api/actions/route.ts +274 -63
- package/packages/web-dashboard/src/app/api/actions/status/route.ts +35 -0
- package/packages/web-dashboard/src/app/api/analytics/provider/route.ts +18 -0
- package/packages/web-dashboard/src/app/api/collisions/approve/route.ts +58 -0
- package/packages/web-dashboard/src/app/api/features/[id]/checkpoint-diff/route.ts +36 -0
- package/packages/web-dashboard/src/app/api/features/[id]/checkpoints/route.ts +29 -0
- package/packages/web-dashboard/src/app/api/features/[id]/conflicts/abort/route.ts +29 -0
- package/packages/web-dashboard/src/app/api/features/[id]/conflicts/files/route.ts +30 -0
- package/packages/web-dashboard/src/app/api/features/[id]/conflicts/resolve/route.ts +51 -0
- package/packages/web-dashboard/src/app/api/features/[id]/conflicts/route.ts +75 -0
- package/packages/web-dashboard/src/app/api/features/[id]/diff/route.ts +16 -2
- package/packages/web-dashboard/src/app/api/features/[id]/files/route.ts +26 -0
- package/packages/web-dashboard/src/app/api/features/[id]/gate-history/route.ts +27 -0
- package/packages/web-dashboard/src/app/api/features/[id]/genealogy/route.ts +26 -0
- package/packages/web-dashboard/src/app/api/features/[id]/history/run/[runId]/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/history/runs/route.ts +34 -0
- package/packages/web-dashboard/src/app/api/features/[id]/intake-workspace/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/live-output/route.ts +74 -0
- package/packages/web-dashboard/src/app/api/features/[id]/plan/amend/route.ts +21 -0
- package/packages/web-dashboard/src/app/api/features/[id]/plan-progress/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/planner-artifacts/[artifact]/route.ts +78 -0
- package/packages/web-dashboard/src/app/api/features/[id]/planner-lifecycle/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/planning-workspace/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/questions/[questionId]/answer/route.ts +27 -0
- package/packages/web-dashboard/src/app/api/features/[id]/questions/route.ts +18 -0
- package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +14 -7
- package/packages/web-dashboard/src/app/api/features/[id]/route.ts +57 -2
- package/packages/web-dashboard/src/app/api/features/[id]/spec/route.ts +30 -0
- package/packages/web-dashboard/src/app/api/features/[id]/triage/route.ts +83 -0
- package/packages/web-dashboard/src/app/api/features/[id]/worker-events/route.ts +40 -0
- package/packages/web-dashboard/src/app/api/launch/preview/route.ts +86 -0
- package/packages/web-dashboard/src/app/api/launch/submit/route.ts +180 -0
- package/packages/web-dashboard/src/app/api/mainline/status/route.ts +74 -0
- package/packages/web-dashboard/src/app/api/merge-queue/route.ts +13 -0
- package/packages/web-dashboard/src/app/api/policy/budget/route.ts +14 -0
- package/packages/web-dashboard/src/app/api/projects/route.ts +11 -7
- package/packages/web-dashboard/src/app/api/reconciler/queue/route.ts +47 -0
- package/packages/web-dashboard/src/app/api/run/route.ts +26 -2
- package/packages/web-dashboard/src/app/api/runtime/events/route.ts +227 -0
- package/packages/web-dashboard/src/app/api/runtime/operations/route.ts +269 -0
- package/packages/web-dashboard/src/app/api/runtime/questions/route.ts +11 -0
- package/packages/web-dashboard/src/app/api/runtime/runs/route.ts +80 -0
- package/packages/web-dashboard/src/app/api/status/route.ts +4 -2
- package/packages/web-dashboard/src/app/feature/[id]/page.tsx +32 -42
- package/packages/web-dashboard/src/app/globals.css +34 -3
- package/packages/web-dashboard/src/app/launch/page.tsx +362 -0
- package/packages/web-dashboard/src/app/layout.tsx +23 -1
- package/packages/web-dashboard/src/app/page.tsx +263 -272
- package/packages/web-dashboard/src/components/dashboard/attention-strip.tsx +52 -0
- package/packages/web-dashboard/src/components/dashboard/collision-approval-drawer.tsx +185 -0
- package/packages/web-dashboard/src/components/dashboard/command-center-header.tsx +102 -0
- package/packages/web-dashboard/src/components/dashboard/mainline-status-banner.tsx +84 -0
- package/packages/web-dashboard/src/components/dashboard/merged-archive.tsx +36 -0
- package/packages/web-dashboard/src/components/dashboard/prioritized-queues.tsx +98 -0
- package/packages/web-dashboard/src/components/dashboard/reconciler-queue-card.tsx +115 -0
- package/packages/web-dashboard/src/components/dashboard/secondary-diagnostics-rail.tsx +48 -0
- package/packages/web-dashboard/src/components/dashboard/task-filter-bar.tsx +74 -0
- package/packages/web-dashboard/src/components/dashboard/triage-drawer.tsx +455 -0
- package/packages/web-dashboard/src/components/diff-viewer.tsx +19 -3
- package/packages/web-dashboard/src/components/evidence-viewer.tsx +65 -51
- package/packages/web-dashboard/src/components/feature-card.tsx +90 -7
- package/packages/web-dashboard/src/components/feature-cost-panel.tsx +112 -11
- package/packages/web-dashboard/src/components/feature-list-view.tsx +25 -4
- package/packages/web-dashboard/src/components/features/runtime-inspector/EventsTimelineView.tsx +260 -0
- package/packages/web-dashboard/src/components/features/runtime-inspector/OperationsListView.tsx +172 -0
- package/packages/web-dashboard/src/components/features/runtime-inspector/RuntimeInspectorPanel.tsx +896 -0
- package/packages/web-dashboard/src/components/filter-bar.tsx +7 -39
- package/packages/web-dashboard/src/components/focus/ActionableRiskList.tsx +46 -0
- package/packages/web-dashboard/src/components/focus/AgentRolePerformanceCard.tsx +200 -0
- package/packages/web-dashboard/src/components/focus/BlockedGuidanceBanner.tsx +149 -0
- package/packages/web-dashboard/src/components/focus/CheckpointInspector.tsx +123 -0
- package/packages/web-dashboard/src/components/focus/CheckpointRail.tsx +118 -0
- package/packages/web-dashboard/src/components/focus/CheckpointScrubber.tsx +249 -0
- package/packages/web-dashboard/src/components/focus/CollisionApprovalBanner.tsx +192 -0
- package/packages/web-dashboard/src/components/focus/CollisionRadar.tsx +136 -0
- package/packages/web-dashboard/src/components/focus/ConflictStatusCard.tsx +52 -0
- package/packages/web-dashboard/src/components/focus/ContextSidebar.tsx +108 -0
- package/packages/web-dashboard/src/components/focus/DiagnosisPanel.tsx +68 -0
- package/packages/web-dashboard/src/components/focus/FeatureDecisionBanner.tsx +68 -0
- package/packages/web-dashboard/src/components/focus/FeatureQuestionAnswerPanel.tsx +167 -0
- package/packages/web-dashboard/src/components/focus/FocusHeader.tsx +54 -0
- package/packages/web-dashboard/src/components/focus/FocusLayout.tsx +283 -0
- package/packages/web-dashboard/src/components/focus/GateFlakinessSummary.tsx +144 -0
- package/packages/web-dashboard/src/components/focus/GenealogyTree.tsx +34 -0
- package/packages/web-dashboard/src/components/focus/HeroBlock.tsx +67 -0
- package/packages/web-dashboard/src/components/focus/LiveAgentConsole.tsx +277 -0
- package/packages/web-dashboard/src/components/focus/MergeQueueCard.tsx +78 -0
- package/packages/web-dashboard/src/components/focus/OperationalSummaryCard.tsx +227 -0
- package/packages/web-dashboard/src/components/focus/PinnedActions.tsx +96 -0
- package/packages/web-dashboard/src/components/focus/PlanAmendmentPanel.tsx +250 -0
- package/packages/web-dashboard/src/components/focus/PlanProgressPanel.tsx +133 -0
- package/packages/web-dashboard/src/components/focus/PlannerArtifactViewer.tsx +158 -0
- package/packages/web-dashboard/src/components/focus/PlannerLifecycleHeader.tsx +141 -0
- package/packages/web-dashboard/src/components/focus/ProgressSnapshotCard.tsx +113 -0
- package/packages/web-dashboard/src/components/focus/RecentMaterialChanges.tsx +69 -0
- package/packages/web-dashboard/src/components/focus/RoleLogViewer.tsx +436 -0
- package/packages/web-dashboard/src/components/focus/RunHistoryBrowser.tsx +62 -0
- package/packages/web-dashboard/src/components/focus/SpecViewer.tsx +172 -0
- package/packages/web-dashboard/src/components/focus/TabBar.tsx +33 -0
- package/packages/web-dashboard/src/components/focus/UsageBurnChart.tsx +212 -0
- package/packages/web-dashboard/src/components/focus/VerificationSummaryCard.tsx +122 -0
- package/packages/web-dashboard/src/components/focus/tabs/ChangesTab.tsx +325 -0
- package/packages/web-dashboard/src/components/focus/tabs/ConflictsTab.tsx +395 -0
- package/packages/web-dashboard/src/components/focus/tabs/GatesQaTab.tsx +38 -0
- package/packages/web-dashboard/src/components/focus/tabs/HistoryTab.tsx +213 -0
- package/packages/web-dashboard/src/components/focus/tabs/IntakeTab.tsx +429 -0
- package/packages/web-dashboard/src/components/focus/tabs/OverviewTab.tsx +217 -0
- package/packages/web-dashboard/src/components/focus/tabs/PlanningTab.tsx +390 -0
- package/packages/web-dashboard/src/components/focus/tabs/ReviewTab.tsx +497 -0
- package/packages/web-dashboard/src/components/focus/tabs/RuntimeTab.tsx +213 -0
- package/packages/web-dashboard/src/components/focus/tabs/TranscriptTab.tsx +315 -0
- package/packages/web-dashboard/src/components/gate-results.tsx +2 -2
- package/packages/web-dashboard/src/components/human-input-panel.tsx +33 -57
- package/packages/web-dashboard/src/components/kanban-board.tsx +4 -0
- package/packages/web-dashboard/src/components/launch/launch-draft-card.tsx +154 -0
- package/packages/web-dashboard/src/components/plan-viewer.tsx +147 -69
- package/packages/web-dashboard/src/components/quick-launch-panel.tsx +20 -47
- package/packages/web-dashboard/src/components/summary-bar.tsx +30 -76
- package/packages/web-dashboard/src/lib/aop-client.ts +2484 -36
- package/packages/web-dashboard/src/lib/blocked-state-guidance.ts +475 -0
- package/packages/web-dashboard/src/lib/collision-radar.ts +136 -0
- package/packages/web-dashboard/src/lib/dashboard-action-states.ts +204 -0
- package/packages/web-dashboard/src/lib/dashboard-runtime-client.ts +439 -0
- package/packages/web-dashboard/src/lib/dashboard-utils.ts +179 -18
- package/packages/web-dashboard/src/lib/drop-zone-utils.ts +92 -0
- package/packages/web-dashboard/src/lib/focus-detail-derivations.ts +958 -0
- package/packages/web-dashboard/src/lib/focus-view.ts +300 -0
- package/packages/web-dashboard/src/lib/health-diagnosis.ts +356 -0
- package/packages/web-dashboard/src/lib/launch-contracts.ts +77 -0
- package/packages/web-dashboard/src/lib/launch-markdown.ts +103 -0
- package/packages/web-dashboard/src/lib/launch-page-preview.ts +89 -0
- package/packages/web-dashboard/src/lib/live-feed.ts +1 -1
- package/packages/web-dashboard/src/lib/multi-project-config.ts +33 -0
- package/packages/web-dashboard/src/lib/orchestrator-tools.ts +881 -60
- package/packages/web-dashboard/src/lib/planner-workspace.ts +1285 -0
- package/packages/web-dashboard/src/lib/review-contracts.ts +5 -3
- package/packages/web-dashboard/src/lib/runtime-files.ts +285 -0
- package/packages/web-dashboard/src/lib/tool-catalog.ts +51 -0
- package/packages/web-dashboard/src/lib/types.ts +731 -3
- package/packages/web-dashboard/src/lib/usage-burn.ts +175 -0
- package/packages/web-dashboard/src/lib/worktree-diff.ts +128 -0
- package/packages/web-dashboard/src/styles/dashboard.module.css +1742 -459
- package/packages/web-dashboard/test/api/actions/route.spec.ts +675 -0
- package/packages/web-dashboard/test/api/features/diff.route.spec.ts +57 -0
- package/packages/web-dashboard/test/api/features/feature.route.spec.ts +99 -0
- package/packages/web-dashboard/test/api/features/live-output.route.spec.ts +123 -0
- package/packages/web-dashboard/test/api/features/plan-amend.route.spec.ts +95 -0
- package/packages/web-dashboard/test/api/features/planner-workspaces.route.spec.ts +162 -0
- package/packages/web-dashboard/test/api/features/question-answer.route.spec.ts +99 -0
- package/packages/web-dashboard/test/api/features/triage.route.spec.ts +195 -0
- package/packages/web-dashboard/test/api/launch/preview.route.spec.ts +149 -0
- package/packages/web-dashboard/test/api/launch/submit.route.spec.ts +382 -0
- package/packages/web-dashboard/test/api/runtime/events/route.spec.ts +164 -0
- package/packages/web-dashboard/test/api/runtime/operations/route.spec.ts +156 -0
- package/packages/web-dashboard/test/api/runtime/runs/route.spec.ts +112 -0
- package/packages/web-dashboard/test/components/changes-tab.spec.tsx +76 -0
- package/packages/web-dashboard/test/components/command-center-root.spec.tsx +87 -0
- package/packages/web-dashboard/test/components/diagnosis-panel.spec.tsx +59 -0
- package/packages/web-dashboard/test/components/feature-card.spec.tsx +45 -0
- package/packages/web-dashboard/test/components/focus-layout.spec.tsx +299 -0
- package/packages/web-dashboard/test/components/gate-results.spec.tsx +39 -0
- package/packages/web-dashboard/test/components/gates-qa-tab.spec.tsx +118 -0
- package/packages/web-dashboard/test/components/human-input-panel.spec.tsx +54 -0
- package/packages/web-dashboard/test/components/intake-tab.spec.tsx +210 -0
- package/packages/web-dashboard/test/components/kanban-board.spec.tsx +35 -0
- package/packages/web-dashboard/test/components/launch-draft-card.spec.tsx +114 -0
- package/packages/web-dashboard/test/components/launch-page.spec.tsx +79 -0
- package/packages/web-dashboard/test/components/overview-tab.spec.tsx +236 -0
- package/packages/web-dashboard/test/components/planning-tab.spec.tsx +202 -0
- package/packages/web-dashboard/test/components/review-tab.spec.tsx +169 -0
- package/packages/web-dashboard/test/components/role-log-viewer.spec.ts +42 -0
- package/packages/web-dashboard/test/components/runtime-inspector.spec.tsx +22 -0
- package/packages/web-dashboard/test/components/runtime-tab.spec.tsx +133 -0
- package/packages/web-dashboard/test/components/transcript-tab.spec.tsx +46 -0
- package/packages/web-dashboard/test/components/triage-drawer.spec.tsx +159 -0
- package/packages/web-dashboard/test/lib/aop-client.spec.ts +235 -0
- package/packages/web-dashboard/test/lib/dashboard-runtime-client.spec.ts +144 -0
- package/packages/web-dashboard/test/lib/focus-detail-derivations.spec.ts +314 -0
- package/packages/web-dashboard/test/lib/focus-view.spec.ts +248 -0
- package/packages/web-dashboard/test/lib/health-diagnosis.spec.ts +277 -0
- package/packages/web-dashboard/test/lib/launch-markdown.spec.ts +36 -0
- package/packages/web-dashboard/test/lib/multi-project-config.spec.ts +54 -0
- package/packages/web-dashboard/test/lib/orchestrator-tools.spec.ts +352 -0
- package/packages/web-dashboard/test/lib/planner-workspace.spec.ts +289 -0
- package/packages/web-dashboard/test/lib/worktree-diff.spec.ts +119 -0
- package/packages/web-dashboard/vitest.config.ts +2 -0
- package/spec-files/completed/agentic_orchestrator_add_feature_to_active_execution_spec.md +557 -0
- package/spec-files/completed/agentic_orchestrator_dashboard_command_center_redesign_spec.md +1147 -0
- package/spec-files/completed/agentic_orchestrator_execution_mode_spec.md +18 -16
- package/spec-files/completed/agentic_orchestrator_feature_focus_view_track_a_spec.md +672 -0
- package/spec-files/completed/agentic_orchestrator_feature_focus_view_track_b_spec.md +794 -0
- package/spec-files/completed/agentic_orchestrator_feature_focus_view_track_c_decision_centric_remediation_spec.md +1037 -0
- package/spec-files/completed/agentic_orchestrator_feature_focus_view_ux_redesign_spec.md +1432 -0
- package/spec-files/completed/agentic_orchestrator_focus_plan_tab_intake_planning_workspace_spec.md +921 -0
- package/spec-files/completed/agentic_orchestrator_intentional_collision_override_spec.md +584 -0
- package/spec-files/completed/agentic_orchestrator_interactive_planning_intake_and_requirements_verification_spec.md +1185 -0
- package/spec-files/completed/agentic_orchestrator_reactive_execution_enrollment_spec.md +864 -0
- package/spec-files/{outstanding → completed}/agentic_orchestrator_runtime_inspection_spec.md +92 -19
- package/spec-files/completed/agentic_orchestrator_scope_aware_run_lease_spec.md +408 -0
- package/spec-files/completed/git-reconciliation-engine.md +827 -0
- package/spec-files/outstanding/agentic_orchestrator_dashboard_quick_launch_and_control_surface_spec.md +331 -0
- package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +16 -6
- package/spec-files/outstanding/agentic_orchestrator_evidence_integrity_doctor_spec.md +60 -9
- package/spec-files/outstanding/agentic_orchestrator_focus_plan_tab_execution_contract_workspace_spec.md +616 -0
- package/spec-files/outstanding/agentic_orchestrator_headless_standby_dashboard_runtime_spec.md +310 -0
- package/spec-files/outstanding/agentic_orchestrator_human_input_interaction_protocol_spec.md +175 -72
- package/spec-files/outstanding/agentic_orchestrator_interactive_rename_cleanup_spec.md +197 -0
- package/spec-files/outstanding/agentic_orchestrator_interactive_resume_and_reconciliation_disposition_spec.md +412 -0
- package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +166 -137
- package/spec-files/outstanding/agentic_orchestrator_observability_replay_spec.md +3 -3
- package/spec-files/outstanding/agentic_orchestrator_phase_specific_agent_profiles_and_token_telemetry_spec.md +303 -0
- package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +18 -5
- package/spec-files/outstanding/agentic_orchestrator_policy_stratification_spec.md +225 -0
- package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +77 -50
- package/spec-files/outstanding/agentic_orchestrator_ready_to_merge_branch_handoff_spec.md +724 -0
- package/spec-files/outstanding/agentic_orchestrator_remove_deterministic_mode_spec.md +263 -0
- package/spec-files/outstanding/agentic_orchestrator_request_more_context_and_dashboard_human_input_spec.md +456 -0
- package/spec-files/outstanding/agentic_orchestrator_spec_coverage_and_reconciliation_enforcement_spec.md +1411 -0
- package/spec-files/outstanding/agentic_orchestrator_spec_ordering_agent_spec.md +370 -0
- package/spec-files/outstanding/shadow_workspace_implementation_spec.md +1 -1
- package/spec-files/progress.md +2026 -120
- package/specs/001-runtime-inspection/checklists/requirements.md +35 -0
- package/specs/001-runtime-inspection/design.md +338 -0
- package/specs/001-runtime-inspection/spec.md +95 -0
- package/specs/002-scope-aware-lease/checklists/requirements.md +35 -0
- package/specs/002-scope-aware-lease/contracts/lease-registry.schema.json +101 -0
- package/specs/002-scope-aware-lease/data-model.md +236 -0
- package/specs/002-scope-aware-lease/plan.md +766 -0
- package/specs/002-scope-aware-lease/quickstart.md +150 -0
- package/specs/002-scope-aware-lease/research.md +135 -0
- package/specs/002-scope-aware-lease/spec.md +128 -0
- package/specs/002-scope-aware-lease/tasks.md +767 -0
- package/tsconfig.json +1 -1
- package/vitest.config.ts +28 -0
- package/ARCHITECTURE_ADHERENCE_ANALYSIS.md +0 -871
- package/packages/web-dashboard/next-env.d.ts +0 -6
- package/packages/web-dashboard/src/components/detail-panel.tsx +0 -1124
- package/packages/web-dashboard/src/components/review-workspace.tsx +0 -1162
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_artifact_database_publishing_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_cli_shell_tab_completion_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_dashboard_diff_and_agent_console_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_performance_improvements_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_persistent_worker_runtime_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_provider_auth_bootstrap_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_real_worker_provider_execution_spec.md +0 -0
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import crypto from 'node:crypto';
|
|
2
2
|
import { stableHash } from '../core/fs.js';
|
|
3
|
+
import { nowIso } from '../core/fs.js';
|
|
4
|
+
import { STATUS, TOOLS } from '../core/constants.js';
|
|
5
|
+
import {
|
|
6
|
+
asPlanRecord,
|
|
7
|
+
recoverStalePlanVersionConflict,
|
|
8
|
+
isPlanVersionConflictError,
|
|
9
|
+
} from '../core/plan-submit-recovery.js';
|
|
3
10
|
import type { ExecutionMode, WorkerProvider } from '../providers/providers.js';
|
|
4
11
|
import { createOperationId, type ToolClient } from '../mcp/tool-client.js';
|
|
5
12
|
import { withOperationIdIfRequired } from '../application/tools/tool-metadata.js';
|
|
@@ -11,6 +18,17 @@ import { QaWaveExecutor } from './qa-wave-executor.js';
|
|
|
11
18
|
import { LeaseHeartbeatService } from './lease-heartbeat-service.js';
|
|
12
19
|
import { RunCoordinator } from './run-coordinator.js';
|
|
13
20
|
import { WorkerDecisionLoop } from './worker-decision-loop.js';
|
|
21
|
+
import {
|
|
22
|
+
CapacityAwareEnrollmentScheduler,
|
|
23
|
+
ExecutionEnrollmentService,
|
|
24
|
+
} from './execution-enrollment-service.js';
|
|
25
|
+
import { OrganizerAgentEnrollmentScheduler } from './organizer-enrollment-scheduler.js';
|
|
26
|
+
import { OrganizerSidecarService } from './organizer-sidecar-service.js';
|
|
27
|
+
import { AopPathLayout } from '../core/path-layout.js';
|
|
28
|
+
import { ArtifactStager } from './artifact-stager.js';
|
|
29
|
+
import Ajv2020Import from 'ajv/dist/2020.js';
|
|
30
|
+
import type { ValidateFunction } from 'ajv';
|
|
31
|
+
import { readFileSync } from 'node:fs';
|
|
14
32
|
import { createNotifierService } from '../application/services/notifier-service.js';
|
|
15
33
|
import { ReactionsService } from '../application/services/reactions-service.js';
|
|
16
34
|
import { ActivityMonitorService } from '../application/services/activity-monitor-service.js';
|
|
@@ -44,6 +62,7 @@ import type { ReactionsPolicy } from '../application/services/reactions-service.
|
|
|
44
62
|
import type {
|
|
45
63
|
AgentPromptProvider,
|
|
46
64
|
AppError,
|
|
65
|
+
EnrollmentScheduler,
|
|
47
66
|
FeatureClusterPatcher,
|
|
48
67
|
FeatureInput,
|
|
49
68
|
InitialPlanGenerator,
|
|
@@ -58,6 +77,18 @@ import type {
|
|
|
58
77
|
} from './types.js';
|
|
59
78
|
|
|
60
79
|
type NamedContract = { name: string };
|
|
80
|
+
type RunHistoryStatus = 'active' | 'completed' | 'failed' | 'timeout' | 'interrupted';
|
|
81
|
+
type RunHistoryEntry = {
|
|
82
|
+
run_id: string;
|
|
83
|
+
started_at: string;
|
|
84
|
+
ended_at?: string | null;
|
|
85
|
+
status?: RunHistoryStatus;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
interface RunHistoryUpdater {
|
|
89
|
+
markRunStarted: (featureId: string) => Promise<void>;
|
|
90
|
+
markRunEnded: (featureId: string) => Promise<void>;
|
|
91
|
+
}
|
|
61
92
|
|
|
62
93
|
function asPositiveInteger(value: unknown, fallback: number): number {
|
|
63
94
|
if (typeof value !== 'number' || !Number.isFinite(value) || value < 1) {
|
|
@@ -112,10 +143,108 @@ function resolveAdapterName(
|
|
|
112
143
|
}
|
|
113
144
|
}
|
|
114
145
|
|
|
146
|
+
function isRunHistoryStatus(value: unknown): value is RunHistoryStatus {
|
|
147
|
+
return (
|
|
148
|
+
value === 'active' ||
|
|
149
|
+
value === 'completed' ||
|
|
150
|
+
value === 'failed' ||
|
|
151
|
+
value === 'timeout' ||
|
|
152
|
+
value === 'interrupted'
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function asRunHistoryEntry(value: unknown): RunHistoryEntry | null {
|
|
157
|
+
if (!value || typeof value !== 'object') {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
const record = value as Record<string, unknown>;
|
|
161
|
+
if (typeof record.run_id !== 'string' || typeof record.started_at !== 'string') {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
const entry: RunHistoryEntry = {
|
|
165
|
+
run_id: record.run_id,
|
|
166
|
+
started_at: record.started_at,
|
|
167
|
+
};
|
|
168
|
+
const endedAt = record.ended_at;
|
|
169
|
+
if (typeof endedAt === 'string' || endedAt === null) {
|
|
170
|
+
entry.ended_at = endedAt as string | null;
|
|
171
|
+
}
|
|
172
|
+
if (isRunHistoryStatus(record.status)) {
|
|
173
|
+
entry.status = record.status;
|
|
174
|
+
}
|
|
175
|
+
return entry;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function normalizeRunHistory(value: unknown): RunHistoryEntry[] {
|
|
179
|
+
if (!Array.isArray(value)) {
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
return value.map(asRunHistoryEntry).filter((entry): entry is RunHistoryEntry => entry !== null);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function sortRunHistory(entries: RunHistoryEntry[]): RunHistoryEntry[] {
|
|
186
|
+
return [...entries].sort((left, right) => {
|
|
187
|
+
const leftTs = Date.parse(left.started_at);
|
|
188
|
+
const rightTs = Date.parse(right.started_at);
|
|
189
|
+
const normalizedLeft = Number.isNaN(leftTs) ? 0 : leftTs;
|
|
190
|
+
const normalizedRight = Number.isNaN(rightTs) ? 0 : rightTs;
|
|
191
|
+
return normalizedRight - normalizedLeft;
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function resolveRunStatus(frontMatter: Record<string, unknown>): RunHistoryStatus {
|
|
196
|
+
const status = typeof frontMatter.status === 'string' ? frontMatter.status : '';
|
|
197
|
+
const reason = typeof frontMatter.status_reason === 'string' ? frontMatter.status_reason : '';
|
|
198
|
+
if (reason.toLowerCase().includes('timeout')) {
|
|
199
|
+
return 'timeout';
|
|
200
|
+
}
|
|
201
|
+
if (status === STATUS.MERGED || status === STATUS.READY_TO_MERGE) {
|
|
202
|
+
return 'completed';
|
|
203
|
+
}
|
|
204
|
+
if (status === STATUS.FAILED) {
|
|
205
|
+
return 'failed';
|
|
206
|
+
}
|
|
207
|
+
if (status === STATUS.BLOCKED || status === STATUS.PAUSED_BUDGET) {
|
|
208
|
+
return 'interrupted';
|
|
209
|
+
}
|
|
210
|
+
return 'interrupted';
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function isVersionConflictError(error: unknown): boolean {
|
|
214
|
+
return isPlanVersionConflictError(error);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
class RunHistorySessionOrchestrator extends SessionOrchestrator {
|
|
218
|
+
private readonly runHistoryUpdater: RunHistoryUpdater;
|
|
219
|
+
|
|
220
|
+
constructor(
|
|
221
|
+
dependencies: ConstructorParameters<typeof SessionOrchestrator>[0],
|
|
222
|
+
runHistoryUpdater: RunHistoryUpdater,
|
|
223
|
+
) {
|
|
224
|
+
super(dependencies);
|
|
225
|
+
this.runHistoryUpdater = runHistoryUpdater;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
override async initializeFeatureCluster(featureId: string): Promise<void> {
|
|
229
|
+
await super.initializeFeatureCluster(featureId);
|
|
230
|
+
await this.runHistoryUpdater.markRunStarted(featureId);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
override async closeFeatureCluster(featureId: string): Promise<void> {
|
|
234
|
+
await super.closeFeatureCluster(featureId);
|
|
235
|
+
await this.runHistoryUpdater.markRunEnded(featureId);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
115
239
|
/**
|
|
116
240
|
* @fileoverview Multi-agent supervisor runtime for orchestrating feature development.
|
|
117
241
|
*/
|
|
118
242
|
|
|
243
|
+
/**
|
|
244
|
+
* Multi-agent supervisor runtime that coordinates planning, build, and QA waves
|
|
245
|
+
* across concurrent feature clusters. Implements tool calling, prompt loading,
|
|
246
|
+
* plan generation, and session lifecycle management.
|
|
247
|
+
*/
|
|
119
248
|
export class SupervisorRuntime
|
|
120
249
|
implements SupervisorToolCaller, AgentPromptProvider, InitialPlanGenerator, FeatureClusterPatcher
|
|
121
250
|
{
|
|
@@ -136,6 +265,8 @@ export class SupervisorRuntime
|
|
|
136
265
|
private readonly workerDecisionLoop: WorkerDecisionLoop;
|
|
137
266
|
private readonly leaseHeartbeatService: LeaseHeartbeatService;
|
|
138
267
|
private readonly runCoordinator: RunCoordinator;
|
|
268
|
+
private readonly executionEnrollmentService: ExecutionEnrollmentService;
|
|
269
|
+
private readonly organizerSidecar: OrganizerSidecarService | null;
|
|
139
270
|
private readonly cliExecutionMode: ExecutionMode | null;
|
|
140
271
|
private readonly interactiveConfig: InteractiveExecutionConfig;
|
|
141
272
|
private readonly worktreeWatchdogService: WorktreeWatchdogService;
|
|
@@ -197,10 +328,12 @@ export class SupervisorRuntime
|
|
|
197
328
|
'github',
|
|
198
329
|
);
|
|
199
330
|
|
|
331
|
+
const roleSelections = options.role_selections ?? null;
|
|
200
332
|
this.state = {
|
|
201
333
|
runId,
|
|
202
334
|
ownerInstanceId,
|
|
203
335
|
orchestratorSessionId: null,
|
|
336
|
+
reconcilerSessionId: null,
|
|
204
337
|
sessionsByFeature: new Map(),
|
|
205
338
|
queue: [],
|
|
206
339
|
runMetadata: {
|
|
@@ -208,6 +341,7 @@ export class SupervisorRuntime
|
|
|
208
341
|
owner_instance_id: ownerInstanceId,
|
|
209
342
|
takeover_stale_run: this.takeoverStaleRun,
|
|
210
343
|
resolved_provider: provider.selection,
|
|
344
|
+
resolved_role_providers: roleSelections,
|
|
211
345
|
adapters: {
|
|
212
346
|
notification_channel: notificationChannel,
|
|
213
347
|
activity_detector: activityDetector,
|
|
@@ -217,14 +351,26 @@ export class SupervisorRuntime
|
|
|
217
351
|
};
|
|
218
352
|
|
|
219
353
|
this.promptBundleLoader = new PromptBundleLoader(this.kernel);
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
}
|
|
354
|
+
const runHistoryUpdater: RunHistoryUpdater = {
|
|
355
|
+
markRunStarted: async (featureId: string) => {
|
|
356
|
+
await this.markRunHistoryStarted(featureId);
|
|
357
|
+
},
|
|
358
|
+
markRunEnded: async (featureId: string) => {
|
|
359
|
+
await this.markRunHistoryEnded(featureId);
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
this.sessionOrchestrator = new RunHistorySessionOrchestrator(
|
|
364
|
+
{
|
|
365
|
+
kernel: this.kernel,
|
|
366
|
+
runtimeStateReader: this.kernel,
|
|
367
|
+
provider: this.provider,
|
|
368
|
+
promptProvider: this,
|
|
369
|
+
toolCaller: this,
|
|
370
|
+
state: this.state,
|
|
371
|
+
},
|
|
372
|
+
runHistoryUpdater,
|
|
373
|
+
);
|
|
228
374
|
|
|
229
375
|
const notifier = createNotifierService(this.kernel.getPolicySnapshot(), notificationChannel);
|
|
230
376
|
const reactionsPolicy = this.resolveReactionsPolicy();
|
|
@@ -289,10 +435,17 @@ export class SupervisorRuntime
|
|
|
289
435
|
resolveRoleSessionId: (role, featureId) =>
|
|
290
436
|
this.resolveRoleSessionIdByFeature(role, featureId),
|
|
291
437
|
});
|
|
438
|
+
let coordinatorRef: RunCoordinator | null = null;
|
|
439
|
+
const safeCheckpointHook = async () => {
|
|
440
|
+
if (coordinatorRef !== null) {
|
|
441
|
+
await coordinatorRef.handleSafeCheckpoint();
|
|
442
|
+
}
|
|
443
|
+
};
|
|
292
444
|
|
|
293
445
|
this.planningWaveExecutor = new PlanningWaveExecutor({
|
|
294
446
|
toolCaller: this,
|
|
295
447
|
planGenerator: this,
|
|
448
|
+
plannerSessionSync: this.sessionOrchestrator,
|
|
296
449
|
workerDecisionRunner: this.workerDecisionLoop,
|
|
297
450
|
providerMode: this.provider.mode,
|
|
298
451
|
outputLoopDetector,
|
|
@@ -307,8 +460,12 @@ export class SupervisorRuntime
|
|
|
307
460
|
runId: () => this.state.runId,
|
|
308
461
|
providerName: this.provider.selection.provider,
|
|
309
462
|
modelName: this.provider.selection.model,
|
|
463
|
+
safeCheckpointHook,
|
|
464
|
+
getPolicySnapshot: () => this.kernel.getPolicySnapshot(),
|
|
310
465
|
});
|
|
311
466
|
|
|
467
|
+
const artifactStager = new ArtifactStager(this.kernel.getRepoRoot());
|
|
468
|
+
|
|
312
469
|
this.buildWaveExecutor = new BuildWaveExecutor({
|
|
313
470
|
toolCaller: this,
|
|
314
471
|
workerDecisionRunner: this.workerDecisionLoop,
|
|
@@ -328,6 +485,8 @@ export class SupervisorRuntime
|
|
|
328
485
|
runId: () => this.state.runId,
|
|
329
486
|
providerName: this.provider.selection.provider,
|
|
330
487
|
modelName: this.provider.selection.model,
|
|
488
|
+
safeCheckpointHook,
|
|
489
|
+
artifactStager,
|
|
331
490
|
});
|
|
332
491
|
|
|
333
492
|
this.qaWaveExecutor = new QaWaveExecutor({
|
|
@@ -354,6 +513,7 @@ export class SupervisorRuntime
|
|
|
354
513
|
runId: () => this.state.runId,
|
|
355
514
|
providerName: this.provider.selection.provider,
|
|
356
515
|
modelName: this.provider.selection.model,
|
|
516
|
+
safeCheckpointHook,
|
|
357
517
|
});
|
|
358
518
|
|
|
359
519
|
this.leaseHeartbeatService = new LeaseHeartbeatService({
|
|
@@ -361,6 +521,39 @@ export class SupervisorRuntime
|
|
|
361
521
|
state: this.state,
|
|
362
522
|
});
|
|
363
523
|
|
|
524
|
+
const capacityScheduler = new CapacityAwareEnrollmentScheduler();
|
|
525
|
+
const organizerEnabled = this.kernel.getAgentsConfig().roles?.organizer != null;
|
|
526
|
+
const pathLayout = new AopPathLayout(this.kernel.getRepoRoot());
|
|
527
|
+
const scheduler: EnrollmentScheduler = organizerEnabled
|
|
528
|
+
? new OrganizerAgentEnrollmentScheduler({
|
|
529
|
+
orderingArtifactPath: pathLayout.organizerOrderingPath(this.state.ownerInstanceId),
|
|
530
|
+
fallback: capacityScheduler,
|
|
531
|
+
})
|
|
532
|
+
: capacityScheduler;
|
|
533
|
+
|
|
534
|
+
this.executionEnrollmentService = new ExecutionEnrollmentService({
|
|
535
|
+
kernel: this.kernel,
|
|
536
|
+
state: this.state,
|
|
537
|
+
scheduler,
|
|
538
|
+
maxActiveFeatures: this.maxActiveFeatures,
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
if (organizerEnabled) {
|
|
542
|
+
const sidecarValidator = this.compileOrganizerSchema(
|
|
543
|
+
pathLayout.organizerOrderingSchemaPath(),
|
|
544
|
+
);
|
|
545
|
+
this.organizerSidecar = new OrganizerSidecarService({
|
|
546
|
+
provider: this.provider,
|
|
547
|
+
organizerSessionId: () => this.state.organizerSessionId ?? null,
|
|
548
|
+
kernel: this.kernel,
|
|
549
|
+
state: this.state,
|
|
550
|
+
artifactPath: pathLayout.organizerOrderingPath(this.state.ownerInstanceId),
|
|
551
|
+
schemaValidator: sidecarValidator,
|
|
552
|
+
});
|
|
553
|
+
} else {
|
|
554
|
+
this.organizerSidecar = null;
|
|
555
|
+
}
|
|
556
|
+
|
|
364
557
|
this.runCoordinator = new RunCoordinator({
|
|
365
558
|
kernel: this.kernel,
|
|
366
559
|
provider: this.provider,
|
|
@@ -380,9 +573,12 @@ export class SupervisorRuntime
|
|
|
380
573
|
notifier,
|
|
381
574
|
prMonitor,
|
|
382
575
|
issueTracker,
|
|
576
|
+
executionEnrollmentService: this.executionEnrollmentService,
|
|
383
577
|
});
|
|
578
|
+
coordinatorRef = this.runCoordinator;
|
|
384
579
|
}
|
|
385
580
|
|
|
581
|
+
/** Unique identifier for the current supervisor run. */
|
|
386
582
|
get runId(): string {
|
|
387
583
|
return this.state.runId;
|
|
388
584
|
}
|
|
@@ -391,6 +587,7 @@ export class SupervisorRuntime
|
|
|
391
587
|
this.state.runId = value;
|
|
392
588
|
}
|
|
393
589
|
|
|
590
|
+
/** Unique identifier for the supervisor process instance that owns this run. */
|
|
394
591
|
get ownerInstanceId(): string {
|
|
395
592
|
return this.state.ownerInstanceId;
|
|
396
593
|
}
|
|
@@ -399,6 +596,7 @@ export class SupervisorRuntime
|
|
|
399
596
|
this.state.ownerInstanceId = value;
|
|
400
597
|
}
|
|
401
598
|
|
|
599
|
+
/** Session ID for the global orchestrator agent. */
|
|
402
600
|
get orchestratorSessionId(): string | null {
|
|
403
601
|
return this.state.orchestratorSessionId;
|
|
404
602
|
}
|
|
@@ -407,6 +605,16 @@ export class SupervisorRuntime
|
|
|
407
605
|
this.state.orchestratorSessionId = value;
|
|
408
606
|
}
|
|
409
607
|
|
|
608
|
+
/** Session ID for the post-QA reconciliation agent. */
|
|
609
|
+
get reconcilerSessionId(): string | null {
|
|
610
|
+
return this.state.reconcilerSessionId;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
set reconcilerSessionId(value: string | null) {
|
|
614
|
+
this.state.reconcilerSessionId = value;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
/** Map of feature IDs to their per-role worker session identifiers. */
|
|
410
618
|
get sessionsByFeature(): Map<string, WorkerSessions> {
|
|
411
619
|
return this.state.sessionsByFeature;
|
|
412
620
|
}
|
|
@@ -415,6 +623,7 @@ export class SupervisorRuntime
|
|
|
415
623
|
this.state.sessionsByFeature = value;
|
|
416
624
|
}
|
|
417
625
|
|
|
626
|
+
/** Pending feature inputs waiting to be enrolled into active execution. */
|
|
418
627
|
get queue(): FeatureInput[] {
|
|
419
628
|
return this.state.queue;
|
|
420
629
|
}
|
|
@@ -423,6 +632,7 @@ export class SupervisorRuntime
|
|
|
423
632
|
this.state.queue = value;
|
|
424
633
|
}
|
|
425
634
|
|
|
635
|
+
/** Metadata snapshot for the current run (timestamps, provider info, adapter config). */
|
|
426
636
|
get runMetadata(): Record<string, unknown> {
|
|
427
637
|
return this.state.runMetadata;
|
|
428
638
|
}
|
|
@@ -431,6 +641,7 @@ export class SupervisorRuntime
|
|
|
431
641
|
this.state.runMetadata = value;
|
|
432
642
|
}
|
|
433
643
|
|
|
644
|
+
/** Cached role prompt bundle, or null if not yet loaded. */
|
|
434
645
|
get promptsCache(): PromptBundle | null {
|
|
435
646
|
return this.promptBundleLoader.peekCache();
|
|
436
647
|
}
|
|
@@ -439,10 +650,23 @@ export class SupervisorRuntime
|
|
|
439
650
|
this.promptBundleLoader.setCache(value);
|
|
440
651
|
}
|
|
441
652
|
|
|
653
|
+
/**
|
|
654
|
+
* Starts the supervisor run, enrolling features and delegating to the run coordinator.
|
|
655
|
+
* @param features - Feature inputs to process in this run.
|
|
656
|
+
* @returns Run summary with per-feature outcomes.
|
|
657
|
+
*/
|
|
442
658
|
async start(features: FeatureInput[]): Promise<Record<string, unknown>> {
|
|
443
|
-
|
|
659
|
+
await this.executionEnrollmentService.start();
|
|
660
|
+
this.organizerSidecar?.start();
|
|
661
|
+
try {
|
|
662
|
+
return await this.runCoordinator.start(features);
|
|
663
|
+
} finally {
|
|
664
|
+
await this.organizerSidecar?.stop();
|
|
665
|
+
await this.executionEnrollmentService.stop();
|
|
666
|
+
}
|
|
444
667
|
}
|
|
445
668
|
|
|
669
|
+
/** Returns a stable hash of the current provider configuration reference. */
|
|
446
670
|
providerConfigRefHash(): string {
|
|
447
671
|
return stableHash(this.provider.selection.provider_config_ref ?? 'none');
|
|
448
672
|
}
|
|
@@ -504,26 +728,158 @@ export class SupervisorRuntime
|
|
|
504
728
|
return 300_000;
|
|
505
729
|
}
|
|
506
730
|
|
|
731
|
+
/** Creates the global orchestrator session if one does not already exist. */
|
|
507
732
|
async ensureGlobalOrchestratorSession(): Promise<void> {
|
|
508
733
|
await this.sessionOrchestrator.ensureGlobalOrchestratorSession();
|
|
509
734
|
}
|
|
510
735
|
|
|
736
|
+
/**
|
|
737
|
+
* Removes worker sessions that are no longer associated with any active feature.
|
|
738
|
+
* @param activeFeatureIds - Feature IDs that should retain their sessions.
|
|
739
|
+
*/
|
|
511
740
|
async cleanupOrphanWorkerSessions(activeFeatureIds: string[]): Promise<void> {
|
|
512
741
|
await this.sessionOrchestrator.cleanupOrphanWorkerSessions(activeFeatureIds);
|
|
513
742
|
}
|
|
514
743
|
|
|
744
|
+
/**
|
|
745
|
+
* Initializes a feature cluster by creating per-role worker sessions and recording run history.
|
|
746
|
+
* @param featureId - The feature to initialize.
|
|
747
|
+
*/
|
|
515
748
|
async initializeFeatureCluster(featureId: string): Promise<void> {
|
|
516
749
|
await this.sessionOrchestrator.initializeFeatureCluster(featureId);
|
|
517
750
|
}
|
|
518
751
|
|
|
752
|
+
/** Reconciles queued features by enrolling them into active execution slots. */
|
|
519
753
|
async reconcileQueuedFeatures(): Promise<void> {
|
|
520
754
|
await this.sessionOrchestrator.reconcileQueuedFeatures(this.state.queue);
|
|
521
755
|
}
|
|
522
756
|
|
|
757
|
+
private async markRunHistoryStarted(featureId: string): Promise<void> {
|
|
758
|
+
try {
|
|
759
|
+
const state = await this.kernel.readState(featureId);
|
|
760
|
+
const frontMatter = state.frontMatter;
|
|
761
|
+
const runHistory = normalizeRunHistory(frontMatter.run_history);
|
|
762
|
+
const now = nowIso();
|
|
763
|
+
const currentRunId = this.state.runId;
|
|
764
|
+
const existing = runHistory.find((entry) => entry.run_id === currentRunId) ?? null;
|
|
765
|
+
const latest = runHistory[0] ?? null;
|
|
766
|
+
const latestIsActive =
|
|
767
|
+
latest && latest.run_id !== currentRunId
|
|
768
|
+
? latest.status === 'active' || latest.ended_at === null
|
|
769
|
+
: false;
|
|
770
|
+
|
|
771
|
+
const nextHistory = runHistory.filter((entry) => entry.run_id !== currentRunId);
|
|
772
|
+
if (latest && latest.run_id !== currentRunId && latestIsActive) {
|
|
773
|
+
nextHistory[0] = {
|
|
774
|
+
...latest,
|
|
775
|
+
status: 'interrupted',
|
|
776
|
+
ended_at: now,
|
|
777
|
+
};
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
nextHistory.unshift({
|
|
781
|
+
run_id: currentRunId,
|
|
782
|
+
started_at: existing?.started_at ?? now,
|
|
783
|
+
ended_at: null,
|
|
784
|
+
status: 'active',
|
|
785
|
+
});
|
|
786
|
+
|
|
787
|
+
const expectedVersion =
|
|
788
|
+
typeof frontMatter.version === 'number' && Number.isFinite(frontMatter.version)
|
|
789
|
+
? frontMatter.version
|
|
790
|
+
: null;
|
|
791
|
+
|
|
792
|
+
await this.kernel
|
|
793
|
+
.updateState(featureId, expectedVersion, (fm, body) =>
|
|
794
|
+
Promise.resolve({
|
|
795
|
+
frontMatter: {
|
|
796
|
+
...fm,
|
|
797
|
+
run_history: sortRunHistory(nextHistory),
|
|
798
|
+
},
|
|
799
|
+
body,
|
|
800
|
+
}),
|
|
801
|
+
)
|
|
802
|
+
.catch((error) => {
|
|
803
|
+
if (!isVersionConflictError(error)) {
|
|
804
|
+
throw error;
|
|
805
|
+
}
|
|
806
|
+
});
|
|
807
|
+
} catch {
|
|
808
|
+
// Best-effort update: do not interrupt supervisor flow.
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
private async markRunHistoryEnded(featureId: string): Promise<void> {
|
|
813
|
+
try {
|
|
814
|
+
const state = await this.kernel.readState(featureId);
|
|
815
|
+
const frontMatter = state.frontMatter;
|
|
816
|
+
const runHistory = normalizeRunHistory(frontMatter.run_history);
|
|
817
|
+
const now = nowIso();
|
|
818
|
+
const currentRunId = this.state.runId;
|
|
819
|
+
const status = resolveRunStatus(frontMatter);
|
|
820
|
+
let found = false;
|
|
821
|
+
|
|
822
|
+
const nextHistory = runHistory.map((entry) => {
|
|
823
|
+
if (entry.run_id !== currentRunId) {
|
|
824
|
+
return entry;
|
|
825
|
+
}
|
|
826
|
+
found = true;
|
|
827
|
+
return {
|
|
828
|
+
...entry,
|
|
829
|
+
ended_at: now,
|
|
830
|
+
status,
|
|
831
|
+
};
|
|
832
|
+
});
|
|
833
|
+
|
|
834
|
+
if (!found) {
|
|
835
|
+
nextHistory.unshift({
|
|
836
|
+
run_id: currentRunId,
|
|
837
|
+
started_at:
|
|
838
|
+
typeof frontMatter.phase_entered_at === 'string' ? frontMatter.phase_entered_at : now,
|
|
839
|
+
ended_at: now,
|
|
840
|
+
status,
|
|
841
|
+
});
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
const expectedVersion =
|
|
845
|
+
typeof frontMatter.version === 'number' && Number.isFinite(frontMatter.version)
|
|
846
|
+
? frontMatter.version
|
|
847
|
+
: null;
|
|
848
|
+
|
|
849
|
+
await this.kernel
|
|
850
|
+
.updateState(featureId, expectedVersion, (fm, body) =>
|
|
851
|
+
Promise.resolve({
|
|
852
|
+
frontMatter: {
|
|
853
|
+
...fm,
|
|
854
|
+
run_history: sortRunHistory(nextHistory),
|
|
855
|
+
},
|
|
856
|
+
body,
|
|
857
|
+
}),
|
|
858
|
+
)
|
|
859
|
+
.catch((error) => {
|
|
860
|
+
if (!isVersionConflictError(error)) {
|
|
861
|
+
throw error;
|
|
862
|
+
}
|
|
863
|
+
});
|
|
864
|
+
} catch {
|
|
865
|
+
// Best-effort update: do not interrupt supervisor flow.
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
/**
|
|
870
|
+
* Ensures session state is consistent with the set of active features,
|
|
871
|
+
* closing clusters for features that are no longer active.
|
|
872
|
+
* @param activeFeatureIds - Currently active feature IDs.
|
|
873
|
+
*/
|
|
523
874
|
async enforceActiveFeatureInvariant(activeFeatureIds: string[]): Promise<void> {
|
|
524
875
|
await this.sessionOrchestrator.enforceActiveFeatureInvariant(activeFeatureIds);
|
|
525
876
|
}
|
|
526
877
|
|
|
878
|
+
/**
|
|
879
|
+
* Applies a partial update to a feature cluster's worker session mappings.
|
|
880
|
+
* @param featureId - The feature whose cluster to patch.
|
|
881
|
+
* @param clusterPatch - Key-value pairs to merge into the cluster record.
|
|
882
|
+
*/
|
|
527
883
|
async patchFeatureCluster(
|
|
528
884
|
featureId: string,
|
|
529
885
|
clusterPatch: Record<string, string>,
|
|
@@ -531,30 +887,54 @@ export class SupervisorRuntime
|
|
|
531
887
|
await this.sessionOrchestrator.patchFeatureCluster(featureId, clusterPatch);
|
|
532
888
|
}
|
|
533
889
|
|
|
890
|
+
/** Loads and caches the role-specific system prompts for planner, builder, and QA agents. */
|
|
534
891
|
async loadRolePrompts(): Promise<PromptBundle> {
|
|
535
892
|
return await this.promptBundleLoader.loadRolePrompts();
|
|
536
893
|
}
|
|
537
894
|
|
|
895
|
+
/**
|
|
896
|
+
* Executes the planning wave for the given features, generating or refining plans.
|
|
897
|
+
* @param featureIds - Features to include in this planning wave.
|
|
898
|
+
*/
|
|
538
899
|
async runPlanningWave(featureIds: string[]): Promise<void> {
|
|
539
900
|
await this.planningWaveExecutor.run(featureIds);
|
|
540
901
|
}
|
|
541
902
|
|
|
903
|
+
/**
|
|
904
|
+
* Runs a post-QA reconciliation wave to address QA findings via plan adjustments.
|
|
905
|
+
* @param featureIds - Features requiring reconciliation.
|
|
906
|
+
* @param iteration - Current reconciliation iteration (used for convergence tracking).
|
|
907
|
+
*/
|
|
542
908
|
async runPostQaReconciliationWave(featureIds: string[], iteration: number): Promise<void> {
|
|
543
909
|
await this.planningWaveExecutor.runPostQaReconciliation(featureIds, iteration);
|
|
544
910
|
}
|
|
545
911
|
|
|
912
|
+
/**
|
|
913
|
+
* Executes the build wave, running builder agents with gate validation.
|
|
914
|
+
* @param featureIds - Features to build in this wave.
|
|
915
|
+
*/
|
|
546
916
|
async runBuildWave(featureIds: string[]): Promise<void> {
|
|
547
917
|
await this.buildWaveExecutor.run(featureIds, this.maxParallelGateRuns);
|
|
548
918
|
}
|
|
549
919
|
|
|
920
|
+
/**
|
|
921
|
+
* Executes the QA wave, running QA agents with gate validation.
|
|
922
|
+
* @param featureIds - Features to validate in this wave.
|
|
923
|
+
*/
|
|
550
924
|
async runQaWave(featureIds: string[]): Promise<void> {
|
|
551
925
|
await this.qaWaveExecutor.run(featureIds, this.maxParallelGateRuns);
|
|
552
926
|
}
|
|
553
927
|
|
|
928
|
+
/** Renews lease heartbeats for all active feature sessions to prevent stale-run takeover. */
|
|
554
929
|
async renewLeaseHeartbeats(): Promise<void> {
|
|
555
930
|
await this.leaseHeartbeatService.renew();
|
|
556
931
|
}
|
|
557
932
|
|
|
933
|
+
/**
|
|
934
|
+
* Generates a scaffold initial plan for a feature before the planner agent refines it.
|
|
935
|
+
* @param featureId - The feature to generate a plan for.
|
|
936
|
+
* @returns A plan record with default allowed areas, empty file lists, and placeholder criteria.
|
|
937
|
+
*/
|
|
558
938
|
async generateInitialPlan(featureId: string): Promise<Record<string, unknown>> {
|
|
559
939
|
const baseRef = await this.kernel
|
|
560
940
|
.repoDiff(featureId, ['--stat'])
|
|
@@ -581,11 +961,33 @@ export class SupervisorRuntime
|
|
|
581
961
|
};
|
|
582
962
|
}
|
|
583
963
|
|
|
964
|
+
private compileOrganizerSchema(schemaPath: string): ValidateFunction {
|
|
965
|
+
const Ajv2020Ctor = Ajv2020Import as unknown as new (opts: Record<string, unknown>) => {
|
|
966
|
+
compile(schema: Record<string, unknown>): ValidateFunction;
|
|
967
|
+
addFormat(name: string, format: { type?: string; validate: (v: string) => boolean }): void;
|
|
968
|
+
};
|
|
969
|
+
const ajv = new Ajv2020Ctor({ allErrors: true, strict: false });
|
|
970
|
+
ajv.addFormat('date-time', {
|
|
971
|
+
type: 'string',
|
|
972
|
+
validate: (v: string) => !Number.isNaN(Date.parse(v)),
|
|
973
|
+
});
|
|
974
|
+
const schema = JSON.parse(readFileSync(schemaPath, 'utf8')) as Record<string, unknown>;
|
|
975
|
+
return ajv.compile(schema);
|
|
976
|
+
}
|
|
977
|
+
|
|
584
978
|
private resolveRoleSessionId(role: RuntimeRole, payload: Record<string, unknown>): string | null {
|
|
585
979
|
if (role === 'orchestrator') {
|
|
586
980
|
return this.state.orchestratorSessionId;
|
|
587
981
|
}
|
|
588
982
|
|
|
983
|
+
if (role === 'reconciler') {
|
|
984
|
+
return this.state.reconcilerSessionId;
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
if (role === 'organizer') {
|
|
988
|
+
return this.state.organizerSessionId ?? null;
|
|
989
|
+
}
|
|
990
|
+
|
|
589
991
|
const featureId = typeof payload.feature_id === 'string' ? payload.feature_id : null;
|
|
590
992
|
if (!featureId) {
|
|
591
993
|
return null;
|
|
@@ -631,6 +1033,11 @@ export class SupervisorRuntime
|
|
|
631
1033
|
};
|
|
632
1034
|
}
|
|
633
1035
|
|
|
1036
|
+
/**
|
|
1037
|
+
* Resolves the execution mode for a feature using the precedence chain:
|
|
1038
|
+
* CLI override > feature state > agents.yaml runtime config > deterministic default.
|
|
1039
|
+
* @param featureId - The feature whose execution mode to resolve.
|
|
1040
|
+
*/
|
|
634
1041
|
async resolveExecutionMode(featureId: string): Promise<ExecutionMode> {
|
|
635
1042
|
if (this.cliExecutionMode) {
|
|
636
1043
|
return this.cliExecutionMode;
|
|
@@ -654,6 +1061,14 @@ export class SupervisorRuntime
|
|
|
654
1061
|
return 'deterministic';
|
|
655
1062
|
}
|
|
656
1063
|
|
|
1064
|
+
/**
|
|
1065
|
+
* Invokes an MCP tool on behalf of a supervisor agent role, attaching session
|
|
1066
|
+
* context and operation IDs. Automatically recovers plan version conflicts.
|
|
1067
|
+
* @param role - The agent role making the tool call (e.g. planner, builder, qa).
|
|
1068
|
+
* @param toolName - Name of the MCP tool to invoke.
|
|
1069
|
+
* @param args - Tool-specific input arguments.
|
|
1070
|
+
* @returns The tool response data on success.
|
|
1071
|
+
*/
|
|
657
1072
|
async callTool<TData = Record<string, unknown>, TToolName extends string = string>(
|
|
658
1073
|
role: RuntimeRole,
|
|
659
1074
|
toolName: TToolName,
|
|
@@ -674,6 +1089,16 @@ export class SupervisorRuntime
|
|
|
674
1089
|
});
|
|
675
1090
|
|
|
676
1091
|
if (response.ok === false) {
|
|
1092
|
+
const recovered = await this.tryRecoverPlanVersionConflict<TData>(
|
|
1093
|
+
role,
|
|
1094
|
+
toolName,
|
|
1095
|
+
payload,
|
|
1096
|
+
response.error,
|
|
1097
|
+
);
|
|
1098
|
+
if (recovered) {
|
|
1099
|
+
return recovered;
|
|
1100
|
+
}
|
|
1101
|
+
|
|
677
1102
|
const normalized = response.error;
|
|
678
1103
|
const error = new Error(normalized.message) as AppError;
|
|
679
1104
|
error.code = normalized.code;
|
|
@@ -683,4 +1108,55 @@ export class SupervisorRuntime
|
|
|
683
1108
|
|
|
684
1109
|
return { ok: true, data: response.data as TData };
|
|
685
1110
|
}
|
|
1111
|
+
|
|
1112
|
+
private async tryRecoverPlanVersionConflict<TData>(
|
|
1113
|
+
role: RuntimeRole,
|
|
1114
|
+
toolName: string,
|
|
1115
|
+
args: Record<string, unknown>,
|
|
1116
|
+
error: { code: string; message: string; details: Record<string, unknown> },
|
|
1117
|
+
): Promise<{ ok: true; data: TData } | null> {
|
|
1118
|
+
if (toolName !== TOOLS.PLAN_SUBMIT && toolName !== TOOLS.PLAN_UPDATE) {
|
|
1119
|
+
return null;
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
const featureId = typeof args.feature_id === 'string' ? args.feature_id : null;
|
|
1123
|
+
const submittedPlan = asPlanRecord(args.plan_json);
|
|
1124
|
+
if (!featureId || Object.keys(submittedPlan).length === 0) {
|
|
1125
|
+
return null;
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
const recovered = await recoverStalePlanVersionConflict<{ ok: true; data: TData }>({
|
|
1129
|
+
error,
|
|
1130
|
+
featureId,
|
|
1131
|
+
submittedPlan,
|
|
1132
|
+
readAcceptedPlan: async (nextFeatureId) => {
|
|
1133
|
+
const currentPlanResponse = await this.callTool<{ feature_id: string; plan: unknown }>(
|
|
1134
|
+
role,
|
|
1135
|
+
TOOLS.PLAN_GET,
|
|
1136
|
+
{
|
|
1137
|
+
feature_id: nextFeatureId,
|
|
1138
|
+
},
|
|
1139
|
+
);
|
|
1140
|
+
return currentPlanResponse.data.plan;
|
|
1141
|
+
},
|
|
1142
|
+
submitPlanUpdate: async (nextFeatureId, expectedPlanVersion, plan) => {
|
|
1143
|
+
return await this.callTool<TData>(role, TOOLS.PLAN_UPDATE, {
|
|
1144
|
+
feature_id: nextFeatureId,
|
|
1145
|
+
expected_plan_version: expectedPlanVersion,
|
|
1146
|
+
plan_json: plan,
|
|
1147
|
+
});
|
|
1148
|
+
},
|
|
1149
|
+
buildEquivalentSuccess: (nextFeatureId, currentPlanVersion) => ({
|
|
1150
|
+
ok: true,
|
|
1151
|
+
data: {
|
|
1152
|
+
feature_id: nextFeatureId,
|
|
1153
|
+
accepted: true,
|
|
1154
|
+
plan_version: currentPlanVersion,
|
|
1155
|
+
recovered: true,
|
|
1156
|
+
recovery_strategy: 'reuse_existing_plan_version',
|
|
1157
|
+
} as TData,
|
|
1158
|
+
}),
|
|
1159
|
+
});
|
|
1160
|
+
return recovered;
|
|
1161
|
+
}
|
|
686
1162
|
}
|