@deksden-com/dd-flow-cli 0.9.0-beta.16 → 0.9.0-beta.161
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 +965 -0
- package/README.md +139 -10
- package/dist/build-info.json +8 -8
- package/dist/cli/argument-values.js +38 -0
- package/dist/cli/command-inputs.js +417 -0
- package/dist/cli/command-metadata.js +303 -0
- package/dist/cli/command-option-descriptions.js +192 -0
- package/dist/cli/completion-cli.js +70 -0
- package/dist/cli/completion.js +57 -0
- package/dist/cli/delivery.js +108 -0
- package/dist/cli/diagnostic-invocation.js +62 -0
- package/dist/cli/diagnostic.js +131 -0
- package/dist/cli/error-output.js +62 -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 +521 -19
- package/dist/cli/hook-ingress.js +89 -0
- package/dist/cli/input-preparation.js +193 -0
- package/dist/cli/interactive-invocation.js +33 -0
- package/dist/cli/interactive.js +114 -0
- package/dist/cli/memory-fix-invocation.js +52 -0
- package/dist/cli/memory-fix.js +100 -0
- package/dist/cli/memory-flow-admission.js +54 -0
- package/dist/cli/memory-init-invocation.js +85 -0
- package/dist/cli/memory-init.js +250 -0
- package/dist/cli/memory-storage-admission.js +54 -0
- package/dist/cli/memory-storage-qualification.js +105 -0
- package/dist/cli/memory-storage-transition.js +123 -0
- package/dist/cli/memory-upgrade.js +189 -0
- package/dist/cli/models.js +39 -0
- package/dist/cli/native-hook-ingress.js +94 -0
- package/dist/cli/native-hook-preparation.js +82 -0
- package/dist/cli/operator-profiles.js +61 -0
- package/dist/cli/output-options.js +35 -0
- package/dist/cli/response-file.js +72 -0
- package/dist/cli/run-cli.js +2020 -555
- 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 +150 -0
- package/dist/cli.js +103 -2
- package/dist/domain/delivery-flows.js +8 -0
- package/dist/domain/diagnostic-aspects.js +103 -0
- package/dist/domain/diagnostic-flows.js +8 -0
- package/dist/domain/distill-flow.js +20 -0
- package/dist/domain/interactive-flow.js +1 -0
- package/dist/domain/memory-fix-flow.js +2 -0
- package/dist/domain/review-fix-flow.js +2 -0
- package/dist/domain/source-snapshot-flows.js +4 -0
- package/dist/domain/stage-catalog.js +1 -1
- package/dist/domain/stage-handler-identities.js +28 -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 +71 -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 +50 -0
- package/dist/harness-runtime/bin/dd-opencode.mjs +22 -0
- package/dist/harness-runtime/bin/dd-zcode.mjs +95 -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-error-boundary.mjs +87 -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/agy-native-inspection.mjs +225 -0
- package/dist/harness-runtime/lib/agy-native-inventory.mjs +19 -0
- package/dist/harness-runtime/lib/agy-native_pb.js +117 -0
- package/dist/harness-runtime/lib/agy-terminal-envelope.mjs +74 -0
- package/dist/harness-runtime/lib/agy-transcript-stream.mjs +54 -0
- package/dist/harness-runtime/lib/daemon-observation.d.mts +3 -0
- package/dist/harness-runtime/lib/daemon-observation.mjs +171 -0
- package/dist/harness-runtime/lib/daemon-operations.d.mts +2 -0
- package/dist/harness-runtime/lib/daemon-operations.mjs +512 -0
- package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +7 -0
- package/dist/harness-runtime/lib/dd-agy-daemon.mjs +1362 -0
- package/dist/harness-runtime/lib/dd-agy.mjs +105 -0
- package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-codex-daemon.mjs +271 -0
- package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-codex.mjs +986 -0
- package/dist/harness-runtime/lib/dd-droid-daemon.mjs +155 -0
- package/dist/harness-runtime/lib/dd-droid.mjs +739 -0
- package/dist/harness-runtime/lib/dd-grok-daemon.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-grok-daemon.mjs +667 -0
- package/dist/harness-runtime/lib/dd-grok.mjs +182 -0
- package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +772 -0
- package/dist/harness-runtime/lib/dd-opencode.mjs +411 -0
- package/dist/harness-runtime/lib/dd-zcode-daemon.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +845 -0
- package/dist/harness-runtime/lib/dd-zcode.mjs +1239 -0
- package/dist/harness-runtime/lib/delegation-instructions.d.mts +16 -0
- package/dist/harness-runtime/lib/delegation-instructions.mjs +179 -0
- package/dist/harness-runtime/lib/delivery-command.mjs +84 -0
- package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
- package/dist/harness-runtime/lib/driver-recovery.mjs +121 -0
- package/dist/harness-runtime/lib/droid-observation.mjs +70 -0
- package/dist/harness-runtime/lib/entity-references.d.mts +2 -0
- package/dist/harness-runtime/lib/entity-references.mjs +9 -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 +11 -0
- package/dist/harness-runtime/lib/lifecycle-contract.mjs +20 -0
- package/dist/harness-runtime/lib/managed-daemon.d.mts +16 -0
- package/dist/harness-runtime/lib/managed-daemon.mjs +698 -0
- package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
- package/dist/harness-runtime/lib/model-observations.mjs +113 -0
- package/dist/harness-runtime/lib/native-children.d.mts +34 -0
- package/dist/harness-runtime/lib/native-children.mjs +265 -0
- package/dist/harness-runtime/lib/native-hook-command.d.mts +8 -0
- package/dist/harness-runtime/lib/native-hook-command.mjs +306 -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 +38 -0
- package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
- package/dist/harness-runtime/lib/observation-clock.mjs +95 -0
- package/dist/harness-runtime/lib/opencode-plugin.mjs +112 -0
- package/dist/harness-runtime/lib/operation-context.mjs +5 -0
- package/dist/harness-runtime/lib/operation-errors.d.mts +16 -0
- package/dist/harness-runtime/lib/operation-errors.mjs +140 -0
- package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
- package/dist/harness-runtime/lib/operation-progress.mjs +118 -0
- package/dist/harness-runtime/lib/process-json.d.mts +5 -0
- package/dist/harness-runtime/lib/process-json.mjs +200 -0
- package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
- package/dist/harness-runtime/lib/provider-overload-policy.d.mts +23 -0
- package/dist/harness-runtime/lib/provider-overload-policy.mjs +242 -0
- package/dist/harness-runtime/lib/runner-events.mjs +202 -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 +53 -0
- package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
- package/dist/harness-runtime/lib/tool-observations.mjs +238 -0
- package/dist/harness-runtime/lib/zcode-native-hook-ownership.mjs +109 -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-decision.schema.json +9 -0
- 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/code-work-result.schema.json +2 -1
- package/dist/schemas/delivery-stage-result.schema.json +286 -0
- package/dist/schemas/diagnostic-stage-result.schema.json +354 -0
- package/dist/schemas/diagnostic-work-result.schema.json +296 -0
- package/dist/schemas/discovery-result.schema.json +184 -0
- package/dist/schemas/distill-stage-result.schema.json +667 -0
- package/dist/schemas/distill-work-result.schema.json +428 -0
- package/dist/schemas/execution-bundle.schema.json +215 -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 +29 -0
- package/dist/schemas/harness-catalog.schema.json +80 -0
- package/dist/schemas/interactive-stage-result.schema.json +47 -0
- package/dist/schemas/interactive-work-result.schema.json +63 -0
- package/dist/schemas/mb-fix-stage-result.schema.json +93 -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/mb-upgrade-stage-result.schema.json +863 -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 +56 -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 +12 -3
- package/dist/schemas/plan-review-result.schema.json +2 -2
- package/dist/schemas/profile-settings.schema.json +122 -0
- package/dist/schemas/project-flow-pack-manifest.schema.json +2 -2
- package/dist/schemas/release-impact.schema.json +3 -3
- package/dist/schemas/release-manifest.schema.json +291 -0
- package/dist/schemas/review-fix-stage-result.schema.json +210 -0
- package/dist/schemas/run-control-receipt.schema.json +119 -0
- package/dist/schemas/run-control-request.schema.json +36 -0
- package/dist/schemas/run-engine-binding.schema.json +1 -1
- package/dist/schemas/stage-start-response.schema.json +4 -0
- package/dist/schemas/vnext-protocol-plan.schema.json +3 -3
- package/dist/services/accepted-intent.js +139 -0
- package/dist/services/assigned-lifecycle.js +382 -0
- package/dist/services/branch-context.js +3 -3
- package/dist/services/canon.js +54 -15
- package/dist/services/check-environment.js +21 -0
- package/dist/services/check-runner-evidence.js +344 -0
- package/dist/services/check-runner-proof.js +373 -0
- package/dist/services/cleanup.js +133 -40
- package/dist/services/cli-operation-classifier.js +32 -64
- package/dist/services/cli-upgrade-allowlist.js +27 -0
- package/dist/services/code-checks.js +1426 -121
- package/dist/services/codex-capacity.js +367 -0
- package/dist/services/codex-hook-delivery.js +41 -0
- package/dist/services/command-context.js +80 -0
- package/dist/services/compatibility-preflight.js +16 -3
- package/dist/services/config.js +11 -8
- package/dist/services/continuation-outcome.js +25 -0
- package/dist/services/controller-child-capacity.js +71 -0
- package/dist/services/controller-child-observer.js +121 -0
- package/dist/services/controller-child-repair.js +117 -0
- package/dist/services/controller-execution.js +97 -0
- package/dist/services/controller-fanout.js +277 -0
- package/dist/services/controller-memory-task.js +45 -0
- package/dist/services/controller-memory-worker.js +51 -0
- package/dist/services/controller-result-authority.js +127 -0
- package/dist/services/controller-work-failure.js +198 -0
- package/dist/services/dashboard.js +145 -58
- package/dist/services/delivery-access.js +123 -0
- package/dist/services/delivery-approval.js +68 -0
- package/dist/services/delivery-artifact.js +86 -0
- package/dist/services/delivery-checks.js +178 -0
- package/dist/services/delivery-execution.js +181 -0
- package/dist/services/delivery-intents.js +212 -0
- package/dist/services/delivery-operation.js +81 -0
- package/dist/services/delivery-policy.js +91 -0
- package/dist/services/delivery-procedures.js +43 -0
- package/dist/services/delivery-request.js +99 -0
- package/dist/services/delivery-result.js +144 -0
- package/dist/services/delivery-stage-commands.js +26 -0
- package/dist/services/delivery-stage-entry.js +56 -0
- package/dist/services/delivery-stage-handlers.js +135 -0
- package/dist/services/delivery-stage-results.js +94 -0
- package/dist/services/descriptor-coordinator-session.js +37 -0
- package/dist/services/descriptor-root-work.js +53 -0
- package/dist/services/descriptor-run-settlement.js +107 -0
- package/dist/services/descriptor-run-start.js +495 -0
- package/dist/services/descriptor-stage-coordinator.js +318 -0
- package/dist/services/descriptor-stage-settlement.js +268 -0
- package/dist/services/descriptor-stage-start.js +175 -0
- package/dist/services/diagnostic-evidence.js +73 -0
- package/dist/services/diagnostic-repair-intake.js +123 -0
- package/dist/services/diagnostic-repair-source-intake.js +102 -0
- package/dist/services/diagnostic-report-publication.js +72 -0
- package/dist/services/diagnostic-report.js +97 -0
- package/dist/services/diagnostic-run-bundle.js +113 -0
- package/dist/services/diagnostic-snapshot.js +159 -0
- package/dist/services/diagnostic-stage-handlers.js +109 -0
- package/dist/services/diagnostic-stage-results.js +158 -0
- package/dist/services/diagnostic-start.js +134 -0
- package/dist/services/diagnostic-work-batch.js +34 -0
- package/dist/services/diagnostic-work-collection.js +97 -0
- package/dist/services/diagnostic-work-registration.js +101 -0
- package/dist/services/diagnostic-work-results.js +93 -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/distill-document-publication.js +280 -0
- package/dist/services/distill-promotion.js +197 -0
- package/dist/services/distill-publication-custody.js +162 -0
- package/dist/services/distill-stage-handlers.js +249 -0
- package/dist/services/distill-stage-results.js +105 -0
- package/dist/services/distill-user-inputs.js +4 -0
- package/dist/services/distill-work-batch.js +42 -0
- package/dist/services/distill-work-collection.js +74 -0
- package/dist/services/distill-work-registration.js +93 -0
- package/dist/services/distill-work-results.js +98 -0
- package/dist/services/engines.js +354 -163
- package/dist/services/eval-snapshots.js +1326 -150
- package/dist/services/execution-bundles.js +275 -0
- package/dist/services/execution-policy.js +185 -0
- package/dist/services/executor-onboarding.js +56 -0
- package/dist/services/external-work-launch.js +316 -0
- package/dist/services/flow-catalog.js +54 -0
- package/dist/services/flow-descriptors.js +82 -0
- package/dist/services/frozen-engine.js +404 -0
- package/dist/services/generic-execution.js +165 -0
- package/dist/services/harness-adapter.js +342 -35
- 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/hook-memory-routing.js +188 -0
- package/dist/services/hook-recovery-guard.js +14 -0
- package/dist/services/hook-session-observation.js +24 -0
- package/dist/services/hooks.js +813 -327
- package/dist/services/hybrid-contracts.js +479 -0
- package/dist/services/hybrid-digest.js +14 -0
- package/dist/services/ids.js +29 -1
- package/dist/services/installation-lock.js +95 -0
- package/dist/services/installed-flow-source.js +261 -0
- package/dist/services/interactive-attached-session.js +215 -0
- package/dist/services/interactive-baseline-custody.js +54 -0
- package/dist/services/interactive-before-versions.js +148 -0
- package/dist/services/interactive-bundle-data.js +85 -0
- package/dist/services/interactive-checks.js +179 -0
- package/dist/services/interactive-execution.js +33 -0
- package/dist/services/interactive-finish-integration.js +236 -0
- package/dist/services/interactive-git-baseline.js +230 -0
- package/dist/services/interactive-git-dispatch.js +278 -0
- package/dist/services/interactive-input-delivery.js +82 -0
- package/dist/services/interactive-mutation-scope.js +231 -0
- package/dist/services/interactive-request.js +287 -0
- package/dist/services/interactive-run-bundle.js +109 -0
- package/dist/services/interactive-stage-entry.js +41 -0
- package/dist/services/interactive-stage-handlers.js +289 -0
- package/dist/services/interactive-stage-observation.js +136 -0
- package/dist/services/interactive-stage-results.js +111 -0
- package/dist/services/interactive-user-inputs.js +142 -0
- package/dist/services/interactive-work-batch.js +43 -0
- package/dist/services/interactive-work-collection.js +119 -0
- package/dist/services/interactive-work-completion.js +180 -0
- package/dist/services/interactive-work-context.js +249 -0
- package/dist/services/interactive-work-history.js +112 -0
- package/dist/services/interactive-work-registration.js +124 -0
- package/dist/services/interactive-work-results.js +115 -0
- package/dist/services/interactive-work-start.js +155 -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 +2549 -0
- package/dist/services/managed-daemon-binding.js +129 -0
- package/dist/services/managed-lease-monitor.js +133 -0
- package/dist/services/managed-processes.js +449 -69
- package/dist/services/memory-accepted-composition.js +78 -0
- package/dist/services/memory-baseline-preservation.js +65 -0
- package/dist/services/memory-completed-correction-wave.js +328 -0
- package/dist/services/memory-compose-handler.js +380 -0
- package/dist/services/memory-composition-acceptance.js +375 -0
- package/dist/services/memory-composition-graph.js +165 -0
- package/dist/services/memory-composition-registration.js +161 -0
- package/dist/services/memory-composition-work-custody.js +156 -0
- package/dist/services/memory-composition-work-results.js +108 -0
- package/dist/services/memory-corrected-review-acceptance.js +129 -0
- package/dist/services/memory-corrected-review-batch.js +37 -0
- package/dist/services/memory-corrected-review-findings.js +108 -0
- package/dist/services/memory-corrected-review-inputs.js +215 -0
- package/dist/services/memory-corrected-review-projection.js +78 -0
- package/dist/services/memory-corrected-review-receipt.js +178 -0
- package/dist/services/memory-corrected-review-registration.js +192 -0
- package/dist/services/memory-correction-check-receipt.js +235 -0
- package/dist/services/memory-correction-input-owner.js +6 -0
- package/dist/services/memory-custody-snapshot.js +36 -0
- package/dist/services/memory-discover-handler.js +104 -0
- package/dist/services/memory-finish-evidence.js +457 -0
- package/dist/services/memory-finish-handler.js +229 -0
- package/dist/services/memory-finish-integration.js +491 -0
- package/dist/services/memory-finish-readiness.js +169 -0
- package/dist/services/memory-fix-finish-integration.js +129 -0
- package/dist/services/memory-fix-git-dispatch.js +139 -0
- package/dist/services/memory-fix-intake-custody.js +11 -0
- package/dist/services/memory-fix-intake-settlement.js +127 -0
- package/dist/services/memory-fix-publication.js +196 -0
- package/dist/services/memory-fix-repair-admission.js +116 -0
- package/dist/services/memory-fix-request.js +141 -0
- package/dist/services/memory-fix-run-bundle.js +83 -0
- package/dist/services/memory-fix-scope.js +78 -0
- package/dist/services/memory-fix-sources.js +85 -0
- package/dist/services/memory-fix-stage-entry.js +24 -0
- package/dist/services/memory-fix-stage-handlers.js +282 -0
- package/dist/services/memory-fix-stage-results.js +106 -0
- package/dist/services/memory-fix-workspace.js +127 -0
- package/dist/services/memory-flow-user-inputs.js +88 -0
- package/dist/services/memory-git-integration.js +220 -0
- package/dist/services/memory-historical-corrected-review.js +212 -0
- package/dist/services/memory-historical-original-review.js +143 -0
- package/dist/services/memory-historical-repair-registration.js +105 -0
- package/dist/services/memory-historical-second-review.js +147 -0
- package/dist/services/memory-init-bootstrap-readiness.js +210 -0
- package/dist/services/memory-init-contexts.js +181 -0
- package/dist/services/memory-init-controller-start.js +119 -0
- package/dist/services/memory-init-engine-release.js +223 -0
- package/dist/services/memory-init-git-policy.js +165 -0
- package/dist/services/memory-init-lint-capability.js +203 -0
- package/dist/services/memory-init-native-capacity.js +309 -0
- package/dist/services/memory-init-preflight.js +334 -0
- package/dist/services/memory-init-project-bootstrap.js +599 -0
- package/dist/services/memory-init-request-candidate.js +213 -0
- package/dist/services/memory-init-request-input.js +82 -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 +135 -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 +91 -0
- package/dist/services/memory-init-stores.js +359 -0
- package/dist/services/memory-init-worktrunk-capability.js +174 -0
- package/dist/services/memory-layer-publication.js +611 -0
- package/dist/services/memory-layer.js +225 -0
- package/dist/services/memory-lint-config.js +194 -0
- package/dist/services/memory-native-review-copy.js +127 -0
- package/dist/services/memory-normal-flow-entry.js +87 -0
- package/dist/services/memory-ordinary-defaults.js +129 -0
- package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
- package/dist/services/memory-preflight-handler.js +274 -0
- package/dist/services/memory-repair-current-view.js +299 -0
- package/dist/services/memory-repair-document-delta.js +489 -0
- package/dist/services/memory-repair-history.js +496 -0
- package/dist/services/memory-repair-physical-binding.js +194 -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 +162 -0
- package/dist/services/memory-repair-publication-source.js +225 -0
- package/dist/services/memory-repair-publication.js +795 -0
- package/dist/services/memory-repair-registration.js +240 -0
- package/dist/services/memory-repair-work-baseline.js +415 -0
- package/dist/services/memory-repair-work-completion.js +117 -0
- package/dist/services/memory-repair-work-custody.js +73 -0
- package/dist/services/memory-repair-work-results.js +108 -0
- package/dist/services/memory-repair-workspace.js +261 -0
- package/dist/services/memory-repair-writer-copy.js +736 -0
- package/dist/services/memory-result-binding.js +239 -0
- package/dist/services/memory-retained-review-authority.js +138 -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 +162 -0
- package/dist/services/memory-review-acceptance.js +214 -0
- package/dist/services/memory-review-correction-plan.js +206 -0
- package/dist/services/memory-review-handler.js +585 -0
- package/dist/services/memory-review-inputs.js +246 -0
- package/dist/services/memory-review-limits.js +10 -0
- package/dist/services/memory-review-receipt.js +180 -0
- package/dist/services/memory-review-registration.js +117 -0
- package/dist/services/memory-review-work-custody.js +126 -0
- package/dist/services/memory-review-work-input.js +91 -0
- package/dist/services/memory-review-work-results.js +95 -0
- package/dist/services/memory-second-corrected-review-inputs.js +167 -0
- package/dist/services/memory-second-correction-plan.js +77 -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 +65 -0
- package/dist/services/memory-stage-results.js +290 -0
- package/dist/services/memory-tool-probe.js +25 -0
- package/dist/services/memory-upgrade-analysis-handler.js +243 -0
- package/dist/services/memory-upgrade-bootstrap-readiness.js +251 -0
- package/dist/services/memory-upgrade-evidence.js +100 -0
- package/dist/services/memory-upgrade-inventory.js +442 -0
- package/dist/services/memory-upgrade-publication-custody.js +73 -0
- package/dist/services/memory-upgrade-publication.js +413 -0
- package/dist/services/memory-upgrade-selection.js +430 -0
- package/dist/services/memory-upgrade-start.js +60 -0
- package/dist/services/memory-upgrade-storage-readiness.js +340 -0
- package/dist/services/memory-verification-acceptance.js +156 -0
- package/dist/services/memory-verification-checks.js +317 -0
- package/dist/services/memory-verification-receipt.js +160 -0
- package/dist/services/memory-verify-handler.js +137 -0
- package/dist/services/memory-work-result-json.js +12 -0
- package/dist/services/memory-work-result-preparation.js +64 -0
- package/dist/services/merge-queue.js +228 -149
- package/dist/services/merge-server.js +163 -35
- package/dist/services/migrations.js +164 -114
- package/dist/services/model-catalog.js +109 -0
- package/dist/services/model-discovery.js +46 -0
- package/dist/services/native-daemon-history.js +50 -0
- package/dist/services/native-session-control.js +39 -0
- package/dist/services/operator-profiles.js +236 -0
- package/dist/services/physical-startup.js +45 -0
- package/dist/services/plan-runtime.js +26 -11
- package/dist/services/plans.js +28 -25
- package/dist/services/project-flow-source.js +195 -0
- package/dist/services/project-git-integration.js +92 -0
- package/dist/services/project-registry.js +97 -0
- package/dist/services/project-summary.js +1 -1
- package/dist/services/projects.js +17 -87
- package/dist/services/prompt-delivery.js +71 -0
- package/dist/services/prompts.js +28 -17
- package/dist/services/protocols.js +163 -87
- package/dist/services/provider-capacity.js +463 -0
- package/dist/services/recovery-observation-budget.js +121 -0
- package/dist/services/recovery-snapshot-database.js +588 -0
- package/dist/services/release-archive-producer.js +52 -0
- package/dist/services/release-archive.js +143 -0
- package/dist/services/release-cache.js +150 -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 +29 -0
- package/dist/services/repair-receipt.js +13 -0
- package/dist/services/retained-native-hook.js +274 -0
- package/dist/services/review-copy.js +165 -0
- package/dist/services/review-deferral.js +23 -0
- package/dist/services/review-fix-handoff.js +82 -0
- package/dist/services/review-fix-intake-custody.js +17 -0
- package/dist/services/review-fix-stage-entry.js +43 -0
- package/dist/services/review-fix-stage-handlers.js +176 -0
- package/dist/services/review-fix-stage-results.js +86 -0
- package/dist/services/run-control-receipt.js +56 -0
- package/dist/services/run-control-worker.js +469 -0
- package/dist/services/run-control.js +1109 -0
- package/dist/services/run-controller-adapter.js +434 -0
- package/dist/services/run-controller-capture.js +186 -0
- package/dist/services/run-controller-process.js +226 -0
- package/dist/services/run-controller-recovery.js +335 -0
- package/dist/services/run-controller-state.js +106 -0
- package/dist/services/run-controller.js +1717 -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 +107 -0
- package/dist/services/run-recovery-runtime.js +112 -0
- package/dist/services/run-recovery.js +485 -0
- package/dist/services/run-start-custody.js +189 -0
- package/dist/services/run-timeline.js +59 -0
- package/dist/services/runs.js +996 -271
- package/dist/services/runtime-budget.js +446 -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 +605 -0
- package/dist/services/runtime-scope-stop.js +211 -0
- package/dist/services/runtime-scope-worker.js +314 -0
- package/dist/services/runtime-service.js +19 -14
- package/dist/services/schema-validation.js +10 -8
- package/dist/services/scope-writer-cleanup.js +27 -0
- package/dist/services/sessions.js +37 -91
- package/dist/services/setup.js +427 -0
- package/dist/services/stage-blocker.js +17 -7
- package/dist/services/stage-context.js +240 -18
- package/dist/services/stage-handlers.js +141 -0
- package/dist/services/stage-lifecycle.js +156 -119
- package/dist/services/stage-pause.js +222 -94
- package/dist/services/stage-report-renderer.js +230 -6
- package/dist/services/stage-work-graph.js +52 -0
- package/dist/services/technical-notes.js +31 -0
- package/dist/services/tooling.js +111 -44
- package/dist/services/usage.js +49 -101
- package/dist/services/verification-matrix.js +393 -0
- package/dist/services/version-status.js +1 -1
- package/dist/services/vnext-code-review.js +302 -91
- package/dist/services/vnext-code.js +325 -251
- package/dist/services/vnext-contracts.js +10 -1
- package/dist/services/vnext-execution-profile.js +80 -5
- package/dist/services/vnext-fanout.js +399 -20
- package/dist/services/vnext-merge.js +336 -114
- package/dist/services/vnext-plan-review.js +288 -133
- package/dist/services/vnext-plan.js +257 -110
- package/dist/services/vnext-protocolize.js +534 -96
- package/dist/services/vnext-specify.js +131 -84
- package/dist/services/vnext-workspace-policy.js +7 -2
- package/dist/services/work-registry.js +1950 -215
- package/dist/services/work-retry-context.js +55 -0
- package/dist/services/workspace-bootstrap.js +53 -15
- package/dist/services/workspace-files.js +85 -0
- package/dist/services/worktrees.js +108 -48
- package/dist/shared/entity-references.js +1 -0
- package/dist/shared/errors.js +27 -0
- package/dist/storage/agent-output.js +26 -0
- package/dist/storage/data-preservation.js +65 -0
- package/dist/storage/database.js +931 -40
- package/dist/storage/foreign-key-transaction.js +39 -0
- package/dist/storage/immutable-input.js +45 -0
- package/dist/storage/import-guard.js +159 -0
- package/dist/storage/memory-upgrade-schema-bootstrap.js +38 -0
- package/dist/storage/native-cleanup.js +52 -0
- package/dist/storage/paired-writer-migration.js +424 -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 +96 -0
- package/dist/storage/writer-migration.js +346 -0
- package/dist/storage/writer-restore.js +217 -0
- package/dist/verification-components.json +384 -0
- package/package.json +52 -13
- package/tools/create-canon-release.mjs +33 -0
- package/tools/probe-codex-history.mjs +37 -0
- package/tools/produce-hybrid-release.mjs +41 -0
- package/tools/repair-paused-run-status.mjs +84 -0
- package/tools/verification-jobs.mjs +342 -0
package/dist/services/prompts.js
CHANGED
|
@@ -9,7 +9,8 @@ import { validatePlanItem } from "../domain/validation.js";
|
|
|
9
9
|
import { AppError } from "../shared/errors.js";
|
|
10
10
|
import { parseJsonObject } from "../shared/json.js";
|
|
11
11
|
import { ensureDir, resolveProjectRoot } from "../storage/paths.js";
|
|
12
|
-
import { planWithProgress } from "./plan-runtime.js";
|
|
12
|
+
import { boundCanonicalPlan, planWithProgress, prepareCanonicalPlan } from "./plan-runtime.js";
|
|
13
|
+
import { prepareTextFile } from "../cli/input-preparation.js";
|
|
13
14
|
import { registerFlowJob } from "./sessions.js";
|
|
14
15
|
const profiles = {
|
|
15
16
|
code_implementation: {
|
|
@@ -22,7 +23,7 @@ const profiles = {
|
|
|
22
23
|
static_files: [".memory-bank/dd-flow/common/worker-session.md", ".memory-bank/dd-flow/workers/verify.md"]
|
|
23
24
|
}
|
|
24
25
|
};
|
|
25
|
-
export function
|
|
26
|
+
export function prepareWorkerPrompt(context, input) {
|
|
26
27
|
const projectRoot = resolveProjectRoot(input.projectRoot);
|
|
27
28
|
const project = requireProjectByRoot(context, projectRoot);
|
|
28
29
|
const protocol = requireProtocol(context, protocolIdForRun(context, project.id, input.runId), project.id);
|
|
@@ -43,8 +44,10 @@ export function renderWorkerPrompt(context, input) {
|
|
|
43
44
|
projectId: protocol.project_id,
|
|
44
45
|
protocolId: protocol.id,
|
|
45
46
|
planPath: protocol.plan_path
|
|
46
|
-
});
|
|
47
|
+
}, { bind: false });
|
|
47
48
|
const plan = planRuntime?.plan ?? null;
|
|
49
|
+
if (planRuntime)
|
|
50
|
+
prepareCanonicalPlan(context, { projectId: protocol.project_id, protocolId: protocol.id, planPath: protocol.plan_path }, planRuntime.canonical);
|
|
48
51
|
const genericTask = input.taskFile ? readWorkerTask(input.taskFile, runHomePath(run)) : null;
|
|
49
52
|
const item = genericTask?.item ?? plan?.items.find((candidate) => candidate.id === input.planItemId);
|
|
50
53
|
if (!item)
|
|
@@ -64,13 +67,6 @@ export function renderWorkerPrompt(context, input) {
|
|
|
64
67
|
const profile = profiles[input.profile];
|
|
65
68
|
if (!profile)
|
|
66
69
|
throw new AppError("prompt_profile_unsupported", `Unsupported prompt profile: ${input.profile}`, 2);
|
|
67
|
-
const job = registerFlowJob(context, {
|
|
68
|
-
projectId: protocol.project_id,
|
|
69
|
-
runId: run.id,
|
|
70
|
-
protocolId: protocol.id,
|
|
71
|
-
planItemId: item.id,
|
|
72
|
-
groupId: item.execution_context.planned_write_areas[0] ?? null
|
|
73
|
-
});
|
|
74
70
|
const staticInputs = profile.static_files.map((file) => readStaticInput(projectRoot, file));
|
|
75
71
|
const requiredRead = item.execution_context.required_read.map((file) => checkedReference(projectRoot, runHomePath(run), file, "required_read", true));
|
|
76
72
|
const discoveryBoundary = item.execution_context.discovery_boundary.map((file) => checkedReference(projectRoot, runHomePath(run), file, "discovery_boundary", false));
|
|
@@ -78,7 +74,6 @@ export function renderWorkerPrompt(context, input) {
|
|
|
78
74
|
const runHome = runHomePath(run);
|
|
79
75
|
const outputDir = path.join(runHome, stage.dir, "subagents", item.id);
|
|
80
76
|
assertWithin(runHome, outputDir, "output directory");
|
|
81
|
-
ensureDir(outputDir);
|
|
82
77
|
const prompt = renderPrompt({
|
|
83
78
|
item,
|
|
84
79
|
input,
|
|
@@ -90,6 +85,20 @@ export function renderWorkerPrompt(context, input) {
|
|
|
90
85
|
staticInputs,
|
|
91
86
|
...(genericTask ? { handoff: genericTask.handoff } : {})
|
|
92
87
|
});
|
|
88
|
+
return { protocol, run, item, plan, planRuntime, genericTask, workspaceRoot, staticInputs, requiredRead, discoveryBoundary, plannedWriteAreas, outputDir, prompt, canonVersion: readCanonVersion(projectRoot) };
|
|
89
|
+
}
|
|
90
|
+
export function renderWorkerPrompt(context, input, prepared = prepareWorkerPrompt(context, input)) {
|
|
91
|
+
const { protocol, run, item, plan, planRuntime, genericTask, workspaceRoot, staticInputs, requiredRead, discoveryBoundary, plannedWriteAreas, outputDir, prompt, canonVersion } = prepared;
|
|
92
|
+
if (planRuntime)
|
|
93
|
+
boundCanonicalPlan(context, { projectId: protocol.project_id, protocolId: protocol.id, planPath: protocol.plan_path }, planRuntime.canonical);
|
|
94
|
+
const job = registerFlowJob(context, {
|
|
95
|
+
projectId: protocol.project_id,
|
|
96
|
+
runId: run.id,
|
|
97
|
+
protocolId: protocol.id,
|
|
98
|
+
planItemId: item.id,
|
|
99
|
+
groupId: item.execution_context.planned_write_areas[0] ?? null
|
|
100
|
+
});
|
|
101
|
+
ensureDir(outputDir);
|
|
93
102
|
const promptPath = path.join(outputDir, "launch-prompt.md");
|
|
94
103
|
const stackPath = path.join(outputDir, "prompt-stack.json");
|
|
95
104
|
const reportPath = path.join(outputDir, "render-report.json");
|
|
@@ -104,7 +113,7 @@ export function renderWorkerPrompt(context, input) {
|
|
|
104
113
|
plan_item_id: input.taskFile ? null : item.id,
|
|
105
114
|
task_id: input.taskFile ? item.id : null,
|
|
106
115
|
job_id: job.job_id,
|
|
107
|
-
canon_version:
|
|
116
|
+
canon_version: canonVersion,
|
|
108
117
|
renderer_version: getCliVersionReport().cli.version,
|
|
109
118
|
static_inputs: staticInputs.map(({ path: inputPath, sha256 }) => ({ path: inputPath, sha256 })),
|
|
110
119
|
validation: { required_read: requiredRead, discovery_boundary: discoveryBoundary, planned_write_areas: plannedWriteAreas },
|
|
@@ -143,9 +152,7 @@ function runHomePath(run) {
|
|
|
143
152
|
function readWorkerTask(taskFile, runHome) {
|
|
144
153
|
const resolved = path.resolve(taskFile);
|
|
145
154
|
assertWithin(runHome, resolved, "worker task file");
|
|
146
|
-
|
|
147
|
-
throw new AppError("not_found", "Worker task file is missing", 1, { path: taskFile });
|
|
148
|
-
const task = parseJsonObject(fs.readFileSync(resolved, "utf8"), resolved);
|
|
155
|
+
const task = parseJsonObject(prepareTextFile(resolved, "worker task").text, resolved);
|
|
149
156
|
if (task.schema_id !== "dd-flow/worker-task@1" || !task.task || typeof task.task !== "object") {
|
|
150
157
|
throw new AppError("validation", "Worker task must use dd-flow/worker-task@1 with a task object", 2, { path: taskFile });
|
|
151
158
|
}
|
|
@@ -180,7 +187,7 @@ function validateWorkerTaskHandoff(value, runHome) {
|
|
|
180
187
|
const reportPath = path.resolve(report.report_path);
|
|
181
188
|
assertWithin(runHome, reportPath, "predecessor report");
|
|
182
189
|
if (!fs.existsSync(reportPath))
|
|
183
|
-
throw new AppError("
|
|
190
|
+
throw new AppError("runtime_artifact_missing", "Accepted predecessor report is missing", 1, { path: report.report_path });
|
|
184
191
|
return { aspect_id: report.aspect_id, verdict, report_path: reportPath };
|
|
185
192
|
});
|
|
186
193
|
const recovery = handoff.recovery_attempt_paths ?? [];
|
|
@@ -261,7 +268,9 @@ function assertGitFacts(workspaceRoot, expected, runId) {
|
|
|
261
268
|
if (!expected?.head && !expected?.branch)
|
|
262
269
|
return;
|
|
263
270
|
const read = (args) => {
|
|
264
|
-
const result = spawnSync("git", ["-C", workspaceRoot, ...args.split(" ")], { encoding: "utf8" });
|
|
271
|
+
const result = spawnSync("git", ["-C", workspaceRoot, ...args.split(" ")], { encoding: "utf8", timeout: 5000 });
|
|
272
|
+
if (result.error || result.signal)
|
|
273
|
+
throw new AppError("git_observation_unavailable", "Cannot establish RUN workspace identity", 1, { run_id: runId, effect: "unknown" });
|
|
265
274
|
return result.status === 0 ? result.stdout.trim() || null : null;
|
|
266
275
|
};
|
|
267
276
|
const actual = { branch: read("branch --show-current"), head: read("rev-parse HEAD") };
|
|
@@ -293,6 +302,8 @@ function renderPrompt(input) {
|
|
|
293
302
|
`- Acceptance contribution: ${item.semantic_spine?.acceptance_contribution ?? "not_applicable"}`,
|
|
294
303
|
"",
|
|
295
304
|
"## Hard Write Boundary",
|
|
305
|
+
"Before editing, change into the project workspace shown below (cd -- WORKSPACE) or use its absolute path when the tool cannot persist cwd.",
|
|
306
|
+
"Write only the project workspace and the named report directory; never write another RUN/native home or Git/worktree control data.",
|
|
296
307
|
`- All project writes must stay under: \`${input.workspaceRoot}\``,
|
|
297
308
|
"- Do not write outside this workspace, to another RUN, or into Git/worktree control data.",
|
|
298
309
|
"- Accepted requirements and non-goals remain binding; planned write areas do not.",
|
|
@@ -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");
|