@deksden-com/dd-flow-cli 0.9.0-beta.15 → 0.9.0-beta.150
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 +895 -0
- package/README.md +140 -6
- package/dist/build-info.json +8 -8
- package/dist/cli/argument-values.js +38 -0
- package/dist/cli/command-inputs.js +386 -0
- package/dist/cli/command-metadata.js +232 -0
- package/dist/cli/command-option-descriptions.js +192 -0
- package/dist/cli/completion-cli.js +70 -0
- package/dist/cli/completion.js +57 -0
- package/dist/cli/diagnostic-invocation.js +46 -0
- package/dist/cli/diagnostic.js +120 -0
- package/dist/cli/error-output.js +52 -0
- package/dist/cli/executor-onboarding.js +76 -0
- package/dist/cli/flows.js +29 -0
- package/dist/cli/harnesses.js +84 -0
- package/dist/cli/help.js +396 -19
- package/dist/cli/hook-ingress.js +102 -0
- package/dist/cli/input-preparation.js +165 -0
- package/dist/cli/memory-flow-admission.js +50 -0
- package/dist/cli/memory-init-invocation.js +85 -0
- package/dist/cli/memory-init.js +249 -0
- package/dist/cli/memory-storage-admission.js +54 -0
- package/dist/cli/memory-storage-qualification.js +105 -0
- package/dist/cli/memory-storage-transition.js +123 -0
- package/dist/cli/memory-upgrade.js +189 -0
- package/dist/cli/models.js +39 -0
- package/dist/cli/native-hook-ingress.js +90 -0
- package/dist/cli/native-hook-preparation.js +55 -0
- package/dist/cli/operator-profiles.js +61 -0
- package/dist/cli/output-options.js +35 -0
- package/dist/cli/response-file.js +72 -0
- package/dist/cli/run-cli.js +1734 -550
- package/dist/cli/runtime-maintenance-diagnostics.js +46 -0
- package/dist/cli/runtime-maintenance-ingress.js +52 -0
- package/dist/cli/runtime-process.js +153 -0
- package/dist/cli/setup.js +150 -0
- package/dist/cli.js +89 -2
- package/dist/domain/diagnostic-aspects.js +103 -0
- package/dist/domain/diagnostic-flows.js +8 -0
- package/dist/domain/stage-catalog.js +1 -1
- package/dist/domain/stage-handler-identities.js +28 -0
- package/dist/harness-runtime/DD-ZCODE.md +112 -0
- package/dist/harness-runtime/OPENCODE-LICENSE.txt +24 -0
- package/dist/harness-runtime/bin/dd-agy.mjs +56 -0
- package/dist/harness-runtime/bin/dd-codex.mjs +27 -0
- package/dist/harness-runtime/bin/dd-droid.mjs +34 -0
- package/dist/harness-runtime/bin/dd-grok.mjs +40 -0
- package/dist/harness-runtime/bin/dd-opencode.mjs +22 -0
- package/dist/harness-runtime/bin/dd-zcode.mjs +87 -0
- package/dist/harness-runtime/lib/adapter-timeouts.d.mts +5 -0
- package/dist/harness-runtime/lib/adapter-timeouts.mjs +34 -0
- package/dist/harness-runtime/lib/agy-error-boundary.mjs +58 -0
- package/dist/harness-runtime/lib/agy-hooks.d.mts +1 -0
- package/dist/harness-runtime/lib/agy-hooks.mjs +9 -0
- package/dist/harness-runtime/lib/agy-native-inspection.mjs +216 -0
- package/dist/harness-runtime/lib/agy-native_pb.js +117 -0
- package/dist/harness-runtime/lib/daemon-observation.d.mts +2 -0
- package/dist/harness-runtime/lib/daemon-observation.mjs +163 -0
- package/dist/harness-runtime/lib/daemon-operations.d.mts +2 -0
- package/dist/harness-runtime/lib/daemon-operations.mjs +462 -0
- package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +6 -0
- package/dist/harness-runtime/lib/dd-agy-daemon.mjs +1096 -0
- package/dist/harness-runtime/lib/dd-agy.mjs +86 -0
- package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-codex-daemon.mjs +231 -0
- package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-codex.mjs +954 -0
- package/dist/harness-runtime/lib/dd-droid-daemon.mjs +141 -0
- package/dist/harness-runtime/lib/dd-droid.mjs +626 -0
- package/dist/harness-runtime/lib/dd-grok-daemon.mjs +555 -0
- package/dist/harness-runtime/lib/dd-grok.mjs +180 -0
- package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +622 -0
- package/dist/harness-runtime/lib/dd-opencode.mjs +390 -0
- package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +752 -0
- package/dist/harness-runtime/lib/dd-zcode.mjs +1175 -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 +140 -0
- package/dist/harness-runtime/lib/droid-observation.mjs +66 -0
- package/dist/harness-runtime/lib/entity-references.d.mts +2 -0
- package/dist/harness-runtime/lib/entity-references.mjs +9 -0
- package/dist/harness-runtime/lib/lease-renewal.d.mts +8 -0
- package/dist/harness-runtime/lib/lease-renewal.mjs +37 -0
- package/dist/harness-runtime/lib/lifecycle-command.d.mts +20 -0
- package/dist/harness-runtime/lib/lifecycle-command.mjs +273 -0
- package/dist/harness-runtime/lib/lifecycle-contract.d.mts +10 -0
- package/dist/harness-runtime/lib/lifecycle-contract.mjs +19 -0
- package/dist/harness-runtime/lib/managed-daemon.d.mts +16 -0
- package/dist/harness-runtime/lib/managed-daemon.mjs +698 -0
- package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
- package/dist/harness-runtime/lib/model-observations.mjs +101 -0
- package/dist/harness-runtime/lib/native-children.d.mts +23 -0
- package/dist/harness-runtime/lib/native-children.mjs +219 -0
- package/dist/harness-runtime/lib/native-hook-command.d.mts +7 -0
- package/dist/harness-runtime/lib/native-hook-command.mjs +251 -0
- package/dist/harness-runtime/lib/native-request-proof.d.mts +2 -0
- package/dist/harness-runtime/lib/native-request-proof.mjs +65 -0
- package/dist/harness-runtime/lib/native-streams.mjs +45 -0
- package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
- package/dist/harness-runtime/lib/observation-clock.mjs +95 -0
- package/dist/harness-runtime/lib/opencode-plugin.mjs +85 -0
- package/dist/harness-runtime/lib/operation-context.mjs +5 -0
- package/dist/harness-runtime/lib/operation-errors.d.mts +16 -0
- package/dist/harness-runtime/lib/operation-errors.mjs +127 -0
- package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
- package/dist/harness-runtime/lib/operation-progress.mjs +114 -0
- package/dist/harness-runtime/lib/process-json.d.mts +5 -0
- package/dist/harness-runtime/lib/process-json.mjs +201 -0
- package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
- package/dist/harness-runtime/lib/provider-overload-policy.d.mts +15 -0
- package/dist/harness-runtime/lib/provider-overload-policy.mjs +151 -0
- package/dist/harness-runtime/lib/runner-events.mjs +202 -0
- package/dist/harness-runtime/lib/runner-lock.mjs +42 -0
- package/dist/harness-runtime/lib/session-settlement.mjs +30 -0
- package/dist/harness-runtime/lib/setup-progress.d.mts +9 -0
- package/dist/harness-runtime/lib/setup-progress.mjs +53 -0
- package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
- package/dist/harness-runtime/lib/tool-observations.mjs +228 -0
- package/dist/harness-runtime/lib/zcode-usage.mjs +55 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-1y4a697q.js +81 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-2ny4vxct.js +92 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-6mptkzbc.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-7x67cf1q.js +52 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9rqn6x4v.js +16 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9vdz0zwn.js +1661 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ecs5ftka.js +1466 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-frbwqjmf.js +145 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gne7h7mq.js +50 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gx9wnkzr.js +105 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-m2eywc8w.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-nwcpakzx.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-q4g3afnw.js +623 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-qav6mfdz.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-sxt88q69.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-t1xa31vm.js +39 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ve4aws36.js +103 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vmytr4q8.js +4 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vt9jbch8.js +36 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vyas3vgt.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-wjyeq25y.js +30 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-xgnj2w4v.js +20 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-y2etg5bs.js +9 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ydhz1zrh.js +238 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-z6qdwcsf.js +62 -0
- package/dist/harness-runtime/vendor/opencode-client/contract.d.ts +1 -0
- package/dist/harness-runtime/vendor/opencode-client/contract.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api/api.d.ts +2806 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api/api.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api.d.ts +4 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/client.d.ts +2530 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/client.js +15 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.d.ts +7 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.js +6 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.d.ts +2529 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.js +8 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.d.ts +2 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/index.d.ts +35 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/index.js +75 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/rpc.d.ts +20 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/rpc.js +11 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/service.d.ts +90 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/service.js +187 -0
- package/dist/harness-runtime/vendor/opencode-client/package.json +84 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/api.d.ts +21 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/api.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/client.d.ts +252 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/client.js +14 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.d.ts +8 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.js +6 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.d.ts +259 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.js +7 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.d.ts +3 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.js +79 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.d.ts +8932 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.js +70 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/index.d.ts +6 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/index.js +83 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/rpc.d.ts +32 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/rpc.js +7 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/service.d.ts +24 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/service.js +187 -0
- package/dist/harness-runtime/vendor/opencode-client/pty-handoff.d.ts +12 -0
- package/dist/harness-runtime/vendor/opencode-client/pty-handoff.js +14 -0
- package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.d.ts +20 -0
- package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.js +14 -0
- package/dist/harness-runtime/vendor/opencode-client/service-contender.d.ts +37 -0
- package/dist/harness-runtime/vendor/opencode-client/service-contender.js +10 -0
- package/dist/harness-runtime/vendor/opencode-client/service-probe.d.ts +70 -0
- package/dist/harness-runtime/vendor/opencode-client/service-probe.js +16 -0
- package/dist/harness-runtime/vendor/opencode-client/service-timing.d.ts +12 -0
- package/dist/harness-runtime/vendor/opencode-client/service-timing.js +10 -0
- package/dist/harness-runtime/vendor/opencode-client/service-version.d.ts +2 -0
- package/dist/harness-runtime/vendor/opencode-client/service-version.js +6 -0
- package/dist/harness-runtime/vendor/opencode-client/service.d.ts +52 -0
- package/dist/harness-runtime/vendor/opencode-client/service.js +1 -0
- package/dist/harness-runtime/vendor/opencode-client/shared-events.d.ts +11 -0
- package/dist/harness-runtime/vendor/opencode-client/shared-events.js +8 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/connection.d.ts +37 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/connection.js +10 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/data.d.ts +211 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/data.js +18 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/index.d.ts +3 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/index.js +32 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/pty.d.ts +22 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/pty.js +8 -0
- package/dist/harness-runtime/vendor/opencode-plugin.mjs +3 -0
- package/dist/protocol/local-files.js +18 -9
- package/dist/runtime/context.js +8 -4
- package/dist/schemas/agent-profile.schema.json +1 -1
- package/dist/schemas/code-review-decision.schema.json +9 -0
- package/dist/schemas/code-review-result.schema.json +1 -1
- package/dist/schemas/code-verification.schema.json +7 -5
- package/dist/schemas/code-work-batch.schema.json +2 -2
- package/dist/schemas/diagnostic-stage-result.schema.json +354 -0
- package/dist/schemas/diagnostic-work-result.schema.json +296 -0
- package/dist/schemas/discovery-result.schema.json +184 -0
- package/dist/schemas/execution-bundle.schema.json +211 -0
- package/dist/schemas/execution-settings.schema.json +162 -0
- package/dist/schemas/flow-descriptor.schema.json +54 -0
- package/dist/schemas/flow-run.schema.json +29 -0
- package/dist/schemas/harness-catalog.schema.json +80 -0
- package/dist/schemas/mb-init-compose-result.schema.json +457 -0
- package/dist/schemas/mb-init-discover-result.schema.json +500 -0
- package/dist/schemas/mb-init-finish-result.schema.json +422 -0
- package/dist/schemas/mb-init-preflight-result.schema.json +367 -0
- package/dist/schemas/mb-init-review-result.schema.json +396 -0
- package/dist/schemas/mb-init-verify-result.schema.json +391 -0
- package/dist/schemas/mb-upgrade-stage-result.schema.json +863 -0
- package/dist/schemas/memory-bootstrap-receipt-v2.schema.json +67 -0
- package/dist/schemas/memory-bootstrap-receipt.schema.json +354 -0
- package/dist/schemas/memory-composition-work-result.schema.json +38 -0
- package/dist/schemas/memory-repair-work-result.schema.json +56 -0
- package/dist/schemas/memory-review-correction-plan.schema.json +30 -0
- package/dist/schemas/memory-review-work-result.schema.json +43 -0
- package/dist/schemas/model-catalog.schema.json +153 -0
- package/dist/schemas/plan-review-decision.schema.json +12 -3
- package/dist/schemas/plan-review-result.schema.json +2 -2
- package/dist/schemas/profile-settings.schema.json +122 -0
- package/dist/schemas/project-flow-pack-manifest.schema.json +1 -1
- package/dist/schemas/release-impact.schema.json +3 -3
- package/dist/schemas/release-manifest.schema.json +291 -0
- package/dist/schemas/run-control-receipt.schema.json +118 -0
- package/dist/schemas/run-control-request.schema.json +36 -0
- package/dist/schemas/run-engine-binding.schema.json +1 -1
- package/dist/schemas/stage-start-response.schema.json +4 -0
- package/dist/schemas/vnext-protocol-plan.schema.json +2 -2
- package/dist/services/accepted-intent.js +139 -0
- package/dist/services/branch-context.js +3 -3
- package/dist/services/canon.js +54 -15
- package/dist/services/check-environment.js +21 -0
- package/dist/services/check-runner-evidence.js +562 -0
- package/dist/services/cleanup.js +133 -40
- package/dist/services/cli-operation-classifier.js +26 -63
- package/dist/services/cli-upgrade-allowlist.js +27 -0
- package/dist/services/code-checks.js +1398 -119
- package/dist/services/codex-hook-delivery.js +32 -0
- package/dist/services/command-context.js +80 -0
- package/dist/services/compatibility-preflight.js +16 -3
- package/dist/services/config.js +11 -8
- package/dist/services/continuation-outcome.js +20 -0
- package/dist/services/controller-child-capacity.js +13 -0
- package/dist/services/controller-child-observer.js +115 -0
- package/dist/services/controller-execution.js +94 -0
- package/dist/services/controller-fanout.js +226 -0
- package/dist/services/controller-memory-task.js +45 -0
- package/dist/services/controller-memory-worker.js +49 -0
- package/dist/services/dashboard.js +143 -58
- package/dist/services/descriptor-coordinator-session.js +35 -0
- package/dist/services/descriptor-root-work.js +53 -0
- package/dist/services/descriptor-run-settlement.js +107 -0
- package/dist/services/descriptor-run-start.js +475 -0
- package/dist/services/descriptor-stage-coordinator.js +250 -0
- package/dist/services/descriptor-stage-settlement.js +223 -0
- package/dist/services/descriptor-stage-start.js +175 -0
- package/dist/services/diagnostic-evidence.js +73 -0
- package/dist/services/diagnostic-report-publication.js +72 -0
- package/dist/services/diagnostic-report.js +67 -0
- package/dist/services/diagnostic-run-bundle.js +74 -0
- package/dist/services/diagnostic-snapshot.js +159 -0
- package/dist/services/diagnostic-stage-handlers.js +108 -0
- package/dist/services/diagnostic-stage-results.js +132 -0
- package/dist/services/diagnostic-start.js +84 -0
- package/dist/services/diagnostic-work-batch.js +34 -0
- package/dist/services/diagnostic-work-collection.js +97 -0
- package/dist/services/diagnostic-work-registration.js +101 -0
- package/dist/services/diagnostic-work-results.js +93 -0
- package/dist/services/discovery/agy-discovery.js +2 -0
- package/dist/services/discovery/codex-discovery.js +2 -0
- package/dist/services/discovery/droid-discovery.js +2 -0
- package/dist/services/discovery/grok-discovery.js +2 -0
- package/dist/services/discovery/opencode-discovery.js +2 -0
- package/dist/services/discovery/static.js +31 -0
- package/dist/services/discovery/zcode-discovery.js +2 -0
- package/dist/services/engines.js +354 -163
- package/dist/services/eval-snapshots.js +1316 -150
- package/dist/services/execution-bundles.js +275 -0
- package/dist/services/execution-policy.js +185 -0
- package/dist/services/executor-onboarding.js +56 -0
- package/dist/services/external-work-launch.js +310 -0
- package/dist/services/flow-catalog.js +30 -0
- package/dist/services/flow-descriptors.js +82 -0
- package/dist/services/frozen-engine.js +387 -0
- package/dist/services/generic-execution.js +164 -0
- package/dist/services/harness-adapter.js +355 -36
- package/dist/services/harness-config.js +2 -0
- package/dist/services/harness-discovery.js +29 -0
- package/dist/services/harness-doctor.js +75 -0
- package/dist/services/harness-probe-effects.js +51 -0
- package/dist/services/harness-version-probe.js +100 -0
- package/dist/services/hook-memory-routing.js +188 -0
- package/dist/services/hook-recovery-guard.js +14 -0
- package/dist/services/hook-session-observation.js +24 -0
- package/dist/services/hooks.js +791 -326
- package/dist/services/hybrid-contracts.js +474 -0
- package/dist/services/hybrid-digest.js +14 -0
- package/dist/services/ids.js +29 -1
- package/dist/services/installation-lock.js +95 -0
- package/dist/services/installed-flow-source.js +226 -0
- package/dist/services/lanes.js +78 -65
- package/dist/services/lifecycle-command.js +1 -288
- package/dist/services/lifecycle-contract.js +1 -0
- package/dist/services/lifecycle-invocations.js +2148 -0
- package/dist/services/managed-daemon-binding.js +38 -0
- package/dist/services/managed-lease-monitor.js +133 -0
- package/dist/services/managed-processes.js +449 -69
- package/dist/services/memory-accepted-composition.js +78 -0
- package/dist/services/memory-baseline-preservation.js +65 -0
- package/dist/services/memory-completed-correction-wave.js +328 -0
- package/dist/services/memory-compose-handler.js +400 -0
- package/dist/services/memory-composition-acceptance.js +375 -0
- package/dist/services/memory-composition-graph.js +165 -0
- package/dist/services/memory-composition-registration.js +161 -0
- package/dist/services/memory-composition-work-custody.js +156 -0
- package/dist/services/memory-composition-work-results.js +108 -0
- package/dist/services/memory-corrected-review-acceptance.js +129 -0
- package/dist/services/memory-corrected-review-batch.js +37 -0
- package/dist/services/memory-corrected-review-findings.js +108 -0
- package/dist/services/memory-corrected-review-inputs.js +215 -0
- package/dist/services/memory-corrected-review-projection.js +78 -0
- package/dist/services/memory-corrected-review-receipt.js +178 -0
- package/dist/services/memory-corrected-review-registration.js +192 -0
- package/dist/services/memory-correction-check-receipt.js +235 -0
- package/dist/services/memory-correction-input-owner.js +6 -0
- package/dist/services/memory-custody-snapshot.js +36 -0
- package/dist/services/memory-discover-handler.js +104 -0
- package/dist/services/memory-finish-evidence.js +457 -0
- package/dist/services/memory-finish-handler.js +229 -0
- package/dist/services/memory-finish-integration.js +450 -0
- package/dist/services/memory-finish-readiness.js +169 -0
- package/dist/services/memory-git-integration.js +220 -0
- package/dist/services/memory-historical-corrected-review.js +212 -0
- package/dist/services/memory-historical-original-review.js +143 -0
- package/dist/services/memory-historical-repair-registration.js +105 -0
- package/dist/services/memory-historical-second-review.js +147 -0
- package/dist/services/memory-init-bootstrap-readiness.js +210 -0
- package/dist/services/memory-init-contexts.js +131 -0
- package/dist/services/memory-init-controller-start.js +103 -0
- package/dist/services/memory-init-engine-release.js +223 -0
- package/dist/services/memory-init-git-policy.js +165 -0
- package/dist/services/memory-init-lint-capability.js +203 -0
- package/dist/services/memory-init-native-capacity.js +309 -0
- package/dist/services/memory-init-preflight.js +334 -0
- package/dist/services/memory-init-project-bootstrap.js +599 -0
- package/dist/services/memory-init-request-candidate.js +213 -0
- package/dist/services/memory-init-request-input.js +82 -0
- package/dist/services/memory-init-resource-storage.js +125 -0
- package/dist/services/memory-init-run-allocation.js +81 -0
- package/dist/services/memory-init-run-bundle.js +135 -0
- package/dist/services/memory-init-start.js +181 -0
- package/dist/services/memory-init-startup-custody.js +80 -0
- package/dist/services/memory-init-startup-input.js +240 -0
- package/dist/services/memory-init-storage.js +91 -0
- package/dist/services/memory-init-stores.js +359 -0
- package/dist/services/memory-init-worktrunk-capability.js +174 -0
- package/dist/services/memory-layer-publication.js +611 -0
- package/dist/services/memory-layer.js +221 -0
- package/dist/services/memory-lint-config.js +194 -0
- package/dist/services/memory-native-review-copy.js +103 -0
- package/dist/services/memory-normal-flow-entry.js +87 -0
- package/dist/services/memory-ordinary-defaults.js +129 -0
- package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
- package/dist/services/memory-preflight-handler.js +274 -0
- package/dist/services/memory-repair-current-view.js +299 -0
- package/dist/services/memory-repair-document-delta.js +488 -0
- package/dist/services/memory-repair-history.js +496 -0
- package/dist/services/memory-repair-physical-binding.js +194 -0
- package/dist/services/memory-repair-publication-files.js +152 -0
- package/dist/services/memory-repair-publication-intent.js +27 -0
- package/dist/services/memory-repair-publication-plan.js +162 -0
- package/dist/services/memory-repair-publication-source.js +225 -0
- package/dist/services/memory-repair-publication.js +795 -0
- package/dist/services/memory-repair-registration.js +240 -0
- package/dist/services/memory-repair-work-baseline.js +415 -0
- package/dist/services/memory-repair-work-completion.js +117 -0
- package/dist/services/memory-repair-work-custody.js +73 -0
- package/dist/services/memory-repair-work-results.js +108 -0
- package/dist/services/memory-repair-workspace.js +261 -0
- package/dist/services/memory-repair-writer-copy.js +736 -0
- package/dist/services/memory-result-binding.js +239 -0
- package/dist/services/memory-retained-review-authority.js +138 -0
- package/dist/services/memory-retained-review-results.js +70 -0
- package/dist/services/memory-retained-second-baseline.js +102 -0
- package/dist/services/memory-retained-second-repairs.js +162 -0
- package/dist/services/memory-review-acceptance.js +214 -0
- package/dist/services/memory-review-correction-plan.js +206 -0
- package/dist/services/memory-review-handler.js +585 -0
- package/dist/services/memory-review-inputs.js +246 -0
- package/dist/services/memory-review-limits.js +10 -0
- package/dist/services/memory-review-receipt.js +180 -0
- package/dist/services/memory-review-registration.js +117 -0
- package/dist/services/memory-review-work-custody.js +126 -0
- package/dist/services/memory-review-work-input.js +91 -0
- package/dist/services/memory-review-work-results.js +95 -0
- package/dist/services/memory-second-corrected-review-inputs.js +167 -0
- package/dist/services/memory-second-correction-plan.js +77 -0
- package/dist/services/memory-second-repair-baseline.js +91 -0
- package/dist/services/memory-second-repair-launch.js +614 -0
- package/dist/services/memory-second-repair-registration.js +88 -0
- package/dist/services/memory-second-repair-source.js +187 -0
- package/dist/services/memory-second-review-acceptance.js +115 -0
- package/dist/services/memory-source-observations.js +117 -0
- package/dist/services/memory-stage-dispatch.js +65 -0
- package/dist/services/memory-stage-results.js +290 -0
- package/dist/services/memory-tool-probe.js +25 -0
- package/dist/services/memory-upgrade-analysis-handler.js +243 -0
- package/dist/services/memory-upgrade-bootstrap-readiness.js +251 -0
- package/dist/services/memory-upgrade-evidence.js +100 -0
- package/dist/services/memory-upgrade-inventory.js +442 -0
- package/dist/services/memory-upgrade-publication-custody.js +73 -0
- package/dist/services/memory-upgrade-publication.js +413 -0
- package/dist/services/memory-upgrade-selection.js +430 -0
- package/dist/services/memory-upgrade-start.js +60 -0
- package/dist/services/memory-upgrade-storage-readiness.js +340 -0
- package/dist/services/memory-verification-acceptance.js +156 -0
- package/dist/services/memory-verification-checks.js +317 -0
- package/dist/services/memory-verification-receipt.js +160 -0
- package/dist/services/memory-verify-handler.js +137 -0
- package/dist/services/memory-work-result-json.js +12 -0
- package/dist/services/memory-work-result-preparation.js +64 -0
- package/dist/services/merge-queue.js +228 -149
- package/dist/services/merge-server.js +163 -35
- package/dist/services/migrations.js +164 -114
- package/dist/services/model-catalog.js +109 -0
- package/dist/services/model-discovery.js +46 -0
- package/dist/services/native-daemon-history.js +50 -0
- package/dist/services/native-session-control.js +39 -0
- package/dist/services/operator-profiles.js +236 -0
- package/dist/services/physical-startup.js +45 -0
- package/dist/services/plan-runtime.js +26 -11
- package/dist/services/plans.js +28 -25
- package/dist/services/project-registry.js +97 -0
- package/dist/services/project-summary.js +1 -1
- package/dist/services/projects.js +17 -87
- package/dist/services/prompt-delivery.js +71 -0
- package/dist/services/prompts.js +28 -17
- package/dist/services/protocols.js +163 -87
- package/dist/services/provider-capacity.js +455 -0
- package/dist/services/recovery-observation-budget.js +121 -0
- package/dist/services/recovery-snapshot-database.js +588 -0
- package/dist/services/release-archive-producer.js +52 -0
- package/dist/services/release-archive.js +143 -0
- package/dist/services/release-cache.js +150 -0
- package/dist/services/release-compatibility.js +18 -0
- package/dist/services/release-download.js +67 -0
- package/dist/services/release-envelope.js +104 -0
- package/dist/services/release-manifest.js +45 -0
- package/dist/services/release-payload.js +114 -0
- package/dist/services/release-producer.js +63 -0
- package/dist/services/release-provenance.js +160 -0
- package/dist/services/release-registry.js +66 -0
- package/dist/services/release-source.js +194 -0
- package/dist/services/repair-intents.js +31 -0
- package/dist/services/repair-receipt.js +13 -0
- package/dist/services/review-copy.js +165 -0
- package/dist/services/review-deferral.js +23 -0
- package/dist/services/run-control-receipt.js +56 -0
- package/dist/services/run-control-worker.js +428 -0
- package/dist/services/run-control.js +1092 -0
- package/dist/services/run-controller-adapter.js +400 -0
- package/dist/services/run-controller-capture.js +186 -0
- package/dist/services/run-controller-process.js +205 -0
- package/dist/services/run-controller-recovery.js +295 -0
- package/dist/services/run-controller-state.js +97 -0
- package/dist/services/run-controller.js +1326 -0
- package/dist/services/run-engine-bindings.js +1 -1
- package/dist/services/run-fork.js +147 -0
- package/dist/services/run-health.js +149 -0
- package/dist/services/run-observations.js +152 -0
- package/dist/services/run-projection.js +22 -64
- package/dist/services/run-recovery-guard.js +107 -0
- package/dist/services/run-recovery-runtime.js +112 -0
- package/dist/services/run-recovery.js +456 -0
- package/dist/services/run-start-custody.js +189 -0
- package/dist/services/runs.js +1023 -246
- package/dist/services/runtime-budget.js +446 -0
- package/dist/services/runtime-command.js +43 -0
- package/dist/services/runtime-scope-capture.js +52 -0
- package/dist/services/runtime-scope-control.js +468 -0
- package/dist/services/runtime-scope-resume.js +605 -0
- package/dist/services/runtime-scope-stop.js +211 -0
- package/dist/services/runtime-scope-worker.js +314 -0
- package/dist/services/runtime-service.js +19 -14
- package/dist/services/schema-validation.js +10 -8
- package/dist/services/scope-writer-cleanup.js +27 -0
- package/dist/services/sessions.js +36 -91
- package/dist/services/setup.js +427 -0
- package/dist/services/stage-blocker.js +17 -7
- package/dist/services/stage-context.js +193 -19
- package/dist/services/stage-handlers.js +89 -0
- package/dist/services/stage-lifecycle.js +152 -116
- package/dist/services/stage-pause.js +202 -91
- package/dist/services/stage-report-renderer.js +234 -6
- package/dist/services/stage-work-graph.js +52 -0
- package/dist/services/tooling.js +41 -30
- package/dist/services/usage.js +49 -101
- package/dist/services/verification-matrix.js +393 -0
- package/dist/services/version-status.js +1 -1
- package/dist/services/vnext-code-review.js +235 -88
- package/dist/services/vnext-code.js +327 -226
- package/dist/services/vnext-contracts.js +10 -1
- package/dist/services/vnext-execution-profile.js +80 -5
- package/dist/services/vnext-fanout.js +355 -21
- package/dist/services/vnext-merge.js +332 -111
- package/dist/services/vnext-plan-review.js +287 -132
- package/dist/services/vnext-plan.js +228 -104
- package/dist/services/vnext-protocolize.js +533 -95
- package/dist/services/vnext-specify.js +123 -81
- package/dist/services/vnext-workspace-policy.js +7 -2
- package/dist/services/work-registry.js +1706 -200
- package/dist/services/workspace-bootstrap.js +53 -15
- package/dist/services/workspace-files.js +85 -0
- package/dist/services/worktrees.js +105 -48
- package/dist/shared/entity-references.js +1 -0
- package/dist/shared/errors.js +27 -0
- package/dist/storage/agent-output.js +26 -0
- package/dist/storage/data-preservation.js +65 -0
- package/dist/storage/database.js +930 -40
- package/dist/storage/foreign-key-transaction.js +39 -0
- package/dist/storage/immutable-input.js +45 -0
- package/dist/storage/import-guard.js +159 -0
- package/dist/storage/memory-upgrade-schema-bootstrap.js +38 -0
- package/dist/storage/native-cleanup.js +52 -0
- package/dist/storage/paired-writer-migration.js +424 -0
- package/dist/storage/paths.js +17 -4
- package/dist/storage/projection-lock.js +73 -0
- package/dist/storage/work-references.js +23 -0
- package/dist/storage/writer-contract.js +96 -0
- package/dist/storage/writer-migration.js +346 -0
- package/dist/storage/writer-restore.js +217 -0
- package/package.json +50 -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
|
@@ -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) {
|