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
|
@@ -44,12 +44,16 @@ if (nodeMajor < MIN_NODE_MAJOR) {
|
|
|
44
44
|
fail(`Dockerfile Node version ${nodeMajor} is below minimum required ${MIN_NODE_MAJOR}`);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
assertContains(
|
|
47
|
+
assertContains(
|
|
48
|
+
dockerfile,
|
|
49
|
+
/apt-get install[^]*\bgit\b/m,
|
|
50
|
+
'docker image must include git toolchain',
|
|
51
|
+
);
|
|
48
52
|
assertContains(dockerfile, /ENV\s+AOP_REPO_ROOT=\/repo/m, 'docker image must declare /repo root');
|
|
49
53
|
assertContains(
|
|
50
54
|
dockerfile,
|
|
51
55
|
/ENTRYPOINT\s+\["\/bin\/sh",\s*"\/app\/docker\/mcp\.entrypoint\.sh"]/m,
|
|
52
|
-
'docker entrypoint must enforce runtime preflight checks'
|
|
56
|
+
'docker entrypoint must enforce runtime preflight checks',
|
|
53
57
|
);
|
|
54
58
|
|
|
55
59
|
assertContains(compose, /aop-mcp:/m, 'compose must declare aop-mcp service');
|
|
@@ -57,7 +61,11 @@ assertContains(compose, /- \.\.\/:\/repo/m, 'compose must bind-mount repository
|
|
|
57
61
|
assertContains(compose, /working_dir:\s*\/repo/m, 'compose service must execute from /repo');
|
|
58
62
|
|
|
59
63
|
assertContains(entrypoint, /if \[ ! -d "\/repo" ]/m, 'entrypoint must enforce /repo mount check');
|
|
60
|
-
assertContains(
|
|
64
|
+
assertContains(
|
|
65
|
+
entrypoint,
|
|
66
|
+
/for tool in node npm npx git;/m,
|
|
67
|
+
'entrypoint must verify required toolchains',
|
|
68
|
+
);
|
|
61
69
|
assertContains(entrypoint, /\bexec\s+"\$@"/, 'entrypoint must contain exec "$@" passthrough');
|
|
62
70
|
|
|
63
71
|
if (!runSmoke) {
|
|
@@ -66,7 +74,7 @@ if (!runSmoke) {
|
|
|
66
74
|
|
|
67
75
|
const config = spawnSync('docker', ['compose', '-f', composePath, 'config'], {
|
|
68
76
|
cwd: repoRoot,
|
|
69
|
-
stdio: 'inherit'
|
|
77
|
+
stdio: 'inherit',
|
|
70
78
|
});
|
|
71
79
|
if (config.status !== 0) {
|
|
72
80
|
fail('docker compose config validation failed');
|
|
@@ -74,7 +82,7 @@ if (config.status !== 0) {
|
|
|
74
82
|
|
|
75
83
|
const build = spawnSync('docker', ['compose', '-f', composePath, 'build', 'aop-mcp'], {
|
|
76
84
|
cwd: repoRoot,
|
|
77
|
-
stdio: 'inherit'
|
|
85
|
+
stdio: 'inherit',
|
|
78
86
|
});
|
|
79
87
|
if (build.status !== 0) {
|
|
80
88
|
fail('docker compose build smoke check failed');
|
|
@@ -82,11 +90,25 @@ if (build.status !== 0) {
|
|
|
82
90
|
|
|
83
91
|
const smoke = spawnSync(
|
|
84
92
|
'docker',
|
|
85
|
-
[
|
|
93
|
+
[
|
|
94
|
+
'compose',
|
|
95
|
+
'-f',
|
|
96
|
+
composePath,
|
|
97
|
+
'run',
|
|
98
|
+
'--rm',
|
|
99
|
+
'aop-mcp',
|
|
100
|
+
'npm',
|
|
101
|
+
'run',
|
|
102
|
+
'run',
|
|
103
|
+
'--',
|
|
104
|
+
'status',
|
|
105
|
+
'--transport',
|
|
106
|
+
'mcp',
|
|
107
|
+
],
|
|
86
108
|
{
|
|
87
109
|
cwd: repoRoot,
|
|
88
|
-
stdio: 'inherit'
|
|
89
|
-
}
|
|
110
|
+
stdio: 'inherit',
|
|
111
|
+
},
|
|
90
112
|
);
|
|
91
113
|
if (smoke.status !== 0) {
|
|
92
114
|
fail('docker compose run smoke check failed');
|
|
@@ -13,7 +13,7 @@ const KNOWN_ROLES = new Set(['orchestrator', 'planner', 'builder', 'qa', 'system
|
|
|
13
13
|
const KNOWN_SHARED_SCHEMAS = new Set([
|
|
14
14
|
'schemas/input/mutating.schema.json',
|
|
15
15
|
'schemas/input/read.schema.json',
|
|
16
|
-
'schemas/output/standard_success.schema.json'
|
|
16
|
+
'schemas/output/standard_success.schema.json',
|
|
17
17
|
]);
|
|
18
18
|
|
|
19
19
|
function fail(message: string): never {
|
|
@@ -40,14 +40,18 @@ async function main(): Promise<void> {
|
|
|
40
40
|
|
|
41
41
|
if (protocol.mcp_protocol_version !== MCP_PROTOCOL_PIN.mcp_protocol_version) {
|
|
42
42
|
fail(
|
|
43
|
-
`protocol_version_pin_mismatch expected=${MCP_PROTOCOL_PIN.mcp_protocol_version} actual=${protocol.mcp_protocol_version}
|
|
43
|
+
`protocol_version_pin_mismatch expected=${MCP_PROTOCOL_PIN.mcp_protocol_version} actual=${protocol.mcp_protocol_version}`,
|
|
44
44
|
);
|
|
45
45
|
}
|
|
46
46
|
if (protocol.sdk.package !== MCP_PROTOCOL_PIN.sdk.package) {
|
|
47
|
-
fail(
|
|
47
|
+
fail(
|
|
48
|
+
`protocol_sdk_package_pin_mismatch expected=${MCP_PROTOCOL_PIN.sdk.package} actual=${protocol.sdk.package}`,
|
|
49
|
+
);
|
|
48
50
|
}
|
|
49
51
|
if (protocol.sdk.version !== MCP_PROTOCOL_PIN.sdk.version) {
|
|
50
|
-
fail(
|
|
52
|
+
fail(
|
|
53
|
+
`protocol_sdk_version_pin_mismatch expected=${MCP_PROTOCOL_PIN.sdk.version} actual=${protocol.sdk.version}`,
|
|
54
|
+
);
|
|
51
55
|
}
|
|
52
56
|
|
|
53
57
|
for (const transport of REQUIRED_MCP_TRANSPORTS) {
|
|
@@ -90,7 +94,7 @@ async function main(): Promise<void> {
|
|
|
90
94
|
const mutatingInCode = TOOL_BEHAVIOR_METADATA[tool.handler_id]?.mutating === true;
|
|
91
95
|
if (mutatingInCatalog !== mutatingInCode) {
|
|
92
96
|
errors.push(
|
|
93
|
-
`Tool "${tool.handler_id}" mutating flag mismatch: catalog=${String(mutatingInCatalog)}, code=${String(mutatingInCode)}
|
|
97
|
+
`Tool "${tool.handler_id}" mutating flag mismatch: catalog=${String(mutatingInCatalog)}, code=${String(mutatingInCode)}`,
|
|
94
98
|
);
|
|
95
99
|
}
|
|
96
100
|
|
|
@@ -103,7 +107,9 @@ async function main(): Promise<void> {
|
|
|
103
107
|
|
|
104
108
|
// V1.2: AJV schema compilation + V1.3: orphan tracking
|
|
105
109
|
for (const schemaRef of [tool.input_schema_ref, tool.output_schema_ref]) {
|
|
106
|
-
if (!schemaRef) {
|
|
110
|
+
if (!schemaRef) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
107
113
|
referencedSchemas.add(schemaRef);
|
|
108
114
|
const schemaPath = path.resolve(toolsDir, schemaRef);
|
|
109
115
|
try {
|
|
@@ -122,7 +128,7 @@ async function main(): Promise<void> {
|
|
|
122
128
|
// V1.3: orphan schema detection
|
|
123
129
|
const allSchemaFiles = [
|
|
124
130
|
...globSchemaFiles(path.join(toolsDir, 'schemas', 'input'), 'schemas/input'),
|
|
125
|
-
...globSchemaFiles(path.join(toolsDir, 'schemas', 'output'), 'schemas/output')
|
|
131
|
+
...globSchemaFiles(path.join(toolsDir, 'schemas', 'output'), 'schemas/output'),
|
|
126
132
|
];
|
|
127
133
|
for (const file of allSchemaFiles) {
|
|
128
134
|
if (!referencedSchemas.has(file) && !KNOWN_SHARED_SCHEMAS.has(file)) {
|
|
@@ -12,7 +12,11 @@ export interface AdapterManifest {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export interface AdapterRegistry {
|
|
15
|
-
register<T>(
|
|
15
|
+
register<T>(
|
|
16
|
+
slot: AdapterSlot<T>,
|
|
17
|
+
manifest: AdapterManifest,
|
|
18
|
+
factory: (config: unknown) => T,
|
|
19
|
+
): void;
|
|
16
20
|
resolve<T>(slot: AdapterSlot<T>, name: string, config: unknown): T;
|
|
17
21
|
list(slot: string): ReadonlyArray<AdapterManifest>;
|
|
18
22
|
has(slot: string, name: string): boolean;
|
|
@@ -28,7 +32,11 @@ export interface AdapterRegistryError extends Error {
|
|
|
28
32
|
details?: Record<string, unknown>;
|
|
29
33
|
}
|
|
30
34
|
|
|
31
|
-
function makeRegistryError(
|
|
35
|
+
function makeRegistryError(
|
|
36
|
+
message: string,
|
|
37
|
+
code: string,
|
|
38
|
+
details?: Record<string, unknown>,
|
|
39
|
+
): AdapterRegistryError {
|
|
32
40
|
const error = new Error(message) as AdapterRegistryError;
|
|
33
41
|
error.code = code;
|
|
34
42
|
if (details !== undefined) {
|
|
@@ -41,12 +49,17 @@ export class DefaultAdapterRegistry implements AdapterRegistry {
|
|
|
41
49
|
// slot name → adapter name → entry
|
|
42
50
|
private readonly _entries = new Map<string, Map<string, AdapterEntry<unknown>>>();
|
|
43
51
|
|
|
44
|
-
register<T>(
|
|
52
|
+
register<T>(
|
|
53
|
+
slot: AdapterSlot<T>,
|
|
54
|
+
manifest: AdapterManifest,
|
|
55
|
+
factory: (config: unknown) => T,
|
|
56
|
+
): void {
|
|
45
57
|
let byName = this._entries.get(slot.name);
|
|
46
58
|
if (!byName) {
|
|
47
59
|
byName = new Map();
|
|
48
60
|
this._entries.set(slot.name, byName);
|
|
49
|
-
}
|
|
61
|
+
}
|
|
62
|
+
byName.set(manifest.name, { manifest, factory: factory as (config: unknown) => unknown });
|
|
50
63
|
}
|
|
51
64
|
|
|
52
65
|
resolve<T>(slot: AdapterSlot<T>, name: string, config: unknown): T {
|
|
@@ -57,7 +70,7 @@ export class DefaultAdapterRegistry implements AdapterRegistry {
|
|
|
57
70
|
throw makeRegistryError(
|
|
58
71
|
ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER,
|
|
59
72
|
ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER,
|
|
60
|
-
{ slot: slot.name, name }
|
|
73
|
+
{ slot: slot.name, name },
|
|
61
74
|
);
|
|
62
75
|
}
|
|
63
76
|
|
|
@@ -84,7 +97,7 @@ export interface AgentProviderContract {
|
|
|
84
97
|
}
|
|
85
98
|
|
|
86
99
|
export const AGENT_PROVIDER_SLOT: AdapterSlot<AgentProviderContract> = {
|
|
87
|
-
name: 'agent-provider'
|
|
100
|
+
name: 'agent-provider',
|
|
88
101
|
};
|
|
89
102
|
|
|
90
103
|
// ---- Activity detector slot ----
|
|
@@ -94,7 +107,7 @@ export interface ActivityDetectorContract {
|
|
|
94
107
|
}
|
|
95
108
|
|
|
96
109
|
export const ACTIVITY_DETECTOR_SLOT: AdapterSlot<ActivityDetectorContract> = {
|
|
97
|
-
name: 'activity-detector'
|
|
110
|
+
name: 'activity-detector',
|
|
98
111
|
};
|
|
99
112
|
|
|
100
113
|
// ---- Notification channel slot ----
|
|
@@ -104,7 +117,7 @@ export interface NotificationChannelContract {
|
|
|
104
117
|
}
|
|
105
118
|
|
|
106
119
|
export const NOTIFICATION_CHANNEL_SLOT: AdapterSlot<NotificationChannelContract> = {
|
|
107
|
-
name: 'notification-channel'
|
|
120
|
+
name: 'notification-channel',
|
|
108
121
|
};
|
|
109
122
|
|
|
110
123
|
// ---- SCM provider slot ----
|
|
@@ -114,10 +127,17 @@ export interface ScmProviderContract {
|
|
|
114
127
|
}
|
|
115
128
|
|
|
116
129
|
export const SCM_PROVIDER_SLOT: AdapterSlot<ScmProviderContract> = {
|
|
117
|
-
name: 'scm-provider'
|
|
130
|
+
name: 'scm-provider',
|
|
118
131
|
};
|
|
119
132
|
|
|
120
|
-
const BUILT_IN_PROVIDER_NAMES = [
|
|
133
|
+
const BUILT_IN_PROVIDER_NAMES = [
|
|
134
|
+
'codex',
|
|
135
|
+
'claude',
|
|
136
|
+
'gemini',
|
|
137
|
+
'kiro-cli',
|
|
138
|
+
'copilot',
|
|
139
|
+
'custom',
|
|
140
|
+
] as const;
|
|
121
141
|
const BUILT_IN_ACTIVITY_DETECTORS = ['claude-jsonl', 'codex-rpc', 'process-heuristic'] as const;
|
|
122
142
|
const BUILT_IN_NOTIFICATION_CHANNELS = ['desktop', 'slack', 'webhook'] as const;
|
|
123
143
|
const BUILT_IN_SCM_PROVIDERS = ['github'] as const;
|
|
@@ -136,7 +156,7 @@ for (const providerName of BUILT_IN_PROVIDER_NAMES) {
|
|
|
136
156
|
globalAdapterRegistry.register(
|
|
137
157
|
AGENT_PROVIDER_SLOT,
|
|
138
158
|
makeProviderManifest(providerName),
|
|
139
|
-
makeProviderFactory(providerName)
|
|
159
|
+
makeProviderFactory(providerName),
|
|
140
160
|
);
|
|
141
161
|
}
|
|
142
162
|
|
|
@@ -144,7 +164,7 @@ for (const detectorName of BUILT_IN_ACTIVITY_DETECTORS) {
|
|
|
144
164
|
globalAdapterRegistry.register(
|
|
145
165
|
ACTIVITY_DETECTOR_SLOT,
|
|
146
166
|
{ slot: ACTIVITY_DETECTOR_SLOT.name, name: detectorName },
|
|
147
|
-
() => ({ name: detectorName })
|
|
167
|
+
() => ({ name: detectorName }),
|
|
148
168
|
);
|
|
149
169
|
}
|
|
150
170
|
|
|
@@ -152,7 +172,7 @@ for (const channelName of BUILT_IN_NOTIFICATION_CHANNELS) {
|
|
|
152
172
|
globalAdapterRegistry.register(
|
|
153
173
|
NOTIFICATION_CHANNEL_SLOT,
|
|
154
174
|
{ slot: NOTIFICATION_CHANNEL_SLOT.name, name: channelName },
|
|
155
|
-
() => ({ name: channelName })
|
|
175
|
+
() => ({ name: channelName }),
|
|
156
176
|
);
|
|
157
177
|
}
|
|
158
178
|
|
|
@@ -160,10 +180,10 @@ for (const scmProviderName of BUILT_IN_SCM_PROVIDERS) {
|
|
|
160
180
|
globalAdapterRegistry.register(
|
|
161
181
|
SCM_PROVIDER_SLOT,
|
|
162
182
|
{ slot: SCM_PROVIDER_SLOT.name, name: scmProviderName },
|
|
163
|
-
() => ({ name: scmProviderName })
|
|
183
|
+
() => ({ name: scmProviderName }),
|
|
164
184
|
);
|
|
165
185
|
}
|
|
166
186
|
|
|
167
187
|
export const REGISTERED_PROVIDER_NAMES: ReadonlySet<string> = new Set(
|
|
168
|
-
globalAdapterRegistry.list(AGENT_PROVIDER_SLOT.name).map((m) => m.name)
|
|
188
|
+
globalAdapterRegistry.list(AGENT_PROVIDER_SLOT.name).map((m) => m.name),
|
|
169
189
|
);
|
|
@@ -32,6 +32,8 @@ export interface MultiProjectConfig {
|
|
|
32
32
|
|
|
33
33
|
const MULTI_PROJECT_YAML = 'multi-project.yaml';
|
|
34
34
|
const SCHEMA_NAME = 'multi-project.schema.json';
|
|
35
|
+
const PRIMARY_MULTI_PROJECT_DIR = ['config', 'agentic', 'orchestrator'] as const;
|
|
36
|
+
const LEGACY_MULTI_PROJECT_DIR = ['agentic', 'orchestrator'] as const;
|
|
35
37
|
|
|
36
38
|
function resolveHomePath(rawPath: string): string {
|
|
37
39
|
if (rawPath.startsWith('~/') || rawPath === '~') {
|
|
@@ -50,13 +52,18 @@ function resolveConfiguredPath(rawPath: string, baseDir: string): string {
|
|
|
50
52
|
|
|
51
53
|
export class MultiProjectLoader {
|
|
52
54
|
async load(baseDir: string): Promise<MultiProjectConfig | null> {
|
|
53
|
-
const
|
|
55
|
+
const primaryYamlPath = path.join(baseDir, ...PRIMARY_MULTI_PROJECT_DIR, MULTI_PROJECT_YAML);
|
|
56
|
+
const legacyYamlPath = path.join(baseDir, ...LEGACY_MULTI_PROJECT_DIR, MULTI_PROJECT_YAML);
|
|
54
57
|
|
|
55
58
|
let raw: string;
|
|
56
59
|
try {
|
|
57
|
-
raw = await fs.readFile(
|
|
60
|
+
raw = await fs.readFile(primaryYamlPath, 'utf8');
|
|
58
61
|
} catch {
|
|
59
|
-
|
|
62
|
+
try {
|
|
63
|
+
raw = await fs.readFile(legacyYamlPath, 'utf8');
|
|
64
|
+
} catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
60
67
|
}
|
|
61
68
|
|
|
62
69
|
const parsed = YAML.parse(raw) as MultiProjectConfig;
|
|
@@ -65,13 +72,13 @@ export class MultiProjectLoader {
|
|
|
65
72
|
const result = await schemaRegistry.validate(SCHEMA_NAME, parsed);
|
|
66
73
|
if (!result.valid) {
|
|
67
74
|
const error = new Error(
|
|
68
|
-
`multi-project.yaml validation failed: ${result.errors.map((e) => e.message).join(', ')}
|
|
75
|
+
`multi-project.yaml validation failed: ${result.errors.map((e) => e.message).join(', ')}`,
|
|
69
76
|
) as AppError;
|
|
70
77
|
error.code = ERROR_CODES.INVALID_ARGUMENT;
|
|
71
78
|
error.details = {
|
|
72
79
|
retryable: false,
|
|
73
80
|
requires_human: true,
|
|
74
|
-
validation_errors: result.errors
|
|
81
|
+
validation_errors: result.errors,
|
|
75
82
|
};
|
|
76
83
|
throw error;
|
|
77
84
|
}
|
|
@@ -80,8 +87,14 @@ export class MultiProjectLoader {
|
|
|
80
87
|
const projects: ProjectConfig[] = parsed.projects.map((p) => ({
|
|
81
88
|
...p,
|
|
82
89
|
path: resolveConfiguredPath(p.path, baseDir),
|
|
83
|
-
policy:
|
|
84
|
-
|
|
90
|
+
policy:
|
|
91
|
+
typeof p.policy === 'string'
|
|
92
|
+
? resolveConfiguredPath(p.policy, resolveConfiguredPath(p.path, baseDir))
|
|
93
|
+
: undefined,
|
|
94
|
+
gates:
|
|
95
|
+
typeof p.gates === 'string'
|
|
96
|
+
? resolveConfiguredPath(p.gates, resolveConfiguredPath(p.path, baseDir))
|
|
97
|
+
: undefined,
|
|
85
98
|
}));
|
|
86
99
|
|
|
87
100
|
return { ...parsed, projects };
|
|
@@ -108,12 +121,16 @@ export class MultiProjectLoader {
|
|
|
108
121
|
}
|
|
109
122
|
|
|
110
123
|
async exists(baseDir: string): Promise<boolean> {
|
|
111
|
-
const yamlPath = path.join(baseDir, 'agentic', 'orchestrator', MULTI_PROJECT_YAML);
|
|
112
124
|
try {
|
|
113
|
-
await fs.access(
|
|
125
|
+
await fs.access(path.join(baseDir, ...PRIMARY_MULTI_PROJECT_DIR, MULTI_PROJECT_YAML));
|
|
114
126
|
return true;
|
|
115
127
|
} catch {
|
|
116
|
-
|
|
128
|
+
try {
|
|
129
|
+
await fs.access(path.join(baseDir, ...LEGACY_MULTI_PROJECT_DIR, MULTI_PROJECT_YAML));
|
|
130
|
+
return true;
|
|
131
|
+
} catch {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
117
134
|
}
|
|
118
135
|
}
|
|
119
136
|
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { TOOLS } from '../../core/constants.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
FeatureStateFrontMatter,
|
|
4
|
+
FeatureStatePayload,
|
|
5
|
+
ToolCaller as SupervisorToolCaller,
|
|
6
|
+
} from '../../core/tool-caller.js';
|
|
3
7
|
import type { NotifierService } from './notifier-service.js';
|
|
4
8
|
|
|
5
9
|
export type ActivityState = 'active' | 'idle' | 'waiting_input' | 'blocked' | 'exited' | 'unknown';
|
|
@@ -40,7 +44,9 @@ const DEFAULT_IDLE_THRESHOLD_MS = 300_000;
|
|
|
40
44
|
|
|
41
45
|
export class ActivityMonitorService {
|
|
42
46
|
private readonly toolCaller: SupervisorToolCaller;
|
|
43
|
-
private readonly operationLedger:
|
|
47
|
+
private readonly operationLedger:
|
|
48
|
+
| { getLastOperationAt(featureId: string): string | null }
|
|
49
|
+
| undefined;
|
|
44
50
|
private readonly idleThresholdMs: number;
|
|
45
51
|
private readonly notifier: NotifierService | undefined;
|
|
46
52
|
private readonly reactionsPolicy: { agent_stuck?: AgentStuckReaction } | undefined;
|
|
@@ -66,7 +72,8 @@ export class ActivityMonitorService {
|
|
|
66
72
|
}
|
|
67
73
|
|
|
68
74
|
private resolveLastEvent(featureId: string, frontMatter: ActivityFrontMatter): string | null {
|
|
69
|
-
const statusReason =
|
|
75
|
+
const statusReason =
|
|
76
|
+
typeof frontMatter.status_reason === 'string' ? frontMatter.status_reason.toLowerCase() : '';
|
|
70
77
|
if (statusReason.includes('waiting_input') || statusReason.includes('awaiting_input')) {
|
|
71
78
|
return frontMatter.last_heartbeat_at ?? frontMatter.last_run_at ?? null;
|
|
72
79
|
}
|
|
@@ -85,7 +92,8 @@ export class ActivityMonitorService {
|
|
|
85
92
|
|
|
86
93
|
private deriveState(frontMatter: ActivityFrontMatter, lastEventAt: string | null): ActivityState {
|
|
87
94
|
const status = frontMatter.status;
|
|
88
|
-
const statusReason =
|
|
95
|
+
const statusReason =
|
|
96
|
+
typeof frontMatter.status_reason === 'string' ? frontMatter.status_reason.toLowerCase() : '';
|
|
89
97
|
|
|
90
98
|
if (status === 'failed' || status === 'merged') {
|
|
91
99
|
return 'exited';
|
|
@@ -106,9 +114,13 @@ export class ActivityMonitorService {
|
|
|
106
114
|
|
|
107
115
|
private async persistSnapshot(featureId: string, snapshot: ActivitySnapshot): Promise<void> {
|
|
108
116
|
try {
|
|
109
|
-
const current = await this.toolCaller.callTool<FeatureStatePayload>(
|
|
110
|
-
|
|
111
|
-
|
|
117
|
+
const current = await this.toolCaller.callTool<FeatureStatePayload>(
|
|
118
|
+
'orchestrator',
|
|
119
|
+
TOOLS.FEATURE_STATE_GET,
|
|
120
|
+
{
|
|
121
|
+
feature_id: featureId,
|
|
122
|
+
},
|
|
123
|
+
);
|
|
112
124
|
const frontMatter = current.data.front_matter as ActivityFrontMatter & {
|
|
113
125
|
version: number;
|
|
114
126
|
activity_state?: string;
|
|
@@ -131,9 +143,9 @@ export class ActivityMonitorService {
|
|
|
131
143
|
activity_state: snapshot.state,
|
|
132
144
|
activity_last_event_at: snapshot.lastEventAt,
|
|
133
145
|
activity_detected_via: snapshot.detectedVia,
|
|
134
|
-
activity_detector: this.detectorName
|
|
135
|
-
}
|
|
136
|
-
}
|
|
146
|
+
activity_detector: this.detectorName,
|
|
147
|
+
},
|
|
148
|
+
},
|
|
137
149
|
});
|
|
138
150
|
} catch {
|
|
139
151
|
// Activity persistence is best-effort and should not block orchestration.
|
|
@@ -144,7 +156,7 @@ export class ActivityMonitorService {
|
|
|
144
156
|
const response = await this.toolCaller.callTool<FeatureStatePayload>(
|
|
145
157
|
'orchestrator',
|
|
146
158
|
TOOLS.FEATURE_STATE_GET,
|
|
147
|
-
{ feature_id: featureId }
|
|
159
|
+
{ feature_id: featureId },
|
|
148
160
|
);
|
|
149
161
|
|
|
150
162
|
const frontMatter = response.data.front_matter as ActivityFrontMatter;
|
|
@@ -153,7 +165,7 @@ export class ActivityMonitorService {
|
|
|
153
165
|
featureId,
|
|
154
166
|
state: this.deriveState(frontMatter, lastEventAt),
|
|
155
167
|
lastEventAt,
|
|
156
|
-
detectedVia: this.detectedVia(featureId)
|
|
168
|
+
detectedVia: this.detectedVia(featureId),
|
|
157
169
|
};
|
|
158
170
|
}
|
|
159
171
|
|
|
@@ -177,8 +189,8 @@ export class ActivityMonitorService {
|
|
|
177
189
|
details: {
|
|
178
190
|
state: snapshot.state,
|
|
179
191
|
last_event_at: snapshot.lastEventAt,
|
|
180
|
-
idle_threshold_ms: this.idleThresholdMs
|
|
181
|
-
}
|
|
192
|
+
idle_threshold_ms: this.idleThresholdMs,
|
|
193
|
+
},
|
|
182
194
|
});
|
|
183
195
|
}
|
|
184
196
|
|
|
@@ -11,7 +11,7 @@ type StateReadResult = {
|
|
|
11
11
|
|
|
12
12
|
type StateUpdater = (
|
|
13
13
|
frontMatter: AnyRecord,
|
|
14
|
-
body: string
|
|
14
|
+
body: string,
|
|
15
15
|
) => Promise<{ frontMatter?: AnyRecord; body?: string }>;
|
|
16
16
|
|
|
17
17
|
function asArray<T = unknown>(value: unknown): T[] {
|
|
@@ -47,8 +47,16 @@ export interface CollisionQueueServicePort {
|
|
|
47
47
|
withIndexLock<T>(operation: () => Promise<T>): Promise<T>;
|
|
48
48
|
readIndex(): Promise<AnyRecord>;
|
|
49
49
|
writeIndex(index: AnyRecord): Promise<void>;
|
|
50
|
-
updateState(
|
|
51
|
-
|
|
50
|
+
updateState(
|
|
51
|
+
featureId: string,
|
|
52
|
+
expectedVersion: number | null,
|
|
53
|
+
updater: StateUpdater,
|
|
54
|
+
): Promise<AnyRecord>;
|
|
55
|
+
planSubmit(
|
|
56
|
+
featureId: string,
|
|
57
|
+
plan: AnyRecord,
|
|
58
|
+
expectedVersion: number | null,
|
|
59
|
+
): Promise<{ data: { feature_id: string; accepted: boolean; plan_version: number } }>;
|
|
52
60
|
}
|
|
53
61
|
|
|
54
62
|
export class CollisionQueueService {
|
|
@@ -96,18 +104,21 @@ export class CollisionQueueService {
|
|
|
96
104
|
return missing.length === 0;
|
|
97
105
|
}
|
|
98
106
|
|
|
99
|
-
async checkPlanCollision(
|
|
107
|
+
async checkPlanCollision(
|
|
108
|
+
featureId: string,
|
|
109
|
+
plan: AnyRecord,
|
|
110
|
+
): Promise<{ hasCollisions: boolean; fingerprint?: string }> {
|
|
100
111
|
const policy = this.port.getPolicySnapshot();
|
|
101
112
|
const acceptedPlans = await this.collectAcceptedPlans(featureId);
|
|
102
113
|
const collisionResult = detectPlanCollisions(
|
|
103
114
|
plan as Parameters<typeof detectPlanCollisions>[0],
|
|
104
115
|
acceptedPlans as Parameters<typeof detectPlanCollisions>[1],
|
|
105
|
-
policy as Parameters<typeof detectPlanCollisions>[2]
|
|
116
|
+
policy as Parameters<typeof detectPlanCollisions>[2],
|
|
106
117
|
);
|
|
107
118
|
|
|
108
119
|
return {
|
|
109
120
|
hasCollisions: collisionResult.hasCollisions,
|
|
110
|
-
fingerprint: collisionResult.fingerprint
|
|
121
|
+
fingerprint: collisionResult.fingerprint,
|
|
111
122
|
};
|
|
112
123
|
}
|
|
113
124
|
|
|
@@ -146,35 +157,38 @@ export class CollisionQueueService {
|
|
|
146
157
|
}
|
|
147
158
|
}
|
|
148
159
|
|
|
149
|
-
async reDriveBlockedQueue(): Promise<{
|
|
160
|
+
async reDriveBlockedQueue(): Promise<{
|
|
161
|
+
data: { processed: number; retried: number; still_blocked: number };
|
|
162
|
+
}> {
|
|
150
163
|
const policy = this.port.getPolicySnapshot();
|
|
151
|
-
|
|
164
|
+
|
|
152
165
|
if (policy.collision_policy !== 'block') {
|
|
153
166
|
return {
|
|
154
167
|
data: {
|
|
155
168
|
processed: 0,
|
|
156
169
|
retried: 0,
|
|
157
|
-
still_blocked: 0
|
|
158
|
-
}
|
|
170
|
+
still_blocked: 0,
|
|
171
|
+
},
|
|
159
172
|
};
|
|
160
173
|
}
|
|
161
174
|
|
|
162
175
|
return await this.port.withIndexLock(async () => {
|
|
163
176
|
const index = await this.port.readIndex();
|
|
164
177
|
const queue: QueueEntry[] = asArray<QueueEntry>(index.blocked_queue);
|
|
165
|
-
|
|
178
|
+
|
|
166
179
|
if (queue.length === 0) {
|
|
167
180
|
return {
|
|
168
181
|
data: {
|
|
169
182
|
processed: 0,
|
|
170
183
|
retried: 0,
|
|
171
|
-
still_blocked: 0
|
|
172
|
-
}
|
|
184
|
+
still_blocked: 0,
|
|
185
|
+
},
|
|
173
186
|
};
|
|
174
187
|
}
|
|
175
188
|
|
|
176
189
|
const sortedQueue = [...queue].sort(
|
|
177
|
-
(a, b) =>
|
|
190
|
+
(a, b) =>
|
|
191
|
+
a.detected_at.localeCompare(b.detected_at) || a.feature_id.localeCompare(b.feature_id),
|
|
178
192
|
);
|
|
179
193
|
|
|
180
194
|
const stillBlocked: QueueEntry[] = [];
|
|
@@ -199,8 +213,8 @@ export class CollisionQueueService {
|
|
|
199
213
|
data: {
|
|
200
214
|
processed: sortedQueue.length,
|
|
201
215
|
retried: retriedCount,
|
|
202
|
-
still_blocked: stillBlocked.length
|
|
203
|
-
}
|
|
216
|
+
still_blocked: stillBlocked.length,
|
|
217
|
+
},
|
|
204
218
|
};
|
|
205
219
|
});
|
|
206
220
|
}
|
|
@@ -211,7 +225,7 @@ export class CollisionQueueService {
|
|
|
211
225
|
const queue: QueueEntry[] = asArray<QueueEntry>(index.blocked_queue);
|
|
212
226
|
const before = queue.length;
|
|
213
227
|
const filtered = queue.filter((entry) => entry.feature_id !== featureId);
|
|
214
|
-
|
|
228
|
+
|
|
215
229
|
if (filtered.length === before) {
|
|
216
230
|
return { data: { removed: false } };
|
|
217
231
|
}
|
|
@@ -34,21 +34,27 @@ export class CostTrackingService {
|
|
|
34
34
|
|
|
35
35
|
async getFeatureCost(featureId: string): Promise<FeatureCost> {
|
|
36
36
|
const existing = await readJson<FeatureCost>(this.port.featureCostPath(featureId), null);
|
|
37
|
-
return
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
return (
|
|
38
|
+
existing ?? {
|
|
39
|
+
feature_id: featureId,
|
|
40
|
+
tokens_used: 0,
|
|
41
|
+
estimated_cost_usd: 0.0,
|
|
42
|
+
last_updated: nowIso(),
|
|
43
|
+
}
|
|
44
|
+
);
|
|
43
45
|
}
|
|
44
46
|
|
|
45
|
-
async recordCost(
|
|
47
|
+
async recordCost(
|
|
48
|
+
featureId: string,
|
|
49
|
+
tokensDelta: number,
|
|
50
|
+
costUsdDelta: number,
|
|
51
|
+
): Promise<FeatureCost> {
|
|
46
52
|
const current = await this.getFeatureCost(featureId);
|
|
47
53
|
const updated: FeatureCost = {
|
|
48
54
|
feature_id: featureId,
|
|
49
55
|
tokens_used: current.tokens_used + tokensDelta,
|
|
50
56
|
estimated_cost_usd: current.estimated_cost_usd + costUsdDelta,
|
|
51
|
-
last_updated: nowIso()
|
|
57
|
+
last_updated: nowIso(),
|
|
52
58
|
};
|
|
53
59
|
await atomicWriteJson(this.port.featureCostPath(featureId), updated);
|
|
54
60
|
return updated;
|
|
@@ -60,23 +66,24 @@ export class CostTrackingService {
|
|
|
60
66
|
policy.budget && typeof policy.budget === 'object' ? policy.budget : {}
|
|
61
67
|
) as BudgetPolicy;
|
|
62
68
|
|
|
63
|
-
const limitUsd =
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
: 0.8;
|
|
69
|
+
const limitUsd =
|
|
70
|
+
typeof budgetPolicy.per_feature_limit_usd === 'number'
|
|
71
|
+
? budgetPolicy.per_feature_limit_usd
|
|
72
|
+
: Infinity;
|
|
73
|
+
const alertThreshold =
|
|
74
|
+
typeof budgetPolicy.alert_threshold === 'number' ? budgetPolicy.alert_threshold : 0.8;
|
|
69
75
|
|
|
70
76
|
const cost = await this.getFeatureCost(featureId);
|
|
71
77
|
const overBudget = Number.isFinite(limitUsd) && cost.estimated_cost_usd >= limitUsd;
|
|
72
|
-
const alertThresholdReached =
|
|
78
|
+
const alertThresholdReached =
|
|
79
|
+
Number.isFinite(limitUsd) && cost.estimated_cost_usd >= limitUsd * alertThreshold;
|
|
73
80
|
|
|
74
81
|
return {
|
|
75
82
|
over_budget: overBudget,
|
|
76
83
|
alert_threshold_reached: alertThresholdReached,
|
|
77
84
|
current_cost_usd: cost.estimated_cost_usd,
|
|
78
85
|
limit_usd: Number.isFinite(limitUsd) ? limitUsd : -1,
|
|
79
|
-
alert_threshold: alertThreshold
|
|
86
|
+
alert_threshold: alertThreshold,
|
|
80
87
|
};
|
|
81
88
|
}
|
|
82
89
|
}
|