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
|
@@ -4,7 +4,12 @@ import path from 'node:path';
|
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
5
|
import { pathExists } from '../core/fs.js';
|
|
6
6
|
import { MCP_PROTOCOL_PIN, REQUIRED_MCP_TRANSPORTS } from './protocol-contract.js';
|
|
7
|
-
import type {
|
|
7
|
+
import type {
|
|
8
|
+
LoadedToolRegistry,
|
|
9
|
+
ProtocolContract,
|
|
10
|
+
ToolCatalog,
|
|
11
|
+
ToolCatalogEntry,
|
|
12
|
+
} from './runtime-types.js';
|
|
8
13
|
|
|
9
14
|
const MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));
|
|
10
15
|
|
|
@@ -113,7 +118,7 @@ export class ToolRegistryLoader {
|
|
|
113
118
|
catalog,
|
|
114
119
|
protocol,
|
|
115
120
|
toolsByName,
|
|
116
|
-
toolsByHandlerId
|
|
121
|
+
toolsByHandlerId,
|
|
117
122
|
};
|
|
118
123
|
}
|
|
119
124
|
|
|
@@ -167,5 +172,4 @@ export class ToolRegistryLoader {
|
|
|
167
172
|
|
|
168
173
|
return parsed;
|
|
169
174
|
}
|
|
170
|
-
|
|
171
175
|
}
|
|
@@ -56,7 +56,8 @@ function emitToolLog(params: {
|
|
|
56
56
|
latencyMs: number;
|
|
57
57
|
response: ToolResponse;
|
|
58
58
|
}): void {
|
|
59
|
-
const operationId =
|
|
59
|
+
const operationId =
|
|
60
|
+
typeof params.args.operation_id === 'string' ? params.args.operation_id : null;
|
|
60
61
|
const featureId = typeof params.args.feature_id === 'string' ? params.args.feature_id : null;
|
|
61
62
|
const errorCode = isFailResponse(params.response) ? params.response.error.code : null;
|
|
62
63
|
const payload = {
|
|
@@ -67,7 +68,7 @@ function emitToolLog(params: {
|
|
|
67
68
|
actor_type: params.claims.actor_type,
|
|
68
69
|
latency_ms: params.latencyMs,
|
|
69
70
|
result: params.response.ok ? 'ok' : 'error',
|
|
70
|
-
error_code: errorCode
|
|
71
|
+
error_code: errorCode,
|
|
71
72
|
};
|
|
72
73
|
|
|
73
74
|
process.stderr.write(`${JSON.stringify(payload)}\n`);
|
|
@@ -103,7 +104,9 @@ export class ToolRuntime {
|
|
|
103
104
|
|
|
104
105
|
async listTools(): Promise<ToolDescriptor[]> {
|
|
105
106
|
const descriptors: ToolDescriptor[] = [];
|
|
106
|
-
const sorted = [...this.registry.toolsByName.values()].sort((a, b) =>
|
|
107
|
+
const sorted = [...this.registry.toolsByName.values()].sort((a, b) =>
|
|
108
|
+
a.name.localeCompare(b.name),
|
|
109
|
+
);
|
|
107
110
|
|
|
108
111
|
for (const tool of sorted) {
|
|
109
112
|
descriptors.push({
|
|
@@ -112,14 +115,18 @@ export class ToolRuntime {
|
|
|
112
115
|
input_schema: await this.loader.readSchemaByRef(tool.input_schema_ref),
|
|
113
116
|
output_schema: await this.loader.readSchemaByRef(tool.output_schema_ref),
|
|
114
117
|
mutating: tool.mutating,
|
|
115
|
-
requires_operation_id: tool.requires_operation_id
|
|
118
|
+
requires_operation_id: tool.requires_operation_id,
|
|
116
119
|
});
|
|
117
120
|
}
|
|
118
121
|
|
|
119
122
|
return descriptors;
|
|
120
123
|
}
|
|
121
124
|
|
|
122
|
-
async callTool(
|
|
125
|
+
async callTool(
|
|
126
|
+
toolName: string,
|
|
127
|
+
args: Record<string, unknown>,
|
|
128
|
+
claims: VerifiedActorClaims,
|
|
129
|
+
): Promise<ToolResponse> {
|
|
123
130
|
const started = Date.now();
|
|
124
131
|
const safeArgs = { ...(args ?? {}) };
|
|
125
132
|
const tool = this.lookupTool(toolName);
|
|
@@ -148,7 +155,11 @@ export class ToolRuntime {
|
|
|
148
155
|
}
|
|
149
156
|
|
|
150
157
|
const executionResponse = await this.executor.execute(tool, safeArgs, claims);
|
|
151
|
-
const outputValidationResult = await this.validateExecutionResponse(
|
|
158
|
+
const outputValidationResult = await this.validateExecutionResponse(
|
|
159
|
+
tool,
|
|
160
|
+
toolName,
|
|
161
|
+
executionResponse,
|
|
162
|
+
);
|
|
152
163
|
if (outputValidationResult) {
|
|
153
164
|
return this.finalize(started, claims, toolName, safeArgs, outputValidationResult);
|
|
154
165
|
}
|
|
@@ -159,7 +170,7 @@ export class ToolRuntime {
|
|
|
159
170
|
idempotencyResolution.operationId,
|
|
160
171
|
toolName,
|
|
161
172
|
idempotencyResolution.requestHash,
|
|
162
|
-
executionResponse
|
|
173
|
+
executionResponse,
|
|
163
174
|
);
|
|
164
175
|
}
|
|
165
176
|
|
|
@@ -173,13 +184,13 @@ export class ToolRuntime {
|
|
|
173
184
|
private unknownToolResponse(toolName: string): ToolResponse {
|
|
174
185
|
return fail(ERROR_CODES.INVALID_ARGUMENT, `Unknown tool ${toolName}`, {
|
|
175
186
|
retryable: false,
|
|
176
|
-
requires_human: true
|
|
187
|
+
requires_human: true,
|
|
177
188
|
});
|
|
178
189
|
}
|
|
179
190
|
|
|
180
191
|
private authorizeFeatureScope(
|
|
181
192
|
claims: VerifiedActorClaims,
|
|
182
|
-
args: Record<string, unknown
|
|
193
|
+
args: Record<string, unknown>,
|
|
183
194
|
): ToolResponse | null {
|
|
184
195
|
if (featureScopeAllows(claims, args)) {
|
|
185
196
|
return null;
|
|
@@ -188,7 +199,7 @@ export class ToolRuntime {
|
|
|
188
199
|
retryable: false,
|
|
189
200
|
requires_human: true,
|
|
190
201
|
feature_scope: claims.feature_scope,
|
|
191
|
-
feature_id: args.feature_id
|
|
202
|
+
feature_id: args.feature_id,
|
|
192
203
|
});
|
|
193
204
|
}
|
|
194
205
|
|
|
@@ -196,18 +207,22 @@ export class ToolRuntime {
|
|
|
196
207
|
if (this.authorizer.isAuthorized(claims.actor_type, toolName)) {
|
|
197
208
|
return null;
|
|
198
209
|
}
|
|
199
|
-
return fail(
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
210
|
+
return fail(
|
|
211
|
+
ERROR_CODES.FORBIDDEN_TOOL_FOR_ROLE,
|
|
212
|
+
`Tool ${toolName} is not allowed for role ${claims.actor_type}`,
|
|
213
|
+
{
|
|
214
|
+
retryable: false,
|
|
215
|
+
requires_human: true,
|
|
216
|
+
actor_type: claims.actor_type,
|
|
217
|
+
tool_name: toolName,
|
|
218
|
+
},
|
|
219
|
+
);
|
|
205
220
|
}
|
|
206
221
|
|
|
207
222
|
private async validateInput(
|
|
208
223
|
tool: ToolCatalogEntry,
|
|
209
224
|
toolName: string,
|
|
210
|
-
args: Record<string, unknown
|
|
225
|
+
args: Record<string, unknown>,
|
|
211
226
|
): Promise<ToolResponse | null> {
|
|
212
227
|
const inputValidation = await this.validator.validateInput(tool, args);
|
|
213
228
|
if (inputValidation.valid) {
|
|
@@ -217,14 +232,14 @@ export class ToolRuntime {
|
|
|
217
232
|
retryable: false,
|
|
218
233
|
requires_human: true,
|
|
219
234
|
errors: inputValidation.errors,
|
|
220
|
-
tool_name: toolName
|
|
235
|
+
tool_name: toolName,
|
|
221
236
|
});
|
|
222
237
|
}
|
|
223
238
|
|
|
224
239
|
private async validateExecutionResponse(
|
|
225
240
|
tool: ToolCatalogEntry,
|
|
226
241
|
toolName: string,
|
|
227
|
-
response: ToolResponse
|
|
242
|
+
response: ToolResponse,
|
|
228
243
|
): Promise<ToolResponse | null> {
|
|
229
244
|
if (response.ok) {
|
|
230
245
|
const outputValidation = await this.validator.validateOutput(tool, response.data);
|
|
@@ -235,7 +250,7 @@ export class ToolRuntime {
|
|
|
235
250
|
retryable: false,
|
|
236
251
|
requires_human: true,
|
|
237
252
|
errors: outputValidation.errors,
|
|
238
|
-
tool_name: toolName
|
|
253
|
+
tool_name: toolName,
|
|
239
254
|
});
|
|
240
255
|
}
|
|
241
256
|
|
|
@@ -247,7 +262,7 @@ export class ToolRuntime {
|
|
|
247
262
|
retryable: false,
|
|
248
263
|
requires_human: true,
|
|
249
264
|
errors: envelope.errors,
|
|
250
|
-
tool_name: toolName
|
|
265
|
+
tool_name: toolName,
|
|
251
266
|
});
|
|
252
267
|
}
|
|
253
268
|
|
|
@@ -256,14 +271,14 @@ export class ToolRuntime {
|
|
|
256
271
|
claims: VerifiedActorClaims,
|
|
257
272
|
toolName: string,
|
|
258
273
|
args: Record<string, unknown>,
|
|
259
|
-
response: ToolResponse
|
|
274
|
+
response: ToolResponse,
|
|
260
275
|
): ToolResponse {
|
|
261
276
|
emitToolLog({
|
|
262
277
|
claims,
|
|
263
278
|
toolName,
|
|
264
279
|
args,
|
|
265
280
|
latencyMs: Date.now() - started,
|
|
266
|
-
response
|
|
281
|
+
response,
|
|
267
282
|
});
|
|
268
283
|
return response;
|
|
269
284
|
}
|
|
@@ -272,8 +287,12 @@ export class ToolRuntime {
|
|
|
272
287
|
tool: ToolCatalogEntry,
|
|
273
288
|
toolName: string,
|
|
274
289
|
args: Record<string, unknown>,
|
|
275
|
-
claims: VerifiedActorClaims
|
|
276
|
-
): Promise<{
|
|
290
|
+
claims: VerifiedActorClaims,
|
|
291
|
+
): Promise<{
|
|
292
|
+
operationId: string | null;
|
|
293
|
+
requestHash: string | null;
|
|
294
|
+
result: ToolResponse | null;
|
|
295
|
+
}> {
|
|
277
296
|
if (!tool.mutating) {
|
|
278
297
|
return { operationId: null, requestHash: null, result: null };
|
|
279
298
|
}
|
|
@@ -283,22 +302,30 @@ export class ToolRuntime {
|
|
|
283
302
|
return {
|
|
284
303
|
operationId: null,
|
|
285
304
|
requestHash: null,
|
|
286
|
-
result: fail(
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
305
|
+
result: fail(
|
|
306
|
+
ERROR_CODES.OPERATION_ID_REQUIRED,
|
|
307
|
+
'operation_id is required for mutating tools',
|
|
308
|
+
{
|
|
309
|
+
retryable: false,
|
|
310
|
+
requires_human: true,
|
|
311
|
+
tool_name: toolName,
|
|
312
|
+
},
|
|
313
|
+
),
|
|
291
314
|
};
|
|
292
315
|
}
|
|
293
316
|
if (!operationId) {
|
|
294
317
|
return {
|
|
295
318
|
operationId: null,
|
|
296
319
|
requestHash: null,
|
|
297
|
-
result: fail(
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
320
|
+
result: fail(
|
|
321
|
+
ERROR_CODES.OPERATION_ID_REQUIRED,
|
|
322
|
+
'operation_id is required for mutating tools',
|
|
323
|
+
{
|
|
324
|
+
retryable: false,
|
|
325
|
+
requires_human: true,
|
|
326
|
+
tool_name: toolName,
|
|
327
|
+
},
|
|
328
|
+
),
|
|
302
329
|
};
|
|
303
330
|
}
|
|
304
331
|
|
|
@@ -308,7 +335,7 @@ export class ToolRuntime {
|
|
|
308
335
|
return {
|
|
309
336
|
operationId,
|
|
310
337
|
requestHash,
|
|
311
|
-
result: dedupe.response
|
|
338
|
+
result: dedupe.response,
|
|
312
339
|
};
|
|
313
340
|
}
|
|
314
341
|
|
|
@@ -322,15 +349,15 @@ export class ToolRuntime {
|
|
|
322
349
|
operation_id: operationId,
|
|
323
350
|
request_hash: requestHash,
|
|
324
351
|
existing_hash: dedupe.existing_hash,
|
|
325
|
-
tool_name: toolName
|
|
326
|
-
})
|
|
352
|
+
tool_name: toolName,
|
|
353
|
+
}),
|
|
327
354
|
};
|
|
328
355
|
}
|
|
329
356
|
|
|
330
357
|
return {
|
|
331
358
|
operationId,
|
|
332
359
|
requestHash,
|
|
333
|
-
result: null
|
|
360
|
+
result: null,
|
|
334
361
|
};
|
|
335
362
|
}
|
|
336
363
|
}
|
|
@@ -11,7 +11,12 @@ export class ToolsMarkdownGenerator {
|
|
|
11
11
|
|
|
12
12
|
renderFromCatalog(catalog: ToolCatalog): string {
|
|
13
13
|
const names = [...catalog.tools].map((tool) => tool.name).sort((a, b) => a.localeCompare(b));
|
|
14
|
-
const lines = [
|
|
14
|
+
const lines = [
|
|
15
|
+
'# AOP MCP Tool Surface',
|
|
16
|
+
'',
|
|
17
|
+
'Generated from `agentic/orchestrator/tools/catalog.json`.',
|
|
18
|
+
'',
|
|
19
|
+
];
|
|
15
20
|
for (const name of names) {
|
|
16
21
|
lines.push(`- ${name}`);
|
|
17
22
|
}
|
|
@@ -31,6 +31,7 @@ interface ResolveSelectionInput {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
type ResolveSelectionRuntimeConfig = NonNullable<ResolveSelectionInput['agentsConfig']>['runtime'];
|
|
34
|
+
const ENV_VAR_NAME_PATTERN = /^[A-Z_][A-Z0-9_]*$/;
|
|
34
35
|
|
|
35
36
|
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
36
37
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
@@ -52,7 +53,7 @@ function parseAgentConfigJson(raw: string, source: 'cli' | 'env'): Record<string
|
|
|
52
53
|
reason: 'Invalid agent config JSON',
|
|
53
54
|
source,
|
|
54
55
|
value: raw,
|
|
55
|
-
parse_error: error instanceof Error ? error.message : String(error)
|
|
56
|
+
parse_error: error instanceof Error ? error.message : String(error),
|
|
56
57
|
});
|
|
57
58
|
}
|
|
58
59
|
|
|
@@ -60,7 +61,7 @@ function parseAgentConfigJson(raw: string, source: 'cli' | 'env'): Record<string
|
|
|
60
61
|
throw invalidAgentConfigError({
|
|
61
62
|
reason: 'Agent config JSON must be an object',
|
|
62
63
|
source,
|
|
63
|
-
value: raw
|
|
64
|
+
value: raw,
|
|
64
65
|
});
|
|
65
66
|
}
|
|
66
67
|
|
|
@@ -69,7 +70,7 @@ function parseAgentConfigJson(raw: string, source: 'cli' | 'env'): Record<string
|
|
|
69
70
|
|
|
70
71
|
function resolveConfiguredAgentConfig(
|
|
71
72
|
provider: string,
|
|
72
|
-
runtime: ResolveSelectionRuntimeConfig
|
|
73
|
+
runtime: ResolveSelectionRuntimeConfig,
|
|
73
74
|
): Record<string, unknown> | null {
|
|
74
75
|
if (!runtime) {
|
|
75
76
|
return null;
|
|
@@ -87,28 +88,80 @@ function resolveConfiguredAgentConfig(
|
|
|
87
88
|
return null;
|
|
88
89
|
}
|
|
89
90
|
|
|
91
|
+
function readNonEmptyEnvValue(env: NodeJS.ProcessEnv, key: string | null): string | null {
|
|
92
|
+
if (!key) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
const value = env[key];
|
|
96
|
+
if (typeof value !== 'string') {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return value.trim().length > 0 ? value : null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function resolveProviderCredentialReference(
|
|
103
|
+
cliProviderConfigEnv: string | undefined,
|
|
104
|
+
configProviderConfigEnv: string | undefined,
|
|
105
|
+
env: NodeJS.ProcessEnv,
|
|
106
|
+
): { providerConfigEnv: string | null; providerConfigRef: string | null } {
|
|
107
|
+
const cliConfiguredName = cliProviderConfigEnv?.trim() || null;
|
|
108
|
+
const configConfiguredName = configProviderConfigEnv?.trim() || null;
|
|
109
|
+
const unresolvedConfiguredName = cliConfiguredName ?? configConfiguredName ?? null;
|
|
110
|
+
|
|
111
|
+
const cliValue = readNonEmptyEnvValue(env, cliConfiguredName);
|
|
112
|
+
if (cliValue) {
|
|
113
|
+
return { providerConfigEnv: cliConfiguredName, providerConfigRef: cliValue };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const configValue = readNonEmptyEnvValue(env, configConfiguredName);
|
|
117
|
+
if (configValue) {
|
|
118
|
+
return { providerConfigEnv: configConfiguredName, providerConfigRef: configValue };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const aopFallback = readNonEmptyEnvValue(env, 'AOP_PROVIDER_CONFIG_ENV');
|
|
122
|
+
if (aopFallback) {
|
|
123
|
+
if (ENV_VAR_NAME_PATTERN.test(aopFallback)) {
|
|
124
|
+
const indirectValue = readNonEmptyEnvValue(env, aopFallback);
|
|
125
|
+
if (indirectValue) {
|
|
126
|
+
return { providerConfigEnv: aopFallback, providerConfigRef: indirectValue };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return {
|
|
131
|
+
providerConfigEnv: 'AOP_PROVIDER_CONFIG_ENV',
|
|
132
|
+
providerConfigRef: aopFallback,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
providerConfigEnv: unresolvedConfiguredName,
|
|
138
|
+
providerConfigRef: null,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
90
142
|
export const SUPPORTED_PROVIDERS: Set<string> = new Set(REGISTERED_PROVIDER_NAMES);
|
|
91
|
-
export const
|
|
143
|
+
export const LOCAL_CLI_PROVIDERS: Set<string> = new Set([
|
|
144
|
+
'codex',
|
|
145
|
+
'claude',
|
|
146
|
+
'kiro-cli',
|
|
147
|
+
'copilot',
|
|
148
|
+
'custom',
|
|
149
|
+
]);
|
|
150
|
+
export const CREDENTIAL_REQUIRED_PROVIDERS: Set<string> = new Set(['gemini']);
|
|
92
151
|
export type ProviderSelectionResolver = (input: ResolveSelectionInput) => ProviderSelection;
|
|
93
152
|
|
|
94
153
|
export const resolveProviderSelection: ProviderSelectionResolver = ({ cli, env, agentsConfig }) => {
|
|
95
154
|
const provider =
|
|
96
|
-
cli.agent_provider ||
|
|
97
|
-
env.AOP_AGENT_PROVIDER ||
|
|
98
|
-
agentsConfig?.runtime?.default_provider ||
|
|
99
|
-
null;
|
|
155
|
+
cli.agent_provider || env.AOP_AGENT_PROVIDER || agentsConfig?.runtime?.default_provider || null;
|
|
100
156
|
|
|
101
157
|
const model =
|
|
102
|
-
cli.agent_model ||
|
|
103
|
-
env.AOP_AGENT_MODEL ||
|
|
104
|
-
agentsConfig?.runtime?.default_model ||
|
|
105
|
-
null;
|
|
158
|
+
cli.agent_model || env.AOP_AGENT_MODEL || agentsConfig?.runtime?.default_model || null;
|
|
106
159
|
|
|
107
|
-
const providerConfigEnv =
|
|
108
|
-
cli.provider_config_env
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
160
|
+
const { providerConfigEnv, providerConfigRef } = resolveProviderCredentialReference(
|
|
161
|
+
cli.provider_config_env,
|
|
162
|
+
agentsConfig?.runtime?.provider_config_env,
|
|
163
|
+
env,
|
|
164
|
+
);
|
|
112
165
|
|
|
113
166
|
if (!provider) {
|
|
114
167
|
const error = new Error(ERROR_CODES.AGENT_PROVIDER_NOT_CONFIGURED) as AppError;
|
|
@@ -123,15 +176,12 @@ export const resolveProviderSelection: ProviderSelectionResolver = ({ cli, env,
|
|
|
123
176
|
throw error;
|
|
124
177
|
}
|
|
125
178
|
|
|
126
|
-
if (
|
|
127
|
-
AUTH_REQUIRED_PROVIDERS.has(provider) &&
|
|
128
|
-
(!providerConfigEnv || !env[providerConfigEnv])
|
|
129
|
-
) {
|
|
179
|
+
if (CREDENTIAL_REQUIRED_PROVIDERS.has(provider) && !providerConfigRef) {
|
|
130
180
|
const error = new Error(ERROR_CODES.PROVIDER_AUTH_MISSING) as AppError;
|
|
131
181
|
error.code = ERROR_CODES.PROVIDER_AUTH_MISSING;
|
|
132
182
|
error.details = {
|
|
133
183
|
provider,
|
|
134
|
-
provider_config_env: providerConfigEnv
|
|
184
|
+
provider_config_env: providerConfigEnv,
|
|
135
185
|
};
|
|
136
186
|
throw error;
|
|
137
187
|
}
|
|
@@ -149,8 +199,8 @@ export const resolveProviderSelection: ProviderSelectionResolver = ({ cli, env,
|
|
|
149
199
|
provider,
|
|
150
200
|
model: model ?? `${provider}-default`,
|
|
151
201
|
provider_config_env: providerConfigEnv,
|
|
152
|
-
provider_config_ref:
|
|
153
|
-
agent_config: agentConfig
|
|
202
|
+
provider_config_ref: providerConfigRef,
|
|
203
|
+
agent_config: agentConfig,
|
|
154
204
|
};
|
|
155
205
|
};
|
|
156
206
|
|
|
@@ -163,7 +213,11 @@ export interface WorkerSession {
|
|
|
163
213
|
|
|
164
214
|
export interface WorkerProvider {
|
|
165
215
|
selection: ProviderSelection;
|
|
166
|
-
createSession(
|
|
216
|
+
createSession(
|
|
217
|
+
role: string,
|
|
218
|
+
featureId: string,
|
|
219
|
+
systemPrompt: string | null,
|
|
220
|
+
): Promise<WorkerSession>;
|
|
167
221
|
reattachSession(sessionId: string): Promise<WorkerSession | null>;
|
|
168
222
|
closeSession(sessionId: string): Promise<{ closed: true }>;
|
|
169
223
|
runWorker(input: {
|
|
@@ -197,23 +251,31 @@ export interface ProviderCommandRunnerOptions {
|
|
|
197
251
|
}
|
|
198
252
|
|
|
199
253
|
export interface ProviderCommandRunner {
|
|
200
|
-
run(
|
|
254
|
+
run(
|
|
255
|
+
command: string,
|
|
256
|
+
args: string[],
|
|
257
|
+
options?: ProviderCommandRunnerOptions,
|
|
258
|
+
): Promise<ProviderCommandResult>;
|
|
201
259
|
}
|
|
202
260
|
|
|
203
261
|
export class NodeProviderCommandRunner implements ProviderCommandRunner {
|
|
204
|
-
async run(
|
|
262
|
+
async run(
|
|
263
|
+
command: string,
|
|
264
|
+
args: string[],
|
|
265
|
+
options: ProviderCommandRunnerOptions = {},
|
|
266
|
+
): Promise<ProviderCommandResult> {
|
|
205
267
|
return await new Promise<ProviderCommandResult>((resolve) => {
|
|
206
268
|
let child;
|
|
207
269
|
try {
|
|
208
270
|
child = spawn(command, args, {
|
|
209
271
|
env: options.env,
|
|
210
|
-
stdio: options.interactive ? 'inherit' : ['pipe', 'pipe', 'pipe']
|
|
272
|
+
stdio: options.interactive ? 'inherit' : ['pipe', 'pipe', 'pipe'],
|
|
211
273
|
});
|
|
212
274
|
} catch {
|
|
213
275
|
resolve({
|
|
214
276
|
exitCode: 127,
|
|
215
277
|
signal: null,
|
|
216
|
-
errorCode: 'ENOENT'
|
|
278
|
+
errorCode: 'ENOENT',
|
|
217
279
|
});
|
|
218
280
|
return;
|
|
219
281
|
}
|
|
@@ -244,7 +306,7 @@ export class NodeProviderCommandRunner implements ProviderCommandRunner {
|
|
|
244
306
|
resolve({
|
|
245
307
|
exitCode: code ?? (spawnErrorCode === 'ENOENT' ? 127 : 1),
|
|
246
308
|
signal,
|
|
247
|
-
errorCode: spawnErrorCode
|
|
309
|
+
errorCode: spawnErrorCode,
|
|
248
310
|
});
|
|
249
311
|
});
|
|
250
312
|
});
|
|
@@ -276,7 +338,7 @@ function readStringArray(value: unknown): string[] | null {
|
|
|
276
338
|
function resolveTemplateFromAgentConfig(
|
|
277
339
|
agentConfig: Record<string, unknown> | null | undefined,
|
|
278
340
|
kind: 'attach' | 'send',
|
|
279
|
-
fallback: ProviderCommandTemplate | undefined
|
|
341
|
+
fallback: ProviderCommandTemplate | undefined,
|
|
280
342
|
): ProviderCommandTemplate | undefined {
|
|
281
343
|
const nested = agentConfig?.[kind];
|
|
282
344
|
const nestedRecord = isPlainObject(nested) ? nested : null;
|
|
@@ -307,24 +369,34 @@ function resolveProviderCommands(selection: ProviderSelection): ProviderCliComma
|
|
|
307
369
|
const defaults: Record<string, ProviderCliCommands> = {
|
|
308
370
|
codex: {
|
|
309
371
|
attach: { command: 'codex', args: ['chat', '--session', '{session_id}'] },
|
|
310
|
-
send: {
|
|
372
|
+
send: {
|
|
373
|
+
command: 'codex',
|
|
374
|
+
args: ['chat', '--session', '{session_id}', '--message', '{message}'],
|
|
375
|
+
},
|
|
311
376
|
},
|
|
312
377
|
claude: {
|
|
313
378
|
attach: { command: 'claude-code', args: ['chat', '--session', '{session_id}'] },
|
|
314
|
-
send: {
|
|
315
|
-
|
|
379
|
+
send: {
|
|
380
|
+
command: 'claude-code',
|
|
381
|
+
args: ['chat', '--session', '{session_id}', '--message', '{message}'],
|
|
382
|
+
},
|
|
383
|
+
},
|
|
316
384
|
};
|
|
317
385
|
|
|
318
386
|
const defaultsForProvider = defaults[selection.provider] ?? {};
|
|
319
387
|
return {
|
|
320
|
-
attach: resolveTemplateFromAgentConfig(
|
|
321
|
-
|
|
388
|
+
attach: resolveTemplateFromAgentConfig(
|
|
389
|
+
selection.agent_config,
|
|
390
|
+
'attach',
|
|
391
|
+
defaultsForProvider.attach,
|
|
392
|
+
),
|
|
393
|
+
send: resolveTemplateFromAgentConfig(selection.agent_config, 'send', defaultsForProvider.send),
|
|
322
394
|
};
|
|
323
395
|
}
|
|
324
396
|
|
|
325
397
|
function applyCommandArgsTemplate(
|
|
326
398
|
args: string[],
|
|
327
|
-
values: { sessionId: string; message?: string }
|
|
399
|
+
values: { sessionId: string; message?: string },
|
|
328
400
|
): string[] {
|
|
329
401
|
return args.map((arg) => {
|
|
330
402
|
if (arg === '{session_id}') {
|
|
@@ -341,7 +413,7 @@ function commandFailureError(
|
|
|
341
413
|
provider: string,
|
|
342
414
|
capability: 'attach' | 'send',
|
|
343
415
|
details: Record<string, unknown>,
|
|
344
|
-
code: string
|
|
416
|
+
code: string,
|
|
345
417
|
): AppError {
|
|
346
418
|
const error = new Error(`${provider} provider ${capability} failed`) as AppError;
|
|
347
419
|
error.code = code;
|
|
@@ -374,17 +446,21 @@ export class NullWorkerProvider implements WorkerProvider {
|
|
|
374
446
|
this.getSessionInfo = (sessionId: string) =>
|
|
375
447
|
Promise.resolve({
|
|
376
448
|
active: Boolean(sessionId) && sessionId !== 'unknown' && sessionId !== 'unassigned',
|
|
377
|
-
provider: this.selection.provider
|
|
449
|
+
provider: this.selection.provider,
|
|
378
450
|
});
|
|
379
451
|
}
|
|
380
452
|
}
|
|
381
453
|
|
|
382
|
-
createSession(
|
|
454
|
+
createSession(
|
|
455
|
+
role: string,
|
|
456
|
+
featureId: string,
|
|
457
|
+
systemPrompt: string | null,
|
|
458
|
+
): Promise<WorkerSession> {
|
|
383
459
|
return Promise.resolve({
|
|
384
460
|
session_id: `${role}-${featureId}-${crypto.randomUUID()}`,
|
|
385
461
|
role,
|
|
386
462
|
feature_id: featureId,
|
|
387
|
-
system_prompt_loaded: Boolean(systemPrompt)
|
|
463
|
+
system_prompt_loaded: Boolean(systemPrompt),
|
|
388
464
|
});
|
|
389
465
|
}
|
|
390
466
|
reattachSession(sessionId: string): Promise<WorkerSession | null> {
|
|
@@ -395,7 +471,7 @@ export class NullWorkerProvider implements WorkerProvider {
|
|
|
395
471
|
session_id: sessionId,
|
|
396
472
|
role: 'orchestrator',
|
|
397
473
|
feature_id: 'global',
|
|
398
|
-
system_prompt_loaded: false
|
|
474
|
+
system_prompt_loaded: false,
|
|
399
475
|
});
|
|
400
476
|
}
|
|
401
477
|
closeSession(_sessionId: string): Promise<{ closed: true }> {
|
|
@@ -405,7 +481,7 @@ export class NullWorkerProvider implements WorkerProvider {
|
|
|
405
481
|
runWorker({
|
|
406
482
|
role,
|
|
407
483
|
feature_id,
|
|
408
|
-
context_bundle
|
|
484
|
+
context_bundle,
|
|
409
485
|
}: {
|
|
410
486
|
role: string;
|
|
411
487
|
feature_id: string;
|
|
@@ -421,9 +497,7 @@ export class NullWorkerProvider implements WorkerProvider {
|
|
|
421
497
|
if (role === 'planner') {
|
|
422
498
|
const state = context_bundle?.state;
|
|
423
499
|
const frontMatter =
|
|
424
|
-
state && typeof state === 'object'
|
|
425
|
-
? (state as Record<string, unknown>).front_matter
|
|
426
|
-
: null;
|
|
500
|
+
state && typeof state === 'object' ? (state as Record<string, unknown>).front_matter : null;
|
|
427
501
|
const status =
|
|
428
502
|
frontMatter && typeof frontMatter === 'object'
|
|
429
503
|
? (frontMatter as Record<string, unknown>).status
|
|
@@ -432,32 +506,36 @@ export class NullWorkerProvider implements WorkerProvider {
|
|
|
432
506
|
type: 'NOTE',
|
|
433
507
|
content: `Planner session active for ${feature_id}.`,
|
|
434
508
|
context_snapshot: {
|
|
435
|
-
status: typeof status === 'string' ? status : 'unknown'
|
|
436
|
-
}
|
|
509
|
+
status: typeof status === 'string' ? status : 'unknown',
|
|
510
|
+
},
|
|
437
511
|
});
|
|
438
512
|
}
|
|
439
513
|
|
|
440
514
|
return Promise.resolve({
|
|
441
515
|
type: 'NOTE',
|
|
442
|
-
content: `${role} session active for ${feature_id}
|
|
516
|
+
content: `${role} session active for ${feature_id}.`,
|
|
443
517
|
});
|
|
444
518
|
}
|
|
445
519
|
|
|
446
|
-
private async executeCommand(
|
|
520
|
+
private async executeCommand(
|
|
521
|
+
kind: 'attach' | 'send',
|
|
522
|
+
sessionId: string,
|
|
523
|
+
message?: string,
|
|
524
|
+
): Promise<void> {
|
|
447
525
|
const template = kind === 'attach' ? this.commands.attach : this.commands.send;
|
|
448
526
|
if (!template) {
|
|
449
527
|
throw commandFailureError(
|
|
450
528
|
this.selection.provider,
|
|
451
529
|
kind,
|
|
452
530
|
{ reason: `Provider ${this.selection.provider} does not support ${kind}` },
|
|
453
|
-
ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER
|
|
531
|
+
ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER,
|
|
454
532
|
);
|
|
455
533
|
}
|
|
456
534
|
|
|
457
535
|
const args = applyCommandArgsTemplate(template.args, { sessionId, message });
|
|
458
536
|
const result = await this.commandRunner.run(template.command, args, {
|
|
459
537
|
interactive: kind === 'attach',
|
|
460
|
-
timeoutMs: kind === 'send' ? 15_000 : undefined
|
|
538
|
+
timeoutMs: kind === 'send' ? 15_000 : undefined,
|
|
461
539
|
});
|
|
462
540
|
|
|
463
541
|
if (result.exitCode === 0) {
|
|
@@ -469,10 +547,15 @@ export class NullWorkerProvider implements WorkerProvider {
|
|
|
469
547
|
args,
|
|
470
548
|
exit_code: result.exitCode,
|
|
471
549
|
signal: result.signal,
|
|
472
|
-
error_code: result.errorCode
|
|
550
|
+
error_code: result.errorCode,
|
|
473
551
|
};
|
|
474
552
|
if (result.exitCode === 127 || result.errorCode === 'ENOENT') {
|
|
475
|
-
throw commandFailureError(
|
|
553
|
+
throw commandFailureError(
|
|
554
|
+
this.selection.provider,
|
|
555
|
+
kind,
|
|
556
|
+
details,
|
|
557
|
+
ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER,
|
|
558
|
+
);
|
|
476
559
|
}
|
|
477
560
|
throw commandFailureError(this.selection.provider, kind, details, ERROR_CODES.INTERNAL_ERROR);
|
|
478
561
|
}
|