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
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { ensureDir, pathExists, readJson, atomicWriteJson, atomicWriteFile, withFileLock, nowIso, stableHash } from './fs.js';
|
|
3
|
+
import { ensureDir, pathExists, readJson, atomicWriteJson, atomicWriteFile, withFileLock, nowIso, stableHash, } from './fs.js';
|
|
4
4
|
import { SchemaRegistry, loadAndValidateYaml } from './schemas.js';
|
|
5
5
|
import { normalizeRepoPath } from './path-rules.js';
|
|
6
6
|
import { parseFrontMatter, buildFrontMatter } from './frontmatter.js';
|
|
7
7
|
import { runGit, runCommand } from './git.js';
|
|
8
8
|
import { ERROR_CODES } from './error-codes.js';
|
|
9
9
|
import { ok, fail, withSuggestedActions } from './response.js';
|
|
10
|
-
import { ALLOWED_ACTORS, DEFAULT_CLUSTER, DEFAULT_ROLE_STATUS, GATE_RESULT, STATUS, TOOLS } from './constants.js';
|
|
10
|
+
import { ALLOWED_ACTORS, DEFAULT_CLUSTER, DEFAULT_ROLE_STATUS, GATE_RESULT, STATUS, TOOLS, } from './constants.js';
|
|
11
11
|
import { AopPathLayout, ensureAopRuntimeLayout } from './path-layout.js';
|
|
12
|
-
import { applyWorktreeSymlinks, formatWorkspaceHookWarning, runWorktreePostCreate } from './workspace-hooks.js';
|
|
12
|
+
import { applyWorktreeSymlinks, formatWorkspaceHookWarning, runWorktreePostCreate, } from './workspace-hooks.js';
|
|
13
13
|
import { ToolRegistryLoader } from '../mcp/tool-registry-loader.js';
|
|
14
|
-
import { ToolHandlerRegistry, ToolRouter } from '../application/tools/tool-router.js';
|
|
15
|
-
import { RunLeaseService } from '../application/services/run-lease-service.js';
|
|
14
|
+
import { ToolHandlerRegistry, ToolRouter, } from '../application/tools/tool-router.js';
|
|
15
|
+
import { RunLeaseService, } from '../application/services/run-lease-service.js';
|
|
16
16
|
import { LockService } from '../application/services/lock-service.js';
|
|
17
17
|
import { ReportingService } from '../application/services/reporting-service.js';
|
|
18
18
|
import { FeatureStateService } from '../application/services/feature-state-service.js';
|
|
@@ -23,11 +23,11 @@ import { GateService } from '../application/services/gate-service.js';
|
|
|
23
23
|
import { QaIndexService } from '../application/services/qa-index-service.js';
|
|
24
24
|
import { MergeService } from '../application/services/merge-service.js';
|
|
25
25
|
import { CollisionQueueService } from '../application/services/collision-queue-service.js';
|
|
26
|
-
import { FeatureDeletionService } from '../application/services/feature-deletion-service.js';
|
|
26
|
+
import { FeatureDeletionService, } from '../application/services/feature-deletion-service.js';
|
|
27
27
|
import { CostTrackingService } from '../application/services/cost-tracking-service.js';
|
|
28
|
-
import { PerformanceAnalyticsService } from '../application/services/performance-analytics-service.js';
|
|
28
|
+
import { PerformanceAnalyticsService, } from '../application/services/performance-analytics-service.js';
|
|
29
29
|
import { loadComposedPolicy } from '../application/services/policy-loader-service.js';
|
|
30
|
-
import { ACTIVITY_DETECTOR_SLOT, NOTIFICATION_CHANNEL_SLOT, SCM_PROVIDER_SLOT, globalAdapterRegistry } from '../application/adapters/adapter-registry.js';
|
|
30
|
+
import { ACTIVITY_DETECTOR_SLOT, NOTIFICATION_CHANNEL_SLOT, SCM_PROVIDER_SLOT, globalAdapterRegistry, } from '../application/adapters/adapter-registry.js';
|
|
31
31
|
function asArray(value) {
|
|
32
32
|
return Array.isArray(value) ? value : [];
|
|
33
33
|
}
|
|
@@ -109,7 +109,7 @@ export class AopKernel {
|
|
|
109
109
|
this.performanceAnalyticsService = new PerformanceAnalyticsService(this);
|
|
110
110
|
this.toolRouter = new ToolRouter(this.toolHandlers, (toolName) => Promise.resolve(fail(ERROR_CODES.INVALID_ARGUMENT, `Unknown tool ${toolName}`, {
|
|
111
111
|
retryable: false,
|
|
112
|
-
requires_human: true
|
|
112
|
+
requires_human: true,
|
|
113
113
|
})));
|
|
114
114
|
}
|
|
115
115
|
getRepoRoot() {
|
|
@@ -168,7 +168,7 @@ export class AopKernel {
|
|
|
168
168
|
last_heartbeat_at: at,
|
|
169
169
|
lease_expires_at: at,
|
|
170
170
|
orchestrator_epoch: 0,
|
|
171
|
-
feature_sessions: {}
|
|
171
|
+
feature_sessions: {},
|
|
172
172
|
};
|
|
173
173
|
}
|
|
174
174
|
normalizeRuntimeSessions(value, at = nowIso()) {
|
|
@@ -186,7 +186,7 @@ export class AopKernel {
|
|
|
186
186
|
featureSessions[featureId] = {
|
|
187
187
|
planner_session_id: typeof typed.planner_session_id === 'string' ? typed.planner_session_id : 'unassigned',
|
|
188
188
|
builder_session_id: typeof typed.builder_session_id === 'string' ? typed.builder_session_id : 'unassigned',
|
|
189
|
-
qa_session_id: typeof typed.qa_session_id === 'string' ? typed.qa_session_id : 'unassigned'
|
|
189
|
+
qa_session_id: typeof typed.qa_session_id === 'string' ? typed.qa_session_id : 'unassigned',
|
|
190
190
|
};
|
|
191
191
|
}
|
|
192
192
|
const epoch = typeof source.orchestrator_epoch === 'number' && Number.isFinite(source.orchestrator_epoch)
|
|
@@ -197,7 +197,9 @@ export class AopKernel {
|
|
|
197
197
|
orchestrator_session_id: typeof source.orchestrator_session_id === 'string' && source.orchestrator_session_id
|
|
198
198
|
? source.orchestrator_session_id
|
|
199
199
|
: fallback.orchestrator_session_id,
|
|
200
|
-
provider: typeof source.provider === 'string' && source.provider
|
|
200
|
+
provider: typeof source.provider === 'string' && source.provider
|
|
201
|
+
? source.provider
|
|
202
|
+
: fallback.provider,
|
|
201
203
|
model: typeof source.model === 'string' && source.model ? source.model : fallback.model,
|
|
202
204
|
provider_config_ref_hash: typeof source.provider_config_ref_hash === 'string' && source.provider_config_ref_hash
|
|
203
205
|
? source.provider_config_ref_hash
|
|
@@ -205,8 +207,12 @@ export class AopKernel {
|
|
|
205
207
|
owner_instance_id: typeof source.owner_instance_id === 'string' && source.owner_instance_id
|
|
206
208
|
? source.owner_instance_id
|
|
207
209
|
: fallback.owner_instance_id,
|
|
208
|
-
lease_id: typeof source.lease_id === 'string' && source.lease_id
|
|
209
|
-
|
|
210
|
+
lease_id: typeof source.lease_id === 'string' && source.lease_id
|
|
211
|
+
? source.lease_id
|
|
212
|
+
: fallback.lease_id,
|
|
213
|
+
started_at: typeof source.started_at === 'string' && source.started_at
|
|
214
|
+
? source.started_at
|
|
215
|
+
: fallback.started_at,
|
|
210
216
|
last_heartbeat_at: typeof source.last_heartbeat_at === 'string' && source.last_heartbeat_at
|
|
211
217
|
? source.last_heartbeat_at
|
|
212
218
|
: fallback.last_heartbeat_at,
|
|
@@ -214,14 +220,16 @@ export class AopKernel {
|
|
|
214
220
|
? source.lease_expires_at
|
|
215
221
|
: fallback.lease_expires_at,
|
|
216
222
|
orchestrator_epoch: epoch,
|
|
217
|
-
feature_sessions: featureSessions
|
|
223
|
+
feature_sessions: featureSessions,
|
|
218
224
|
};
|
|
219
225
|
}
|
|
220
226
|
normalizeIndexShape(value) {
|
|
221
227
|
const now = nowIso();
|
|
222
228
|
const source = value && typeof value === 'object' ? value : {};
|
|
223
229
|
return {
|
|
224
|
-
version: typeof source.version === 'number' && Number.isFinite(source.version)
|
|
230
|
+
version: typeof source.version === 'number' && Number.isFinite(source.version)
|
|
231
|
+
? Math.max(1, Math.floor(source.version))
|
|
232
|
+
: 1,
|
|
225
233
|
active: normalizeSet(asArray(source.active).filter((item) => typeof item === 'string')),
|
|
226
234
|
blocked: normalizeSet(asArray(source.blocked).filter((item) => typeof item === 'string')),
|
|
227
235
|
merged: normalizeSet(asArray(source.merged).filter((item) => typeof item === 'string')),
|
|
@@ -230,7 +238,7 @@ export class AopKernel {
|
|
|
230
238
|
blocked_queue: asArray(source.blocked_queue).filter((item) => item && typeof item === 'object'),
|
|
231
239
|
dep_blocked: asArray(source.dep_blocked).filter((item) => item && typeof item === 'object'),
|
|
232
240
|
updated_at: typeof source.updated_at === 'string' && source.updated_at ? source.updated_at : now,
|
|
233
|
-
runtime_sessions: this.normalizeRuntimeSessions(source.runtime_sessions, now)
|
|
241
|
+
runtime_sessions: this.normalizeRuntimeSessions(source.runtime_sessions, now),
|
|
234
242
|
};
|
|
235
243
|
}
|
|
236
244
|
isRunLeaseFresh(runtimeSessions) {
|
|
@@ -240,12 +248,23 @@ export class AopKernel {
|
|
|
240
248
|
}
|
|
241
249
|
return expiry > Date.now();
|
|
242
250
|
}
|
|
251
|
+
async resolveDefaultConfigPath(fileName) {
|
|
252
|
+
const primary = path.join(this.pathLayout.orchestratorRoot, fileName);
|
|
253
|
+
if (await pathExists(primary)) {
|
|
254
|
+
return primary;
|
|
255
|
+
}
|
|
256
|
+
const legacy = path.join(this.pathLayout.legacyOrchestratorRoot, fileName);
|
|
257
|
+
if (await pathExists(legacy)) {
|
|
258
|
+
return legacy;
|
|
259
|
+
}
|
|
260
|
+
return primary;
|
|
261
|
+
}
|
|
243
262
|
async load() {
|
|
244
263
|
await ensureAopRuntimeLayout(this.pathLayout);
|
|
245
|
-
const gatesPath = this.configOverrides.gatesPath ??
|
|
246
|
-
const policyPath = this.configOverrides.policyPath ??
|
|
247
|
-
const agentsPath = this.configOverrides.agentsPath ??
|
|
248
|
-
const adaptersPath = this.configOverrides.adaptersPath ??
|
|
264
|
+
const gatesPath = this.configOverrides.gatesPath ?? (await this.resolveDefaultConfigPath('gates.yaml'));
|
|
265
|
+
const policyPath = this.configOverrides.policyPath ?? (await this.resolveDefaultConfigPath('policy.yaml'));
|
|
266
|
+
const agentsPath = this.configOverrides.agentsPath ?? (await this.resolveDefaultConfigPath('agents.yaml'));
|
|
267
|
+
const adaptersPath = this.configOverrides.adaptersPath ?? (await this.resolveDefaultConfigPath('adapters.yaml'));
|
|
249
268
|
const gates = await loadAndValidateYaml(this.schemaRegistry, 'gates.schema.json', gatesPath);
|
|
250
269
|
if (!gates.validation.valid) {
|
|
251
270
|
throw new Error(`invalid_gates_yaml:${JSON.stringify(gates.validation.errors)}`);
|
|
@@ -356,38 +375,38 @@ export class AopKernel {
|
|
|
356
375
|
if (text.startsWith('path_out_of_bounds')) {
|
|
357
376
|
return fail(ERROR_CODES.PATH_OUT_OF_BOUNDS, 'Path escapes repository root', {
|
|
358
377
|
retryable: false,
|
|
359
|
-
requires_human: true
|
|
378
|
+
requires_human: true,
|
|
360
379
|
});
|
|
361
380
|
}
|
|
362
381
|
if (text.startsWith('lock_timeout:')) {
|
|
363
382
|
return fail(ERROR_CODES.LOCK_CONFLICT, 'Timed out waiting for lock', {
|
|
364
383
|
retryable: true,
|
|
365
|
-
requires_human: false
|
|
384
|
+
requires_human: false,
|
|
366
385
|
});
|
|
367
386
|
}
|
|
368
387
|
if (text.startsWith('unknown_gate_profile_or_mode:')) {
|
|
369
388
|
return fail(ERROR_CODES.UNKNOWN_GATE_PROFILE_OR_MODE, 'Unknown gate profile or mode', {
|
|
370
389
|
value: text.split(':')[1],
|
|
371
390
|
retryable: false,
|
|
372
|
-
requires_human: true
|
|
391
|
+
requires_human: true,
|
|
373
392
|
});
|
|
374
393
|
}
|
|
375
394
|
if (text.startsWith('unsupported_parser:')) {
|
|
376
395
|
return fail(ERROR_CODES.UNSUPPORTED_PARSER, 'Gate parser type is not supported', {
|
|
377
396
|
parser: text.split(':')[1],
|
|
378
397
|
retryable: false,
|
|
379
|
-
requires_human: true
|
|
398
|
+
requires_human: true,
|
|
380
399
|
});
|
|
381
400
|
}
|
|
382
401
|
if (text.includes('qa_index_version_conflict')) {
|
|
383
402
|
return fail(ERROR_CODES.QA_INDEX_VERSION_CONFLICT, 'QA index expected_version did not match current version', {
|
|
384
403
|
retryable: true,
|
|
385
|
-
requires_human: false
|
|
404
|
+
requires_human: false,
|
|
386
405
|
});
|
|
387
406
|
}
|
|
388
407
|
return fail(ERROR_CODES.INTERNAL_ERROR, text, {
|
|
389
408
|
retryable: false,
|
|
390
|
-
requires_human: true
|
|
409
|
+
requires_human: true,
|
|
391
410
|
});
|
|
392
411
|
}
|
|
393
412
|
async dispatchTool(toolName, args, context) {
|
|
@@ -486,19 +505,19 @@ export class AopKernel {
|
|
|
486
505
|
plan: GATE_RESULT.NA,
|
|
487
506
|
fast: GATE_RESULT.NA,
|
|
488
507
|
full: GATE_RESULT.NA,
|
|
489
|
-
merge: GATE_RESULT.NA
|
|
508
|
+
merge: GATE_RESULT.NA,
|
|
490
509
|
},
|
|
491
510
|
locks: {
|
|
492
|
-
held: []
|
|
511
|
+
held: [],
|
|
493
512
|
},
|
|
494
513
|
collisions: {
|
|
495
514
|
files: [],
|
|
496
515
|
areas: [],
|
|
497
|
-
contracts: []
|
|
516
|
+
contracts: [],
|
|
498
517
|
},
|
|
499
518
|
cluster: { ...DEFAULT_CLUSTER },
|
|
500
519
|
role_status: { ...DEFAULT_ROLE_STATUS },
|
|
501
|
-
last_updated: nowIso()
|
|
520
|
+
last_updated: nowIso(),
|
|
502
521
|
};
|
|
503
522
|
}
|
|
504
523
|
async readState(featureId) {
|
|
@@ -508,7 +527,7 @@ export class AopKernel {
|
|
|
508
527
|
return {
|
|
509
528
|
frontMatter: parsed.frontMatter,
|
|
510
529
|
body: parsed.body,
|
|
511
|
-
raw
|
|
530
|
+
raw,
|
|
512
531
|
};
|
|
513
532
|
}
|
|
514
533
|
async writeState(featureId, frontMatter, body = '') {
|
|
@@ -518,8 +537,8 @@ export class AopKernel {
|
|
|
518
537
|
normalizedResponse: fail(ERROR_CODES.STATE_VALIDATION_FAILED, 'state.md front matter failed schema validation', {
|
|
519
538
|
errors: validation.errors,
|
|
520
539
|
retryable: false,
|
|
521
|
-
requires_human: true
|
|
522
|
-
})
|
|
540
|
+
requires_human: true,
|
|
541
|
+
}),
|
|
523
542
|
};
|
|
524
543
|
}
|
|
525
544
|
const markdown = buildFrontMatter(frontMatter, body);
|
|
@@ -527,12 +546,12 @@ export class AopKernel {
|
|
|
527
546
|
}
|
|
528
547
|
async withFeatureLock(featureId, operation) {
|
|
529
548
|
return await withFileLock(this.featureLockPath(featureId), operation, {
|
|
530
|
-
timeoutMs: 30_000
|
|
549
|
+
timeoutMs: 30_000,
|
|
531
550
|
});
|
|
532
551
|
}
|
|
533
552
|
async withIndexLock(operation) {
|
|
534
553
|
return await withFileLock(this.indexLockPath, operation, {
|
|
535
|
-
timeoutMs: 30_000
|
|
554
|
+
timeoutMs: 30_000,
|
|
536
555
|
});
|
|
537
556
|
}
|
|
538
557
|
async readIndex() {
|
|
@@ -552,8 +571,8 @@ export class AopKernel {
|
|
|
552
571
|
normalizedResponse: fail(ERROR_CODES.INDEX_VALIDATION_FAILED, 'index.json failed schema validation', {
|
|
553
572
|
errors: validation.errors,
|
|
554
573
|
retryable: false,
|
|
555
|
-
requires_human: true
|
|
556
|
-
})
|
|
574
|
+
requires_human: true,
|
|
575
|
+
}),
|
|
557
576
|
};
|
|
558
577
|
}
|
|
559
578
|
await atomicWriteJson(this.indexPath, normalized);
|
|
@@ -658,8 +677,8 @@ export class AopKernel {
|
|
|
658
677
|
feature_id: featureId,
|
|
659
678
|
branch,
|
|
660
679
|
worktree_path_abs: worktree,
|
|
661
|
-
existed: true
|
|
662
|
-
}
|
|
680
|
+
existed: true,
|
|
681
|
+
},
|
|
663
682
|
};
|
|
664
683
|
}
|
|
665
684
|
const baseBranch = this.policy.worktree.base_branch;
|
|
@@ -674,11 +693,11 @@ export class AopKernel {
|
|
|
674
693
|
feature_id: featureId,
|
|
675
694
|
stderr: branchCreate.stderr,
|
|
676
695
|
retryable: false,
|
|
677
|
-
requires_human: true
|
|
696
|
+
requires_human: true,
|
|
678
697
|
}, {
|
|
679
698
|
command: ['git', 'branch', branch, baseRef],
|
|
680
|
-
exit_code: branchCreate.code
|
|
681
|
-
})
|
|
699
|
+
exit_code: branchCreate.code,
|
|
700
|
+
}),
|
|
682
701
|
};
|
|
683
702
|
}
|
|
684
703
|
}
|
|
@@ -689,11 +708,11 @@ export class AopKernel {
|
|
|
689
708
|
feature_id: featureId,
|
|
690
709
|
stderr: addWorktree.stderr,
|
|
691
710
|
retryable: false,
|
|
692
|
-
requires_human: true
|
|
711
|
+
requires_human: true,
|
|
693
712
|
}, {
|
|
694
713
|
command: ['git', 'worktree', 'add', worktree, branch],
|
|
695
|
-
exit_code: addWorktree.code
|
|
696
|
-
})
|
|
714
|
+
exit_code: addWorktree.code,
|
|
715
|
+
}),
|
|
697
716
|
};
|
|
698
717
|
}
|
|
699
718
|
const worktreeConfig = this.policy.worktree;
|
|
@@ -716,8 +735,8 @@ export class AopKernel {
|
|
|
716
735
|
feature_id: featureId,
|
|
717
736
|
branch,
|
|
718
737
|
worktree_path_abs: worktree,
|
|
719
|
-
existed: false
|
|
720
|
-
}
|
|
738
|
+
existed: false,
|
|
739
|
+
},
|
|
721
740
|
};
|
|
722
741
|
}
|
|
723
742
|
async loadAcceptedPlan(featureId) {
|
|
@@ -732,28 +751,31 @@ export class AopKernel {
|
|
|
732
751
|
async repoStatus(featureId) {
|
|
733
752
|
const worktree = this.worktreePath(featureId);
|
|
734
753
|
const status = await runGit(this.repoRoot, ['status', '--porcelain'], { cwd: worktree });
|
|
735
|
-
const branch = await runGit(this.repoRoot, ['rev-parse', '--abbrev-ref', 'HEAD'], {
|
|
754
|
+
const branch = await runGit(this.repoRoot, ['rev-parse', '--abbrev-ref', 'HEAD'], {
|
|
755
|
+
cwd: worktree,
|
|
756
|
+
});
|
|
736
757
|
return {
|
|
737
758
|
data: {
|
|
738
759
|
feature_id: featureId,
|
|
739
760
|
branch: branch.stdout.trim(),
|
|
740
|
-
status_porcelain: status.stdout.trim().split('\n').filter(Boolean)
|
|
741
|
-
}
|
|
761
|
+
status_porcelain: status.stdout.trim().split('\n').filter(Boolean),
|
|
762
|
+
},
|
|
742
763
|
};
|
|
743
764
|
}
|
|
744
765
|
async repoDiff(featureId, options = []) {
|
|
745
766
|
const safeOptions = asArray(options).filter((option) => typeof option === 'string' && option.startsWith('--'));
|
|
746
|
-
const diff = await runGit(this.repoRoot, ['diff', ...safeOptions], {
|
|
767
|
+
const diff = await runGit(this.repoRoot, ['diff', ...safeOptions], {
|
|
768
|
+
cwd: this.worktreePath(featureId),
|
|
769
|
+
});
|
|
747
770
|
return {
|
|
748
771
|
data: {
|
|
749
772
|
feature_id: featureId,
|
|
750
|
-
diff: diff.stdout
|
|
751
|
-
}
|
|
773
|
+
diff: diff.stdout,
|
|
774
|
+
},
|
|
752
775
|
};
|
|
753
776
|
}
|
|
754
777
|
async repoReadFile(featureId, filePath) {
|
|
755
|
-
const normalized = await normalizeRepoPath(this.repoRoot, path.join(this.worktreePath(featureId), filePath), this.policy.path_rules.allow_symlink_traversal)
|
|
756
|
-
.then((relative) => normalizeFromWorktree(this.worktreePath(featureId), this.repoRoot, relative));
|
|
778
|
+
const normalized = await normalizeRepoPath(this.repoRoot, path.join(this.worktreePath(featureId), filePath), this.policy.path_rules.allow_symlink_traversal).then((relative) => normalizeFromWorktree(this.worktreePath(featureId), this.repoRoot, relative));
|
|
757
779
|
const absolute = path.join(this.repoRoot, normalized);
|
|
758
780
|
const exists = await pathExists(absolute);
|
|
759
781
|
if (!exists) {
|
|
@@ -761,8 +783,8 @@ export class AopKernel {
|
|
|
761
783
|
normalizedResponse: fail(ERROR_CODES.FILE_NOT_FOUND, 'File not found', {
|
|
762
784
|
path: normalized,
|
|
763
785
|
retryable: false,
|
|
764
|
-
requires_human: false
|
|
765
|
-
})
|
|
786
|
+
requires_human: false,
|
|
787
|
+
}),
|
|
766
788
|
};
|
|
767
789
|
}
|
|
768
790
|
const content = await fs.readFile(absolute, 'utf8');
|
|
@@ -770,23 +792,23 @@ export class AopKernel {
|
|
|
770
792
|
data: {
|
|
771
793
|
feature_id: featureId,
|
|
772
794
|
path: normalized,
|
|
773
|
-
content
|
|
774
|
-
}
|
|
795
|
+
content,
|
|
796
|
+
},
|
|
775
797
|
};
|
|
776
798
|
}
|
|
777
799
|
async repoSearch(featureId, query) {
|
|
778
800
|
const worktree = this.worktreePath(featureId);
|
|
779
801
|
const rgResult = await runCommand('rg', ['-n', '--no-heading', query, '.'], {
|
|
780
802
|
cwd: worktree,
|
|
781
|
-
timeoutMs: 30_000
|
|
803
|
+
timeoutMs: 30_000,
|
|
782
804
|
});
|
|
783
805
|
if (rgResult.code === 127) {
|
|
784
806
|
throw {
|
|
785
807
|
normalizedResponse: fail(ERROR_CODES.GIT_FAILURE, 'ripgrep (rg) not found - required for search functionality', {
|
|
786
808
|
stderr: rgResult.stderr,
|
|
787
809
|
retryable: false,
|
|
788
|
-
requires_human: true
|
|
789
|
-
})
|
|
810
|
+
requires_human: true,
|
|
811
|
+
}),
|
|
790
812
|
};
|
|
791
813
|
}
|
|
792
814
|
if (rgResult.code !== 0 && rgResult.code !== 1) {
|
|
@@ -794,8 +816,8 @@ export class AopKernel {
|
|
|
794
816
|
normalizedResponse: fail(ERROR_CODES.GIT_FAILURE, 'Search failed', {
|
|
795
817
|
stderr: rgResult.stderr,
|
|
796
818
|
retryable: true,
|
|
797
|
-
requires_human: false
|
|
798
|
-
})
|
|
819
|
+
requires_human: false,
|
|
820
|
+
}),
|
|
799
821
|
};
|
|
800
822
|
}
|
|
801
823
|
const matches = rgResult.stdout
|
|
@@ -811,30 +833,37 @@ export class AopKernel {
|
|
|
811
833
|
return {
|
|
812
834
|
path: line.slice(0, firstColon),
|
|
813
835
|
line: Number(line.slice(firstColon + 1, secondColon)),
|
|
814
|
-
snippet: line.slice(secondColon + 1)
|
|
836
|
+
snippet: line.slice(secondColon + 1),
|
|
815
837
|
};
|
|
816
838
|
});
|
|
817
839
|
return {
|
|
818
840
|
data: {
|
|
819
841
|
feature_id: featureId,
|
|
820
842
|
query,
|
|
821
|
-
matches
|
|
822
|
-
}
|
|
843
|
+
matches,
|
|
844
|
+
},
|
|
823
845
|
};
|
|
824
846
|
}
|
|
825
847
|
async repoDiffBundle(featureId) {
|
|
826
|
-
const stat = await runGit(this.repoRoot, ['diff', '--stat'], {
|
|
848
|
+
const stat = await runGit(this.repoRoot, ['diff', '--stat'], {
|
|
849
|
+
cwd: this.worktreePath(featureId),
|
|
850
|
+
});
|
|
827
851
|
const full = await runGit(this.repoRoot, ['diff'], { cwd: this.worktreePath(featureId) });
|
|
828
|
-
const names = await runGit(this.repoRoot, ['diff', '--name-only'], {
|
|
852
|
+
const names = await runGit(this.repoRoot, ['diff', '--name-only'], {
|
|
853
|
+
cwd: this.worktreePath(featureId),
|
|
854
|
+
});
|
|
829
855
|
const latest = await this.evidenceLatest(featureId);
|
|
830
856
|
return {
|
|
831
857
|
data: {
|
|
832
858
|
feature_id: featureId,
|
|
833
859
|
diff_stat: stat.stdout,
|
|
834
860
|
diff: full.stdout,
|
|
835
|
-
touched_files: names.stdout
|
|
836
|
-
|
|
837
|
-
|
|
861
|
+
touched_files: names.stdout
|
|
862
|
+
.split('\n')
|
|
863
|
+
.map((x) => x.trim())
|
|
864
|
+
.filter(Boolean),
|
|
865
|
+
last_gate_summary: latest.data?.latest ?? null,
|
|
866
|
+
},
|
|
838
867
|
};
|
|
839
868
|
}
|
|
840
869
|
async gatesList(profileName = null) {
|
|
@@ -878,7 +907,7 @@ export class AopKernel {
|
|
|
878
907
|
dryRun: dryRun ?? undefined,
|
|
879
908
|
confirm: confirm ?? undefined,
|
|
880
909
|
removeWorktree: removeWorktree ?? undefined,
|
|
881
|
-
removeBranch: removeBranch ?? undefined
|
|
910
|
+
removeBranch: removeBranch ?? undefined,
|
|
882
911
|
});
|
|
883
912
|
}
|
|
884
913
|
async renewLeases(featureIds) {
|
|
@@ -906,15 +935,27 @@ export class AopKernel {
|
|
|
906
935
|
}
|
|
907
936
|
async featureSendMessage(featureId, message) {
|
|
908
937
|
if (!featureId) {
|
|
909
|
-
throw {
|
|
938
|
+
throw {
|
|
939
|
+
normalizedResponse: fail(ERROR_CODES.INVALID_ARGUMENT, 'feature_id is required', {
|
|
940
|
+
retryable: false,
|
|
941
|
+
requires_human: false,
|
|
942
|
+
}),
|
|
943
|
+
};
|
|
910
944
|
}
|
|
911
945
|
if (!message) {
|
|
912
|
-
throw {
|
|
946
|
+
throw {
|
|
947
|
+
normalizedResponse: fail(ERROR_CODES.INVALID_ARGUMENT, 'message is required and must not be empty', { retryable: false, requires_human: false }),
|
|
948
|
+
};
|
|
913
949
|
}
|
|
914
950
|
const runtimeSessions = await this.getRuntimeSessions();
|
|
915
951
|
const featureSession = runtimeSessions.feature_sessions?.[featureId];
|
|
916
952
|
if (!featureSession) {
|
|
917
|
-
throw {
|
|
953
|
+
throw {
|
|
954
|
+
normalizedResponse: {
|
|
955
|
+
ok: false,
|
|
956
|
+
error: { code: 'session_not_found', message: 'No active session cluster for feature' },
|
|
957
|
+
},
|
|
958
|
+
};
|
|
918
959
|
}
|
|
919
960
|
const state = await this.readState(featureId);
|
|
920
961
|
const status = typeof state.frontMatter.status === 'string' ? state.frontMatter.status : '';
|
|
@@ -950,7 +991,12 @@ export class AopKernel {
|
|
|
950
991
|
targetSessionId = runtimeSessions.orchestrator_session_id;
|
|
951
992
|
}
|
|
952
993
|
if (!this.provider?.sendMessage) {
|
|
953
|
-
throw {
|
|
994
|
+
throw {
|
|
995
|
+
normalizedResponse: {
|
|
996
|
+
ok: false,
|
|
997
|
+
error: { code: 'provider_unsupported', message: 'Provider does not support sendMessage' },
|
|
998
|
+
},
|
|
999
|
+
};
|
|
954
1000
|
}
|
|
955
1001
|
await this.waitForSessionToBecomeActive(targetSessionId);
|
|
956
1002
|
await this.provider.sendMessage(targetSessionId, message);
|
|
@@ -959,7 +1005,7 @@ export class AopKernel {
|
|
|
959
1005
|
session_id: targetSessionId,
|
|
960
1006
|
target_role: targetRole,
|
|
961
1007
|
status,
|
|
962
|
-
delivered: true
|
|
1008
|
+
delivered: true,
|
|
963
1009
|
};
|
|
964
1010
|
}
|
|
965
1011
|
async costRecord(featureId, tokensDelta, costUsdDelta) {
|
|
@@ -983,7 +1029,7 @@ export class AopKernel {
|
|
|
983
1029
|
retry_count: typeof args.retry_count === 'number' ? args.retry_count : 0,
|
|
984
1030
|
duration_ms: typeof args.duration_ms === 'number' ? args.duration_ms : 0,
|
|
985
1031
|
cost_usd: typeof args.cost_usd === 'number' ? args.cost_usd : 0,
|
|
986
|
-
recorded_at: nowIso()
|
|
1032
|
+
recorded_at: nowIso(),
|
|
987
1033
|
};
|
|
988
1034
|
const snapshot = await this.performanceAnalyticsService.recordOutcome(outcome);
|
|
989
1035
|
return { ok: true, data: { total_outcomes: snapshot.outcomes.length } };
|
|
@@ -992,7 +1038,14 @@ export class AopKernel {
|
|
|
992
1038
|
if (provider || model) {
|
|
993
1039
|
const stats = await this.performanceAnalyticsService.getProviderStats(provider ?? undefined, model ?? undefined);
|
|
994
1040
|
const snapshot = await this.performanceAnalyticsService.getAnalytics();
|
|
995
|
-
return {
|
|
1041
|
+
return {
|
|
1042
|
+
ok: true,
|
|
1043
|
+
data: {
|
|
1044
|
+
outcomes: snapshot.outcomes,
|
|
1045
|
+
aggregates: stats,
|
|
1046
|
+
generated_at: snapshot.generated_at,
|
|
1047
|
+
},
|
|
1048
|
+
};
|
|
996
1049
|
}
|
|
997
1050
|
const snapshot = await this.performanceAnalyticsService.getAnalytics();
|
|
998
1051
|
return { ok: true, data: snapshot };
|