@deksden-com/dd-flow-cli 0.9.0-beta.16 → 0.9.0-beta.160
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +959 -0
- package/README.md +139 -10
- package/dist/build-info.json +8 -8
- package/dist/cli/argument-values.js +38 -0
- package/dist/cli/command-inputs.js +417 -0
- package/dist/cli/command-metadata.js +303 -0
- package/dist/cli/command-option-descriptions.js +192 -0
- package/dist/cli/completion-cli.js +70 -0
- package/dist/cli/completion.js +57 -0
- package/dist/cli/delivery.js +108 -0
- package/dist/cli/diagnostic-invocation.js +62 -0
- package/dist/cli/diagnostic.js +131 -0
- package/dist/cli/error-output.js +62 -0
- package/dist/cli/executor-onboarding.js +76 -0
- package/dist/cli/flows.js +29 -0
- package/dist/cli/harnesses.js +84 -0
- package/dist/cli/help.js +521 -19
- package/dist/cli/hook-ingress.js +89 -0
- package/dist/cli/input-preparation.js +193 -0
- package/dist/cli/interactive-invocation.js +33 -0
- package/dist/cli/interactive.js +114 -0
- package/dist/cli/memory-fix-invocation.js +52 -0
- package/dist/cli/memory-fix.js +100 -0
- package/dist/cli/memory-flow-admission.js +54 -0
- package/dist/cli/memory-init-invocation.js +85 -0
- package/dist/cli/memory-init.js +250 -0
- package/dist/cli/memory-storage-admission.js +54 -0
- package/dist/cli/memory-storage-qualification.js +105 -0
- package/dist/cli/memory-storage-transition.js +123 -0
- package/dist/cli/memory-upgrade.js +189 -0
- package/dist/cli/models.js +39 -0
- package/dist/cli/native-hook-ingress.js +94 -0
- package/dist/cli/native-hook-preparation.js +82 -0
- package/dist/cli/operator-profiles.js +61 -0
- package/dist/cli/output-options.js +35 -0
- package/dist/cli/response-file.js +72 -0
- package/dist/cli/run-cli.js +2020 -555
- package/dist/cli/runtime-maintenance-diagnostics.js +46 -0
- package/dist/cli/runtime-maintenance-ingress.js +52 -0
- package/dist/cli/runtime-process.js +153 -0
- package/dist/cli/setup.js +150 -0
- package/dist/cli.js +103 -2
- package/dist/domain/delivery-flows.js +8 -0
- package/dist/domain/diagnostic-aspects.js +103 -0
- package/dist/domain/diagnostic-flows.js +8 -0
- package/dist/domain/distill-flow.js +20 -0
- package/dist/domain/interactive-flow.js +1 -0
- package/dist/domain/memory-fix-flow.js +2 -0
- package/dist/domain/review-fix-flow.js +2 -0
- package/dist/domain/source-snapshot-flows.js +4 -0
- package/dist/domain/stage-catalog.js +1 -1
- package/dist/domain/stage-handler-identities.js +28 -0
- package/dist/harness-runtime/DD-ZCODE.md +112 -0
- package/dist/harness-runtime/OPENCODE-LICENSE.txt +24 -0
- package/dist/harness-runtime/bin/dd-agy.mjs +71 -0
- package/dist/harness-runtime/bin/dd-codex.mjs +27 -0
- package/dist/harness-runtime/bin/dd-droid.mjs +34 -0
- package/dist/harness-runtime/bin/dd-grok.mjs +50 -0
- package/dist/harness-runtime/bin/dd-opencode.mjs +22 -0
- package/dist/harness-runtime/bin/dd-zcode.mjs +95 -0
- package/dist/harness-runtime/lib/adapter-timeouts.d.mts +5 -0
- package/dist/harness-runtime/lib/adapter-timeouts.mjs +34 -0
- package/dist/harness-runtime/lib/agy-error-boundary.mjs +87 -0
- package/dist/harness-runtime/lib/agy-hooks.d.mts +1 -0
- package/dist/harness-runtime/lib/agy-hooks.mjs +9 -0
- package/dist/harness-runtime/lib/agy-native-inspection.mjs +225 -0
- package/dist/harness-runtime/lib/agy-native-inventory.mjs +19 -0
- package/dist/harness-runtime/lib/agy-native_pb.js +117 -0
- package/dist/harness-runtime/lib/agy-terminal-envelope.mjs +74 -0
- package/dist/harness-runtime/lib/agy-transcript-stream.mjs +54 -0
- package/dist/harness-runtime/lib/daemon-observation.d.mts +3 -0
- package/dist/harness-runtime/lib/daemon-observation.mjs +171 -0
- package/dist/harness-runtime/lib/daemon-operations.d.mts +2 -0
- package/dist/harness-runtime/lib/daemon-operations.mjs +512 -0
- package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +7 -0
- package/dist/harness-runtime/lib/dd-agy-daemon.mjs +1362 -0
- package/dist/harness-runtime/lib/dd-agy.mjs +105 -0
- package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-codex-daemon.mjs +271 -0
- package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-codex.mjs +986 -0
- package/dist/harness-runtime/lib/dd-droid-daemon.mjs +155 -0
- package/dist/harness-runtime/lib/dd-droid.mjs +739 -0
- package/dist/harness-runtime/lib/dd-grok-daemon.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-grok-daemon.mjs +667 -0
- package/dist/harness-runtime/lib/dd-grok.mjs +182 -0
- package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +772 -0
- package/dist/harness-runtime/lib/dd-opencode.mjs +411 -0
- package/dist/harness-runtime/lib/dd-zcode-daemon.d.mts +1 -0
- package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +845 -0
- package/dist/harness-runtime/lib/dd-zcode.mjs +1239 -0
- package/dist/harness-runtime/lib/delegation-instructions.d.mts +16 -0
- package/dist/harness-runtime/lib/delegation-instructions.mjs +179 -0
- package/dist/harness-runtime/lib/delivery-command.mjs +84 -0
- package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
- package/dist/harness-runtime/lib/driver-recovery.mjs +121 -0
- package/dist/harness-runtime/lib/droid-observation.mjs +70 -0
- package/dist/harness-runtime/lib/entity-references.d.mts +2 -0
- package/dist/harness-runtime/lib/entity-references.mjs +9 -0
- package/dist/harness-runtime/lib/lease-renewal.d.mts +8 -0
- package/dist/harness-runtime/lib/lease-renewal.mjs +37 -0
- package/dist/harness-runtime/lib/lifecycle-command.d.mts +20 -0
- package/dist/harness-runtime/lib/lifecycle-command.mjs +273 -0
- package/dist/harness-runtime/lib/lifecycle-contract.d.mts +11 -0
- package/dist/harness-runtime/lib/lifecycle-contract.mjs +20 -0
- package/dist/harness-runtime/lib/managed-daemon.d.mts +16 -0
- package/dist/harness-runtime/lib/managed-daemon.mjs +698 -0
- package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
- package/dist/harness-runtime/lib/model-observations.mjs +113 -0
- package/dist/harness-runtime/lib/native-children.d.mts +34 -0
- package/dist/harness-runtime/lib/native-children.mjs +265 -0
- package/dist/harness-runtime/lib/native-hook-command.d.mts +8 -0
- package/dist/harness-runtime/lib/native-hook-command.mjs +306 -0
- package/dist/harness-runtime/lib/native-request-proof.d.mts +2 -0
- package/dist/harness-runtime/lib/native-request-proof.mjs +65 -0
- package/dist/harness-runtime/lib/native-streams.mjs +38 -0
- package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
- package/dist/harness-runtime/lib/observation-clock.mjs +95 -0
- package/dist/harness-runtime/lib/opencode-plugin.mjs +112 -0
- package/dist/harness-runtime/lib/operation-context.mjs +5 -0
- package/dist/harness-runtime/lib/operation-errors.d.mts +16 -0
- package/dist/harness-runtime/lib/operation-errors.mjs +140 -0
- package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
- package/dist/harness-runtime/lib/operation-progress.mjs +118 -0
- package/dist/harness-runtime/lib/process-json.d.mts +5 -0
- package/dist/harness-runtime/lib/process-json.mjs +200 -0
- package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
- package/dist/harness-runtime/lib/provider-overload-policy.d.mts +23 -0
- package/dist/harness-runtime/lib/provider-overload-policy.mjs +242 -0
- package/dist/harness-runtime/lib/runner-events.mjs +202 -0
- package/dist/harness-runtime/lib/runner-lock.mjs +42 -0
- package/dist/harness-runtime/lib/session-settlement.mjs +30 -0
- package/dist/harness-runtime/lib/setup-progress.d.mts +9 -0
- package/dist/harness-runtime/lib/setup-progress.mjs +53 -0
- package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
- package/dist/harness-runtime/lib/tool-observations.mjs +238 -0
- package/dist/harness-runtime/lib/zcode-native-hook-ownership.mjs +109 -0
- package/dist/harness-runtime/lib/zcode-usage.mjs +55 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-1y4a697q.js +81 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-2ny4vxct.js +92 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-6mptkzbc.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-7x67cf1q.js +52 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9rqn6x4v.js +16 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9vdz0zwn.js +1661 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ecs5ftka.js +1466 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-frbwqjmf.js +145 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gne7h7mq.js +50 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gx9wnkzr.js +105 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-m2eywc8w.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-nwcpakzx.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-q4g3afnw.js +623 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-qav6mfdz.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-sxt88q69.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-t1xa31vm.js +39 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ve4aws36.js +103 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vmytr4q8.js +4 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vt9jbch8.js +36 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vyas3vgt.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-wjyeq25y.js +30 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-xgnj2w4v.js +20 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-y2etg5bs.js +9 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ydhz1zrh.js +238 -0
- package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-z6qdwcsf.js +62 -0
- package/dist/harness-runtime/vendor/opencode-client/contract.d.ts +1 -0
- package/dist/harness-runtime/vendor/opencode-client/contract.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api/api.d.ts +2806 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api/api.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api.d.ts +4 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/api.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/client.d.ts +2530 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/client.js +15 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.d.ts +7 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.js +6 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.d.ts +2529 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.js +8 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.d.ts +2 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.js +12 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/index.d.ts +35 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/index.js +75 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/rpc.d.ts +20 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/rpc.js +11 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/service.d.ts +90 -0
- package/dist/harness-runtime/vendor/opencode-client/effect/service.js +187 -0
- package/dist/harness-runtime/vendor/opencode-client/package.json +84 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/api.d.ts +21 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/api.js +0 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/client.d.ts +252 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/client.js +14 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.d.ts +8 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.js +6 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.d.ts +259 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.js +7 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.d.ts +3 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.js +79 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.d.ts +8932 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.js +70 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/index.d.ts +6 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/index.js +83 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/rpc.d.ts +32 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/rpc.js +7 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/service.d.ts +24 -0
- package/dist/harness-runtime/vendor/opencode-client/promise/service.js +187 -0
- package/dist/harness-runtime/vendor/opencode-client/pty-handoff.d.ts +12 -0
- package/dist/harness-runtime/vendor/opencode-client/pty-handoff.js +14 -0
- package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.d.ts +20 -0
- package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.js +14 -0
- package/dist/harness-runtime/vendor/opencode-client/service-contender.d.ts +37 -0
- package/dist/harness-runtime/vendor/opencode-client/service-contender.js +10 -0
- package/dist/harness-runtime/vendor/opencode-client/service-probe.d.ts +70 -0
- package/dist/harness-runtime/vendor/opencode-client/service-probe.js +16 -0
- package/dist/harness-runtime/vendor/opencode-client/service-timing.d.ts +12 -0
- package/dist/harness-runtime/vendor/opencode-client/service-timing.js +10 -0
- package/dist/harness-runtime/vendor/opencode-client/service-version.d.ts +2 -0
- package/dist/harness-runtime/vendor/opencode-client/service-version.js +6 -0
- package/dist/harness-runtime/vendor/opencode-client/service.d.ts +52 -0
- package/dist/harness-runtime/vendor/opencode-client/service.js +1 -0
- package/dist/harness-runtime/vendor/opencode-client/shared-events.d.ts +11 -0
- package/dist/harness-runtime/vendor/opencode-client/shared-events.js +8 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/connection.d.ts +37 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/connection.js +10 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/data.d.ts +211 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/data.js +18 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/index.d.ts +3 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/index.js +32 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/pty.d.ts +22 -0
- package/dist/harness-runtime/vendor/opencode-client/solid/pty.js +8 -0
- package/dist/harness-runtime/vendor/opencode-plugin.mjs +3 -0
- package/dist/protocol/local-files.js +18 -9
- package/dist/runtime/context.js +8 -4
- package/dist/schemas/agent-profile.schema.json +1 -1
- package/dist/schemas/code-review-decision.schema.json +9 -0
- package/dist/schemas/code-review-result.schema.json +1 -1
- package/dist/schemas/code-verification.schema.json +7 -5
- package/dist/schemas/code-work-batch.schema.json +2 -2
- package/dist/schemas/code-work-result.schema.json +2 -1
- package/dist/schemas/delivery-stage-result.schema.json +286 -0
- package/dist/schemas/diagnostic-stage-result.schema.json +354 -0
- package/dist/schemas/diagnostic-work-result.schema.json +296 -0
- package/dist/schemas/discovery-result.schema.json +184 -0
- package/dist/schemas/distill-stage-result.schema.json +667 -0
- package/dist/schemas/distill-work-result.schema.json +428 -0
- package/dist/schemas/execution-bundle.schema.json +215 -0
- package/dist/schemas/execution-settings.schema.json +162 -0
- package/dist/schemas/flow-descriptor.schema.json +54 -0
- package/dist/schemas/flow-run.schema.json +29 -0
- package/dist/schemas/harness-catalog.schema.json +80 -0
- package/dist/schemas/interactive-stage-result.schema.json +47 -0
- package/dist/schemas/interactive-work-result.schema.json +63 -0
- package/dist/schemas/mb-fix-stage-result.schema.json +93 -0
- package/dist/schemas/mb-init-compose-result.schema.json +457 -0
- package/dist/schemas/mb-init-discover-result.schema.json +500 -0
- package/dist/schemas/mb-init-finish-result.schema.json +422 -0
- package/dist/schemas/mb-init-preflight-result.schema.json +367 -0
- package/dist/schemas/mb-init-review-result.schema.json +396 -0
- package/dist/schemas/mb-init-verify-result.schema.json +391 -0
- package/dist/schemas/mb-upgrade-stage-result.schema.json +863 -0
- package/dist/schemas/memory-bootstrap-receipt-v2.schema.json +67 -0
- package/dist/schemas/memory-bootstrap-receipt.schema.json +354 -0
- package/dist/schemas/memory-composition-work-result.schema.json +38 -0
- package/dist/schemas/memory-repair-work-result.schema.json +56 -0
- package/dist/schemas/memory-review-correction-plan.schema.json +30 -0
- package/dist/schemas/memory-review-work-result.schema.json +43 -0
- package/dist/schemas/model-catalog.schema.json +153 -0
- package/dist/schemas/plan-review-decision.schema.json +12 -3
- package/dist/schemas/plan-review-result.schema.json +2 -2
- package/dist/schemas/profile-settings.schema.json +122 -0
- package/dist/schemas/project-flow-pack-manifest.schema.json +2 -2
- package/dist/schemas/release-impact.schema.json +3 -3
- package/dist/schemas/release-manifest.schema.json +291 -0
- package/dist/schemas/review-fix-stage-result.schema.json +210 -0
- package/dist/schemas/run-control-receipt.schema.json +119 -0
- package/dist/schemas/run-control-request.schema.json +36 -0
- package/dist/schemas/run-engine-binding.schema.json +1 -1
- package/dist/schemas/stage-start-response.schema.json +4 -0
- package/dist/schemas/vnext-protocol-plan.schema.json +3 -3
- package/dist/services/accepted-intent.js +139 -0
- package/dist/services/assigned-lifecycle.js +382 -0
- package/dist/services/branch-context.js +3 -3
- package/dist/services/canon.js +54 -15
- package/dist/services/check-environment.js +21 -0
- package/dist/services/check-runner-evidence.js +344 -0
- package/dist/services/check-runner-proof.js +373 -0
- package/dist/services/cleanup.js +133 -40
- package/dist/services/cli-operation-classifier.js +32 -64
- package/dist/services/cli-upgrade-allowlist.js +27 -0
- package/dist/services/code-checks.js +1426 -121
- package/dist/services/codex-capacity.js +367 -0
- package/dist/services/codex-hook-delivery.js +41 -0
- package/dist/services/command-context.js +80 -0
- package/dist/services/compatibility-preflight.js +16 -3
- package/dist/services/config.js +11 -8
- package/dist/services/continuation-outcome.js +25 -0
- package/dist/services/controller-child-capacity.js +71 -0
- package/dist/services/controller-child-observer.js +121 -0
- package/dist/services/controller-child-repair.js +117 -0
- package/dist/services/controller-execution.js +97 -0
- package/dist/services/controller-fanout.js +277 -0
- package/dist/services/controller-memory-task.js +45 -0
- package/dist/services/controller-memory-worker.js +51 -0
- package/dist/services/controller-result-authority.js +127 -0
- package/dist/services/controller-work-failure.js +198 -0
- package/dist/services/dashboard.js +145 -58
- package/dist/services/delivery-access.js +123 -0
- package/dist/services/delivery-approval.js +68 -0
- package/dist/services/delivery-artifact.js +86 -0
- package/dist/services/delivery-checks.js +178 -0
- package/dist/services/delivery-execution.js +181 -0
- package/dist/services/delivery-intents.js +212 -0
- package/dist/services/delivery-operation.js +81 -0
- package/dist/services/delivery-policy.js +91 -0
- package/dist/services/delivery-procedures.js +43 -0
- package/dist/services/delivery-request.js +99 -0
- package/dist/services/delivery-result.js +144 -0
- package/dist/services/delivery-stage-commands.js +26 -0
- package/dist/services/delivery-stage-entry.js +56 -0
- package/dist/services/delivery-stage-handlers.js +135 -0
- package/dist/services/delivery-stage-results.js +94 -0
- package/dist/services/descriptor-coordinator-session.js +37 -0
- package/dist/services/descriptor-root-work.js +53 -0
- package/dist/services/descriptor-run-settlement.js +107 -0
- package/dist/services/descriptor-run-start.js +495 -0
- package/dist/services/descriptor-stage-coordinator.js +318 -0
- package/dist/services/descriptor-stage-settlement.js +268 -0
- package/dist/services/descriptor-stage-start.js +175 -0
- package/dist/services/diagnostic-evidence.js +73 -0
- package/dist/services/diagnostic-repair-intake.js +123 -0
- package/dist/services/diagnostic-repair-source-intake.js +102 -0
- package/dist/services/diagnostic-report-publication.js +72 -0
- package/dist/services/diagnostic-report.js +97 -0
- package/dist/services/diagnostic-run-bundle.js +113 -0
- package/dist/services/diagnostic-snapshot.js +159 -0
- package/dist/services/diagnostic-stage-handlers.js +109 -0
- package/dist/services/diagnostic-stage-results.js +158 -0
- package/dist/services/diagnostic-start.js +134 -0
- package/dist/services/diagnostic-work-batch.js +34 -0
- package/dist/services/diagnostic-work-collection.js +97 -0
- package/dist/services/diagnostic-work-registration.js +101 -0
- package/dist/services/diagnostic-work-results.js +93 -0
- package/dist/services/discovery/agy-discovery.js +2 -0
- package/dist/services/discovery/codex-discovery.js +2 -0
- package/dist/services/discovery/droid-discovery.js +2 -0
- package/dist/services/discovery/grok-discovery.js +2 -0
- package/dist/services/discovery/opencode-discovery.js +2 -0
- package/dist/services/discovery/static.js +31 -0
- package/dist/services/discovery/zcode-discovery.js +2 -0
- package/dist/services/distill-document-publication.js +280 -0
- package/dist/services/distill-promotion.js +197 -0
- package/dist/services/distill-publication-custody.js +162 -0
- package/dist/services/distill-stage-handlers.js +249 -0
- package/dist/services/distill-stage-results.js +105 -0
- package/dist/services/distill-user-inputs.js +4 -0
- package/dist/services/distill-work-batch.js +42 -0
- package/dist/services/distill-work-collection.js +74 -0
- package/dist/services/distill-work-registration.js +93 -0
- package/dist/services/distill-work-results.js +98 -0
- package/dist/services/engines.js +354 -163
- package/dist/services/eval-snapshots.js +1326 -150
- package/dist/services/execution-bundles.js +275 -0
- package/dist/services/execution-policy.js +185 -0
- package/dist/services/executor-onboarding.js +56 -0
- package/dist/services/external-work-launch.js +316 -0
- package/dist/services/flow-catalog.js +54 -0
- package/dist/services/flow-descriptors.js +82 -0
- package/dist/services/frozen-engine.js +404 -0
- package/dist/services/generic-execution.js +165 -0
- package/dist/services/harness-adapter.js +342 -35
- package/dist/services/harness-config.js +2 -0
- package/dist/services/harness-discovery.js +29 -0
- package/dist/services/harness-doctor.js +75 -0
- package/dist/services/harness-probe-effects.js +51 -0
- package/dist/services/harness-version-probe.js +100 -0
- package/dist/services/hook-memory-routing.js +188 -0
- package/dist/services/hook-recovery-guard.js +14 -0
- package/dist/services/hook-session-observation.js +24 -0
- package/dist/services/hooks.js +813 -327
- package/dist/services/hybrid-contracts.js +479 -0
- package/dist/services/hybrid-digest.js +14 -0
- package/dist/services/ids.js +29 -1
- package/dist/services/installation-lock.js +95 -0
- package/dist/services/installed-flow-source.js +261 -0
- package/dist/services/interactive-attached-session.js +215 -0
- package/dist/services/interactive-baseline-custody.js +54 -0
- package/dist/services/interactive-before-versions.js +148 -0
- package/dist/services/interactive-bundle-data.js +85 -0
- package/dist/services/interactive-checks.js +179 -0
- package/dist/services/interactive-execution.js +33 -0
- package/dist/services/interactive-finish-integration.js +236 -0
- package/dist/services/interactive-git-baseline.js +230 -0
- package/dist/services/interactive-git-dispatch.js +278 -0
- package/dist/services/interactive-input-delivery.js +82 -0
- package/dist/services/interactive-mutation-scope.js +231 -0
- package/dist/services/interactive-request.js +287 -0
- package/dist/services/interactive-run-bundle.js +109 -0
- package/dist/services/interactive-stage-entry.js +41 -0
- package/dist/services/interactive-stage-handlers.js +289 -0
- package/dist/services/interactive-stage-observation.js +136 -0
- package/dist/services/interactive-stage-results.js +111 -0
- package/dist/services/interactive-user-inputs.js +142 -0
- package/dist/services/interactive-work-batch.js +43 -0
- package/dist/services/interactive-work-collection.js +119 -0
- package/dist/services/interactive-work-completion.js +180 -0
- package/dist/services/interactive-work-context.js +249 -0
- package/dist/services/interactive-work-history.js +112 -0
- package/dist/services/interactive-work-registration.js +124 -0
- package/dist/services/interactive-work-results.js +115 -0
- package/dist/services/interactive-work-start.js +155 -0
- package/dist/services/lanes.js +78 -65
- package/dist/services/lifecycle-command.js +1 -288
- package/dist/services/lifecycle-contract.js +1 -0
- package/dist/services/lifecycle-invocations.js +2549 -0
- package/dist/services/managed-daemon-binding.js +129 -0
- package/dist/services/managed-lease-monitor.js +133 -0
- package/dist/services/managed-processes.js +449 -69
- package/dist/services/memory-accepted-composition.js +78 -0
- package/dist/services/memory-baseline-preservation.js +65 -0
- package/dist/services/memory-completed-correction-wave.js +328 -0
- package/dist/services/memory-compose-handler.js +380 -0
- package/dist/services/memory-composition-acceptance.js +375 -0
- package/dist/services/memory-composition-graph.js +165 -0
- package/dist/services/memory-composition-registration.js +161 -0
- package/dist/services/memory-composition-work-custody.js +156 -0
- package/dist/services/memory-composition-work-results.js +108 -0
- package/dist/services/memory-corrected-review-acceptance.js +129 -0
- package/dist/services/memory-corrected-review-batch.js +37 -0
- package/dist/services/memory-corrected-review-findings.js +108 -0
- package/dist/services/memory-corrected-review-inputs.js +215 -0
- package/dist/services/memory-corrected-review-projection.js +78 -0
- package/dist/services/memory-corrected-review-receipt.js +178 -0
- package/dist/services/memory-corrected-review-registration.js +192 -0
- package/dist/services/memory-correction-check-receipt.js +235 -0
- package/dist/services/memory-correction-input-owner.js +6 -0
- package/dist/services/memory-custody-snapshot.js +36 -0
- package/dist/services/memory-discover-handler.js +104 -0
- package/dist/services/memory-finish-evidence.js +457 -0
- package/dist/services/memory-finish-handler.js +229 -0
- package/dist/services/memory-finish-integration.js +491 -0
- package/dist/services/memory-finish-readiness.js +169 -0
- package/dist/services/memory-fix-finish-integration.js +129 -0
- package/dist/services/memory-fix-git-dispatch.js +139 -0
- package/dist/services/memory-fix-intake-custody.js +11 -0
- package/dist/services/memory-fix-intake-settlement.js +127 -0
- package/dist/services/memory-fix-publication.js +196 -0
- package/dist/services/memory-fix-repair-admission.js +116 -0
- package/dist/services/memory-fix-request.js +141 -0
- package/dist/services/memory-fix-run-bundle.js +83 -0
- package/dist/services/memory-fix-scope.js +78 -0
- package/dist/services/memory-fix-sources.js +85 -0
- package/dist/services/memory-fix-stage-entry.js +24 -0
- package/dist/services/memory-fix-stage-handlers.js +282 -0
- package/dist/services/memory-fix-stage-results.js +106 -0
- package/dist/services/memory-fix-workspace.js +127 -0
- package/dist/services/memory-flow-user-inputs.js +88 -0
- package/dist/services/memory-git-integration.js +220 -0
- package/dist/services/memory-historical-corrected-review.js +212 -0
- package/dist/services/memory-historical-original-review.js +143 -0
- package/dist/services/memory-historical-repair-registration.js +105 -0
- package/dist/services/memory-historical-second-review.js +147 -0
- package/dist/services/memory-init-bootstrap-readiness.js +210 -0
- package/dist/services/memory-init-contexts.js +181 -0
- package/dist/services/memory-init-controller-start.js +119 -0
- package/dist/services/memory-init-engine-release.js +223 -0
- package/dist/services/memory-init-git-policy.js +165 -0
- package/dist/services/memory-init-lint-capability.js +203 -0
- package/dist/services/memory-init-native-capacity.js +309 -0
- package/dist/services/memory-init-preflight.js +334 -0
- package/dist/services/memory-init-project-bootstrap.js +599 -0
- package/dist/services/memory-init-request-candidate.js +213 -0
- package/dist/services/memory-init-request-input.js +82 -0
- package/dist/services/memory-init-resource-storage.js +125 -0
- package/dist/services/memory-init-run-allocation.js +81 -0
- package/dist/services/memory-init-run-bundle.js +135 -0
- package/dist/services/memory-init-start.js +181 -0
- package/dist/services/memory-init-startup-custody.js +80 -0
- package/dist/services/memory-init-startup-input.js +240 -0
- package/dist/services/memory-init-storage.js +91 -0
- package/dist/services/memory-init-stores.js +359 -0
- package/dist/services/memory-init-worktrunk-capability.js +174 -0
- package/dist/services/memory-layer-publication.js +611 -0
- package/dist/services/memory-layer.js +225 -0
- package/dist/services/memory-lint-config.js +194 -0
- package/dist/services/memory-native-review-copy.js +127 -0
- package/dist/services/memory-normal-flow-entry.js +87 -0
- package/dist/services/memory-ordinary-defaults.js +129 -0
- package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
- package/dist/services/memory-preflight-handler.js +274 -0
- package/dist/services/memory-repair-current-view.js +299 -0
- package/dist/services/memory-repair-document-delta.js +489 -0
- package/dist/services/memory-repair-history.js +496 -0
- package/dist/services/memory-repair-physical-binding.js +194 -0
- package/dist/services/memory-repair-publication-files.js +152 -0
- package/dist/services/memory-repair-publication-intent.js +27 -0
- package/dist/services/memory-repair-publication-plan.js +162 -0
- package/dist/services/memory-repair-publication-source.js +225 -0
- package/dist/services/memory-repair-publication.js +795 -0
- package/dist/services/memory-repair-registration.js +240 -0
- package/dist/services/memory-repair-work-baseline.js +415 -0
- package/dist/services/memory-repair-work-completion.js +117 -0
- package/dist/services/memory-repair-work-custody.js +73 -0
- package/dist/services/memory-repair-work-results.js +108 -0
- package/dist/services/memory-repair-workspace.js +261 -0
- package/dist/services/memory-repair-writer-copy.js +736 -0
- package/dist/services/memory-result-binding.js +239 -0
- package/dist/services/memory-retained-review-authority.js +138 -0
- package/dist/services/memory-retained-review-results.js +70 -0
- package/dist/services/memory-retained-second-baseline.js +102 -0
- package/dist/services/memory-retained-second-repairs.js +162 -0
- package/dist/services/memory-review-acceptance.js +214 -0
- package/dist/services/memory-review-correction-plan.js +206 -0
- package/dist/services/memory-review-handler.js +585 -0
- package/dist/services/memory-review-inputs.js +246 -0
- package/dist/services/memory-review-limits.js +10 -0
- package/dist/services/memory-review-receipt.js +180 -0
- package/dist/services/memory-review-registration.js +117 -0
- package/dist/services/memory-review-work-custody.js +126 -0
- package/dist/services/memory-review-work-input.js +91 -0
- package/dist/services/memory-review-work-results.js +95 -0
- package/dist/services/memory-second-corrected-review-inputs.js +167 -0
- package/dist/services/memory-second-correction-plan.js +77 -0
- package/dist/services/memory-second-repair-baseline.js +91 -0
- package/dist/services/memory-second-repair-launch.js +614 -0
- package/dist/services/memory-second-repair-registration.js +88 -0
- package/dist/services/memory-second-repair-source.js +187 -0
- package/dist/services/memory-second-review-acceptance.js +115 -0
- package/dist/services/memory-source-observations.js +117 -0
- package/dist/services/memory-stage-dispatch.js +65 -0
- package/dist/services/memory-stage-results.js +290 -0
- package/dist/services/memory-tool-probe.js +25 -0
- package/dist/services/memory-upgrade-analysis-handler.js +243 -0
- package/dist/services/memory-upgrade-bootstrap-readiness.js +251 -0
- package/dist/services/memory-upgrade-evidence.js +100 -0
- package/dist/services/memory-upgrade-inventory.js +442 -0
- package/dist/services/memory-upgrade-publication-custody.js +73 -0
- package/dist/services/memory-upgrade-publication.js +413 -0
- package/dist/services/memory-upgrade-selection.js +430 -0
- package/dist/services/memory-upgrade-start.js +60 -0
- package/dist/services/memory-upgrade-storage-readiness.js +340 -0
- package/dist/services/memory-verification-acceptance.js +156 -0
- package/dist/services/memory-verification-checks.js +317 -0
- package/dist/services/memory-verification-receipt.js +160 -0
- package/dist/services/memory-verify-handler.js +137 -0
- package/dist/services/memory-work-result-json.js +12 -0
- package/dist/services/memory-work-result-preparation.js +64 -0
- package/dist/services/merge-queue.js +228 -149
- package/dist/services/merge-server.js +163 -35
- package/dist/services/migrations.js +164 -114
- package/dist/services/model-catalog.js +109 -0
- package/dist/services/model-discovery.js +46 -0
- package/dist/services/native-daemon-history.js +50 -0
- package/dist/services/native-session-control.js +39 -0
- package/dist/services/operator-profiles.js +236 -0
- package/dist/services/physical-startup.js +45 -0
- package/dist/services/plan-runtime.js +26 -11
- package/dist/services/plans.js +28 -25
- package/dist/services/project-flow-source.js +195 -0
- package/dist/services/project-git-integration.js +92 -0
- package/dist/services/project-registry.js +97 -0
- package/dist/services/project-summary.js +1 -1
- package/dist/services/projects.js +17 -87
- package/dist/services/prompt-delivery.js +71 -0
- package/dist/services/prompts.js +28 -17
- package/dist/services/protocols.js +163 -87
- package/dist/services/provider-capacity.js +463 -0
- package/dist/services/recovery-observation-budget.js +121 -0
- package/dist/services/recovery-snapshot-database.js +588 -0
- package/dist/services/release-archive-producer.js +52 -0
- package/dist/services/release-archive.js +143 -0
- package/dist/services/release-cache.js +150 -0
- package/dist/services/release-compatibility.js +18 -0
- package/dist/services/release-download.js +67 -0
- package/dist/services/release-envelope.js +104 -0
- package/dist/services/release-manifest.js +45 -0
- package/dist/services/release-payload.js +114 -0
- package/dist/services/release-producer.js +63 -0
- package/dist/services/release-provenance.js +160 -0
- package/dist/services/release-registry.js +66 -0
- package/dist/services/release-source.js +194 -0
- package/dist/services/repair-intents.js +29 -0
- package/dist/services/repair-receipt.js +13 -0
- package/dist/services/retained-native-hook.js +274 -0
- package/dist/services/review-copy.js +165 -0
- package/dist/services/review-deferral.js +23 -0
- package/dist/services/review-fix-handoff.js +82 -0
- package/dist/services/review-fix-intake-custody.js +17 -0
- package/dist/services/review-fix-stage-entry.js +43 -0
- package/dist/services/review-fix-stage-handlers.js +176 -0
- package/dist/services/review-fix-stage-results.js +86 -0
- package/dist/services/run-control-receipt.js +56 -0
- package/dist/services/run-control-worker.js +469 -0
- package/dist/services/run-control.js +1109 -0
- package/dist/services/run-controller-adapter.js +434 -0
- package/dist/services/run-controller-capture.js +186 -0
- package/dist/services/run-controller-process.js +226 -0
- package/dist/services/run-controller-recovery.js +335 -0
- package/dist/services/run-controller-state.js +106 -0
- package/dist/services/run-controller.js +1717 -0
- package/dist/services/run-engine-bindings.js +1 -1
- package/dist/services/run-fork.js +147 -0
- package/dist/services/run-health.js +149 -0
- package/dist/services/run-observations.js +152 -0
- package/dist/services/run-projection.js +22 -64
- package/dist/services/run-recovery-guard.js +107 -0
- package/dist/services/run-recovery-runtime.js +112 -0
- package/dist/services/run-recovery.js +485 -0
- package/dist/services/run-start-custody.js +189 -0
- package/dist/services/run-timeline.js +59 -0
- package/dist/services/runs.js +996 -271
- package/dist/services/runtime-budget.js +446 -0
- package/dist/services/runtime-command.js +43 -0
- package/dist/services/runtime-scope-capture.js +52 -0
- package/dist/services/runtime-scope-control.js +468 -0
- package/dist/services/runtime-scope-resume.js +605 -0
- package/dist/services/runtime-scope-stop.js +211 -0
- package/dist/services/runtime-scope-worker.js +314 -0
- package/dist/services/runtime-service.js +19 -14
- package/dist/services/schema-validation.js +10 -8
- package/dist/services/scope-writer-cleanup.js +27 -0
- package/dist/services/sessions.js +37 -91
- package/dist/services/setup.js +427 -0
- package/dist/services/stage-blocker.js +17 -7
- package/dist/services/stage-context.js +240 -18
- package/dist/services/stage-handlers.js +141 -0
- package/dist/services/stage-lifecycle.js +156 -119
- package/dist/services/stage-pause.js +222 -94
- package/dist/services/stage-report-renderer.js +230 -6
- package/dist/services/stage-work-graph.js +52 -0
- package/dist/services/technical-notes.js +31 -0
- package/dist/services/tooling.js +111 -44
- package/dist/services/usage.js +49 -101
- package/dist/services/verification-matrix.js +393 -0
- package/dist/services/version-status.js +1 -1
- package/dist/services/vnext-code-review.js +302 -91
- package/dist/services/vnext-code.js +325 -251
- package/dist/services/vnext-contracts.js +10 -1
- package/dist/services/vnext-execution-profile.js +80 -5
- package/dist/services/vnext-fanout.js +399 -20
- package/dist/services/vnext-merge.js +336 -114
- package/dist/services/vnext-plan-review.js +288 -133
- package/dist/services/vnext-plan.js +230 -106
- package/dist/services/vnext-protocolize.js +534 -96
- package/dist/services/vnext-specify.js +131 -84
- package/dist/services/vnext-workspace-policy.js +7 -2
- package/dist/services/work-registry.js +1950 -215
- package/dist/services/work-retry-context.js +55 -0
- package/dist/services/workspace-bootstrap.js +53 -15
- package/dist/services/workspace-files.js +85 -0
- package/dist/services/worktrees.js +108 -48
- package/dist/shared/entity-references.js +1 -0
- package/dist/shared/errors.js +27 -0
- package/dist/storage/agent-output.js +26 -0
- package/dist/storage/data-preservation.js +65 -0
- package/dist/storage/database.js +931 -40
- package/dist/storage/foreign-key-transaction.js +39 -0
- package/dist/storage/immutable-input.js +45 -0
- package/dist/storage/import-guard.js +159 -0
- package/dist/storage/memory-upgrade-schema-bootstrap.js +38 -0
- package/dist/storage/native-cleanup.js +52 -0
- package/dist/storage/paired-writer-migration.js +424 -0
- package/dist/storage/paths.js +17 -4
- package/dist/storage/projection-lock.js +73 -0
- package/dist/storage/work-references.js +23 -0
- package/dist/storage/writer-contract.js +96 -0
- package/dist/storage/writer-migration.js +346 -0
- package/dist/storage/writer-restore.js +217 -0
- package/dist/verification-components.json +384 -0
- package/package.json +52 -13
- package/tools/create-canon-release.mjs +33 -0
- package/tools/probe-codex-history.mjs +37 -0
- package/tools/produce-hybrid-release.mjs +41 -0
- package/tools/repair-paused-run-status.mjs +84 -0
- package/tools/verification-jobs.mjs +342 -0
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
2
|
+
import crypto from "node:crypto";
|
|
3
|
+
import { CAPACITY_POLICY, capacityBackoff, nativeItemsSettled, normalizeCodexFailure, overloadBurst, parseCapacityOperation, refusalObservation, terminalCodexOverload } from "../harness-runtime/lib/codex-capacity-policy.mjs";
|
|
4
|
+
import { AppError } from "../shared/errors.js";
|
|
5
|
+
import { isObservationLoss } from "../harness-runtime/lib/operation-errors.mjs";
|
|
6
|
+
export function eligibleCodexChildOverload(child, parentSessionId) {
|
|
7
|
+
return typeof child.session_id === "string" && child.session_id !== parentSessionId && child.parent_session_id === parentSessionId && child.provenance !== "parent_mismatch" && child.status === "failed" && typeof child.terminal_turn_id === "string" && nativeItemsSettled(child.native_turn_items)
|
|
8
|
+
&& terminalCodexOverload({ code: "turn_interrupted", details: { provider_session_id: child.session_id, turn_id: child.terminal_turn_id, native_turn_id: child.terminal_turn_id, terminal_status: "failed", provider_error: child.provider_error } }, child.session_id, child.terminal_turn_id);
|
|
9
|
+
}
|
|
10
|
+
/** A terminal root is not a settled tree. Only the daemon's exact owned tree
|
|
11
|
+
* with a settled root and positively live descendants permits waiting. */
|
|
12
|
+
export function capacityReadiness(seen, sessionId, operationId, turnId, items, allowDescendants = false) {
|
|
13
|
+
if (seen.provider_session_id !== sessionId || seen.terminal_turn_id !== undefined && seen.terminal_turn_id !== turnId || !nativeItemsSettled(items))
|
|
14
|
+
return "unproven";
|
|
15
|
+
const ids = Array.isArray(seen.tree_session_ids) ? seen.tree_session_ids : [];
|
|
16
|
+
if (!ids.length || ids[0] !== sessionId || ids.some(id => typeof id !== "string" || !id) || new Set(ids).size !== ids.length)
|
|
17
|
+
return "unproven";
|
|
18
|
+
const observations = Array.isArray(seen.tree_observations) ? seen.tree_observations : [];
|
|
19
|
+
const exactTree = observations.length === ids.length && ids.every(id => observations.filter(item => item.provider_session_id === id).length === 1);
|
|
20
|
+
const settlement = seen.settlement;
|
|
21
|
+
const budgetSettled = !settlement || settlement.state === "not_required" || settlement.state === "settled" && settlement.operation_ids?.includes(operationId) === true;
|
|
22
|
+
const treeSettled = allowDescendants ? exactTree && observations.every(item => item.settled === true) && Array.isArray(seen.unsettled_sessions) && seen.unsettled_sessions.length === 0 : ids.length === 1;
|
|
23
|
+
if (seen.settled === true && treeSettled && budgetSettled)
|
|
24
|
+
return "ready";
|
|
25
|
+
if (!allowDescendants || seen.settled !== false || !exactTree || ids.length < 2 || observations[0]?.provider_session_id !== sessionId || observations[0].settled !== true
|
|
26
|
+
|| settlement && settlement.state !== "not_required" && !(settlement.state === "pending" && settlement.reason === "tree_unsettled"))
|
|
27
|
+
return "unproven";
|
|
28
|
+
const live = observations.filter(item => item.settled === false);
|
|
29
|
+
const unsettled = seen.unsettled_sessions;
|
|
30
|
+
const knownLive = live.length > 0 && live.every(item => item.provider_session_id !== sessionId && ["active", "running", "inProgress"].includes(String(typeof item.status === "object" && item.status ? item.status.type : item.status)));
|
|
31
|
+
return knownLive && observations.every(item => typeof item.settled === "boolean") && Array.isArray(unsettled) && unsettled.length === live.length && live.every(item => unsettled.includes(item.provider_session_id)) ? "owned_children_live" : "unproven";
|
|
32
|
+
}
|
|
33
|
+
/** Permit acquisition must still belong to the original task, not merely an
|
|
34
|
+
* open RUN. Controls/inspection and ordinary successor prompts are unaffected. */
|
|
35
|
+
export function assertCapacityOwnerAdmission(context, record, operationId, binding) {
|
|
36
|
+
if (!operationId || !record.project_id || !record.run_id)
|
|
37
|
+
return;
|
|
38
|
+
const root = parseCapacityOperation(operationId).root;
|
|
39
|
+
const childOrdinal = /:child:[a-f0-9]+:followup:(\d+)$/.exec(root)?.[1];
|
|
40
|
+
if (childOrdinal && (!Number.isSafeInteger(Number(childOrdinal)) || Number(childOrdinal) < 1 || String(Number(childOrdinal)) !== childOrdinal))
|
|
41
|
+
throw new AppError("capacity_continuation_conflict", "Invalid native child continuation ordinal", 1);
|
|
42
|
+
if (root === operationId && !childOrdinal)
|
|
43
|
+
return;
|
|
44
|
+
const reject = () => { throw new AppError("capacity_owner_boundary_changed", "Queued continuation no longer belongs to an unfinished task; reconcile its durable state", 1, { operation_id: operationId, work_id: record.work_id, run_id: record.run_id }); };
|
|
45
|
+
const metadata = JSON.parse(record.metadata_json);
|
|
46
|
+
const hasTable = (name) => Boolean(context.db.get("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?", [name]));
|
|
47
|
+
const parsed = parseCapacityOperation(operationId);
|
|
48
|
+
if (parsed.ordinal > 0 && !["judge", "probe"].includes(metadata.role ?? "")) {
|
|
49
|
+
if (!binding?.nativeSessionId || !binding.promptSha256)
|
|
50
|
+
reject();
|
|
51
|
+
let intent;
|
|
52
|
+
const predecessor = parsed.ordinal === 1 ? root : `${root}:capacity:${parsed.ordinal - 1}:session.prompt`;
|
|
53
|
+
if (hasTable("run_controller_operations")) {
|
|
54
|
+
const saved = context.db.get("SELECT receipt_json FROM run_controller_operations WHERE operation_id = ? AND controller_id = ? AND generation = ? AND status = 'failed'", [predecessor, record.owner_id, metadata.run_generation ?? 0]);
|
|
55
|
+
if (saved)
|
|
56
|
+
intent = JSON.parse(saved.receipt_json).capacity_intent;
|
|
57
|
+
}
|
|
58
|
+
if (!intent && record.work_id)
|
|
59
|
+
for (const table of ["work_launches", "merge_requests"]) {
|
|
60
|
+
if (!hasTable(table))
|
|
61
|
+
continue;
|
|
62
|
+
const rows = table === "work_launches"
|
|
63
|
+
? context.db.all("SELECT l.adapter_receipt_json FROM work_launches l JOIN works w ON w.work_id = l.work_id WHERE l.work_id = ? AND w.project_id = ? AND w.run_id = ?", [record.work_id, record.project_id, record.run_id])
|
|
64
|
+
: context.db.all("SELECT adapter_receipt_json FROM merge_requests WHERE executor_work_id = ? AND project_id = ? AND run_id = ?", [record.work_id, record.project_id, record.run_id]);
|
|
65
|
+
for (const saved of rows) {
|
|
66
|
+
const retained = JSON.parse(saved.adapter_receipt_json ?? "null");
|
|
67
|
+
intent = retained?.capacity_intents?.find((item) => item.operation_id === operationId);
|
|
68
|
+
if (intent)
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
if (intent)
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
if (!intent || intent.policy !== CAPACITY_POLICY || intent.root_operation_id !== root || intent.ordinal !== parsed.ordinal
|
|
75
|
+
|| intent.predecessor !== predecessor || intent.operation_id !== operationId || intent.refusal?.turn_id !== intent.turn_id
|
|
76
|
+
|| intent.refusal?.ordinal !== parsed.ordinal - 1 || intent.refusal?.session_id !== intent.session_id
|
|
77
|
+
|| !Number.isFinite(Date.parse(intent.not_before)) || Date.parse(intent.not_before) > Date.parse(context.now())
|
|
78
|
+
|| intent.deadline !== null && (typeof intent.deadline !== "number" || intent.deadline <= Date.parse(context.now()))
|
|
79
|
+
|| binding?.nativeSessionId !== undefined && intent.session_id !== binding.nativeSessionId
|
|
80
|
+
|| binding?.promptSha256 !== undefined && intent.prompt_sha256 !== binding.promptSha256)
|
|
81
|
+
reject();
|
|
82
|
+
}
|
|
83
|
+
if (context.db.get("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'run_recovery_bindings'")) {
|
|
84
|
+
if (context.db.get("SELECT 1 FROM run_recovery_bindings b JOIN run_recovery_guards g ON g.recovery_id = b.recovery_id WHERE g.project_id = ? AND g.run_id = ? AND g.status = 'recovered' AND b.status = 'accepted' AND json_extract(b.runtime_dispatch_json, '$.operation_id') = ?", [record.project_id, record.run_id, root]))
|
|
85
|
+
reject();
|
|
86
|
+
}
|
|
87
|
+
if (record.work_id) {
|
|
88
|
+
const work = context.db.get("SELECT status FROM works WHERE work_id = ? AND project_id = ? AND run_id = ?", [record.work_id, record.project_id, record.run_id]);
|
|
89
|
+
const merge = context.db.get("SELECT status FROM merge_requests WHERE executor_work_id = ? AND project_id = ? AND run_id = ?", [record.work_id, record.project_id, record.run_id]);
|
|
90
|
+
if (merge && !["dispatching", "active"].includes(merge.status))
|
|
91
|
+
reject();
|
|
92
|
+
// MERGE owns the Stage/request boundary: finishing its Work does not
|
|
93
|
+
// necessarily commit stage finish yet. External workers own only Work.
|
|
94
|
+
const mergeOwner = metadata.role === "merge";
|
|
95
|
+
if (!work || !(merge && mergeOwner ? ["created", "running", "completed"] : ["created", "running"]).includes(work.status))
|
|
96
|
+
reject();
|
|
97
|
+
}
|
|
98
|
+
if (!context.db.get("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'run_controllers'"))
|
|
99
|
+
return;
|
|
100
|
+
const controller = context.db.get("SELECT state_json FROM run_controllers WHERE controller_id = ? AND project_id = ? AND run_id = ?", [record.owner_id, record.project_id, record.run_id]);
|
|
101
|
+
if (!controller)
|
|
102
|
+
return;
|
|
103
|
+
const state = JSON.parse(controller.state_json);
|
|
104
|
+
const run = context.db.get("SELECT index_json FROM runs WHERE project_id = ? AND id = ?", [record.project_id, record.run_id]);
|
|
105
|
+
const index = JSON.parse(run?.index_json ?? "{}");
|
|
106
|
+
if (state.stage && (index.current_stage && index.current_stage !== state.stage || index.stage_runs?.some(stage => stage.stage === state.stage && ["done", "skipped"].includes(stage.status))))
|
|
107
|
+
reject();
|
|
108
|
+
const child = Object.entries(state.child_capacity ?? {}).find(([, intent]) => intent.operation_id === root)?.[0];
|
|
109
|
+
if (childOrdinal && !child)
|
|
110
|
+
reject();
|
|
111
|
+
if (child && context.db.get("SELECT 1 FROM work_sessions ws JOIN works w ON w.work_id = ws.work_id JOIN sessions s ON s.session_id = ws.session_id WHERE w.project_id = ? AND w.run_id = ? AND s.provider_session_id = ? AND w.status <> 'running'", [record.project_id, record.run_id, child]))
|
|
112
|
+
reject();
|
|
113
|
+
}
|
|
114
|
+
export function capacityDelay(error, ordinal, now = Date.now()) {
|
|
115
|
+
return capacityBackoff(error, ordinal, now);
|
|
116
|
+
}
|
|
117
|
+
/** Continue a confirmed terminal Turn, never replay its completed effects. */
|
|
118
|
+
export async function continueCodexCapacity(input) {
|
|
119
|
+
let { error, operationId } = input;
|
|
120
|
+
const history = [...(input.retainedIntents?.() ?? [])];
|
|
121
|
+
const parsed = parseCapacityOperation(input.operationId);
|
|
122
|
+
const rootId = parsed.root;
|
|
123
|
+
const text = input.continuationText ?? "Continue the same assigned task in this Session. Check current durable RUN, Work and Stage state first. Never repeat an observed lifecycle command, accepted HITL answer, check or merge apply; use only an exact issued successor. Stop at the assigned boundary.";
|
|
124
|
+
const promptSha = crypto.createHash("sha256").update(text).digest("hex");
|
|
125
|
+
let ordinal = parsed.ordinal + 1;
|
|
126
|
+
const conflict = (message) => { throw new AppError("capacity_continuation_conflict", message, 1, { operation_id: operationId, root_operation_id: rootId, session_id: input.sessionId }); };
|
|
127
|
+
const blocked = (message) => new AppError("capacity_continuation_blocked", message, 1, { capacity_uncertainty: true, operation_id: operationId, root_operation_id: rootId, provider_session_id: input.sessionId, primary_error: error });
|
|
128
|
+
const observe = async (action, observedOperationId = operationId) => {
|
|
129
|
+
try {
|
|
130
|
+
return await action();
|
|
131
|
+
}
|
|
132
|
+
catch (cause) {
|
|
133
|
+
let primary = cause;
|
|
134
|
+
for (let depth = 0; depth < 4 && primary?.code === "harness_adapter_failed"; depth++)
|
|
135
|
+
primary = (primary.cause ?? primary.details?.cause);
|
|
136
|
+
if (isObservationLoss(primary))
|
|
137
|
+
throw new AppError("operation_observation_lost", "Capacity native observation was lost; do not cancel or resend", 1, { capacity_uncertainty: true, root_operation_id: rootId, operation_id: observedOperationId, provider_session_id: input.sessionId, predecessor_error: error, cause });
|
|
138
|
+
throw cause;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
const refusals = [...(input.retainedFailures?.() ?? [])];
|
|
142
|
+
if (parsed.ordinal > history.length)
|
|
143
|
+
conflict("Continuation has no complete retained predecessor chain");
|
|
144
|
+
for (let index = 0; index < history.length; index++) {
|
|
145
|
+
const intent = history[index];
|
|
146
|
+
const expected = index + 1;
|
|
147
|
+
if (intent.ordinal !== expected || intent.operation_id !== `${rootId}:capacity:${expected}:session.prompt`
|
|
148
|
+
|| intent.predecessor !== (expected === 1 ? rootId : `${rootId}:capacity:${expected - 1}:session.prompt`)
|
|
149
|
+
|| intent.prompt_sha256 !== promptSha || intent.policy !== CAPACITY_POLICY || intent.root_operation_id !== rootId || intent.session_id !== input.sessionId
|
|
150
|
+
|| intent.deadline !== (input.deadline ?? null) || !intent.refusal || intent.refusal.ordinal !== expected - 1 || intent.refusal.turn_id !== intent.turn_id
|
|
151
|
+
|| !Number.isFinite(Date.parse(intent.not_before)))
|
|
152
|
+
conflict("Retained capacity chain is incomplete or belongs to another policy/task");
|
|
153
|
+
const previous = refusals.find(item => item.ordinal === intent.refusal.ordinal);
|
|
154
|
+
if (previous && JSON.stringify(previous) !== JSON.stringify(intent.refusal))
|
|
155
|
+
conflict("Retained failure observation changed");
|
|
156
|
+
if (!previous)
|
|
157
|
+
refusals.push(intent.refusal);
|
|
158
|
+
}
|
|
159
|
+
refusals.sort((a, b) => a.ordinal - b.ordinal);
|
|
160
|
+
for (let index = 0; index < refusals.length; index++) {
|
|
161
|
+
const refusal = refusals[index];
|
|
162
|
+
if (refusal.ordinal !== index || refusal.policy !== CAPACITY_POLICY || refusal.session_id !== input.sessionId || !refusal.turn_id
|
|
163
|
+
|| refusals.slice(0, index).some(item => item.turn_id === refusal.turn_id) || !Number.isFinite(Date.parse(refusal.first_observed_at)))
|
|
164
|
+
conflict("Retained refusal chain is invalid");
|
|
165
|
+
}
|
|
166
|
+
// Reconcile a retained dispatch before preparing another. Native absence is
|
|
167
|
+
// the only safe way to reuse a prepared intent; a lost reply is not absence.
|
|
168
|
+
for (const intent of history) {
|
|
169
|
+
if (intent.ordinal < ordinal)
|
|
170
|
+
continue;
|
|
171
|
+
if (intent.predecessor !== operationId || intent.ordinal !== ordinal || intent.operation_id !== `${rootId}:capacity:${ordinal}:session.prompt`)
|
|
172
|
+
conflict("Retained successor skips its predecessor");
|
|
173
|
+
if (intent.prompt_sha256 !== promptSha || !intent.turn_id || !Number.isFinite(Date.parse(intent.not_before)))
|
|
174
|
+
throw error;
|
|
175
|
+
let observed;
|
|
176
|
+
try {
|
|
177
|
+
observed = await observe(() => input.inspectOperation(intent.operation_id), intent.operation_id);
|
|
178
|
+
}
|
|
179
|
+
catch (cause) {
|
|
180
|
+
let code = cause;
|
|
181
|
+
for (let depth = 0; depth < 4 && code?.code === "harness_adapter_failed"; depth++)
|
|
182
|
+
code = code.details?.cause;
|
|
183
|
+
if (code?.code !== "operation_not_found")
|
|
184
|
+
throw cause;
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
if (observed.operation_id !== intent.operation_id || observed.session_id !== input.sessionId || observed.operation !== "session.prompt")
|
|
188
|
+
conflict("Retained native successor identity changed");
|
|
189
|
+
if (observed.primary_error)
|
|
190
|
+
throw observed.primary_error;
|
|
191
|
+
while (["prepared", "dispatching", "running", "awaiting_provider", "outcome_unknown"].includes(String(observed.state))) {
|
|
192
|
+
input.signal?.throwIfAborted();
|
|
193
|
+
input.assertCurrent();
|
|
194
|
+
const boundary = await observe(async () => await input.decision?.() ?? "continue", intent.operation_id);
|
|
195
|
+
if (boundary === "completed" || boundary === "paused")
|
|
196
|
+
return { provider_session_id: input.sessionId, capacity_decision: boundary };
|
|
197
|
+
if (boundary === "reconciliation_blocked")
|
|
198
|
+
throw new AppError("capacity_continuation_blocked", "Retained native successor has an unresolved owner boundary", 1, { operation_id: intent.operation_id, primary_error: error });
|
|
199
|
+
if (input.deadline !== undefined && Date.now() >= input.deadline)
|
|
200
|
+
throw new AppError("capacity_owner_deadline_exceeded", "Retained successor exhausted its original deadline", 1);
|
|
201
|
+
await delay(250, undefined, { signal: input.signal });
|
|
202
|
+
observed = await observe(() => input.inspectOperation(intent.operation_id), intent.operation_id);
|
|
203
|
+
input.signal?.throwIfAborted();
|
|
204
|
+
input.assertCurrent();
|
|
205
|
+
if (observed.operation_id !== intent.operation_id || observed.session_id !== input.sessionId || observed.operation !== "session.prompt")
|
|
206
|
+
conflict("Retained native successor identity changed");
|
|
207
|
+
if (observed.primary_error)
|
|
208
|
+
throw observed.primary_error;
|
|
209
|
+
}
|
|
210
|
+
if (observed.state === "completed" && observed.result && typeof observed.result === "object") {
|
|
211
|
+
input.signal?.throwIfAborted();
|
|
212
|
+
input.assertCurrent();
|
|
213
|
+
const boundary = await observe(async () => await input.decision?.() ?? "continue", intent.operation_id);
|
|
214
|
+
input.signal?.throwIfAborted();
|
|
215
|
+
input.assertCurrent();
|
|
216
|
+
if (boundary === "reconciliation_blocked")
|
|
217
|
+
throw new AppError("capacity_continuation_blocked", "Retained completion cannot be reconciled with its owner boundary", 1);
|
|
218
|
+
return boundary === "paused" || boundary === "completed" ? { provider_session_id: input.sessionId, capacity_decision: boundary } : observed.result;
|
|
219
|
+
}
|
|
220
|
+
if (observed.state === "failed" && observed.error && !terminalCodexOverload(observed.error, input.sessionId))
|
|
221
|
+
throw observed.error;
|
|
222
|
+
if (observed.state !== "failed" || !terminalCodexOverload(observed.error, input.sessionId))
|
|
223
|
+
throw new AppError("operation_observation_lost", "Retained successor outcome is not proven; do not resend", 1, { operation_id: intent.operation_id, primary_error: error, observed });
|
|
224
|
+
operationId = intent.operation_id;
|
|
225
|
+
error = observed.error;
|
|
226
|
+
ordinal += 1;
|
|
227
|
+
}
|
|
228
|
+
const decide = async (observedOperationId = operationId) => {
|
|
229
|
+
input.signal?.throwIfAborted();
|
|
230
|
+
input.assertCurrent();
|
|
231
|
+
const decision = await observe(async () => await input.decision?.() ?? "continue", observedOperationId);
|
|
232
|
+
input.signal?.throwIfAborted();
|
|
233
|
+
input.assertCurrent();
|
|
234
|
+
if (decision === "reconciliation_blocked")
|
|
235
|
+
throw new AppError("capacity_continuation_blocked", "Native refusal cannot be reconciled with its durable owner boundary", 1, { primary_error: error, root_operation_id: rootId, provider_session_id: input.sessionId });
|
|
236
|
+
if (decision === "continue" && input.deadline !== undefined && Date.now() >= input.deadline)
|
|
237
|
+
throw new AppError("capacity_owner_deadline_exceeded", "Continuation exhausted its original owner deadline", 1, { primary_error: error, deadline: input.deadline, root_operation_id: rootId, provider_session_id: input.sessionId });
|
|
238
|
+
return decision === "continue" ? null : { provider_session_id: input.sessionId, capacity_decision: decision };
|
|
239
|
+
};
|
|
240
|
+
for (;; ordinal += 1) {
|
|
241
|
+
if (!Number.isSafeInteger(ordinal))
|
|
242
|
+
conflict("Continuation ordinal overflow");
|
|
243
|
+
if (!terminalCodexOverload(error, input.sessionId)) {
|
|
244
|
+
if (ordinal === 1)
|
|
245
|
+
return null;
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
const completed = await decide();
|
|
249
|
+
if (completed)
|
|
250
|
+
return completed;
|
|
251
|
+
const prior = await observe(() => input.inspectOperation(operationId));
|
|
252
|
+
const failure = prior.error;
|
|
253
|
+
const confirmed = normalizeCodexFailure(failure, input.sessionId);
|
|
254
|
+
const turnId = confirmed?.turn_id;
|
|
255
|
+
input.signal?.throwIfAborted();
|
|
256
|
+
input.assertCurrent();
|
|
257
|
+
if (prior.primary_error)
|
|
258
|
+
throw prior.primary_error;
|
|
259
|
+
if (prior.operation_id !== operationId || prior.operation !== "session.prompt" || prior.session_id !== input.sessionId
|
|
260
|
+
|| prior.state !== "failed" || prior.primary_error || !turnId || !terminalCodexOverload(failure, input.sessionId, turnId)) {
|
|
261
|
+
throw blocked("Retained predecessor does not prove the exact terminal overloaded Turn");
|
|
262
|
+
}
|
|
263
|
+
const readiness = async () => {
|
|
264
|
+
input.signal?.throwIfAborted();
|
|
265
|
+
input.assertCurrent();
|
|
266
|
+
const seen = await observe(() => input.inspectSession(turnId));
|
|
267
|
+
input.signal?.throwIfAborted();
|
|
268
|
+
input.assertCurrent();
|
|
269
|
+
const items = (seen.terminal_turn_id === turnId && seen.terminal_status === "failed" ? seen.native_turn_items : confirmed?.native_turn_items);
|
|
270
|
+
return capacityReadiness(seen, input.sessionId, operationId, turnId, items, input.allowSettledDescendants);
|
|
271
|
+
};
|
|
272
|
+
const ready = await readiness();
|
|
273
|
+
if (ready === "unproven")
|
|
274
|
+
throw blocked("Native predecessor readiness is unproven; do not cancel or replay to manufacture proof");
|
|
275
|
+
const native = normalizeCodexFailure(failure, input.sessionId, turnId);
|
|
276
|
+
let refusal = refusals.find(item => item.ordinal === ordinal - 1);
|
|
277
|
+
if (refusal && (refusal.turn_id !== turnId || refusal.session_id !== input.sessionId || refusal.policy !== CAPACITY_POLICY))
|
|
278
|
+
conflict("Failure ordinal identifies a different native Turn");
|
|
279
|
+
if (refusal) {
|
|
280
|
+
const expected = refusalObservation(failure, ordinal - 1, refusal.first_observed_at);
|
|
281
|
+
if (refusal.native_terminal_at !== expected.native_terminal_at || refusal.native_terminal_basis !== expected.native_terminal_basis)
|
|
282
|
+
conflict("Retained refusal time differs from its native receipt");
|
|
283
|
+
}
|
|
284
|
+
if (!refusal) {
|
|
285
|
+
if (refusals.some(item => item.turn_id === turnId))
|
|
286
|
+
conflict("A cached native Turn cannot be a second refusal");
|
|
287
|
+
// A cached legacy failure cannot be assigned a new time during reattach.
|
|
288
|
+
if (ordinal > 1 && parsed.ordinal > 0 && !native.observed_at)
|
|
289
|
+
conflict("Retained continuation has no original failure time");
|
|
290
|
+
const observedAt = typeof native.observed_at === "string" && Number.isFinite(Date.parse(native.observed_at)) ? native.observed_at : new Date().toISOString();
|
|
291
|
+
refusal = refusalObservation(failure, ordinal - 1, observedAt);
|
|
292
|
+
if (!input.atomicIntent)
|
|
293
|
+
input.retainFailure?.(operationId, refusal);
|
|
294
|
+
refusals.push(refusal);
|
|
295
|
+
}
|
|
296
|
+
const burst = overloadBurst(refusals);
|
|
297
|
+
if (burst) {
|
|
298
|
+
if (input.atomicIntent)
|
|
299
|
+
input.retainFailure?.(operationId, refusal);
|
|
300
|
+
throw new AppError("provider_overload_burst", "Two consecutive continuation Turns were overloaded within two minutes", 1, { ...burst, root_operation_id: rootId, provider_session_id: input.sessionId, continuation_count: ordinal - 1, primary_error: failure });
|
|
301
|
+
}
|
|
302
|
+
const nextId = `${rootId}:capacity:${ordinal}:session.prompt`;
|
|
303
|
+
const existing = history.find(item => item.operation_id === nextId);
|
|
304
|
+
if (existing && (existing.predecessor !== operationId || existing.turn_id !== turnId || existing.prompt_sha256 !== promptSha || existing.ordinal !== ordinal))
|
|
305
|
+
throw error;
|
|
306
|
+
const wait = existing ? Math.max(0, Date.parse(existing.not_before) - Date.now()) : capacityDelay(failure, ordinal);
|
|
307
|
+
if (!Number.isFinite(wait) || Date.now() + wait > 8.64e15 || input.deadline !== undefined && Date.now() + wait >= input.deadline) {
|
|
308
|
+
if (input.atomicIntent)
|
|
309
|
+
input.retainFailure?.(operationId, refusal);
|
|
310
|
+
throw new AppError("capacity_owner_deadline_exceeded", "Continuation wait exceeds its original owner deadline", 1, { primary_error: failure, deadline: input.deadline ?? null });
|
|
311
|
+
}
|
|
312
|
+
if (!existing) {
|
|
313
|
+
const intent = { predecessor: operationId, operation_id: nextId, turn_id: turnId, ordinal, prompt_sha256: promptSha, not_before: new Date(Date.now() + wait).toISOString(), policy: CAPACITY_POLICY, root_operation_id: rootId, session_id: input.sessionId, deadline: input.deadline ?? null, refusal };
|
|
314
|
+
input.retainIntent(intent);
|
|
315
|
+
history.push(intent);
|
|
316
|
+
}
|
|
317
|
+
// Intent/refusal are durable before the first wait; no permit or writer is
|
|
318
|
+
// held here, and live siblings are never cancelled as a settlement proof.
|
|
319
|
+
const waitForOwnedChildren = async (initial) => {
|
|
320
|
+
let current = initial;
|
|
321
|
+
while (current === "owned_children_live") {
|
|
322
|
+
await delay(250, undefined, { signal: input.signal });
|
|
323
|
+
const boundary = await decide();
|
|
324
|
+
if (boundary)
|
|
325
|
+
return boundary;
|
|
326
|
+
current = await readiness();
|
|
327
|
+
}
|
|
328
|
+
if (current !== "ready")
|
|
329
|
+
throw blocked("Owned native child readiness became unproven");
|
|
330
|
+
return null;
|
|
331
|
+
};
|
|
332
|
+
const childBoundary = await waitForOwnedChildren(ready);
|
|
333
|
+
if (childBoundary)
|
|
334
|
+
return childBoundary;
|
|
335
|
+
// Node timers truncate large delays. Bounded slices preserve cancellation
|
|
336
|
+
// and owner checks; monotonic elapsed time does not renew a Retry-After.
|
|
337
|
+
const until = performance.now() + Math.max(0, Date.parse(history.find(item => item.operation_id === nextId).not_before) - Date.now());
|
|
338
|
+
while (performance.now() < until) {
|
|
339
|
+
await delay(Math.min(250, Math.max(0, until - performance.now())), undefined, { signal: input.signal });
|
|
340
|
+
const boundary = await decide();
|
|
341
|
+
if (boundary)
|
|
342
|
+
return boundary;
|
|
343
|
+
}
|
|
344
|
+
const afterWait = await decide();
|
|
345
|
+
if (afterWait)
|
|
346
|
+
return afterWait;
|
|
347
|
+
const refreshedBoundary = await waitForOwnedChildren(await readiness());
|
|
348
|
+
if (refreshedBoundary)
|
|
349
|
+
return refreshedBoundary;
|
|
350
|
+
const beforeDispatch = await decide();
|
|
351
|
+
if (beforeDispatch)
|
|
352
|
+
return beforeDispatch;
|
|
353
|
+
try {
|
|
354
|
+
return await observe(() => input.prompt(nextId, text, ordinal), nextId);
|
|
355
|
+
}
|
|
356
|
+
catch (nextError) {
|
|
357
|
+
// A task can complete/pause while the daemon queues for its permit.
|
|
358
|
+
// Admission then refuses the stale prompt; accept that owner decision
|
|
359
|
+
// before treating the transport's rejection as another provider failure.
|
|
360
|
+
const finished = await decide(nextId);
|
|
361
|
+
if (finished)
|
|
362
|
+
return finished;
|
|
363
|
+
error = nextError;
|
|
364
|
+
operationId = nextId;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { callDaemon } from "../harness-runtime/lib/dd-codex-daemon.mjs";
|
|
3
|
+
import { AppError } from "../shared/errors.js";
|
|
4
|
+
import { commandOption, lifecycleCommandFromPayload, parseLifecycleCommand, continuationCommand } from "./lifecycle-command.js";
|
|
5
|
+
/** The hook asks the existing daemon about native evidence; it cannot mint it. */
|
|
6
|
+
export async function verifyCodexHookDelivery(env, payload) {
|
|
7
|
+
const command = lifecycleCommandFromPayload(payload);
|
|
8
|
+
const parsed = command ? parseLifecycleCommand(command) : { kind: "none", participation: "none" };
|
|
9
|
+
if (parsed.kind === "none" && !["lifecycle", "auxiliary"].includes(parsed.participation) && !(command && continuationCommand(command)))
|
|
10
|
+
return undefined;
|
|
11
|
+
const managed = (parsed.kind !== "none" && commandOption(parsed.invocation, "invocation-id")) || env.DD_FLOW_DAEMON_ID;
|
|
12
|
+
if (!managed)
|
|
13
|
+
return undefined; // Explicit legacy/unmanaged transport.
|
|
14
|
+
if (!env.DD_FLOW_CODEX_STATE_DIR || !env.DD_FLOW_DAEMON_ID)
|
|
15
|
+
throw new AppError("native_hook_unproven", "Managed hook has no owning native daemon", 1, { effect: "no_effect" });
|
|
16
|
+
const deadline = Number(env.DD_FLOW_HOOK_DEADLINE_AT);
|
|
17
|
+
const remaining = Number.isFinite(deadline) && deadline > 0 ? deadline - Date.now() : 5000;
|
|
18
|
+
if (remaining <= 0)
|
|
19
|
+
throw new AppError("native_hook_timeout", "Native hook deadline expired before delivery verification", 1, { phase: "verification", effect: "no_effect", recoverable: false });
|
|
20
|
+
const proof = await callDaemon(env.DD_FLOW_CODEX_STATE_DIR, "hook.verify", {
|
|
21
|
+
daemonId: env.DD_FLOW_DAEMON_ID, rootSessionId: payload.session_id,
|
|
22
|
+
sessionId: payload.agent_id ?? payload.session_id, toolCallId: payload.tool_use_id, turnId: payload.turn_id,
|
|
23
|
+
// The daemon verifies the native delivery before retaining it; the source
|
|
24
|
+
// command cannot itself grant admission to the CLI.
|
|
25
|
+
nativePayload: payload, nativeCommand: command
|
|
26
|
+
}, Math.min(5000, remaining));
|
|
27
|
+
if (typeof proof.projectRoot !== "string"
|
|
28
|
+
|| typeof proof.ddFlowHome !== "string" || !env.DD_FLOW_HOME || path.resolve(env.DD_FLOW_HOME) !== path.resolve(proof.ddFlowHome)
|
|
29
|
+
|| proof.daemonId !== env.DD_FLOW_DAEMON_ID || typeof proof.rootSessionId !== "string" || typeof proof.sessionId !== "string"
|
|
30
|
+
|| typeof proof.toolCallId !== "string" || !(proof.parentSessionId === null || typeof proof.parentSessionId === "string")) {
|
|
31
|
+
throw new AppError("native_hook_unproven", "Native hook proof differs from the requested project/runtime", 1, { effect: "no_effect" });
|
|
32
|
+
}
|
|
33
|
+
const binding = proof.nativeHookBinding;
|
|
34
|
+
const retained = binding && typeof binding === "object" && !Array.isArray(binding) ? binding : null;
|
|
35
|
+
return { daemonId: proof.daemonId, rootSessionId: proof.rootSessionId, sessionId: proof.sessionId,
|
|
36
|
+
parentSessionId: proof.parentSessionId, toolCallId: proof.toolCallId, projectRoot: proof.projectRoot, command: command,
|
|
37
|
+
...(retained?.schema_id === "dd-flow/hook-request@1" && retained.source_harness === "codex-desktop"
|
|
38
|
+
&& retained.daemon_id === proof.daemonId && retained.root_provider_session_id === proof.rootSessionId
|
|
39
|
+
&& retained.provider_session_id === proof.sessionId && retained.tool_call_id === proof.toolCallId
|
|
40
|
+
&& retained.native_command === command && typeof retained.request_id === "string" ? { nativeHookBinding: retained } : {}) };
|
|
41
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { commandInputs, physicalPathOptions } from "../cli/command-inputs.js";
|
|
3
|
+
import { parseCommandArgs } from "./lifecycle-command.js";
|
|
4
|
+
import { assertPathWithin, canonicalPath } from "../storage/paths.js";
|
|
5
|
+
import { AppError } from "../shared/errors.js";
|
|
6
|
+
import { resolveWorkReference } from "../storage/work-references.js";
|
|
7
|
+
export function normalizedPathAlias(value) {
|
|
8
|
+
return value.replace(/^\\+(?=@(?:project|workspace|run)(?:\/|$))/, "");
|
|
9
|
+
}
|
|
10
|
+
export function resolveContextualPaths(args, options, roots) {
|
|
11
|
+
const resolve = (option, original) => {
|
|
12
|
+
if (!options.has(option))
|
|
13
|
+
return original;
|
|
14
|
+
const value = normalizedPathAlias(original);
|
|
15
|
+
if (!value.startsWith("@"))
|
|
16
|
+
return value;
|
|
17
|
+
const match = /^@(project|workspace|run)(?:\/(.*))?$/.exec(value);
|
|
18
|
+
if (!match || !roots[match[1]])
|
|
19
|
+
throw new AppError("usage", `Unknown or unavailable path alias: ${value}`, 2, { phase: "prepare", effect: "no_effect", recoverable: true, parameter: option });
|
|
20
|
+
const root = roots[match[1]];
|
|
21
|
+
return assertPathWithin(root, path.join(root, match[2] ?? ""), `${match[1]}_alias`);
|
|
22
|
+
};
|
|
23
|
+
return args.map((value, index) => {
|
|
24
|
+
const equal = /^--([^=]+)=(.*)$/s.exec(value);
|
|
25
|
+
if (equal)
|
|
26
|
+
return `--${equal[1]}=${resolve(equal[1], equal[2])}`;
|
|
27
|
+
const option = args[index - 1]?.match(/^--([^=]+)$/)?.[1];
|
|
28
|
+
return option ? resolve(option, value) : value;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/** Contextual paths are route semantics, not lifecycle invocation authority. */
|
|
32
|
+
export function resolveCommandProjectRoot(context, args, explicit) {
|
|
33
|
+
if (explicit && !normalizedPathAlias(explicit).startsWith("@"))
|
|
34
|
+
return canonicalPath(explicit, false);
|
|
35
|
+
if (!context.db.get("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'runs'"))
|
|
36
|
+
return null;
|
|
37
|
+
const parsed = parseCommandArgs(args);
|
|
38
|
+
const key = Object.keys(commandInputs).filter(key => key.split(" ").every((part, i) => parsed.positional[i] === part)).sort((a, b) => b.length - a.length)[0];
|
|
39
|
+
const reference = parsed.options.get("run")?.[0] ?? (key?.startsWith("stage ") ? parsed.positional[key.split(" ").length] : undefined);
|
|
40
|
+
if (reference) {
|
|
41
|
+
const rows = context.db.all("SELECT project_root FROM runs WHERE id = ? OR short_id = ?", [reference, reference]);
|
|
42
|
+
if (rows.length === 1)
|
|
43
|
+
return rows[0].project_root;
|
|
44
|
+
if (rows.length > 1)
|
|
45
|
+
throw new AppError("usage", "RUN reference requires an explicit project scope", 2, { phase: "prepare", effect: "no_effect" });
|
|
46
|
+
}
|
|
47
|
+
const work = parsed.options.get("parent")?.[0] ?? (key?.startsWith("work ") && !key.startsWith("work repair") ? parsed.positional[key.split(" ").length] : undefined);
|
|
48
|
+
if (work) {
|
|
49
|
+
const resolved = resolveWorkReference(context, work);
|
|
50
|
+
return context.db.get("SELECT root FROM projects WHERE id = ?", [resolved.project_id])?.root ?? null;
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
export function resolveCommandPaths(context, args, projectRoot) {
|
|
55
|
+
const parsed = parseCommandArgs(args);
|
|
56
|
+
const key = Object.keys(commandInputs).filter(key => key.split(" ").every((part, i) => parsed.positional[i] === part)).sort((a, b) => b.length - a.length)[0];
|
|
57
|
+
const options = new Set(key ? commandInputs[key]?.contextualPaths ?? [] : []);
|
|
58
|
+
if (!args.some(value => /(?:^|=)\\*@/.test(value)))
|
|
59
|
+
return args;
|
|
60
|
+
for (const [option, values] of parsed.options) {
|
|
61
|
+
if (physicalPathOptions.has(option) && !options.has(option) && values.some(value => normalizedPathAlias(value).startsWith("@")))
|
|
62
|
+
throw new AppError("usage", `--${option} requires a physical path on this route`, 2, { phase: "prepare", effect: "no_effect", recoverable: true, parameter: option });
|
|
63
|
+
}
|
|
64
|
+
const project = projectRoot ? context.db.get("SELECT id FROM projects WHERE root = ?", [projectRoot]) : undefined;
|
|
65
|
+
const reference = parsed.options.get("run")?.[0] ?? (key?.startsWith("stage ") ? parsed.positional[key.split(" ").length] : undefined);
|
|
66
|
+
let run;
|
|
67
|
+
if (reference && project) {
|
|
68
|
+
const rows = context.db.all("SELECT id, workspace_root, run_root FROM runs WHERE project_id = ? AND (id = ? OR short_id = ?)", [project.id, reference, reference]);
|
|
69
|
+
if (rows.length !== 1)
|
|
70
|
+
throw new AppError("usage", "Path aliases require one RUN in the selected project", 2, { phase: "prepare", effect: "no_effect" });
|
|
71
|
+
run = rows[0];
|
|
72
|
+
}
|
|
73
|
+
const work = parsed.options.get("parent")?.[0] ?? (key?.startsWith("work ") && !key.startsWith("work repair") ? parsed.positional[key.split(" ").length] : undefined);
|
|
74
|
+
if (work && project) {
|
|
75
|
+
const resolved = resolveWorkReference(context, work, { projectId: project.id, ...(run ? { runId: run.id } : {}) });
|
|
76
|
+
if (!run)
|
|
77
|
+
run = context.db.get("SELECT id, workspace_root, run_root FROM runs WHERE project_id = ? AND id = ?", [project.id, resolved.run_id]);
|
|
78
|
+
}
|
|
79
|
+
return resolveContextualPaths(args, options, { project: projectRoot, workspace: run?.workspace_root, run: run?.run_root });
|
|
80
|
+
}
|
|
@@ -1,17 +1,30 @@
|
|
|
1
1
|
import { AppError } from "../shared/errors.js";
|
|
2
2
|
import { getCliBuildInfo } from "./build-info.js";
|
|
3
3
|
import { classifyCliOperation } from "./cli-operation-classifier.js";
|
|
4
|
-
import {
|
|
5
|
-
export function preflightCliCompatibility(context, args, env = process.env, resolvedProjectRoot) {
|
|
4
|
+
import { parseCommandArgs } from "./lifecycle-command.js";
|
|
5
|
+
export async function preflightCliCompatibility(context, args, env = process.env, resolvedProjectRoot) {
|
|
6
6
|
const classification = classifyCliOperation(args, env);
|
|
7
7
|
if (classification.mode === "router_native") {
|
|
8
8
|
return { ok: true, classification, compatibility: null };
|
|
9
9
|
}
|
|
10
|
+
// Internal scope-free ownership maintenance has no project compatibility
|
|
11
|
+
// work. Keep the engine/protocol/canon graph out of that cold path.
|
|
12
|
+
const parsed = parseCommandArgs(args);
|
|
13
|
+
if (resolvedProjectRoot === null && parsed.positional[0] === "runtime" && parsed.positional[1] === "process"
|
|
14
|
+
&& !parsed.options.has("project-root") && !parsed.options.has("root"))
|
|
15
|
+
return { ok: true, classification, compatibility: null };
|
|
16
|
+
const { resolveOperationProjectRoot, selectEngine, selectBoundExecutingEngine } = await import("./engines.js");
|
|
10
17
|
const projectRoot = resolvedProjectRoot ?? resolveOperationProjectRoot(context, args);
|
|
11
18
|
if (!projectRoot) {
|
|
12
19
|
return { ok: true, classification, compatibility: null };
|
|
13
20
|
}
|
|
14
|
-
|
|
21
|
+
// Compatibility checks the executing build/manifest identity. Routing and
|
|
22
|
+
// binding validate snapshot bytes before dispatch; maintenance must not
|
|
23
|
+
// rehash the dependency closure or spawn health probes on every lease ACK.
|
|
24
|
+
// Read-only probes may intentionally inspect a copied RUN before its new
|
|
25
|
+
// executor is bound. Writer authority is neither required nor granted here.
|
|
26
|
+
const selection = (classification.mode === "read_only_diagnostics" ? null : selectBoundExecutingEngine(context, args, projectRoot, env))
|
|
27
|
+
?? selectEngine(context, { projectRoot, env }, { allowCurrentInProcess: true, verifyCurrentContent: false }, classification);
|
|
15
28
|
const compatibility = compatibilityReport(selection, classification);
|
|
16
29
|
if (classification.mode === "read_only_diagnostics" || classification.mode === "mb_upgrade") {
|
|
17
30
|
return { ok: true, classification, compatibility };
|
package/dist/services/config.js
CHANGED
|
@@ -28,7 +28,8 @@ export function getProjectConfigStatus(context, project) {
|
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
30
|
export function setProjectConfigValue(context, project, input) {
|
|
31
|
-
const value =
|
|
31
|
+
const value = prepareProjectConfigValue(input.key, input.value);
|
|
32
|
+
migrateLegacyConfig(context, project.id);
|
|
32
33
|
const now = context.now();
|
|
33
34
|
context.db.run(`INSERT INTO project_config (project_id, key, value_json, created_at, updated_at)
|
|
34
35
|
VALUES (?, ?, ?, ?, ?)
|
|
@@ -38,13 +39,15 @@ export function setProjectConfigValue(context, project, input) {
|
|
|
38
39
|
return getProjectConfigStatus(context, project);
|
|
39
40
|
}
|
|
40
41
|
export function readProjectConfig(context, projectId) {
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
migrateLegacyConfig(context, projectId);
|
|
42
|
+
// Project legacy values without changing storage. Explicit writes migrate
|
|
43
|
+
// them; a canonical override always wins over its legacy alias.
|
|
44
|
+
const rows = configOverrides(context, projectId), keys = new Set(rows.map(row => row.key));
|
|
45
45
|
const config = structuredClone(defaultProjectConfig);
|
|
46
|
-
for (const row of
|
|
47
|
-
|
|
46
|
+
for (const row of rows) {
|
|
47
|
+
const key = legacyConfigKey(row.key);
|
|
48
|
+
if (key !== row.key && keys.has(key))
|
|
49
|
+
continue;
|
|
50
|
+
applyConfigValue(config, key, JSON.parse(row.value_json));
|
|
48
51
|
}
|
|
49
52
|
return config;
|
|
50
53
|
}
|
|
@@ -89,7 +92,7 @@ export function globalDashboardHtmlPath(context) {
|
|
|
89
92
|
function configOverrides(context, projectId) {
|
|
90
93
|
return context.db.all("SELECT key, value_json, updated_at FROM project_config WHERE project_id = ? ORDER BY key ASC", [projectId]);
|
|
91
94
|
}
|
|
92
|
-
function
|
|
95
|
+
export function prepareProjectConfigValue(key, value) {
|
|
93
96
|
if (key === "integrations.cmux.mode") {
|
|
94
97
|
if (!cmuxModes.includes(value)) {
|
|
95
98
|
throw new AppError("validation", "--value for integrations.cmux.mode must be off, auto, or required", 2);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AppError } from "../shared/errors.js";
|
|
2
|
+
import { applicableLifecycleRejection } from "./lifecycle-invocations.js";
|
|
3
|
+
import { stageAttempt } from "./stage-work-graph.js";
|
|
4
|
+
/** Only the settled coordinator turn can explain a repeated continuation.
|
|
5
|
+
* A stale error from another stage/turn or an error followed by success is not
|
|
6
|
+
* authority. Never inspect the assistant's prose for this decision. */
|
|
7
|
+
export function assertNoCorrelatedRejection(context, scope) {
|
|
8
|
+
const rows = context.db.all(`SELECT event_key, outcome_json FROM hook_events
|
|
9
|
+
WHERE project_id = ? AND json_extract(outcome_json, '$.run_id') = ?
|
|
10
|
+
AND json_extract(outcome_json, '$.generation') = ? AND json_extract(outcome_json, '$.stage') = ?
|
|
11
|
+
AND json_extract(outcome_json, '$.controller_turn') = ? AND json_extract(outcome_json, '$.attempt') = ? ORDER BY id`, [scope.projectId, scope.runId, scope.generation, scope.stage, scope.turn, stageAttempt(context, scope.projectId, scope.runId, scope.stage)]);
|
|
12
|
+
const latest = new Map();
|
|
13
|
+
for (const row of rows) {
|
|
14
|
+
const value = { ...JSON.parse(row.outcome_json), event_key: row.event_key };
|
|
15
|
+
const invocationId = context.db.get("SELECT 1 FROM sqlite_master WHERE name='lifecycle_invocations'")
|
|
16
|
+
? context.db.get("SELECT id FROM lifecycle_invocations WHERE event_key=?", [row.event_key])?.id : undefined;
|
|
17
|
+
latest.set(invocationId ?? JSON.stringify([value.operation, value.session_id ?? null, value.correlation_key ?? value.fingerprint ?? value.work_id ?? null, value.attempt ?? null]), value);
|
|
18
|
+
}
|
|
19
|
+
for (const value of latest.values())
|
|
20
|
+
if (value.error) {
|
|
21
|
+
const failure = applicableLifecycleRejection(context, value.error, scope, { eventKey: value.event_key });
|
|
22
|
+
if (failure)
|
|
23
|
+
throw new AppError(failure.code, failure.message, 1, { ...failure.details, operation: value.operation, hook_event_id: value.hook_event_id, continuation_scope: scope });
|
|
24
|
+
}
|
|
25
|
+
}
|