@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
|
@@ -2,33 +2,183 @@ import crypto from "node:crypto";
|
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { AppError } from "../shared/errors.js";
|
|
5
|
-
import {
|
|
5
|
+
import { prepareFileBytes, prepareJsonText, prepareOutputFile } from "../cli/input-preparation.js";
|
|
6
|
+
export function runContextRelocations(context, projectId, runId) {
|
|
7
|
+
return context.db.all("SELECT id, payload_json FROM audit_events WHERE project_id = ? AND event_type = 'flow_run.publication_relocation' ORDER BY id", [projectId]).flatMap(row => {
|
|
8
|
+
const receipt = JSON.parse(row.payload_json);
|
|
9
|
+
if (receipt.run_id !== runId || !receipt.path_mapping)
|
|
10
|
+
return [];
|
|
11
|
+
return [{ receipt_id: `${row.id}:${receipt.import_id}`, source_manifest_sha256: receipt.source_manifest_sha256, path_mapping: receipt.path_mapping }];
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function assertContextRelocation(receipt) {
|
|
15
|
+
if (!receipt.receipt_id || !/^[a-f0-9]{64}$/.test(receipt.source_manifest_sha256)
|
|
16
|
+
|| !Array.isArray(receipt.path_mapping) || receipt.path_mapping.some(item => !item || typeof item.from !== "string" || typeof item.to !== "string" || !path.isAbsolute(item.from) || !path.isAbsolute(item.to)))
|
|
17
|
+
throw new AppError("context_relocation_invalid", "Stage context relocation lacks a verified import binding", 2);
|
|
18
|
+
}
|
|
19
|
+
function relocateDeclaredPath(source, receipts) {
|
|
20
|
+
let mapped = source;
|
|
21
|
+
for (const receipt of receipts) {
|
|
22
|
+
assertContextRelocation(receipt);
|
|
23
|
+
const selected = [...receipt.path_mapping].sort((a, b) => b.from.length - a.from.length).find(item => mapped === item.from || mapped.startsWith(`${item.from}${path.sep}`));
|
|
24
|
+
if (selected)
|
|
25
|
+
mapped = path.join(selected.to, path.relative(selected.from, mapped));
|
|
26
|
+
}
|
|
27
|
+
return mapped;
|
|
28
|
+
}
|
|
29
|
+
/** Physical packet locators may move; accepted decision/provenance blocks may not. */
|
|
30
|
+
export function projectPacketLocators(text, receipts) {
|
|
31
|
+
receipts.forEach(assertContextRelocation);
|
|
32
|
+
return text.split(/(<run_operational_contract>[\s\S]*?<\/run_operational_contract>|<external_stage_context>[\s\S]*?<\/source_precedence>|DD_FLOW_(?:INVOCATION_SCOPE|CURRENT_INVOCATION|DAEMON_ID)=(?:"(?:\\.|[^"\\])*"|'[^']*'|[^\s'"])+)/g).map(part => {
|
|
33
|
+
if (part.startsWith("<run_operational_contract>") || part.startsWith("<external_stage_context>") || part.startsWith("DD_FLOW_INVOCATION_SCOPE=") || part.startsWith("DD_FLOW_CURRENT_INVOCATION=") || part.startsWith("DD_FLOW_DAEMON_ID="))
|
|
34
|
+
return part;
|
|
35
|
+
for (const receipt of receipts) {
|
|
36
|
+
const mappings = [...receipt.path_mapping].sort((a, b) => b.from.length - a.from.length);
|
|
37
|
+
if (!mappings.length)
|
|
38
|
+
continue;
|
|
39
|
+
const prefixes = mappings.map(item => item.from.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
|
|
40
|
+
// One longest-prefix replacement per receipt: a new root may itself sit
|
|
41
|
+
// below an old prefix and must not be mapped twice by that receipt.
|
|
42
|
+
const locator = new RegExp(`(^|[^A-Za-z0-9_./~:\\\\-])(${prefixes})(?=[/\\\\]|$|[\\s"'\x60<>{}\\[\\](),;!?])`, "g");
|
|
43
|
+
part = part.replace(locator, (_match, boundary, prefix) => `${boundary}${mappings.find(item => item.from === prefix).to}`);
|
|
44
|
+
}
|
|
45
|
+
return part;
|
|
46
|
+
}).join("");
|
|
47
|
+
}
|
|
48
|
+
/** Current delivery packet is derived; imported prompt/context bytes remain provenance. */
|
|
49
|
+
export function currentStagePrompt(context, promptPath, runHome = path.dirname(path.dirname(promptPath)), sourceText) {
|
|
50
|
+
let original = sourceText ?? fs.readFileSync(promptPath, "utf8");
|
|
51
|
+
let sourcePromptPath = promptPath;
|
|
52
|
+
if (original.startsWith("<current_prompt_projection>\n")) {
|
|
53
|
+
const prior = JSON.parse(original.split("\n")[1]);
|
|
54
|
+
const source = path.resolve(runHome, prior.source_prompt);
|
|
55
|
+
const relative = path.relative(runHome, source);
|
|
56
|
+
if (!relative || relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative) || !fs.existsSync(source))
|
|
57
|
+
throw new AppError("context_checksum_mismatch", "Current packet has no retained source prompt", 2);
|
|
58
|
+
original = fs.readFileSync(source, "utf8");
|
|
59
|
+
if (sha256(original) !== prior.original_prompt_sha256)
|
|
60
|
+
throw new AppError("context_checksum_mismatch", "Retained source prompt changed", 2);
|
|
61
|
+
sourcePromptPath = source;
|
|
62
|
+
}
|
|
63
|
+
const row = context.db.get("SELECT id, project_id, index_json FROM runs WHERE run_root = ?", [runHome]);
|
|
64
|
+
if (!row)
|
|
65
|
+
return { prompt_path: promptPath, worker_prompt_markdown: original };
|
|
66
|
+
const profile = JSON.parse(row.index_json).execution_profile;
|
|
67
|
+
const receipts = runContextRelocations(context, row.project_id, row.id);
|
|
68
|
+
if (!receipts.length)
|
|
69
|
+
return { prompt_path: promptPath, worker_prompt_markdown: original };
|
|
70
|
+
const operational = profile?.operational_contract;
|
|
71
|
+
let rendered = projectPacketLocators(original, receipts);
|
|
72
|
+
if (operational) {
|
|
73
|
+
const block = renderRunOperationalContext(runHome, operational.sha256, operational.path);
|
|
74
|
+
rendered = rendered.includes("<run_operational_contract>") ? rendered.replace(/<run_operational_contract>[\s\S]*?<\/run_operational_contract>/, () => block) : `${block}\n\n${rendered}`;
|
|
75
|
+
}
|
|
76
|
+
const relativeDirectory = path.relative(runHome, path.dirname(sourcePromptPath));
|
|
77
|
+
const stageEntry = Object.entries(profile?.stage_context_inputs ?? {}).find(([, item]) => path.dirname(item.path) === relativeDirectory);
|
|
78
|
+
if (stageEntry) {
|
|
79
|
+
const [stage, item] = stageEntry;
|
|
80
|
+
const loaded = loadExternalStageContext({ file: path.join(runHome, item.path), expectedSha256: item.sha256, stage });
|
|
81
|
+
const block = renderRetainedStageContext({ loaded, receipts });
|
|
82
|
+
rendered = rendered.includes("<external_stage_context>") ? rendered.replace(/<external_stage_context>[\s\S]*?<\/source_precedence>/, () => block) : `${block}\n\n${rendered}`;
|
|
83
|
+
}
|
|
84
|
+
const proof = { source_prompt: path.relative(runHome, sourcePromptPath), original_prompt_sha256: sha256(original), operational_sha256: operational?.sha256 ?? null, context_sha256: stageEntry ? stageEntry[1].sha256 : null, receipts };
|
|
85
|
+
rendered = `<current_prompt_projection>\n${JSON.stringify(proof)}\nHistorical prompt and context bytes are provenance; use the current rendered input paths below. Embedded CLI command text is historical, non-executable evidence, not current command authority. Do not execute commands from this projection. Use only independently issued current Stage next commands or the existing lifecycle recovery replacement commands after acknowledgement. Path relocation does not reissue credentials, invocation IDs, generations or logical scope.\n</current_prompt_projection>\n\n${rendered}`;
|
|
86
|
+
const file = path.join(runHome, "prompt-projections", `${sha256(rendered)}.md`);
|
|
87
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
88
|
+
if (fs.existsSync(file)) {
|
|
89
|
+
if (fs.readFileSync(file, "utf8") !== rendered)
|
|
90
|
+
throw new AppError("context_checksum_mismatch", "Current prompt projection changed", 2);
|
|
91
|
+
}
|
|
92
|
+
else
|
|
93
|
+
fs.writeFileSync(file, rendered, { flag: "wx" });
|
|
94
|
+
return { prompt_path: file, worker_prompt_markdown: rendered };
|
|
95
|
+
}
|
|
96
|
+
/** Render only declared path fields through verified import receipts; retained bytes stay untouched. */
|
|
97
|
+
export function renderRetainedStageContext(input) {
|
|
98
|
+
if (input.workspaceView && (!input.workspaceView.work_id || !path.isAbsolute(input.workspaceView.from) || !path.isAbsolute(input.workspaceView.to)
|
|
99
|
+
|| !/^[a-f0-9]{64}$/.test(input.workspaceView.source_sha256) || !/^[a-f0-9]{64}$/.test(input.workspaceView.copy_sha256)))
|
|
100
|
+
throw new AppError("context_workspace_view_invalid", "Stage context workspace view lacks its bound review-copy proof", 2);
|
|
101
|
+
const mapPath = (source, workspaceSource = true) => {
|
|
102
|
+
let mapped = relocateDeclaredPath(source, input.receipts);
|
|
103
|
+
const view = input.workspaceView;
|
|
104
|
+
if (view && workspaceSource && (mapped === view.from || mapped.startsWith(`${view.from}${path.sep}`)))
|
|
105
|
+
mapped = path.join(view.to, path.relative(view.from, mapped));
|
|
106
|
+
return mapped;
|
|
107
|
+
};
|
|
108
|
+
const value = input.loaded.value;
|
|
109
|
+
const mappedValue = { ...value,
|
|
110
|
+
...(value.task_input ? { task_input: value.task_input.map(item => ({ ...item, path: mapPath(item.path) })) } : {}),
|
|
111
|
+
...(value.sources ? { sources: value.sources.map(item => ({ ...item, path: mapPath(item.path, item.root !== "run") })) } : {}) };
|
|
112
|
+
return [input.receipts.length ? `<context_path_mapping>\nOriginal context SHA-256: ${input.loaded.materializedSha256}\nVerified import receipts: ${JSON.stringify(input.receipts)}\nOnly rendered physical path fields are relocated; original decisions and source bytes are unchanged.\n</context_path_mapping>` : "",
|
|
113
|
+
input.workspaceView ? `<review_workspace_view>\nBound review copy: ${JSON.stringify(input.workspaceView)}\nOnly project/workspace input paths use this read-only view. Original authority and RUN artifacts stay in their retained locations.\n</review_workspace_view>` : "",
|
|
114
|
+
renderExternalStageContext({ loaded: { ...input.loaded, value: mappedValue }, installed: { path: input.loaded.sourcePath } })].filter(Boolean).join("\n\n");
|
|
115
|
+
}
|
|
116
|
+
/** One precedence rule for coordinator and delegated Work packets. */
|
|
117
|
+
export const acceptedDecisionPrecedence = "Read the accepted RUN decisions before applying older general project rules. An accepted, explicitly scoped user decision supersedes a conflicting general rule only within that scope; preserve the rule elsewhere. Do not ask the user again about a decision already settled in those artifacts or invent a broader exception.";
|
|
118
|
+
/** Shared Stage/Work projection; historical RUNs do not gain a new grant. */
|
|
119
|
+
export function renderRunOperationalContext(runHome, expectedSha256, artifactPath) {
|
|
120
|
+
const indexFile = path.join(runHome, "run.json");
|
|
121
|
+
const index = fs.existsSync(indexFile) ? JSON.parse(fs.readFileSync(indexFile, "utf8")) : null;
|
|
122
|
+
const metadata = index?.execution_profile?.operational_contract;
|
|
123
|
+
const file = path.join(runHome, artifactPath ?? metadata?.path ?? "operational-contract.json");
|
|
124
|
+
const binding = expectedSha256 ?? metadata?.sha256;
|
|
125
|
+
if (!binding)
|
|
126
|
+
return "";
|
|
127
|
+
if (!fs.existsSync(file) || sha256(fs.readFileSync(file)) !== binding)
|
|
128
|
+
throw new AppError("operational_contract_changed", "Frozen RUN operational input changed or is missing", 2, { file });
|
|
129
|
+
const value = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
130
|
+
if (value.policy_source && (!fs.existsSync(path.join(runHome, value.policy_source.path)) || sha256(fs.readFileSync(path.join(runHome, value.policy_source.path))) !== value.policy_source.sha256))
|
|
131
|
+
throw new AppError("operational_contract_changed", "Retained policy source changed", 2);
|
|
132
|
+
return ["<run_operational_contract>", `- immutable artifact: ${file}`, `- sha256: ${binding}`, `- logical scope: ${JSON.stringify(value.binding)}`,
|
|
133
|
+
`- delivery: ${value.settings.merge_delivery.strategy}; cleanup: ${value.settings.merge_cleanup.source}`,
|
|
134
|
+
...(value.decision ? [`- accepted decision ${value.decision.id}: ${JSON.stringify(value.decision)}`, `- retained policy source: ${value.policy_source ? path.join(runHome, value.policy_source.path) : path.resolve(index?.workspace?.project_root ?? value.binding.project_root, value.decision.policy.path)} (original locators above are provenance only)`, acceptedDecisionPrecedence] : ["No scoped override is accepted. Preserve project policy; frozen defaults do not grant an exception."]),
|
|
135
|
+
"Local completion means proven integration into the declared target commit, not remote publication, deployment, release, or a feature-only handoff. Source retention applies only to this RUN's source. Preserve dirty/unmerged, branch-protection and immutable-tag guards.",
|
|
136
|
+
"A retention review date requests review; it is not an automatic expiry or deletion instruction.", "</run_operational_contract>"].join("\n");
|
|
137
|
+
}
|
|
6
138
|
export function loadExternalStageContext(input) {
|
|
7
|
-
const sourcePath =
|
|
8
|
-
if (!fs.existsSync(sourcePath) || !fs.statSync(sourcePath).isFile())
|
|
9
|
-
throw new AppError("not_found", "Stage context file is missing", 2, { context_file: sourcePath });
|
|
10
|
-
const bytes = fs.readFileSync(sourcePath);
|
|
139
|
+
const { file: sourcePath, bytes } = prepareFileBytes(input.file, "Stage context");
|
|
11
140
|
const materializedSha256 = sha256(bytes);
|
|
12
141
|
if (materializedSha256 !== input.expectedSha256)
|
|
13
142
|
throw new AppError("context_checksum_mismatch", "Stage context checksum does not match --context-sha256", 2, { context_file: sourcePath, expected_sha256: input.expectedSha256, actual_sha256: materializedSha256 });
|
|
14
|
-
|
|
143
|
+
return loadExternalStageContextBytes({ bytes, sourcePath, stage: input.stage });
|
|
144
|
+
}
|
|
145
|
+
/** The same context contract for independently retained Stage input bytes;
|
|
146
|
+
* historical readers must not reopen the original mutable source file. */
|
|
147
|
+
export function loadExternalStageContextBytes(input) {
|
|
148
|
+
if (!(input.bytes instanceof Uint8Array) || !input.bytes.length || input.bytes.length > 1024 * 1024)
|
|
149
|
+
throw new AppError("validation", "Stage context exceeds its byte bound", 2);
|
|
150
|
+
const bytes = Buffer.from(input.bytes), sourcePath = input.sourcePath, materializedSha256 = sha256(bytes);
|
|
151
|
+
const value = prepareJsonText(new TextDecoder("utf-8", { fatal: true }).decode(bytes), { file: sourcePath, label: "Stage context" }).value;
|
|
15
152
|
validateContext(value, input.stage);
|
|
16
|
-
return { value, sourcePath, materializedSha256 };
|
|
153
|
+
return { value, sourcePath, materializedSha256, bytes };
|
|
17
154
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
155
|
+
export function prepareExternalStageContext(input) {
|
|
156
|
+
verifyImmutableContextSources(input.loaded.value);
|
|
157
|
+
const destination = externalStageContextDestination(input);
|
|
158
|
+
if (!fs.existsSync(destination))
|
|
159
|
+
prepareOutputFile(destination);
|
|
160
|
+
return destination;
|
|
161
|
+
}
|
|
162
|
+
function externalStageContextDestination(input) {
|
|
21
163
|
const destination = path.join(input.stageRoot, "stage-context.json");
|
|
22
164
|
if (fs.existsSync(destination)) {
|
|
23
165
|
const existing = sha256(fs.readFileSync(destination));
|
|
24
166
|
if (existing !== input.loaded.materializedSha256)
|
|
25
167
|
throw new AppError("stage_context_replacement", "A different stage context is already installed for this Stage", 2, { stage_context: destination, expected_sha256: input.loaded.materializedSha256, actual_sha256: existing });
|
|
26
168
|
}
|
|
27
|
-
|
|
169
|
+
return destination;
|
|
170
|
+
}
|
|
171
|
+
/** Installs exactly one immutable external context for a stage attempt. */
|
|
172
|
+
export function installExternalStageContext(input) {
|
|
173
|
+
// Publication may follow earlier effects. Recheck immutable identity here,
|
|
174
|
+
// but never reclassify a late output failure as a no-effect input rejection.
|
|
175
|
+
const destination = externalStageContextDestination(input);
|
|
176
|
+
fs.mkdirSync(input.stageRoot, { recursive: true });
|
|
177
|
+
if (!fs.existsSync(destination)) {
|
|
28
178
|
// The receipt is the hash of the runner-materialized bytes, not of a
|
|
29
179
|
// convenient reserialization. Preserve those exact bytes as evidence.
|
|
30
180
|
const temporary = `${destination}.${process.pid}.tmp`;
|
|
31
|
-
fs.
|
|
181
|
+
fs.writeFileSync(temporary, input.loaded.bytes);
|
|
32
182
|
fs.renameSync(temporary, destination);
|
|
33
183
|
}
|
|
34
184
|
return {
|
|
@@ -41,6 +191,15 @@ export function installExternalStageContext(input) {
|
|
|
41
191
|
/** Install the runner slice and make it visible in the agent packet before a
|
|
42
192
|
* caller performs its lifecycle transition. */
|
|
43
193
|
export function applyExternalStageContext(input) {
|
|
194
|
+
const home = path.dirname(input.stageRoot);
|
|
195
|
+
const row = input.context?.db.get("SELECT index_json FROM runs WHERE run_root = ?", [home]);
|
|
196
|
+
const authoritative = row ? JSON.parse(row.index_json).execution_profile?.operational_contract : undefined;
|
|
197
|
+
const operational = input.context ? authoritative ? renderRunOperationalContext(home, authoritative.sha256, authoritative.path) : "" : renderRunOperationalContext(home);
|
|
198
|
+
if (operational && fs.existsSync(input.promptPath)) {
|
|
199
|
+
const current = fs.readFileSync(input.promptPath, "utf8");
|
|
200
|
+
if (!current.includes("<run_operational_contract>"))
|
|
201
|
+
fs.writeFileSync(input.promptPath, `${operational}\n\n${current}`);
|
|
202
|
+
}
|
|
44
203
|
if (!input.loaded)
|
|
45
204
|
return undefined;
|
|
46
205
|
const installed = installExternalStageContext({ stageRoot: input.stageRoot, loaded: input.loaded });
|
|
@@ -52,6 +211,7 @@ export function applyExternalStageContext(input) {
|
|
|
52
211
|
return installed;
|
|
53
212
|
}
|
|
54
213
|
export function renderExternalStageContext(input) {
|
|
214
|
+
verifyImmutableContextSources(input.loaded.value);
|
|
55
215
|
const value = input.loaded.value;
|
|
56
216
|
const sources = value.sources ?? [];
|
|
57
217
|
const taskInput = value.task_input ?? [];
|
|
@@ -72,19 +232,81 @@ export function renderExternalStageContext(input) {
|
|
|
72
232
|
"</project_context>", "",
|
|
73
233
|
"<accepted_decisions>",
|
|
74
234
|
...(decisions.length ? decisions.map((item) => `- ${typeof item === "string" ? item : `${item.id ? `${item.id}: ` : ""}${item.statement ?? ""}`}`) : ["- No additional accepted decisions."]),
|
|
75
|
-
"</accepted_decisions>"
|
|
235
|
+
"</accepted_decisions>", "",
|
|
236
|
+
"<source_precedence>",
|
|
237
|
+
acceptedDecisionPrecedence,
|
|
238
|
+
"</source_precedence>"
|
|
76
239
|
].join("\n");
|
|
77
240
|
}
|
|
78
241
|
function validateContext(value, expectedStage) {
|
|
79
|
-
|
|
80
|
-
|
|
242
|
+
const object = (item) => Boolean(item && typeof item === "object" && !Array.isArray(item));
|
|
243
|
+
const text = (item) => typeof item === "string" && Boolean(item.trim());
|
|
244
|
+
if (!object(value))
|
|
245
|
+
throw new AppError("validation", "Stage context must be an object", 2);
|
|
246
|
+
if (value.schema_id !== "dd-flow/stage-context@1" && value.schema_id !== "dd-eval/stage-context@1")
|
|
247
|
+
throw new AppError("validation", "Stage context must use dd-flow/stage-context@1", 2);
|
|
81
248
|
if (value.stage !== expectedStage)
|
|
82
249
|
throw new AppError("validation", "Stage context does not match --stage", 2, { expected_stage: expectedStage, context_stage: value.stage });
|
|
83
|
-
if (!value.objective
|
|
250
|
+
if (!text(value.objective))
|
|
84
251
|
throw new AppError("validation", "Stage context objective is required", 2);
|
|
252
|
+
for (const key of ["task_input", "sources", "accepted_decisions", "dynamic_roles"]) {
|
|
253
|
+
if (value[key] === undefined)
|
|
254
|
+
continue;
|
|
255
|
+
if (!Array.isArray(value[key]))
|
|
256
|
+
throw new AppError("validation", `Stage context ${key} must be an array`, 2);
|
|
257
|
+
for (const item of value[key]) {
|
|
258
|
+
const valid = key === "accepted_decisions" ? text(item) || object(item) && (text(item.id) || text(item.statement)) && [item.id, item.statement].every(field => field === undefined || text(field))
|
|
259
|
+
: object(item) && text(item.role) && (key === "dynamic_roles" ? item.reason === undefined || text(item.reason)
|
|
260
|
+
: text(item.path) && (key === "sources" ? text(item.reason) && (item.sha256 === undefined || typeof item.sha256 === "string" && /^[a-f0-9]{64}$/.test(item.sha256)) && (item.required === undefined || typeof item.required === "boolean") && (item.root === undefined || typeof item.root === "string" && ["project", "workspace", "run"].includes(item.root)) : item.sha256 === undefined || text(item.sha256)));
|
|
261
|
+
if (!valid)
|
|
262
|
+
throw new AppError("validation", `Invalid stage context ${key} item`, 2, { parameter: key });
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
for (const key of ["semantic_package_sha256", "context_slice_sha256"]) {
|
|
266
|
+
if (value[key] !== undefined && !text(value[key]))
|
|
267
|
+
throw new AppError("validation", `Stage context ${key} must be a nonempty string`, 2);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function verifyImmutableContextSources(value) {
|
|
85
271
|
for (const source of value.sources ?? []) {
|
|
86
|
-
if (!source.
|
|
87
|
-
|
|
272
|
+
if (!source.sha256)
|
|
273
|
+
continue; // Ordinary mutable project documents are not frozen.
|
|
274
|
+
try {
|
|
275
|
+
const info = fs.lstatSync(source.path);
|
|
276
|
+
if (!info.isFile() || info.isSymbolicLink() || info.size > 2 * 1024 * 1024 || sha256(fs.readFileSync(source.path)) !== source.sha256)
|
|
277
|
+
throw new Error("changed");
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
throw new AppError("context_source_checksum_mismatch", "Immutable stage source is unavailable or changed", 2, { role: source.role });
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/** Only an accepted CODE context may bind a diagnostic capability to checks. */
|
|
285
|
+
export function browserCheckCapabilityEnvironment(context, runId, runHome) {
|
|
286
|
+
const row = context.db.get("SELECT project_id, index_json FROM runs WHERE id = ?", [runId]);
|
|
287
|
+
const ref = row ? JSON.parse(row.index_json).execution_profile?.stage_context_inputs?.code : null;
|
|
288
|
+
if (!ref)
|
|
289
|
+
return {};
|
|
290
|
+
const file = path.resolve(runHome, ref.path), relative = path.relative(runHome, file);
|
|
291
|
+
if (relative.startsWith('..') || path.isAbsolute(relative))
|
|
292
|
+
throw new AppError('context_source_checksum_mismatch', 'Stage context escaped RUN', 2);
|
|
293
|
+
const loaded = loadExternalStageContext({ file, expectedSha256: ref.sha256, stage: 'code' });
|
|
294
|
+
const sources = loaded.value.sources?.filter(item => item.role === 'browser_environment_capabilities' && item.root === 'run') ?? [];
|
|
295
|
+
if (!sources.length)
|
|
296
|
+
return {};
|
|
297
|
+
if (sources.length !== 1)
|
|
298
|
+
throw new AppError('context_source_checksum_mismatch', 'Browser capability source is ambiguous', 2);
|
|
299
|
+
const source = { ...sources[0], path: relocateDeclaredPath(sources[0].path, runContextRelocations(context, row.project_id, runId)) };
|
|
300
|
+
const filename = path.basename(source.path), namedHash = filename.match(/^browser-capabilities(?:-([a-f0-9]{64}))?\.json$/);
|
|
301
|
+
const expected = path.join(runHome, 'environment', filename);
|
|
302
|
+
let owned = false;
|
|
303
|
+
try {
|
|
304
|
+
owned = fs.realpathSync(source.path) === path.join(fs.realpathSync(runHome), 'environment', filename);
|
|
88
305
|
}
|
|
306
|
+
catch { /* Missing proof is not a foreign host lookup. */ }
|
|
307
|
+
if (!source.sha256 || !namedHash || namedHash[1] && namedHash[1] !== source.sha256 || path.resolve(source.path) !== expected || !owned)
|
|
308
|
+
throw new AppError('context_source_checksum_mismatch', 'Browser capability lacks its RUN binding', 2);
|
|
309
|
+
verifyImmutableContextSources({ ...loaded.value, sources: [source] });
|
|
310
|
+
return { DD_FLOW_BROWSER_CAPABILITY_PATH: source.path, DD_FLOW_BROWSER_CAPABILITY_SHA256: source.sha256 };
|
|
89
311
|
}
|
|
90
312
|
function sha256(value) { return crypto.createHash("sha256").update(value).digest("hex"); }
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { AppError } from "../shared/errors.js";
|
|
2
|
+
import { finishVnextSpecifyStage, launchVnextSpecify } from "./vnext-specify.js";
|
|
3
|
+
import { finishVnextProtocolize, startVnextProtocolize } from "./vnext-protocolize.js";
|
|
4
|
+
import { finishVnextPlan, startVnextPlan } from "./vnext-plan.js";
|
|
5
|
+
import { finishVnextPlanReview, startVnextPlanReview } from "./vnext-plan-review.js";
|
|
6
|
+
import { finishVnextCode, startVnextCode } from "./vnext-code.js";
|
|
7
|
+
import { finishVnextCodeReview, startVnextCodeReview } from "./vnext-code-review.js";
|
|
8
|
+
import { finishVnextMerge, startVnextMerge } from "./vnext-merge.js";
|
|
9
|
+
import { ResolvedFlowDescriptor } from "./flow-descriptors.js";
|
|
10
|
+
import { vnextStages } from "../domain/stage-catalog.js";
|
|
11
|
+
import { sdlcHandlerIdentities as ids } from "../domain/stage-handler-identities.js";
|
|
12
|
+
import { memoryInitStageHandlers, memoryUpgradeStageHandlers } from "./memory-stage-dispatch.js";
|
|
13
|
+
import { diagnosticStageHandlers } from "./diagnostic-stage-handlers.js";
|
|
14
|
+
import { isDiagnosticFlow, diagnosticFlowStages } from "../domain/diagnostic-flows.js";
|
|
15
|
+
import { distillStages } from "../domain/distill-flow.js";
|
|
16
|
+
import { distillStageHandlers } from "./distill-stage-handlers.js";
|
|
17
|
+
import { memoryFixStages } from "../domain/memory-fix-flow.js";
|
|
18
|
+
import { memoryFixStageHandlers } from "./memory-fix-stage-handlers.js";
|
|
19
|
+
import { reviewFixStages } from "../domain/review-fix-flow.js";
|
|
20
|
+
import { reviewFixStageHandlers } from "./review-fix-stage-handlers.js";
|
|
21
|
+
import { interactiveStages } from "../domain/interactive-flow.js";
|
|
22
|
+
import { interactiveStageHandlers } from "./interactive-stage-handlers.js";
|
|
23
|
+
import { deliveryStageHandlers } from "./delivery-stage-handlers.js";
|
|
24
|
+
import { deliveryFlowStages, isDeliveryFlow } from "../domain/delivery-flows.js";
|
|
25
|
+
/** Engine-owned code, not a plugin registration surface or executable descriptor expression. */
|
|
26
|
+
export const sdlcStageHandlers = Object.freeze({
|
|
27
|
+
specify: Object.freeze({ ...ids.specify, entry: launchVnextSpecify, finish: finishVnextSpecifyStage }),
|
|
28
|
+
protocolize: Object.freeze({ ...ids.protocolize, entry: startVnextProtocolize, finish: finishVnextProtocolize }),
|
|
29
|
+
plan: Object.freeze({ ...ids.plan, entry: startVnextPlan, finish: finishVnextPlan }),
|
|
30
|
+
"plan-review": Object.freeze({ ...ids["plan-review"], entry: startVnextPlanReview, finish: finishVnextPlanReview }),
|
|
31
|
+
code: Object.freeze({ ...ids.code, entry: startVnextCode, finish: finishVnextCode }),
|
|
32
|
+
"code-review": Object.freeze({ ...ids["code-review"], entry: startVnextCodeReview, finish: finishVnextCodeReview }),
|
|
33
|
+
merge: Object.freeze({ ...ids.merge, entry: startVnextMerge, finish: finishVnextMerge })
|
|
34
|
+
});
|
|
35
|
+
/** A fresh inventory cannot mutate the registered handler functions. */
|
|
36
|
+
export function bundledHandlerContext(blobs) {
|
|
37
|
+
return {
|
|
38
|
+
entryHandlers: new Set([...Object.values(sdlcStageHandlers), ...Object.values(memoryInitStageHandlers), ...Object.values(memoryUpgradeStageHandlers), ...diagnosticStageHandlers, ...distillStageHandlers, ...memoryFixStageHandlers, ...reviewFixStageHandlers, ...interactiveStageHandlers, ...deliveryStageHandlers].map(handler => handler.entryId)),
|
|
39
|
+
finishHandlers: new Set([...Object.values(sdlcStageHandlers), ...Object.values(memoryInitStageHandlers), ...Object.values(memoryUpgradeStageHandlers), ...diagnosticStageHandlers, ...distillStageHandlers, ...memoryFixStageHandlers, ...reviewFixStageHandlers, ...interactiveStageHandlers, ...deliveryStageHandlers].map(handler => handler.finishId)), blobs
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** Handler identity is also stage/flow scoped: a known CODE handler is not a memory handler. */
|
|
43
|
+
export function admitBundledFlow(input, sha256, blobs) {
|
|
44
|
+
const flow = ResolvedFlowDescriptor.admit(input, sha256, bundledHandlerContext(blobs));
|
|
45
|
+
if (flow.descriptor.id === "sdlc") {
|
|
46
|
+
const edges = vnextStages.flatMap(stage => stage.next.map((to, index) => ({ from: stage.id, to, on: index ? "not-applicable" : "accepted" })));
|
|
47
|
+
if (flow.descriptor.entry_stage !== "specify" || flow.descriptor.terminal_stages.length !== 1 || flow.descriptor.terminal_stages[0] !== "merge"
|
|
48
|
+
|| flow.descriptor.stages.length !== vnextStages.length
|
|
49
|
+
|| flow.descriptor.stages.some((stage, index) => stage.id !== vnextStages[index].id || stage.directory !== vnextStages[index].directory)
|
|
50
|
+
|| flow.descriptor.edges.length !== edges.length
|
|
51
|
+
|| edges.some(expected => !flow.descriptor.edges.some(edge => edge.from === expected.from && edge.to === expected.to && edge.on === expected.on))) {
|
|
52
|
+
throw new AppError("flow_handler_scope_invalid", "SDLC handlers require the registered seven-stage layout and transitions", 2, { phase: "prepare", effect: "no_effect" });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (flow.descriptor.id === "mb-init" || flow.descriptor.id === "mb-upgrade") {
|
|
56
|
+
const upgrade = flow.descriptor.id === "mb-upgrade";
|
|
57
|
+
const stages = Object.keys(upgrade ? memoryUpgradeStageHandlers : memoryInitStageHandlers);
|
|
58
|
+
const edges = stages.slice(0, -1).map((from, index) => ({ from, to: stages[index + 1], on: "accepted" }));
|
|
59
|
+
// Historical packs have only accepted transitions; diagnostic VERIFY uses
|
|
60
|
+
// the same REVIEW handler without granting another route or stage.
|
|
61
|
+
const requiredEdges = flow.descriptor.edges.filter(edge => !(edge.from === "verify" && edge.to === "review" && edge.on === "needs_repair"));
|
|
62
|
+
if (flow.descriptor.entry_stage !== "preflight" || flow.descriptor.terminal_stages.length !== 1 || flow.descriptor.terminal_stages[0] !== "finish"
|
|
63
|
+
|| flow.descriptor.stages.length !== stages.length
|
|
64
|
+
|| flow.descriptor.stages.some((stage, index) => stage.id !== stages[index] || stage.directory !== `${String(index + 1).padStart(2, "0")}-${stage.id}`)
|
|
65
|
+
|| requiredEdges.length !== edges.length
|
|
66
|
+
|| edges.some(expected => !flow.descriptor.edges.some(edge => edge.from === expected.from && edge.to === expected.to && edge.on === expected.on))) {
|
|
67
|
+
throw new AppError("flow_handler_scope_invalid", "Memory init handlers require the registered six-stage layout and transitions", 2, { phase: "prepare", effect: "no_effect" });
|
|
68
|
+
}
|
|
69
|
+
for (const stage of flow.descriptor.stages) {
|
|
70
|
+
let schemaId;
|
|
71
|
+
try {
|
|
72
|
+
schemaId = JSON.parse(flow.stageBlob(stage.id, "result_schema").toString("utf8")).$id;
|
|
73
|
+
}
|
|
74
|
+
catch { /* Invalid schema cannot authorize this stage handler. */ }
|
|
75
|
+
if (schemaId !== (upgrade ? "dd-flow/mb-upgrade-stage-result@1" : `dd-flow/mb-init-${stage.id}-result@1`))
|
|
76
|
+
throw new AppError("flow_handler_scope_invalid", "Memory init stage requires its own registered result schema", 2, { phase: "prepare", effect: "no_effect", stage: stage.id });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (isDiagnosticFlow(flow.descriptor.id)) {
|
|
80
|
+
const stages = diagnosticFlowStages[flow.descriptor.id];
|
|
81
|
+
if (flow.descriptor.entry_stage !== "preflight" || flow.descriptor.terminal_stages.length !== 1 || flow.descriptor.terminal_stages[0] !== "report"
|
|
82
|
+
|| flow.descriptor.stages.length !== stages.length || flow.descriptor.edges.length !== stages.length - 1
|
|
83
|
+
|| flow.descriptor.stages.some((stage, index) => stage.id !== stages[index] || stage.directory !== `${String(index + 1).padStart(2, "0")}-${stage.id}`)
|
|
84
|
+
|| stages.slice(0, -1).some((stage, index) => !flow.descriptor.edges.some(edge => edge.from === stage && edge.to === stages[index + 1] && edge.on === "accepted"))
|
|
85
|
+
|| flow.descriptor.stages.some(stage => JSON.parse(flow.stageBlob(stage.id, "result_schema").toString("utf8")).$id !== "dd-flow/diagnostic-stage-result@1")) {
|
|
86
|
+
throw new AppError("flow_handler_scope_invalid", "Diagnostic handlers require their registered four-stage layout and result schema", 2, { phase: "prepare", effect: "no_effect" });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for (const stage of flow.descriptor.stages) {
|
|
90
|
+
const handlers = flow.descriptor.id === "sdlc" ? Object.values(sdlcStageHandlers) : flow.descriptor.id === "mb-init" ? Object.values(memoryInitStageHandlers)
|
|
91
|
+
: flow.descriptor.id === "mb-upgrade" ? Object.values(memoryUpgradeStageHandlers)
|
|
92
|
+
: [...diagnosticStageHandlers, ...distillStageHandlers, ...memoryFixStageHandlers, ...reviewFixStageHandlers, ...interactiveStageHandlers, ...deliveryStageHandlers].filter(handler => handler.flowId === flow.descriptor.id);
|
|
93
|
+
const handler = handlers.find(candidate => candidate.stage === stage.id);
|
|
94
|
+
if (!handler || stage.entry_handler !== handler.entryId || stage.finish_handler !== handler.finishId) {
|
|
95
|
+
throw new AppError("flow_handler_scope_invalid", "Registered handlers do not belong to this flow stage", 2, { phase: "prepare", effect: "no_effect", flow_id: flow.descriptor.id, stage: stage.id });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (flow.descriptor.id === "mb-distill") {
|
|
99
|
+
if (flow.descriptor.entry_stage !== "preflight" || flow.descriptor.terminal_stages.length !== 1 || flow.descriptor.terminal_stages[0] !== "finish"
|
|
100
|
+
|| flow.descriptor.stages.length !== distillStages.length || flow.descriptor.edges.length !== distillStages.length - 1
|
|
101
|
+
|| flow.descriptor.stages.some((stage, index) => stage.id !== distillStages[index] || stage.directory !== `${String(index + 1).padStart(2, "0")}-${stage.id}`
|
|
102
|
+
|| JSON.parse(flow.stageBlob(stage.id, "result_schema").toString("utf8")).$id !== "dd-flow/distill-stage-result@1")
|
|
103
|
+
|| distillStages.slice(0, -1).some((from, index) => !flow.descriptor.edges.some(edge => edge.from === from && edge.to === distillStages[index + 1] && edge.on === "accepted")))
|
|
104
|
+
throw new AppError("flow_handler_scope_invalid", "Distillation requires its registered six-stage layout and result schema", 2, { phase: "prepare", effect: "no_effect" });
|
|
105
|
+
}
|
|
106
|
+
if (flow.descriptor.id === "mb-fix") {
|
|
107
|
+
if (flow.descriptor.entry_stage !== "intake" || flow.descriptor.terminal_stages.length !== 1 || flow.descriptor.terminal_stages[0] !== "finish"
|
|
108
|
+
|| flow.descriptor.stages.length !== memoryFixStages.length || flow.descriptor.edges.length !== memoryFixStages.length - 1
|
|
109
|
+
|| flow.descriptor.stages.some((stage, index) => stage.id !== memoryFixStages[index] || stage.directory !== `${String(index + 1).padStart(2, "0")}-${stage.id}`
|
|
110
|
+
|| JSON.parse(flow.stageBlob(stage.id, "result_schema").toString("utf8")).$id !== "dd-flow/mb-fix-stage-result@1")
|
|
111
|
+
|| memoryFixStages.slice(0, -1).some((from, index) => !flow.descriptor.edges.some(edge => edge.from === from && edge.to === memoryFixStages[index + 1] && edge.on === "accepted")))
|
|
112
|
+
throw new AppError("flow_handler_scope_invalid", "Memory repair requires its registered five-stage layout and result schema", 2, { phase: "prepare", effect: "no_effect" });
|
|
113
|
+
}
|
|
114
|
+
if (flow.descriptor.id === "review-fix") {
|
|
115
|
+
if (flow.descriptor.entry_stage !== "intake" || flow.descriptor.terminal_stages.length !== 1 || flow.descriptor.terminal_stages[0] !== "handoff"
|
|
116
|
+
|| flow.descriptor.stages.length !== reviewFixStages.length || flow.descriptor.edges.length !== reviewFixStages.length - 1
|
|
117
|
+
|| flow.descriptor.stages.some((stage, index) => stage.id !== reviewFixStages[index] || stage.directory !== `${String(index + 1).padStart(2, "0")}-${stage.id}`
|
|
118
|
+
|| JSON.parse(flow.stageBlob(stage.id, "result_schema").toString("utf8")).$id !== "dd-flow/review-fix-stage-result@1")
|
|
119
|
+
|| reviewFixStages.slice(0, -1).some((from, index) => !flow.descriptor.edges.some(edge => edge.from === from && edge.to === reviewFixStages[index + 1] && edge.on === "accepted")))
|
|
120
|
+
throw new AppError("flow_handler_scope_invalid", "Review-fix requires its registered three-stage scope/handoff layout and result schema", 2, { phase: "prepare", effect: "no_effect" });
|
|
121
|
+
}
|
|
122
|
+
if (flow.descriptor.id === "interactive") {
|
|
123
|
+
if (flow.descriptor.origin !== "project" || flow.descriptor.entry_stage !== "preflight"
|
|
124
|
+
|| flow.descriptor.terminal_stages.length !== 1 || flow.descriptor.terminal_stages[0] !== "integration"
|
|
125
|
+
|| flow.descriptor.stages.length !== interactiveStages.length || flow.descriptor.edges.length !== interactiveStages.length - 1
|
|
126
|
+
|| flow.descriptor.stages.some((stage, index) => stage.id !== interactiveStages[index] || stage.directory !== `${String(index + 1).padStart(2, "0")}-${stage.id}`
|
|
127
|
+
|| JSON.parse(flow.stageBlob(stage.id, "result_schema").toString("utf8")).$id !== "dd-flow/interactive-stage-result@1")
|
|
128
|
+
|| interactiveStages.slice(0, -1).some((from, index) => !flow.descriptor.edges.some(edge => edge.from === from && edge.to === interactiveStages[index + 1] && edge.on === "accepted")))
|
|
129
|
+
throw new AppError("flow_handler_scope_invalid", "Interactive requires its registered six-stage project layout and result schema", 2, { phase: "prepare", effect: "no_effect" });
|
|
130
|
+
}
|
|
131
|
+
if (isDeliveryFlow(flow.descriptor.id)) {
|
|
132
|
+
const stages = deliveryFlowStages[flow.descriptor.id];
|
|
133
|
+
if (flow.descriptor.entry_stage !== "preflight" || flow.descriptor.terminal_stages.length !== 1 || flow.descriptor.terminal_stages[0] !== "finish"
|
|
134
|
+
|| flow.descriptor.stages.length !== stages.length || flow.descriptor.edges.length !== stages.length - 1
|
|
135
|
+
|| flow.descriptor.stages.some((stage, index) => stage.id !== stages[index] || stage.directory !== `${String(index + 1).padStart(2, "0")}-${stage.id}`
|
|
136
|
+
|| JSON.parse(flow.stageBlob(stage.id, "result_schema").toString("utf8")).$id !== "dd-flow/delivery-stage-result@1")
|
|
137
|
+
|| stages.slice(0, -1).some((from, index) => !flow.descriptor.edges.some(edge => edge.from === from && edge.to === stages[index + 1] && edge.on === "accepted")))
|
|
138
|
+
throw new AppError("flow_handler_scope_invalid", "Delivery requires its registered six-stage layout and result schema", 2, { phase: "prepare", effect: "no_effect" });
|
|
139
|
+
}
|
|
140
|
+
return flow;
|
|
141
|
+
}
|