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,10 @@ import { ERROR_CODES } from '../src/core/error-codes.js';
|
|
|
4
4
|
import { TokenAuthVerifier } from '../src/index.js';
|
|
5
5
|
|
|
6
6
|
function sign(secret: string, encodedHeader: string, encodedPayload: string): string {
|
|
7
|
-
return crypto
|
|
7
|
+
return crypto
|
|
8
|
+
.createHmac('sha256', secret)
|
|
9
|
+
.update(`${encodedHeader}.${encodedPayload}`)
|
|
10
|
+
.digest('base64url');
|
|
8
11
|
}
|
|
9
12
|
|
|
10
13
|
function encode(value: unknown): string {
|
|
@@ -27,7 +30,7 @@ describe('TokenAuthVerifier', () => {
|
|
|
27
30
|
const verifier = new TokenAuthVerifier({
|
|
28
31
|
secret,
|
|
29
32
|
now: () => now,
|
|
30
|
-
ttl_seconds: 60
|
|
33
|
+
ttl_seconds: 60,
|
|
31
34
|
});
|
|
32
35
|
|
|
33
36
|
it('issues and verifies tokens and validates basic input shape', () => {
|
|
@@ -35,7 +38,7 @@ describe('TokenAuthVerifier', () => {
|
|
|
35
38
|
run_id: 'run:1',
|
|
36
39
|
session_id: 'bootstrap:orch',
|
|
37
40
|
actor_type: 'orchestrator',
|
|
38
|
-
actor_id: 'orch'
|
|
41
|
+
actor_id: 'orch',
|
|
39
42
|
});
|
|
40
43
|
const claims = verifier.verifyToken(token);
|
|
41
44
|
expect(claims.run_id).toBe('run:1');
|
|
@@ -49,24 +52,33 @@ describe('TokenAuthVerifier', () => {
|
|
|
49
52
|
run_id: 'run:2',
|
|
50
53
|
session_id: 'bootstrap:orch',
|
|
51
54
|
actor_type: 'orchestrator',
|
|
52
|
-
actor_id: 'orch'
|
|
55
|
+
actor_id: 'orch',
|
|
53
56
|
});
|
|
54
57
|
const [header, payload, signature] = token.split('.');
|
|
55
58
|
|
|
56
|
-
expectThrownCode(
|
|
59
|
+
expectThrownCode(
|
|
60
|
+
() => verifier.verifyToken(`${header}.${payload}.${signature}x`),
|
|
61
|
+
ERROR_CODES.UNAUTHENTICATED,
|
|
62
|
+
);
|
|
57
63
|
const tamperedSameLength = signature.slice(0, -1) + (signature.endsWith('a') ? 'b' : 'a');
|
|
58
|
-
expectThrownCode(
|
|
64
|
+
expectThrownCode(
|
|
65
|
+
() => verifier.verifyToken(`${header}.${payload}.${tamperedSameLength}`),
|
|
66
|
+
ERROR_CODES.UNAUTHENTICATED,
|
|
67
|
+
);
|
|
59
68
|
|
|
60
69
|
const badHeader = encode({ alg: 'HS512', typ: 'JWT' });
|
|
61
70
|
const badHeaderSig = sign(secret, badHeader, payload);
|
|
62
|
-
expectThrownCode(
|
|
71
|
+
expectThrownCode(
|
|
72
|
+
() => verifier.verifyToken(`${badHeader}.${payload}.${badHeaderSig}`),
|
|
73
|
+
ERROR_CODES.UNAUTHENTICATED,
|
|
74
|
+
);
|
|
63
75
|
|
|
64
76
|
const expiredToken = verifier.issueToken({
|
|
65
77
|
run_id: 'run:2',
|
|
66
78
|
session_id: 'bootstrap:orch',
|
|
67
79
|
actor_type: 'orchestrator',
|
|
68
80
|
actor_id: 'orch',
|
|
69
|
-
expires_at: '2025-12-31T23:59:00.000Z'
|
|
81
|
+
expires_at: '2025-12-31T23:59:00.000Z',
|
|
70
82
|
});
|
|
71
83
|
expectThrownCode(() => verifier.verifyToken(expiredToken), ERROR_CODES.UNAUTHENTICATED);
|
|
72
84
|
});
|
|
@@ -79,9 +91,9 @@ describe('TokenAuthVerifier', () => {
|
|
|
79
91
|
session_id: 'bootstrap:orch',
|
|
80
92
|
actor_type: 'orchestrator',
|
|
81
93
|
actor_id: 'orch',
|
|
82
|
-
expires_at: 'not-an-iso-date'
|
|
94
|
+
expires_at: 'not-an-iso-date',
|
|
83
95
|
}),
|
|
84
|
-
ERROR_CODES.UNAUTHENTICATED
|
|
96
|
+
ERROR_CODES.UNAUTHENTICATED,
|
|
85
97
|
);
|
|
86
98
|
|
|
87
99
|
expectThrownCode(
|
|
@@ -90,9 +102,9 @@ describe('TokenAuthVerifier', () => {
|
|
|
90
102
|
run_id: 'run:3',
|
|
91
103
|
session_id: 'worker:1',
|
|
92
104
|
actor_type: 'system',
|
|
93
|
-
actor_id: 'system'
|
|
105
|
+
actor_id: 'system',
|
|
94
106
|
}),
|
|
95
|
-
ERROR_CODES.FORBIDDEN_TOOL_FOR_ROLE
|
|
107
|
+
ERROR_CODES.FORBIDDEN_TOOL_FOR_ROLE,
|
|
96
108
|
);
|
|
97
109
|
|
|
98
110
|
const header = encode({ alg: 'HS256', typ: 'JWT' });
|
|
@@ -103,9 +115,12 @@ describe('TokenAuthVerifier', () => {
|
|
|
103
115
|
actor_id: 'orch',
|
|
104
116
|
issued_at: now.toISOString(),
|
|
105
117
|
expires_at: new Date(now.getTime() + 30_000).toISOString(),
|
|
106
|
-
feature_scope: { bad: true }
|
|
118
|
+
feature_scope: { bad: true },
|
|
107
119
|
});
|
|
108
120
|
const signature = sign(secret, header, claims);
|
|
109
|
-
expectThrownCode(
|
|
121
|
+
expectThrownCode(
|
|
122
|
+
() => verifier.verifyToken(`${header}.${claims}.${signature}`),
|
|
123
|
+
ERROR_CODES.UNAUTHENTICATED,
|
|
124
|
+
);
|
|
110
125
|
});
|
|
111
126
|
});
|
|
@@ -15,7 +15,7 @@ const BASE_TOOL: ToolCatalogEntry = {
|
|
|
15
15
|
supported_roles: ['orchestrator'],
|
|
16
16
|
handler_id: 'feature.init',
|
|
17
17
|
mutating: true,
|
|
18
|
-
requires_operation_id: true
|
|
18
|
+
requires_operation_id: true,
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
const SECOND_TOOL: ToolCatalogEntry = {
|
|
@@ -26,16 +26,16 @@ const SECOND_TOOL: ToolCatalogEntry = {
|
|
|
26
26
|
supported_roles: ['orchestrator'],
|
|
27
27
|
handler_id: 'report.dashboard',
|
|
28
28
|
mutating: false,
|
|
29
|
-
requires_operation_id: false
|
|
29
|
+
requires_operation_id: false,
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
const VALID_PROTOCOL: ProtocolContract = {
|
|
33
33
|
mcp_protocol_version: MCP_PROTOCOL_PIN.mcp_protocol_version,
|
|
34
34
|
sdk: {
|
|
35
35
|
package: MCP_PROTOCOL_PIN.sdk.package,
|
|
36
|
-
version: MCP_PROTOCOL_PIN.sdk.version
|
|
36
|
+
version: MCP_PROTOCOL_PIN.sdk.version,
|
|
37
37
|
},
|
|
38
|
-
enabled_transports: [...REQUIRED_MCP_TRANSPORTS, 'inprocess']
|
|
38
|
+
enabled_transports: [...REQUIRED_MCP_TRANSPORTS, 'inprocess'],
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
const createdRoots: string[] = [];
|
|
@@ -57,14 +57,24 @@ async function makeRegistryRepo(overrides?: {
|
|
|
57
57
|
const tools = overrides?.tools ?? [BASE_TOOL];
|
|
58
58
|
const catalog: ToolCatalog = {
|
|
59
59
|
version: 1,
|
|
60
|
-
tools
|
|
60
|
+
tools,
|
|
61
61
|
};
|
|
62
62
|
|
|
63
63
|
const toolsRoot = path.join(root, 'agentic', 'orchestrator', 'tools');
|
|
64
|
-
const hasCatalogOverride = overrides
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
64
|
+
const hasCatalogOverride = overrides
|
|
65
|
+
? Object.prototype.hasOwnProperty.call(overrides, 'catalog')
|
|
66
|
+
: false;
|
|
67
|
+
const hasProtocolOverride = overrides
|
|
68
|
+
? Object.prototype.hasOwnProperty.call(overrides, 'protocol')
|
|
69
|
+
: false;
|
|
70
|
+
await writeJson(
|
|
71
|
+
path.join(toolsRoot, 'catalog.json'),
|
|
72
|
+
hasCatalogOverride ? overrides?.catalog : catalog,
|
|
73
|
+
);
|
|
74
|
+
await writeJson(
|
|
75
|
+
path.join(toolsRoot, 'protocol.json'),
|
|
76
|
+
hasProtocolOverride ? overrides?.protocol : VALID_PROTOCOL,
|
|
77
|
+
);
|
|
68
78
|
|
|
69
79
|
const omitSchemas = new Set(overrides?.omitSchemas ?? []);
|
|
70
80
|
const refs = new Set<string>();
|
|
@@ -78,14 +88,14 @@ async function makeRegistryRepo(overrides?: {
|
|
|
78
88
|
}
|
|
79
89
|
await writeJson(path.join(toolsRoot, ref), {
|
|
80
90
|
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
81
|
-
type: 'object'
|
|
91
|
+
type: 'object',
|
|
82
92
|
});
|
|
83
93
|
}
|
|
84
94
|
|
|
85
95
|
if (overrides?.includeErrorsSchema !== false) {
|
|
86
96
|
await writeJson(path.join(toolsRoot, 'errors.schema.json'), {
|
|
87
97
|
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
88
|
-
type: 'object'
|
|
98
|
+
type: 'object',
|
|
89
99
|
});
|
|
90
100
|
}
|
|
91
101
|
|
|
@@ -94,7 +104,9 @@ async function makeRegistryRepo(overrides?: {
|
|
|
94
104
|
|
|
95
105
|
describe('ToolRegistryLoader', () => {
|
|
96
106
|
afterEach(async () => {
|
|
97
|
-
await Promise.all(
|
|
107
|
+
await Promise.all(
|
|
108
|
+
createdRoots.splice(0).map((root) => fs.rm(root, { recursive: true, force: true })),
|
|
109
|
+
);
|
|
98
110
|
});
|
|
99
111
|
|
|
100
112
|
it('GIVEN_valid_registry_WHEN_loading_THEN_returns_lookup_maps_without_side_effects', async () => {
|
|
@@ -105,7 +117,9 @@ describe('ToolRegistryLoader', () => {
|
|
|
105
117
|
|
|
106
118
|
expect(loaded.toolsByName.get('feature.init')?.handler_id).toBe('feature.init');
|
|
107
119
|
expect(loaded.toolsByHandlerId.get('report.dashboard')?.name).toBe('report.dashboard');
|
|
108
|
-
await expect(
|
|
120
|
+
await expect(
|
|
121
|
+
fs.stat(path.join(repoRoot, 'agentic', 'orchestrator', 'tools.md')),
|
|
122
|
+
).rejects.toThrow();
|
|
109
123
|
});
|
|
110
124
|
|
|
111
125
|
it('GIVEN_loaded_catalog_WHEN_generating_markdown_THEN_writes_sorted_tools_list', async () => {
|
|
@@ -115,7 +129,10 @@ describe('ToolRegistryLoader', () => {
|
|
|
115
129
|
|
|
116
130
|
const generator = new ToolsMarkdownGenerator(repoRoot);
|
|
117
131
|
await generator.writeFromCatalog(loaded.catalog);
|
|
118
|
-
const toolsMd = await fs.readFile(
|
|
132
|
+
const toolsMd = await fs.readFile(
|
|
133
|
+
path.join(repoRoot, 'agentic', 'orchestrator', 'tools.md'),
|
|
134
|
+
'utf8',
|
|
135
|
+
);
|
|
119
136
|
|
|
120
137
|
expect(toolsMd).toContain('- feature.init');
|
|
121
138
|
expect(toolsMd).toContain('- report.dashboard');
|
|
@@ -131,7 +148,7 @@ describe('ToolRegistryLoader', () => {
|
|
|
131
148
|
expect(loader.protocolPath).toBe(path.join(loader.toolsRoot, 'protocol.json'));
|
|
132
149
|
expect(loader.errorsSchemaPath).toBe(path.join(loader.toolsRoot, 'errors.schema.json'));
|
|
133
150
|
expect(loader.resolveSchemaPath('schemas/input/read.schema.json')).toBe(
|
|
134
|
-
path.join(loader.toolsRoot, 'schemas', 'input', 'read.schema.json')
|
|
151
|
+
path.join(loader.toolsRoot, 'schemas', 'input', 'read.schema.json'),
|
|
135
152
|
);
|
|
136
153
|
});
|
|
137
154
|
|
|
@@ -154,7 +171,9 @@ describe('ToolRegistryLoader', () => {
|
|
|
154
171
|
const loaded = await loader.load();
|
|
155
172
|
|
|
156
173
|
expect(loaded.catalog.tools.length).toBeGreaterThan(0);
|
|
157
|
-
expect(loader.catalogPath).not.toBe(
|
|
174
|
+
expect(loader.catalogPath).not.toBe(
|
|
175
|
+
path.join(repoRoot, 'agentic', 'orchestrator', 'tools', 'catalog.json'),
|
|
176
|
+
);
|
|
158
177
|
await expect(fs.stat(loader.catalogPath)).resolves.toBeDefined();
|
|
159
178
|
});
|
|
160
179
|
|
|
@@ -187,7 +206,9 @@ describe('ToolRegistryLoader', () => {
|
|
|
187
206
|
const repoRoot = await makeRegistryRepo({ tools: [invalidTool] });
|
|
188
207
|
const loader = new ToolRegistryLoader(repoRoot);
|
|
189
208
|
|
|
190
|
-
await expect(loader.load()).rejects.toThrow(
|
|
209
|
+
await expect(loader.load()).rejects.toThrow(
|
|
210
|
+
'registry_mutating_requires_operation_id:feature.init',
|
|
211
|
+
);
|
|
191
212
|
});
|
|
192
213
|
|
|
193
214
|
it('GIVEN_missing_input_schema_WHEN_loading_THEN_throws_missing_input_schema_error', async () => {
|
|
@@ -195,7 +216,7 @@ describe('ToolRegistryLoader', () => {
|
|
|
195
216
|
const loader = new ToolRegistryLoader(repoRoot);
|
|
196
217
|
|
|
197
218
|
await expect(loader.load()).rejects.toThrow(
|
|
198
|
-
`registry_missing_input_schema:feature.init:${BASE_TOOL.input_schema_ref}
|
|
219
|
+
`registry_missing_input_schema:feature.init:${BASE_TOOL.input_schema_ref}`,
|
|
199
220
|
);
|
|
200
221
|
});
|
|
201
222
|
|
|
@@ -204,7 +225,7 @@ describe('ToolRegistryLoader', () => {
|
|
|
204
225
|
const loader = new ToolRegistryLoader(repoRoot);
|
|
205
226
|
|
|
206
227
|
await expect(loader.load()).rejects.toThrow(
|
|
207
|
-
`registry_missing_output_schema:feature.init:${BASE_TOOL.output_schema_ref}
|
|
228
|
+
`registry_missing_output_schema:feature.init:${BASE_TOOL.output_schema_ref}`,
|
|
208
229
|
);
|
|
209
230
|
});
|
|
210
231
|
|
|
@@ -231,7 +252,10 @@ describe('ToolRegistryLoader', () => {
|
|
|
231
252
|
|
|
232
253
|
it('GIVEN_protocol_missing_required_fields_WHEN_loading_THEN_throws_invalid_protocol_fields_error', async () => {
|
|
233
254
|
const repoRoot = await makeRegistryRepo({
|
|
234
|
-
protocol: {
|
|
255
|
+
protocol: {
|
|
256
|
+
mcp_protocol_version: MCP_PROTOCOL_PIN.mcp_protocol_version,
|
|
257
|
+
sdk: { package: MCP_PROTOCOL_PIN.sdk.package },
|
|
258
|
+
},
|
|
235
259
|
});
|
|
236
260
|
const loader = new ToolRegistryLoader(repoRoot);
|
|
237
261
|
|
|
@@ -243,8 +267,8 @@ describe('ToolRegistryLoader', () => {
|
|
|
243
267
|
protocol: {
|
|
244
268
|
mcp_protocol_version: MCP_PROTOCOL_PIN.mcp_protocol_version,
|
|
245
269
|
sdk: { package: MCP_PROTOCOL_PIN.sdk.package, version: MCP_PROTOCOL_PIN.sdk.version },
|
|
246
|
-
enabled_transports: []
|
|
247
|
-
}
|
|
270
|
+
enabled_transports: [],
|
|
271
|
+
},
|
|
248
272
|
});
|
|
249
273
|
const loader = new ToolRegistryLoader(repoRoot);
|
|
250
274
|
|
|
@@ -255,8 +279,8 @@ describe('ToolRegistryLoader', () => {
|
|
|
255
279
|
const repoRoot = await makeRegistryRepo({
|
|
256
280
|
protocol: {
|
|
257
281
|
...VALID_PROTOCOL,
|
|
258
|
-
enabled_transports: ['inprocess']
|
|
259
|
-
}
|
|
282
|
+
enabled_transports: ['inprocess'],
|
|
283
|
+
},
|
|
260
284
|
});
|
|
261
285
|
const loader = new ToolRegistryLoader(repoRoot);
|
|
262
286
|
|
|
@@ -269,9 +293,9 @@ describe('ToolRegistryLoader', () => {
|
|
|
269
293
|
...VALID_PROTOCOL,
|
|
270
294
|
sdk: {
|
|
271
295
|
...VALID_PROTOCOL.sdk,
|
|
272
|
-
version: '1.18.1'
|
|
273
|
-
}
|
|
274
|
-
}
|
|
296
|
+
version: '1.18.1',
|
|
297
|
+
},
|
|
298
|
+
},
|
|
275
299
|
});
|
|
276
300
|
const loader = new ToolRegistryLoader(repoRoot);
|
|
277
301
|
|
|
@@ -12,7 +12,7 @@ const READ_TOOL: ToolCatalogEntry = {
|
|
|
12
12
|
supported_roles: ['orchestrator'],
|
|
13
13
|
handler_id: 'report.dashboard',
|
|
14
14
|
mutating: false,
|
|
15
|
-
requires_operation_id: false
|
|
15
|
+
requires_operation_id: false,
|
|
16
16
|
};
|
|
17
17
|
|
|
18
18
|
const MUTATING_TOOL: ToolCatalogEntry = {
|
|
@@ -23,7 +23,7 @@ const MUTATING_TOOL: ToolCatalogEntry = {
|
|
|
23
23
|
supported_roles: ['orchestrator'],
|
|
24
24
|
handler_id: 'feature.init',
|
|
25
25
|
mutating: true,
|
|
26
|
-
requires_operation_id: true
|
|
26
|
+
requires_operation_id: true,
|
|
27
27
|
};
|
|
28
28
|
|
|
29
29
|
function claims(overrides: Partial<VerifiedActorClaims> = {}): VerifiedActorClaims {
|
|
@@ -34,7 +34,7 @@ function claims(overrides: Partial<VerifiedActorClaims> = {}): VerifiedActorClai
|
|
|
34
34
|
actor_id: 'actor-1',
|
|
35
35
|
issued_at: new Date().toISOString(),
|
|
36
36
|
expires_at: new Date(Date.now() + 60_000).toISOString(),
|
|
37
|
-
...overrides
|
|
37
|
+
...overrides,
|
|
38
38
|
};
|
|
39
39
|
}
|
|
40
40
|
|
|
@@ -47,39 +47,39 @@ function createRuntime() {
|
|
|
47
47
|
protocol: {
|
|
48
48
|
mcp_protocol_version: '2025-01-01',
|
|
49
49
|
sdk: { package: 'sdk', version: '1.0.0' },
|
|
50
|
-
enabled_transports: ['inprocess']
|
|
50
|
+
enabled_transports: ['inprocess'],
|
|
51
51
|
},
|
|
52
52
|
toolsByName: new Map<string, ToolCatalogEntry>([
|
|
53
53
|
[MUTATING_TOOL.name, MUTATING_TOOL],
|
|
54
|
-
[READ_TOOL.name, READ_TOOL]
|
|
54
|
+
[READ_TOOL.name, READ_TOOL],
|
|
55
55
|
]),
|
|
56
56
|
toolsByHandlerId: new Map<string, ToolCatalogEntry>([
|
|
57
57
|
[MUTATING_TOOL.handler_id, MUTATING_TOOL],
|
|
58
|
-
[READ_TOOL.handler_id, READ_TOOL]
|
|
59
|
-
])
|
|
58
|
+
[READ_TOOL.handler_id, READ_TOOL],
|
|
59
|
+
]),
|
|
60
60
|
};
|
|
61
61
|
|
|
62
62
|
const loader = {
|
|
63
|
-
readSchemaByRef: vi.fn(async (schemaRef: string) => ({ $id: schemaRef }))
|
|
63
|
+
readSchemaByRef: vi.fn(async (schemaRef: string) => ({ $id: schemaRef })),
|
|
64
64
|
};
|
|
65
65
|
|
|
66
66
|
const validator = {
|
|
67
67
|
validateInput: vi.fn(async () => ({ valid: true, errors: [] })),
|
|
68
68
|
validateOutput: vi.fn(async () => ({ valid: true, errors: [] })),
|
|
69
|
-
validateErrorEnvelope: vi.fn(() => ({ valid: true, errors: [] }))
|
|
69
|
+
validateErrorEnvelope: vi.fn(() => ({ valid: true, errors: [] })),
|
|
70
70
|
};
|
|
71
71
|
|
|
72
72
|
const authorizer = {
|
|
73
|
-
isAuthorized: vi.fn(() => true)
|
|
73
|
+
isAuthorized: vi.fn(() => true),
|
|
74
74
|
};
|
|
75
75
|
|
|
76
76
|
const ledger = {
|
|
77
77
|
resolveOperation: vi.fn(async (): Promise<any> => ({ status: 'new' })),
|
|
78
|
-
recordOperation: vi.fn(async () => undefined)
|
|
78
|
+
recordOperation: vi.fn(async () => undefined),
|
|
79
79
|
};
|
|
80
80
|
|
|
81
81
|
const executor = {
|
|
82
|
-
execute: vi.fn(async (): Promise<any> => ok({ payload: 'ok' }))
|
|
82
|
+
execute: vi.fn(async (): Promise<any> => ok({ payload: 'ok' })),
|
|
83
83
|
};
|
|
84
84
|
|
|
85
85
|
const runtime = new ToolRuntime({
|
|
@@ -88,7 +88,7 @@ function createRuntime() {
|
|
|
88
88
|
validator: validator as any,
|
|
89
89
|
authorizer: authorizer as any,
|
|
90
90
|
ledger: ledger as any,
|
|
91
|
-
executor: executor as any
|
|
91
|
+
executor: executor as any,
|
|
92
92
|
});
|
|
93
93
|
|
|
94
94
|
return { runtime, loader, validator, authorizer, ledger, executor };
|
|
@@ -109,7 +109,9 @@ describe('ToolRuntime', () => {
|
|
|
109
109
|
|
|
110
110
|
expect(descriptors.map((item) => item.name)).toEqual(['feature.init', 'report.dashboard']);
|
|
111
111
|
expect(loader.readSchemaByRef).toHaveBeenCalledWith('schemas/input/mutating.schema.json');
|
|
112
|
-
expect(loader.readSchemaByRef).toHaveBeenCalledWith(
|
|
112
|
+
expect(loader.readSchemaByRef).toHaveBeenCalledWith(
|
|
113
|
+
'schemas/output/standard_success.schema.json',
|
|
114
|
+
);
|
|
113
115
|
});
|
|
114
116
|
|
|
115
117
|
it('GIVEN_unknown_tool_WHEN_calling_THEN_returns_invalid_argument_failure', async () => {
|
|
@@ -118,7 +120,7 @@ describe('ToolRuntime', () => {
|
|
|
118
120
|
|
|
119
121
|
expect(response).toMatchObject({
|
|
120
122
|
ok: false,
|
|
121
|
-
error: { code: ERROR_CODES.INVALID_ARGUMENT }
|
|
123
|
+
error: { code: ERROR_CODES.INVALID_ARGUMENT },
|
|
122
124
|
});
|
|
123
125
|
});
|
|
124
126
|
|
|
@@ -127,12 +129,12 @@ describe('ToolRuntime', () => {
|
|
|
127
129
|
const response = await runtime.callTool(
|
|
128
130
|
READ_TOOL.name,
|
|
129
131
|
{ feature_id: 'feature_b' },
|
|
130
|
-
claims({ feature_scope: ['feature_a'] })
|
|
132
|
+
claims({ feature_scope: ['feature_a'] }),
|
|
131
133
|
);
|
|
132
134
|
|
|
133
135
|
expect(response).toMatchObject({
|
|
134
136
|
ok: false,
|
|
135
|
-
error: { code: ERROR_CODES.FORBIDDEN_TOOL_FOR_ROLE }
|
|
137
|
+
error: { code: ERROR_CODES.FORBIDDEN_TOOL_FOR_ROLE },
|
|
136
138
|
});
|
|
137
139
|
});
|
|
138
140
|
|
|
@@ -144,7 +146,7 @@ describe('ToolRuntime', () => {
|
|
|
144
146
|
|
|
145
147
|
expect(response).toMatchObject({
|
|
146
148
|
ok: false,
|
|
147
|
-
error: { code: ERROR_CODES.FORBIDDEN_TOOL_FOR_ROLE }
|
|
149
|
+
error: { code: ERROR_CODES.FORBIDDEN_TOOL_FOR_ROLE },
|
|
148
150
|
});
|
|
149
151
|
});
|
|
150
152
|
|
|
@@ -152,24 +154,28 @@ describe('ToolRuntime', () => {
|
|
|
152
154
|
const { runtime, validator } = createRuntime();
|
|
153
155
|
validator.validateInput.mockResolvedValue({
|
|
154
156
|
valid: false,
|
|
155
|
-
errors: [{ message: 'bad input' }]
|
|
157
|
+
errors: [{ message: 'bad input' }],
|
|
156
158
|
});
|
|
157
159
|
|
|
158
160
|
const response = await runtime.callTool(READ_TOOL.name, {}, claims());
|
|
159
161
|
|
|
160
162
|
expect(response).toMatchObject({
|
|
161
163
|
ok: false,
|
|
162
|
-
error: { code: ERROR_CODES.INVALID_ARGUMENT }
|
|
164
|
+
error: { code: ERROR_CODES.INVALID_ARGUMENT },
|
|
163
165
|
});
|
|
164
166
|
});
|
|
165
167
|
|
|
166
168
|
it('GIVEN_mutating_tool_without_operation_id_WHEN_calling_THEN_requires_operation_id', async () => {
|
|
167
169
|
const { runtime } = createRuntime();
|
|
168
|
-
const response = await runtime.callTool(
|
|
170
|
+
const response = await runtime.callTool(
|
|
171
|
+
MUTATING_TOOL.name,
|
|
172
|
+
{ feature_id: 'feature_a' },
|
|
173
|
+
claims(),
|
|
174
|
+
);
|
|
169
175
|
|
|
170
176
|
expect(response).toMatchObject({
|
|
171
177
|
ok: false,
|
|
172
|
-
error: { code: ERROR_CODES.OPERATION_ID_REQUIRED }
|
|
178
|
+
error: { code: ERROR_CODES.OPERATION_ID_REQUIRED },
|
|
173
179
|
});
|
|
174
180
|
});
|
|
175
181
|
|
|
@@ -177,13 +183,13 @@ describe('ToolRuntime', () => {
|
|
|
177
183
|
const { runtime, ledger, executor } = createRuntime();
|
|
178
184
|
ledger.resolveOperation.mockResolvedValue({
|
|
179
185
|
status: 'replay',
|
|
180
|
-
response: ok({ cached: true })
|
|
186
|
+
response: ok({ cached: true }),
|
|
181
187
|
});
|
|
182
188
|
|
|
183
189
|
const response = await runtime.callTool(
|
|
184
190
|
MUTATING_TOOL.name,
|
|
185
191
|
{ feature_id: 'feature_a', operation_id: 'operation-1234' },
|
|
186
|
-
claims()
|
|
192
|
+
claims(),
|
|
187
193
|
);
|
|
188
194
|
|
|
189
195
|
expect(response).toEqual(ok({ cached: true }));
|
|
@@ -194,18 +200,18 @@ describe('ToolRuntime', () => {
|
|
|
194
200
|
const { runtime, ledger, executor } = createRuntime();
|
|
195
201
|
ledger.resolveOperation.mockResolvedValue({
|
|
196
202
|
status: 'mismatch',
|
|
197
|
-
existing_hash: 'abc123'
|
|
203
|
+
existing_hash: 'abc123',
|
|
198
204
|
});
|
|
199
205
|
|
|
200
206
|
const response = await runtime.callTool(
|
|
201
207
|
MUTATING_TOOL.name,
|
|
202
208
|
{ feature_id: 'feature_a', operation_id: 'operation-1234' },
|
|
203
|
-
claims()
|
|
209
|
+
claims(),
|
|
204
210
|
);
|
|
205
211
|
|
|
206
212
|
expect(response).toMatchObject({
|
|
207
213
|
ok: false,
|
|
208
|
-
error: { code: ERROR_CODES.OPERATION_ID_REUSE_MISMATCH }
|
|
214
|
+
error: { code: ERROR_CODES.OPERATION_ID_REUSE_MISMATCH },
|
|
209
215
|
});
|
|
210
216
|
expect(executor.execute).not.toHaveBeenCalled();
|
|
211
217
|
});
|
|
@@ -214,31 +220,34 @@ describe('ToolRuntime', () => {
|
|
|
214
220
|
const { runtime, validator } = createRuntime();
|
|
215
221
|
validator.validateOutput.mockResolvedValue({
|
|
216
222
|
valid: false,
|
|
217
|
-
errors: [{ message: 'invalid output' }]
|
|
223
|
+
errors: [{ message: 'invalid output' }],
|
|
218
224
|
});
|
|
219
225
|
|
|
220
226
|
const response = await runtime.callTool(READ_TOOL.name, {}, claims());
|
|
221
227
|
|
|
222
228
|
expect(response).toMatchObject({
|
|
223
229
|
ok: false,
|
|
224
|
-
error: { code: ERROR_CODES.INTERNAL_ERROR }
|
|
230
|
+
error: { code: ERROR_CODES.INTERNAL_ERROR },
|
|
225
231
|
});
|
|
226
232
|
});
|
|
227
233
|
|
|
228
234
|
it('GIVEN_failed_execution_with_invalid_error_envelope_WHEN_validating_THEN_returns_internal_error', async () => {
|
|
229
235
|
const { runtime, executor, validator } = createRuntime();
|
|
230
236
|
executor.execute.mockResolvedValue(
|
|
231
|
-
fail(ERROR_CODES.INVALID_ARGUMENT, 'bad request', {
|
|
237
|
+
fail(ERROR_CODES.INVALID_ARGUMENT, 'bad request', {
|
|
238
|
+
retryable: false,
|
|
239
|
+
requires_human: false,
|
|
240
|
+
}),
|
|
232
241
|
);
|
|
233
242
|
validator.validateErrorEnvelope.mockReturnValue({
|
|
234
243
|
valid: false,
|
|
235
|
-
errors: [{ message: 'invalid envelope' }]
|
|
244
|
+
errors: [{ message: 'invalid envelope' }],
|
|
236
245
|
});
|
|
237
246
|
|
|
238
247
|
const response = await runtime.callTool(READ_TOOL.name, {}, claims());
|
|
239
248
|
expect(response).toMatchObject({
|
|
240
249
|
ok: false,
|
|
241
|
-
error: { code: ERROR_CODES.INTERNAL_ERROR }
|
|
250
|
+
error: { code: ERROR_CODES.INTERNAL_ERROR },
|
|
242
251
|
});
|
|
243
252
|
});
|
|
244
253
|
|
|
@@ -249,7 +258,7 @@ describe('ToolRuntime', () => {
|
|
|
249
258
|
const response = await runtime.callTool(
|
|
250
259
|
MUTATING_TOOL.name,
|
|
251
260
|
{ feature_id: 'feature_a', operation_id: 'operation-1234' },
|
|
252
|
-
claims()
|
|
261
|
+
claims(),
|
|
253
262
|
);
|
|
254
263
|
|
|
255
264
|
expect(response).toEqual(ok({ initialized: true }));
|
|
@@ -260,25 +269,33 @@ describe('ToolRuntime', () => {
|
|
|
260
269
|
const { runtime, ledger, executor } = createRuntime();
|
|
261
270
|
const recorded = new Map<string, { requestHash: string; response: ReturnType<typeof fail> }>();
|
|
262
271
|
|
|
263
|
-
(ledger.resolveOperation as any).mockImplementation(
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
272
|
+
(ledger.resolveOperation as any).mockImplementation(
|
|
273
|
+
async (_runId: string, operationId: string, requestHash: string) => {
|
|
274
|
+
const existing = recorded.get(operationId);
|
|
275
|
+
if (!existing) {
|
|
276
|
+
return { status: 'new' };
|
|
277
|
+
}
|
|
278
|
+
if (existing.requestHash === requestHash) {
|
|
279
|
+
return { status: 'replay', response: existing.response };
|
|
280
|
+
}
|
|
281
|
+
return { status: 'mismatch', existing_hash: existing.requestHash };
|
|
282
|
+
},
|
|
283
|
+
);
|
|
273
284
|
(ledger.recordOperation as any).mockImplementation(
|
|
274
|
-
async (
|
|
285
|
+
async (
|
|
286
|
+
_runId: string,
|
|
287
|
+
operationId: string,
|
|
288
|
+
_toolName: string,
|
|
289
|
+
requestHash: string,
|
|
290
|
+
response: ReturnType<typeof fail>,
|
|
291
|
+
) => {
|
|
275
292
|
recorded.set(operationId, { requestHash, response });
|
|
276
|
-
}
|
|
293
|
+
},
|
|
277
294
|
);
|
|
278
295
|
|
|
279
296
|
const transientFailure = fail(ERROR_CODES.INTERNAL_ERROR, 'transient_backend_failure', {
|
|
280
297
|
retryable: true,
|
|
281
|
-
requires_human: false
|
|
298
|
+
requires_human: false,
|
|
282
299
|
});
|
|
283
300
|
executor.execute.mockResolvedValue(transientFailure);
|
|
284
301
|
|