@deksden-com/dd-flow-cli 0.9.0-beta.14 → 0.9.0-beta.140
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/CHANGELOG.md +733 -0
- package/README.md +143 -1
- package/dist/build-info.json +8 -8
- package/dist/cli/argument-values.js +38 -0
- package/dist/cli/command-inputs.js +376 -0
- package/dist/cli/command-metadata.js +197 -0
- package/dist/cli/command-option-descriptions.js +191 -0
- package/dist/cli/completion-cli.js +70 -0
- package/dist/cli/completion.js +57 -0
- package/dist/cli/error-output.js +52 -0
- package/dist/cli/executor-onboarding.js +76 -0
- package/dist/cli/flows.js +29 -0
- package/dist/cli/harnesses.js +84 -0
- package/dist/cli/help.js +328 -18
- package/dist/cli/hook-ingress.js +78 -0
- package/dist/cli/input-preparation.js +165 -0
- package/dist/cli/memory-flow-admission.js +44 -0
- package/dist/cli/memory-init-invocation.js +78 -0
- package/dist/cli/memory-init.js +240 -0
- package/dist/cli/memory-storage-admission.js +53 -0
- package/dist/cli/models.js +39 -0
- package/dist/cli/native-hook-ingress.js +80 -0
- package/dist/cli/operator-profiles.js +61 -0
- package/dist/cli/output-options.js +35 -0
- package/dist/cli/response-file.js +71 -0
- package/dist/cli/run-cli.js +1689 -545
- package/dist/cli/runtime-maintenance-diagnostics.js +46 -0
- package/dist/cli/runtime-maintenance-ingress.js +52 -0
- package/dist/cli/runtime-process.js +153 -0
- package/dist/cli/setup.js +149 -0
- package/dist/cli.js +71 -2
- package/dist/domain/stage-catalog.js +1 -1
- package/dist/domain/stage-handler-identities.js +20 -0
- package/dist/harness-runtime/DD-ZCODE.md +112 -0
- package/dist/harness-runtime/OPENCODE-LICENSE.txt +24 -0
- package/dist/harness-runtime/bin/dd-agy.mjs +56 -0
- package/dist/harness-runtime/bin/dd-codex.mjs +27 -0
- package/dist/harness-runtime/bin/dd-droid.mjs +34 -0
- package/dist/harness-runtime/bin/dd-grok.mjs +40 -0
- package/dist/harness-runtime/bin/dd-opencode.mjs +22 -0
- package/dist/harness-runtime/bin/dd-zcode.mjs +87 -0
- package/dist/harness-runtime/lib/adapter-timeouts.d.mts +5 -0
- package/dist/harness-runtime/lib/adapter-timeouts.mjs +34 -0
- package/dist/harness-runtime/lib/agy-hooks.d.mts +1 -0
- package/dist/harness-runtime/lib/agy-hooks.mjs +9 -0
- package/dist/harness-runtime/lib/daemon-observation.d.mts +2 -0
- package/dist/harness-runtime/lib/daemon-observation.mjs +163 -0
- package/dist/harness-runtime/lib/daemon-operations.d.mts +1 -0
- package/dist/harness-runtime/lib/daemon-operations.mjs +371 -0
- package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +6 -0
- package/dist/harness-runtime/lib/dd-agy-daemon.mjs +724 -0
- package/dist/harness-runtime/lib/dd-agy.mjs +70 -0
- package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-codex-daemon.mjs +196 -0
- package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-codex.mjs +817 -0
- package/dist/harness-runtime/lib/dd-droid-daemon.mjs +129 -0
- package/dist/harness-runtime/lib/dd-droid.mjs +584 -0
- package/dist/harness-runtime/lib/dd-grok-daemon.mjs +498 -0
- package/dist/harness-runtime/lib/dd-grok.mjs +177 -0
- package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +507 -0
- package/dist/harness-runtime/lib/dd-opencode.mjs +354 -0
- package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +750 -0
- package/dist/harness-runtime/lib/dd-zcode.mjs +1145 -0
- package/dist/harness-runtime/lib/delegation-instructions.d.mts +14 -0
- package/dist/harness-runtime/lib/delegation-instructions.mjs +157 -0
- package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
- package/dist/harness-runtime/lib/driver-recovery.mjs +139 -0
- package/dist/harness-runtime/lib/droid-observation.mjs +66 -0
- package/dist/harness-runtime/lib/lease-renewal.d.mts +8 -0
- package/dist/harness-runtime/lib/lease-renewal.mjs +37 -0
- package/dist/harness-runtime/lib/lifecycle-command.d.mts +20 -0
- package/dist/harness-runtime/lib/lifecycle-command.mjs +273 -0
- package/dist/harness-runtime/lib/lifecycle-contract.d.mts +10 -0
- package/dist/harness-runtime/lib/lifecycle-contract.mjs +19 -0
- package/dist/harness-runtime/lib/managed-daemon.d.mts +13 -0
- package/dist/harness-runtime/lib/managed-daemon.mjs +654 -0
- package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
- package/dist/harness-runtime/lib/model-observations.mjs +101 -0
- package/dist/harness-runtime/lib/native-children.d.mts +16 -0
- package/dist/harness-runtime/lib/native-children.mjs +113 -0
- package/dist/harness-runtime/lib/native-hook-command.d.mts +7 -0
- package/dist/harness-runtime/lib/native-hook-command.mjs +251 -0
- package/dist/harness-runtime/lib/native-request-proof.d.mts +2 -0
- package/dist/harness-runtime/lib/native-request-proof.mjs +65 -0
- package/dist/harness-runtime/lib/native-streams.mjs +45 -0
- package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
- package/dist/harness-runtime/lib/observation-clock.mjs +92 -0
- package/dist/harness-runtime/lib/opencode-plugin.mjs +85 -0
- package/dist/harness-runtime/lib/operation-context.mjs +5 -0
- package/dist/harness-runtime/lib/operation-errors.d.mts +14 -0
- package/dist/harness-runtime/lib/operation-errors.mjs +116 -0
- package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
- package/dist/harness-runtime/lib/operation-progress.mjs +114 -0
- package/dist/harness-runtime/lib/process-json.d.mts +5 -0
- package/dist/harness-runtime/lib/process-json.mjs +201 -0
- package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
- package/dist/harness-runtime/lib/provider-overload-policy.d.mts +13 -0
- package/dist/harness-runtime/lib/provider-overload-policy.mjs +138 -0
- package/dist/harness-runtime/lib/runner-events.mjs +200 -0
- package/dist/harness-runtime/lib/runner-lock.mjs +42 -0
- package/dist/harness-runtime/lib/session-settlement.mjs +30 -0
- package/dist/harness-runtime/lib/setup-progress.d.mts +9 -0
- package/dist/harness-runtime/lib/setup-progress.mjs +51 -0
- package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
- package/dist/harness-runtime/lib/tool-observations.mjs +228 -0
- package/dist/harness-runtime/lib/zcode-usage.mjs +55 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-1y4a697q.js +81 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-2ny4vxct.js +92 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-6mptkzbc.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-7x67cf1q.js +52 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9rqn6x4v.js +16 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9vdz0zwn.js +1661 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ecs5ftka.js +1466 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-frbwqjmf.js +145 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gne7h7mq.js +50 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gx9wnkzr.js +105 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-m2eywc8w.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-nwcpakzx.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-q4g3afnw.js +623 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-qav6mfdz.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-sxt88q69.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-t1xa31vm.js +39 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ve4aws36.js +103 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vmytr4q8.js +4 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vt9jbch8.js +36 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vyas3vgt.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-wjyeq25y.js +30 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-xgnj2w4v.js +20 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-y2etg5bs.js +9 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ydhz1zrh.js +238 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-z6qdwcsf.js +62 -0
- package/dist/harness-runtime/vendor/opencode-client/contract.d.ts +1 -0
- package/dist/harness-runtime/vendor/opencode-client/contract.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api/api.d.ts +2806 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api/api.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api.d.ts +4 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/client.d.ts +2530 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/client.js +15 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.d.ts +7 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.js +6 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.d.ts +2529 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.js +8 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.d.ts +2 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/index.d.ts +35 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/index.js +75 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/rpc.d.ts +20 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/rpc.js +11 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/service.d.ts +90 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/service.js +187 -0
- package/dist/harness-runtime/vendor/opencode-client/package.json +84 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/api.d.ts +21 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/api.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/client.d.ts +252 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/client.js +14 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.d.ts +8 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.js +6 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.d.ts +259 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.js +7 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.d.ts +3 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.js +79 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.d.ts +8932 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.js +70 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/index.d.ts +6 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/index.js +83 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/rpc.d.ts +32 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/rpc.js +7 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/service.d.ts +24 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/service.js +187 -0
- package/dist/harness-runtime/vendor/opencode-client/pty-handoff.d.ts +12 -0
- package/dist/harness-runtime/vendor/opencode-client/pty-handoff.js +14 -0
- package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.d.ts +20 -0
- package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.js +14 -0
- package/dist/harness-runtime/vendor/opencode-client/service-contender.d.ts +37 -0
- package/dist/harness-runtime/vendor/opencode-client/service-contender.js +10 -0
- package/dist/harness-runtime/vendor/opencode-client/service-probe.d.ts +70 -0
- package/dist/harness-runtime/vendor/opencode-client/service-probe.js +16 -0
- package/dist/harness-runtime/vendor/opencode-client/service-timing.d.ts +12 -0
- package/dist/harness-runtime/vendor/opencode-client/service-timing.js +10 -0
- package/dist/harness-runtime/vendor/opencode-client/service-version.d.ts +2 -0
- package/dist/harness-runtime/vendor/opencode-client/service-version.js +6 -0
- package/dist/harness-runtime/vendor/opencode-client/service.d.ts +52 -0
- package/dist/harness-runtime/vendor/opencode-client/service.js +1 -0
- package/dist/harness-runtime/vendor/opencode-client/shared-events.d.ts +11 -0
- package/dist/harness-runtime/vendor/opencode-client/shared-events.js +8 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/connection.d.ts +37 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/connection.js +10 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/data.d.ts +211 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/data.js +18 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/index.d.ts +3 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/index.js +32 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/pty.d.ts +22 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/pty.js +8 -0
- package/dist/harness-runtime/vendor/opencode-plugin.mjs +3 -0
- package/dist/protocol/local-files.js +18 -9
- package/dist/runtime/context.js +8 -4
- package/dist/schemas/agent-profile.schema.json +1 -1
- package/dist/schemas/code-review-result.schema.json +1 -1
- package/dist/schemas/code-verification.schema.json +7 -5
- package/dist/schemas/code-work-batch.schema.json +2 -2
- package/dist/schemas/discovery-result.schema.json +184 -0
- package/dist/schemas/execution-bundle.schema.json +205 -0
- package/dist/schemas/execution-settings.schema.json +162 -0
- package/dist/schemas/flow-descriptor.schema.json +54 -0
- package/dist/schemas/flow-run.schema.json +28 -0
- package/dist/schemas/harness-catalog.schema.json +80 -0
- package/dist/schemas/mb-init-compose-result.schema.json +457 -0
- package/dist/schemas/mb-init-discover-result.schema.json +500 -0
- package/dist/schemas/mb-init-finish-result.schema.json +422 -0
- package/dist/schemas/mb-init-preflight-result.schema.json +367 -0
- package/dist/schemas/mb-init-review-result.schema.json +396 -0
- package/dist/schemas/mb-init-verify-result.schema.json +391 -0
- package/dist/schemas/memory-bootstrap-receipt-v2.schema.json +67 -0
- package/dist/schemas/memory-bootstrap-receipt.schema.json +354 -0
- package/dist/schemas/memory-composition-work-result.schema.json +38 -0
- package/dist/schemas/memory-repair-work-result.schema.json +49 -0
- package/dist/schemas/memory-review-correction-plan.schema.json +30 -0
- package/dist/schemas/memory-review-work-result.schema.json +43 -0
- package/dist/schemas/model-catalog.schema.json +153 -0
- package/dist/schemas/plan-review-decision.schema.json +3 -3
- package/dist/schemas/plan-review-result.schema.json +2 -2
- package/dist/schemas/profile-settings.schema.json +122 -0
- package/dist/schemas/release-manifest.schema.json +291 -0
- package/dist/schemas/run-control-receipt.schema.json +118 -0
- package/dist/schemas/run-control-request.schema.json +36 -0
- package/dist/schemas/run-engine-binding.schema.json +1 -1
- package/dist/schemas/vnext-protocol-plan.schema.json +2 -2
- package/dist/services/branch-context.js +3 -3
- package/dist/services/canon.js +11 -8
- package/dist/services/check-runner-evidence.js +168 -0
- package/dist/services/cleanup.js +133 -40
- package/dist/services/cli-operation-classifier.js +25 -62
- package/dist/services/cli-upgrade-allowlist.js +27 -0
- package/dist/services/code-checks.js +1156 -107
- package/dist/services/codex-hook-delivery.js +32 -0
- package/dist/services/command-context.js +80 -0
- package/dist/services/compatibility-preflight.js +13 -3
- package/dist/services/config.js +11 -8
- package/dist/services/continuation-outcome.js +20 -0
- package/dist/services/controller-child-capacity.js +13 -0
- package/dist/services/controller-child-observer.js +115 -0
- package/dist/services/controller-execution.js +88 -0
- package/dist/services/controller-fanout.js +202 -0
- package/dist/services/dashboard.js +143 -58
- package/dist/services/descriptor-coordinator-session.js +35 -0
- package/dist/services/descriptor-root-work.js +53 -0
- package/dist/services/descriptor-run-settlement.js +105 -0
- package/dist/services/descriptor-run-start.js +449 -0
- package/dist/services/descriptor-stage-coordinator.js +197 -0
- package/dist/services/descriptor-stage-settlement.js +222 -0
- package/dist/services/descriptor-stage-start.js +139 -0
- package/dist/services/discovery/agy-discovery.js +2 -0
- package/dist/services/discovery/codex-discovery.js +2 -0
- package/dist/services/discovery/droid-discovery.js +2 -0
- package/dist/services/discovery/grok-discovery.js +2 -0
- package/dist/services/discovery/opencode-discovery.js +2 -0
- package/dist/services/discovery/static.js +31 -0
- package/dist/services/discovery/zcode-discovery.js +2 -0
- package/dist/services/engines.js +294 -153
- package/dist/services/eval-snapshots.js +1215 -116
- package/dist/services/execution-bundles.js +263 -0
- package/dist/services/execution-policy.js +185 -0
- package/dist/services/executor-onboarding.js +56 -0
- package/dist/services/external-work-launch.js +308 -0
- package/dist/services/flow-catalog.js +21 -0
- package/dist/services/flow-descriptors.js +82 -0
- package/dist/services/frozen-engine.js +250 -0
- package/dist/services/generic-execution.js +164 -0
- package/dist/services/harness-adapter.js +355 -36
- package/dist/services/harness-config.js +2 -0
- package/dist/services/harness-discovery.js +29 -0
- package/dist/services/harness-doctor.js +75 -0
- package/dist/services/harness-probe-effects.js +51 -0
- package/dist/services/harness-version-probe.js +100 -0
- package/dist/services/hooks.js +771 -325
- package/dist/services/hybrid-contracts.js +483 -0
- package/dist/services/ids.js +29 -1
- package/dist/services/installation-lock.js +95 -0
- package/dist/services/installed-flow-source.js +183 -0
- package/dist/services/lanes.js +78 -65
- package/dist/services/lifecycle-command.js +1 -288
- package/dist/services/lifecycle-contract.js +1 -0
- package/dist/services/lifecycle-invocations.js +2007 -0
- package/dist/services/managed-daemon-binding.js +38 -0
- package/dist/services/managed-lease-monitor.js +133 -0
- package/dist/services/managed-processes.js +475 -55
- package/dist/services/memory-accepted-composition.js +77 -0
- package/dist/services/memory-baseline-preservation.js +65 -0
- package/dist/services/memory-completed-correction-wave.js +320 -0
- package/dist/services/memory-compose-handler.js +258 -0
- package/dist/services/memory-composition-acceptance.js +199 -0
- package/dist/services/memory-composition-graph.js +134 -0
- package/dist/services/memory-composition-registration.js +146 -0
- package/dist/services/memory-composition-work-custody.js +151 -0
- package/dist/services/memory-composition-work-results.js +96 -0
- package/dist/services/memory-corrected-review-acceptance.js +129 -0
- package/dist/services/memory-corrected-review-batch.js +30 -0
- package/dist/services/memory-corrected-review-findings.js +106 -0
- package/dist/services/memory-corrected-review-inputs.js +210 -0
- package/dist/services/memory-corrected-review-projection.js +78 -0
- package/dist/services/memory-corrected-review-receipt.js +170 -0
- package/dist/services/memory-corrected-review-registration.js +191 -0
- package/dist/services/memory-correction-check-receipt.js +219 -0
- package/dist/services/memory-correction-input-owner.js +6 -0
- package/dist/services/memory-discover-handler.js +104 -0
- package/dist/services/memory-finish-evidence.js +435 -0
- package/dist/services/memory-finish-handler.js +215 -0
- package/dist/services/memory-finish-integration.js +280 -0
- package/dist/services/memory-finish-readiness.js +122 -0
- package/dist/services/memory-git-integration.js +151 -0
- package/dist/services/memory-historical-corrected-review.js +206 -0
- package/dist/services/memory-historical-original-review.js +130 -0
- package/dist/services/memory-historical-repair-registration.js +99 -0
- package/dist/services/memory-historical-second-review.js +128 -0
- package/dist/services/memory-init-bootstrap-readiness.js +210 -0
- package/dist/services/memory-init-contexts.js +89 -0
- package/dist/services/memory-init-controller-start.js +84 -0
- package/dist/services/memory-init-engine-release.js +223 -0
- package/dist/services/memory-init-git-policy.js +136 -0
- package/dist/services/memory-init-lint-capability.js +185 -0
- package/dist/services/memory-init-native-capacity.js +296 -0
- package/dist/services/memory-init-preflight.js +330 -0
- package/dist/services/memory-init-project-bootstrap.js +599 -0
- package/dist/services/memory-init-request-candidate.js +157 -0
- package/dist/services/memory-init-request-input.js +66 -0
- package/dist/services/memory-init-resource-storage.js +125 -0
- package/dist/services/memory-init-run-allocation.js +81 -0
- package/dist/services/memory-init-run-bundle.js +98 -0
- package/dist/services/memory-init-start.js +181 -0
- package/dist/services/memory-init-startup-custody.js +80 -0
- package/dist/services/memory-init-startup-input.js +240 -0
- package/dist/services/memory-init-storage.js +81 -0
- package/dist/services/memory-init-stores.js +359 -0
- package/dist/services/memory-init-worktrunk-capability.js +178 -0
- package/dist/services/memory-layer-publication.js +611 -0
- package/dist/services/memory-layer.js +156 -0
- package/dist/services/memory-lint-config.js +85 -0
- package/dist/services/memory-native-review-copy.js +165 -0
- package/dist/services/memory-normal-flow-entry.js +75 -0
- package/dist/services/memory-ordinary-defaults.js +112 -0
- package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
- package/dist/services/memory-preflight-handler.js +259 -0
- package/dist/services/memory-repair-current-view.js +299 -0
- package/dist/services/memory-repair-document-delta.js +451 -0
- package/dist/services/memory-repair-history.js +491 -0
- package/dist/services/memory-repair-physical-binding.js +312 -0
- package/dist/services/memory-repair-publication-files.js +152 -0
- package/dist/services/memory-repair-publication-intent.js +27 -0
- package/dist/services/memory-repair-publication-plan.js +160 -0
- package/dist/services/memory-repair-publication-source.js +225 -0
- package/dist/services/memory-repair-publication.js +794 -0
- package/dist/services/memory-repair-registration.js +239 -0
- package/dist/services/memory-repair-work-baseline.js +413 -0
- package/dist/services/memory-repair-work-completion.js +97 -0
- package/dist/services/memory-repair-work-custody.js +73 -0
- package/dist/services/memory-repair-work-results.js +89 -0
- package/dist/services/memory-repair-workspace.js +252 -0
- package/dist/services/memory-repair-writer-copy.js +735 -0
- package/dist/services/memory-result-binding.js +173 -0
- package/dist/services/memory-retained-review-authority.js +129 -0
- package/dist/services/memory-retained-review-results.js +70 -0
- package/dist/services/memory-retained-second-baseline.js +102 -0
- package/dist/services/memory-retained-second-repairs.js +156 -0
- package/dist/services/memory-review-acceptance.js +214 -0
- package/dist/services/memory-review-correction-plan.js +171 -0
- package/dist/services/memory-review-handler.js +585 -0
- package/dist/services/memory-review-inputs.js +200 -0
- package/dist/services/memory-review-receipt.js +180 -0
- package/dist/services/memory-review-registration.js +108 -0
- package/dist/services/memory-review-work-custody.js +124 -0
- package/dist/services/memory-review-work-input.js +72 -0
- package/dist/services/memory-review-work-results.js +73 -0
- package/dist/services/memory-second-corrected-review-inputs.js +165 -0
- package/dist/services/memory-second-correction-plan.js +76 -0
- package/dist/services/memory-second-repair-baseline.js +91 -0
- package/dist/services/memory-second-repair-launch.js +614 -0
- package/dist/services/memory-second-repair-registration.js +88 -0
- package/dist/services/memory-second-repair-source.js +187 -0
- package/dist/services/memory-second-review-acceptance.js +115 -0
- package/dist/services/memory-source-observations.js +117 -0
- package/dist/services/memory-stage-dispatch.js +28 -0
- package/dist/services/memory-stage-results.js +199 -0
- package/dist/services/memory-verification-acceptance.js +135 -0
- package/dist/services/memory-verification-checks.js +252 -0
- package/dist/services/memory-verification-receipt.js +159 -0
- package/dist/services/memory-verify-handler.js +135 -0
- package/dist/services/memory-work-result-preparation.js +63 -0
- package/dist/services/merge-queue.js +228 -149
- package/dist/services/merge-server.js +161 -35
- package/dist/services/migrations.js +37 -16
- package/dist/services/model-catalog.js +109 -0
- package/dist/services/model-discovery.js +46 -0
- package/dist/services/native-daemon-history.js +49 -0
- package/dist/services/native-session-control.js +39 -0
- package/dist/services/operator-profiles.js +236 -0
- package/dist/services/plan-runtime.js +26 -11
- package/dist/services/plans.js +28 -25
- package/dist/services/projects.js +37 -17
- package/dist/services/prompts.js +28 -17
- package/dist/services/protocols.js +163 -87
- package/dist/services/provider-capacity.js +385 -0
- package/dist/services/recovery-observation-budget.js +121 -0
- package/dist/services/recovery-snapshot-database.js +560 -0
- package/dist/services/release-archive-producer.js +52 -0
- package/dist/services/release-archive.js +143 -0
- package/dist/services/release-cache.js +142 -0
- package/dist/services/release-compatibility.js +18 -0
- package/dist/services/release-download.js +67 -0
- package/dist/services/release-envelope.js +104 -0
- package/dist/services/release-manifest.js +45 -0
- package/dist/services/release-payload.js +114 -0
- package/dist/services/release-producer.js +63 -0
- package/dist/services/release-provenance.js +160 -0
- package/dist/services/release-registry.js +66 -0
- package/dist/services/release-source.js +194 -0
- package/dist/services/repair-intents.js +42 -0
- package/dist/services/review-copy.js +165 -0
- package/dist/services/review-deferral.js +23 -0
- package/dist/services/run-control-receipt.js +56 -0
- package/dist/services/run-control-worker.js +411 -0
- package/dist/services/run-control.js +1056 -0
- package/dist/services/run-controller-adapter.js +399 -0
- package/dist/services/run-controller-capture.js +186 -0
- package/dist/services/run-controller-process.js +208 -0
- package/dist/services/run-controller-recovery.js +289 -0
- package/dist/services/run-controller-state.js +97 -0
- package/dist/services/run-controller.js +1205 -0
- package/dist/services/run-engine-bindings.js +1 -1
- package/dist/services/run-fork.js +147 -0
- package/dist/services/run-health.js +149 -0
- package/dist/services/run-observations.js +152 -0
- package/dist/services/run-projection.js +22 -64
- package/dist/services/run-recovery-guard.js +77 -0
- package/dist/services/run-recovery-runtime.js +112 -0
- package/dist/services/run-recovery.js +489 -0
- package/dist/services/run-start-custody.js +177 -0
- package/dist/services/runs.js +1019 -247
- package/dist/services/runtime-budget.js +430 -0
- package/dist/services/runtime-command.js +43 -0
- package/dist/services/runtime-scope-capture.js +52 -0
- package/dist/services/runtime-scope-control.js +468 -0
- package/dist/services/runtime-scope-resume.js +599 -0
- package/dist/services/runtime-scope-stop.js +210 -0
- package/dist/services/runtime-scope-worker.js +287 -0
- package/dist/services/runtime-service.js +96 -0
- package/dist/services/schema-validation.js +10 -8
- package/dist/services/scope-writer-cleanup.js +27 -0
- package/dist/services/sessions.js +35 -69
- package/dist/services/setup.js +377 -0
- package/dist/services/stage-blocker.js +17 -7
- package/dist/services/stage-context.js +193 -19
- package/dist/services/stage-handlers.js +74 -0
- package/dist/services/stage-lifecycle.js +100 -108
- package/dist/services/stage-pause.js +89 -75
- package/dist/services/stage-report-renderer.js +234 -6
- package/dist/services/stage-work-graph.js +52 -0
- package/dist/services/tooling.js +32 -23
- package/dist/services/usage.js +49 -101
- package/dist/services/verification-matrix.js +374 -0
- package/dist/services/vnext-code-review.js +223 -88
- package/dist/services/vnext-code.js +327 -226
- package/dist/services/vnext-contracts.js +10 -1
- package/dist/services/vnext-execution-profile.js +80 -5
- package/dist/services/vnext-fanout.js +311 -19
- package/dist/services/vnext-merge.js +332 -111
- package/dist/services/vnext-plan-review.js +279 -127
- package/dist/services/vnext-plan.js +229 -104
- package/dist/services/vnext-protocolize.js +411 -86
- package/dist/services/vnext-specify.js +119 -81
- package/dist/services/vnext-workspace-policy.js +7 -2
- package/dist/services/work-registry.js +1627 -199
- package/dist/services/workspace-bootstrap.js +52 -15
- package/dist/services/workspace-files.js +85 -0
- package/dist/services/worktrees.js +98 -44
- package/dist/shared/entity-references.js +8 -0
- package/dist/shared/errors.js +17 -0
- package/dist/storage/agent-output.js +26 -0
- package/dist/storage/database.js +891 -39
- package/dist/storage/foreign-key-transaction.js +39 -0
- package/dist/storage/immutable-input.js +45 -0
- package/dist/storage/import-guard.js +102 -0
- package/dist/storage/native-cleanup.js +52 -0
- package/dist/storage/paths.js +17 -4
- package/dist/storage/projection-lock.js +73 -0
- package/dist/storage/work-references.js +23 -0
- package/dist/storage/writer-contract.js +89 -0
- package/dist/storage/writer-migration.js +85 -0
- package/package.json +43 -13
- package/tools/create-canon-release.mjs +33 -0
- package/tools/produce-hybrid-release.mjs +41 -0
- package/tools/repair-paused-run-status.mjs +84 -0
|
@@ -1,31 +1,38 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import crypto from "node:crypto";
|
|
3
4
|
import { spawnSync } from "node:child_process";
|
|
4
5
|
import { parse as parseYaml } from "yaml";
|
|
5
6
|
import { canTransition } from "../domain/contracts.js";
|
|
6
7
|
import { defaultFlowContract, flowContractForState, loadProjectFlowContract } from "../domain/flow-contract.js";
|
|
7
8
|
import { requireStage } from "../domain/validation.js";
|
|
8
9
|
import { AppError } from "../shared/errors.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { ensureDir, planJsonPath, resolveProjectRoot, runtimeProtocolDir, runtimeStateJsonPath } from "../storage/paths.js";
|
|
10
|
+
import { prepareJsonFile } from "../cli/input-preparation.js";
|
|
11
|
+
import { ensureDir, planJsonPath, resolveProjectRoot, resolveProtocolPlanPath, runtimeProtocolDir, runtimeStateJsonPath } from "../storage/paths.js";
|
|
12
12
|
import { appendAudit, getAuditEvents } from "./audit.js";
|
|
13
|
+
import { withProjectionLock } from "../storage/projection-lock.js";
|
|
13
14
|
import { requireProjectByRoot } from "./projects.js";
|
|
14
|
-
import {
|
|
15
|
+
import { prepareRuntimeProtocolFiles, publishRuntimeProtocolMetadata, readStateFile, writeState } from "../protocol/local-files.js";
|
|
15
16
|
import { planSummary, planWithProgress, readCanonicalPlan } from "./plan-runtime.js";
|
|
16
17
|
import { activeCodexSessionBindingsForProject, activeFlowSessionBindingsForProject, codexHomeProfilesForProject, codexHookEventsForProject, hookStatusForProject } from "./hooks.js";
|
|
17
18
|
import { buildProtocolFlowGuidance } from "./flow-guidance.js";
|
|
18
19
|
import { lifecycleIsTerminalFailure, lifecycleIsTerminalSuccess, normalizeProtocolLifecycle } from "./protocol-lifecycle.js";
|
|
19
20
|
import { getProtocolBranchContext } from "./branch-context.js";
|
|
20
|
-
export function
|
|
21
|
+
export function prepareProtocolRegistration(context, input) {
|
|
22
|
+
if (typeof input.handshakeId !== "string" || !input.handshakeId.trim() || /[/\\\0]/.test(input.handshakeId) || [".", ".."].includes(input.handshakeId))
|
|
23
|
+
throw new AppError("validation", "Protocol handshake must be a non-empty identifier, not a path", 2);
|
|
21
24
|
const projectRoot = resolveProjectRoot(input.projectRoot);
|
|
22
25
|
const project = requireProjectByRoot(context, projectRoot);
|
|
23
|
-
const now = context.now();
|
|
24
26
|
const workspacePath = input.workspacePath ? resolveProjectRoot(input.workspacePath) : undefined;
|
|
25
27
|
const idRoot = workspacePath ?? projectRoot;
|
|
26
28
|
const protocolId = inferProtocolId(idRoot, input.handshakeId);
|
|
27
29
|
const runtimeDir = runtimeProtocolDir(context.ddFlowHome, project.id, protocolId);
|
|
28
|
-
|
|
30
|
+
return { projectRoot, project, workspacePath, protocolId, runtimeDir };
|
|
31
|
+
}
|
|
32
|
+
export function registerProtocol(context, input) {
|
|
33
|
+
const { projectRoot, project, workspacePath, protocolId, runtimeDir } = prepareProtocolRegistration(context, input);
|
|
34
|
+
const now = context.now();
|
|
35
|
+
const initialized = prepareRuntimeProtocolFiles({
|
|
29
36
|
runtimeDir,
|
|
30
37
|
protocolId,
|
|
31
38
|
projectRoot,
|
|
@@ -33,25 +40,27 @@ export function registerProtocol(context, input) {
|
|
|
33
40
|
workspacePath,
|
|
34
41
|
now
|
|
35
42
|
});
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
protocolId
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
43
|
+
return context.db.writeTransaction(() => {
|
|
44
|
+
const existing = findProtocol(context, protocolId, project.id);
|
|
45
|
+
const state = existing ? latestProtocolProjection(context, project.id, protocolId) ?? initialized : initialized;
|
|
46
|
+
const params = [
|
|
47
|
+
protocolId,
|
|
48
|
+
input.handshakeId,
|
|
49
|
+
project.id,
|
|
50
|
+
projectRoot,
|
|
51
|
+
state.status,
|
|
52
|
+
state.stage,
|
|
53
|
+
state.next_action,
|
|
54
|
+
JSON.stringify(state.route),
|
|
55
|
+
JSON.stringify(state.workspace),
|
|
56
|
+
JSON.stringify(state.blockers),
|
|
57
|
+
JSON.stringify(state.active_def),
|
|
58
|
+
runtimeStateJsonPath(context.ddFlowHome, project.id, protocolId),
|
|
59
|
+
planJsonPath(workspacePath ?? projectRoot, protocolId),
|
|
60
|
+
existing?.created_at ?? now,
|
|
61
|
+
now
|
|
62
|
+
];
|
|
63
|
+
context.db.run(`INSERT INTO protocols
|
|
55
64
|
(id, handshake_id, project_id, project_root, status, stage, next_action,
|
|
56
65
|
route_json, workspace_json, blockers_json, active_def_json, state_path, plan_path,
|
|
57
66
|
created_at, updated_at)
|
|
@@ -70,19 +79,23 @@ export function registerProtocol(context, input) {
|
|
|
70
79
|
state_path = excluded.state_path,
|
|
71
80
|
plan_path = excluded.plan_path,
|
|
72
81
|
updated_at = excluded.updated_at`, params);
|
|
73
|
-
|
|
74
|
-
protocolId
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
82
|
+
appendAudit(context, { protocolId, projectId: project.id, eventType: "protocol.state_projection", payload: { state } });
|
|
83
|
+
context.db.afterCommit(() => publishProtocolProjection(context, project.id, protocolId));
|
|
84
|
+
context.db.afterCommit(() => publishRuntimeProtocolMetadata({ runtimeDir, protocolId, handshakeId: input.handshakeId, projectRoot }));
|
|
85
|
+
appendAudit(context, {
|
|
86
|
+
protocolId,
|
|
87
|
+
projectId: project.id,
|
|
88
|
+
eventType: existing ? "protocol.registration_refreshed" : "protocol.registered",
|
|
89
|
+
payload: {
|
|
90
|
+
protocol_id: protocolId,
|
|
91
|
+
handshake_id: input.handshakeId,
|
|
92
|
+
project_root: projectRoot,
|
|
93
|
+
workspace_path: workspacePath ?? null,
|
|
94
|
+
runtime_dir: runtimeDir
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return { ok: true, protocol: protocolStatusPayload(requireProtocol(context, protocolId, project.id)), state };
|
|
98
|
+
}, "protocol.register");
|
|
86
99
|
}
|
|
87
100
|
export function getProtocolStatus(context, input) {
|
|
88
101
|
const project = requireProjectByRoot(context, resolveProjectRoot(input.projectRoot));
|
|
@@ -243,7 +256,22 @@ export function implementProtocol(context, input) {
|
|
|
243
256
|
}
|
|
244
257
|
};
|
|
245
258
|
}
|
|
246
|
-
export function
|
|
259
|
+
export function prepareProtocolTransition(context, input) {
|
|
260
|
+
const { value } = prepareJsonFile(input.jsonFile, "Protocol transition payload");
|
|
261
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
262
|
+
throw new AppError("validation", "Protocol transition payload must be an object", 2);
|
|
263
|
+
const payload = value;
|
|
264
|
+
for (const [key, field] of Object.entries(payload)) {
|
|
265
|
+
const valid = key === "next_action" ? typeof field === "string"
|
|
266
|
+
: ["route", "workspace"].includes(key) ? Boolean(field && typeof field === "object" && !Array.isArray(field))
|
|
267
|
+
: ["blockers", "active_def"].includes(key) && Array.isArray(field);
|
|
268
|
+
if (!valid)
|
|
269
|
+
throw new AppError("validation", `Unsupported field or invalid value in protocol transition: ${key}`, 2, { file: input.jsonFile, parameter: key });
|
|
270
|
+
}
|
|
271
|
+
protocolTransitionState(context, input);
|
|
272
|
+
return payload;
|
|
273
|
+
}
|
|
274
|
+
function protocolTransitionState(context, input) {
|
|
247
275
|
const project = requireProjectByRoot(context, resolveProjectRoot(input.projectRoot));
|
|
248
276
|
const protocol = requireProtocol(context, input.protocolId, project.id);
|
|
249
277
|
const state = readProtocolRuntimeState(context, protocol).state;
|
|
@@ -256,8 +284,10 @@ export function transitionProtocol(context, input) {
|
|
|
256
284
|
if (input.force && (!input.reason || input.reason.trim().length === 0)) {
|
|
257
285
|
throw new AppError("validation", "Forced transitions require --reason", 2);
|
|
258
286
|
}
|
|
259
|
-
|
|
260
|
-
|
|
287
|
+
return { project, protocol, state, flowContract, from, to };
|
|
288
|
+
}
|
|
289
|
+
export function transitionProtocol(context, input, payload = prepareProtocolTransition(context, input)) {
|
|
290
|
+
const { project, protocol, state, flowContract, from, to } = protocolTransitionState(context, input);
|
|
261
291
|
const nextState = {
|
|
262
292
|
...state,
|
|
263
293
|
stage: to,
|
|
@@ -416,8 +446,7 @@ export function syncProtocolFromRun(context, input) {
|
|
|
416
446
|
next_action: nextActionForSyncedTarget(targetStage),
|
|
417
447
|
updated_at: now
|
|
418
448
|
};
|
|
419
|
-
context.db.
|
|
420
|
-
try {
|
|
449
|
+
context.db.writeTransaction(() => {
|
|
421
450
|
persistProtocolState(context, protocol, nextState);
|
|
422
451
|
if (targetStage === "ready_for_merge") {
|
|
423
452
|
context.db.run(`INSERT INTO merge_queue
|
|
@@ -449,12 +478,7 @@ export function syncProtocolFromRun(context, input) {
|
|
|
449
478
|
stage_chain: stageChain(index)
|
|
450
479
|
}
|
|
451
480
|
});
|
|
452
|
-
|
|
453
|
-
}
|
|
454
|
-
catch (error) {
|
|
455
|
-
context.db.exec("ROLLBACK");
|
|
456
|
-
throw error;
|
|
457
|
-
}
|
|
481
|
+
}, "protocols.syncFromRun");
|
|
458
482
|
return {
|
|
459
483
|
ok: true,
|
|
460
484
|
protocol_id: protocol.id,
|
|
@@ -486,8 +510,7 @@ export function cancelProtocol(context, input) {
|
|
|
486
510
|
const now = context.now();
|
|
487
511
|
const worktree = context.db.get("SELECT worktree_path, status FROM worktree_records WHERE project_id = ? AND protocol_id = ?", [protocol.project_id, protocol.id]);
|
|
488
512
|
const worktreeRemoval = input.worktree === "remove" ? removeProtocolWorktreeBeforeCancel(protocol, state, worktree, input.force) : undefined;
|
|
489
|
-
context.db.
|
|
490
|
-
try {
|
|
513
|
+
return context.db.writeTransaction(() => {
|
|
491
514
|
const nextState = {
|
|
492
515
|
...state,
|
|
493
516
|
stage: "cancelled",
|
|
@@ -548,7 +571,6 @@ export function cancelProtocol(context, input) {
|
|
|
548
571
|
worktree_outcome: worktreeOutcome
|
|
549
572
|
}
|
|
550
573
|
});
|
|
551
|
-
context.db.exec("COMMIT");
|
|
552
574
|
return {
|
|
553
575
|
ok: true,
|
|
554
576
|
protocol_id: protocol.id,
|
|
@@ -560,11 +582,7 @@ export function cancelProtocol(context, input) {
|
|
|
560
582
|
worktree_outcome: worktreeOutcome,
|
|
561
583
|
worktree: context.db.get("SELECT * FROM worktree_records WHERE project_id = ? AND protocol_id = ?", [protocol.project_id, protocol.id]) ?? null
|
|
562
584
|
};
|
|
563
|
-
}
|
|
564
|
-
catch (error) {
|
|
565
|
-
context.db.exec("ROLLBACK");
|
|
566
|
-
throw error;
|
|
567
|
-
}
|
|
585
|
+
}, "protocols.cancel");
|
|
568
586
|
}
|
|
569
587
|
export function requireProtocol(context, protocolId, projectId) {
|
|
570
588
|
const matches = projectId
|
|
@@ -579,7 +597,10 @@ export function requireProtocol(context, protocolId, projectId) {
|
|
|
579
597
|
candidates: matches.map((protocol) => ({ project_id: protocol.project_id, project_root: protocol.project_root }))
|
|
580
598
|
});
|
|
581
599
|
}
|
|
582
|
-
return matches[0];
|
|
600
|
+
return resolvedProtocolRecord(matches[0]);
|
|
601
|
+
}
|
|
602
|
+
function resolvedProtocolRecord(protocol) {
|
|
603
|
+
return { ...protocol, plan_path: resolveProtocolPlanPath(protocol.project_root, protocol.id, protocol.plan_path) };
|
|
583
604
|
}
|
|
584
605
|
function cancelQueueForProtocol(context, protocol, reason, force) {
|
|
585
606
|
const job = context.db.get("SELECT id, status, claimed_by_session_id FROM merge_queue WHERE project_id = ? AND protocol_id = ?", [protocol.project_id, protocol.id]);
|
|
@@ -647,7 +668,9 @@ function removeProtocolWorktreeBeforeCancel(protocol, state, record, force) {
|
|
|
647
668
|
}
|
|
648
669
|
const existsBefore = fs.existsSync(worktreePath);
|
|
649
670
|
if (existsBefore && !force) {
|
|
650
|
-
const dirty = spawnSync("git", ["-C", worktreePath, "status", "--porcelain"], { encoding: "utf8" });
|
|
671
|
+
const dirty = spawnSync("git", ["-C", worktreePath, "status", "--porcelain"], { encoding: "utf8", timeout: 5000 });
|
|
672
|
+
if (dirty.error || dirty.status !== 0)
|
|
673
|
+
throw new AppError("workspace_status_failed", "Cannot establish worktree status before removal", 1, { path: worktreePath, cause: dirty.error?.message ?? dirty.stderr });
|
|
651
674
|
if (dirty.status === 0 && dirty.stdout.trim().length > 0) {
|
|
652
675
|
throw new AppError("worktree_dirty", "Refusing to remove dirty worktree without --force --reason", 1, {
|
|
653
676
|
path: worktreePath
|
|
@@ -733,9 +756,42 @@ function releaseRelatedMergeLocks(context, protocol, reason) {
|
|
|
733
756
|
return { ok: true, released: released.length, locks: released };
|
|
734
757
|
}
|
|
735
758
|
export function readProtocolRuntimeState(context, protocol) {
|
|
759
|
+
const expected = runtimeStateJsonPath(context.ddFlowHome, protocol.project_id, protocol.id);
|
|
760
|
+
if (protocol.state_path !== expected)
|
|
761
|
+
throw new AppError("protocol_state_migration_required", "Protocol runtime path requires explicit cleanup scan/apply before use", 1, { protocol_id: protocol.id, path: protocol.state_path, expected_path: expected });
|
|
762
|
+
const accepted = latestProtocolProjection(context, protocol.project_id, protocol.id);
|
|
763
|
+
if (accepted)
|
|
764
|
+
return { state: accepted, diagnostics: [] };
|
|
765
|
+
return resolveProtocolRuntimeState(context, { ...protocol }, false);
|
|
766
|
+
}
|
|
767
|
+
/** Explicit cleanup migration; productive readers accept only the current path. */
|
|
768
|
+
export function repairProtocolRuntimeState(context, protocol) {
|
|
769
|
+
// Readers project the canonical plan path without migrating storage. Repair
|
|
770
|
+
// must start from the stored locations, not that already-normalized view.
|
|
771
|
+
const stored = context.db.get("SELECT * FROM protocols WHERE project_id = ? AND id = ?", [protocol.project_id, protocol.id]);
|
|
772
|
+
if (stored)
|
|
773
|
+
Object.assign(protocol, stored);
|
|
774
|
+
return resolveProtocolRuntimeState(context, protocol, true);
|
|
775
|
+
}
|
|
776
|
+
/** Read-only repair preparation; caller CASes paths, then persists this state. */
|
|
777
|
+
export function prepareProtocolRuntimeRepair(context, protocol) {
|
|
778
|
+
const stored = context.db.get("SELECT * FROM protocols WHERE project_id = ? AND id = ?", [protocol.project_id, protocol.id]);
|
|
779
|
+
if (!stored)
|
|
780
|
+
throw new AppError("not_found", "Protocol is not registered", 1, { protocol_id: protocol.id });
|
|
781
|
+
const state = latestProtocolProjection(context, stored.project_id, stored.id) ?? resolveProtocolRuntimeState(context, { ...stored }, false).state;
|
|
782
|
+
return {
|
|
783
|
+
state,
|
|
784
|
+
statePath: runtimeStateJsonPath(context.ddFlowHome, stored.project_id, stored.id),
|
|
785
|
+
planPath: planJsonPath(stored.project_root, stored.id),
|
|
786
|
+
previousStatePath: stored.state_path
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
function resolveProtocolRuntimeState(context, protocol, repair) {
|
|
736
790
|
const diagnostics = [];
|
|
737
|
-
normalizeProtocolPlanPath(context, protocol, diagnostics);
|
|
791
|
+
normalizeProtocolPlanPath(context, protocol, diagnostics, repair);
|
|
738
792
|
try {
|
|
793
|
+
if (protocol.state_path !== runtimeStateJsonPath(context.ddFlowHome, protocol.project_id, protocol.id))
|
|
794
|
+
throw new AppError("protocol_state_migration_required", "Retired state files are not runtime authority", 1);
|
|
739
795
|
return { state: readStateFile(protocol.state_path, protocol.id), diagnostics };
|
|
740
796
|
}
|
|
741
797
|
catch {
|
|
@@ -750,7 +806,8 @@ export function readProtocolRuntimeState(context, protocol) {
|
|
|
750
806
|
recommended_action: "legacy protocol state_path was moved to stable runtime storage"
|
|
751
807
|
});
|
|
752
808
|
const stablePlanPath = planJsonPath(protocol.project_root, protocol.id);
|
|
753
|
-
|
|
809
|
+
if (repair && context.db.writable)
|
|
810
|
+
context.db.run("UPDATE protocols SET state_path = ?, plan_path = ? WHERE project_id = ? AND id = ?", [stableStatePath, stablePlanPath, protocol.project_id, protocol.id]);
|
|
754
811
|
protocol.state_path = stableStatePath;
|
|
755
812
|
protocol.plan_path = stablePlanPath;
|
|
756
813
|
return { state: readStateFile(stableStatePath, protocol.id), diagnostics };
|
|
@@ -783,7 +840,7 @@ export function readProtocolRuntimeState(context, protocol) {
|
|
|
783
840
|
flow_contract: flowContract,
|
|
784
841
|
updated_at: protocol.updated_at
|
|
785
842
|
};
|
|
786
|
-
if (!context.db.writable) {
|
|
843
|
+
if (!repair || !context.db.writable) {
|
|
787
844
|
return { state, diagnostics };
|
|
788
845
|
}
|
|
789
846
|
const stableStatePath = runtimeStateJsonPath(context.ddFlowHome, protocol.project_id, protocol.id);
|
|
@@ -802,9 +859,9 @@ export function readProtocolRuntimeState(context, protocol) {
|
|
|
802
859
|
});
|
|
803
860
|
return { state, diagnostics };
|
|
804
861
|
}
|
|
805
|
-
function normalizeProtocolPlanPath(context, protocol, diagnostics) {
|
|
806
|
-
const canonicalPlanPath =
|
|
807
|
-
if (protocol.plan_path === canonicalPlanPath
|
|
862
|
+
function normalizeProtocolPlanPath(context, protocol, diagnostics, repair) {
|
|
863
|
+
const canonicalPlanPath = resolveProtocolPlanPath(protocol.project_root, protocol.id, protocol.plan_path);
|
|
864
|
+
if (protocol.plan_path === canonicalPlanPath)
|
|
808
865
|
return;
|
|
809
866
|
diagnostics.push({
|
|
810
867
|
code: "protocol_plan_relocated",
|
|
@@ -814,7 +871,7 @@ function normalizeProtocolPlanPath(context, protocol, diagnostics) {
|
|
|
814
871
|
source: "project_canonical_plan",
|
|
815
872
|
recommended_action: "use the project canonical plan as the sole semantic plan source"
|
|
816
873
|
});
|
|
817
|
-
if (context.db.writable) {
|
|
874
|
+
if (repair && context.db.writable) {
|
|
818
875
|
context.db.run("UPDATE protocols SET plan_path = ?, updated_at = ? WHERE project_id = ? AND id = ?", [canonicalPlanPath, context.now(), protocol.project_id, protocol.id]);
|
|
819
876
|
}
|
|
820
877
|
protocol.plan_path = canonicalPlanPath;
|
|
@@ -847,38 +904,57 @@ export function protocolRunDiagnostics(context, protocol, state) {
|
|
|
847
904
|
return { latest_run: latestWithStages, diagnostics };
|
|
848
905
|
}
|
|
849
906
|
export function persistProtocolState(context, protocol, state) {
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
context.db.run(`UPDATE protocols SET
|
|
907
|
+
context.db.writeTransaction(() => {
|
|
908
|
+
context.db.run(`UPDATE protocols SET
|
|
853
909
|
status = ?, stage = ?, next_action = ?, route_json = ?, workspace_json = ?,
|
|
854
910
|
blockers_json = ?, active_def_json = ?, updated_at = ?
|
|
855
911
|
WHERE project_id = ? AND id = ?`, [
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
912
|
+
state.status,
|
|
913
|
+
state.stage,
|
|
914
|
+
state.next_action,
|
|
915
|
+
JSON.stringify(state.route),
|
|
916
|
+
JSON.stringify(state.workspace),
|
|
917
|
+
JSON.stringify(state.blockers),
|
|
918
|
+
JSON.stringify(state.active_def),
|
|
919
|
+
state.updated_at,
|
|
920
|
+
protocol.project_id,
|
|
921
|
+
protocol.id
|
|
922
|
+
]);
|
|
923
|
+
appendAudit(context, { protocolId: protocol.id, projectId: protocol.project_id, eventType: "protocol.state_projection", payload: { state } });
|
|
924
|
+
if (state.status === "closed" || state.stage === "closed") {
|
|
925
|
+
const now = context.now();
|
|
926
|
+
context.db.run(`UPDATE sessions
|
|
870
927
|
SET status = 'stopped', stop_reason = 'protocol closed', updated_at = ?, stopped_at = ?
|
|
871
928
|
WHERE project_id = ?
|
|
872
929
|
AND protocol_id = ?
|
|
873
930
|
AND status IN ('pending', 'active', 'waiting_user', 'blocked', 'stopping')`, [now, now, protocol.project_id, protocol.id]);
|
|
874
|
-
|
|
931
|
+
}
|
|
932
|
+
context.db.afterCommit(() => publishProtocolProjection(context, protocol.project_id, protocol.id));
|
|
933
|
+
}, "protocols.persistProtocolState");
|
|
934
|
+
}
|
|
935
|
+
function latestProtocolProjection(context, projectId, protocolId) {
|
|
936
|
+
const row = context.db.get("SELECT payload_json FROM audit_events WHERE project_id = ? AND protocol_id = ? AND event_type = 'protocol.state_projection' ORDER BY id DESC LIMIT 1", [projectId, protocolId]);
|
|
937
|
+
return row ? JSON.parse(row.payload_json).state : null;
|
|
938
|
+
}
|
|
939
|
+
export function publishProtocolProjection(context, projectId, protocolId) {
|
|
940
|
+
const protocol = requireProtocol(context, protocolId, projectId);
|
|
941
|
+
ensureDir(path.dirname(protocol.state_path));
|
|
942
|
+
withProjectionLock(`${protocol.state_path}.publish-lock`, () => {
|
|
943
|
+
const accepted = latestProtocolProjection(context, projectId, protocolId);
|
|
944
|
+
if (!accepted)
|
|
945
|
+
throw new AppError("runtime_state_missing", "Protocol has no accepted SQL state", 1, { protocol_id: protocolId });
|
|
946
|
+
const temporary = `${protocol.state_path}.tmp-${process.pid}-${crypto.randomUUID()}`;
|
|
947
|
+
fs.writeFileSync(temporary, `${JSON.stringify(accepted, null, 2)}\n`);
|
|
948
|
+
fs.renameSync(temporary, protocol.state_path);
|
|
949
|
+
});
|
|
875
950
|
}
|
|
876
951
|
function findProtocol(context, protocolId, projectId) {
|
|
877
952
|
if (projectId) {
|
|
878
|
-
|
|
953
|
+
const protocol = context.db.get("SELECT * FROM protocols WHERE project_id = ? AND id = ?", [projectId, protocolId]);
|
|
954
|
+
return protocol ? resolvedProtocolRecord(protocol) : undefined;
|
|
879
955
|
}
|
|
880
956
|
const matches = context.db.all("SELECT * FROM protocols WHERE id = ? ORDER BY project_id", [protocolId]);
|
|
881
|
-
return matches.length === 1 ? matches[0] : undefined;
|
|
957
|
+
return matches.length === 1 ? resolvedProtocolRecord(matches[0]) : undefined;
|
|
882
958
|
}
|
|
883
959
|
function protocolDocumentsForProject(projectRoot) {
|
|
884
960
|
const protocolRoot = path.join(projectRoot, ".memory-bank", "protocol");
|