@deksden-com/dd-flow-cli 0.9.0-beta.16 → 0.9.0-beta.160
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 +959 -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 +230 -106
- 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
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { AppError } from "../shared/errors.js";
|
|
5
|
+
import { RetainedExecutionBundle } from "./execution-bundles.js";
|
|
6
|
+
import { publishImmutableInput } from "../storage/immutable-input.js";
|
|
7
|
+
import { readBoundedReleaseFile } from "./release-source.js";
|
|
8
|
+
import { readMemoryInitStartupInput } from "./memory-init-startup-custody.js";
|
|
9
|
+
import { readUpgradeStorageReadiness } from "./memory-upgrade-storage-readiness.js";
|
|
10
|
+
import { isSourceSnapshotFlow } from "../domain/source-snapshot-flows.js";
|
|
11
|
+
import { readDiagnosticRequest } from "./diagnostic-start.js";
|
|
12
|
+
import { isDeliveryFlow } from "../domain/delivery-flows.js";
|
|
13
|
+
/** Repair's objective is already part of its own retained bundle. Continuation
|
|
14
|
+
* does not need the source diagnostic or mutable operator/request files. */
|
|
15
|
+
export function prepareMemoryFixContexts(bundle, directory) {
|
|
16
|
+
return prepareRequestContexts(bundle, directory, "mb-fix");
|
|
17
|
+
}
|
|
18
|
+
/** Static controller candidates carry only the original request. Current turns,
|
|
19
|
+
* scope and checks are read from their retained owners at each Stage boundary. */
|
|
20
|
+
export function prepareInteractiveContexts(bundle, directory) {
|
|
21
|
+
return prepareRequestContexts(bundle, directory, "interactive");
|
|
22
|
+
}
|
|
23
|
+
export function prepareDeliveryContexts(bundle, directory) {
|
|
24
|
+
if (!isDeliveryFlow(bundle.manifest.flow_id))
|
|
25
|
+
throw new AppError("delivery_context_invalid", "Delivery bundle required", 2, { effect: "no_effect" });
|
|
26
|
+
return prepareRequestContexts(bundle, directory, bundle.manifest.flow_id);
|
|
27
|
+
}
|
|
28
|
+
export function publishDeliveryContexts(bundle, objective, directory, expectedSha256, expectedOwner) {
|
|
29
|
+
const original = prepareDeliveryContexts(bundle, directory);
|
|
30
|
+
if (objective !== original.objective)
|
|
31
|
+
throw new AppError("delivery_context_invalid", "Delivery objective cannot be replaced", 2, { effect: "no_effect" });
|
|
32
|
+
return publishMemoryContexts(bundle, objective, directory, expectedSha256, expectedOwner, bundle.manifest.flow_id);
|
|
33
|
+
}
|
|
34
|
+
function prepareRequestContexts(bundle, directory, flowId) {
|
|
35
|
+
const code = isDeliveryFlow(flowId) ? "delivery_context_invalid" : flowId === "interactive" ? "interactive_context_invalid" : "memory_fix_context_invalid";
|
|
36
|
+
if (!(bundle instanceof RetainedExecutionBundle) || bundle.manifest.flow_id !== flowId)
|
|
37
|
+
throw new AppError(code, "Retained request-owning bundle required", 2, { effect: "no_effect" });
|
|
38
|
+
const bytes = bundle.blob("runtime/source-request.md"), refs = bundle.manifest.inventory.filter(ref => ref.path === "runtime/source-request.md");
|
|
39
|
+
if (!bytes.length || bytes.length > 64 * 1024 || refs.length !== 1 || refs[0].sha256 !== createHash("sha256").update(bytes).digest("hex"))
|
|
40
|
+
throw new AppError(code, "Original retained request required", 2, { effect: "no_effect" });
|
|
41
|
+
let objective;
|
|
42
|
+
try {
|
|
43
|
+
objective = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
throw new AppError(code, "Original request must be UTF-8", 2, { effect: "no_effect" });
|
|
47
|
+
}
|
|
48
|
+
return { ...prepareMemoryContexts(bundle, objective, directory, flowId), objective };
|
|
49
|
+
}
|
|
50
|
+
export function publishInteractiveContexts(bundle, objective, directory, expectedSha256, expectedOwner) {
|
|
51
|
+
const original = prepareInteractiveContexts(bundle, directory);
|
|
52
|
+
if (objective !== original.objective)
|
|
53
|
+
throw new AppError("interactive_context_invalid", "Interactive objective cannot be replaced", 2, { effect: "no_effect" });
|
|
54
|
+
return publishMemoryContexts(bundle, objective, directory, expectedSha256, expectedOwner, "interactive");
|
|
55
|
+
}
|
|
56
|
+
export function publishMemoryFixContexts(bundle, objective, directory, expectedSha256, expectedOwner) {
|
|
57
|
+
const original = prepareMemoryFixContexts(bundle, directory);
|
|
58
|
+
if (objective !== original.objective)
|
|
59
|
+
throw new AppError("memory_fix_context_invalid", "Repair objective cannot be replaced", 2, { effect: "no_effect" });
|
|
60
|
+
return publishMemoryContexts(bundle, objective, directory, expectedSha256, expectedOwner, "mb-fix");
|
|
61
|
+
}
|
|
62
|
+
export function prepareDiagnosticContextsFromRequest(context, bundle, directory) {
|
|
63
|
+
const scope = bundle.execution.snapshot().scope, flowId = bundle.manifest.flow_id;
|
|
64
|
+
if (!isSourceSnapshotFlow(flowId))
|
|
65
|
+
throw new AppError("diagnostic_context_invalid", "Source-snapshot bundle required", 2, { effect: "no_effect" });
|
|
66
|
+
const request = readDiagnosticRequest(context, { projectRoot: scope.projectRoot, requestId: scope.requestId, flowId });
|
|
67
|
+
if (!request || request.execution_sha256 !== bundle.execution.sha256)
|
|
68
|
+
throw new AppError("diagnostic_context_invalid", "Original diagnostic objective required", 2, { effect: "no_effect" });
|
|
69
|
+
return { ...prepareMemoryContexts(bundle, request.objective, directory, flowId), objective: request.objective };
|
|
70
|
+
}
|
|
71
|
+
export function publishDiagnosticContexts(bundle, objective, directory, expectedSha256, expectedOwner) {
|
|
72
|
+
if (!isSourceSnapshotFlow(bundle.manifest.flow_id))
|
|
73
|
+
throw new AppError("diagnostic_context_invalid", "Source-snapshot bundle required", 2, { effect: "no_effect" });
|
|
74
|
+
return publishMemoryContexts(bundle, objective, directory, expectedSha256, expectedOwner, bundle.manifest.flow_id);
|
|
75
|
+
}
|
|
76
|
+
/** Original upgrade intake comes from the independently retained storage
|
|
77
|
+
* selection, including after project publication changes the old tree. */
|
|
78
|
+
export function prepareMemoryUpgradeContextsFromStartup(context, bundle, directory) {
|
|
79
|
+
if (!(bundle instanceof RetainedExecutionBundle) || bundle.manifest.flow_id !== "mb-upgrade") {
|
|
80
|
+
throw new AppError("memory_upgrade_context_invalid", "Upgrade contexts require a retained upgrade bundle", 2, { effect: "no_effect" });
|
|
81
|
+
}
|
|
82
|
+
const scope = bundle.execution.snapshot().scope;
|
|
83
|
+
const retained = readUpgradeStorageReadiness(context, { requestId: scope.requestId, projectRoot: scope.projectRoot, workspaceRoot: scope.workspace });
|
|
84
|
+
if (!retained?.receipt.selection || !retained.selection
|
|
85
|
+
|| retained.selection.payload.execution.sha256 !== bundle.execution.sha256
|
|
86
|
+
|| retained.selection.payload.engine.manifest_sha256 !== bundle.manifest.engine_manifest.sha256) {
|
|
87
|
+
throw new AppError("memory_upgrade_context_invalid", "Upgrade contexts require the original request selection", 1, { effect: "no_effect" });
|
|
88
|
+
}
|
|
89
|
+
const objective = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(Buffer.from(retained.receipt.selection.request_input.intake_base64, "base64"));
|
|
90
|
+
return { ...prepareMemoryContexts(bundle, objective, directory, "mb-upgrade"), objective };
|
|
91
|
+
}
|
|
92
|
+
/** Public init consumes the independently retained intake, never a newly
|
|
93
|
+
* inferred objective. Historical v1 SDK requests must not invent one. */
|
|
94
|
+
export function prepareMemoryInitContextsFromStartup(context, bundle, directory) {
|
|
95
|
+
if (!(bundle instanceof RetainedExecutionBundle) || bundle.manifest.flow_id !== "mb-init") {
|
|
96
|
+
throw new AppError("memory_init_context_invalid", "Init contexts require a retained memory bundle", 2, { effect: "no_effect" });
|
|
97
|
+
}
|
|
98
|
+
const scope = bundle.execution.snapshot().scope;
|
|
99
|
+
const retained = readMemoryInitStartupInput(context, { requestId: scope.requestId, projectRoot: scope.projectRoot, workspaceRoot: scope.workspace });
|
|
100
|
+
if (!retained || !["dd-flow/memory-init-startup-input@2", "dd-flow/memory-init-startup-input@3"].includes(retained.payload.schema_id)
|
|
101
|
+
|| retained.payload.objective === undefined || retained.payload.execution.sha256 !== bundle.execution.sha256
|
|
102
|
+
|| retained.payload.engine.manifest_sha256 !== bundle.manifest.engine_manifest.sha256) {
|
|
103
|
+
throw new AppError("memory_init_context_invalid", "Init contexts require the exact retained objective and execution selection", 1, { effect: "no_effect" });
|
|
104
|
+
}
|
|
105
|
+
return { ...prepareMemoryInitContexts(bundle, retained.payload.objective, directory), objective: retained.payload.objective };
|
|
106
|
+
}
|
|
107
|
+
/** Prepare bytes only. Immutable publication and the controller retain their
|
|
108
|
+
* existing ownership; this does not create directories, Sessions or RUNs. */
|
|
109
|
+
export function prepareMemoryInitContexts(bundle, objective, directory) {
|
|
110
|
+
return prepareMemoryContexts(bundle, objective, directory, "mb-init");
|
|
111
|
+
}
|
|
112
|
+
function prepareMemoryContexts(bundle, objective, directory, flowId) {
|
|
113
|
+
if (!(bundle instanceof RetainedExecutionBundle) || bundle.manifest.flow_id !== flowId
|
|
114
|
+
|| typeof objective !== "string" || !objective.trim() || Buffer.byteLength(objective) > 64 * 1024
|
|
115
|
+
|| !path.isAbsolute(directory) || path.resolve(directory) !== directory) {
|
|
116
|
+
throw new AppError("memory_init_context_invalid", "Init contexts require a retained memory bundle, bounded objective and absolute directory", 2, { effect: "no_effect" });
|
|
117
|
+
}
|
|
118
|
+
const files = new Map(), stages = Object.create(null);
|
|
119
|
+
const hash = (bytes) => createHash("sha256").update(bytes).digest("hex");
|
|
120
|
+
for (const stage of bundle.descriptor.descriptor.stages) {
|
|
121
|
+
const file = path.join(directory, `${stage.id}.json`);
|
|
122
|
+
const bytes = Buffer.from(JSON.stringify({ schema_id: "dd-flow/stage-context@1", stage: stage.id, objective }));
|
|
123
|
+
files.set(file, bytes);
|
|
124
|
+
stages[stage.id] = { file, sha256: hash(bytes) };
|
|
125
|
+
}
|
|
126
|
+
const file = path.join(directory, "managed-context.json"), bytes = Buffer.from(JSON.stringify({ schema_id: "dd-flow/managed-context@1", stages }));
|
|
127
|
+
files.set(file, bytes);
|
|
128
|
+
return { file, sha256: hash(bytes), files };
|
|
129
|
+
}
|
|
130
|
+
/** Publish candidates only; an existing controller SQL receipt still owns
|
|
131
|
+
* their execution authority. The caller supplies an already owned directory
|
|
132
|
+
* and independently retained package digest. Never replaces conflicting files. */
|
|
133
|
+
export function publishMemoryInitContexts(bundle, objective, directory, expectedSha256, expectedOwner) {
|
|
134
|
+
return publishMemoryContexts(bundle, objective, directory, expectedSha256, expectedOwner, "mb-init");
|
|
135
|
+
}
|
|
136
|
+
export function publishMemoryUpgradeContexts(bundle, objective, directory, expectedSha256, expectedOwner) {
|
|
137
|
+
return publishMemoryContexts(bundle, objective, directory, expectedSha256, expectedOwner, "mb-upgrade");
|
|
138
|
+
}
|
|
139
|
+
function publishMemoryContexts(bundle, objective, directory, expectedSha256, expectedOwner, flowId) {
|
|
140
|
+
const prepared = prepareMemoryContexts(bundle, objective, directory, flowId);
|
|
141
|
+
if (prepared.sha256 !== expectedSha256)
|
|
142
|
+
throw new AppError("memory_init_context_invalid", "Context package selection changed", 1, { effect: "no_effect" });
|
|
143
|
+
const owner = fs.lstatSync(directory);
|
|
144
|
+
if (expectedOwner && (owner.dev !== expectedOwner.dev || owner.ino !== expectedOwner.ino)) {
|
|
145
|
+
throw new AppError("memory_init_context_invalid", "Context directory differs from its retained owner", 1, { effect: "no_effect" });
|
|
146
|
+
}
|
|
147
|
+
const assertOwner = () => {
|
|
148
|
+
const current = fs.lstatSync(directory);
|
|
149
|
+
if (!current.isDirectory() || current.dev !== owner.dev || current.ino !== owner.ino || fs.realpathSync(directory) !== directory) {
|
|
150
|
+
throw new AppError("memory_init_context_invalid", "Context directory owner changed", 1, { effect: "no_effect" });
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
assertOwner();
|
|
154
|
+
// Reject any known collision before creating the first candidate.
|
|
155
|
+
for (const [file, bytes] of prepared.files) {
|
|
156
|
+
try {
|
|
157
|
+
fs.lstatSync(file);
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
if (error.code === "ENOENT")
|
|
161
|
+
continue;
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
if (!readBoundedReleaseFile(file, bytes.length).equals(bytes))
|
|
165
|
+
throw new AppError("memory_init_context_invalid", "Existing context bytes differ", 1, { effect: "no_effect", path: file });
|
|
166
|
+
}
|
|
167
|
+
let attempted = false;
|
|
168
|
+
try {
|
|
169
|
+
for (const [file, bytes] of prepared.files) {
|
|
170
|
+
assertOwner();
|
|
171
|
+
attempted = true;
|
|
172
|
+
publishImmutableInput(file, bytes, "memory_init_context_invalid");
|
|
173
|
+
}
|
|
174
|
+
assertOwner();
|
|
175
|
+
return { file: prepared.file, sha256: prepared.sha256 };
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
throw new AppError("memory_init_context_publication_incomplete", "Context candidates require exact-request reconciliation", 1, { effect: attempted ? "partial" : "no_effect", directory, expected_sha256: expectedSha256,
|
|
179
|
+
reason: error instanceof AppError ? error.code : "context_publication_failed" });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { AppError, errorRecord } from "../shared/errors.js";
|
|
4
|
+
import { validateMemoryInitStartupScope, readMemoryInitStartupInput } from "./memory-init-startup-custody.js";
|
|
5
|
+
import { startMemoryInitRun } from "./memory-init-start.js";
|
|
6
|
+
import { startMemoryUpgradeRun } from "./memory-upgrade-start.js";
|
|
7
|
+
import { requireProjectByRoot } from "./projects.js";
|
|
8
|
+
import { readRunStartRequest } from "./run-start-custody.js";
|
|
9
|
+
import { readFlowRunExecutionBundle } from "./runs.js";
|
|
10
|
+
import { requireRun } from "./run-controller-state.js";
|
|
11
|
+
import { prepareRunControllerLaunch } from "./run-controller.js";
|
|
12
|
+
import { prepareMemoryInitContextsFromStartup, publishMemoryInitContexts, prepareMemoryUpgradeContextsFromStartup, publishMemoryUpgradeContexts } from "./memory-init-contexts.js";
|
|
13
|
+
import { parseRuntimeBudget } from "./runtime-budget.js";
|
|
14
|
+
import { isSourceSnapshotFlow } from "../domain/source-snapshot-flows.js";
|
|
15
|
+
import { startDiagnosticRun } from "./diagnostic-start.js";
|
|
16
|
+
import { prepareDiagnosticContextsFromRequest, publishDiagnosticContexts } from "./memory-init-contexts.js";
|
|
17
|
+
import { prepareMemoryFixContexts, publishMemoryFixContexts } from "./memory-init-contexts.js";
|
|
18
|
+
import { startMemoryFixRun } from "./memory-fix-request.js";
|
|
19
|
+
import { startInteractiveRun } from "./interactive-request.js";
|
|
20
|
+
import { prepareInteractiveContexts, publishInteractiveContexts } from "./memory-init-contexts.js";
|
|
21
|
+
import { prepareDeliveryContexts, publishDeliveryContexts } from "./memory-init-contexts.js";
|
|
22
|
+
import { isDeliveryFlow } from "../domain/delivery-flows.js";
|
|
23
|
+
import { startDeliveryRun } from "./delivery-request.js";
|
|
24
|
+
function refuse(reason) {
|
|
25
|
+
throw new AppError("memory_init_controller_start_invalid", "Init controller requires its exact published startup request", 1, { reason, effect: "no_effect", next_action: "reconcile_exact_request" });
|
|
26
|
+
}
|
|
27
|
+
/** Bridge the already published logical RUN to the existing controller. The
|
|
28
|
+
* RUN-start owner admits the root; startup custody supplies the objective.
|
|
29
|
+
* An existing controller replays before candidate publication, so missing
|
|
30
|
+
* productive inputs are never reconstructed here. No process is launched. */
|
|
31
|
+
export function prepareMemoryInitControllerStart(context, scope) {
|
|
32
|
+
return prepareMemoryControllerStart(context, scope, "mb-init");
|
|
33
|
+
}
|
|
34
|
+
export function prepareMemoryUpgradeControllerStart(context, scope) {
|
|
35
|
+
return prepareMemoryControllerStart(context, scope, "mb-upgrade");
|
|
36
|
+
}
|
|
37
|
+
export function prepareDiagnosticControllerStart(context, scope, flowId) {
|
|
38
|
+
return prepareMemoryControllerStart(context, scope, flowId);
|
|
39
|
+
}
|
|
40
|
+
export function prepareMemoryFixControllerStart(context, scope) {
|
|
41
|
+
return prepareMemoryControllerStart(context, scope, "mb-fix");
|
|
42
|
+
}
|
|
43
|
+
export function prepareInteractiveControllerStart(context, scope) {
|
|
44
|
+
return prepareMemoryControllerStart(context, scope, "interactive");
|
|
45
|
+
}
|
|
46
|
+
export function prepareDeliveryControllerStart(context, scope, flowId) {
|
|
47
|
+
return prepareMemoryControllerStart(context, scope, flowId);
|
|
48
|
+
}
|
|
49
|
+
function prepareMemoryControllerStart(context, scope, flowId) {
|
|
50
|
+
validateMemoryInitStartupScope(scope);
|
|
51
|
+
if (context.db.isOwnedWriteTransaction?.())
|
|
52
|
+
refuse("preparation_outside_writer_required");
|
|
53
|
+
parseRuntimeBudget(context.env.DD_FLOW_RUNTIME_BUDGET);
|
|
54
|
+
if (flowId === "mb-init") {
|
|
55
|
+
const startup = readMemoryInitStartupInput(context, scope);
|
|
56
|
+
if (!startup || !["dd-flow/memory-init-startup-input@2", "dd-flow/memory-init-startup-input@3"].includes(startup.payload.schema_id))
|
|
57
|
+
refuse("retained_objective_required");
|
|
58
|
+
}
|
|
59
|
+
const project = requireProjectByRoot(context, scope.projectRoot);
|
|
60
|
+
const request = readRunStartRequest(context, project.id, scope.requestId);
|
|
61
|
+
if (!request?.published || request.payload.initial_index.flow_kind !== flowId
|
|
62
|
+
|| request.payload.workspace_root !== scope.workspaceRoot)
|
|
63
|
+
refuse("published_run_required");
|
|
64
|
+
// Restores the exact request and verifies independent SQL/physical root
|
|
65
|
+
// ownership without consulting current canon/profiles or creating a RUN.
|
|
66
|
+
const started = isDeliveryFlow(flowId) ? startDeliveryRun(context, { projectRoot: scope.projectRoot, requestId: scope.requestId, flowId }) : flowId === "interactive" ? startInteractiveRun(context, scope) : flowId === "mb-fix" ? startMemoryFixRun(context, scope) : isSourceSnapshotFlow(flowId) ? startDiagnosticRun(context, { projectRoot: scope.projectRoot, requestId: scope.requestId, flowId })
|
|
67
|
+
: flowId === "mb-init" ? startMemoryInitRun(context, scope) : startMemoryUpgradeRun(context, scope);
|
|
68
|
+
const run = requireRun(context, project.id, started.runId);
|
|
69
|
+
const bundle = readFlowRunExecutionBundle(context, { projectRoot: scope.projectRoot, runId: run.id });
|
|
70
|
+
if (!bundle || bundle.sha256 !== started.bundleSha256)
|
|
71
|
+
refuse("retained_bundle_required");
|
|
72
|
+
if (bundle.execution.settings.execution !== "managed")
|
|
73
|
+
refuse("managed_execution_required");
|
|
74
|
+
const contexts = isDeliveryFlow(flowId) ? prepareDeliveryContexts(bundle, run.run_root) : flowId === "interactive" ? prepareInteractiveContexts(bundle, run.run_root) : flowId === "mb-fix" ? prepareMemoryFixContexts(bundle, run.run_root) : isSourceSnapshotFlow(flowId) ? prepareDiagnosticContextsFromRequest(context, bundle, run.run_root)
|
|
75
|
+
: flowId === "mb-init" ? prepareMemoryInitContextsFromStartup(context, bundle, run.run_root)
|
|
76
|
+
: prepareMemoryUpgradeContextsFromStartup(context, bundle, run.run_root);
|
|
77
|
+
const input = { projectRoot: scope.projectRoot, runId: run.id, requestId: scope.requestId,
|
|
78
|
+
contextFile: contexts.file, contextSha256: contexts.sha256 };
|
|
79
|
+
const controllers = context.db.get("SELECT 1 FROM sqlite_schema WHERE type='table' AND name='run_controllers'")
|
|
80
|
+
? context.db.all("SELECT request_id FROM run_controllers WHERE project_id=? AND run_id=?", [project.id, run.id]) : [];
|
|
81
|
+
if (controllers.some(row => row.request_id === scope.requestId))
|
|
82
|
+
return { input, prepared: prepareRunControllerLaunch(context, input) };
|
|
83
|
+
if (controllers.length)
|
|
84
|
+
refuse("foreign_controller_request");
|
|
85
|
+
// A directory without a receipt is an interrupted/unknown outcome, not
|
|
86
|
+
// evidence that no owner ran. Do not create another physical controller.
|
|
87
|
+
let controllerRootFound = false;
|
|
88
|
+
try {
|
|
89
|
+
fs.lstatSync(path.join(run.run_root, "controllers"));
|
|
90
|
+
controllerRootFound = true;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (error.code !== "ENOENT")
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
if (controllerRootFound)
|
|
97
|
+
refuse("controller_custody_missing");
|
|
98
|
+
if (context.db.get("SELECT 1 FROM sessions WHERE project_id=? AND run_id=? LIMIT 1", [project.id, run.id]))
|
|
99
|
+
refuse("session_owner_requires_reconciliation");
|
|
100
|
+
const rootOwner = context.db.readSnapshot(() => {
|
|
101
|
+
if (readRunStartRequest(context, project.id, scope.requestId)?.sha256 !== request.sha256)
|
|
102
|
+
refuse("run_request_changed");
|
|
103
|
+
const row = context.db.get("SELECT payload_json FROM audit_events WHERE project_id=? AND event_type='flow_run.start_root_owned' AND json_extract(payload_json,'$.run_id')=?", [project.id, run.id]);
|
|
104
|
+
if (!row)
|
|
105
|
+
refuse("root_owner_missing");
|
|
106
|
+
return JSON.parse(row.payload_json).owner;
|
|
107
|
+
});
|
|
108
|
+
if (!rootOwner || !Number.isSafeInteger(rootOwner.dev) || !Number.isSafeInteger(rootOwner.ino))
|
|
109
|
+
refuse("root_owner_changed");
|
|
110
|
+
const publish = isDeliveryFlow(flowId) ? publishDeliveryContexts : flowId === "interactive" ? publishInteractiveContexts : flowId === "mb-fix" ? publishMemoryFixContexts : isSourceSnapshotFlow(flowId) ? publishDiagnosticContexts : flowId === "mb-init" ? publishMemoryInitContexts : publishMemoryUpgradeContexts;
|
|
111
|
+
publish(bundle, contexts.objective, run.run_root, contexts.sha256, rootOwner);
|
|
112
|
+
try {
|
|
113
|
+
return { input, prepared: prepareRunControllerLaunch(context, input) };
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
throw new AppError("memory_init_controller_start_incomplete", "Retained context candidates require exact-request reconciliation", 1, { effect: "partial", run_id: run.id, request_id: scope.requestId, context_sha256: contexts.sha256,
|
|
117
|
+
cause: errorRecord(error), next_action: "reconcile_exact_request" });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { AppError } from "../shared/errors.js";
|
|
5
|
+
import { AdmittedFrozenEngine } from "./frozen-engine.js";
|
|
6
|
+
import { readSetupStatus } from "./setup.js";
|
|
7
|
+
import { inspectReleaseArchive } from "./release-archive.js";
|
|
8
|
+
import { readBoundedReleaseFile } from "./release-source.js";
|
|
9
|
+
import { hybridDigest } from "./hybrid-contracts.js";
|
|
10
|
+
import { engineVersionRoot } from "../storage/paths.js";
|
|
11
|
+
import { engineSnapshotChecksum, installPackageEngine } from "./engines.js";
|
|
12
|
+
const hash = (bytes) => createHash("sha256").update(bytes).digest("hex");
|
|
13
|
+
function refuse(reason) {
|
|
14
|
+
throw new AppError("memory_init_engine_release_invalid", "Selected engine is not the verified installed release payload", 1, { reason, phase: "prepare", effect: "no_effect" });
|
|
15
|
+
}
|
|
16
|
+
/** Select already delivered release bytes, never the invoking CLI or highest
|
|
17
|
+
* package version. Ambiguous dependency snapshots require explicit selection. */
|
|
18
|
+
export function selectMemoryInitInstalledEngine(home, installationSha256, checksum) {
|
|
19
|
+
if (!path.isAbsolute(home) || path.resolve(home) !== home || fs.realpathSync(home) !== home)
|
|
20
|
+
refuse("noncanonical_installation_home");
|
|
21
|
+
const selected = readSetupStatus(home), installation = selected.installation;
|
|
22
|
+
if (!installation || selected.installation_readiness !== "installed" || installation.manifest_sha256 !== installationSha256)
|
|
23
|
+
refuse("installation_selection_changed");
|
|
24
|
+
if (checksum !== undefined && !/^[a-f0-9]{64}$/.test(checksum))
|
|
25
|
+
refuse("invalid_engine_checksum");
|
|
26
|
+
const base = engineVersionRoot(home, installation.manifest.engine.package, installation.manifest.engine.version);
|
|
27
|
+
const parent = path.dirname(base), version = path.basename(base), candidates = [];
|
|
28
|
+
if (!fs.existsSync(parent))
|
|
29
|
+
refuse("selected_engine_not_delivered");
|
|
30
|
+
if (!fs.lstatSync(parent).isDirectory() || fs.realpathSync(parent) !== parent)
|
|
31
|
+
refuse("unsafe_engine_store");
|
|
32
|
+
for (const entry of fs.readdirSync(parent, { withFileTypes: true })) {
|
|
33
|
+
if (!entry.isDirectory() || !(entry.name === version || entry.name.startsWith(`${version}--`)
|
|
34
|
+
&& /^[a-f0-9]{64}$/.test(entry.name.slice(version.length + 2))))
|
|
35
|
+
continue;
|
|
36
|
+
const root = path.join(parent, entry.name);
|
|
37
|
+
try {
|
|
38
|
+
const bytes = readBoundedReleaseFile(path.join(root, "engine.json"), 1024 * 1024);
|
|
39
|
+
const manifest = JSON.parse(bytes.toString("utf8"));
|
|
40
|
+
if (manifest.snapshot_root !== root || entry.name !== version && entry.name !== `${version}--${manifest.integrity?.checksum}`
|
|
41
|
+
|| checksum !== undefined && manifest.integrity?.checksum !== checksum)
|
|
42
|
+
continue;
|
|
43
|
+
const engine = AdmittedFrozenEngine.admitSelection({ package_name: manifest.package_name, package_version: manifest.package_version,
|
|
44
|
+
engine_version: manifest.engine_version, snapshot_root: root, integrity_checksum: manifest.integrity?.checksum }, hash(bytes));
|
|
45
|
+
prepareMemoryInitEngineRelease(home, installationSha256, engine);
|
|
46
|
+
candidates.push(engine);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
// An unavailable or mismatching old snapshot cannot authorize this release.
|
|
50
|
+
if (error instanceof AppError || error instanceof SyntaxError || error.code === "ENOENT")
|
|
51
|
+
continue;
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (candidates.length !== 1)
|
|
56
|
+
refuse(candidates.length ? "ambiguous_selected_engine" : "selected_engine_not_delivered");
|
|
57
|
+
return candidates[0];
|
|
58
|
+
}
|
|
59
|
+
function checkFile(root, entry) {
|
|
60
|
+
let file = root;
|
|
61
|
+
const parts = entry.path.split("/");
|
|
62
|
+
for (const [index, part] of parts.entries()) {
|
|
63
|
+
file = path.join(file, part);
|
|
64
|
+
const stat = fs.lstatSync(file);
|
|
65
|
+
if (stat.isSymbolicLink() || (index === parts.length - 1 ? !stat.isFile() : !stat.isDirectory()))
|
|
66
|
+
refuse("unsafe_snapshot_path");
|
|
67
|
+
}
|
|
68
|
+
if ((fs.lstatSync(file).mode & 0o111) !== entry.executable_mode)
|
|
69
|
+
refuse("snapshot_payload_mode_changed");
|
|
70
|
+
if (entry.bytes === 0) {
|
|
71
|
+
const fd = fs.openSync(file, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0));
|
|
72
|
+
try {
|
|
73
|
+
const stat = fs.fstatSync(fd);
|
|
74
|
+
if (!stat.isFile() || stat.size !== 0 || fs.readSync(fd, Buffer.alloc(1), 0, 1, 0) !== 0)
|
|
75
|
+
refuse("snapshot_payload_changed");
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
fs.closeSync(fd);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else if (hash(readBoundedReleaseFile(file, entry.bytes)) !== entry.sha256)
|
|
82
|
+
refuse("snapshot_payload_changed");
|
|
83
|
+
}
|
|
84
|
+
function checkInventory(root, inventory) {
|
|
85
|
+
const expected = new Set(inventory.map(entry => entry.path));
|
|
86
|
+
for (const entry of fs.readdirSync(root, { recursive: true, withFileTypes: true })) {
|
|
87
|
+
const logical = path.relative(root, path.join(entry.parentPath, entry.name)).split(path.sep).join("/");
|
|
88
|
+
if (!entry.isFile() && !entry.isDirectory())
|
|
89
|
+
refuse("unsafe_snapshot_path");
|
|
90
|
+
if (logical !== "engine.json" && !expected.has(logical)
|
|
91
|
+
&& (entry.name === "engine.json" || entry.isFile() && !logical.startsWith("node_modules/")))
|
|
92
|
+
refuse("unselected_snapshot_file");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function archiveInventory(archive, engineRoot) {
|
|
96
|
+
const entries = inspectReleaseArchive(archive, readBoundedReleaseFile(path.join(path.dirname(engineRoot), "archive.tgz"), Math.min(archive.bytes, 256 * 1024 * 1024)));
|
|
97
|
+
const inventory = [];
|
|
98
|
+
for (const entry of entries) {
|
|
99
|
+
if (entry.path !== "package" && !entry.path.startsWith("package/"))
|
|
100
|
+
refuse("foreign_payload_root");
|
|
101
|
+
if (entry.kind !== "file")
|
|
102
|
+
continue;
|
|
103
|
+
const logical = entry.path.slice("package/".length);
|
|
104
|
+
if (!logical || logical === "engine.json")
|
|
105
|
+
refuse("reserved_payload_path");
|
|
106
|
+
inventory.push({ path: logical, sha256: hash(entry.bytes), executable_mode: entry.mode & 0o111, bytes: entry.bytes.length });
|
|
107
|
+
}
|
|
108
|
+
return inventory;
|
|
109
|
+
}
|
|
110
|
+
/** Existing package/dependency acquisition supplies the independently selected
|
|
111
|
+
* full checksum. This gate binds transferred package files to verified setup
|
|
112
|
+
* bytes before delivery and again in the owned staging directory. */
|
|
113
|
+
export function deliverMemoryInitReleaseEngine(context, input) {
|
|
114
|
+
const home = context.ddFlowHome;
|
|
115
|
+
if (!path.isAbsolute(home) || fs.realpathSync(home) !== home || !path.isAbsolute(input.packageRoot)
|
|
116
|
+
|| fs.realpathSync(input.packageRoot) !== input.packageRoot || !/^[a-f0-9]{64}$/.test(input.expectedChecksum))
|
|
117
|
+
refuse("invalid_delivery_selection");
|
|
118
|
+
const selected = readSetupStatus(home), installation = selected.installation;
|
|
119
|
+
if (!installation || selected.installation_readiness !== "installed" || installation.manifest_sha256 !== input.installationSha256)
|
|
120
|
+
refuse("installation_selection_changed");
|
|
121
|
+
const inventory = archiveInventory(installation.manifest.engine.archive, installation.engine_root);
|
|
122
|
+
const check = (root) => {
|
|
123
|
+
try {
|
|
124
|
+
for (const file of inventory)
|
|
125
|
+
checkFile(root, file);
|
|
126
|
+
checkInventory(root, inventory);
|
|
127
|
+
if (engineSnapshotChecksum(root) !== input.expectedChecksum)
|
|
128
|
+
refuse("delivery_checksum_changed");
|
|
129
|
+
const current = readSetupStatus(home);
|
|
130
|
+
if (current.installation_readiness !== "installed" || hybridDigest(current.installation) !== hybridDigest(installation))
|
|
131
|
+
refuse("installation_changed_during_delivery");
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (error instanceof AppError && error.code === "memory_init_engine_release_invalid")
|
|
135
|
+
throw error;
|
|
136
|
+
return refuse("payload_unavailable_or_changed");
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
check(input.packageRoot);
|
|
140
|
+
const delivered = installPackageEngine(context, { packageRoot: input.packageRoot, packageName: installation.manifest.engine.package,
|
|
141
|
+
version: installation.manifest.engine.version, expectedChecksum: input.expectedChecksum, validateStaged: check });
|
|
142
|
+
try {
|
|
143
|
+
return selectMemoryInitInstalledEngine(home, input.installationSha256, input.expectedChecksum);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
throw new AppError("memory_init_engine_delivery_incomplete", "Delivered engine requires exact selection reconciliation", 1, { effect: delivered.changed ? "partial" : "no_effect", path: delivered.path, reason: error instanceof AppError ? error.details.reason ?? error.code : "delivered_selection_changed" });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** expectedSha256 must come from independent request custody. No current
|
|
150
|
+
* installation/canon/profile reads and no restoration of missing files. */
|
|
151
|
+
export function revalidateMemoryInitEngineRelease(input, expectedSha256, engine) {
|
|
152
|
+
try {
|
|
153
|
+
if (!(engine instanceof AdmittedFrozenEngine) || !input || typeof input !== "object" || Array.isArray(input))
|
|
154
|
+
refuse("invalid_retained_pairing");
|
|
155
|
+
const facts = input, digest = (value) => typeof value === "string" && /^[a-f0-9]{64}$/.test(value);
|
|
156
|
+
if (Object.keys(facts).sort().join() !== "archive_sha256,engine_manifest_sha256,engine_sha256,installation_sha256,inventory,schema_id"
|
|
157
|
+
|| facts.schema_id !== "dd-flow/memory-init-engine-release@1" || !digest(expectedSha256)
|
|
158
|
+
|| [facts.installation_sha256, facts.archive_sha256, facts.engine_manifest_sha256, facts.engine_sha256].some(value => !digest(value))
|
|
159
|
+
|| !Array.isArray(facts.inventory) || !facts.inventory.length || facts.inventory.length > 100_000
|
|
160
|
+
|| hybridDigest(facts) !== expectedSha256)
|
|
161
|
+
refuse("invalid_retained_pairing");
|
|
162
|
+
const manifest = engine.manifest();
|
|
163
|
+
if (engine.manifestSha256 !== facts.engine_manifest_sha256 || manifest.integrity.checksum !== facts.engine_sha256)
|
|
164
|
+
refuse("foreign_engine_identity");
|
|
165
|
+
const seen = new Set();
|
|
166
|
+
let total = 0;
|
|
167
|
+
for (const entry of facts.inventory) {
|
|
168
|
+
if (!entry || Object.keys(entry).sort().join() !== "bytes,executable_mode,path,sha256" || typeof entry.path !== "string"
|
|
169
|
+
|| entry.path.length > 1024 || entry.path !== entry.path.normalize("NFC") || /[\\:]/.test(entry.path)
|
|
170
|
+
|| [...entry.path].some(character => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127)
|
|
171
|
+
|| entry.path.split("/").some(part => !part || part === "." || part === "..") || entry.path === "engine.json"
|
|
172
|
+
|| seen.has(entry.path.toLowerCase()) || !digest(entry.sha256) || !Number.isSafeInteger(entry.bytes) || entry.bytes < 0
|
|
173
|
+
|| entry.bytes === 0 && entry.sha256 !== hash(Buffer.alloc(0))
|
|
174
|
+
|| !Number.isSafeInteger(entry.executable_mode) || entry.executable_mode < 0 || entry.executable_mode > 0o111 || (entry.executable_mode & ~0o111) !== 0
|
|
175
|
+
|| (total += entry.bytes) > 512 * 1024 * 1024)
|
|
176
|
+
refuse("invalid_retained_inventory");
|
|
177
|
+
seen.add(entry.path.toLowerCase());
|
|
178
|
+
checkFile(manifest.snapshot_root, entry);
|
|
179
|
+
}
|
|
180
|
+
checkInventory(manifest.snapshot_root, facts.inventory);
|
|
181
|
+
AdmittedFrozenEngine.admitSelection({ package_name: manifest.package_name, package_version: manifest.package_version,
|
|
182
|
+
engine_version: manifest.engine_version, snapshot_root: manifest.snapshot_root, integrity_checksum: facts.engine_sha256 }, facts.engine_manifest_sha256);
|
|
183
|
+
return { facts: structuredClone(facts), sha256: expectedSha256 };
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
if (error instanceof AppError && error.code === "memory_init_engine_release_invalid")
|
|
187
|
+
throw error;
|
|
188
|
+
return refuse("payload_unavailable_or_changed");
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/** Fresh selection only. Restarts must retain this inventory independently,
|
|
192
|
+
* not consult the current installation. This does not install dependencies,
|
|
193
|
+
* admit handlers/storage/provider access or grant project effects. */
|
|
194
|
+
export function prepareMemoryInitEngineRelease(home, installationSha256, engine) {
|
|
195
|
+
try {
|
|
196
|
+
if (!(engine instanceof AdmittedFrozenEngine))
|
|
197
|
+
refuse("unprepared_engine");
|
|
198
|
+
if (!path.isAbsolute(home) || path.resolve(home) !== home || fs.realpathSync(home) !== home)
|
|
199
|
+
refuse("noncanonical_installation_home");
|
|
200
|
+
const selected = readSetupStatus(home), installation = selected.installation;
|
|
201
|
+
if (!installation || selected.installation_readiness !== "installed" || installation.manifest_sha256 !== installationSha256)
|
|
202
|
+
refuse("installation_selection_changed");
|
|
203
|
+
const manifest = engine.manifest();
|
|
204
|
+
if (manifest.package_name !== installation.manifest.engine.package || manifest.package_version !== installation.manifest.engine.version)
|
|
205
|
+
refuse("foreign_engine_identity");
|
|
206
|
+
AdmittedFrozenEngine.admitSelection({ package_name: manifest.package_name, package_version: manifest.package_version,
|
|
207
|
+
engine_version: manifest.engine_version, snapshot_root: manifest.snapshot_root, integrity_checksum: manifest.integrity.checksum }, engine.manifestSha256);
|
|
208
|
+
const archive = installation.manifest.engine.archive;
|
|
209
|
+
const inventory = archiveInventory(archive, installation.engine_root);
|
|
210
|
+
const final = readSetupStatus(home);
|
|
211
|
+
if (final.installation_readiness !== "installed" || hybridDigest(final.installation) !== hybridDigest(installation))
|
|
212
|
+
refuse("installation_changed_during_admission");
|
|
213
|
+
const facts = { schema_id: "dd-flow/memory-init-engine-release@1", installation_sha256: installationSha256,
|
|
214
|
+
archive_sha256: archive.sha256, engine_manifest_sha256: engine.manifestSha256,
|
|
215
|
+
engine_sha256: manifest.integrity.checksum, inventory: inventory.sort((a, b) => a.path.localeCompare(b.path, "en")) };
|
|
216
|
+
return revalidateMemoryInitEngineRelease(facts, hybridDigest(facts), engine);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
if (error instanceof AppError && error.code === "memory_init_engine_release_invalid")
|
|
220
|
+
throw error;
|
|
221
|
+
return refuse("payload_unavailable_or_changed");
|
|
222
|
+
}
|
|
223
|
+
}
|