agentic-orchestrator 0.1.6 → 0.1.7
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/.prettierignore +10 -0
- package/.prettierrc.json +24 -0
- package/CLAUDE.md +3 -2
- package/README.md +47 -46
- package/agentic/orchestrator/defaults/policy.defaults.yaml +1 -1
- package/agentic/orchestrator/prompts/planner.system.md +1 -0
- package/agentic/orchestrator/schemas/agents.schema.json +4 -21
- package/agentic/orchestrator/schemas/gates.schema.json +4 -19
- package/agentic/orchestrator/schemas/index.schema.json +3 -14
- package/agentic/orchestrator/schemas/multi-project.schema.json +2 -8
- package/agentic/orchestrator/schemas/plan.schema.json +6 -26
- package/agentic/orchestrator/schemas/policy.schema.json +19 -81
- package/agentic/orchestrator/schemas/policy.user.schema.json +1 -5
- package/agentic/orchestrator/schemas/qa_test_index.schema.json +5 -29
- package/agentic/orchestrator/schemas/state.schema.json +11 -61
- package/agentic/orchestrator/tools/catalog.json +33 -164
- package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/feature.delete.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/feature.get_context.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/feature.init.input.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/input/feature.log_append.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/input/feature.state_get.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/feature.state_patch.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/gates.run.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/locks.acquire.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/locks.release.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/performance.record_outcome.input.schema.json +10 -1
- package/agentic/orchestrator/tools/schemas/input/plan.get.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/plan.submit.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/plan.update.input.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/input/qa.test_index_get.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/qa.test_index_update.input.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/input/repo.apply_patch.input.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/input/repo.diff.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/repo.diff_bundle.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/repo.ensure_worktree.input.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/input/repo.read_file.input.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/input/repo.search.input.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/input/repo.status.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/input/report.feature_summary.input.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/output/collisions.scan.output.schema.json +1 -3
- package/agentic/orchestrator/tools/schemas/output/evidence.latest.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/feature.delete.output.schema.json +4 -20
- package/agentic/orchestrator/tools/schemas/output/feature.discover_specs.output.schema.json +2 -7
- package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +1 -8
- package/agentic/orchestrator/tools/schemas/output/feature.init.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/feature.log_append.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/output/feature.state_get.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/feature.state_patch.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/gates.list.output.schema.json +2 -7
- package/agentic/orchestrator/tools/schemas/output/gates.run.output.schema.json +1 -8
- package/agentic/orchestrator/tools/schemas/output/locks.acquire.output.schema.json +1 -7
- package/agentic/orchestrator/tools/schemas/output/locks.release.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/performance.get_analytics.output.schema.json +22 -2
- package/agentic/orchestrator/tools/schemas/output/plan.get.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/plan.submit.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/plan.update.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/qa.test_index_get.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/qa.test_index_update.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/repo.apply_patch.output.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/output/repo.diff.output.schema.json +1 -4
- package/agentic/orchestrator/tools/schemas/output/repo.diff_bundle.output.schema.json +1 -7
- package/agentic/orchestrator/tools/schemas/output/repo.ensure_worktree.output.schema.json +1 -6
- package/agentic/orchestrator/tools/schemas/output/repo.read_file.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/repo.search.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/repo.status.output.schema.json +1 -5
- package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +1 -4
- package/apps/control-plane/scripts/validate-architecture-rules.mjs +16 -5
- package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +30 -8
- package/apps/control-plane/scripts/validate-mcp-contracts.ts +13 -7
- package/apps/control-plane/src/application/adapters/adapter-registry.ts +35 -15
- package/apps/control-plane/src/application/multi-project-loader.ts +27 -10
- package/apps/control-plane/src/application/services/activity-monitor-service.ts +26 -14
- package/apps/control-plane/src/application/services/collision-queue-service.ts +31 -17
- package/apps/control-plane/src/application/services/cost-tracking-service.ts +23 -16
- package/apps/control-plane/src/application/services/dependency-scheduler-service.ts +12 -4
- package/apps/control-plane/src/application/services/feature-deletion-service.ts +94 -58
- package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +19 -13
- package/apps/control-plane/src/application/services/feature-state-service.ts +29 -19
- package/apps/control-plane/src/application/services/gate-interpolation-service.ts +7 -2
- package/apps/control-plane/src/application/services/gate-service.ts +64 -41
- package/apps/control-plane/src/application/services/instance-isolation-service.ts +1 -1
- package/apps/control-plane/src/application/services/issue-tracker-service.ts +49 -38
- package/apps/control-plane/src/application/services/lock-service.ts +75 -49
- package/apps/control-plane/src/application/services/merge-service.ts +91 -50
- package/apps/control-plane/src/application/services/notifier-service.ts +42 -20
- package/apps/control-plane/src/application/services/patch-service.ts +73 -44
- package/apps/control-plane/src/application/services/performance-analytics-service.ts +8 -6
- package/apps/control-plane/src/application/services/plan-service.ts +148 -89
- package/apps/control-plane/src/application/services/policy-loader-service.ts +10 -4
- package/apps/control-plane/src/application/services/pr-monitor-service.ts +33 -14
- package/apps/control-plane/src/application/services/qa-index-service.ts +20 -16
- package/apps/control-plane/src/application/services/reactions-service.ts +30 -15
- package/apps/control-plane/src/application/services/reporting-service.ts +16 -12
- package/apps/control-plane/src/application/services/run-lease-service.ts +138 -81
- package/apps/control-plane/src/application/tools/tool-metadata.ts +5 -5
- package/apps/control-plane/src/application/tools/tool-router.ts +6 -3
- package/apps/control-plane/src/cli/aop.ts +2 -2
- package/apps/control-plane/src/cli/attach-command-handler.ts +9 -9
- package/apps/control-plane/src/cli/cleanup-command-handler.ts +16 -11
- package/apps/control-plane/src/cli/cli-argument-parser.ts +6 -3
- package/apps/control-plane/src/cli/dashboard-command-handler.ts +28 -8
- package/apps/control-plane/src/cli/delete-command-handler.ts +7 -7
- package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
- package/apps/control-plane/src/cli/init-command-handler.ts +110 -54
- package/apps/control-plane/src/cli/io.ts +7 -3
- package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
- package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
- package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
- package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
- package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
- package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
- package/apps/control-plane/src/cli/spec-utils.ts +2 -2
- package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
- package/apps/control-plane/src/cli/tooling.ts +3 -3
- package/apps/control-plane/src/cli/types.ts +1 -1
- package/apps/control-plane/src/core/collisions.ts +27 -10
- package/apps/control-plane/src/core/constants.ts +13 -7
- package/apps/control-plane/src/core/error-codes.ts +1 -1
- package/apps/control-plane/src/core/fs.ts +11 -5
- package/apps/control-plane/src/core/gates.ts +53 -27
- package/apps/control-plane/src/core/git.ts +18 -6
- package/apps/control-plane/src/core/kernel.ts +515 -227
- package/apps/control-plane/src/core/patch.ts +7 -3
- package/apps/control-plane/src/core/path-layout.ts +5 -1
- package/apps/control-plane/src/core/path-rules.ts +19 -5
- package/apps/control-plane/src/core/qa-index.ts +26 -12
- package/apps/control-plane/src/core/response.ts +9 -6
- package/apps/control-plane/src/core/schemas.ts +29 -10
- package/apps/control-plane/src/core/tool-caller.ts +1 -1
- package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
- package/apps/control-plane/src/index.ts +3 -9
- package/apps/control-plane/src/interfaces/cli/bootstrap.ts +69 -32
- package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
- package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
- package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
- package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
- package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
- package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
- package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
- package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
- package/apps/control-plane/src/mcp/tool-client.ts +17 -5
- package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
- package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
- package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
- package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
- package/apps/control-plane/src/providers/providers.ts +72 -48
- package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
- package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
- package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
- package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
- package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
- package/apps/control-plane/src/supervisor/runtime.ts +59 -35
- package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
- package/apps/control-plane/src/supervisor/types.ts +22 -7
- package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
- package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
- package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
- package/apps/control-plane/test/aop.spec.ts +4 -4
- package/apps/control-plane/test/batch-operations.spec.ts +20 -18
- package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
- package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
- package/apps/control-plane/test/bootstrap.spec.ts +72 -40
- package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
- package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
- package/apps/control-plane/test/cli.spec.ts +1 -1
- package/apps/control-plane/test/cli.unit.spec.ts +226 -167
- package/apps/control-plane/test/collision-queue.spec.ts +49 -40
- package/apps/control-plane/test/collisions.spec.ts +30 -30
- package/apps/control-plane/test/core-utils.spec.ts +29 -15
- package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
- package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
- package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
- package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
- package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
- package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
- package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
- package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
- package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
- package/apps/control-plane/test/gates.spec.ts +101 -81
- package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
- package/apps/control-plane/test/helpers.ts +10 -6
- package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
- package/apps/control-plane/test/init-wizard.spec.ts +162 -67
- package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
- package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
- package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
- package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
- package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
- package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
- package/apps/control-plane/test/kernel.spec.ts +134 -51
- package/apps/control-plane/test/lock-service.spec.ts +92 -68
- package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
- package/apps/control-plane/test/mcp.spec.ts +231 -115
- package/apps/control-plane/test/merge-service.spec.ts +142 -94
- package/apps/control-plane/test/multi-project.spec.ts +28 -22
- package/apps/control-plane/test/notifier-service.spec.ts +136 -92
- package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
- package/apps/control-plane/test/patch-service.spec.ts +128 -48
- package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
- package/apps/control-plane/test/plan-service.spec.ts +50 -39
- package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
- package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
- package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
- package/apps/control-plane/test/providers.spec.ts +133 -102
- package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
- package/apps/control-plane/test/qa-index.spec.ts +58 -61
- package/apps/control-plane/test/reactions.spec.ts +88 -45
- package/apps/control-plane/test/response.spec.ts +5 -5
- package/apps/control-plane/test/resume-command.spec.ts +121 -80
- package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
- package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
- package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
- package/apps/control-plane/test/services.spec.ts +147 -129
- package/apps/control-plane/test/session-management.spec.ts +136 -74
- package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
- package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
- package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
- package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
- package/apps/control-plane/test/supervisor.spec.ts +67 -43
- package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
- package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
- package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
- package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
- package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
- package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
- package/apps/control-plane/tsconfig.build.json +2 -7
- package/apps/control-plane/tsconfig.json +1 -5
- package/apps/control-plane/vitest.config.ts +7 -7
- package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
- package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
- package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
- package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
- package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
- package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
- package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
- package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
- package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
- package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
- package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/gate-service.js +26 -26
- package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
- package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
- package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/lock-service.js +32 -32
- package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/merge-service.js +41 -27
- package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
- package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/patch-service.js +21 -19
- package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
- package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/plan-service.js +33 -33
- package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
- package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
- package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
- package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
- package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
- package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
- package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
- package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
- package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
- package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
- package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
- package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
- package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
- package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
- package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
- package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/init-command-handler.js +44 -33
- package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/io.js +2 -2
- package/dist/apps/control-plane/cli/io.js.map +1 -1
- package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
- package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
- package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
- package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
- package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
- package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
- package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
- package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
- package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
- package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/tooling.js +1 -1
- package/dist/apps/control-plane/core/collisions.js +11 -8
- package/dist/apps/control-plane/core/collisions.js.map +1 -1
- package/dist/apps/control-plane/core/constants.js +13 -7
- package/dist/apps/control-plane/core/constants.js.map +1 -1
- package/dist/apps/control-plane/core/error-codes.js +1 -1
- package/dist/apps/control-plane/core/fs.js.map +1 -1
- package/dist/apps/control-plane/core/gates.d.ts +2 -2
- package/dist/apps/control-plane/core/gates.js +26 -19
- package/dist/apps/control-plane/core/gates.js.map +1 -1
- package/dist/apps/control-plane/core/git.js +3 -3
- package/dist/apps/control-plane/core/git.js.map +1 -1
- package/dist/apps/control-plane/core/kernel.d.ts +1 -0
- package/dist/apps/control-plane/core/kernel.js +134 -81
- package/dist/apps/control-plane/core/kernel.js.map +1 -1
- package/dist/apps/control-plane/core/patch.js +7 -3
- package/dist/apps/control-plane/core/patch.js.map +1 -1
- package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
- package/dist/apps/control-plane/core/path-layout.js +4 -1
- package/dist/apps/control-plane/core/path-layout.js.map +1 -1
- package/dist/apps/control-plane/core/path-rules.js +3 -1
- package/dist/apps/control-plane/core/path-rules.js.map +1 -1
- package/dist/apps/control-plane/core/qa-index.js +5 -5
- package/dist/apps/control-plane/core/qa-index.js.map +1 -1
- package/dist/apps/control-plane/core/response.js +3 -3
- package/dist/apps/control-plane/core/response.js.map +1 -1
- package/dist/apps/control-plane/core/schemas.js +10 -6
- package/dist/apps/control-plane/core/schemas.js.map +1 -1
- package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
- package/dist/apps/control-plane/index.d.ts +1 -1
- package/dist/apps/control-plane/index.js +1 -1
- package/dist/apps/control-plane/index.js.map +1 -1
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js +31 -20
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
- package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
- package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
- package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
- package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
- package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
- package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
- package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
- package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
- package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
- package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
- package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
- package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
- package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
- package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-client.js +2 -2
- package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
- package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
- package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
- package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
- package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
- package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
- package/dist/apps/control-plane/providers/providers.d.ts +1 -1
- package/dist/apps/control-plane/providers/providers.js +31 -34
- package/dist/apps/control-plane/providers/providers.js.map +1 -1
- package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
- package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
- package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
- package/dist/apps/control-plane/supervisor/runtime.js +25 -21
- package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
- package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
- package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
- package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
- package/dist/apps/control-plane/supervisor/types.js.map +1 -1
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
- package/eslint.config.mjs +20 -20
- package/example-configurations/README.md +1 -1
- package/example-configurations/java/agents.yaml +3 -3
- package/example-configurations/java/policy.yaml +1 -1
- package/example-configurations/node/agents.yaml +3 -3
- package/example-configurations/node/policy.yaml +1 -1
- package/package.json +10 -5
- package/packages/web-dashboard/next.config.js +2 -2
- package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
- package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
- package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
- package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
- package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
- package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
- package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
- package/packages/web-dashboard/src/app/globals.css +10 -2
- package/packages/web-dashboard/src/app/page.tsx +100 -37
- package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
- package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
- package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
- package/packages/web-dashboard/tsconfig.json +3 -11
- package/scripts/nx-safe.mjs +10 -10
- package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
- package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +187 -90
- package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
- package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
- package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
- package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
- package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
- package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
- package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
- package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
- package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
- package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
- package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
- package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
- package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
- package/spec-files/progress.md +186 -175
- package/tsconfig.json +2 -8
|
@@ -52,7 +52,7 @@ function parseAgentConfigJson(raw: string, source: 'cli' | 'env'): Record<string
|
|
|
52
52
|
reason: 'Invalid agent config JSON',
|
|
53
53
|
source,
|
|
54
54
|
value: raw,
|
|
55
|
-
parse_error: error instanceof Error ? error.message : String(error)
|
|
55
|
+
parse_error: error instanceof Error ? error.message : String(error),
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -60,7 +60,7 @@ function parseAgentConfigJson(raw: string, source: 'cli' | 'env'): Record<string
|
|
|
60
60
|
throw invalidAgentConfigError({
|
|
61
61
|
reason: 'Agent config JSON must be an object',
|
|
62
62
|
source,
|
|
63
|
-
value: raw
|
|
63
|
+
value: raw,
|
|
64
64
|
});
|
|
65
65
|
}
|
|
66
66
|
|
|
@@ -69,7 +69,7 @@ function parseAgentConfigJson(raw: string, source: 'cli' | 'env'): Record<string
|
|
|
69
69
|
|
|
70
70
|
function resolveConfiguredAgentConfig(
|
|
71
71
|
provider: string,
|
|
72
|
-
runtime: ResolveSelectionRuntimeConfig
|
|
72
|
+
runtime: ResolveSelectionRuntimeConfig,
|
|
73
73
|
): Record<string, unknown> | null {
|
|
74
74
|
if (!runtime) {
|
|
75
75
|
return null;
|
|
@@ -93,16 +93,10 @@ export type ProviderSelectionResolver = (input: ResolveSelectionInput) => Provid
|
|
|
93
93
|
|
|
94
94
|
export const resolveProviderSelection: ProviderSelectionResolver = ({ cli, env, agentsConfig }) => {
|
|
95
95
|
const provider =
|
|
96
|
-
cli.agent_provider ||
|
|
97
|
-
env.AOP_AGENT_PROVIDER ||
|
|
98
|
-
agentsConfig?.runtime?.default_provider ||
|
|
99
|
-
null;
|
|
96
|
+
cli.agent_provider || env.AOP_AGENT_PROVIDER || agentsConfig?.runtime?.default_provider || null;
|
|
100
97
|
|
|
101
98
|
const model =
|
|
102
|
-
cli.agent_model ||
|
|
103
|
-
env.AOP_AGENT_MODEL ||
|
|
104
|
-
agentsConfig?.runtime?.default_model ||
|
|
105
|
-
null;
|
|
99
|
+
cli.agent_model || env.AOP_AGENT_MODEL || agentsConfig?.runtime?.default_model || null;
|
|
106
100
|
|
|
107
101
|
const providerConfigEnv =
|
|
108
102
|
cli.provider_config_env ||
|
|
@@ -123,15 +117,12 @@ export const resolveProviderSelection: ProviderSelectionResolver = ({ cli, env,
|
|
|
123
117
|
throw error;
|
|
124
118
|
}
|
|
125
119
|
|
|
126
|
-
if (
|
|
127
|
-
AUTH_REQUIRED_PROVIDERS.has(provider) &&
|
|
128
|
-
(!providerConfigEnv || !env[providerConfigEnv])
|
|
129
|
-
) {
|
|
120
|
+
if (AUTH_REQUIRED_PROVIDERS.has(provider) && (!providerConfigEnv || !env[providerConfigEnv])) {
|
|
130
121
|
const error = new Error(ERROR_CODES.PROVIDER_AUTH_MISSING) as AppError;
|
|
131
122
|
error.code = ERROR_CODES.PROVIDER_AUTH_MISSING;
|
|
132
123
|
error.details = {
|
|
133
124
|
provider,
|
|
134
|
-
provider_config_env: providerConfigEnv
|
|
125
|
+
provider_config_env: providerConfigEnv,
|
|
135
126
|
};
|
|
136
127
|
throw error;
|
|
137
128
|
}
|
|
@@ -149,8 +140,8 @@ export const resolveProviderSelection: ProviderSelectionResolver = ({ cli, env,
|
|
|
149
140
|
provider,
|
|
150
141
|
model: model ?? `${provider}-default`,
|
|
151
142
|
provider_config_env: providerConfigEnv,
|
|
152
|
-
provider_config_ref: providerConfigEnv ? env[providerConfigEnv] ?? null : null,
|
|
153
|
-
agent_config: agentConfig
|
|
143
|
+
provider_config_ref: providerConfigEnv ? (env[providerConfigEnv] ?? null) : null,
|
|
144
|
+
agent_config: agentConfig,
|
|
154
145
|
};
|
|
155
146
|
};
|
|
156
147
|
|
|
@@ -163,7 +154,11 @@ export interface WorkerSession {
|
|
|
163
154
|
|
|
164
155
|
export interface WorkerProvider {
|
|
165
156
|
selection: ProviderSelection;
|
|
166
|
-
createSession(
|
|
157
|
+
createSession(
|
|
158
|
+
role: string,
|
|
159
|
+
featureId: string,
|
|
160
|
+
systemPrompt: string | null,
|
|
161
|
+
): Promise<WorkerSession>;
|
|
167
162
|
reattachSession(sessionId: string): Promise<WorkerSession | null>;
|
|
168
163
|
closeSession(sessionId: string): Promise<{ closed: true }>;
|
|
169
164
|
runWorker(input: {
|
|
@@ -197,23 +192,31 @@ export interface ProviderCommandRunnerOptions {
|
|
|
197
192
|
}
|
|
198
193
|
|
|
199
194
|
export interface ProviderCommandRunner {
|
|
200
|
-
run(
|
|
195
|
+
run(
|
|
196
|
+
command: string,
|
|
197
|
+
args: string[],
|
|
198
|
+
options?: ProviderCommandRunnerOptions,
|
|
199
|
+
): Promise<ProviderCommandResult>;
|
|
201
200
|
}
|
|
202
201
|
|
|
203
202
|
export class NodeProviderCommandRunner implements ProviderCommandRunner {
|
|
204
|
-
async run(
|
|
203
|
+
async run(
|
|
204
|
+
command: string,
|
|
205
|
+
args: string[],
|
|
206
|
+
options: ProviderCommandRunnerOptions = {},
|
|
207
|
+
): Promise<ProviderCommandResult> {
|
|
205
208
|
return await new Promise<ProviderCommandResult>((resolve) => {
|
|
206
209
|
let child;
|
|
207
210
|
try {
|
|
208
211
|
child = spawn(command, args, {
|
|
209
212
|
env: options.env,
|
|
210
|
-
stdio: options.interactive ? 'inherit' : ['pipe', 'pipe', 'pipe']
|
|
213
|
+
stdio: options.interactive ? 'inherit' : ['pipe', 'pipe', 'pipe'],
|
|
211
214
|
});
|
|
212
215
|
} catch {
|
|
213
216
|
resolve({
|
|
214
217
|
exitCode: 127,
|
|
215
218
|
signal: null,
|
|
216
|
-
errorCode: 'ENOENT'
|
|
219
|
+
errorCode: 'ENOENT',
|
|
217
220
|
});
|
|
218
221
|
return;
|
|
219
222
|
}
|
|
@@ -244,7 +247,7 @@ export class NodeProviderCommandRunner implements ProviderCommandRunner {
|
|
|
244
247
|
resolve({
|
|
245
248
|
exitCode: code ?? (spawnErrorCode === 'ENOENT' ? 127 : 1),
|
|
246
249
|
signal,
|
|
247
|
-
errorCode: spawnErrorCode
|
|
250
|
+
errorCode: spawnErrorCode,
|
|
248
251
|
});
|
|
249
252
|
});
|
|
250
253
|
});
|
|
@@ -276,7 +279,7 @@ function readStringArray(value: unknown): string[] | null {
|
|
|
276
279
|
function resolveTemplateFromAgentConfig(
|
|
277
280
|
agentConfig: Record<string, unknown> | null | undefined,
|
|
278
281
|
kind: 'attach' | 'send',
|
|
279
|
-
fallback: ProviderCommandTemplate | undefined
|
|
282
|
+
fallback: ProviderCommandTemplate | undefined,
|
|
280
283
|
): ProviderCommandTemplate | undefined {
|
|
281
284
|
const nested = agentConfig?.[kind];
|
|
282
285
|
const nestedRecord = isPlainObject(nested) ? nested : null;
|
|
@@ -307,24 +310,34 @@ function resolveProviderCommands(selection: ProviderSelection): ProviderCliComma
|
|
|
307
310
|
const defaults: Record<string, ProviderCliCommands> = {
|
|
308
311
|
codex: {
|
|
309
312
|
attach: { command: 'codex', args: ['chat', '--session', '{session_id}'] },
|
|
310
|
-
send: {
|
|
313
|
+
send: {
|
|
314
|
+
command: 'codex',
|
|
315
|
+
args: ['chat', '--session', '{session_id}', '--message', '{message}'],
|
|
316
|
+
},
|
|
311
317
|
},
|
|
312
318
|
claude: {
|
|
313
319
|
attach: { command: 'claude-code', args: ['chat', '--session', '{session_id}'] },
|
|
314
|
-
send: {
|
|
315
|
-
|
|
320
|
+
send: {
|
|
321
|
+
command: 'claude-code',
|
|
322
|
+
args: ['chat', '--session', '{session_id}', '--message', '{message}'],
|
|
323
|
+
},
|
|
324
|
+
},
|
|
316
325
|
};
|
|
317
326
|
|
|
318
327
|
const defaultsForProvider = defaults[selection.provider] ?? {};
|
|
319
328
|
return {
|
|
320
|
-
attach: resolveTemplateFromAgentConfig(
|
|
321
|
-
|
|
329
|
+
attach: resolveTemplateFromAgentConfig(
|
|
330
|
+
selection.agent_config,
|
|
331
|
+
'attach',
|
|
332
|
+
defaultsForProvider.attach,
|
|
333
|
+
),
|
|
334
|
+
send: resolveTemplateFromAgentConfig(selection.agent_config, 'send', defaultsForProvider.send),
|
|
322
335
|
};
|
|
323
336
|
}
|
|
324
337
|
|
|
325
338
|
function applyCommandArgsTemplate(
|
|
326
339
|
args: string[],
|
|
327
|
-
values: { sessionId: string; message?: string }
|
|
340
|
+
values: { sessionId: string; message?: string },
|
|
328
341
|
): string[] {
|
|
329
342
|
return args.map((arg) => {
|
|
330
343
|
if (arg === '{session_id}') {
|
|
@@ -341,7 +354,7 @@ function commandFailureError(
|
|
|
341
354
|
provider: string,
|
|
342
355
|
capability: 'attach' | 'send',
|
|
343
356
|
details: Record<string, unknown>,
|
|
344
|
-
code: string
|
|
357
|
+
code: string,
|
|
345
358
|
): AppError {
|
|
346
359
|
const error = new Error(`${provider} provider ${capability} failed`) as AppError;
|
|
347
360
|
error.code = code;
|
|
@@ -374,17 +387,21 @@ export class NullWorkerProvider implements WorkerProvider {
|
|
|
374
387
|
this.getSessionInfo = (sessionId: string) =>
|
|
375
388
|
Promise.resolve({
|
|
376
389
|
active: Boolean(sessionId) && sessionId !== 'unknown' && sessionId !== 'unassigned',
|
|
377
|
-
provider: this.selection.provider
|
|
390
|
+
provider: this.selection.provider,
|
|
378
391
|
});
|
|
379
392
|
}
|
|
380
393
|
}
|
|
381
394
|
|
|
382
|
-
createSession(
|
|
395
|
+
createSession(
|
|
396
|
+
role: string,
|
|
397
|
+
featureId: string,
|
|
398
|
+
systemPrompt: string | null,
|
|
399
|
+
): Promise<WorkerSession> {
|
|
383
400
|
return Promise.resolve({
|
|
384
401
|
session_id: `${role}-${featureId}-${crypto.randomUUID()}`,
|
|
385
402
|
role,
|
|
386
403
|
feature_id: featureId,
|
|
387
|
-
system_prompt_loaded: Boolean(systemPrompt)
|
|
404
|
+
system_prompt_loaded: Boolean(systemPrompt),
|
|
388
405
|
});
|
|
389
406
|
}
|
|
390
407
|
reattachSession(sessionId: string): Promise<WorkerSession | null> {
|
|
@@ -395,7 +412,7 @@ export class NullWorkerProvider implements WorkerProvider {
|
|
|
395
412
|
session_id: sessionId,
|
|
396
413
|
role: 'orchestrator',
|
|
397
414
|
feature_id: 'global',
|
|
398
|
-
system_prompt_loaded: false
|
|
415
|
+
system_prompt_loaded: false,
|
|
399
416
|
});
|
|
400
417
|
}
|
|
401
418
|
closeSession(_sessionId: string): Promise<{ closed: true }> {
|
|
@@ -405,7 +422,7 @@ export class NullWorkerProvider implements WorkerProvider {
|
|
|
405
422
|
runWorker({
|
|
406
423
|
role,
|
|
407
424
|
feature_id,
|
|
408
|
-
context_bundle
|
|
425
|
+
context_bundle,
|
|
409
426
|
}: {
|
|
410
427
|
role: string;
|
|
411
428
|
feature_id: string;
|
|
@@ -421,9 +438,7 @@ export class NullWorkerProvider implements WorkerProvider {
|
|
|
421
438
|
if (role === 'planner') {
|
|
422
439
|
const state = context_bundle?.state;
|
|
423
440
|
const frontMatter =
|
|
424
|
-
state && typeof state === 'object'
|
|
425
|
-
? (state as Record<string, unknown>).front_matter
|
|
426
|
-
: null;
|
|
441
|
+
state && typeof state === 'object' ? (state as Record<string, unknown>).front_matter : null;
|
|
427
442
|
const status =
|
|
428
443
|
frontMatter && typeof frontMatter === 'object'
|
|
429
444
|
? (frontMatter as Record<string, unknown>).status
|
|
@@ -432,32 +447,36 @@ export class NullWorkerProvider implements WorkerProvider {
|
|
|
432
447
|
type: 'NOTE',
|
|
433
448
|
content: `Planner session active for ${feature_id}.`,
|
|
434
449
|
context_snapshot: {
|
|
435
|
-
status: typeof status === 'string' ? status : 'unknown'
|
|
436
|
-
}
|
|
450
|
+
status: typeof status === 'string' ? status : 'unknown',
|
|
451
|
+
},
|
|
437
452
|
});
|
|
438
453
|
}
|
|
439
454
|
|
|
440
455
|
return Promise.resolve({
|
|
441
456
|
type: 'NOTE',
|
|
442
|
-
content: `${role} session active for ${feature_id}
|
|
457
|
+
content: `${role} session active for ${feature_id}.`,
|
|
443
458
|
});
|
|
444
459
|
}
|
|
445
460
|
|
|
446
|
-
private async executeCommand(
|
|
461
|
+
private async executeCommand(
|
|
462
|
+
kind: 'attach' | 'send',
|
|
463
|
+
sessionId: string,
|
|
464
|
+
message?: string,
|
|
465
|
+
): Promise<void> {
|
|
447
466
|
const template = kind === 'attach' ? this.commands.attach : this.commands.send;
|
|
448
467
|
if (!template) {
|
|
449
468
|
throw commandFailureError(
|
|
450
469
|
this.selection.provider,
|
|
451
470
|
kind,
|
|
452
471
|
{ reason: `Provider ${this.selection.provider} does not support ${kind}` },
|
|
453
|
-
ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER
|
|
472
|
+
ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER,
|
|
454
473
|
);
|
|
455
474
|
}
|
|
456
475
|
|
|
457
476
|
const args = applyCommandArgsTemplate(template.args, { sessionId, message });
|
|
458
477
|
const result = await this.commandRunner.run(template.command, args, {
|
|
459
478
|
interactive: kind === 'attach',
|
|
460
|
-
timeoutMs: kind === 'send' ? 15_000 : undefined
|
|
479
|
+
timeoutMs: kind === 'send' ? 15_000 : undefined,
|
|
461
480
|
});
|
|
462
481
|
|
|
463
482
|
if (result.exitCode === 0) {
|
|
@@ -469,10 +488,15 @@ export class NullWorkerProvider implements WorkerProvider {
|
|
|
469
488
|
args,
|
|
470
489
|
exit_code: result.exitCode,
|
|
471
490
|
signal: result.signal,
|
|
472
|
-
error_code: result.errorCode
|
|
491
|
+
error_code: result.errorCode,
|
|
473
492
|
};
|
|
474
493
|
if (result.exitCode === 127 || result.errorCode === 'ENOENT') {
|
|
475
|
-
throw commandFailureError(
|
|
494
|
+
throw commandFailureError(
|
|
495
|
+
this.selection.provider,
|
|
496
|
+
kind,
|
|
497
|
+
details,
|
|
498
|
+
ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER,
|
|
499
|
+
);
|
|
476
500
|
}
|
|
477
501
|
throw commandFailureError(this.selection.provider, kind, details, ERROR_CODES.INTERNAL_ERROR);
|
|
478
502
|
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { GATE_RESULT, STATUS, TOOLS } from '../core/constants.js';
|
|
2
2
|
import type { FeatureStatePayload, SupervisorToolCaller } from './types.js';
|
|
3
3
|
import { NOOP_WORKER_DECISION_RUNNER, type WorkerDecisionRunner } from './worker-decision-loop.js';
|
|
4
|
-
import type {
|
|
4
|
+
import type {
|
|
5
|
+
GateRepairContext,
|
|
6
|
+
ReactionsService,
|
|
7
|
+
} from '../application/services/reactions-service.js';
|
|
5
8
|
|
|
6
9
|
interface GatesRunData {
|
|
7
10
|
overall?: string;
|
|
@@ -28,9 +31,13 @@ export class BuildWaveExecutor {
|
|
|
28
31
|
async run(featureIds: string[], maxParallelGateRuns: number): Promise<void> {
|
|
29
32
|
const batch: string[] = [];
|
|
30
33
|
for (const featureId of featureIds) {
|
|
31
|
-
const state = await this.toolCaller.callTool<FeatureStatePayload>(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
const state = await this.toolCaller.callTool<FeatureStatePayload>(
|
|
35
|
+
'builder',
|
|
36
|
+
TOOLS.FEATURE_STATE_GET,
|
|
37
|
+
{
|
|
38
|
+
feature_id: featureId,
|
|
39
|
+
},
|
|
40
|
+
);
|
|
34
41
|
|
|
35
42
|
if (state.data.front_matter.status === STATUS.BUILDING) {
|
|
36
43
|
batch.push(featureId);
|
|
@@ -40,21 +47,25 @@ export class BuildWaveExecutor {
|
|
|
40
47
|
const selected = batch.slice(0, maxParallelGateRuns);
|
|
41
48
|
for (const featureId of selected) {
|
|
42
49
|
const context = await this.toolCaller.callTool('builder', TOOLS.FEATURE_GET_CONTEXT, {
|
|
43
|
-
feature_id: featureId
|
|
50
|
+
feature_id: featureId,
|
|
44
51
|
});
|
|
45
52
|
await this.workerDecisionRunner.execute({
|
|
46
53
|
role: 'builder',
|
|
47
54
|
featureId,
|
|
48
55
|
contextBundle: context.data,
|
|
49
56
|
instructions:
|
|
50
|
-
'Emit PATCH outputs for code changes, NOTE outputs for progress context, and REQUEST outputs for lock/context needs.'
|
|
57
|
+
'Emit PATCH outputs for code changes, NOTE outputs for progress context, and REQUEST outputs for lock/context needs.',
|
|
51
58
|
});
|
|
52
59
|
}
|
|
53
60
|
|
|
54
61
|
const executing = selected.map(async (featureId) => {
|
|
55
|
-
const stateForRetry = await this.toolCaller.callTool<FeatureStatePayload>(
|
|
56
|
-
|
|
57
|
-
|
|
62
|
+
const stateForRetry = await this.toolCaller.callTool<FeatureStatePayload>(
|
|
63
|
+
'builder',
|
|
64
|
+
TOOLS.FEATURE_STATE_GET,
|
|
65
|
+
{
|
|
66
|
+
feature_id: featureId,
|
|
67
|
+
},
|
|
68
|
+
);
|
|
58
69
|
const initialRetryCount = stateForRetry.data.front_matter.gate_retry_count ?? 0;
|
|
59
70
|
|
|
60
71
|
let gateOverall: string;
|
|
@@ -64,11 +75,15 @@ export class BuildWaveExecutor {
|
|
|
64
75
|
const failureHistory: GateRepairContext['failureHistory'] = [];
|
|
65
76
|
|
|
66
77
|
try {
|
|
67
|
-
const gateResult = await this.toolCaller.callTool<GatesRunData>(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
78
|
+
const gateResult = await this.toolCaller.callTool<GatesRunData>(
|
|
79
|
+
'builder',
|
|
80
|
+
TOOLS.GATES_RUN,
|
|
81
|
+
{
|
|
82
|
+
feature_id: featureId,
|
|
83
|
+
profile: null,
|
|
84
|
+
mode: 'fast',
|
|
85
|
+
},
|
|
86
|
+
);
|
|
72
87
|
gateOverall = gateResult.data.overall ?? GATE_RESULT.PASS;
|
|
73
88
|
gateExitCode = gateOverall === GATE_RESULT.FAIL ? 1 : 0;
|
|
74
89
|
gateEvidencePath = gateResult.data.evidence_path ?? '';
|
|
@@ -87,13 +102,13 @@ export class BuildWaveExecutor {
|
|
|
87
102
|
evidence_summary: gateEvidencePath,
|
|
88
103
|
logs_excerpt: gateLogs.slice(0, 800),
|
|
89
104
|
failed_at: new Date().toISOString(),
|
|
90
|
-
retry_delay_ms: this.reactionsService?.retryDelayMs()
|
|
105
|
+
retry_delay_ms: this.reactionsService?.retryDelayMs(),
|
|
91
106
|
});
|
|
92
107
|
}
|
|
93
108
|
|
|
94
109
|
if (this.reactionsService && gateOverall === GATE_RESULT.FAIL) {
|
|
95
110
|
const context = await this.toolCaller.callTool('builder', TOOLS.FEATURE_GET_CONTEXT, {
|
|
96
|
-
feature_id: featureId
|
|
111
|
+
feature_id: featureId,
|
|
97
112
|
});
|
|
98
113
|
let retryCount = initialRetryCount;
|
|
99
114
|
const retryDelayMs = this.reactionsService.retryDelayMs();
|
|
@@ -109,22 +124,26 @@ export class BuildWaveExecutor {
|
|
|
109
124
|
logs: gateLogs,
|
|
110
125
|
evidenceSummary: gateEvidencePath,
|
|
111
126
|
retryCount,
|
|
112
|
-
failureHistory
|
|
127
|
+
failureHistory,
|
|
113
128
|
};
|
|
114
129
|
const repairPrompt = this.reactionsService.buildRepairPrompt(ctx);
|
|
115
130
|
await this.workerDecisionRunner.execute({
|
|
116
131
|
role: 'builder',
|
|
117
132
|
featureId,
|
|
118
133
|
contextBundle: context.data,
|
|
119
|
-
instructions: repairPrompt
|
|
134
|
+
instructions: repairPrompt,
|
|
120
135
|
});
|
|
121
136
|
|
|
122
137
|
try {
|
|
123
|
-
const retryResult = await this.toolCaller.callTool<GatesRunData>(
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
138
|
+
const retryResult = await this.toolCaller.callTool<GatesRunData>(
|
|
139
|
+
'builder',
|
|
140
|
+
TOOLS.GATES_RUN,
|
|
141
|
+
{
|
|
142
|
+
feature_id: featureId,
|
|
143
|
+
profile: null,
|
|
144
|
+
mode: 'fast',
|
|
145
|
+
},
|
|
146
|
+
);
|
|
128
147
|
gateOverall = retryResult.data.overall ?? GATE_RESULT.PASS;
|
|
129
148
|
gateExitCode = gateOverall === GATE_RESULT.FAIL ? 1 : 0;
|
|
130
149
|
gateEvidencePath = retryResult.data.evidence_path ?? gateEvidencePath;
|
|
@@ -147,7 +166,7 @@ export class BuildWaveExecutor {
|
|
|
147
166
|
evidence_summary: gateEvidencePath,
|
|
148
167
|
logs_excerpt: gateLogs.slice(0, 800),
|
|
149
168
|
failed_at: new Date().toISOString(),
|
|
150
|
-
retry_delay_ms: retryDelayMs
|
|
169
|
+
retry_delay_ms: retryDelayMs,
|
|
151
170
|
});
|
|
152
171
|
}
|
|
153
172
|
|
|
@@ -164,7 +183,7 @@ export class BuildWaveExecutor {
|
|
|
164
183
|
logs: gateLogs,
|
|
165
184
|
evidenceSummary: gateEvidencePath,
|
|
166
185
|
retryCount,
|
|
167
|
-
failureHistory
|
|
186
|
+
failureHistory,
|
|
168
187
|
};
|
|
169
188
|
await this.reactionsService.notifyEscalation(featureId, escalateCtx);
|
|
170
189
|
}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { STATUS, TOOLS } from '../core/constants.js';
|
|
2
|
-
import type {
|
|
3
|
-
FeatureContextPayload,
|
|
4
|
-
InitialPlanGenerator,
|
|
5
|
-
SupervisorToolCaller
|
|
6
|
-
} from './types.js';
|
|
2
|
+
import type { FeatureContextPayload, InitialPlanGenerator, SupervisorToolCaller } from './types.js';
|
|
7
3
|
import { NOOP_WORKER_DECISION_RUNNER, type WorkerDecisionRunner } from './worker-decision-loop.js';
|
|
8
4
|
|
|
9
5
|
type AnyRecord = Record<string, unknown>;
|
|
@@ -78,7 +74,7 @@ function deriveEdgeCaseChecklist(specText: string): string[] {
|
|
|
78
74
|
const checklist = [
|
|
79
75
|
'Edge-case: boundary values and size limits are covered.',
|
|
80
76
|
'Edge-case: negative-path input validation and error handling are covered.',
|
|
81
|
-
'Edge-case: dependency failure and retry behavior are covered.'
|
|
77
|
+
'Edge-case: dependency failure and retry behavior are covered.',
|
|
82
78
|
];
|
|
83
79
|
|
|
84
80
|
const normalizedSpec = specText.toLowerCase();
|
|
@@ -123,9 +119,13 @@ export class PlanningWaveExecutor {
|
|
|
123
119
|
|
|
124
120
|
async run(featureIds: string[]): Promise<void> {
|
|
125
121
|
for (const featureId of featureIds) {
|
|
126
|
-
const context = await this.toolCaller.callTool<FeatureContextPayload>(
|
|
127
|
-
|
|
128
|
-
|
|
122
|
+
const context = await this.toolCaller.callTool<FeatureContextPayload>(
|
|
123
|
+
'planner',
|
|
124
|
+
TOOLS.FEATURE_GET_CONTEXT,
|
|
125
|
+
{
|
|
126
|
+
feature_id: featureId,
|
|
127
|
+
},
|
|
128
|
+
);
|
|
129
129
|
|
|
130
130
|
const state = context.data.state.front_matter;
|
|
131
131
|
if (state.status !== STATUS.PLANNING && state.status !== STATUS.BLOCKED) {
|
|
@@ -138,7 +138,7 @@ export class PlanningWaveExecutor {
|
|
|
138
138
|
featureId,
|
|
139
139
|
contextBundle: asRecord(context.data),
|
|
140
140
|
instructions:
|
|
141
|
-
'Review feature context and emit PLAN_SUBMISSION/REQUEST/NOTE outputs to advance planning deterministically.'
|
|
141
|
+
'Review feature context and emit PLAN_SUBMISSION/REQUEST/NOTE outputs to advance planning deterministically.',
|
|
142
142
|
});
|
|
143
143
|
|
|
144
144
|
if (decision.planSubmission || existingPlan) {
|
|
@@ -148,16 +148,20 @@ export class PlanningWaveExecutor {
|
|
|
148
148
|
const plan = await this.planGenerator.generateInitialPlan(featureId);
|
|
149
149
|
await this.toolCaller.callTool('planner', TOOLS.PLAN_SUBMIT, {
|
|
150
150
|
feature_id: featureId,
|
|
151
|
-
plan_json: plan
|
|
151
|
+
plan_json: plan,
|
|
152
152
|
});
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
async runPostQaReconciliation(featureIds: string[], iteration: number): Promise<void> {
|
|
157
157
|
for (const featureId of featureIds) {
|
|
158
|
-
const context = await this.toolCaller.callTool<FeatureContextPayload>(
|
|
159
|
-
|
|
160
|
-
|
|
158
|
+
const context = await this.toolCaller.callTool<FeatureContextPayload>(
|
|
159
|
+
'planner',
|
|
160
|
+
TOOLS.FEATURE_GET_CONTEXT,
|
|
161
|
+
{
|
|
162
|
+
feature_id: featureId,
|
|
163
|
+
},
|
|
164
|
+
);
|
|
161
165
|
|
|
162
166
|
const frontMatter = asRecord(asRecord(context.data.state).front_matter);
|
|
163
167
|
const status = readStatus(frontMatter.status);
|
|
@@ -172,7 +176,7 @@ export class PlanningWaveExecutor {
|
|
|
172
176
|
iteration,
|
|
173
177
|
decision: 'no_update',
|
|
174
178
|
reasons: ['missing_plan'],
|
|
175
|
-
status
|
|
179
|
+
status,
|
|
176
180
|
});
|
|
177
181
|
continue;
|
|
178
182
|
}
|
|
@@ -184,7 +188,7 @@ export class PlanningWaveExecutor {
|
|
|
184
188
|
iteration,
|
|
185
189
|
decision: 'no_update',
|
|
186
190
|
reasons: ['existing_plan_version_invalid'],
|
|
187
|
-
status
|
|
191
|
+
status,
|
|
188
192
|
});
|
|
189
193
|
continue;
|
|
190
194
|
}
|
|
@@ -199,7 +203,7 @@ export class PlanningWaveExecutor {
|
|
|
199
203
|
reasons: decision.reasons,
|
|
200
204
|
qa_summary: decision.qaSummary,
|
|
201
205
|
latest_gate_overall: decision.latestGateOverall,
|
|
202
|
-
edge_case_checklist: decision.edgeCaseChecklist
|
|
206
|
+
edge_case_checklist: decision.edgeCaseChecklist,
|
|
203
207
|
});
|
|
204
208
|
continue;
|
|
205
209
|
}
|
|
@@ -208,7 +212,7 @@ export class PlanningWaveExecutor {
|
|
|
208
212
|
await this.toolCaller.callTool('planner', TOOLS.PLAN_UPDATE, {
|
|
209
213
|
feature_id: featureId,
|
|
210
214
|
expected_plan_version: planVersion,
|
|
211
|
-
plan_json: nextPlan
|
|
215
|
+
plan_json: nextPlan,
|
|
212
216
|
});
|
|
213
217
|
|
|
214
218
|
await this.appendDecisionLog(featureId, {
|
|
@@ -222,7 +226,7 @@ export class PlanningWaveExecutor {
|
|
|
222
226
|
reasons: decision.reasons,
|
|
223
227
|
qa_summary: decision.qaSummary,
|
|
224
228
|
latest_gate_overall: decision.latestGateOverall,
|
|
225
|
-
edge_case_checklist: decision.edgeCaseChecklist
|
|
229
|
+
edge_case_checklist: decision.edgeCaseChecklist,
|
|
226
230
|
});
|
|
227
231
|
}
|
|
228
232
|
}
|
|
@@ -230,7 +234,7 @@ export class PlanningWaveExecutor {
|
|
|
230
234
|
private evaluateReconciliationDecision(
|
|
231
235
|
context: FeatureContextPayload,
|
|
232
236
|
plan: AnyRecord,
|
|
233
|
-
status: string
|
|
237
|
+
status: string,
|
|
234
238
|
): ReconciliationDecision {
|
|
235
239
|
const acceptanceCriteria = asStringArray(plan.acceptance_criteria);
|
|
236
240
|
const riskItems = asStringArray(plan.risk);
|
|
@@ -240,9 +244,10 @@ export class PlanningWaveExecutor {
|
|
|
240
244
|
const pending = readCount(qaSummary, 'pending');
|
|
241
245
|
const failed = readCount(qaSummary, 'failed');
|
|
242
246
|
const running = readCount(qaSummary, 'running');
|
|
243
|
-
const latestGateOverall =
|
|
244
|
-
|
|
245
|
-
|
|
247
|
+
const latestGateOverall =
|
|
248
|
+
typeof asRecord(context.latest_evidence).overall === 'string'
|
|
249
|
+
? String(asRecord(context.latest_evidence).overall)
|
|
250
|
+
: null;
|
|
246
251
|
|
|
247
252
|
const reasons: string[] = [];
|
|
248
253
|
const acceptanceCriteriaAdditions: string[] = [];
|
|
@@ -251,16 +256,17 @@ export class PlanningWaveExecutor {
|
|
|
251
256
|
if (missingEdgeCases.length > 0) {
|
|
252
257
|
reasons.push(`edge_case_checklist_missing:${missingEdgeCases.length}`);
|
|
253
258
|
acceptanceCriteriaAdditions.push(
|
|
254
|
-
'Planner edge-case checklist has been reviewed and incorporated into the execution plan.'
|
|
259
|
+
'Planner edge-case checklist has been reviewed and incorporated into the execution plan.',
|
|
255
260
|
);
|
|
256
261
|
}
|
|
257
262
|
|
|
258
|
-
const hasQaSignals =
|
|
263
|
+
const hasQaSignals =
|
|
264
|
+
status === STATUS.BLOCKED || failed > 0 || pending > 0 || latestGateOverall === 'fail';
|
|
259
265
|
const qaCheckpoint = `Planner reconciliation checkpoint [status=${status};failed=${failed};pending=${pending};latest=${latestGateOverall ?? 'unknown'}]`;
|
|
260
266
|
if (hasQaSignals && !acceptanceCriteria.includes(qaCheckpoint)) {
|
|
261
267
|
reasons.push(`qa_signals_detected:${status}:failed=${failed}:pending=${pending}`);
|
|
262
268
|
acceptanceCriteriaAdditions.push(
|
|
263
|
-
'Reconcile QA/gate findings against plan scope and apply corrective updates before merge.'
|
|
269
|
+
'Reconcile QA/gate findings against plan scope and apply corrective updates before merge.',
|
|
264
270
|
);
|
|
265
271
|
acceptanceCriteriaAdditions.push(qaCheckpoint);
|
|
266
272
|
}
|
|
@@ -274,9 +280,9 @@ export class PlanningWaveExecutor {
|
|
|
274
280
|
qaSummary: {
|
|
275
281
|
pending,
|
|
276
282
|
failed,
|
|
277
|
-
running
|
|
283
|
+
running,
|
|
278
284
|
},
|
|
279
|
-
latestGateOverall
|
|
285
|
+
latestGateOverall,
|
|
280
286
|
};
|
|
281
287
|
}
|
|
282
288
|
|
|
@@ -288,13 +294,17 @@ export class PlanningWaveExecutor {
|
|
|
288
294
|
qaSummary: {
|
|
289
295
|
pending,
|
|
290
296
|
failed,
|
|
291
|
-
running
|
|
297
|
+
running,
|
|
292
298
|
},
|
|
293
|
-
latestGateOverall
|
|
299
|
+
latestGateOverall,
|
|
294
300
|
};
|
|
295
301
|
}
|
|
296
302
|
|
|
297
|
-
private buildUpdatedPlan(
|
|
303
|
+
private buildUpdatedPlan(
|
|
304
|
+
plan: AnyRecord,
|
|
305
|
+
planVersion: number,
|
|
306
|
+
decision: ReconciliationDecision,
|
|
307
|
+
): AnyRecord {
|
|
298
308
|
const nextPlan = structuredClone(plan);
|
|
299
309
|
const acceptanceCriteria = asStringArray(nextPlan.acceptance_criteria);
|
|
300
310
|
const riskItems = asStringArray(nextPlan.risk);
|
|
@@ -302,7 +312,10 @@ export class PlanningWaveExecutor {
|
|
|
302
312
|
nextPlan.plan_version = planVersion + 1;
|
|
303
313
|
nextPlan.revision_of = planVersion;
|
|
304
314
|
nextPlan.revision_reason = decision.reasons.join('; ');
|
|
305
|
-
nextPlan.acceptance_criteria = normalizeList([
|
|
315
|
+
nextPlan.acceptance_criteria = normalizeList([
|
|
316
|
+
...acceptanceCriteria,
|
|
317
|
+
...decision.acceptanceCriteriaAdditions,
|
|
318
|
+
]);
|
|
306
319
|
nextPlan.risk = normalizeList([...riskItems, ...decision.edgeCaseChecklist]);
|
|
307
320
|
return nextPlan;
|
|
308
321
|
}
|
|
@@ -310,7 +323,7 @@ export class PlanningWaveExecutor {
|
|
|
310
323
|
private async appendDecisionLog(featureId: string, note: AnyRecord): Promise<void> {
|
|
311
324
|
await this.toolCaller.callTool('orchestrator', TOOLS.FEATURE_LOG_APPEND, {
|
|
312
325
|
feature_id: featureId,
|
|
313
|
-
note: JSON.stringify(note)
|
|
326
|
+
note: JSON.stringify(note),
|
|
314
327
|
});
|
|
315
328
|
}
|
|
316
329
|
}
|