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
|
@@ -31,7 +31,7 @@ function makeRuntimeSessions(overrides: AnyRecord = {}): AnyRecord {
|
|
|
31
31
|
lease_expires_at: now,
|
|
32
32
|
orchestrator_epoch: 0,
|
|
33
33
|
feature_sessions: {},
|
|
34
|
-
...overrides
|
|
34
|
+
...overrides,
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
37
|
|
|
@@ -43,16 +43,16 @@ function makeIndex(overrides: AnyRecord = {}): AnyRecord {
|
|
|
43
43
|
merged: [],
|
|
44
44
|
locks: {
|
|
45
45
|
openapi: null,
|
|
46
|
-
db_migrations: null
|
|
46
|
+
db_migrations: null,
|
|
47
47
|
},
|
|
48
48
|
lock_leases: {
|
|
49
49
|
openapi: null,
|
|
50
|
-
db_migrations: null
|
|
50
|
+
db_migrations: null,
|
|
51
51
|
},
|
|
52
52
|
blocked_queue: [],
|
|
53
53
|
updated_at: new Date().toISOString(),
|
|
54
54
|
runtime_sessions: makeRuntimeSessions(),
|
|
55
|
-
...overrides
|
|
55
|
+
...overrides,
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -69,7 +69,7 @@ function makeRunLeaseHarness(initialIndex: AnyRecord = makeIndex()) {
|
|
|
69
69
|
feature_sessions:
|
|
70
70
|
source.feature_sessions && typeof source.feature_sessions === 'object'
|
|
71
71
|
? source.feature_sessions
|
|
72
|
-
: {}
|
|
72
|
+
: {},
|
|
73
73
|
};
|
|
74
74
|
};
|
|
75
75
|
|
|
@@ -77,10 +77,12 @@ function makeRunLeaseHarness(initialIndex: AnyRecord = makeIndex()) {
|
|
|
77
77
|
makeRuntimeSessions({
|
|
78
78
|
started_at: at ?? new Date().toISOString(),
|
|
79
79
|
last_heartbeat_at: at ?? new Date().toISOString(),
|
|
80
|
-
lease_expires_at: at ?? new Date().toISOString()
|
|
80
|
+
lease_expires_at: at ?? new Date().toISOString(),
|
|
81
81
|
}) as RuntimeSessionsSnapshot;
|
|
82
82
|
|
|
83
|
-
let runLease: RuntimeSessionsSnapshot = clone(
|
|
83
|
+
let runLease: RuntimeSessionsSnapshot = clone(
|
|
84
|
+
initialIndex.runtime_sessions ?? makeRuntimeSessions(),
|
|
85
|
+
);
|
|
84
86
|
|
|
85
87
|
const service = new RunLeaseService({
|
|
86
88
|
runLeaseTtlSeconds: () => 30,
|
|
@@ -95,15 +97,16 @@ function makeRunLeaseHarness(initialIndex: AnyRecord = makeIndex()) {
|
|
|
95
97
|
runLease = clone(data);
|
|
96
98
|
},
|
|
97
99
|
normalizeRuntimeSessions,
|
|
98
|
-
isRunLeaseFresh: (runtimeSessions: AnyRecord) =>
|
|
99
|
-
|
|
100
|
+
isRunLeaseFresh: (runtimeSessions: AnyRecord) =>
|
|
101
|
+
new Date(runtimeSessions.lease_expires_at).getTime() > Date.now(),
|
|
102
|
+
emptyRuntimeSessions,
|
|
100
103
|
});
|
|
101
104
|
|
|
102
105
|
return {
|
|
103
106
|
service,
|
|
104
107
|
getIndex: () => clone(index),
|
|
105
108
|
getRunLease: () => clone(runLease),
|
|
106
|
-
writes
|
|
109
|
+
writes,
|
|
107
110
|
};
|
|
108
111
|
}
|
|
109
112
|
|
|
@@ -117,8 +120,8 @@ function makeLockPolicy(overrides: AnyRecord = {}): AnyRecord {
|
|
|
117
120
|
initial_ms: 1,
|
|
118
121
|
max_ms: 4,
|
|
119
122
|
multiplier: 2,
|
|
120
|
-
jitter_ms: 0
|
|
121
|
-
}
|
|
123
|
+
jitter_ms: 0,
|
|
124
|
+
},
|
|
122
125
|
};
|
|
123
126
|
const lockOverrides = overrides.locks ?? {};
|
|
124
127
|
return {
|
|
@@ -128,17 +131,19 @@ function makeLockPolicy(overrides: AnyRecord = {}): AnyRecord {
|
|
|
128
131
|
...lockOverrides,
|
|
129
132
|
acquire_backoff: {
|
|
130
133
|
...lockDefaults.acquire_backoff,
|
|
131
|
-
...(lockOverrides.acquire_backoff ?? {})
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
+
...(lockOverrides.acquire_backoff ?? {}),
|
|
135
|
+
},
|
|
136
|
+
},
|
|
134
137
|
};
|
|
135
138
|
}
|
|
136
139
|
|
|
137
|
-
async function makeLockHarness(
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
140
|
+
async function makeLockHarness(
|
|
141
|
+
options: {
|
|
142
|
+
policy?: AnyRecord;
|
|
143
|
+
index?: AnyRecord;
|
|
144
|
+
states?: Record<string, AnyRecord>;
|
|
145
|
+
} = {},
|
|
146
|
+
) {
|
|
142
147
|
let index = clone(options.index ?? makeIndex());
|
|
143
148
|
const states = new Map<string, AnyRecord>(
|
|
144
149
|
Object.entries(
|
|
@@ -146,15 +151,15 @@ async function makeLockHarness(options: {
|
|
|
146
151
|
feature_a: {
|
|
147
152
|
version: 1,
|
|
148
153
|
status: STATUS.PLANNING,
|
|
149
|
-
locks: { held: [] }
|
|
154
|
+
locks: { held: [] },
|
|
150
155
|
},
|
|
151
156
|
feature_b: {
|
|
152
157
|
version: 1,
|
|
153
158
|
status: STATUS.PLANNING,
|
|
154
|
-
locks: { held: [] }
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
)
|
|
159
|
+
locks: { held: [] },
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
),
|
|
158
163
|
);
|
|
159
164
|
const policy = makeLockPolicy(options.policy);
|
|
160
165
|
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'aop-lock-service-'));
|
|
@@ -166,17 +171,21 @@ async function makeLockHarness(options: {
|
|
|
166
171
|
index = clone(nextIndex);
|
|
167
172
|
},
|
|
168
173
|
updateState: async (featureId: string, _expectedVersion: number | null, updater: any) => {
|
|
169
|
-
const existing = states.get(featureId) ?? {
|
|
174
|
+
const existing = states.get(featureId) ?? {
|
|
175
|
+
version: 1,
|
|
176
|
+
status: STATUS.PLANNING,
|
|
177
|
+
locks: { held: [] },
|
|
178
|
+
};
|
|
170
179
|
const updateResult = await updater(clone(existing), '');
|
|
171
180
|
const next = {
|
|
172
181
|
...existing,
|
|
173
|
-
...(updateResult.frontMatter ?? {})
|
|
182
|
+
...(updateResult.frontMatter ?? {}),
|
|
174
183
|
};
|
|
175
184
|
states.set(featureId, next);
|
|
176
185
|
return clone(next);
|
|
177
186
|
},
|
|
178
187
|
statePath: (featureId: string) => path.join(tmpDir, `${featureId}.state.md`),
|
|
179
|
-
getPolicySnapshot: () => policy
|
|
188
|
+
getPolicySnapshot: () => policy,
|
|
180
189
|
});
|
|
181
190
|
|
|
182
191
|
return {
|
|
@@ -192,7 +201,7 @@ async function makeLockHarness(options: {
|
|
|
192
201
|
const filePath = path.join(tmpDir, `${featureId}.state.md`);
|
|
193
202
|
await fs.writeFile(filePath, '---\nfeature_id: test\n---\n', 'utf8');
|
|
194
203
|
},
|
|
195
|
-
cleanup: async () => await fs.rm(tmpDir, { recursive: true, force: true })
|
|
204
|
+
cleanup: async () => await fs.rm(tmpDir, { recursive: true, force: true }),
|
|
196
205
|
};
|
|
197
206
|
}
|
|
198
207
|
|
|
@@ -206,8 +215,8 @@ async function makeReportingHarness() {
|
|
|
206
215
|
merged: ['feature_c'],
|
|
207
216
|
locks: {
|
|
208
217
|
openapi: 'feature_lock',
|
|
209
|
-
db_migrations: null
|
|
210
|
-
}
|
|
218
|
+
db_migrations: null,
|
|
219
|
+
},
|
|
211
220
|
});
|
|
212
221
|
|
|
213
222
|
const ensureState = async (featureId: string, frontMatter: AnyRecord) => {
|
|
@@ -221,34 +230,34 @@ async function makeReportingHarness() {
|
|
|
221
230
|
collectAcceptedPlans: async () => clone(plans),
|
|
222
231
|
getPolicySnapshot: () => ({
|
|
223
232
|
exclusive_areas: ['libs/core'],
|
|
224
|
-
protected_areas: ['agentic/orchestrator']
|
|
233
|
+
protected_areas: ['config/agentic/orchestrator'],
|
|
225
234
|
}),
|
|
226
235
|
readIndex: async () => clone(index),
|
|
227
236
|
statePath: (featureId: string) => path.join(tmpDir, featureId, 'state.md'),
|
|
228
237
|
featureCostPath: (featureId: string) => path.join(tmpDir, featureId, 'cost.json'),
|
|
229
238
|
readState: async (featureId: string) => ({
|
|
230
|
-
frontMatter: clone(stateMap.get(featureId) ?? {})
|
|
239
|
+
frontMatter: clone(stateMap.get(featureId) ?? {}),
|
|
231
240
|
}),
|
|
232
241
|
featureStateGet: async (featureId: string) => ({
|
|
233
242
|
data: {
|
|
234
|
-
front_matter: clone(stateMap.get(featureId) ?? {})
|
|
235
|
-
}
|
|
243
|
+
front_matter: clone(stateMap.get(featureId) ?? {}),
|
|
244
|
+
},
|
|
236
245
|
}),
|
|
237
246
|
repoDiffBundle: async () => ({
|
|
238
247
|
data: {
|
|
239
248
|
diff_stat: '1 file changed',
|
|
240
249
|
touched_files: ['src/example.ts'],
|
|
241
|
-
last_gate_summary: { overall: 'pass' }
|
|
242
|
-
}
|
|
250
|
+
last_gate_summary: { overall: 'pass' },
|
|
251
|
+
},
|
|
243
252
|
}),
|
|
244
253
|
qaTestIndexGet: async () => ({
|
|
245
254
|
data: {
|
|
246
255
|
summary: {
|
|
247
256
|
required_total: 1,
|
|
248
|
-
pending_required: 0
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
})
|
|
257
|
+
pending_required: 0,
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
}),
|
|
252
261
|
});
|
|
253
262
|
|
|
254
263
|
return {
|
|
@@ -258,7 +267,7 @@ async function makeReportingHarness() {
|
|
|
258
267
|
index = clone(nextIndex);
|
|
259
268
|
},
|
|
260
269
|
ensureState,
|
|
261
|
-
cleanup: async () => await fs.rm(tmpDir, { recursive: true, force: true })
|
|
270
|
+
cleanup: async () => await fs.rm(tmpDir, { recursive: true, force: true }),
|
|
262
271
|
};
|
|
263
272
|
}
|
|
264
273
|
|
|
@@ -267,7 +276,7 @@ describe('RunLeaseService', () => {
|
|
|
267
276
|
const freshLease = makeRuntimeSessions({
|
|
268
277
|
run_id: 'run:existing',
|
|
269
278
|
owner_instance_id: 'owner:existing',
|
|
270
|
-
lease_expires_at: new Date(Date.now() + 60_000).toISOString()
|
|
279
|
+
lease_expires_at: new Date(Date.now() + 60_000).toISOString(),
|
|
271
280
|
});
|
|
272
281
|
const { service } = makeRunLeaseHarness(makeIndex({ runtime_sessions: freshLease }));
|
|
273
282
|
|
|
@@ -277,10 +286,10 @@ describe('RunLeaseService', () => {
|
|
|
277
286
|
owner_instance_id: 'owner:new',
|
|
278
287
|
provider: 'provider',
|
|
279
288
|
model: 'model',
|
|
280
|
-
provider_config_ref_hash: ''
|
|
281
|
-
} as any)
|
|
289
|
+
provider_config_ref_hash: '',
|
|
290
|
+
} as any),
|
|
282
291
|
).rejects.toMatchObject({
|
|
283
|
-
normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } }
|
|
292
|
+
normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } },
|
|
284
293
|
});
|
|
285
294
|
|
|
286
295
|
await expect(
|
|
@@ -289,15 +298,15 @@ describe('RunLeaseService', () => {
|
|
|
289
298
|
owner_instance_id: 'owner:new',
|
|
290
299
|
provider: 'provider',
|
|
291
300
|
model: 'model',
|
|
292
|
-
provider_config_ref_hash: ''
|
|
293
|
-
})
|
|
301
|
+
provider_config_ref_hash: '',
|
|
302
|
+
}),
|
|
294
303
|
).rejects.toMatchObject({
|
|
295
304
|
normalizedResponse: {
|
|
296
305
|
error: {
|
|
297
306
|
code: ERROR_CODES.RUN_ALREADY_ACTIVE,
|
|
298
|
-
details: { stale: false }
|
|
299
|
-
}
|
|
300
|
-
}
|
|
307
|
+
details: { stale: false },
|
|
308
|
+
},
|
|
309
|
+
},
|
|
301
310
|
});
|
|
302
311
|
});
|
|
303
312
|
|
|
@@ -306,8 +315,10 @@ describe('RunLeaseService', () => {
|
|
|
306
315
|
run_id: 'run:stale',
|
|
307
316
|
owner_instance_id: 'owner:stale',
|
|
308
317
|
orchestrator_session_id: 'orch:old',
|
|
309
|
-
feature_sessions: {
|
|
310
|
-
|
|
318
|
+
feature_sessions: {
|
|
319
|
+
feature_x: { planner_session_id: 'p', builder_session_id: 'b', qa_session_id: 'q' },
|
|
320
|
+
},
|
|
321
|
+
lease_expires_at: new Date(Date.now() - 60_000).toISOString(),
|
|
311
322
|
});
|
|
312
323
|
const harness = makeRunLeaseHarness(makeIndex({ runtime_sessions: staleLease }));
|
|
313
324
|
|
|
@@ -318,15 +329,15 @@ describe('RunLeaseService', () => {
|
|
|
318
329
|
provider: 'provider',
|
|
319
330
|
model: 'model',
|
|
320
331
|
provider_config_ref_hash: '',
|
|
321
|
-
takeover_stale_run: false
|
|
322
|
-
})
|
|
332
|
+
takeover_stale_run: false,
|
|
333
|
+
}),
|
|
323
334
|
).rejects.toMatchObject({
|
|
324
335
|
normalizedResponse: {
|
|
325
336
|
error: {
|
|
326
337
|
code: ERROR_CODES.RUN_ALREADY_ACTIVE,
|
|
327
|
-
details: { stale: true, requires_takeover: true }
|
|
328
|
-
}
|
|
329
|
-
}
|
|
338
|
+
details: { stale: true, requires_takeover: true },
|
|
339
|
+
},
|
|
340
|
+
},
|
|
330
341
|
});
|
|
331
342
|
|
|
332
343
|
const takeover = await harness.service.acquireRunLease({
|
|
@@ -335,7 +346,7 @@ describe('RunLeaseService', () => {
|
|
|
335
346
|
provider: 'provider',
|
|
336
347
|
model: 'model',
|
|
337
348
|
provider_config_ref_hash: '',
|
|
338
|
-
takeover_stale_run: true
|
|
349
|
+
takeover_stale_run: true,
|
|
339
350
|
});
|
|
340
351
|
|
|
341
352
|
expect(takeover.data.took_over_stale).toBe(true);
|
|
@@ -354,8 +365,8 @@ describe('RunLeaseService', () => {
|
|
|
354
365
|
lease_expires_at: '2026-01-01T00:00:30.000Z',
|
|
355
366
|
feature_sessions: {
|
|
356
367
|
keep_feature: { planner_session_id: 'p1', builder_session_id: 'b1', qa_session_id: 'q1' },
|
|
357
|
-
stale_feature: { planner_session_id: 'p2', builder_session_id: 'b2', qa_session_id: 'q2' }
|
|
358
|
-
}
|
|
368
|
+
stale_feature: { planner_session_id: 'p2', builder_session_id: 'b2', qa_session_id: 'q2' },
|
|
369
|
+
},
|
|
359
370
|
});
|
|
360
371
|
const harness = makeRunLeaseHarness(makeIndex({ runtime_sessions: initial }));
|
|
361
372
|
|
|
@@ -366,7 +377,7 @@ describe('RunLeaseService', () => {
|
|
|
366
377
|
run_id: 'run:owner',
|
|
367
378
|
owner_instance_id: 'owner:owner',
|
|
368
379
|
orchestrator_session_id: 'orch:new',
|
|
369
|
-
increment_epoch: true
|
|
380
|
+
increment_epoch: true,
|
|
370
381
|
});
|
|
371
382
|
|
|
372
383
|
await harness.service.updateFeatureSessionAssignment({
|
|
@@ -375,13 +386,13 @@ describe('RunLeaseService', () => {
|
|
|
375
386
|
feature_id: 'keep_feature',
|
|
376
387
|
planner_session_id: 'p-next',
|
|
377
388
|
builder_session_id: 'b-next',
|
|
378
|
-
qa_session_id: 'q-next'
|
|
389
|
+
qa_session_id: 'q-next',
|
|
379
390
|
});
|
|
380
391
|
|
|
381
392
|
const pruned = await harness.service.pruneFeatureSessionAssignments({
|
|
382
393
|
run_id: 'run:owner',
|
|
383
394
|
owner_instance_id: 'owner:owner',
|
|
384
|
-
active_feature_ids: ['keep_feature']
|
|
395
|
+
active_feature_ids: ['keep_feature'],
|
|
385
396
|
});
|
|
386
397
|
expect(pruned.data.removed).toEqual(['stale_feature']);
|
|
387
398
|
|
|
@@ -395,7 +406,7 @@ describe('RunLeaseService', () => {
|
|
|
395
406
|
run_id: 'run:same',
|
|
396
407
|
owner_instance_id: 'owner:same',
|
|
397
408
|
started_at: '2026-01-01T00:00:00.000Z',
|
|
398
|
-
lease_expires_at: new Date(Date.now() + 60_000).toISOString()
|
|
409
|
+
lease_expires_at: new Date(Date.now() + 60_000).toISOString(),
|
|
399
410
|
});
|
|
400
411
|
const harness = makeRunLeaseHarness(makeIndex({ runtime_sessions: existing }));
|
|
401
412
|
|
|
@@ -404,17 +415,17 @@ describe('RunLeaseService', () => {
|
|
|
404
415
|
owner_instance_id: 'owner:same',
|
|
405
416
|
provider: 'provider',
|
|
406
417
|
model: 'model',
|
|
407
|
-
provider_config_ref_hash: 'hash'
|
|
418
|
+
provider_config_ref_hash: 'hash',
|
|
408
419
|
});
|
|
409
420
|
expect(reused.data.reused_existing_owner).toBe(true);
|
|
410
421
|
expect(reused.data.runtime_sessions.started_at).toBe('2026-01-01T00:00:00.000Z');
|
|
411
422
|
|
|
412
423
|
await expect(harness.service.renewRunLease('', '')).rejects.toMatchObject({
|
|
413
|
-
normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } }
|
|
424
|
+
normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } },
|
|
414
425
|
});
|
|
415
426
|
|
|
416
427
|
await expect(harness.service.renewRunLease('run:other', 'owner:other')).rejects.toMatchObject({
|
|
417
|
-
normalizedResponse: { error: { code: ERROR_CODES.RUN_LEASE_NOT_OWNED } }
|
|
428
|
+
normalizedResponse: { error: { code: ERROR_CODES.RUN_LEASE_NOT_OWNED } },
|
|
418
429
|
});
|
|
419
430
|
|
|
420
431
|
const notReleased = await harness.service.releaseRunLease('run:other', 'owner:other');
|
|
@@ -424,10 +435,10 @@ describe('RunLeaseService', () => {
|
|
|
424
435
|
harness.service.updateOrchestratorSession({
|
|
425
436
|
run_id: '',
|
|
426
437
|
owner_instance_id: 'owner:same',
|
|
427
|
-
orchestrator_session_id: ''
|
|
428
|
-
} as any)
|
|
438
|
+
orchestrator_session_id: '',
|
|
439
|
+
} as any),
|
|
429
440
|
).rejects.toMatchObject({
|
|
430
|
-
normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } }
|
|
441
|
+
normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } },
|
|
431
442
|
});
|
|
432
443
|
|
|
433
444
|
await expect(
|
|
@@ -437,20 +448,20 @@ describe('RunLeaseService', () => {
|
|
|
437
448
|
feature_id: 'feature_a',
|
|
438
449
|
planner_session_id: 'planner',
|
|
439
450
|
builder_session_id: 'builder',
|
|
440
|
-
qa_session_id: 'qa'
|
|
441
|
-
})
|
|
451
|
+
qa_session_id: 'qa',
|
|
452
|
+
}),
|
|
442
453
|
).rejects.toMatchObject({
|
|
443
|
-
normalizedResponse: { error: { code: ERROR_CODES.RUN_LEASE_NOT_OWNED } }
|
|
454
|
+
normalizedResponse: { error: { code: ERROR_CODES.RUN_LEASE_NOT_OWNED } },
|
|
444
455
|
});
|
|
445
456
|
|
|
446
457
|
await expect(
|
|
447
458
|
harness.service.pruneFeatureSessionAssignments({
|
|
448
459
|
run_id: 'run:other',
|
|
449
460
|
owner_instance_id: 'owner:other',
|
|
450
|
-
active_feature_ids: []
|
|
451
|
-
})
|
|
461
|
+
active_feature_ids: [],
|
|
462
|
+
}),
|
|
452
463
|
).rejects.toMatchObject({
|
|
453
|
-
normalizedResponse: { error: { code: ERROR_CODES.RUN_LEASE_NOT_OWNED } }
|
|
464
|
+
normalizedResponse: { error: { code: ERROR_CODES.RUN_LEASE_NOT_OWNED } },
|
|
454
465
|
});
|
|
455
466
|
});
|
|
456
467
|
});
|
|
@@ -472,11 +483,11 @@ describe('LockService', () => {
|
|
|
472
483
|
cleanups.push(harness.cleanup);
|
|
473
484
|
|
|
474
485
|
await expect(harness.service.locksAcquire('missing', 'feature_a')).rejects.toMatchObject({
|
|
475
|
-
normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } }
|
|
486
|
+
normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } },
|
|
476
487
|
});
|
|
477
488
|
|
|
478
489
|
await expect(harness.service.locksAcquire('openapi', null)).rejects.toMatchObject({
|
|
479
|
-
normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } }
|
|
490
|
+
normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } },
|
|
480
491
|
});
|
|
481
492
|
|
|
482
493
|
const acquired = await harness.service.locksAcquire('openapi', 'feature_a');
|
|
@@ -484,7 +495,7 @@ describe('LockService', () => {
|
|
|
484
495
|
expect(harness.getState('feature_a').locks.held).toContain('openapi');
|
|
485
496
|
|
|
486
497
|
await expect(harness.service.locksRelease('openapi', 'feature_b')).rejects.toMatchObject({
|
|
487
|
-
normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } }
|
|
498
|
+
normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } },
|
|
488
499
|
});
|
|
489
500
|
|
|
490
501
|
const released = await harness.service.locksRelease('openapi', 'feature_a');
|
|
@@ -497,29 +508,29 @@ describe('LockService', () => {
|
|
|
497
508
|
active: ['feature_a'],
|
|
498
509
|
locks: {
|
|
499
510
|
openapi: 'feature_old',
|
|
500
|
-
db_migrations: 'feature_b'
|
|
511
|
+
db_migrations: 'feature_b',
|
|
501
512
|
},
|
|
502
513
|
lock_leases: {
|
|
503
514
|
openapi: {
|
|
504
515
|
holder: 'feature_old',
|
|
505
516
|
lease_id: 'lease-old',
|
|
506
|
-
expires_at: new Date(Date.now() - 60_000).toISOString()
|
|
517
|
+
expires_at: new Date(Date.now() - 60_000).toISOString(),
|
|
507
518
|
},
|
|
508
519
|
db_migrations: {
|
|
509
520
|
holder: 'feature_b',
|
|
510
521
|
lease_id: 'lease-b',
|
|
511
|
-
expires_at: new Date(Date.now() + 60_000).toISOString()
|
|
512
|
-
}
|
|
513
|
-
}
|
|
522
|
+
expires_at: new Date(Date.now() + 60_000).toISOString(),
|
|
523
|
+
},
|
|
524
|
+
},
|
|
514
525
|
});
|
|
515
526
|
const harness = await makeLockHarness({
|
|
516
527
|
index: staleIndex,
|
|
517
528
|
policy: {
|
|
518
529
|
locks: {
|
|
519
530
|
acquire_behavior: 'wait',
|
|
520
|
-
default_wait_timeout_seconds: 1
|
|
521
|
-
}
|
|
522
|
-
}
|
|
531
|
+
default_wait_timeout_seconds: 1,
|
|
532
|
+
},
|
|
533
|
+
},
|
|
523
534
|
});
|
|
524
535
|
cleanups.push(harness.cleanup);
|
|
525
536
|
|
|
@@ -537,7 +548,7 @@ describe('LockService', () => {
|
|
|
537
548
|
expiredSnapshot.lock_leases.openapi = {
|
|
538
549
|
holder: 'feature_a',
|
|
539
550
|
lease_id: 'lease-stale',
|
|
540
|
-
expires_at: new Date(Date.now() - 60_000).toISOString()
|
|
551
|
+
expires_at: new Date(Date.now() - 60_000).toISOString(),
|
|
541
552
|
};
|
|
542
553
|
harness.setIndex(expiredSnapshot);
|
|
543
554
|
|
|
@@ -552,28 +563,28 @@ describe('LockService', () => {
|
|
|
552
563
|
const harness = await makeLockHarness({
|
|
553
564
|
policy: {
|
|
554
565
|
locks: {
|
|
555
|
-
acquire_behavior: 'fail'
|
|
556
|
-
}
|
|
566
|
+
acquire_behavior: 'fail',
|
|
567
|
+
},
|
|
557
568
|
},
|
|
558
569
|
index: makeIndex({
|
|
559
570
|
locks: {
|
|
560
571
|
openapi: 'feature_other',
|
|
561
|
-
db_migrations: null
|
|
572
|
+
db_migrations: null,
|
|
562
573
|
},
|
|
563
574
|
lock_leases: {
|
|
564
575
|
openapi: {
|
|
565
576
|
holder: 'feature_other',
|
|
566
577
|
lease_id: 'lease-1',
|
|
567
|
-
expires_at: new Date(Date.now() + 60_000).toISOString()
|
|
578
|
+
expires_at: new Date(Date.now() + 60_000).toISOString(),
|
|
568
579
|
},
|
|
569
|
-
db_migrations: null
|
|
570
|
-
}
|
|
571
|
-
})
|
|
580
|
+
db_migrations: null,
|
|
581
|
+
},
|
|
582
|
+
}),
|
|
572
583
|
});
|
|
573
584
|
cleanups.push(harness.cleanup);
|
|
574
585
|
|
|
575
586
|
await expect(harness.service.locksAcquire('openapi', 'feature_a')).rejects.toMatchObject({
|
|
576
|
-
normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } }
|
|
587
|
+
normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } },
|
|
577
588
|
});
|
|
578
589
|
});
|
|
579
590
|
|
|
@@ -582,38 +593,38 @@ describe('LockService', () => {
|
|
|
582
593
|
policy: {
|
|
583
594
|
locks: {
|
|
584
595
|
acquire_behavior: undefined,
|
|
585
|
-
default_wait_timeout_seconds: 0
|
|
586
|
-
}
|
|
596
|
+
default_wait_timeout_seconds: 0,
|
|
597
|
+
},
|
|
587
598
|
},
|
|
588
599
|
states: {
|
|
589
600
|
feature_a: {
|
|
590
601
|
version: 1,
|
|
591
|
-
status: STATUS.PLANNING
|
|
592
|
-
}
|
|
602
|
+
status: STATUS.PLANNING,
|
|
603
|
+
},
|
|
593
604
|
},
|
|
594
605
|
index: makeIndex({
|
|
595
606
|
locks: {
|
|
596
607
|
openapi: 'feature_other',
|
|
597
|
-
db_migrations: null
|
|
608
|
+
db_migrations: null,
|
|
598
609
|
},
|
|
599
610
|
lock_leases: {
|
|
600
611
|
openapi: {
|
|
601
612
|
holder: 'feature_other',
|
|
602
613
|
lease_id: 'lease-wait',
|
|
603
|
-
expires_at: new Date(Date.now() + 60_000).toISOString()
|
|
614
|
+
expires_at: new Date(Date.now() + 60_000).toISOString(),
|
|
604
615
|
},
|
|
605
|
-
db_migrations: null
|
|
606
|
-
}
|
|
607
|
-
})
|
|
616
|
+
db_migrations: null,
|
|
617
|
+
},
|
|
618
|
+
}),
|
|
608
619
|
});
|
|
609
620
|
cleanups.push(harness.cleanup);
|
|
610
621
|
|
|
611
622
|
await expect(harness.service.locksAcquire('openapi', 'feature_a', 0)).rejects.toMatchObject({
|
|
612
|
-
normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } }
|
|
623
|
+
normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } },
|
|
613
624
|
});
|
|
614
625
|
|
|
615
626
|
await expect(harness.service.locksRelease(null, null)).rejects.toMatchObject({
|
|
616
|
-
normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } }
|
|
627
|
+
normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } },
|
|
617
628
|
});
|
|
618
629
|
|
|
619
630
|
await harness.service.locksRelease('db_migrations', 'feature_a');
|
|
@@ -642,14 +653,14 @@ describe('ReportingService', () => {
|
|
|
642
653
|
feature_id: 'feature_a',
|
|
643
654
|
files: { modify: ['src/shared.ts'] },
|
|
644
655
|
allowed_areas: ['libs/core'],
|
|
645
|
-
contracts: { openapi: 'none', events: 'none', db: 'none' }
|
|
656
|
+
contracts: { openapi: 'none', events: 'none', db: 'none' },
|
|
646
657
|
},
|
|
647
658
|
{
|
|
648
659
|
feature_id: 'feature_b',
|
|
649
660
|
files: { create: ['src/shared.ts'] },
|
|
650
661
|
allowed_areas: ['libs/core/module'],
|
|
651
|
-
contracts: { openapi: 'none', events: 'none', db: 'none' }
|
|
652
|
-
}
|
|
662
|
+
contracts: { openapi: 'none', events: 'none', db: 'none' },
|
|
663
|
+
},
|
|
653
664
|
);
|
|
654
665
|
|
|
655
666
|
await harness.ensureState('feature_a', {
|
|
@@ -657,14 +668,14 @@ describe('ReportingService', () => {
|
|
|
657
668
|
locks: { held: ['openapi'] },
|
|
658
669
|
gate_profile: 'default',
|
|
659
670
|
gates: { plan: 'pass' },
|
|
660
|
-
last_updated: '2026-01-01T00:00:00.000Z'
|
|
671
|
+
last_updated: '2026-01-01T00:00:00.000Z',
|
|
661
672
|
});
|
|
662
673
|
await harness.ensureState('feature_lock', {
|
|
663
674
|
status: STATUS.BLOCKED,
|
|
664
675
|
locks: { held: [] },
|
|
665
676
|
gate_profile: 'default',
|
|
666
677
|
gates: { plan: 'na' },
|
|
667
|
-
last_updated: '2026-01-02T00:00:00.000Z'
|
|
678
|
+
last_updated: '2026-01-02T00:00:00.000Z',
|
|
668
679
|
});
|
|
669
680
|
|
|
670
681
|
const collisions = await harness.service.collisionsScan();
|
|
@@ -673,7 +684,10 @@ describe('ReportingService', () => {
|
|
|
673
684
|
expect(typeof collisions.data.collisions[0].fingerprint).toBe('string');
|
|
674
685
|
|
|
675
686
|
const dashboard = await harness.service.reportDashboard();
|
|
676
|
-
expect(dashboard.data.features.map((item: AnyRecord) => item.feature_id)).toEqual([
|
|
687
|
+
expect(dashboard.data.features.map((item: AnyRecord) => item.feature_id)).toEqual([
|
|
688
|
+
'feature_a',
|
|
689
|
+
'feature_lock',
|
|
690
|
+
]);
|
|
677
691
|
});
|
|
678
692
|
|
|
679
693
|
it('aggregates feature summary from state, diff bundle, and qa index', async () => {
|
|
@@ -682,14 +696,14 @@ describe('ReportingService', () => {
|
|
|
682
696
|
await harness.ensureState('feature_summary', {
|
|
683
697
|
status: STATUS.QA,
|
|
684
698
|
gates: { full: 'pass' },
|
|
685
|
-
locks: { held: [] }
|
|
699
|
+
locks: { held: [] },
|
|
686
700
|
});
|
|
687
701
|
harness.setIndex(
|
|
688
702
|
makeIndex({
|
|
689
703
|
active: ['feature_summary'],
|
|
690
704
|
blocked: [],
|
|
691
|
-
merged: []
|
|
692
|
-
})
|
|
705
|
+
merged: [],
|
|
706
|
+
}),
|
|
693
707
|
);
|
|
694
708
|
|
|
695
709
|
const summary = await harness.service.reportFeatureSummary('feature_summary');
|
|
@@ -706,7 +720,9 @@ describe('ReportingService worktree_branch coverage', () => {
|
|
|
706
720
|
afterEach(async () => {
|
|
707
721
|
while (cleanups.length > 0) {
|
|
708
722
|
const cleanup = cleanups.pop();
|
|
709
|
-
if (cleanup) {
|
|
723
|
+
if (cleanup) {
|
|
724
|
+
await cleanup();
|
|
725
|
+
}
|
|
710
726
|
}
|
|
711
727
|
});
|
|
712
728
|
|
|
@@ -720,7 +736,7 @@ describe('ReportingService worktree_branch coverage', () => {
|
|
|
720
736
|
locks: { held: [] },
|
|
721
737
|
gate_profile: 'default',
|
|
722
738
|
gates: { plan: 'pass' },
|
|
723
|
-
last_updated: '2026-01-01T00:00:00.000Z'
|
|
739
|
+
last_updated: '2026-01-01T00:00:00.000Z',
|
|
724
740
|
});
|
|
725
741
|
|
|
726
742
|
const dashboard = await harness.service.reportDashboard();
|
|
@@ -735,7 +751,9 @@ describe('LockService sleep branch coverage', () => {
|
|
|
735
751
|
afterEach(async () => {
|
|
736
752
|
while (cleanups.length > 0) {
|
|
737
753
|
const cleanup = cleanups.pop();
|
|
738
|
-
if (cleanup) {
|
|
754
|
+
if (cleanup) {
|
|
755
|
+
await cleanup();
|
|
756
|
+
}
|
|
739
757
|
}
|
|
740
758
|
vi.useRealTimers();
|
|
741
759
|
});
|
|
@@ -752,12 +770,12 @@ describe('LockService sleep branch coverage', () => {
|
|
|
752
770
|
initial_ms: 0,
|
|
753
771
|
max_ms: 0,
|
|
754
772
|
multiplier: 1,
|
|
755
|
-
jitter_ms: 0
|
|
756
|
-
}
|
|
757
|
-
}
|
|
773
|
+
jitter_ms: 0,
|
|
774
|
+
},
|
|
775
|
+
},
|
|
758
776
|
},
|
|
759
777
|
states: {
|
|
760
|
-
feature_a: { version: 1, status: STATUS.PLANNING, locks: { held: [] } }
|
|
778
|
+
feature_a: { version: 1, status: STATUS.PLANNING, locks: { held: [] } },
|
|
761
779
|
},
|
|
762
780
|
index: makeIndex({
|
|
763
781
|
locks: { openapi: 'feature_other', db_migrations: null },
|
|
@@ -765,11 +783,11 @@ describe('LockService sleep branch coverage', () => {
|
|
|
765
783
|
openapi: {
|
|
766
784
|
holder: 'feature_other',
|
|
767
785
|
lease_id: 'lease-sleep-test',
|
|
768
|
-
expires_at: new Date(Date.now() + 60_000).toISOString()
|
|
786
|
+
expires_at: new Date(Date.now() + 60_000).toISOString(),
|
|
769
787
|
},
|
|
770
|
-
db_migrations: null
|
|
771
|
-
}
|
|
772
|
-
})
|
|
788
|
+
db_migrations: null,
|
|
789
|
+
},
|
|
790
|
+
}),
|
|
773
791
|
});
|
|
774
792
|
cleanups.push(harness.cleanup);
|
|
775
793
|
|
|
@@ -780,7 +798,7 @@ describe('LockService sleep branch coverage', () => {
|
|
|
780
798
|
vi.advanceTimersByTime(15_000);
|
|
781
799
|
|
|
782
800
|
await expect(acquirePromise).rejects.toMatchObject({
|
|
783
|
-
normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } }
|
|
801
|
+
normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } },
|
|
784
802
|
});
|
|
785
803
|
});
|
|
786
804
|
});
|