agentic-orchestrator 0.1.6 → 0.1.8
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 +71 -48
- 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 +5 -22
- 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/env-file.ts +115 -0
- package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
- package/apps/control-plane/src/cli/init-command-handler.ts +182 -56
- 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 +513 -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 +79 -35
- 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 +137 -54
- 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 +328 -68
- 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 +208 -104
- 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/config/agentic/orchestrator/adapters.yaml +3 -0
- package/config/agentic/orchestrator/agents.yaml +14 -0
- package/config/agentic/orchestrator/gates.yaml +28 -0
- package/config/agentic/orchestrator/policy.yaml +22 -0
- package/config/agentic/orchestrator/prompts/builder.system.md +1 -0
- package/config/agentic/orchestrator/prompts/planner.system.md +16 -0
- package/config/agentic/orchestrator/prompts/qa.system.md +1 -0
- 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/env-file.d.ts +4 -0
- package/dist/apps/control-plane/cli/env-file.js +89 -0
- package/dist/apps/control-plane/cli/env-file.js.map +1 -0
- 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 +97 -37
- 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 +40 -23
- 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 +3 -2
- package/dist/apps/control-plane/providers/providers.js +81 -39
- 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 +189 -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_provider_auth_bootstrap_spec.md +384 -0
- 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
|
@@ -9,7 +9,7 @@ import { SupervisorRuntime } from '../src/index.js';
|
|
|
9
9
|
function makeRuntime(options: Record<string, unknown> = {}) {
|
|
10
10
|
const kernelState = {
|
|
11
11
|
repoRoot: '',
|
|
12
|
-
agentsConfig: { roles: {}, missing_prompt_behavior: 'ignore' }
|
|
12
|
+
agentsConfig: { roles: {}, missing_prompt_behavior: 'ignore' },
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
const kernel = {
|
|
@@ -19,16 +19,16 @@ function makeRuntime(options: Record<string, unknown> = {}) {
|
|
|
19
19
|
(): Record<string, unknown> => ({
|
|
20
20
|
recovery: {
|
|
21
21
|
orchestrator_session_reattach_timeout_ms: 5000,
|
|
22
|
-
orphan_session_cleanup_enabled: true
|
|
23
|
-
}
|
|
24
|
-
})
|
|
22
|
+
orphan_session_cleanup_enabled: true,
|
|
23
|
+
},
|
|
24
|
+
}),
|
|
25
25
|
),
|
|
26
26
|
getRuntimeSessions: vi.fn(async () => ({
|
|
27
27
|
run_id: 'run:test',
|
|
28
28
|
owner_instance_id: 'owner:test',
|
|
29
29
|
orchestrator_session_id: 'unknown',
|
|
30
30
|
orchestrator_epoch: 0,
|
|
31
|
-
feature_sessions: {}
|
|
31
|
+
feature_sessions: {},
|
|
32
32
|
})),
|
|
33
33
|
updateOrchestratorSession: vi.fn(async () => ({ data: {} })),
|
|
34
34
|
updateFeatureSessionAssignment: vi.fn(async () => ({ data: { updated: true } })),
|
|
@@ -38,31 +38,31 @@ function makeRuntime(options: Record<string, unknown> = {}) {
|
|
|
38
38
|
acquireRunLease: vi.fn(async () => ({ data: { took_over_stale: false } })),
|
|
39
39
|
renewLeases: vi.fn(async () => undefined),
|
|
40
40
|
renewRunLease: vi.fn(async () => undefined),
|
|
41
|
-
repoDiff: vi.fn(async () => ({ data: { diff: '' } }))
|
|
41
|
+
repoDiff: vi.fn(async () => ({ data: { diff: '' } })),
|
|
42
42
|
};
|
|
43
43
|
|
|
44
44
|
const provider = {
|
|
45
45
|
selection: {
|
|
46
46
|
provider: 'custom',
|
|
47
47
|
model: 'model-x',
|
|
48
|
-
provider_config_ref: null
|
|
48
|
+
provider_config_ref: null,
|
|
49
49
|
},
|
|
50
50
|
createSession: vi.fn(async (role: string, featureId: string) => ({
|
|
51
|
-
session_id: `${role}-${featureId}-session
|
|
51
|
+
session_id: `${role}-${featureId}-session`,
|
|
52
52
|
})),
|
|
53
53
|
reattachSession: vi.fn(async () => null),
|
|
54
|
-
closeSession: vi.fn(async () => ({ closed: true }))
|
|
54
|
+
closeSession: vi.fn(async () => ({ closed: true })),
|
|
55
55
|
};
|
|
56
56
|
|
|
57
57
|
const toolClient = {
|
|
58
|
-
call: vi.fn(async (): Promise<any> => ({ ok: true, data: {} }))
|
|
58
|
+
call: vi.fn(async (): Promise<any> => ({ ok: true, data: {} })),
|
|
59
59
|
};
|
|
60
60
|
|
|
61
61
|
const runtime = new SupervisorRuntime(kernel as any, provider as any, toolClient as any, {
|
|
62
62
|
run_id: 'run:test',
|
|
63
63
|
owner_instance_id: 'owner:test',
|
|
64
64
|
max_iterations_per_phase: 0,
|
|
65
|
-
...options
|
|
65
|
+
...options,
|
|
66
66
|
});
|
|
67
67
|
|
|
68
68
|
return { runtime, kernel, provider, toolClient };
|
|
@@ -74,16 +74,16 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
74
74
|
kernel.getPolicySnapshot.mockReturnValue({
|
|
75
75
|
recovery: {
|
|
76
76
|
orchestrator_session_reattach_timeout_ms: 5000,
|
|
77
|
-
orphan_session_cleanup_enabled: true
|
|
77
|
+
orphan_session_cleanup_enabled: true,
|
|
78
78
|
},
|
|
79
79
|
supervisor: {
|
|
80
|
-
max_iterations_per_phase: 4
|
|
81
|
-
}
|
|
80
|
+
max_iterations_per_phase: 4,
|
|
81
|
+
},
|
|
82
82
|
});
|
|
83
83
|
|
|
84
84
|
const runtime = new SupervisorRuntime(kernel as any, provider as any, toolClient as any, {
|
|
85
85
|
run_id: 'run:test',
|
|
86
|
-
owner_instance_id: 'owner:test'
|
|
86
|
+
owner_instance_id: 'owner:test',
|
|
87
87
|
});
|
|
88
88
|
|
|
89
89
|
expect(runtime.maxIterationsPerPhase).toBe(4);
|
|
@@ -96,13 +96,13 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
96
96
|
owner_instance_id: 'owner:test',
|
|
97
97
|
orchestrator_session_id: 'orch-existing',
|
|
98
98
|
orchestrator_epoch: 0,
|
|
99
|
-
feature_sessions: {}
|
|
99
|
+
feature_sessions: {},
|
|
100
100
|
});
|
|
101
101
|
provider.reattachSession.mockResolvedValue({
|
|
102
102
|
session_id: 'orch-existing',
|
|
103
103
|
role: 'orchestrator',
|
|
104
104
|
feature_id: 'global',
|
|
105
|
-
system_prompt_loaded: false
|
|
105
|
+
system_prompt_loaded: false,
|
|
106
106
|
});
|
|
107
107
|
|
|
108
108
|
await runtime.ensureGlobalOrchestratorSession();
|
|
@@ -120,7 +120,7 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
120
120
|
owner_instance_id: 'other-owner',
|
|
121
121
|
orchestrator_session_id: 'unknown',
|
|
122
122
|
orchestrator_epoch: 0,
|
|
123
|
-
feature_sessions: {}
|
|
123
|
+
feature_sessions: {},
|
|
124
124
|
});
|
|
125
125
|
provider.createSession.mockResolvedValue({ session_id: 'orch-new' });
|
|
126
126
|
|
|
@@ -133,8 +133,8 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
133
133
|
run_id: 'run:test',
|
|
134
134
|
owner_instance_id: 'owner:test',
|
|
135
135
|
orchestrator_session_id: 'orch-new',
|
|
136
|
-
increment_epoch: false
|
|
137
|
-
})
|
|
136
|
+
increment_epoch: false,
|
|
137
|
+
}),
|
|
138
138
|
);
|
|
139
139
|
});
|
|
140
140
|
|
|
@@ -143,21 +143,21 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
143
143
|
kernel.getPolicySnapshot.mockReturnValue({
|
|
144
144
|
recovery: {
|
|
145
145
|
orchestrator_session_reattach_timeout_ms: 10,
|
|
146
|
-
orphan_session_cleanup_enabled: true
|
|
147
|
-
}
|
|
146
|
+
orphan_session_cleanup_enabled: true,
|
|
147
|
+
},
|
|
148
148
|
});
|
|
149
149
|
kernel.getRuntimeSessions.mockResolvedValue({
|
|
150
150
|
run_id: 'run:test',
|
|
151
151
|
owner_instance_id: 'owner:test',
|
|
152
152
|
orchestrator_session_id: 'orch-old',
|
|
153
153
|
orchestrator_epoch: 4,
|
|
154
|
-
feature_sessions: {}
|
|
154
|
+
feature_sessions: {},
|
|
155
155
|
});
|
|
156
156
|
provider.reattachSession.mockImplementation(
|
|
157
157
|
() =>
|
|
158
158
|
new Promise(() => {
|
|
159
159
|
// Intentionally unresolved to force timeout-based fallback.
|
|
160
|
-
})
|
|
160
|
+
}),
|
|
161
161
|
);
|
|
162
162
|
provider.createSession.mockResolvedValue({ session_id: 'orch-new' });
|
|
163
163
|
toolClient.call.mockResolvedValue({ ok: true, data: {} });
|
|
@@ -170,18 +170,18 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
170
170
|
expect(kernel.updateOrchestratorSession).toHaveBeenCalledWith(
|
|
171
171
|
expect.objectContaining({
|
|
172
172
|
orchestrator_session_id: 'orch-new',
|
|
173
|
-
increment_epoch: true
|
|
174
|
-
})
|
|
173
|
+
increment_epoch: true,
|
|
174
|
+
}),
|
|
175
175
|
);
|
|
176
176
|
expect(toolClient.call).toHaveBeenCalledWith(
|
|
177
177
|
TOOLS.FEATURE_LOG_APPEND,
|
|
178
178
|
expect.objectContaining({
|
|
179
179
|
feature_id: 'global',
|
|
180
|
-
note: expect.stringContaining('"orphan_session_id":"orch-old"')
|
|
180
|
+
note: expect.stringContaining('"orphan_session_id":"orch-old"'),
|
|
181
181
|
}),
|
|
182
182
|
expect.objectContaining({
|
|
183
|
-
actor_type: 'orchestrator'
|
|
184
|
-
})
|
|
183
|
+
actor_type: 'orchestrator',
|
|
184
|
+
}),
|
|
185
185
|
);
|
|
186
186
|
});
|
|
187
187
|
|
|
@@ -196,14 +196,14 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
196
196
|
feature_a: {
|
|
197
197
|
planner_session_id: 'planner-a',
|
|
198
198
|
builder_session_id: 'builder-a',
|
|
199
|
-
qa_session_id: 'unassigned'
|
|
199
|
+
qa_session_id: 'unassigned',
|
|
200
200
|
},
|
|
201
201
|
feature_b: {
|
|
202
202
|
planner_session_id: 'planner-b',
|
|
203
203
|
builder_session_id: 'builder-b',
|
|
204
|
-
qa_session_id: 'qa-b'
|
|
205
|
-
}
|
|
206
|
-
}
|
|
204
|
+
qa_session_id: 'qa-b',
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
207
|
});
|
|
208
208
|
provider.closeSession.mockRejectedValueOnce(new Error('close error'));
|
|
209
209
|
|
|
@@ -226,14 +226,14 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
226
226
|
feature_a: {
|
|
227
227
|
planner_session_id: 'planner-a',
|
|
228
228
|
builder_session_id: 'builder-a',
|
|
229
|
-
qa_session_id: 'qa-a'
|
|
229
|
+
qa_session_id: 'qa-a',
|
|
230
230
|
},
|
|
231
231
|
feature_b: {
|
|
232
232
|
planner_session_id: 'planner-b',
|
|
233
233
|
builder_session_id: 'builder-b',
|
|
234
|
-
qa_session_id: 'unassigned'
|
|
235
|
-
}
|
|
236
|
-
}
|
|
234
|
+
qa_session_id: 'unassigned',
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
237
|
});
|
|
238
238
|
|
|
239
239
|
await runtime.cleanupOrphanWorkerSessions(['feature_a']);
|
|
@@ -252,13 +252,13 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
252
252
|
runtime.kernel.getRepoRoot = vi.fn(() => repoRoot);
|
|
253
253
|
runtime.kernel.getAgentsConfig = vi.fn(() => ({
|
|
254
254
|
roles: {
|
|
255
|
-
planner: { system_prompt_path: 'prompts/planner.md' }
|
|
255
|
+
planner: { system_prompt_path: 'prompts/planner.md' },
|
|
256
256
|
},
|
|
257
|
-
missing_prompt_behavior: 'error'
|
|
257
|
+
missing_prompt_behavior: 'error',
|
|
258
258
|
}));
|
|
259
259
|
|
|
260
260
|
await expect(runtime.loadRolePrompts()).rejects.toMatchObject({
|
|
261
|
-
code: ERROR_CODES.MISSING_ROLE_PROMPT
|
|
261
|
+
code: ERROR_CODES.MISSING_ROLE_PROMPT,
|
|
262
262
|
});
|
|
263
263
|
|
|
264
264
|
await fs.rm(repoRoot, { recursive: true, force: true });
|
|
@@ -274,9 +274,9 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
274
274
|
runtime.kernel.getAgentsConfig = vi.fn(() => ({
|
|
275
275
|
roles: {
|
|
276
276
|
planner: { system_prompt_path: 'prompts/planner.md' },
|
|
277
|
-
builder: { system_prompt_path: 'prompts/missing-builder.md' }
|
|
277
|
+
builder: { system_prompt_path: 'prompts/missing-builder.md' },
|
|
278
278
|
},
|
|
279
|
-
missing_prompt_behavior: 'ignore'
|
|
279
|
+
missing_prompt_behavior: 'ignore',
|
|
280
280
|
}));
|
|
281
281
|
|
|
282
282
|
const first = await runtime.loadRolePrompts();
|
|
@@ -286,7 +286,7 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
286
286
|
expect(first).toEqual({
|
|
287
287
|
planner: 'planner prompt',
|
|
288
288
|
builder: null,
|
|
289
|
-
qa: null
|
|
289
|
+
qa: null,
|
|
290
290
|
});
|
|
291
291
|
expect(second).toEqual(first);
|
|
292
292
|
await fs.rm(repoRoot, { recursive: true, force: true });
|
|
@@ -295,17 +295,25 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
295
295
|
it('GIVEN_mixed_context_statuses_WHEN_running_planning_wave_THEN_submits_only_missing_plans_for_plannable_states', async () => {
|
|
296
296
|
const { runtime } = makeRuntime();
|
|
297
297
|
const callTool = vi.spyOn(runtime, 'callTool');
|
|
298
|
-
const generatePlan = vi
|
|
298
|
+
const generatePlan = vi
|
|
299
|
+
.spyOn(runtime, 'generateInitialPlan')
|
|
300
|
+
.mockResolvedValue({ generated: true });
|
|
299
301
|
|
|
300
302
|
callTool.mockImplementation(async (_role, toolName, args) => {
|
|
301
303
|
if (toolName === TOOLS.FEATURE_GET_CONTEXT && args.feature_id === 'feature_a') {
|
|
302
|
-
return {
|
|
304
|
+
return {
|
|
305
|
+
ok: true,
|
|
306
|
+
data: { state: { front_matter: { status: STATUS.PLANNING } }, plan: null },
|
|
307
|
+
};
|
|
303
308
|
}
|
|
304
309
|
if (toolName === TOOLS.FEATURE_GET_CONTEXT && args.feature_id === 'feature_b') {
|
|
305
310
|
return { ok: true, data: { state: { front_matter: { status: STATUS.QA } }, plan: null } };
|
|
306
311
|
}
|
|
307
312
|
if (toolName === TOOLS.FEATURE_GET_CONTEXT && args.feature_id === 'feature_c') {
|
|
308
|
-
return {
|
|
313
|
+
return {
|
|
314
|
+
ok: true,
|
|
315
|
+
data: { state: { front_matter: { status: STATUS.BLOCKED } }, plan: { plan_version: 1 } },
|
|
316
|
+
};
|
|
309
317
|
}
|
|
310
318
|
return { ok: true, data: {} };
|
|
311
319
|
});
|
|
@@ -317,7 +325,7 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
317
325
|
expect(callTool).toHaveBeenCalledWith(
|
|
318
326
|
'planner',
|
|
319
327
|
TOOLS.PLAN_SUBMIT,
|
|
320
|
-
expect.objectContaining({ feature_id: 'feature_a' })
|
|
328
|
+
expect.objectContaining({ feature_id: 'feature_a' }),
|
|
321
329
|
);
|
|
322
330
|
});
|
|
323
331
|
|
|
@@ -331,9 +339,9 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
331
339
|
ok: true,
|
|
332
340
|
data: {
|
|
333
341
|
front_matter: {
|
|
334
|
-
status: args.feature_id === 'feature_c' ? STATUS.QA : STATUS.BUILDING
|
|
335
|
-
}
|
|
336
|
-
}
|
|
342
|
+
status: args.feature_id === 'feature_c' ? STATUS.QA : STATUS.BUILDING,
|
|
343
|
+
},
|
|
344
|
+
},
|
|
337
345
|
};
|
|
338
346
|
}
|
|
339
347
|
return { ok: true, data: {} };
|
|
@@ -342,7 +350,7 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
342
350
|
await runtime.runBuildWave(['feature_a', 'feature_b', 'feature_c']);
|
|
343
351
|
|
|
344
352
|
const gateCalls = callTool.mock.calls.filter(
|
|
345
|
-
(call) => call[0] === 'builder' && call[1] === TOOLS.GATES_RUN
|
|
353
|
+
(call) => call[0] === 'builder' && call[1] === TOOLS.GATES_RUN,
|
|
346
354
|
);
|
|
347
355
|
expect(gateCalls).toHaveLength(1);
|
|
348
356
|
expect(gateCalls[0][2]).toMatchObject({ feature_id: 'feature_a', mode: 'fast' });
|
|
@@ -354,12 +362,12 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
354
362
|
runtime.sessionsByFeature.set('feature_a', {
|
|
355
363
|
planner: 'planner-old',
|
|
356
364
|
builder: 'builder-old',
|
|
357
|
-
qa: 'qa-old'
|
|
365
|
+
qa: 'qa-old',
|
|
358
366
|
});
|
|
359
367
|
vi.spyOn(runtime, 'loadRolePrompts').mockResolvedValue({
|
|
360
368
|
planner: null,
|
|
361
369
|
builder: null,
|
|
362
|
-
qa: 'qa prompt'
|
|
370
|
+
qa: 'qa prompt',
|
|
363
371
|
});
|
|
364
372
|
vi.spyOn(runtime, 'patchFeatureCluster').mockResolvedValue();
|
|
365
373
|
const callTool = vi.spyOn(runtime, 'callTool');
|
|
@@ -381,8 +389,8 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
381
389
|
feature_id: 'feature_a',
|
|
382
390
|
planner_session_id: 'planner-old',
|
|
383
391
|
builder_session_id: 'builder-old',
|
|
384
|
-
qa_session_id: 'qa-new'
|
|
385
|
-
})
|
|
392
|
+
qa_session_id: 'qa-new',
|
|
393
|
+
}),
|
|
386
394
|
);
|
|
387
395
|
});
|
|
388
396
|
|
|
@@ -392,13 +400,13 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
392
400
|
runtime.sessionsByFeature.set('feature_a', {
|
|
393
401
|
planner: 'planner-session',
|
|
394
402
|
builder: 'builder-session',
|
|
395
|
-
qa: 'qa-session'
|
|
403
|
+
qa: 'qa-session',
|
|
396
404
|
});
|
|
397
405
|
toolClient.call.mockResolvedValueOnce({ ok: true, data: { accepted: true } });
|
|
398
406
|
|
|
399
407
|
const response = await runtime.callTool('builder', TOOLS.GATES_RUN, {
|
|
400
408
|
feature_id: 'feature_a',
|
|
401
|
-
mode: 'fast'
|
|
409
|
+
mode: 'fast',
|
|
402
410
|
});
|
|
403
411
|
|
|
404
412
|
expect(response).toEqual({ ok: true, data: { accepted: true } });
|
|
@@ -407,12 +415,12 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
407
415
|
expect.objectContaining({
|
|
408
416
|
feature_id: 'feature_a',
|
|
409
417
|
mode: 'fast',
|
|
410
|
-
operation_id: expect.any(String)
|
|
418
|
+
operation_id: expect.any(String),
|
|
411
419
|
}),
|
|
412
420
|
expect.objectContaining({
|
|
413
421
|
session_id: 'builder-session',
|
|
414
|
-
actor_type: 'builder'
|
|
415
|
-
})
|
|
422
|
+
actor_type: 'builder',
|
|
423
|
+
}),
|
|
416
424
|
);
|
|
417
425
|
});
|
|
418
426
|
|
|
@@ -421,22 +429,22 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
421
429
|
runtime.sessionsByFeature.set('feature_a', {
|
|
422
430
|
planner: 'planner-session',
|
|
423
431
|
builder: 'builder-session',
|
|
424
|
-
qa: 'qa-session'
|
|
432
|
+
qa: 'qa-session',
|
|
425
433
|
});
|
|
426
434
|
toolClient.call.mockResolvedValue({
|
|
427
435
|
ok: false,
|
|
428
436
|
error: {
|
|
429
437
|
code: ERROR_CODES.LOCK_CONFLICT,
|
|
430
438
|
message: 'lock held',
|
|
431
|
-
details: { holder: 'feature_b' }
|
|
432
|
-
}
|
|
439
|
+
details: { holder: 'feature_b' },
|
|
440
|
+
},
|
|
433
441
|
});
|
|
434
442
|
|
|
435
443
|
await expect(
|
|
436
|
-
runtime.callTool('builder', TOOLS.GATES_RUN, { feature_id: 'feature_a' })
|
|
444
|
+
runtime.callTool('builder', TOOLS.GATES_RUN, { feature_id: 'feature_a' }),
|
|
437
445
|
).rejects.toMatchObject({
|
|
438
446
|
code: ERROR_CODES.LOCK_CONFLICT,
|
|
439
|
-
details: { holder: 'feature_b' }
|
|
447
|
+
details: { holder: 'feature_b' },
|
|
440
448
|
});
|
|
441
449
|
});
|
|
442
450
|
|
|
@@ -449,7 +457,7 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
449
457
|
feature_id: 'feature_plan',
|
|
450
458
|
plan_version: 1,
|
|
451
459
|
base_ref: 'HEAD',
|
|
452
|
-
gate_profile: 'default'
|
|
460
|
+
gate_profile: 'default',
|
|
453
461
|
});
|
|
454
462
|
});
|
|
455
463
|
|
|
@@ -458,7 +466,7 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
458
466
|
runtime.sessionsByFeature.set('feature_a', {
|
|
459
467
|
planner: 'p1',
|
|
460
468
|
builder: 'b1',
|
|
461
|
-
qa: 'q1'
|
|
469
|
+
qa: 'q1',
|
|
462
470
|
});
|
|
463
471
|
|
|
464
472
|
await runtime.renewLeaseHeartbeats();
|
|
@@ -491,10 +499,10 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
491
499
|
front_matter: {
|
|
492
500
|
version: 3,
|
|
493
501
|
cluster: {
|
|
494
|
-
orchestrator_session_id: args.feature_id === 'feature_a' ? 'orch-main' : 'other'
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
}
|
|
502
|
+
orchestrator_session_id: args.feature_id === 'feature_a' ? 'orch-main' : 'other',
|
|
503
|
+
},
|
|
504
|
+
},
|
|
505
|
+
},
|
|
498
506
|
} as any;
|
|
499
507
|
}
|
|
500
508
|
return { ok: true, data: {} } as any;
|
|
@@ -511,8 +519,8 @@ describe('SupervisorRuntime unit behavior', () => {
|
|
|
511
519
|
feature_id: 'feature_q',
|
|
512
520
|
planner_session_id: 'unassigned',
|
|
513
521
|
builder_session_id: 'unassigned',
|
|
514
|
-
qa_session_id: 'unassigned'
|
|
515
|
-
})
|
|
522
|
+
qa_session_id: 'unassigned',
|
|
523
|
+
}),
|
|
516
524
|
);
|
|
517
525
|
});
|
|
518
526
|
|
|
@@ -525,11 +533,16 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
525
533
|
it('GIVEN_policy_with_agent_idle_threshold_WHEN_runtime_created_THEN_applies_configured_idle_threshold', () => {
|
|
526
534
|
const { kernel, provider, toolClient } = makeRuntime();
|
|
527
535
|
kernel.getPolicySnapshot.mockReturnValue({
|
|
528
|
-
recovery: {
|
|
529
|
-
|
|
536
|
+
recovery: {
|
|
537
|
+
orchestrator_session_reattach_timeout_ms: 5000,
|
|
538
|
+
orphan_session_cleanup_enabled: true,
|
|
539
|
+
},
|
|
540
|
+
supervisor: { agent_idle_threshold_ms: 60000 },
|
|
530
541
|
});
|
|
531
542
|
|
|
532
|
-
expect(
|
|
543
|
+
expect(
|
|
544
|
+
() => new SupervisorRuntime(kernel as any, provider as any, toolClient as any),
|
|
545
|
+
).not.toThrow();
|
|
533
546
|
});
|
|
534
547
|
|
|
535
548
|
it('GIVEN_planner_role_with_sessions_WHEN_calling_tool_THEN_uses_planner_session', async () => {
|
|
@@ -537,16 +550,19 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
537
550
|
runtime.sessionsByFeature.set('feature_a', {
|
|
538
551
|
planner: 'planner-session',
|
|
539
552
|
builder: 'builder-session',
|
|
540
|
-
qa: 'qa-session'
|
|
553
|
+
qa: 'qa-session',
|
|
541
554
|
});
|
|
542
555
|
toolClient.call.mockResolvedValueOnce({ ok: true, data: { result: 'plan-submitted' } });
|
|
543
556
|
|
|
544
|
-
await runtime.callTool('planner', TOOLS.PLAN_SUBMIT, {
|
|
557
|
+
await runtime.callTool('planner', TOOLS.PLAN_SUBMIT, {
|
|
558
|
+
feature_id: 'feature_a',
|
|
559
|
+
plan_json: {},
|
|
560
|
+
});
|
|
545
561
|
|
|
546
562
|
expect(toolClient.call).toHaveBeenCalledWith(
|
|
547
563
|
TOOLS.PLAN_SUBMIT,
|
|
548
564
|
expect.anything(),
|
|
549
|
-
expect.objectContaining({ session_id: 'planner-session', actor_type: 'planner' })
|
|
565
|
+
expect.objectContaining({ session_id: 'planner-session', actor_type: 'planner' }),
|
|
550
566
|
);
|
|
551
567
|
});
|
|
552
568
|
|
|
@@ -555,7 +571,7 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
555
571
|
runtime.sessionsByFeature.set('feature_a', {
|
|
556
572
|
planner: 'planner-session',
|
|
557
573
|
builder: 'builder-session',
|
|
558
|
-
qa: 'qa-session'
|
|
574
|
+
qa: 'qa-session',
|
|
559
575
|
});
|
|
560
576
|
toolClient.call.mockResolvedValueOnce({ ok: true, data: {} });
|
|
561
577
|
|
|
@@ -564,7 +580,7 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
564
580
|
expect(toolClient.call).toHaveBeenCalledWith(
|
|
565
581
|
TOOLS.GATES_RUN,
|
|
566
582
|
expect.anything(),
|
|
567
|
-
expect.objectContaining({ session_id: 'qa-session', actor_type: 'qa' })
|
|
583
|
+
expect.objectContaining({ session_id: 'qa-session', actor_type: 'qa' }),
|
|
568
584
|
);
|
|
569
585
|
});
|
|
570
586
|
|
|
@@ -573,12 +589,15 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
573
589
|
runtime.orchestratorSessionId = 'orch-main';
|
|
574
590
|
toolClient.call.mockResolvedValueOnce({ ok: true, data: {} });
|
|
575
591
|
|
|
576
|
-
await runtime.callTool('orchestrator', TOOLS.FEATURE_LOG_APPEND, {
|
|
592
|
+
await runtime.callTool('orchestrator', TOOLS.FEATURE_LOG_APPEND, {
|
|
593
|
+
feature_id: 'global',
|
|
594
|
+
note: 'test',
|
|
595
|
+
});
|
|
577
596
|
|
|
578
597
|
expect(toolClient.call).toHaveBeenCalledWith(
|
|
579
598
|
TOOLS.FEATURE_LOG_APPEND,
|
|
580
599
|
expect.anything(),
|
|
581
|
-
expect.objectContaining({ session_id: 'orch-main', actor_type: 'orchestrator' })
|
|
600
|
+
expect.objectContaining({ session_id: 'orch-main', actor_type: 'orchestrator' }),
|
|
582
601
|
);
|
|
583
602
|
});
|
|
584
603
|
|
|
@@ -591,7 +610,7 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
591
610
|
expect(toolClient.call).toHaveBeenCalledWith(
|
|
592
611
|
TOOLS.FEATURE_STATE_GET,
|
|
593
612
|
expect.anything(),
|
|
594
|
-
expect.objectContaining({ session_id: 'bootstrap:builder' })
|
|
613
|
+
expect.objectContaining({ session_id: 'bootstrap:builder' }),
|
|
595
614
|
);
|
|
596
615
|
});
|
|
597
616
|
|
|
@@ -599,12 +618,14 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
599
618
|
const { runtime, toolClient } = makeRuntime();
|
|
600
619
|
toolClient.call.mockResolvedValueOnce({ ok: true, data: {} });
|
|
601
620
|
|
|
602
|
-
await runtime.callTool('planner', TOOLS.FEATURE_STATE_GET, {
|
|
621
|
+
await runtime.callTool('planner', TOOLS.FEATURE_STATE_GET, {
|
|
622
|
+
feature_id: 'feature_not_tracked',
|
|
623
|
+
});
|
|
603
624
|
|
|
604
625
|
expect(toolClient.call).toHaveBeenCalledWith(
|
|
605
626
|
TOOLS.FEATURE_STATE_GET,
|
|
606
627
|
expect.anything(),
|
|
607
|
-
expect.objectContaining({ session_id: 'bootstrap:planner' })
|
|
628
|
+
expect.objectContaining({ session_id: 'bootstrap:planner' }),
|
|
608
629
|
);
|
|
609
630
|
});
|
|
610
631
|
|
|
@@ -613,16 +634,18 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
613
634
|
runtime.sessionsByFeature.set('feature_a', {
|
|
614
635
|
planner: 'planner-session',
|
|
615
636
|
builder: 'builder-session',
|
|
616
|
-
qa: 'qa-session'
|
|
637
|
+
qa: 'qa-session',
|
|
617
638
|
});
|
|
618
639
|
toolClient.call.mockResolvedValueOnce({ ok: true, data: {} });
|
|
619
640
|
|
|
620
|
-
await runtime.callTool('unknown' as never, TOOLS.FEATURE_STATE_GET, {
|
|
641
|
+
await runtime.callTool('unknown' as never, TOOLS.FEATURE_STATE_GET, {
|
|
642
|
+
feature_id: 'feature_a',
|
|
643
|
+
});
|
|
621
644
|
|
|
622
645
|
expect(toolClient.call).toHaveBeenCalledWith(
|
|
623
646
|
TOOLS.FEATURE_STATE_GET,
|
|
624
647
|
expect.anything(),
|
|
625
|
-
expect.objectContaining({ session_id: 'bootstrap:unknown' })
|
|
648
|
+
expect.objectContaining({ session_id: 'bootstrap:unknown' }),
|
|
626
649
|
);
|
|
627
650
|
});
|
|
628
651
|
|
|
@@ -638,8 +661,8 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
638
661
|
plan: { plan_version: 1, acceptance_criteria: [], risk: [] },
|
|
639
662
|
spec: '',
|
|
640
663
|
qa_test_index: { summary: { pending: 0, failed: 0, running: 0 } },
|
|
641
|
-
latest_evidence: {}
|
|
642
|
-
}
|
|
664
|
+
latest_evidence: {},
|
|
665
|
+
},
|
|
643
666
|
} as any;
|
|
644
667
|
}
|
|
645
668
|
return { ok: true, data: {} } as any;
|
|
@@ -647,7 +670,9 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
647
670
|
|
|
648
671
|
await runtime.runPostQaReconciliationWave(['feature_a'], 1);
|
|
649
672
|
|
|
650
|
-
expect(callTool).toHaveBeenCalledWith('planner', TOOLS.FEATURE_GET_CONTEXT, {
|
|
673
|
+
expect(callTool).toHaveBeenCalledWith('planner', TOOLS.FEATURE_GET_CONTEXT, {
|
|
674
|
+
feature_id: 'feature_a',
|
|
675
|
+
});
|
|
651
676
|
});
|
|
652
677
|
|
|
653
678
|
it('GIVEN_orphan_cleanup_disabled_WHEN_reattach_fails_THEN_skips_orphan_log', async () => {
|
|
@@ -655,25 +680,30 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
655
680
|
kernel.getPolicySnapshot.mockReturnValue({
|
|
656
681
|
recovery: {
|
|
657
682
|
orchestrator_session_reattach_timeout_ms: 10,
|
|
658
|
-
orphan_session_cleanup_enabled: false
|
|
659
|
-
}
|
|
683
|
+
orphan_session_cleanup_enabled: false,
|
|
684
|
+
},
|
|
660
685
|
});
|
|
661
686
|
kernel.getRuntimeSessions.mockResolvedValue({
|
|
662
687
|
run_id: 'run:test',
|
|
663
688
|
owner_instance_id: 'owner:test',
|
|
664
689
|
orchestrator_session_id: 'orch-old',
|
|
665
690
|
orchestrator_epoch: 4,
|
|
666
|
-
feature_sessions: {}
|
|
691
|
+
feature_sessions: {},
|
|
667
692
|
});
|
|
668
693
|
provider.reattachSession.mockImplementation(
|
|
669
|
-
() =>
|
|
694
|
+
() =>
|
|
695
|
+
new Promise(() => {
|
|
696
|
+
/* intentionally unresolved to force timeout */
|
|
697
|
+
}),
|
|
670
698
|
);
|
|
671
699
|
provider.createSession.mockResolvedValue({ session_id: 'orch-new' });
|
|
672
700
|
|
|
673
701
|
await runtime.ensureGlobalOrchestratorSession();
|
|
674
702
|
|
|
675
703
|
expect(runtime.orchestratorSessionId).toBe('orch-new');
|
|
676
|
-
const logCalls = toolClient.call.mock.calls.filter(
|
|
704
|
+
const logCalls = toolClient.call.mock.calls.filter(
|
|
705
|
+
(call: unknown[]) => call[0] === TOOLS.FEATURE_LOG_APPEND,
|
|
706
|
+
);
|
|
677
707
|
expect(logCalls).toHaveLength(0);
|
|
678
708
|
});
|
|
679
709
|
|
|
@@ -684,9 +714,12 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
684
714
|
vi.spyOn(runtime, 'loadRolePrompts').mockResolvedValue({
|
|
685
715
|
planner: { system: 'planner-prompt', tools: [], model_hint: null },
|
|
686
716
|
builder: { system: 'builder-prompt', tools: [], model_hint: null },
|
|
687
|
-
qa: { system: 'qa-prompt', tools: [], model_hint: null }
|
|
717
|
+
qa: { system: 'qa-prompt', tools: [], model_hint: null },
|
|
688
718
|
} as never);
|
|
689
|
-
toolClient.call.mockResolvedValue({
|
|
719
|
+
toolClient.call.mockResolvedValue({
|
|
720
|
+
ok: true,
|
|
721
|
+
data: { front_matter: { version: 1, cluster: {} } },
|
|
722
|
+
});
|
|
690
723
|
|
|
691
724
|
await runtime.initializeFeatureCluster('feature_init');
|
|
692
725
|
|
|
@@ -696,14 +729,21 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
696
729
|
|
|
697
730
|
it('GIVEN_cluster_patch_WHEN_patchFeatureCluster_called_THEN_delegates_to_session_orchestrator', async () => {
|
|
698
731
|
const { runtime, toolClient } = makeRuntime();
|
|
699
|
-
toolClient.call.mockResolvedValue({
|
|
732
|
+
toolClient.call.mockResolvedValue({
|
|
733
|
+
ok: true,
|
|
734
|
+
data: { front_matter: { version: 1, cluster: {} } },
|
|
735
|
+
});
|
|
700
736
|
|
|
701
|
-
await runtime.patchFeatureCluster('feature_patch', {
|
|
737
|
+
await runtime.patchFeatureCluster('feature_patch', {
|
|
738
|
+
planner: 'planner-session',
|
|
739
|
+
builder: 'builder-session',
|
|
740
|
+
qa: 'qa-session',
|
|
741
|
+
});
|
|
702
742
|
|
|
703
743
|
expect(toolClient.call).toHaveBeenCalledWith(
|
|
704
744
|
TOOLS.FEATURE_STATE_PATCH,
|
|
705
745
|
expect.objectContaining({ feature_id: 'feature_patch' }),
|
|
706
|
-
expect.any(Object)
|
|
746
|
+
expect.any(Object),
|
|
707
747
|
);
|
|
708
748
|
});
|
|
709
749
|
|
|
@@ -714,9 +754,14 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
714
754
|
owner_instance_id: 'none',
|
|
715
755
|
orchestrator_session_id: null,
|
|
716
756
|
orchestrator_epoch: 0,
|
|
717
|
-
feature_sessions: {}
|
|
757
|
+
feature_sessions: {},
|
|
718
758
|
});
|
|
719
|
-
provider.createSession.mockResolvedValue({
|
|
759
|
+
provider.createSession.mockResolvedValue({
|
|
760
|
+
session_id: 'new-orch-session',
|
|
761
|
+
role: 'orchestrator',
|
|
762
|
+
feature_id: 'global',
|
|
763
|
+
system_prompt_loaded: false,
|
|
764
|
+
} as any);
|
|
720
765
|
|
|
721
766
|
await runtime.ensureGlobalOrchestratorSession();
|
|
722
767
|
expect(provider.createSession).toHaveBeenCalled();
|
|
@@ -729,11 +774,13 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
729
774
|
owner_instance_id: 'owner:test',
|
|
730
775
|
orchestrator_session_id: 'orch-session',
|
|
731
776
|
orchestrator_epoch: 1,
|
|
732
|
-
feature_sessions: {}
|
|
777
|
+
feature_sessions: {},
|
|
733
778
|
});
|
|
734
779
|
|
|
735
780
|
// Should complete without throwing
|
|
736
|
-
await expect(
|
|
781
|
+
await expect(
|
|
782
|
+
runtime.cleanupOrphanWorkerSessions(['feature_a', 'feature_b']),
|
|
783
|
+
).resolves.toBeUndefined();
|
|
737
784
|
});
|
|
738
785
|
|
|
739
786
|
it('GIVEN_queue_WHEN_reconcileQueuedFeatures_called_THEN_delegates_to_session_orchestrator', async () => {
|
|
@@ -747,7 +794,7 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
747
794
|
vi.spyOn(runtime, 'loadRolePrompts').mockResolvedValue({
|
|
748
795
|
planner: { system: 'p', tools: [], model_hint: null },
|
|
749
796
|
builder: { system: 'b', tools: [], model_hint: null },
|
|
750
|
-
qa: { system: 'q', tools: [], model_hint: null }
|
|
797
|
+
qa: { system: 'q', tools: [], model_hint: null },
|
|
751
798
|
} as never);
|
|
752
799
|
|
|
753
800
|
const bundle = await runtime.loadRolePrompts();
|
|
@@ -758,7 +805,11 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
758
805
|
const { runtime } = makeRuntime();
|
|
759
806
|
const newMap = new Map([['feat1', { planner: 's1', builder: 's2', qa: 's3' }]]);
|
|
760
807
|
runtime.sessionsByFeature = newMap as never;
|
|
761
|
-
expect(runtime.sessionsByFeature.get('feat1')).toEqual({
|
|
808
|
+
expect(runtime.sessionsByFeature.get('feat1')).toEqual({
|
|
809
|
+
planner: 's1',
|
|
810
|
+
builder: 's2',
|
|
811
|
+
qa: 's3',
|
|
812
|
+
});
|
|
762
813
|
});
|
|
763
814
|
|
|
764
815
|
it('GIVEN_runtime_WHEN_queue_set_THEN_roundtrips_value', () => {
|
|
@@ -781,7 +832,7 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
781
832
|
const bundle = {
|
|
782
833
|
planner: { system: 'planner-sys', tools: [], model_hint: null },
|
|
783
834
|
builder: { system: 'builder-sys', tools: [], model_hint: null },
|
|
784
|
-
qa: { system: 'qa-sys', tools: [], model_hint: null }
|
|
835
|
+
qa: { system: 'qa-sys', tools: [], model_hint: null },
|
|
785
836
|
};
|
|
786
837
|
runtime.promptsCache = bundle as never;
|
|
787
838
|
expect(runtime.promptsCache).toEqual(bundle);
|
|
@@ -821,10 +872,23 @@ describe('SupervisorRuntime delegation methods', () => {
|
|
|
821
872
|
it('GIVEN_policy_max_iterations_WHEN_no_cli_override_THEN_uses_policy_value', () => {
|
|
822
873
|
const { kernel } = makeRuntime();
|
|
823
874
|
kernel.getPolicySnapshot.mockReturnValue({
|
|
824
|
-
recovery: {
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
875
|
+
recovery: {
|
|
876
|
+
orchestrator_session_reattach_timeout_ms: 5000,
|
|
877
|
+
orphan_session_cleanup_enabled: true,
|
|
878
|
+
},
|
|
879
|
+
supervisor: { max_iterations_per_phase: 10, max_parallel_gate_runs: 2 },
|
|
880
|
+
});
|
|
881
|
+
const runtime2 = new SupervisorRuntime(
|
|
882
|
+
kernel as any,
|
|
883
|
+
{
|
|
884
|
+
selection: { provider: 'custom', model: 'm', provider_config_ref: null },
|
|
885
|
+
createSession: vi.fn(),
|
|
886
|
+
reattachSession: vi.fn(),
|
|
887
|
+
closeSession: vi.fn(),
|
|
888
|
+
} as any,
|
|
889
|
+
{ call: vi.fn() } as any,
|
|
890
|
+
{ run_id: 'r', owner_instance_id: 'o' },
|
|
891
|
+
);
|
|
828
892
|
expect(runtime2).toBeDefined();
|
|
829
893
|
});
|
|
830
894
|
|
|
@@ -841,13 +905,15 @@ describe('PromptBundleLoader branches', () => {
|
|
|
841
905
|
getRepoRoot: () => tmpDir,
|
|
842
906
|
getAgentsConfig: () => ({
|
|
843
907
|
roles: {
|
|
844
|
-
planner: { system_prompt_path: 'prompts/planner.md' }
|
|
908
|
+
planner: { system_prompt_path: 'prompts/planner.md' },
|
|
845
909
|
},
|
|
846
|
-
missing_prompt_behavior: 'error'
|
|
847
|
-
})
|
|
910
|
+
missing_prompt_behavior: 'error',
|
|
911
|
+
}),
|
|
848
912
|
};
|
|
849
913
|
const loader = new PromptBundleLoader(reader as never);
|
|
850
|
-
await expect(loader.loadRolePrompts()).rejects.toMatchObject({
|
|
914
|
+
await expect(loader.loadRolePrompts()).rejects.toMatchObject({
|
|
915
|
+
code: ERROR_CODES.MISSING_ROLE_PROMPT,
|
|
916
|
+
});
|
|
851
917
|
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
852
918
|
});
|
|
853
919
|
});
|
|
@@ -858,7 +924,10 @@ describe('BuildWaveExecutor branches', () => {
|
|
|
858
924
|
const toolCaller = {
|
|
859
925
|
callTool: vi.fn(async (_role: string, toolName: string, _args?: Record<string, unknown>) => {
|
|
860
926
|
if (toolName === TOOLS.FEATURE_STATE_GET) {
|
|
861
|
-
return {
|
|
927
|
+
return {
|
|
928
|
+
ok: true,
|
|
929
|
+
data: { front_matter: { status: STATUS.BUILDING, gate_retry_count: 0 } },
|
|
930
|
+
};
|
|
862
931
|
}
|
|
863
932
|
if (toolName === TOOLS.FEATURE_GET_CONTEXT) {
|
|
864
933
|
return { ok: true, data: { plan: null } };
|
|
@@ -867,7 +936,7 @@ describe('BuildWaveExecutor branches', () => {
|
|
|
867
936
|
return { ok: true, data: { overall: 'pass', evidence_path: 'evidence.json' } };
|
|
868
937
|
}
|
|
869
938
|
return { ok: true, data: {} };
|
|
870
|
-
})
|
|
939
|
+
}),
|
|
871
940
|
};
|
|
872
941
|
const executor = new BuildWaveExecutor({ toolCaller: toolCaller as never });
|
|
873
942
|
await expect(executor.run(['feature_a'], 5)).resolves.toBeUndefined();
|
|
@@ -893,26 +962,26 @@ describe('QaWaveExecutor gate run throws exception', () => {
|
|
|
893
962
|
throw new Error('gate execution failed');
|
|
894
963
|
}
|
|
895
964
|
return { ok: true, data: {} };
|
|
896
|
-
})
|
|
965
|
+
}),
|
|
897
966
|
};
|
|
898
967
|
const state = {
|
|
899
968
|
runId: 'run:test',
|
|
900
969
|
ownerInstanceId: 'owner:test',
|
|
901
970
|
orchestratorSessionId: 'orch-sess',
|
|
902
|
-
sessionsByFeature
|
|
971
|
+
sessionsByFeature,
|
|
903
972
|
};
|
|
904
973
|
const kernel = {
|
|
905
|
-
updateFeatureSessionAssignment: vi.fn(async () => ({ data: { updated: true } }))
|
|
974
|
+
updateFeatureSessionAssignment: vi.fn(async () => ({ data: { updated: true } })),
|
|
906
975
|
};
|
|
907
976
|
const provider = {
|
|
908
977
|
closeSession: vi.fn(async () => ({ closed: true })),
|
|
909
|
-
createSession: vi.fn(async () => ({ session_id: 'new-session' }))
|
|
978
|
+
createSession: vi.fn(async () => ({ session_id: 'new-session' })),
|
|
910
979
|
};
|
|
911
980
|
const promptProvider = {
|
|
912
|
-
loadRolePrompts: vi.fn(async () => ({ planner: null, builder: null, qa: null }))
|
|
981
|
+
loadRolePrompts: vi.fn(async () => ({ planner: null, builder: null, qa: null })),
|
|
913
982
|
};
|
|
914
983
|
const featureClusterPatcher = {
|
|
915
|
-
patchFeatureCluster: vi.fn(async () => ({}))
|
|
984
|
+
patchFeatureCluster: vi.fn(async () => ({})),
|
|
916
985
|
};
|
|
917
986
|
const executor = new QaWaveExecutor({
|
|
918
987
|
kernel: kernel as never,
|
|
@@ -920,7 +989,7 @@ describe('QaWaveExecutor gate run throws exception', () => {
|
|
|
920
989
|
toolCaller: toolCaller as never,
|
|
921
990
|
promptProvider: promptProvider as never,
|
|
922
991
|
featureClusterPatcher: featureClusterPatcher as never,
|
|
923
|
-
state: state as never
|
|
992
|
+
state: state as never,
|
|
924
993
|
});
|
|
925
994
|
await expect(executor.run(['feature_qa'], 5)).resolves.toBeUndefined();
|
|
926
995
|
});
|