@deksden-com/dd-flow-cli 0.9.0-beta.14 → 0.9.0-beta.141
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 +740 -0
- package/README.md +143 -1
- package/dist/build-info.json +8 -8
- package/dist/cli/argument-values.js +38 -0
- package/dist/cli/command-inputs.js +376 -0
- package/dist/cli/command-metadata.js +197 -0
- package/dist/cli/command-option-descriptions.js +191 -0
- package/dist/cli/completion-cli.js +70 -0
- package/dist/cli/completion.js +57 -0
- package/dist/cli/error-output.js +52 -0
- package/dist/cli/executor-onboarding.js +76 -0
- package/dist/cli/flows.js +29 -0
- package/dist/cli/harnesses.js +84 -0
- package/dist/cli/help.js +328 -18
- package/dist/cli/hook-ingress.js +78 -0
- package/dist/cli/input-preparation.js +165 -0
- package/dist/cli/memory-flow-admission.js +44 -0
- package/dist/cli/memory-init-invocation.js +78 -0
- package/dist/cli/memory-init.js +240 -0
- package/dist/cli/memory-storage-admission.js +53 -0
- package/dist/cli/models.js +39 -0
- package/dist/cli/native-hook-ingress.js +80 -0
- package/dist/cli/operator-profiles.js +61 -0
- package/dist/cli/output-options.js +35 -0
- package/dist/cli/response-file.js +71 -0
- package/dist/cli/run-cli.js +1689 -545
- package/dist/cli/runtime-maintenance-diagnostics.js +46 -0
- package/dist/cli/runtime-maintenance-ingress.js +52 -0
- package/dist/cli/runtime-process.js +153 -0
- package/dist/cli/setup.js +149 -0
- package/dist/cli.js +71 -2
- package/dist/domain/stage-catalog.js +1 -1
- package/dist/domain/stage-handler-identities.js +20 -0
- package/dist/harness-runtime/DD-ZCODE.md +112 -0
- package/dist/harness-runtime/OPENCODE-LICENSE.txt +24 -0
- package/dist/harness-runtime/bin/dd-agy.mjs +56 -0
- package/dist/harness-runtime/bin/dd-codex.mjs +27 -0
- package/dist/harness-runtime/bin/dd-droid.mjs +34 -0
- package/dist/harness-runtime/bin/dd-grok.mjs +40 -0
- package/dist/harness-runtime/bin/dd-opencode.mjs +22 -0
- package/dist/harness-runtime/bin/dd-zcode.mjs +87 -0
- package/dist/harness-runtime/lib/adapter-timeouts.d.mts +5 -0
- package/dist/harness-runtime/lib/adapter-timeouts.mjs +34 -0
- package/dist/harness-runtime/lib/agy-hooks.d.mts +1 -0
- package/dist/harness-runtime/lib/agy-hooks.mjs +9 -0
- package/dist/harness-runtime/lib/daemon-observation.d.mts +2 -0
- package/dist/harness-runtime/lib/daemon-observation.mjs +163 -0
- package/dist/harness-runtime/lib/daemon-operations.d.mts +1 -0
- package/dist/harness-runtime/lib/daemon-operations.mjs +371 -0
- package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +6 -0
- package/dist/harness-runtime/lib/dd-agy-daemon.mjs +728 -0
- package/dist/harness-runtime/lib/dd-agy.mjs +70 -0
- package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-codex-daemon.mjs +196 -0
- package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-codex.mjs +817 -0
- package/dist/harness-runtime/lib/dd-droid-daemon.mjs +140 -0
- package/dist/harness-runtime/lib/dd-droid.mjs +584 -0
- package/dist/harness-runtime/lib/dd-grok-daemon.mjs +498 -0
- package/dist/harness-runtime/lib/dd-grok.mjs +177 -0
- package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +557 -0
- package/dist/harness-runtime/lib/dd-opencode.mjs +363 -0
- package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +751 -0
- package/dist/harness-runtime/lib/dd-zcode.mjs +1145 -0
- package/dist/harness-runtime/lib/delegation-instructions.d.mts +14 -0
- package/dist/harness-runtime/lib/delegation-instructions.mjs +157 -0
- package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
- package/dist/harness-runtime/lib/driver-recovery.mjs +139 -0
- package/dist/harness-runtime/lib/droid-observation.mjs +66 -0
- package/dist/harness-runtime/lib/lease-renewal.d.mts +8 -0
- package/dist/harness-runtime/lib/lease-renewal.mjs +37 -0
- package/dist/harness-runtime/lib/lifecycle-command.d.mts +20 -0
- package/dist/harness-runtime/lib/lifecycle-command.mjs +273 -0
- package/dist/harness-runtime/lib/lifecycle-contract.d.mts +10 -0
- package/dist/harness-runtime/lib/lifecycle-contract.mjs +19 -0
- package/dist/harness-runtime/lib/managed-daemon.d.mts +16 -0
- package/dist/harness-runtime/lib/managed-daemon.mjs +683 -0
- package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
- package/dist/harness-runtime/lib/model-observations.mjs +101 -0
- package/dist/harness-runtime/lib/native-children.d.mts +16 -0
- package/dist/harness-runtime/lib/native-children.mjs +113 -0
- package/dist/harness-runtime/lib/native-hook-command.d.mts +7 -0
- package/dist/harness-runtime/lib/native-hook-command.mjs +251 -0
- package/dist/harness-runtime/lib/native-request-proof.d.mts +2 -0
- package/dist/harness-runtime/lib/native-request-proof.mjs +65 -0
- package/dist/harness-runtime/lib/native-streams.mjs +45 -0
- package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
- package/dist/harness-runtime/lib/observation-clock.mjs +92 -0
- package/dist/harness-runtime/lib/opencode-plugin.mjs +85 -0
- package/dist/harness-runtime/lib/operation-context.mjs +5 -0
- package/dist/harness-runtime/lib/operation-errors.d.mts +16 -0
- package/dist/harness-runtime/lib/operation-errors.mjs +127 -0
- package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
- package/dist/harness-runtime/lib/operation-progress.mjs +114 -0
- package/dist/harness-runtime/lib/process-json.d.mts +5 -0
- package/dist/harness-runtime/lib/process-json.mjs +201 -0
- package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
- package/dist/harness-runtime/lib/provider-overload-policy.d.mts +13 -0
- package/dist/harness-runtime/lib/provider-overload-policy.mjs +138 -0
- package/dist/harness-runtime/lib/runner-events.mjs +200 -0
- package/dist/harness-runtime/lib/runner-lock.mjs +42 -0
- package/dist/harness-runtime/lib/session-settlement.mjs +30 -0
- package/dist/harness-runtime/lib/setup-progress.d.mts +9 -0
- package/dist/harness-runtime/lib/setup-progress.mjs +51 -0
- package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
- package/dist/harness-runtime/lib/tool-observations.mjs +228 -0
- package/dist/harness-runtime/lib/zcode-usage.mjs +55 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-1y4a697q.js +81 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-2ny4vxct.js +92 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-6mptkzbc.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-7x67cf1q.js +52 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9rqn6x4v.js +16 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9vdz0zwn.js +1661 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ecs5ftka.js +1466 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-frbwqjmf.js +145 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gne7h7mq.js +50 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gx9wnkzr.js +105 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-m2eywc8w.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-nwcpakzx.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-q4g3afnw.js +623 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-qav6mfdz.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-sxt88q69.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-t1xa31vm.js +39 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ve4aws36.js +103 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vmytr4q8.js +4 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vt9jbch8.js +36 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vyas3vgt.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-wjyeq25y.js +30 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-xgnj2w4v.js +20 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-y2etg5bs.js +9 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ydhz1zrh.js +238 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-z6qdwcsf.js +62 -0
- package/dist/harness-runtime/vendor/opencode-client/contract.d.ts +1 -0
- package/dist/harness-runtime/vendor/opencode-client/contract.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api/api.d.ts +2806 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api/api.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api.d.ts +4 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/client.d.ts +2530 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/client.js +15 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.d.ts +7 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.js +6 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.d.ts +2529 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.js +8 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.d.ts +2 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/index.d.ts +35 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/index.js +75 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/rpc.d.ts +20 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/rpc.js +11 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/service.d.ts +90 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/service.js +187 -0
- package/dist/harness-runtime/vendor/opencode-client/package.json +84 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/api.d.ts +21 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/api.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/client.d.ts +252 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/client.js +14 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.d.ts +8 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.js +6 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.d.ts +259 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.js +7 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.d.ts +3 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.js +79 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.d.ts +8932 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.js +70 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/index.d.ts +6 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/index.js +83 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/rpc.d.ts +32 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/rpc.js +7 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/service.d.ts +24 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/service.js +187 -0
- package/dist/harness-runtime/vendor/opencode-client/pty-handoff.d.ts +12 -0
- package/dist/harness-runtime/vendor/opencode-client/pty-handoff.js +14 -0
- package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.d.ts +20 -0
- package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.js +14 -0
- package/dist/harness-runtime/vendor/opencode-client/service-contender.d.ts +37 -0
- package/dist/harness-runtime/vendor/opencode-client/service-contender.js +10 -0
- package/dist/harness-runtime/vendor/opencode-client/service-probe.d.ts +70 -0
- package/dist/harness-runtime/vendor/opencode-client/service-probe.js +16 -0
- package/dist/harness-runtime/vendor/opencode-client/service-timing.d.ts +12 -0
- package/dist/harness-runtime/vendor/opencode-client/service-timing.js +10 -0
- package/dist/harness-runtime/vendor/opencode-client/service-version.d.ts +2 -0
- package/dist/harness-runtime/vendor/opencode-client/service-version.js +6 -0
- package/dist/harness-runtime/vendor/opencode-client/service.d.ts +52 -0
- package/dist/harness-runtime/vendor/opencode-client/service.js +1 -0
- package/dist/harness-runtime/vendor/opencode-client/shared-events.d.ts +11 -0
- package/dist/harness-runtime/vendor/opencode-client/shared-events.js +8 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/connection.d.ts +37 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/connection.js +10 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/data.d.ts +211 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/data.js +18 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/index.d.ts +3 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/index.js +32 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/pty.d.ts +22 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/pty.js +8 -0
- package/dist/harness-runtime/vendor/opencode-plugin.mjs +3 -0
- package/dist/protocol/local-files.js +18 -9
- package/dist/runtime/context.js +8 -4
- package/dist/schemas/agent-profile.schema.json +1 -1
- package/dist/schemas/code-review-result.schema.json +1 -1
- package/dist/schemas/code-verification.schema.json +7 -5
- package/dist/schemas/code-work-batch.schema.json +2 -2
- package/dist/schemas/discovery-result.schema.json +184 -0
- package/dist/schemas/execution-bundle.schema.json +205 -0
- package/dist/schemas/execution-settings.schema.json +162 -0
- package/dist/schemas/flow-descriptor.schema.json +54 -0
- package/dist/schemas/flow-run.schema.json +28 -0
- package/dist/schemas/harness-catalog.schema.json +80 -0
- package/dist/schemas/mb-init-compose-result.schema.json +457 -0
- package/dist/schemas/mb-init-discover-result.schema.json +500 -0
- package/dist/schemas/mb-init-finish-result.schema.json +422 -0
- package/dist/schemas/mb-init-preflight-result.schema.json +367 -0
- package/dist/schemas/mb-init-review-result.schema.json +396 -0
- package/dist/schemas/mb-init-verify-result.schema.json +391 -0
- package/dist/schemas/memory-bootstrap-receipt-v2.schema.json +67 -0
- package/dist/schemas/memory-bootstrap-receipt.schema.json +354 -0
- package/dist/schemas/memory-composition-work-result.schema.json +38 -0
- package/dist/schemas/memory-repair-work-result.schema.json +49 -0
- package/dist/schemas/memory-review-correction-plan.schema.json +30 -0
- package/dist/schemas/memory-review-work-result.schema.json +43 -0
- package/dist/schemas/model-catalog.schema.json +153 -0
- package/dist/schemas/plan-review-decision.schema.json +3 -3
- package/dist/schemas/plan-review-result.schema.json +2 -2
- package/dist/schemas/profile-settings.schema.json +122 -0
- package/dist/schemas/release-manifest.schema.json +291 -0
- package/dist/schemas/run-control-receipt.schema.json +118 -0
- package/dist/schemas/run-control-request.schema.json +36 -0
- package/dist/schemas/run-engine-binding.schema.json +1 -1
- package/dist/schemas/vnext-protocol-plan.schema.json +2 -2
- package/dist/services/branch-context.js +3 -3
- package/dist/services/canon.js +11 -8
- package/dist/services/check-runner-evidence.js +250 -0
- package/dist/services/cleanup.js +133 -40
- package/dist/services/cli-operation-classifier.js +25 -62
- package/dist/services/cli-upgrade-allowlist.js +27 -0
- package/dist/services/code-checks.js +1168 -107
- package/dist/services/codex-hook-delivery.js +32 -0
- package/dist/services/command-context.js +80 -0
- package/dist/services/compatibility-preflight.js +13 -3
- package/dist/services/config.js +11 -8
- package/dist/services/continuation-outcome.js +20 -0
- package/dist/services/controller-child-capacity.js +13 -0
- package/dist/services/controller-child-observer.js +115 -0
- package/dist/services/controller-execution.js +88 -0
- package/dist/services/controller-fanout.js +202 -0
- package/dist/services/dashboard.js +143 -58
- package/dist/services/descriptor-coordinator-session.js +35 -0
- package/dist/services/descriptor-root-work.js +53 -0
- package/dist/services/descriptor-run-settlement.js +105 -0
- package/dist/services/descriptor-run-start.js +449 -0
- package/dist/services/descriptor-stage-coordinator.js +197 -0
- package/dist/services/descriptor-stage-settlement.js +222 -0
- package/dist/services/descriptor-stage-start.js +139 -0
- package/dist/services/discovery/agy-discovery.js +2 -0
- package/dist/services/discovery/codex-discovery.js +2 -0
- package/dist/services/discovery/droid-discovery.js +2 -0
- package/dist/services/discovery/grok-discovery.js +2 -0
- package/dist/services/discovery/opencode-discovery.js +2 -0
- package/dist/services/discovery/static.js +31 -0
- package/dist/services/discovery/zcode-discovery.js +2 -0
- package/dist/services/engines.js +294 -153
- package/dist/services/eval-snapshots.js +1215 -116
- package/dist/services/execution-bundles.js +263 -0
- package/dist/services/execution-policy.js +185 -0
- package/dist/services/executor-onboarding.js +56 -0
- package/dist/services/external-work-launch.js +308 -0
- package/dist/services/flow-catalog.js +21 -0
- package/dist/services/flow-descriptors.js +82 -0
- package/dist/services/frozen-engine.js +250 -0
- package/dist/services/generic-execution.js +164 -0
- package/dist/services/harness-adapter.js +355 -36
- package/dist/services/harness-config.js +2 -0
- package/dist/services/harness-discovery.js +29 -0
- package/dist/services/harness-doctor.js +75 -0
- package/dist/services/harness-probe-effects.js +51 -0
- package/dist/services/harness-version-probe.js +100 -0
- package/dist/services/hooks.js +771 -325
- package/dist/services/hybrid-contracts.js +483 -0
- package/dist/services/ids.js +29 -1
- package/dist/services/installation-lock.js +95 -0
- package/dist/services/installed-flow-source.js +183 -0
- package/dist/services/lanes.js +78 -65
- package/dist/services/lifecycle-command.js +1 -288
- package/dist/services/lifecycle-contract.js +1 -0
- package/dist/services/lifecycle-invocations.js +2007 -0
- package/dist/services/managed-daemon-binding.js +38 -0
- package/dist/services/managed-lease-monitor.js +133 -0
- package/dist/services/managed-processes.js +475 -55
- package/dist/services/memory-accepted-composition.js +77 -0
- package/dist/services/memory-baseline-preservation.js +65 -0
- package/dist/services/memory-completed-correction-wave.js +320 -0
- package/dist/services/memory-compose-handler.js +258 -0
- package/dist/services/memory-composition-acceptance.js +199 -0
- package/dist/services/memory-composition-graph.js +134 -0
- package/dist/services/memory-composition-registration.js +146 -0
- package/dist/services/memory-composition-work-custody.js +151 -0
- package/dist/services/memory-composition-work-results.js +96 -0
- package/dist/services/memory-corrected-review-acceptance.js +129 -0
- package/dist/services/memory-corrected-review-batch.js +30 -0
- package/dist/services/memory-corrected-review-findings.js +106 -0
- package/dist/services/memory-corrected-review-inputs.js +210 -0
- package/dist/services/memory-corrected-review-projection.js +78 -0
- package/dist/services/memory-corrected-review-receipt.js +170 -0
- package/dist/services/memory-corrected-review-registration.js +191 -0
- package/dist/services/memory-correction-check-receipt.js +219 -0
- package/dist/services/memory-correction-input-owner.js +6 -0
- package/dist/services/memory-discover-handler.js +104 -0
- package/dist/services/memory-finish-evidence.js +435 -0
- package/dist/services/memory-finish-handler.js +215 -0
- package/dist/services/memory-finish-integration.js +280 -0
- package/dist/services/memory-finish-readiness.js +122 -0
- package/dist/services/memory-git-integration.js +151 -0
- package/dist/services/memory-historical-corrected-review.js +206 -0
- package/dist/services/memory-historical-original-review.js +130 -0
- package/dist/services/memory-historical-repair-registration.js +99 -0
- package/dist/services/memory-historical-second-review.js +128 -0
- package/dist/services/memory-init-bootstrap-readiness.js +210 -0
- package/dist/services/memory-init-contexts.js +89 -0
- package/dist/services/memory-init-controller-start.js +84 -0
- package/dist/services/memory-init-engine-release.js +223 -0
- package/dist/services/memory-init-git-policy.js +136 -0
- package/dist/services/memory-init-lint-capability.js +185 -0
- package/dist/services/memory-init-native-capacity.js +296 -0
- package/dist/services/memory-init-preflight.js +330 -0
- package/dist/services/memory-init-project-bootstrap.js +599 -0
- package/dist/services/memory-init-request-candidate.js +157 -0
- package/dist/services/memory-init-request-input.js +66 -0
- package/dist/services/memory-init-resource-storage.js +125 -0
- package/dist/services/memory-init-run-allocation.js +81 -0
- package/dist/services/memory-init-run-bundle.js +98 -0
- package/dist/services/memory-init-start.js +181 -0
- package/dist/services/memory-init-startup-custody.js +80 -0
- package/dist/services/memory-init-startup-input.js +240 -0
- package/dist/services/memory-init-storage.js +81 -0
- package/dist/services/memory-init-stores.js +359 -0
- package/dist/services/memory-init-worktrunk-capability.js +178 -0
- package/dist/services/memory-layer-publication.js +611 -0
- package/dist/services/memory-layer.js +156 -0
- package/dist/services/memory-lint-config.js +85 -0
- package/dist/services/memory-native-review-copy.js +165 -0
- package/dist/services/memory-normal-flow-entry.js +75 -0
- package/dist/services/memory-ordinary-defaults.js +112 -0
- package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
- package/dist/services/memory-preflight-handler.js +259 -0
- package/dist/services/memory-repair-current-view.js +299 -0
- package/dist/services/memory-repair-document-delta.js +451 -0
- package/dist/services/memory-repair-history.js +491 -0
- package/dist/services/memory-repair-physical-binding.js +312 -0
- package/dist/services/memory-repair-publication-files.js +152 -0
- package/dist/services/memory-repair-publication-intent.js +27 -0
- package/dist/services/memory-repair-publication-plan.js +160 -0
- package/dist/services/memory-repair-publication-source.js +225 -0
- package/dist/services/memory-repair-publication.js +794 -0
- package/dist/services/memory-repair-registration.js +239 -0
- package/dist/services/memory-repair-work-baseline.js +413 -0
- package/dist/services/memory-repair-work-completion.js +97 -0
- package/dist/services/memory-repair-work-custody.js +73 -0
- package/dist/services/memory-repair-work-results.js +89 -0
- package/dist/services/memory-repair-workspace.js +252 -0
- package/dist/services/memory-repair-writer-copy.js +735 -0
- package/dist/services/memory-result-binding.js +173 -0
- package/dist/services/memory-retained-review-authority.js +129 -0
- package/dist/services/memory-retained-review-results.js +70 -0
- package/dist/services/memory-retained-second-baseline.js +102 -0
- package/dist/services/memory-retained-second-repairs.js +156 -0
- package/dist/services/memory-review-acceptance.js +214 -0
- package/dist/services/memory-review-correction-plan.js +171 -0
- package/dist/services/memory-review-handler.js +585 -0
- package/dist/services/memory-review-inputs.js +200 -0
- package/dist/services/memory-review-receipt.js +180 -0
- package/dist/services/memory-review-registration.js +108 -0
- package/dist/services/memory-review-work-custody.js +124 -0
- package/dist/services/memory-review-work-input.js +72 -0
- package/dist/services/memory-review-work-results.js +73 -0
- package/dist/services/memory-second-corrected-review-inputs.js +165 -0
- package/dist/services/memory-second-correction-plan.js +76 -0
- package/dist/services/memory-second-repair-baseline.js +91 -0
- package/dist/services/memory-second-repair-launch.js +614 -0
- package/dist/services/memory-second-repair-registration.js +88 -0
- package/dist/services/memory-second-repair-source.js +187 -0
- package/dist/services/memory-second-review-acceptance.js +115 -0
- package/dist/services/memory-source-observations.js +117 -0
- package/dist/services/memory-stage-dispatch.js +28 -0
- package/dist/services/memory-stage-results.js +199 -0
- package/dist/services/memory-verification-acceptance.js +135 -0
- package/dist/services/memory-verification-checks.js +252 -0
- package/dist/services/memory-verification-receipt.js +159 -0
- package/dist/services/memory-verify-handler.js +135 -0
- package/dist/services/memory-work-result-preparation.js +63 -0
- package/dist/services/merge-queue.js +228 -149
- package/dist/services/merge-server.js +161 -35
- package/dist/services/migrations.js +37 -16
- package/dist/services/model-catalog.js +109 -0
- package/dist/services/model-discovery.js +46 -0
- package/dist/services/native-daemon-history.js +49 -0
- package/dist/services/native-session-control.js +39 -0
- package/dist/services/operator-profiles.js +236 -0
- package/dist/services/plan-runtime.js +26 -11
- package/dist/services/plans.js +28 -25
- package/dist/services/projects.js +37 -17
- package/dist/services/prompts.js +28 -17
- package/dist/services/protocols.js +163 -87
- package/dist/services/provider-capacity.js +385 -0
- package/dist/services/recovery-observation-budget.js +121 -0
- package/dist/services/recovery-snapshot-database.js +560 -0
- package/dist/services/release-archive-producer.js +52 -0
- package/dist/services/release-archive.js +143 -0
- package/dist/services/release-cache.js +142 -0
- package/dist/services/release-compatibility.js +18 -0
- package/dist/services/release-download.js +67 -0
- package/dist/services/release-envelope.js +104 -0
- package/dist/services/release-manifest.js +45 -0
- package/dist/services/release-payload.js +114 -0
- package/dist/services/release-producer.js +63 -0
- package/dist/services/release-provenance.js +160 -0
- package/dist/services/release-registry.js +66 -0
- package/dist/services/release-source.js +194 -0
- package/dist/services/repair-intents.js +42 -0
- package/dist/services/review-copy.js +165 -0
- package/dist/services/review-deferral.js +23 -0
- package/dist/services/run-control-receipt.js +56 -0
- package/dist/services/run-control-worker.js +411 -0
- package/dist/services/run-control.js +1056 -0
- package/dist/services/run-controller-adapter.js +399 -0
- package/dist/services/run-controller-capture.js +186 -0
- package/dist/services/run-controller-process.js +208 -0
- package/dist/services/run-controller-recovery.js +289 -0
- package/dist/services/run-controller-state.js +97 -0
- package/dist/services/run-controller.js +1205 -0
- package/dist/services/run-engine-bindings.js +1 -1
- package/dist/services/run-fork.js +147 -0
- package/dist/services/run-health.js +149 -0
- package/dist/services/run-observations.js +152 -0
- package/dist/services/run-projection.js +22 -64
- package/dist/services/run-recovery-guard.js +77 -0
- package/dist/services/run-recovery-runtime.js +112 -0
- package/dist/services/run-recovery.js +489 -0
- package/dist/services/run-start-custody.js +177 -0
- package/dist/services/runs.js +1019 -247
- package/dist/services/runtime-budget.js +430 -0
- package/dist/services/runtime-command.js +43 -0
- package/dist/services/runtime-scope-capture.js +52 -0
- package/dist/services/runtime-scope-control.js +468 -0
- package/dist/services/runtime-scope-resume.js +599 -0
- package/dist/services/runtime-scope-stop.js +210 -0
- package/dist/services/runtime-scope-worker.js +287 -0
- package/dist/services/runtime-service.js +96 -0
- package/dist/services/schema-validation.js +10 -8
- package/dist/services/scope-writer-cleanup.js +27 -0
- package/dist/services/sessions.js +35 -69
- package/dist/services/setup.js +377 -0
- package/dist/services/stage-blocker.js +17 -7
- package/dist/services/stage-context.js +193 -19
- package/dist/services/stage-handlers.js +74 -0
- package/dist/services/stage-lifecycle.js +152 -116
- package/dist/services/stage-pause.js +89 -75
- package/dist/services/stage-report-renderer.js +234 -6
- package/dist/services/stage-work-graph.js +52 -0
- package/dist/services/tooling.js +41 -30
- package/dist/services/usage.js +49 -101
- package/dist/services/verification-matrix.js +375 -0
- package/dist/services/vnext-code-review.js +223 -88
- package/dist/services/vnext-code.js +327 -226
- package/dist/services/vnext-contracts.js +10 -1
- package/dist/services/vnext-execution-profile.js +80 -5
- package/dist/services/vnext-fanout.js +311 -19
- package/dist/services/vnext-merge.js +332 -111
- package/dist/services/vnext-plan-review.js +279 -127
- package/dist/services/vnext-plan.js +228 -104
- package/dist/services/vnext-protocolize.js +531 -95
- package/dist/services/vnext-specify.js +119 -81
- package/dist/services/vnext-workspace-policy.js +7 -2
- package/dist/services/work-registry.js +1627 -199
- package/dist/services/workspace-bootstrap.js +52 -15
- package/dist/services/workspace-files.js +85 -0
- package/dist/services/worktrees.js +105 -48
- package/dist/shared/entity-references.js +8 -0
- package/dist/shared/errors.js +27 -0
- package/dist/storage/agent-output.js +26 -0
- package/dist/storage/database.js +891 -39
- package/dist/storage/foreign-key-transaction.js +39 -0
- package/dist/storage/immutable-input.js +45 -0
- package/dist/storage/import-guard.js +102 -0
- package/dist/storage/native-cleanup.js +52 -0
- package/dist/storage/paths.js +17 -4
- package/dist/storage/projection-lock.js +73 -0
- package/dist/storage/work-references.js +23 -0
- package/dist/storage/writer-contract.js +89 -0
- package/dist/storage/writer-migration.js +85 -0
- package/package.json +43 -13
- package/tools/create-canon-release.mjs +33 -0
- package/tools/produce-hybrid-release.mjs +41 -0
- package/tools/repair-paused-run-status.mjs +84 -0
|
@@ -2,22 +2,26 @@ import crypto from "node:crypto";
|
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { spawnSync } from "node:child_process";
|
|
5
|
+
import { commandResult } from '../harness-runtime/lib/process-json.mjs';
|
|
6
|
+
import { SETUP_STARTUP_MS } from '../harness-runtime/lib/setup-progress.mjs';
|
|
5
7
|
import { requireProjectByRoot } from "./projects.js";
|
|
6
8
|
import { appendAudit } from "./audit.js";
|
|
7
9
|
import { persistProtocolState, requireProtocol, readProtocolRuntimeState } from "./protocols.js";
|
|
8
|
-
import { attachFlowRunStage, completeFlowRunStage, getFlowRunStatus, startFlowRun } from "./runs.js";
|
|
10
|
+
import { attachFlowRunStage, prepareFlowRunStart, prepareFlowRunStageAttachment, prepareStageDirectory, completeFlowRunStage, getFlowRunStatus, startFlowRun } from "./runs.js";
|
|
9
11
|
import { validateSchema } from "./schema-validation.js";
|
|
10
12
|
import { reconcileSessionCoverage, registerFlowSession } from "./sessions.js";
|
|
11
13
|
import { usageForRun } from "./usage.js";
|
|
12
|
-
import { boundCanonicalPlan } from "./plan-runtime.js";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
14
|
+
import { boundCanonicalPlan, prepareCanonicalPlan } from "./plan-runtime.js";
|
|
15
|
+
import { prepareJsonFile, prepareJsonSchema, prepareOutputDirectory, prepareOutputFile, prepareTextFile } from "../cli/input-preparation.js";
|
|
16
|
+
import { AppError, errorRecord, processEvidence, diagnosticJson } from "../shared/errors.js";
|
|
17
|
+
import { planJsonPath, projectHome, resolveProjectRoot } from "../storage/paths.js";
|
|
15
18
|
import { resolveCanonRoot } from "./canon.js";
|
|
16
19
|
import { preflightMemoryPermissions } from "./memory-permissions.js";
|
|
17
20
|
import { registerProject } from "./projects.js";
|
|
18
21
|
import { registerProtocol } from "./protocols.js";
|
|
19
22
|
import { previewNextEntityId } from "./ids.js";
|
|
20
23
|
import { hookSessionIdentity, sessionIdForHookEvent } from "./hooks.js";
|
|
24
|
+
import { assertRunMutationAllowed } from "./run-recovery.js";
|
|
21
25
|
const stagePromptSections = [
|
|
22
26
|
"stage_identity",
|
|
23
27
|
"authoritative_runtime_facts",
|
|
@@ -28,63 +32,30 @@ const stagePromptSections = [
|
|
|
28
32
|
"work_contract",
|
|
29
33
|
"completion_contract"
|
|
30
34
|
];
|
|
31
|
-
function bootstrapStageRun(context, projectRoot,
|
|
32
|
-
if (input.stage !== "specify") {
|
|
33
|
-
throw new AppError("validation", "--bootstrap currently starts the initial specify stage only", 2, { stage: input.stage });
|
|
34
|
-
}
|
|
35
|
-
const subject = input.bootstrap?.subject.trim();
|
|
36
|
-
if (!subject)
|
|
37
|
-
throw new AppError("usage", "--bootstrap requires --subject", 2);
|
|
35
|
+
function bootstrapStageRun(context, projectRoot, bootstrap, intakeMarkdown) {
|
|
38
36
|
registerProject(context, { root: projectRoot });
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
const started = startFlowRun(context, {
|
|
43
|
-
projectRoot,
|
|
44
|
-
flowKind: "mb_sdlc",
|
|
45
|
-
subjectType: "protocol",
|
|
46
|
-
subjectId: protocolId,
|
|
47
|
-
slug: subject,
|
|
48
|
-
nextAction: "run_specify"
|
|
49
|
-
});
|
|
50
|
-
const intakeFile = input.bootstrap?.intakeFile;
|
|
51
|
-
if (intakeFile) {
|
|
52
|
-
const source = path.resolve(intakeFile);
|
|
53
|
-
if (!fs.existsSync(source) || !fs.statSync(source).isFile()) {
|
|
54
|
-
throw new AppError("not_found", "--intake-file must point to an existing file", 1, { intake_file: intakeFile });
|
|
55
|
-
}
|
|
37
|
+
registerProtocol(context, { handshakeId: bootstrap.protocolId, projectRoot });
|
|
38
|
+
const started = startFlowRun(context, bootstrap.startInput, bootstrap.start);
|
|
39
|
+
if (intakeMarkdown !== undefined) {
|
|
56
40
|
if (!started.run.run_root)
|
|
57
41
|
throw new AppError("runtime_missing", "New RUN has no artifact root", 1, { run_id: started.run.id });
|
|
58
42
|
const intakeDir = path.join(started.run.run_root, "intake");
|
|
59
43
|
fs.mkdirSync(intakeDir, { recursive: true });
|
|
60
|
-
fs.
|
|
44
|
+
fs.writeFileSync(path.join(intakeDir, "user-request.md"), intakeMarkdown);
|
|
61
45
|
}
|
|
62
46
|
return started.run.id;
|
|
63
47
|
}
|
|
64
|
-
function stagePreflight(projectRoot
|
|
48
|
+
function stagePreflight(projectRoot) {
|
|
65
49
|
const memoryBank = preflightMemoryPermissions({
|
|
66
50
|
root: projectRoot,
|
|
67
51
|
memoryBank: ".memory-bank",
|
|
68
52
|
flow: "custom",
|
|
69
|
-
mode: "
|
|
53
|
+
mode: "read",
|
|
70
54
|
targets: [{ path: ".memory-bank", mode: "read" }]
|
|
71
55
|
});
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
fs.renameSync(probe, `${probe}.renamed`);
|
|
76
|
-
fs.rmSync(`${probe}.renamed`);
|
|
77
|
-
return { ...memoryBank, ok: memoryBank.ok === true, stage_workspace: { path: stageRoot, status: "passed" } };
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
for (const candidate of [probe, `${probe}.renamed`]) {
|
|
81
|
-
try {
|
|
82
|
-
fs.rmSync(candidate, { force: true });
|
|
83
|
-
}
|
|
84
|
-
catch { /* best effort */ }
|
|
85
|
-
}
|
|
86
|
-
return { ...memoryBank, ok: false, stage_workspace: { path: stageRoot, status: "failed", message: String(error) } };
|
|
87
|
-
}
|
|
56
|
+
if (memoryBank.ok !== true)
|
|
57
|
+
throw new AppError("permission_preflight_failed", "Stage project context is not readable", 1, { preflight: memoryBank });
|
|
58
|
+
return memoryBank;
|
|
88
59
|
}
|
|
89
60
|
function flowKindForStage(stage) {
|
|
90
61
|
return ["code", "implementation", "readiness", "merge"].includes(stage) ? "implementation" : "planning";
|
|
@@ -103,23 +74,57 @@ function runtimeFacts(view, projectRoot) {
|
|
|
103
74
|
git: view.index.execution?.git ?? { branch: null, head: null, status: "unavailable" }
|
|
104
75
|
};
|
|
105
76
|
}
|
|
106
|
-
export function
|
|
77
|
+
export function prepareLegacyStageStart(context, input, intakeMarkdown) {
|
|
78
|
+
if (input.bootstrap && input.stage !== "specify")
|
|
79
|
+
throw new AppError("validation", "--bootstrap currently starts the initial specify stage only", 2);
|
|
80
|
+
if (input.bootstrap && !input.bootstrap.subject?.trim())
|
|
81
|
+
throw new AppError("usage", "--bootstrap requires --subject", 2);
|
|
82
|
+
if (!input.bootstrap && !input.runId)
|
|
83
|
+
throw new AppError("usage", "stage start requires a RUN id or --bootstrap", 2);
|
|
84
|
+
if (input.dir !== undefined)
|
|
85
|
+
prepareStageDirectory(input.dir);
|
|
86
|
+
const intake = intakeMarkdown ?? (input.bootstrap?.intakeFile ? prepareTextFile(input.bootstrap.intakeFile, "SPECIFY intake").text : undefined);
|
|
87
|
+
const projectRoot = resolveProjectRoot(input.projectRoot);
|
|
88
|
+
const retained = !input.bootstrap && input.runId ? runView(getFlowRunStatus(context, { projectRoot, runId: input.runId })) : null;
|
|
89
|
+
const dir = input.dir ?? defaultStageDir(input.stage, retained?.run.flow_kind ?? "mb_sdlc");
|
|
90
|
+
if (retained) {
|
|
91
|
+
prepareFlowRunStageAttachment(context, { projectRoot, runId: retained.run.id, stage: input.stage, dir, status: "running", dataSchemaId: dataSchemaForStage(input.stage) });
|
|
92
|
+
const root = path.join(runHomePath(retained.run), dir);
|
|
93
|
+
for (const name of ["stage-prompt.md", "stage-prompt.json", "stage-start.json", "stage-input.json"])
|
|
94
|
+
prepareOutputFile(path.join(root, name));
|
|
95
|
+
if (retained.run.subject.type === "protocol")
|
|
96
|
+
readProtocolRuntimeState(context, requireProtocol(context, retained.run.subject.id, retained.run.project_id));
|
|
97
|
+
}
|
|
98
|
+
const preflight = stagePreflight(projectRoot);
|
|
99
|
+
const sources = stageInstructionSources(context, projectRoot, retained?.run.flow_kind ?? "mb_sdlc", input.stage).map(source => ({ ...source, text: fs.existsSync(source.absolute) ? fs.readFileSync(source.absolute, "utf8").trim() : "(unavailable)" }));
|
|
100
|
+
let bootstrap;
|
|
101
|
+
if (input.bootstrap) {
|
|
102
|
+
const project = context.db.get("SELECT id FROM projects WHERE root = ?", [projectRoot]);
|
|
103
|
+
prepareOutputDirectory(project ? projectHome(context.ddFlowHome, project.id) : path.join(context.ddFlowHome, "projects"));
|
|
104
|
+
const preview = previewNextEntityId(context, { projectRoot, type: "protocol", slug: input.bootstrap.subject });
|
|
105
|
+
const startInput = { projectRoot, flowKind: "mb_sdlc", subjectType: "protocol", subjectId: preview.entity.id, slug: input.bootstrap.subject, nextAction: "run_specify" };
|
|
106
|
+
bootstrap = { protocolId: preview.entity.id, startInput, start: prepareFlowRunStart(context, startInput) };
|
|
107
|
+
}
|
|
108
|
+
return { intakeMarkdown: intake, projectRoot, retained, dir, preflight, sources, bootstrap };
|
|
109
|
+
}
|
|
110
|
+
export function startStage(context, input, prepared = prepareLegacyStageStart(context, input)) {
|
|
107
111
|
if (input.requireSessionBinding && !input.hookEventId) {
|
|
108
112
|
throw new AppError("trusted_session_binding_required", "This stage requires a trusted harness lifecycle binding; run it from a controlled Session with the dd-flow adapter enabled", 1);
|
|
109
113
|
}
|
|
110
|
-
const projectRoot =
|
|
114
|
+
const { projectRoot, retained, dir, preflight, sources } = prepared;
|
|
115
|
+
if (retained)
|
|
116
|
+
prepareFlowRunStageAttachment(context, { projectRoot, runId: retained.run.id, stage: input.stage, dir: input.dir ?? defaultStageDir(input.stage, retained.run.flow_kind), status: "running", dataSchemaId: dataSchemaForStage(input.stage) });
|
|
111
117
|
let requiredSessionId = null;
|
|
112
118
|
let requiredIdentity = null;
|
|
113
119
|
if (input.requireSessionBinding) {
|
|
114
|
-
registerProject(context, { root: projectRoot });
|
|
115
120
|
requiredIdentity = hookSessionIdentity(context, requireProjectByRoot(context, projectRoot).id, input.hookEventId);
|
|
116
121
|
requiredSessionId = requiredIdentity.sessionId;
|
|
117
122
|
}
|
|
118
|
-
const runId =
|
|
123
|
+
const runId = prepared.bootstrap ? bootstrapStageRun(context, projectRoot, prepared.bootstrap, prepared.intakeMarkdown) : input.runId;
|
|
119
124
|
if (!runId)
|
|
120
125
|
throw new AppError("usage", "stage start requires a RUN id or --bootstrap", 2);
|
|
121
|
-
const before = runView(getFlowRunStatus(context, { projectRoot, runId }));
|
|
122
|
-
|
|
126
|
+
const before = retained ?? runView(getFlowRunStatus(context, { projectRoot, runId }));
|
|
127
|
+
assertRunMutationAllowed(context, before.run.project_id, before.run.id);
|
|
123
128
|
const attached = runView(attachFlowRunStage(context, {
|
|
124
129
|
projectRoot,
|
|
125
130
|
runId,
|
|
@@ -132,9 +137,6 @@ export function startStage(context, input) {
|
|
|
132
137
|
const stageRoot = path.join(runHome, dir);
|
|
133
138
|
ensureWithin(runHome, stageRoot, "stage root");
|
|
134
139
|
fs.mkdirSync(stageRoot, { recursive: true });
|
|
135
|
-
const preflight = stagePreflight(projectRoot, stageRoot);
|
|
136
|
-
if (preflight.ok !== true)
|
|
137
|
-
throw new AppError("permission_preflight_failed", "Stage workspace is not writable", 1, { preflight });
|
|
138
140
|
if (attached.run.subject.type === "protocol") {
|
|
139
141
|
syncProtocolLifecycle(context, attached.run.project_id, attached.run.subject.id, input.stage, "running");
|
|
140
142
|
}
|
|
@@ -142,7 +144,7 @@ export function startStage(context, input) {
|
|
|
142
144
|
if (sessionId) {
|
|
143
145
|
const identity = requiredIdentity ?? (input.hookEventId ? hookSessionIdentity(context, attached.run.project_id, input.hookEventId) : null);
|
|
144
146
|
registerFlowSession(context, {
|
|
145
|
-
|
|
147
|
+
hookEventId: input.hookEventId,
|
|
146
148
|
payloadJson: JSON.stringify({
|
|
147
149
|
project_root: projectRoot,
|
|
148
150
|
harness: identity?.harness ?? "codex-desktop",
|
|
@@ -162,12 +164,12 @@ export function startStage(context, input) {
|
|
|
162
164
|
continuation_policy: "go_router",
|
|
163
165
|
session_kind: "orchestrator",
|
|
164
166
|
current_stage: input.stage,
|
|
165
|
-
cwd:
|
|
167
|
+
cwd: identity?.cwd ?? null
|
|
166
168
|
})
|
|
167
169
|
});
|
|
168
170
|
}
|
|
169
171
|
const promptPath = path.join(stageRoot, "stage-prompt.md");
|
|
170
|
-
const prompt = composeStagePrompt(context, projectRoot, before, attached, input.stage, dir, preflight);
|
|
172
|
+
const prompt = composeStagePrompt(context, projectRoot, before, attached, input.stage, dir, preflight, sources);
|
|
171
173
|
atomicWrite(promptPath, prompt);
|
|
172
174
|
const semanticInputPath = path.join(stageRoot, "stage-input.json");
|
|
173
175
|
if (!fs.existsSync(semanticInputPath)) {
|
|
@@ -178,7 +180,6 @@ export function startStage(context, input) {
|
|
|
178
180
|
const aspectMapPath = path.join(stageRoot, "aspect-map.json");
|
|
179
181
|
const attempt = attached.index.stage_runs?.find((stage) => stage.stage === input.stage)?.attempt ?? "try-001";
|
|
180
182
|
const attemptNumber = Number(attempt.replace("try-", "")) || 1;
|
|
181
|
-
const sources = stageInstructionSources(context, projectRoot, attached.run.flow_kind, input.stage);
|
|
182
183
|
atomicWrite(promptDataPath, {
|
|
183
184
|
schema_id: "dd-flow/stage-prompt@2",
|
|
184
185
|
run_id: attached.run.id,
|
|
@@ -257,12 +258,13 @@ export function startStage(context, input) {
|
|
|
257
258
|
lifecycle: "stage start -> semantic work -> stage finish"
|
|
258
259
|
};
|
|
259
260
|
}
|
|
260
|
-
export function
|
|
261
|
+
export function prepareStageFinish(context, input) {
|
|
261
262
|
const projectRoot = resolveProjectRoot(input.projectRoot);
|
|
262
263
|
if (!input.runId)
|
|
263
264
|
throw new AppError("usage", "stage finish requires a RUN id", 2);
|
|
264
265
|
const runId = input.runId;
|
|
265
266
|
const view = runView(getFlowRunStatus(context, { projectRoot, runId }));
|
|
267
|
+
assertRunMutationAllowed(context, view.run.project_id, view.run.id);
|
|
266
268
|
const existing = view.index.stage_runs?.find((stage) => stage.stage === input.stage);
|
|
267
269
|
if (!existing) {
|
|
268
270
|
throw new AppError("not_found", `Run stage is not attached: ${input.stage}`, 1, { run_id: view.run.id, stage: input.stage });
|
|
@@ -271,31 +273,37 @@ export function finishStage(context, input) {
|
|
|
271
273
|
const runHome = runHomePath(view.run);
|
|
272
274
|
const stageRoot = path.join(runHome, dir);
|
|
273
275
|
ensureWithin(runHome, stageRoot, "stage root");
|
|
274
|
-
fs.mkdirSync(stageRoot, { recursive: true });
|
|
275
276
|
const semanticFile = resolveStageFile(input.semanticFile ?? "@stage/stage-input.json", stageRoot, runHome);
|
|
276
|
-
|
|
277
|
+
ensureWithin(runHome, semanticFile, "semantic file");
|
|
278
|
+
const source = prepareJsonSchema(semanticFile, "Stage finish input", { schemaName: "stage-finish-input", projectRoot, runId, runRoot: runHome, ddFlowHome: context.ddFlowHome });
|
|
279
|
+
const semantic = source.value;
|
|
280
|
+
const status = stringValue(semantic.status) ?? "done";
|
|
281
|
+
if (!["done", "waiting_for_user", "blocked", "failed"].includes(status)) {
|
|
282
|
+
throw new AppError("validation", "Stage finish status must be done, waiting_for_user, blocked, or failed", 2, { status });
|
|
283
|
+
}
|
|
284
|
+
validateStageOutcome(input.stage, status, semantic);
|
|
285
|
+
const planFinish = input.stage === "plan" ? preparePlanFinish(context, projectRoot, view, stageRoot) : undefined;
|
|
286
|
+
return { projectRoot, runId, view, existing, runHome, stageRoot, semanticFile, semantic, status, source, planFinish };
|
|
287
|
+
}
|
|
288
|
+
export async function finishStage(context, input, prepared = prepareStageFinish(context, input)) {
|
|
289
|
+
const { projectRoot, runId, view, runHome, stageRoot, semanticFile, semantic, status, source, planFinish } = prepared;
|
|
290
|
+
assertRunMutationAllowed(context, view.run.project_id, view.run.id);
|
|
291
|
+
fs.mkdirSync(stageRoot, { recursive: true });
|
|
292
|
+
const receipt = beginFinishReceipt(context, stageRoot, semanticFile, view.run.id, input.stage, source.text);
|
|
277
293
|
try {
|
|
278
|
-
validateSchema({ schemaName: "stage-finish-input", file: semanticFile, projectRoot, runId, runRoot: runHome, ddFlowHome: context.ddFlowHome });
|
|
279
|
-
const semantic = readSemanticFile(semanticFile, runHome);
|
|
280
|
-
const status = stringValue(semantic.status) ?? "done";
|
|
281
|
-
if (!["done", "waiting_for_user", "blocked", "failed"].includes(status)) {
|
|
282
|
-
throw new AppError("validation", "Stage finish status must be done, waiting_for_user, blocked, or failed", 2, { status });
|
|
283
|
-
}
|
|
284
|
-
validateStageOutcome(input.stage, status, semantic);
|
|
285
294
|
const coverage = workerCoverage(context, view.run.project_id, view.run.id);
|
|
286
295
|
if (coverage.jobs.missing?.length) {
|
|
287
296
|
throw new AppError("worker_jobs_incomplete", "Stage finish requires all declared worker jobs", 1, { coverage });
|
|
288
297
|
}
|
|
289
|
-
const lint = runTargetedMemoryBankLint(projectRoot);
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
: undefined;
|
|
298
|
+
const lint = await runTargetedMemoryBankLint(projectRoot, undefined, path.join(stageRoot, "diagnostics"));
|
|
299
|
+
if (planFinish)
|
|
300
|
+
boundCanonicalPlan(context, { projectId: view.run.project_id, protocolId: view.run.subject.id, planPath: planFinish.plan_path }, planFinish.canonical);
|
|
293
301
|
const report = buildStageReport(context, view, input.stage, status, semantic, stageRoot, lint, planFinish);
|
|
294
302
|
const dataPath = path.join(stageRoot, "stage-report.json");
|
|
295
303
|
const reportPath = path.join(stageRoot, "stage-report.md");
|
|
296
304
|
const htmlPath = path.join(stageRoot, "stage-report.html");
|
|
305
|
+
validateSchema({ schemaName: stageReportSchemaName(input.stage, planFinish), file: dataPath, data: report, projectRoot, runId, runRoot: runHome, ddFlowHome: context.ddFlowHome });
|
|
297
306
|
atomicWrite(dataPath, report);
|
|
298
|
-
validateSchema({ schemaName: stageReportSchemaName(input.stage, planFinish), file: dataPath, projectRoot, runId, runRoot: runHome, ddFlowHome: context.ddFlowHome });
|
|
299
307
|
atomicWrite(reportPath, renderMarkdown(report));
|
|
300
308
|
atomicWrite(htmlPath, renderHtml(projectRoot, report));
|
|
301
309
|
if (view.run.subject.type === "protocol") {
|
|
@@ -480,12 +488,10 @@ function semanticInputTemplate(stage) {
|
|
|
480
488
|
next_action: waiting ? "waiting_for_user: obtain the clarification packet" : "Continue to the next approved stage."
|
|
481
489
|
};
|
|
482
490
|
}
|
|
483
|
-
function composeStagePrompt(context, projectRoot, before, current, stage, dir, preflight) {
|
|
491
|
+
function composeStagePrompt(context, projectRoot, before, current, stage, dir, preflight, sources) {
|
|
484
492
|
const project = requireProjectByRoot(context, projectRoot);
|
|
485
493
|
const runHome = runHomePath(current.run);
|
|
486
|
-
const instructions =
|
|
487
|
-
return fs.existsSync(absolute) ? `### ${label}\n\n${fs.readFileSync(absolute, "utf8").trim()}` : `### ${label}\n\n(unavailable)`;
|
|
488
|
-
}).join("\n\n");
|
|
494
|
+
const instructions = sources.map(({ label, text }) => `### ${label}\n\n${text}`).join("\n\n");
|
|
489
495
|
const protocol = safeProtocolState(context, current.run.project_id, current.run.subject.id);
|
|
490
496
|
return [
|
|
491
497
|
"<stage_identity>",
|
|
@@ -508,7 +514,7 @@ function composeStagePrompt(context, projectRoot, before, current, stage, dir, p
|
|
|
508
514
|
"</authoritative_runtime_facts>",
|
|
509
515
|
"",
|
|
510
516
|
"<preflight>",
|
|
511
|
-
`-
|
|
517
|
+
`- Read-only permission check: ${String(preflight.ok === true ? "passed" : "failed")}.`,
|
|
512
518
|
"- CLI compatibility was checked before this state-changing command.",
|
|
513
519
|
"</preflight>",
|
|
514
520
|
"",
|
|
@@ -581,16 +587,6 @@ function safeProtocolState(context, projectId, protocolId) {
|
|
|
581
587
|
return undefined;
|
|
582
588
|
}
|
|
583
589
|
}
|
|
584
|
-
function readSemanticFile(file, runHome) {
|
|
585
|
-
const resolved = path.resolve(file);
|
|
586
|
-
ensureWithin(runHome, resolved, "semantic file");
|
|
587
|
-
if (!fs.existsSync(resolved))
|
|
588
|
-
throw new AppError("not_found", "Semantic input file is missing", 1, { path: file });
|
|
589
|
-
const value = JSON.parse(fs.readFileSync(resolved, "utf8"));
|
|
590
|
-
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
591
|
-
throw new AppError("validation", "Semantic input must be a JSON object", 2);
|
|
592
|
-
return value;
|
|
593
|
-
}
|
|
594
590
|
function validateStageOutcome(stage, status, semantic) {
|
|
595
591
|
if (stage !== "specify")
|
|
596
592
|
return;
|
|
@@ -602,17 +598,12 @@ function validateStageOutcome(stage, status, semantic) {
|
|
|
602
598
|
throw new AppError("semantic_status_inconsistent", "SPECIFY done cannot contain unresolved structured questions", 2);
|
|
603
599
|
}
|
|
604
600
|
}
|
|
605
|
-
function beginFinishReceipt(context, stageRoot, semanticFile, runId, stage) {
|
|
601
|
+
function beginFinishReceipt(context, stageRoot, semanticFile, runId, stage, raw) {
|
|
606
602
|
const receiptDir = path.join(stageRoot, "finish-receipts");
|
|
607
603
|
fs.mkdirSync(receiptDir, { recursive: true });
|
|
608
604
|
const number = fs.readdirSync(receiptDir).filter((file) => /^\d{3}\.json$/u.test(file)).length + 1;
|
|
609
605
|
const receiptPath = path.join(receiptDir, `${String(number).padStart(3, "0")}.json`);
|
|
610
|
-
|
|
611
|
-
try {
|
|
612
|
-
raw = fs.readFileSync(semanticFile, "utf8");
|
|
613
|
-
}
|
|
614
|
-
catch { /* receipt records the missing input below */ }
|
|
615
|
-
const semanticSha = raw === null ? null : crypto.createHash("sha256").update(raw).digest("hex");
|
|
606
|
+
const semanticSha = crypto.createHash("sha256").update(raw).digest("hex");
|
|
616
607
|
atomicWrite(receiptPath, {
|
|
617
608
|
schema_id: "dd-flow/stage-finish-receipt@1",
|
|
618
609
|
run_id: runId,
|
|
@@ -750,7 +741,8 @@ function buildStageReport(context, view, stage, status, semantic, stageRoot, lin
|
|
|
750
741
|
next_action: stringValue(semantic.next_action) ?? "Resolve the stage result before continuing.",
|
|
751
742
|
...(Array.isArray(semantic.questions) ? { questions: semantic.questions } : {}),
|
|
752
743
|
...(Array.isArray(semantic.reviewer_findings) ? { reviewer_findings: semantic.reviewer_findings } : {}),
|
|
753
|
-
...(Array.isArray(semantic.def_outcomes) ? { def_outcomes: semantic.def_outcomes } : {})
|
|
744
|
+
...(Array.isArray(semantic.def_outcomes) ? { def_outcomes: semantic.def_outcomes } : {}),
|
|
745
|
+
...(semantic.materialization !== undefined ? { materialization: semantic.materialization } : {})
|
|
754
746
|
},
|
|
755
747
|
mechanical: {
|
|
756
748
|
started_at: startedAt,
|
|
@@ -775,17 +767,13 @@ function buildStageReport(context, view, stage, status, semantic, stageRoot, lin
|
|
|
775
767
|
}
|
|
776
768
|
function preparePlanFinish(context, projectRoot, view, stageRoot) {
|
|
777
769
|
const planPath = planJsonPath(projectRoot, view.run.subject.id);
|
|
778
|
-
const canonical =
|
|
770
|
+
const canonical = prepareCanonicalPlan(context, {
|
|
779
771
|
projectId: view.run.project_id,
|
|
780
772
|
protocolId: view.run.subject.id,
|
|
781
773
|
planPath
|
|
782
774
|
});
|
|
783
775
|
const aspectMapPath = path.join(stageRoot, "aspect-map.json");
|
|
784
|
-
|
|
785
|
-
throw new AppError("not_found", "PLAN aspect-map.json is missing", 1, { path: aspectMapPath });
|
|
786
|
-
}
|
|
787
|
-
const raw = fs.readFileSync(aspectMapPath, "utf8");
|
|
788
|
-
const value = JSON.parse(raw);
|
|
776
|
+
const { text: raw, value } = prepareJsonFile(aspectMapPath, "PLAN aspect map");
|
|
789
777
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
790
778
|
throw new AppError("validation", "PLAN aspect-map.json must be a JSON object", 2, { path: aspectMapPath });
|
|
791
779
|
}
|
|
@@ -848,7 +836,7 @@ function workerCoverage(context, projectId, runId) {
|
|
|
848
836
|
jobs: { expected: jobs.map((job) => job.job_id), missing: missingJobs }
|
|
849
837
|
};
|
|
850
838
|
}
|
|
851
|
-
export function runTargetedMemoryBankLint(projectRoot, selectedFiles) {
|
|
839
|
+
export async function runTargetedMemoryBankLint(projectRoot, selectedFiles, diagnosticRoot) {
|
|
852
840
|
const files = [...new Set((selectedFiles ?? gitChangedFiles(projectRoot)).filter((file) => file.startsWith(".memory-bank/") && file.toLowerCase().endsWith(".md") && !file.split(/[\\/]/u).some((part) => part === ".." || part.startsWith(".env"))))];
|
|
853
841
|
for (const file of files)
|
|
854
842
|
ensureWithin(projectRoot, path.resolve(projectRoot, file), "lint target");
|
|
@@ -856,23 +844,71 @@ export function runTargetedMemoryBankLint(projectRoot, selectedFiles) {
|
|
|
856
844
|
return { ok: true, status: "not_applicable_no_changed_docs", files, finding_count: 0 };
|
|
857
845
|
}
|
|
858
846
|
const binary = process.env.MB_LINT_BIN ?? "mb-lint";
|
|
859
|
-
const
|
|
860
|
-
|
|
861
|
-
|
|
847
|
+
const fail = (code, message, details) => {
|
|
848
|
+
const error = new AppError(code, message, 1, { binary, files, ...details });
|
|
849
|
+
if (diagnosticRoot) {
|
|
850
|
+
try {
|
|
851
|
+
fs.mkdirSync(diagnosticRoot, { recursive: true });
|
|
852
|
+
const file = path.join(diagnosticRoot, `lint-${crypto.randomUUID()}.json`);
|
|
853
|
+
if (details.report) {
|
|
854
|
+
const reportFile = file.replace(/\.json$/, ".report.json"), report = diagnosticJson(details.report);
|
|
855
|
+
const reportBytes = Buffer.from(report);
|
|
856
|
+
fs.writeFileSync(reportFile, reportBytes.length <= 1024 * 1024 ? report : JSON.stringify({ truncated: true, bytes: reportBytes.length, excerpt: reportBytes.subarray(0, 128 * 1024).toString("utf8") }), { flag: "wx", mode: 0o600 });
|
|
857
|
+
error.details.report_path = reportFile;
|
|
858
|
+
}
|
|
859
|
+
delete error.details.report;
|
|
860
|
+
fs.writeFileSync(file, diagnosticJson(errorRecord(error)), { flag: "wx", mode: 0o600 });
|
|
861
|
+
error.details.diagnostic_path = file;
|
|
862
|
+
}
|
|
863
|
+
catch (capture) {
|
|
864
|
+
delete error.details.report;
|
|
865
|
+
error.details.capture_error = errorRecord(capture);
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
delete error.details.report;
|
|
869
|
+
throw error;
|
|
870
|
+
};
|
|
871
|
+
let result;
|
|
872
|
+
try {
|
|
873
|
+
result = await commandResult(binary, ["--root", projectRoot, "--files", ...files, "--format", "json"], { cwd: projectRoot, startupMs: SETUP_STARTUP_MS });
|
|
862
874
|
}
|
|
863
|
-
|
|
875
|
+
catch (cause) {
|
|
876
|
+
const recorded = errorRecord(cause), unavailable = ["ENOENT", "EACCES", "ENOEXEC"].includes(recorded.code);
|
|
877
|
+
fail(unavailable ? "lint_gate_unavailable" : "lint_gate_tool_failed", "Selected-file mb-lint could not execute", { cause: recorded });
|
|
878
|
+
}
|
|
879
|
+
const evidence = processEvidence(result);
|
|
880
|
+
if (result.signal || result.exit_code !== 0 && result.exit_code !== 1)
|
|
881
|
+
fail("lint_gate_tool_failed", "Selected-file mb-lint did not complete normally", { process: evidence });
|
|
882
|
+
let parsed;
|
|
864
883
|
try {
|
|
865
|
-
parsed =
|
|
884
|
+
parsed = JSON.parse(result.stdout);
|
|
866
885
|
}
|
|
867
886
|
catch {
|
|
868
|
-
|
|
887
|
+
fail(result.exit_code === 0 ? "lint_gate_invalid_output" : "lint_gate_tool_failed", "Selected-file mb-lint did not return a report", { process: evidence });
|
|
869
888
|
}
|
|
870
|
-
|
|
871
|
-
|
|
889
|
+
const report = parsed;
|
|
890
|
+
const severities = { error: "errors", warning: "warnings", info: "info", suggestion: "suggestions" };
|
|
891
|
+
const matchingRoot = () => { try {
|
|
892
|
+
return typeof report?.root === "string" && fs.realpathSync(path.resolve(projectRoot, report.root)) === fs.realpathSync(projectRoot);
|
|
872
893
|
}
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
894
|
+
catch {
|
|
895
|
+
return false;
|
|
896
|
+
} };
|
|
897
|
+
const valid = report && report.tool === "mb-lint" && typeof report.version === "string" && report.version.trim()
|
|
898
|
+
&& matchingRoot()
|
|
899
|
+
&& report.memoryBank === ".memory-bank" && report.summary && Array.isArray(report.findings)
|
|
900
|
+
&& report.findings.every(finding => finding && typeof finding === "object" && typeof finding.severity === "string" && Object.hasOwn(severities, finding.severity)
|
|
901
|
+
&& [finding.ruleId, finding.file, finding.message].every(value => typeof value === "string" && value.trim()))
|
|
902
|
+
&& Object.entries(severities).every(([severity, key]) => Number.isSafeInteger(report.summary[key]) && Number(report.summary[key]) >= 0
|
|
903
|
+
&& report.summary[key] === report.findings.filter(finding => finding.severity === severity).length);
|
|
904
|
+
if (!valid)
|
|
905
|
+
fail(result.exit_code === 0 ? "lint_gate_invalid_output" : "lint_gate_tool_failed", "Selected-file mb-lint returned an invalid report", { process: evidence });
|
|
906
|
+
const errors = Number(report.summary.errors);
|
|
907
|
+
if ((errors > 0 ? 1 : 0) !== result.exit_code)
|
|
908
|
+
fail("lint_gate_invalid_output", "Selected-file mb-lint report contradicts its exit status", { process: evidence });
|
|
909
|
+
if (errors > 0)
|
|
910
|
+
fail("lint_gate_failed", "Selected-file mb-lint reported blocking findings", { process: evidence, report: parsed, summary: report.summary, finding_count: report.findings.length });
|
|
911
|
+
const findingCount = report.findings.length;
|
|
876
912
|
return { ok: true, status: "passed", binary, files, finding_count: findingCount, result: parsed };
|
|
877
913
|
}
|
|
878
914
|
function renderMarkdown(report) {
|