@deksden-com/dd-flow-cli 0.9.0-beta.15 → 0.9.0-beta.151
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 +907 -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 +386 -0
- package/dist/cli/command-metadata.js +232 -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/diagnostic-invocation.js +46 -0
- package/dist/cli/diagnostic.js +120 -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 +396 -19
- package/dist/cli/hook-ingress.js +102 -0
- package/dist/cli/input-preparation.js +165 -0
- package/dist/cli/memory-flow-admission.js +50 -0
- package/dist/cli/memory-init-invocation.js +85 -0
- package/dist/cli/memory-init.js +249 -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 +90 -0
- package/dist/cli/native-hook-preparation.js +55 -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 +1734 -550
- 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 +89 -2
- package/dist/domain/diagnostic-aspects.js +103 -0
- package/dist/domain/diagnostic-flows.js +8 -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 +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-error-boundary.mjs +79 -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 +216 -0
- package/dist/harness-runtime/lib/agy-native_pb.js +117 -0
- package/dist/harness-runtime/lib/agy-terminal-envelope.mjs +67 -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 +2 -0
- package/dist/harness-runtime/lib/daemon-operations.mjs +462 -0
- package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +6 -0
- package/dist/harness-runtime/lib/dd-agy-daemon.mjs +1092 -0
- package/dist/harness-runtime/lib/dd-agy.mjs +86 -0
- package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-codex-daemon.mjs +231 -0
- package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-codex.mjs +954 -0
- package/dist/harness-runtime/lib/dd-droid-daemon.mjs +141 -0
- package/dist/harness-runtime/lib/dd-droid.mjs +626 -0
- package/dist/harness-runtime/lib/dd-grok-daemon.mjs +555 -0
- package/dist/harness-runtime/lib/dd-grok.mjs +180 -0
- package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +627 -0
- package/dist/harness-runtime/lib/dd-opencode.mjs +390 -0
- package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +752 -0
- package/dist/harness-runtime/lib/dd-zcode.mjs +1200 -0
- package/dist/harness-runtime/lib/delegation-instructions.d.mts +14 -0
- package/dist/harness-runtime/lib/delegation-instructions.mjs +166 -0
- package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
- package/dist/harness-runtime/lib/driver-recovery.mjs +140 -0
- package/dist/harness-runtime/lib/droid-observation.mjs +66 -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 +10 -0
- package/dist/harness-runtime/lib/lifecycle-contract.mjs +19 -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 +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 +95 -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 +16 -0
- package/dist/harness-runtime/lib/operation-errors.mjs +127 -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 +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 +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-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/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/execution-bundle.schema.json +211 -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/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 +1 -1
- package/dist/schemas/release-impact.schema.json +3 -3
- 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/stage-start-response.schema.json +4 -0
- package/dist/schemas/vnext-protocol-plan.schema.json +2 -2
- package/dist/services/accepted-intent.js +139 -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 +277 -0
- package/dist/services/check-runner-proof.js +305 -0
- package/dist/services/cleanup.js +133 -40
- package/dist/services/cli-operation-classifier.js +26 -63
- package/dist/services/cli-upgrade-allowlist.js +27 -0
- package/dist/services/code-checks.js +1401 -119
- package/dist/services/codex-hook-delivery.js +32 -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 +20 -0
- package/dist/services/controller-child-capacity.js +71 -0
- package/dist/services/controller-child-observer.js +121 -0
- package/dist/services/controller-execution.js +94 -0
- package/dist/services/controller-fanout.js +226 -0
- package/dist/services/controller-memory-task.js +45 -0
- package/dist/services/controller-memory-worker.js +49 -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 +107 -0
- package/dist/services/descriptor-run-start.js +475 -0
- package/dist/services/descriptor-stage-coordinator.js +250 -0
- package/dist/services/descriptor-stage-settlement.js +223 -0
- package/dist/services/descriptor-stage-start.js +175 -0
- package/dist/services/diagnostic-evidence.js +73 -0
- package/dist/services/diagnostic-report-publication.js +72 -0
- package/dist/services/diagnostic-report.js +67 -0
- package/dist/services/diagnostic-run-bundle.js +74 -0
- package/dist/services/diagnostic-snapshot.js +159 -0
- package/dist/services/diagnostic-stage-handlers.js +108 -0
- package/dist/services/diagnostic-stage-results.js +132 -0
- package/dist/services/diagnostic-start.js +84 -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/engines.js +354 -163
- package/dist/services/eval-snapshots.js +1316 -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 +310 -0
- package/dist/services/flow-catalog.js +30 -0
- package/dist/services/flow-descriptors.js +82 -0
- package/dist/services/frozen-engine.js +387 -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/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 +791 -326
- package/dist/services/hybrid-contracts.js +474 -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 +226 -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 +2148 -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 +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 +400 -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 +450 -0
- package/dist/services/memory-finish-readiness.js +169 -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 +131 -0
- package/dist/services/memory-init-controller-start.js +103 -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 +221 -0
- package/dist/services/memory-lint-config.js +194 -0
- package/dist/services/memory-native-review-copy.js +103 -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 +488 -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-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 +31 -0
- package/dist/services/repair-receipt.js +13 -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 +428 -0
- package/dist/services/run-control.js +1092 -0
- package/dist/services/run-controller-adapter.js +400 -0
- package/dist/services/run-controller-capture.js +186 -0
- package/dist/services/run-controller-process.js +205 -0
- package/dist/services/run-controller-recovery.js +295 -0
- package/dist/services/run-controller-state.js +97 -0
- package/dist/services/run-controller.js +1395 -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 +456 -0
- package/dist/services/run-start-custody.js +189 -0
- package/dist/services/runs.js +1023 -246
- 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 +36 -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 +89 -0
- package/dist/services/stage-lifecycle.js +152 -116
- package/dist/services/stage-pause.js +202 -91
- package/dist/services/stage-report-renderer.js +234 -6
- package/dist/services/stage-work-graph.js +52 -0
- package/dist/services/tooling.js +41 -30
- 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 +235 -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 +355 -21
- package/dist/services/vnext-merge.js +332 -111
- package/dist/services/vnext-plan-review.js +287 -132
- package/dist/services/vnext-plan.js +228 -104
- package/dist/services/vnext-protocolize.js +533 -95
- package/dist/services/vnext-specify.js +123 -81
- package/dist/services/vnext-workspace-policy.js +7 -2
- package/dist/services/work-registry.js +1706 -200
- package/dist/services/workspace-bootstrap.js +53 -15
- package/dist/services/workspace-files.js +85 -0
- package/dist/services/worktrees.js +105 -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 +930 -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 +299 -0
- package/package.json +51 -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
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { AppError } from "../shared/errors.js";
|
|
3
|
+
import { appendAudit } from "./audit.js";
|
|
4
|
+
import { hybridDigest } from "./hybrid-contracts.js";
|
|
5
|
+
import { isMemoryCorrectionInputOwner } from "./memory-correction-input-owner.js";
|
|
6
|
+
import { PreparedMemoryCorrectionCheckReceipt } from "./memory-correction-check-receipt.js";
|
|
7
|
+
import { memoryCorrectedReviewBatch } from "./memory-corrected-review-batch.js";
|
|
8
|
+
import { addWorkBatch, prepareWorkBatch, readWorkBatchCustody } from "./work-registry.js";
|
|
9
|
+
import { memoryReviewRegistrationByteLimit } from "./memory-review-limits.js";
|
|
10
|
+
const token = Symbol("registered-corrected-memory-review");
|
|
11
|
+
const event = "memory.corrected_review_registration";
|
|
12
|
+
function refuse(reason) {
|
|
13
|
+
throw new AppError("memory_corrected_review_registration_invalid", "Corrected reviewers lack independent current-view, checks and allocation custody", 2, { reason, effect: "no_effect" });
|
|
14
|
+
}
|
|
15
|
+
function batchScope(view) {
|
|
16
|
+
return { project_id: view.scope.project_id, run_id: view.scope.run_id, stage: "review", attempt: view.scope.attempt,
|
|
17
|
+
cycle: "", parent_work_id: view.scope.parent_work_id, request_key: `memory-review-wave-${view.wave}` };
|
|
18
|
+
}
|
|
19
|
+
function selected(context, inputs, checks) {
|
|
20
|
+
inputs.assertCustody(context);
|
|
21
|
+
checks.assertOwner(inputs);
|
|
22
|
+
checks.assertRegisteredCustody(context);
|
|
23
|
+
const view = inputs.value(), scope = view.scope;
|
|
24
|
+
const receipt = readRetainedRegistration(context, scope, inputs.sha256, checks.sha256, view.wave);
|
|
25
|
+
if (receipt && hybridDigest(receipt.view) !== hybridDigest(view))
|
|
26
|
+
refuse("changed_registration");
|
|
27
|
+
return receipt;
|
|
28
|
+
}
|
|
29
|
+
/** SQL-only retained allocation proof. Expected identities must be pinned by
|
|
30
|
+
* an independent accepted receipt. This reader never grants current-view or
|
|
31
|
+
* new allocation rights and does not inspect an obsolete private copy. */
|
|
32
|
+
export function readRetainedCorrectedMemoryReviewRegistration(context, scope, inputSha256, checkReceiptSha256) {
|
|
33
|
+
return readRetainedRegistration(context, scope, inputSha256, checkReceiptSha256, 1);
|
|
34
|
+
}
|
|
35
|
+
/** Second historical metadata only, pinned by independent accepted hashes.
|
|
36
|
+
* This is not a current input owner or allocation admission. */
|
|
37
|
+
export function readRetainedSecondCorrectedMemoryReviewRegistration(context, scope, inputSha256, checkReceiptSha256) {
|
|
38
|
+
return readRetainedRegistration(context, scope, inputSha256, checkReceiptSha256, 2);
|
|
39
|
+
}
|
|
40
|
+
function readRetainedRegistration(context, scope, inputSha256, checkReceiptSha256, wave) {
|
|
41
|
+
const rows = context.db.all("SELECT payload_json FROM audit_events WHERE project_id=? AND event_type=? AND json_extract(payload_json,'$.run_id')=? AND json_extract(payload_json,'$.scope.attempt')=? AND json_extract(payload_json,'$.scope.parent_work_id')=? AND json_extract(payload_json,'$.wave')=? LIMIT 2", [scope.project_id, event, scope.run_id, scope.attempt, scope.parent_work_id, wave]);
|
|
42
|
+
if (!rows.length)
|
|
43
|
+
return null;
|
|
44
|
+
if (rows.length !== 1 || Buffer.byteLength(rows[0].payload_json) > memoryReviewRegistrationByteLimit)
|
|
45
|
+
refuse("ambiguous_or_unbounded_registration");
|
|
46
|
+
let receipt;
|
|
47
|
+
try {
|
|
48
|
+
receipt = JSON.parse(rows[0].payload_json);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return refuse("invalid_registration");
|
|
52
|
+
}
|
|
53
|
+
const view = receipt?.view;
|
|
54
|
+
if (!view || hybridDigest(view.scope) !== hybridDigest(scope) || view.wave !== wave
|
|
55
|
+
|| hybridDigest(view) !== inputSha256 || !/^[a-f0-9]{64}$/.test(inputSha256)
|
|
56
|
+
|| !/^[a-f0-9]{64}$/.test(checkReceiptSha256))
|
|
57
|
+
refuse("changed_retained_view");
|
|
58
|
+
const batch = memoryCorrectedReviewBatch(view), ids = receipt?.work_ids;
|
|
59
|
+
if (!ids || typeof ids !== "object" || Array.isArray(ids)
|
|
60
|
+
|| Object.keys(ids).length !== batch.works.length || Object.values(ids).some(id => typeof id !== "string" || !id)
|
|
61
|
+
|| new Set(Object.values(ids)).size !== batch.works.length)
|
|
62
|
+
refuse("invalid_work_ids");
|
|
63
|
+
const expected = { schema_id: "dd-flow/memory-corrected-review-registration@1", run_id: scope.run_id, scope, wave: view.wave,
|
|
64
|
+
input_sha256: inputSha256, view, check_receipt_sha256: checkReceiptSha256, batch_sha256: hybridDigest(batch.works), work_ids: ids };
|
|
65
|
+
if (hybridDigest(receipt) !== hybridDigest(expected))
|
|
66
|
+
refuse("changed_registration");
|
|
67
|
+
for (const item of batch.works) {
|
|
68
|
+
const id = ids[item.key];
|
|
69
|
+
if (!id)
|
|
70
|
+
refuse("missing_review_work");
|
|
71
|
+
const custody = readWorkBatchCustody(context, id);
|
|
72
|
+
if (custody.item_key !== item.key || custody.batch_sha256 !== expected.batch_sha256
|
|
73
|
+
|| hybridDigest(custody.scope) !== hybridDigest(batchScope(view))
|
|
74
|
+
|| hybridDigest(custody.work_ids) !== hybridDigest(ids))
|
|
75
|
+
refuse("changed_work_custody");
|
|
76
|
+
const work = context.db.get("SELECT parent_work_id,task,launch_policy,result_schema,payload_json,depends_on_json FROM works WHERE project_id=? AND run_id=? AND work_id=?", [scope.project_id, scope.run_id, id]);
|
|
77
|
+
let payload, dependencies;
|
|
78
|
+
try {
|
|
79
|
+
payload = JSON.parse(work?.payload_json ?? "null");
|
|
80
|
+
dependencies = JSON.parse(work?.depends_on_json ?? "null");
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return refuse("invalid_review_work");
|
|
84
|
+
}
|
|
85
|
+
if (!work || work.parent_work_id !== scope.parent_work_id || work.task !== item.task
|
|
86
|
+
|| work.launch_policy !== item.launch_policy || work.result_schema !== item.result_schema
|
|
87
|
+
|| hybridDigest(dependencies) !== hybridDigest([])
|
|
88
|
+
|| hybridDigest(payload) !== hybridDigest({ ...item.payload, _dd_flow_batch_request: {
|
|
89
|
+
request_sha256: custody.request_sha256, batch_sha256: custody.batch_sha256, item_key: item.key
|
|
90
|
+
} }))
|
|
91
|
+
refuse("changed_review_work");
|
|
92
|
+
}
|
|
93
|
+
return structuredClone(receipt);
|
|
94
|
+
}
|
|
95
|
+
/** A selective wave is allocated only after independent current-view checks.
|
|
96
|
+
* The generic batch and this receipt commit together. Replay never allocates
|
|
97
|
+
* replacements after receipt loss and never grants provider or Session scope. */
|
|
98
|
+
export class PreparedRegisteredCorrectedMemoryReview {
|
|
99
|
+
static isPrepared(value) {
|
|
100
|
+
return typeof value === "object" && value !== null && #inputs in value;
|
|
101
|
+
}
|
|
102
|
+
sha256;
|
|
103
|
+
#inputs;
|
|
104
|
+
#checks;
|
|
105
|
+
#receipt;
|
|
106
|
+
constructor(key, inputs, checks, receipt) {
|
|
107
|
+
if (key !== token)
|
|
108
|
+
refuse("registration_token_required");
|
|
109
|
+
this.#inputs = inputs;
|
|
110
|
+
this.#checks = checks;
|
|
111
|
+
this.#receipt = structuredClone(receipt);
|
|
112
|
+
this.sha256 = hybridDigest(receipt);
|
|
113
|
+
Object.freeze(this);
|
|
114
|
+
}
|
|
115
|
+
static restore(context, inputs, checks) {
|
|
116
|
+
if (!isMemoryCorrectionInputOwner(inputs) || !PreparedMemoryCorrectionCheckReceipt.isPrepared(checks))
|
|
117
|
+
refuse("prepared_registration_owners_required");
|
|
118
|
+
if (context.db.isOwnedWriteTransaction?.())
|
|
119
|
+
refuse("preparation_outside_writer_required");
|
|
120
|
+
checks.assertOwner(inputs);
|
|
121
|
+
checks.revalidate(context);
|
|
122
|
+
checks.assertRegisteredCustody(context);
|
|
123
|
+
const receipt = context.db.readSnapshot(() => selected(context, inputs, checks));
|
|
124
|
+
if (!receipt)
|
|
125
|
+
refuse("registered_corrected_review_required");
|
|
126
|
+
const prepared = new PreparedRegisteredCorrectedMemoryReview(token, inputs, checks, receipt);
|
|
127
|
+
prepared.assertCustody(context);
|
|
128
|
+
return prepared;
|
|
129
|
+
}
|
|
130
|
+
receipt() { return structuredClone(this.#receipt); }
|
|
131
|
+
inputs() { return this.#inputs; }
|
|
132
|
+
batch() { return memoryCorrectedReviewBatch(this.#inputs.value()); }
|
|
133
|
+
assertCustody(context) {
|
|
134
|
+
if (hybridDigest(selected(context, this.#inputs, this.#checks)) !== this.sha256)
|
|
135
|
+
refuse("registered_review_custody_changed");
|
|
136
|
+
}
|
|
137
|
+
revalidate(context) {
|
|
138
|
+
this.#checks.revalidate(context);
|
|
139
|
+
this.assertCustody(context);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export function registerCorrectedMemoryReview(context, inputs, checks) {
|
|
143
|
+
if (!isMemoryCorrectionInputOwner(inputs) || !PreparedMemoryCorrectionCheckReceipt.isPrepared(checks))
|
|
144
|
+
refuse("prepared_registration_owners_required");
|
|
145
|
+
if (context.db.isOwnedWriteTransaction?.())
|
|
146
|
+
refuse("preparation_outside_writer_required");
|
|
147
|
+
checks.assertOwner(inputs);
|
|
148
|
+
checks.assertRegisteredCustody(context);
|
|
149
|
+
const view = inputs.value(), batch = memoryCorrectedReviewBatch(view), scope = batchScope(view);
|
|
150
|
+
const batchInput = { parentWorkId: scope.parent_work_id, requestKey: scope.request_key, stage: "review", value: batch };
|
|
151
|
+
const prepared = prepareWorkBatch(context, batchInput);
|
|
152
|
+
inputs.revalidate(context);
|
|
153
|
+
checks.revalidate(context);
|
|
154
|
+
const result = context.db.writeTransaction(() => {
|
|
155
|
+
if (!context.db.isOwnedWriteTransaction?.())
|
|
156
|
+
refuse("owned_registration_writer_required");
|
|
157
|
+
const prior = selected(context, inputs, checks);
|
|
158
|
+
if (!prior) {
|
|
159
|
+
// If allocation committed without this receipt, do not manufacture a
|
|
160
|
+
// new wave or adopt an orphaned Work graph from its status alone.
|
|
161
|
+
if (context.db.get("SELECT 1 FROM works w JOIN stage_work_memberships m ON m.work_id=w.work_id AND m.project_id=w.project_id AND m.run_id=w.run_id WHERE w.project_id=? AND w.run_id=? AND w.parent_work_id=? AND m.stage='review' AND m.attempt=? AND json_extract(w.payload_json,'$.kind')='memory-review' AND json_extract(w.payload_json,'$.memory_review.wave')=? LIMIT 1", [scope.project_id, scope.run_id, scope.parent_work_id, scope.attempt, view.wave]))
|
|
162
|
+
refuse("review_registration_missing");
|
|
163
|
+
inputs.assertAllocationAllowed(context);
|
|
164
|
+
}
|
|
165
|
+
const allocated = addWorkBatch(context, { ...batchInput, prepared }), ids = allocated.work_ids;
|
|
166
|
+
if (prior) {
|
|
167
|
+
if (!allocated.replayed || hybridDigest(ids) !== hybridDigest(prior.work_ids))
|
|
168
|
+
refuse("changed_allocation");
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
if (allocated.replayed)
|
|
172
|
+
refuse("review_registration_missing");
|
|
173
|
+
const receipt = { schema_id: "dd-flow/memory-corrected-review-registration@1", run_id: scope.run_id, scope: view.scope, wave: view.wave,
|
|
174
|
+
input_sha256: inputs.sha256, view, check_receipt_sha256: checks.sha256, batch_sha256: hybridDigest(batch.works), work_ids: ids };
|
|
175
|
+
if (Buffer.byteLength(JSON.stringify(receipt)) > memoryReviewRegistrationByteLimit)
|
|
176
|
+
refuse("unbounded_registration");
|
|
177
|
+
appendAudit(context, { projectId: scope.project_id, eventType: event, payload: receipt });
|
|
178
|
+
}
|
|
179
|
+
const retained = selected(context, inputs, checks);
|
|
180
|
+
if (!retained)
|
|
181
|
+
refuse("registration_readback_missing");
|
|
182
|
+
return { input_sha256: retained.input_sha256, wave: view.wave, work_ids: { ...retained.work_ids }, replayed: Boolean(prior) };
|
|
183
|
+
}, "memory.registerCorrectedReview");
|
|
184
|
+
try {
|
|
185
|
+
inputs.revalidate(context);
|
|
186
|
+
checks.revalidate(context);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
throw new AppError("memory_corrected_review_registration_pending", "Reviewer allocation committed but current-view revalidation needs recovery", 1, { effect: "committed", input_sha256: inputs.sha256, work_ids: result.work_ids, cause: error instanceof Error ? error.message : String(error) });
|
|
190
|
+
}
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { AppError } from "../shared/errors.js";
|
|
3
|
+
import { hybridDigest } from "./hybrid-contracts.js";
|
|
4
|
+
import { appendAudit } from "./audit.js";
|
|
5
|
+
import { PreparedRetainedCheckEvidence } from "./code-checks.js";
|
|
6
|
+
import { isMemoryCorrectionInputOwner } from "./memory-correction-input-owner.js";
|
|
7
|
+
import { PreparedMemoryVerificationChecks } from "./memory-verification-checks.js";
|
|
8
|
+
import { runtimeCommand } from "./runtime-command.js";
|
|
9
|
+
const token = Symbol("memory-correction-check-receipt");
|
|
10
|
+
const event = "memory.correction_checks";
|
|
11
|
+
function refuse(reason) {
|
|
12
|
+
throw new AppError("memory_correction_checks_invalid", "Correction checks lack independent current-view and policy custody", 2, { reason, effect: "no_effect" });
|
|
13
|
+
}
|
|
14
|
+
function stored(context, corrected) {
|
|
15
|
+
corrected.assertCustody(context);
|
|
16
|
+
const view = corrected.value();
|
|
17
|
+
const rows = context.db.all("SELECT payload_json FROM audit_events WHERE project_id=? AND event_type=? AND json_extract(payload_json,'$.run_id')=? AND json_extract(payload_json,'$.wave')=? LIMIT 2", [view.scope.project_id, event, view.scope.run_id, view.wave]);
|
|
18
|
+
if (!rows.length)
|
|
19
|
+
return null;
|
|
20
|
+
if (rows.length !== 1 || Buffer.byteLength(rows[0].payload_json) > 2 * 1024 * 1024)
|
|
21
|
+
refuse("ambiguous_or_unbounded_check_receipt");
|
|
22
|
+
let value;
|
|
23
|
+
try {
|
|
24
|
+
value = JSON.parse(rows[0].payload_json);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return refuse("invalid_check_receipt");
|
|
28
|
+
}
|
|
29
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
30
|
+
refuse("invalid_check_receipt");
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
/** Independent finite-check acceptance, not reviewer or Stage acceptance.
|
|
34
|
+
* Registration and reconnect use exact current-view evidence. They never
|
|
35
|
+
* execute a command, allocate Work or declare semantic completeness. */
|
|
36
|
+
export class PreparedMemoryCorrectionCheckReceipt {
|
|
37
|
+
static isPrepared(value) {
|
|
38
|
+
return typeof value === "object" && value !== null && #corrected in value;
|
|
39
|
+
}
|
|
40
|
+
sha256;
|
|
41
|
+
#corrected;
|
|
42
|
+
#policy;
|
|
43
|
+
#evidence;
|
|
44
|
+
#receipt;
|
|
45
|
+
#registered;
|
|
46
|
+
constructor(key, corrected, policy, evidence, receipt, registered) {
|
|
47
|
+
if (key !== token)
|
|
48
|
+
refuse("check_receipt_token_required");
|
|
49
|
+
this.#corrected = corrected;
|
|
50
|
+
this.#policy = policy;
|
|
51
|
+
this.#evidence = evidence;
|
|
52
|
+
this.#receipt = structuredClone(receipt);
|
|
53
|
+
this.#registered = registered;
|
|
54
|
+
this.sha256 = hybridDigest(receipt);
|
|
55
|
+
Object.freeze(this);
|
|
56
|
+
}
|
|
57
|
+
static prepare(context, corrected, policy) {
|
|
58
|
+
if (!isMemoryCorrectionInputOwner(corrected) || !PreparedMemoryVerificationChecks.isPrepared(policy))
|
|
59
|
+
refuse("prepared_check_owners_required");
|
|
60
|
+
if (context.db.isOwnedWriteTransaction?.())
|
|
61
|
+
refuse("preparation_outside_writer_required");
|
|
62
|
+
policy.assertCorrectionOwner(corrected);
|
|
63
|
+
// evidence() revalidates the policy and its exact bound correction owner.
|
|
64
|
+
const view = corrected.value(), evidence = policy.evidence(context);
|
|
65
|
+
evidence.assertOwner({ projectId: view.scope.project_id, runId: view.scope.run_id, scope: "aggregate" });
|
|
66
|
+
const receipt = { schema_id: "dd-flow/memory-correction-checks@1", project_id: view.scope.project_id, run_id: view.scope.run_id,
|
|
67
|
+
wave: view.wave, review_input_sha256: view.scope.input_sha256, corrected_input_sha256: corrected.sha256,
|
|
68
|
+
completed_correction_sha256: view.completed_correction_sha256, profile_sha256: policy.profileHash(),
|
|
69
|
+
declarations_sha256: hybridDigest(policy.declarations()), checks: evidence.retainedReferences(context) };
|
|
70
|
+
if (!receipt.checks.length || receipt.checks.length > 4096 || Buffer.byteLength(JSON.stringify(receipt)) > 2 * 1024 * 1024)
|
|
71
|
+
refuse("unbounded_check_receipt");
|
|
72
|
+
const existing = context.db.readSnapshot(() => stored(context, corrected));
|
|
73
|
+
if (existing && hybridDigest(existing) !== hybridDigest(receipt))
|
|
74
|
+
refuse("registered_check_receipt_changed");
|
|
75
|
+
const prepared = new PreparedMemoryCorrectionCheckReceipt(token, corrected, policy, evidence, receipt, Boolean(existing));
|
|
76
|
+
prepared.assertCustody(context);
|
|
77
|
+
return prepared;
|
|
78
|
+
}
|
|
79
|
+
static restore(context, corrected) {
|
|
80
|
+
if (!isMemoryCorrectionInputOwner(corrected))
|
|
81
|
+
refuse("prepared_check_owners_required");
|
|
82
|
+
if (context.db.isOwnedWriteTransaction?.())
|
|
83
|
+
refuse("preparation_outside_writer_required");
|
|
84
|
+
const existing = context.db.readSnapshot(() => stored(context, corrected));
|
|
85
|
+
if (!existing) {
|
|
86
|
+
const view = corrected.value(), projectRoot = corrected.bundle().execution.snapshot().scope.projectRoot;
|
|
87
|
+
const args = ["--run", view.scope.run_id, "--project-root", projectRoot, "--wave", String(view.wave), "--json"];
|
|
88
|
+
throw new AppError("memory_correction_checks_invalid", "Correction checks have not been registered for the settled corrected view", 2, { reason: "registered_check_receipt_required", phase: "prepare", effect: "no_effect", recoverable: true,
|
|
89
|
+
correction_instruction: `Run ${runtimeCommand(context, ["memory", "corrections", "checks", ...args])}, then ${runtimeCommand(context, ["memory", "review", "selective-register", ...args])}. End this Turn so the controller can dispatch the independent reviewers. Use retry_command only after their selective review completes; do not retry Finish before checks and selective review.` });
|
|
90
|
+
}
|
|
91
|
+
const bundle = corrected.bundle(), scope = corrected.value().scope;
|
|
92
|
+
const policy = PreparedMemoryVerificationChecks.prepare(context, { projectId: scope.project_id, runId: scope.run_id,
|
|
93
|
+
execution: bundle.execution, flow: bundle.descriptor, corrected });
|
|
94
|
+
// Registered execution belongs to its original environment, not the
|
|
95
|
+
// controller/reviewer's current shell. Keep exact current document and
|
|
96
|
+
// policy custody, then restore the sealed execution instead of selecting
|
|
97
|
+
// fresh evidence using the observer's environment.
|
|
98
|
+
const view = corrected.value(), receipt = historicalReceipt(context, { projectId: scope.project_id, runId: scope.run_id,
|
|
99
|
+
wave: view.wave, receiptSha256: hybridDigest(existing), correctedInputSha256: corrected.sha256 });
|
|
100
|
+
const expected = { schema_id: "dd-flow/memory-correction-checks@1", project_id: scope.project_id, run_id: scope.run_id,
|
|
101
|
+
wave: view.wave, review_input_sha256: scope.input_sha256, corrected_input_sha256: corrected.sha256,
|
|
102
|
+
completed_correction_sha256: view.completed_correction_sha256, profile_sha256: policy.profileHash(),
|
|
103
|
+
declarations_sha256: hybridDigest(policy.declarations()), checks: receipt.checks };
|
|
104
|
+
if (hybridDigest(receipt) !== hybridDigest(expected))
|
|
105
|
+
refuse("registered_check_receipt_changed");
|
|
106
|
+
const evidence = PreparedRetainedCheckEvidence.prepare(context, { projectId: scope.project_id, runId: scope.run_id, references: receipt.checks });
|
|
107
|
+
const prepared = new PreparedMemoryCorrectionCheckReceipt(token, corrected, policy, evidence, receipt, true);
|
|
108
|
+
prepared.revalidate(context);
|
|
109
|
+
return prepared;
|
|
110
|
+
}
|
|
111
|
+
value() {
|
|
112
|
+
return structuredClone(this.#receipt);
|
|
113
|
+
}
|
|
114
|
+
assertOwner(corrected) {
|
|
115
|
+
if (!isMemoryCorrectionInputOwner(corrected) || corrected.sha256 !== this.#corrected.sha256)
|
|
116
|
+
refuse("foreign_corrected_check_receipt");
|
|
117
|
+
}
|
|
118
|
+
assertRegisteredCustody(context) {
|
|
119
|
+
if (!this.#registered)
|
|
120
|
+
refuse("registered_check_receipt_required");
|
|
121
|
+
this.assertCustody(context);
|
|
122
|
+
}
|
|
123
|
+
assertCustody(context) {
|
|
124
|
+
this.#corrected.assertCustody(context);
|
|
125
|
+
this.#policy.assertCustody(context);
|
|
126
|
+
this.#evidence.assertCustody(context);
|
|
127
|
+
const existing = stored(context, this.#corrected);
|
|
128
|
+
if ((this.#registered && !existing) || (existing && hybridDigest(existing) !== this.sha256))
|
|
129
|
+
refuse("registered_check_receipt_changed");
|
|
130
|
+
if ("retainedReferences" in this.#evidence && hybridDigest(this.#evidence.retainedReferences(context)) !== hybridDigest(this.#receipt.checks))
|
|
131
|
+
refuse("selected_check_evidence_changed");
|
|
132
|
+
}
|
|
133
|
+
revalidate(context) {
|
|
134
|
+
this.#policy.revalidate(context);
|
|
135
|
+
this.#evidence.revalidate(context);
|
|
136
|
+
this.assertCustody(context);
|
|
137
|
+
}
|
|
138
|
+
register(context) {
|
|
139
|
+
this.revalidate(context);
|
|
140
|
+
const replay = context.db.writeTransaction(() => {
|
|
141
|
+
if (!context.db.isOwnedWriteTransaction?.())
|
|
142
|
+
refuse("owned_check_writer_required");
|
|
143
|
+
this.assertCustody(context);
|
|
144
|
+
const existing = stored(context, this.#corrected);
|
|
145
|
+
if (existing)
|
|
146
|
+
return true;
|
|
147
|
+
appendAudit(context, { projectId: this.#receipt.project_id, eventType: event, payload: this.#receipt });
|
|
148
|
+
return false;
|
|
149
|
+
}, "memory.registerCorrectionChecks");
|
|
150
|
+
this.#registered = true;
|
|
151
|
+
this.assertCustody(context);
|
|
152
|
+
try {
|
|
153
|
+
this.revalidate(context);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
throw new AppError("memory_correction_checks_pending", "Check receipt committed but current-view revalidation needs recovery", 1, { effect: "committed", receipt_sha256: this.sha256, cause: error instanceof Error ? error.message : String(error) });
|
|
157
|
+
}
|
|
158
|
+
return { receipt: this.value(), receipt_sha256: this.sha256, replay };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function historicalReceipt(context, scope) {
|
|
162
|
+
const rows = context.db.all("SELECT payload_json FROM audit_events WHERE project_id=? AND event_type=? AND json_extract(payload_json,'$.run_id')=? AND json_extract(payload_json,'$.wave')=? LIMIT 2", [scope.projectId, event, scope.runId, scope.wave]);
|
|
163
|
+
if (rows.length !== 1 || Buffer.byteLength(rows[0].payload_json) > 2 * 1024 * 1024)
|
|
164
|
+
refuse("historical_check_receipt_missing");
|
|
165
|
+
let value;
|
|
166
|
+
try {
|
|
167
|
+
value = JSON.parse(rows[0].payload_json);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return refuse("invalid_check_receipt");
|
|
171
|
+
}
|
|
172
|
+
if (!value || typeof value !== "object" || Array.isArray(value)
|
|
173
|
+
|| value.schema_id !== "dd-flow/memory-correction-checks@1" || value.project_id !== scope.projectId
|
|
174
|
+
|| value.run_id !== scope.runId || value.wave !== scope.wave || value.corrected_input_sha256 !== scope.correctedInputSha256
|
|
175
|
+
|| hybridDigest(value) !== scope.receiptSha256
|
|
176
|
+
|| [value.review_input_sha256, value.corrected_input_sha256, value.completed_correction_sha256, value.declarations_sha256]
|
|
177
|
+
.some(hash => typeof hash !== "string" || !/^[a-f0-9]{64}$/.test(hash))
|
|
178
|
+
|| (value.profile_sha256 !== null && (typeof value.profile_sha256 !== "string" || !/^[a-f0-9]{64}$/.test(value.profile_sha256)))
|
|
179
|
+
|| Object.keys(value).some(key => !["schema_id", "project_id", "run_id", "wave", "review_input_sha256", "corrected_input_sha256",
|
|
180
|
+
"completed_correction_sha256", "profile_sha256", "declarations_sha256", "checks"].includes(key))
|
|
181
|
+
|| !Array.isArray(value.checks) || !value.checks.length || value.checks.length > 4096
|
|
182
|
+
|| value.checks.some(ref => !ref || typeof ref !== "object" || Array.isArray(ref)
|
|
183
|
+
|| typeof ref.id !== "string" || !ref.id || typeof ref.path !== "string"
|
|
184
|
+
|| Object.keys(ref).some(key => !["id", "path", "sha256", "sql_sha256"].includes(key))
|
|
185
|
+
|| [ref.sha256, ref.sql_sha256].some(hash => typeof hash !== "string" || !/^[a-f0-9]{64}$/.test(hash))))
|
|
186
|
+
refuse("historical_check_receipt_changed");
|
|
187
|
+
for (const reference of value.checks) {
|
|
188
|
+
const row = context.db.get("SELECT profile_hash FROM check_receipts WHERE project_id=? AND run_id=? AND id=?", [scope.projectId, scope.runId, reference?.id]);
|
|
189
|
+
if (!row || row.profile_hash !== value.profile_sha256)
|
|
190
|
+
refuse("historical_check_policy_changed");
|
|
191
|
+
}
|
|
192
|
+
return value;
|
|
193
|
+
}
|
|
194
|
+
/** Retained finite-check proof for accepted-review replay. Expected hashes
|
|
195
|
+
* must come from the independent reviewer/Stage receipt, not a caller claim.
|
|
196
|
+
* This owner proves only the scoped historical check receipt and executions;
|
|
197
|
+
* it grants no current-view, reviewer allocation or Stage acceptance rights. */
|
|
198
|
+
export class PreparedRetainedMemoryCorrectionChecks {
|
|
199
|
+
#scope;
|
|
200
|
+
#checks;
|
|
201
|
+
constructor(key, scope, checks) {
|
|
202
|
+
if (key !== token)
|
|
203
|
+
refuse("check_receipt_token_required");
|
|
204
|
+
this.#scope = { ...scope };
|
|
205
|
+
this.#checks = checks;
|
|
206
|
+
Object.freeze(this);
|
|
207
|
+
}
|
|
208
|
+
static prepare(context, scope) {
|
|
209
|
+
return this.prepareWave(context, scope, 1);
|
|
210
|
+
}
|
|
211
|
+
static prepareSecond(context, scope) {
|
|
212
|
+
return this.prepareWave(context, scope, 2);
|
|
213
|
+
}
|
|
214
|
+
static prepareWave(context, scope, wave) {
|
|
215
|
+
if (wave !== 1 && wave !== 2)
|
|
216
|
+
refuse("historical_check_wave_required");
|
|
217
|
+
if (!scope || typeof scope.projectId !== "string" || !scope.projectId || typeof scope.runId !== "string" || !scope.runId
|
|
218
|
+
|| [scope.receiptSha256, scope.correctedInputSha256].some(hash => typeof hash !== "string" || !/^[a-f0-9]{64}$/.test(hash)))
|
|
219
|
+
refuse("historical_check_scope_required");
|
|
220
|
+
if (context.db.isOwnedWriteTransaction?.())
|
|
221
|
+
refuse("preparation_outside_writer_required");
|
|
222
|
+
const selectedScope = { ...scope, wave };
|
|
223
|
+
const receipt = context.db.readSnapshot(() => historicalReceipt(context, selectedScope));
|
|
224
|
+
const checks = PreparedRetainedCheckEvidence.prepare(context, { projectId: scope.projectId, runId: scope.runId, references: receipt.checks });
|
|
225
|
+
const prepared = new PreparedRetainedMemoryCorrectionChecks(token, selectedScope, checks);
|
|
226
|
+
prepared.assertCustody(context);
|
|
227
|
+
return prepared;
|
|
228
|
+
}
|
|
229
|
+
assertCustody(context) {
|
|
230
|
+
historicalReceipt(context, this.#scope);
|
|
231
|
+
this.#checks.assertCustody(context);
|
|
232
|
+
}
|
|
233
|
+
value(context) { this.assertCustody(context); return structuredClone(historicalReceipt(context, this.#scope)); }
|
|
234
|
+
revalidate(context) { this.#checks.revalidate(context); this.assertCustody(context); }
|
|
235
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { PreparedCorrectedMemoryReviewInputs } from "./memory-corrected-review-inputs.js";
|
|
2
|
+
import { PreparedSecondCorrectedMemoryReviewInputs } from "./memory-second-corrected-review-inputs.js";
|
|
3
|
+
/** Only the two sealed wave owners, never a structural evidence interface. */
|
|
4
|
+
export function isMemoryCorrectionInputOwner(value) {
|
|
5
|
+
return PreparedCorrectedMemoryReviewInputs.isPrepared(value) || PreparedSecondCorrectedMemoryReviewInputs.isPrepared(value);
|
|
6
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { AppError } from "../shared/errors.js";
|
|
2
|
+
const snapshots = new WeakMap();
|
|
3
|
+
function synchronous(read) {
|
|
4
|
+
const value = read();
|
|
5
|
+
if (value && typeof value.then === "function") {
|
|
6
|
+
void Promise.resolve(value).catch(() => { });
|
|
7
|
+
throw new AppError("read_snapshot_async", "Memory custody traversal must be synchronous", 1);
|
|
8
|
+
}
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
export function withMemoryCustodySnapshot(context, read) {
|
|
12
|
+
if (snapshots.has(context))
|
|
13
|
+
return synchronous(read);
|
|
14
|
+
return context.db.readSnapshot(() => {
|
|
15
|
+
snapshots.set(context, new Set());
|
|
16
|
+
try {
|
|
17
|
+
return synchronous(read);
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
snapshots.delete(context);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/** Only SQL custody may share a completed proof within this synchronous
|
|
25
|
+
* snapshot. Physical revalidation stays outside this memo, and the next
|
|
26
|
+
* traversal always rereads SQL. Failed checks never become reusable proof.
|
|
27
|
+
* Prepared owners supply private keys, never their externally visible object. */
|
|
28
|
+
export function assertMemorySqlCustody(context, owner, validate) {
|
|
29
|
+
withMemoryCustodySnapshot(context, () => {
|
|
30
|
+
const checked = snapshots.get(context);
|
|
31
|
+
if (checked.has(owner))
|
|
32
|
+
return;
|
|
33
|
+
synchronous(validate);
|
|
34
|
+
checked.add(owner);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { AppError } from "../shared/errors.js";
|
|
2
|
+
import { PreparedMemoryStageResult, memorySourceKey } from "./memory-stage-results.js";
|
|
3
|
+
import { PreparedMemoryResultBinding } from "./memory-result-binding.js";
|
|
4
|
+
import { PreparedMemoryBaselinePreservation } from "./memory-baseline-preservation.js";
|
|
5
|
+
import { captureMemoryPreflightSources } from "./memory-preflight-handler.js";
|
|
6
|
+
import { PreparedDescriptorStageStart } from "./descriptor-stage-start.js";
|
|
7
|
+
import { PreparedDescriptorStageCoordinator } from "./descriptor-stage-coordinator.js";
|
|
8
|
+
import { PreparedDescriptorStageSettlement } from "./descriptor-stage-settlement.js";
|
|
9
|
+
import { readAcceptedStageData } from "./stage-report-renderer.js";
|
|
10
|
+
import { assertPreparedRunBundleSqlAuthority, readFlowRunExecutionBundle } from "./runs.js";
|
|
11
|
+
import { requireProjectByRoot } from "./projects.js";
|
|
12
|
+
import { resolveProjectRoot } from "../storage/paths.js";
|
|
13
|
+
function refuse(reason) {
|
|
14
|
+
throw new AppError("memory_discover_handler_invalid", "Memory discovery lacks accepted scope or bounded evidence", 2, { reason, effect: "no_effect" });
|
|
15
|
+
}
|
|
16
|
+
function selected(context, input) {
|
|
17
|
+
if (!(input.bytes instanceof Uint8Array) || input.bytes.length > 1024 * 1024)
|
|
18
|
+
refuse("invalid_input_bytes");
|
|
19
|
+
const bundle = readFlowRunExecutionBundle(context, input);
|
|
20
|
+
if (!bundle || bundle.descriptor.descriptor.id !== "mb-init" || bundle.descriptor.successor("preflight", "accepted") !== "discover")
|
|
21
|
+
refuse("registered_memory_bundle_required");
|
|
22
|
+
const project = requireProjectByRoot(context, resolveProjectRoot(input.projectRoot)), scope = { projectId: project.id, runId: input.runId, stage: "discover" };
|
|
23
|
+
const run = assertPreparedRunBundleSqlAuthority(context, scope, bundle), index = JSON.parse(run.index_json);
|
|
24
|
+
return { bundle, scope, accepted: index.stage_runs.find((stage) => stage.stage === "discover")?.status === "done" };
|
|
25
|
+
}
|
|
26
|
+
/** Result-level discovery checks, not physical/RUN or semantic completeness
|
|
27
|
+
* authority. The handler separately supplies independently selected SQL scope
|
|
28
|
+
* and physical baseline observations. Unknown facts remain valid with their
|
|
29
|
+
* frozen-schema reason/next-action rather than being converted to confirmations.
|
|
30
|
+
*/
|
|
31
|
+
export class PreparedMemoryDiscoveryAcceptance {
|
|
32
|
+
#sha256;
|
|
33
|
+
constructor(result) { this.#sha256 = result.sha256; Object.freeze(this); }
|
|
34
|
+
static prepare(result) {
|
|
35
|
+
if (!(result instanceof PreparedMemoryStageResult))
|
|
36
|
+
refuse("prepared_result_required");
|
|
37
|
+
const value = JSON.parse(result.bytes().toString("utf8"));
|
|
38
|
+
if (value.stage !== "discover" || value.outcome !== "accepted"
|
|
39
|
+
|| value.findings.some((finding) => finding.severity !== "minor" && finding.status !== "resolved"))
|
|
40
|
+
refuse("discovery_not_accepted");
|
|
41
|
+
const inventory = new Map();
|
|
42
|
+
for (const source of value.details.inventory) {
|
|
43
|
+
const key = memorySourceKey(source.root, source.path);
|
|
44
|
+
if (inventory.has(key))
|
|
45
|
+
refuse("duplicate_inventory_source");
|
|
46
|
+
inventory.set(key, source.sha256);
|
|
47
|
+
}
|
|
48
|
+
const exclusions = new Set();
|
|
49
|
+
for (const exclusion of value.details.exclusions) {
|
|
50
|
+
if (!exclusion.reason.trim() || exclusions.has(exclusion.path))
|
|
51
|
+
refuse("invalid_or_duplicate_exclusion");
|
|
52
|
+
exclusions.add(exclusion.path);
|
|
53
|
+
const excluded = exclusion.path.replace(/\/+$/, "");
|
|
54
|
+
if (value.details.inventory.some((source) => source.path === excluded || source.path.startsWith(`${excluded}/`)))
|
|
55
|
+
refuse("observed_source_excluded");
|
|
56
|
+
}
|
|
57
|
+
return new PreparedMemoryDiscoveryAcceptance(result);
|
|
58
|
+
}
|
|
59
|
+
assertResult(result) {
|
|
60
|
+
if (!(result instanceof PreparedMemoryStageResult) || result.sha256 !== this.#sha256)
|
|
61
|
+
refuse("discovery_result_changed");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Unregistered implementation until the complete memory registry is ready.
|
|
65
|
+
* Entry inherits accepted preflight and preserves its independent bootstrap
|
|
66
|
+
* baseline through Stage/coordinator writers, without dispatching a provider.
|
|
67
|
+
*/
|
|
68
|
+
export function startMemoryDiscovery(context, input) {
|
|
69
|
+
const { bundle, scope, accepted } = selected(context, input);
|
|
70
|
+
if (accepted)
|
|
71
|
+
refuse("use_accepted_finish_replay");
|
|
72
|
+
const preservation = PreparedMemoryBaselinePreservation.prepare(context, bundle.execution);
|
|
73
|
+
const preflight = context.db.readSnapshot(() => readAcceptedStageData(context, { ...scope, stage: "preflight" }));
|
|
74
|
+
const value = JSON.parse(preflight.bytes.toString("utf8"));
|
|
75
|
+
if (value.schema_id !== "dd-flow/mb-init-preflight-result@1" || value.outcome !== "accepted" || value.run_id !== input.runId)
|
|
76
|
+
refuse("foreign_preflight_baseline");
|
|
77
|
+
const fence = (writer) => {
|
|
78
|
+
preservation.assertCustody(writer);
|
|
79
|
+
if (readAcceptedStageData(writer, { ...scope, stage: "preflight" }).authority_sha256 !== preflight.authority_sha256)
|
|
80
|
+
refuse("preflight_custody_changed");
|
|
81
|
+
};
|
|
82
|
+
const start = PreparedDescriptorStageStart.prepare(context, { ...input, stage: "discover" });
|
|
83
|
+
preservation.revalidate(context);
|
|
84
|
+
const stage = start.apply(context, fence);
|
|
85
|
+
const coordinator = PreparedDescriptorStageCoordinator.prepare(context, { ...input, stage: "discover" });
|
|
86
|
+
preservation.revalidate(context);
|
|
87
|
+
return { ...stage, ...coordinator.apply(context, fence) };
|
|
88
|
+
}
|
|
89
|
+
export function finishMemoryDiscovery(context, input) {
|
|
90
|
+
const { bundle, scope, accepted } = selected(context, input);
|
|
91
|
+
const sources = captureMemoryPreflightSources(context, bundle, input.bytes);
|
|
92
|
+
const binding = PreparedMemoryResultBinding.prepare(context, { ...scope, flow: bundle.descriptor, execution: bundle.execution, bundle, sources, acceptedReplay: accepted });
|
|
93
|
+
const replay = binding.acceptedBytes();
|
|
94
|
+
if (replay && !replay.equals(input.bytes))
|
|
95
|
+
refuse("accepted_result_changed");
|
|
96
|
+
const result = PreparedMemoryStageResult.prepare(input.bytes, bundle.descriptor, binding.binding());
|
|
97
|
+
const acceptance = PreparedMemoryDiscoveryAcceptance.prepare(result);
|
|
98
|
+
const settlement = PreparedDescriptorStageSettlement.prepare(context, { ...input, stage: "discover", bytes: result.bytes() });
|
|
99
|
+
binding.revalidate(context);
|
|
100
|
+
return settlement.apply(context, writer => {
|
|
101
|
+
binding.assertCustody(writer);
|
|
102
|
+
acceptance.assertResult(result);
|
|
103
|
+
});
|
|
104
|
+
}
|