@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.
Files changed (557) hide show
  1. package/CHANGELOG.md +895 -0
  2. package/README.md +140 -6
  3. package/dist/build-info.json +8 -8
  4. package/dist/cli/argument-values.js +38 -0
  5. package/dist/cli/command-inputs.js +386 -0
  6. package/dist/cli/command-metadata.js +232 -0
  7. package/dist/cli/command-option-descriptions.js +192 -0
  8. package/dist/cli/completion-cli.js +70 -0
  9. package/dist/cli/completion.js +57 -0
  10. package/dist/cli/diagnostic-invocation.js +46 -0
  11. package/dist/cli/diagnostic.js +120 -0
  12. package/dist/cli/error-output.js +52 -0
  13. package/dist/cli/executor-onboarding.js +76 -0
  14. package/dist/cli/flows.js +29 -0
  15. package/dist/cli/harnesses.js +84 -0
  16. package/dist/cli/help.js +396 -19
  17. package/dist/cli/hook-ingress.js +102 -0
  18. package/dist/cli/input-preparation.js +165 -0
  19. package/dist/cli/memory-flow-admission.js +50 -0
  20. package/dist/cli/memory-init-invocation.js +85 -0
  21. package/dist/cli/memory-init.js +249 -0
  22. package/dist/cli/memory-storage-admission.js +54 -0
  23. package/dist/cli/memory-storage-qualification.js +105 -0
  24. package/dist/cli/memory-storage-transition.js +123 -0
  25. package/dist/cli/memory-upgrade.js +189 -0
  26. package/dist/cli/models.js +39 -0
  27. package/dist/cli/native-hook-ingress.js +90 -0
  28. package/dist/cli/native-hook-preparation.js +55 -0
  29. package/dist/cli/operator-profiles.js +61 -0
  30. package/dist/cli/output-options.js +35 -0
  31. package/dist/cli/response-file.js +72 -0
  32. package/dist/cli/run-cli.js +1734 -550
  33. package/dist/cli/runtime-maintenance-diagnostics.js +46 -0
  34. package/dist/cli/runtime-maintenance-ingress.js +52 -0
  35. package/dist/cli/runtime-process.js +153 -0
  36. package/dist/cli/setup.js +150 -0
  37. package/dist/cli.js +89 -2
  38. package/dist/domain/diagnostic-aspects.js +103 -0
  39. package/dist/domain/diagnostic-flows.js +8 -0
  40. package/dist/domain/stage-catalog.js +1 -1
  41. package/dist/domain/stage-handler-identities.js +28 -0
  42. package/dist/harness-runtime/DD-ZCODE.md +112 -0
  43. package/dist/harness-runtime/OPENCODE-LICENSE.txt +24 -0
  44. package/dist/harness-runtime/bin/dd-agy.mjs +56 -0
  45. package/dist/harness-runtime/bin/dd-codex.mjs +27 -0
  46. package/dist/harness-runtime/bin/dd-droid.mjs +34 -0
  47. package/dist/harness-runtime/bin/dd-grok.mjs +40 -0
  48. package/dist/harness-runtime/bin/dd-opencode.mjs +22 -0
  49. package/dist/harness-runtime/bin/dd-zcode.mjs +87 -0
  50. package/dist/harness-runtime/lib/adapter-timeouts.d.mts +5 -0
  51. package/dist/harness-runtime/lib/adapter-timeouts.mjs +34 -0
  52. package/dist/harness-runtime/lib/agy-error-boundary.mjs +58 -0
  53. package/dist/harness-runtime/lib/agy-hooks.d.mts +1 -0
  54. package/dist/harness-runtime/lib/agy-hooks.mjs +9 -0
  55. package/dist/harness-runtime/lib/agy-native-inspection.mjs +216 -0
  56. package/dist/harness-runtime/lib/agy-native_pb.js +117 -0
  57. package/dist/harness-runtime/lib/daemon-observation.d.mts +2 -0
  58. package/dist/harness-runtime/lib/daemon-observation.mjs +163 -0
  59. package/dist/harness-runtime/lib/daemon-operations.d.mts +2 -0
  60. package/dist/harness-runtime/lib/daemon-operations.mjs +462 -0
  61. package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +6 -0
  62. package/dist/harness-runtime/lib/dd-agy-daemon.mjs +1096 -0
  63. package/dist/harness-runtime/lib/dd-agy.mjs +86 -0
  64. package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
  65. package/dist/harness-runtime/lib/dd-codex-daemon.mjs +231 -0
  66. package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
  67. package/dist/harness-runtime/lib/dd-codex.mjs +954 -0
  68. package/dist/harness-runtime/lib/dd-droid-daemon.mjs +141 -0
  69. package/dist/harness-runtime/lib/dd-droid.mjs +626 -0
  70. package/dist/harness-runtime/lib/dd-grok-daemon.mjs +555 -0
  71. package/dist/harness-runtime/lib/dd-grok.mjs +180 -0
  72. package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +622 -0
  73. package/dist/harness-runtime/lib/dd-opencode.mjs +390 -0
  74. package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +752 -0
  75. package/dist/harness-runtime/lib/dd-zcode.mjs +1175 -0
  76. package/dist/harness-runtime/lib/delegation-instructions.d.mts +14 -0
  77. package/dist/harness-runtime/lib/delegation-instructions.mjs +157 -0
  78. package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
  79. package/dist/harness-runtime/lib/driver-recovery.mjs +140 -0
  80. package/dist/harness-runtime/lib/droid-observation.mjs +66 -0
  81. package/dist/harness-runtime/lib/entity-references.d.mts +2 -0
  82. package/dist/harness-runtime/lib/entity-references.mjs +9 -0
  83. package/dist/harness-runtime/lib/lease-renewal.d.mts +8 -0
  84. package/dist/harness-runtime/lib/lease-renewal.mjs +37 -0
  85. package/dist/harness-runtime/lib/lifecycle-command.d.mts +20 -0
  86. package/dist/harness-runtime/lib/lifecycle-command.mjs +273 -0
  87. package/dist/harness-runtime/lib/lifecycle-contract.d.mts +10 -0
  88. package/dist/harness-runtime/lib/lifecycle-contract.mjs +19 -0
  89. package/dist/harness-runtime/lib/managed-daemon.d.mts +16 -0
  90. package/dist/harness-runtime/lib/managed-daemon.mjs +698 -0
  91. package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
  92. package/dist/harness-runtime/lib/model-observations.mjs +101 -0
  93. package/dist/harness-runtime/lib/native-children.d.mts +23 -0
  94. package/dist/harness-runtime/lib/native-children.mjs +219 -0
  95. package/dist/harness-runtime/lib/native-hook-command.d.mts +7 -0
  96. package/dist/harness-runtime/lib/native-hook-command.mjs +251 -0
  97. package/dist/harness-runtime/lib/native-request-proof.d.mts +2 -0
  98. package/dist/harness-runtime/lib/native-request-proof.mjs +65 -0
  99. package/dist/harness-runtime/lib/native-streams.mjs +45 -0
  100. package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
  101. package/dist/harness-runtime/lib/observation-clock.mjs +95 -0
  102. package/dist/harness-runtime/lib/opencode-plugin.mjs +85 -0
  103. package/dist/harness-runtime/lib/operation-context.mjs +5 -0
  104. package/dist/harness-runtime/lib/operation-errors.d.mts +16 -0
  105. package/dist/harness-runtime/lib/operation-errors.mjs +127 -0
  106. package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
  107. package/dist/harness-runtime/lib/operation-progress.mjs +114 -0
  108. package/dist/harness-runtime/lib/process-json.d.mts +5 -0
  109. package/dist/harness-runtime/lib/process-json.mjs +201 -0
  110. package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
  111. package/dist/harness-runtime/lib/provider-overload-policy.d.mts +15 -0
  112. package/dist/harness-runtime/lib/provider-overload-policy.mjs +151 -0
  113. package/dist/harness-runtime/lib/runner-events.mjs +202 -0
  114. package/dist/harness-runtime/lib/runner-lock.mjs +42 -0
  115. package/dist/harness-runtime/lib/session-settlement.mjs +30 -0
  116. package/dist/harness-runtime/lib/setup-progress.d.mts +9 -0
  117. package/dist/harness-runtime/lib/setup-progress.mjs +53 -0
  118. package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
  119. package/dist/harness-runtime/lib/tool-observations.mjs +228 -0
  120. package/dist/harness-runtime/lib/zcode-usage.mjs +55 -0
  121. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-1y4a697q.js +81 -0
  122. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-2ny4vxct.js +92 -0
  123. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-6mptkzbc.js +0 -0
  124. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-7x67cf1q.js +52 -0
  125. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9rqn6x4v.js +16 -0
  126. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9vdz0zwn.js +1661 -0
  127. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ecs5ftka.js +1466 -0
  128. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-frbwqjmf.js +145 -0
  129. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gne7h7mq.js +50 -0
  130. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gx9wnkzr.js +105 -0
  131. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-m2eywc8w.js +0 -0
  132. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-nwcpakzx.js +12 -0
  133. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-q4g3afnw.js +623 -0
  134. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-qav6mfdz.js +0 -0
  135. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-sxt88q69.js +12 -0
  136. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-t1xa31vm.js +39 -0
  137. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ve4aws36.js +103 -0
  138. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vmytr4q8.js +4 -0
  139. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vt9jbch8.js +36 -0
  140. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vyas3vgt.js +0 -0
  141. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-wjyeq25y.js +30 -0
  142. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-xgnj2w4v.js +20 -0
  143. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-y2etg5bs.js +9 -0
  144. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ydhz1zrh.js +238 -0
  145. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-z6qdwcsf.js +62 -0
  146. package/dist/harness-runtime/vendor/opencode-client/contract.d.ts +1 -0
  147. package/dist/harness-runtime/vendor/opencode-client/contract.js +12 -0
  148. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.d.ts +2806 -0
  149. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.js +0 -0
  150. package/dist/harness-runtime/vendor/opencode-client/effect/api.d.ts +4 -0
  151. package/dist/harness-runtime/vendor/opencode-client/effect/api.js +0 -0
  152. package/dist/harness-runtime/vendor/opencode-client/effect/client.d.ts +2530 -0
  153. package/dist/harness-runtime/vendor/opencode-client/effect/client.js +15 -0
  154. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.d.ts +7 -0
  155. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.js +6 -0
  156. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.d.ts +2529 -0
  157. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.js +8 -0
  158. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.d.ts +2 -0
  159. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.js +12 -0
  160. package/dist/harness-runtime/vendor/opencode-client/effect/index.d.ts +35 -0
  161. package/dist/harness-runtime/vendor/opencode-client/effect/index.js +75 -0
  162. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.d.ts +20 -0
  163. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.js +11 -0
  164. package/dist/harness-runtime/vendor/opencode-client/effect/service.d.ts +90 -0
  165. package/dist/harness-runtime/vendor/opencode-client/effect/service.js +187 -0
  166. package/dist/harness-runtime/vendor/opencode-client/package.json +84 -0
  167. package/dist/harness-runtime/vendor/opencode-client/promise/api.d.ts +21 -0
  168. package/dist/harness-runtime/vendor/opencode-client/promise/api.js +0 -0
  169. package/dist/harness-runtime/vendor/opencode-client/promise/client.d.ts +252 -0
  170. package/dist/harness-runtime/vendor/opencode-client/promise/client.js +14 -0
  171. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.d.ts +8 -0
  172. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.js +6 -0
  173. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.d.ts +259 -0
  174. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.js +7 -0
  175. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.d.ts +3 -0
  176. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.js +79 -0
  177. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.d.ts +8932 -0
  178. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.js +70 -0
  179. package/dist/harness-runtime/vendor/opencode-client/promise/index.d.ts +6 -0
  180. package/dist/harness-runtime/vendor/opencode-client/promise/index.js +83 -0
  181. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.d.ts +32 -0
  182. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.js +7 -0
  183. package/dist/harness-runtime/vendor/opencode-client/promise/service.d.ts +24 -0
  184. package/dist/harness-runtime/vendor/opencode-client/promise/service.js +187 -0
  185. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.d.ts +12 -0
  186. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.js +14 -0
  187. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.d.ts +20 -0
  188. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.js +14 -0
  189. package/dist/harness-runtime/vendor/opencode-client/service-contender.d.ts +37 -0
  190. package/dist/harness-runtime/vendor/opencode-client/service-contender.js +10 -0
  191. package/dist/harness-runtime/vendor/opencode-client/service-probe.d.ts +70 -0
  192. package/dist/harness-runtime/vendor/opencode-client/service-probe.js +16 -0
  193. package/dist/harness-runtime/vendor/opencode-client/service-timing.d.ts +12 -0
  194. package/dist/harness-runtime/vendor/opencode-client/service-timing.js +10 -0
  195. package/dist/harness-runtime/vendor/opencode-client/service-version.d.ts +2 -0
  196. package/dist/harness-runtime/vendor/opencode-client/service-version.js +6 -0
  197. package/dist/harness-runtime/vendor/opencode-client/service.d.ts +52 -0
  198. package/dist/harness-runtime/vendor/opencode-client/service.js +1 -0
  199. package/dist/harness-runtime/vendor/opencode-client/shared-events.d.ts +11 -0
  200. package/dist/harness-runtime/vendor/opencode-client/shared-events.js +8 -0
  201. package/dist/harness-runtime/vendor/opencode-client/solid/connection.d.ts +37 -0
  202. package/dist/harness-runtime/vendor/opencode-client/solid/connection.js +10 -0
  203. package/dist/harness-runtime/vendor/opencode-client/solid/data.d.ts +211 -0
  204. package/dist/harness-runtime/vendor/opencode-client/solid/data.js +18 -0
  205. package/dist/harness-runtime/vendor/opencode-client/solid/index.d.ts +3 -0
  206. package/dist/harness-runtime/vendor/opencode-client/solid/index.js +32 -0
  207. package/dist/harness-runtime/vendor/opencode-client/solid/pty.d.ts +22 -0
  208. package/dist/harness-runtime/vendor/opencode-client/solid/pty.js +8 -0
  209. package/dist/harness-runtime/vendor/opencode-plugin.mjs +3 -0
  210. package/dist/protocol/local-files.js +18 -9
  211. package/dist/runtime/context.js +8 -4
  212. package/dist/schemas/agent-profile.schema.json +1 -1
  213. package/dist/schemas/code-review-decision.schema.json +9 -0
  214. package/dist/schemas/code-review-result.schema.json +1 -1
  215. package/dist/schemas/code-verification.schema.json +7 -5
  216. package/dist/schemas/code-work-batch.schema.json +2 -2
  217. package/dist/schemas/diagnostic-stage-result.schema.json +354 -0
  218. package/dist/schemas/diagnostic-work-result.schema.json +296 -0
  219. package/dist/schemas/discovery-result.schema.json +184 -0
  220. package/dist/schemas/execution-bundle.schema.json +211 -0
  221. package/dist/schemas/execution-settings.schema.json +162 -0
  222. package/dist/schemas/flow-descriptor.schema.json +54 -0
  223. package/dist/schemas/flow-run.schema.json +29 -0
  224. package/dist/schemas/harness-catalog.schema.json +80 -0
  225. package/dist/schemas/mb-init-compose-result.schema.json +457 -0
  226. package/dist/schemas/mb-init-discover-result.schema.json +500 -0
  227. package/dist/schemas/mb-init-finish-result.schema.json +422 -0
  228. package/dist/schemas/mb-init-preflight-result.schema.json +367 -0
  229. package/dist/schemas/mb-init-review-result.schema.json +396 -0
  230. package/dist/schemas/mb-init-verify-result.schema.json +391 -0
  231. package/dist/schemas/mb-upgrade-stage-result.schema.json +863 -0
  232. package/dist/schemas/memory-bootstrap-receipt-v2.schema.json +67 -0
  233. package/dist/schemas/memory-bootstrap-receipt.schema.json +354 -0
  234. package/dist/schemas/memory-composition-work-result.schema.json +38 -0
  235. package/dist/schemas/memory-repair-work-result.schema.json +56 -0
  236. package/dist/schemas/memory-review-correction-plan.schema.json +30 -0
  237. package/dist/schemas/memory-review-work-result.schema.json +43 -0
  238. package/dist/schemas/model-catalog.schema.json +153 -0
  239. package/dist/schemas/plan-review-decision.schema.json +12 -3
  240. package/dist/schemas/plan-review-result.schema.json +2 -2
  241. package/dist/schemas/profile-settings.schema.json +122 -0
  242. package/dist/schemas/project-flow-pack-manifest.schema.json +1 -1
  243. package/dist/schemas/release-impact.schema.json +3 -3
  244. package/dist/schemas/release-manifest.schema.json +291 -0
  245. package/dist/schemas/run-control-receipt.schema.json +118 -0
  246. package/dist/schemas/run-control-request.schema.json +36 -0
  247. package/dist/schemas/run-engine-binding.schema.json +1 -1
  248. package/dist/schemas/stage-start-response.schema.json +4 -0
  249. package/dist/schemas/vnext-protocol-plan.schema.json +2 -2
  250. package/dist/services/accepted-intent.js +139 -0
  251. package/dist/services/branch-context.js +3 -3
  252. package/dist/services/canon.js +54 -15
  253. package/dist/services/check-environment.js +21 -0
  254. package/dist/services/check-runner-evidence.js +562 -0
  255. package/dist/services/cleanup.js +133 -40
  256. package/dist/services/cli-operation-classifier.js +26 -63
  257. package/dist/services/cli-upgrade-allowlist.js +27 -0
  258. package/dist/services/code-checks.js +1398 -119
  259. package/dist/services/codex-hook-delivery.js +32 -0
  260. package/dist/services/command-context.js +80 -0
  261. package/dist/services/compatibility-preflight.js +16 -3
  262. package/dist/services/config.js +11 -8
  263. package/dist/services/continuation-outcome.js +20 -0
  264. package/dist/services/controller-child-capacity.js +13 -0
  265. package/dist/services/controller-child-observer.js +115 -0
  266. package/dist/services/controller-execution.js +94 -0
  267. package/dist/services/controller-fanout.js +226 -0
  268. package/dist/services/controller-memory-task.js +45 -0
  269. package/dist/services/controller-memory-worker.js +49 -0
  270. package/dist/services/dashboard.js +143 -58
  271. package/dist/services/descriptor-coordinator-session.js +35 -0
  272. package/dist/services/descriptor-root-work.js +53 -0
  273. package/dist/services/descriptor-run-settlement.js +107 -0
  274. package/dist/services/descriptor-run-start.js +475 -0
  275. package/dist/services/descriptor-stage-coordinator.js +250 -0
  276. package/dist/services/descriptor-stage-settlement.js +223 -0
  277. package/dist/services/descriptor-stage-start.js +175 -0
  278. package/dist/services/diagnostic-evidence.js +73 -0
  279. package/dist/services/diagnostic-report-publication.js +72 -0
  280. package/dist/services/diagnostic-report.js +67 -0
  281. package/dist/services/diagnostic-run-bundle.js +74 -0
  282. package/dist/services/diagnostic-snapshot.js +159 -0
  283. package/dist/services/diagnostic-stage-handlers.js +108 -0
  284. package/dist/services/diagnostic-stage-results.js +132 -0
  285. package/dist/services/diagnostic-start.js +84 -0
  286. package/dist/services/diagnostic-work-batch.js +34 -0
  287. package/dist/services/diagnostic-work-collection.js +97 -0
  288. package/dist/services/diagnostic-work-registration.js +101 -0
  289. package/dist/services/diagnostic-work-results.js +93 -0
  290. package/dist/services/discovery/agy-discovery.js +2 -0
  291. package/dist/services/discovery/codex-discovery.js +2 -0
  292. package/dist/services/discovery/droid-discovery.js +2 -0
  293. package/dist/services/discovery/grok-discovery.js +2 -0
  294. package/dist/services/discovery/opencode-discovery.js +2 -0
  295. package/dist/services/discovery/static.js +31 -0
  296. package/dist/services/discovery/zcode-discovery.js +2 -0
  297. package/dist/services/engines.js +354 -163
  298. package/dist/services/eval-snapshots.js +1316 -150
  299. package/dist/services/execution-bundles.js +275 -0
  300. package/dist/services/execution-policy.js +185 -0
  301. package/dist/services/executor-onboarding.js +56 -0
  302. package/dist/services/external-work-launch.js +310 -0
  303. package/dist/services/flow-catalog.js +30 -0
  304. package/dist/services/flow-descriptors.js +82 -0
  305. package/dist/services/frozen-engine.js +387 -0
  306. package/dist/services/generic-execution.js +164 -0
  307. package/dist/services/harness-adapter.js +355 -36
  308. package/dist/services/harness-config.js +2 -0
  309. package/dist/services/harness-discovery.js +29 -0
  310. package/dist/services/harness-doctor.js +75 -0
  311. package/dist/services/harness-probe-effects.js +51 -0
  312. package/dist/services/harness-version-probe.js +100 -0
  313. package/dist/services/hook-memory-routing.js +188 -0
  314. package/dist/services/hook-recovery-guard.js +14 -0
  315. package/dist/services/hook-session-observation.js +24 -0
  316. package/dist/services/hooks.js +791 -326
  317. package/dist/services/hybrid-contracts.js +474 -0
  318. package/dist/services/hybrid-digest.js +14 -0
  319. package/dist/services/ids.js +29 -1
  320. package/dist/services/installation-lock.js +95 -0
  321. package/dist/services/installed-flow-source.js +226 -0
  322. package/dist/services/lanes.js +78 -65
  323. package/dist/services/lifecycle-command.js +1 -288
  324. package/dist/services/lifecycle-contract.js +1 -0
  325. package/dist/services/lifecycle-invocations.js +2148 -0
  326. package/dist/services/managed-daemon-binding.js +38 -0
  327. package/dist/services/managed-lease-monitor.js +133 -0
  328. package/dist/services/managed-processes.js +449 -69
  329. package/dist/services/memory-accepted-composition.js +78 -0
  330. package/dist/services/memory-baseline-preservation.js +65 -0
  331. package/dist/services/memory-completed-correction-wave.js +328 -0
  332. package/dist/services/memory-compose-handler.js +400 -0
  333. package/dist/services/memory-composition-acceptance.js +375 -0
  334. package/dist/services/memory-composition-graph.js +165 -0
  335. package/dist/services/memory-composition-registration.js +161 -0
  336. package/dist/services/memory-composition-work-custody.js +156 -0
  337. package/dist/services/memory-composition-work-results.js +108 -0
  338. package/dist/services/memory-corrected-review-acceptance.js +129 -0
  339. package/dist/services/memory-corrected-review-batch.js +37 -0
  340. package/dist/services/memory-corrected-review-findings.js +108 -0
  341. package/dist/services/memory-corrected-review-inputs.js +215 -0
  342. package/dist/services/memory-corrected-review-projection.js +78 -0
  343. package/dist/services/memory-corrected-review-receipt.js +178 -0
  344. package/dist/services/memory-corrected-review-registration.js +192 -0
  345. package/dist/services/memory-correction-check-receipt.js +235 -0
  346. package/dist/services/memory-correction-input-owner.js +6 -0
  347. package/dist/services/memory-custody-snapshot.js +36 -0
  348. package/dist/services/memory-discover-handler.js +104 -0
  349. package/dist/services/memory-finish-evidence.js +457 -0
  350. package/dist/services/memory-finish-handler.js +229 -0
  351. package/dist/services/memory-finish-integration.js +450 -0
  352. package/dist/services/memory-finish-readiness.js +169 -0
  353. package/dist/services/memory-git-integration.js +220 -0
  354. package/dist/services/memory-historical-corrected-review.js +212 -0
  355. package/dist/services/memory-historical-original-review.js +143 -0
  356. package/dist/services/memory-historical-repair-registration.js +105 -0
  357. package/dist/services/memory-historical-second-review.js +147 -0
  358. package/dist/services/memory-init-bootstrap-readiness.js +210 -0
  359. package/dist/services/memory-init-contexts.js +131 -0
  360. package/dist/services/memory-init-controller-start.js +103 -0
  361. package/dist/services/memory-init-engine-release.js +223 -0
  362. package/dist/services/memory-init-git-policy.js +165 -0
  363. package/dist/services/memory-init-lint-capability.js +203 -0
  364. package/dist/services/memory-init-native-capacity.js +309 -0
  365. package/dist/services/memory-init-preflight.js +334 -0
  366. package/dist/services/memory-init-project-bootstrap.js +599 -0
  367. package/dist/services/memory-init-request-candidate.js +213 -0
  368. package/dist/services/memory-init-request-input.js +82 -0
  369. package/dist/services/memory-init-resource-storage.js +125 -0
  370. package/dist/services/memory-init-run-allocation.js +81 -0
  371. package/dist/services/memory-init-run-bundle.js +135 -0
  372. package/dist/services/memory-init-start.js +181 -0
  373. package/dist/services/memory-init-startup-custody.js +80 -0
  374. package/dist/services/memory-init-startup-input.js +240 -0
  375. package/dist/services/memory-init-storage.js +91 -0
  376. package/dist/services/memory-init-stores.js +359 -0
  377. package/dist/services/memory-init-worktrunk-capability.js +174 -0
  378. package/dist/services/memory-layer-publication.js +611 -0
  379. package/dist/services/memory-layer.js +221 -0
  380. package/dist/services/memory-lint-config.js +194 -0
  381. package/dist/services/memory-native-review-copy.js +103 -0
  382. package/dist/services/memory-normal-flow-entry.js +87 -0
  383. package/dist/services/memory-ordinary-defaults.js +129 -0
  384. package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
  385. package/dist/services/memory-preflight-handler.js +274 -0
  386. package/dist/services/memory-repair-current-view.js +299 -0
  387. package/dist/services/memory-repair-document-delta.js +488 -0
  388. package/dist/services/memory-repair-history.js +496 -0
  389. package/dist/services/memory-repair-physical-binding.js +194 -0
  390. package/dist/services/memory-repair-publication-files.js +152 -0
  391. package/dist/services/memory-repair-publication-intent.js +27 -0
  392. package/dist/services/memory-repair-publication-plan.js +162 -0
  393. package/dist/services/memory-repair-publication-source.js +225 -0
  394. package/dist/services/memory-repair-publication.js +795 -0
  395. package/dist/services/memory-repair-registration.js +240 -0
  396. package/dist/services/memory-repair-work-baseline.js +415 -0
  397. package/dist/services/memory-repair-work-completion.js +117 -0
  398. package/dist/services/memory-repair-work-custody.js +73 -0
  399. package/dist/services/memory-repair-work-results.js +108 -0
  400. package/dist/services/memory-repair-workspace.js +261 -0
  401. package/dist/services/memory-repair-writer-copy.js +736 -0
  402. package/dist/services/memory-result-binding.js +239 -0
  403. package/dist/services/memory-retained-review-authority.js +138 -0
  404. package/dist/services/memory-retained-review-results.js +70 -0
  405. package/dist/services/memory-retained-second-baseline.js +102 -0
  406. package/dist/services/memory-retained-second-repairs.js +162 -0
  407. package/dist/services/memory-review-acceptance.js +214 -0
  408. package/dist/services/memory-review-correction-plan.js +206 -0
  409. package/dist/services/memory-review-handler.js +585 -0
  410. package/dist/services/memory-review-inputs.js +246 -0
  411. package/dist/services/memory-review-limits.js +10 -0
  412. package/dist/services/memory-review-receipt.js +180 -0
  413. package/dist/services/memory-review-registration.js +117 -0
  414. package/dist/services/memory-review-work-custody.js +126 -0
  415. package/dist/services/memory-review-work-input.js +91 -0
  416. package/dist/services/memory-review-work-results.js +95 -0
  417. package/dist/services/memory-second-corrected-review-inputs.js +167 -0
  418. package/dist/services/memory-second-correction-plan.js +77 -0
  419. package/dist/services/memory-second-repair-baseline.js +91 -0
  420. package/dist/services/memory-second-repair-launch.js +614 -0
  421. package/dist/services/memory-second-repair-registration.js +88 -0
  422. package/dist/services/memory-second-repair-source.js +187 -0
  423. package/dist/services/memory-second-review-acceptance.js +115 -0
  424. package/dist/services/memory-source-observations.js +117 -0
  425. package/dist/services/memory-stage-dispatch.js +65 -0
  426. package/dist/services/memory-stage-results.js +290 -0
  427. package/dist/services/memory-tool-probe.js +25 -0
  428. package/dist/services/memory-upgrade-analysis-handler.js +243 -0
  429. package/dist/services/memory-upgrade-bootstrap-readiness.js +251 -0
  430. package/dist/services/memory-upgrade-evidence.js +100 -0
  431. package/dist/services/memory-upgrade-inventory.js +442 -0
  432. package/dist/services/memory-upgrade-publication-custody.js +73 -0
  433. package/dist/services/memory-upgrade-publication.js +413 -0
  434. package/dist/services/memory-upgrade-selection.js +430 -0
  435. package/dist/services/memory-upgrade-start.js +60 -0
  436. package/dist/services/memory-upgrade-storage-readiness.js +340 -0
  437. package/dist/services/memory-verification-acceptance.js +156 -0
  438. package/dist/services/memory-verification-checks.js +317 -0
  439. package/dist/services/memory-verification-receipt.js +160 -0
  440. package/dist/services/memory-verify-handler.js +137 -0
  441. package/dist/services/memory-work-result-json.js +12 -0
  442. package/dist/services/memory-work-result-preparation.js +64 -0
  443. package/dist/services/merge-queue.js +228 -149
  444. package/dist/services/merge-server.js +163 -35
  445. package/dist/services/migrations.js +164 -114
  446. package/dist/services/model-catalog.js +109 -0
  447. package/dist/services/model-discovery.js +46 -0
  448. package/dist/services/native-daemon-history.js +50 -0
  449. package/dist/services/native-session-control.js +39 -0
  450. package/dist/services/operator-profiles.js +236 -0
  451. package/dist/services/physical-startup.js +45 -0
  452. package/dist/services/plan-runtime.js +26 -11
  453. package/dist/services/plans.js +28 -25
  454. package/dist/services/project-registry.js +97 -0
  455. package/dist/services/project-summary.js +1 -1
  456. package/dist/services/projects.js +17 -87
  457. package/dist/services/prompt-delivery.js +71 -0
  458. package/dist/services/prompts.js +28 -17
  459. package/dist/services/protocols.js +163 -87
  460. package/dist/services/provider-capacity.js +455 -0
  461. package/dist/services/recovery-observation-budget.js +121 -0
  462. package/dist/services/recovery-snapshot-database.js +588 -0
  463. package/dist/services/release-archive-producer.js +52 -0
  464. package/dist/services/release-archive.js +143 -0
  465. package/dist/services/release-cache.js +150 -0
  466. package/dist/services/release-compatibility.js +18 -0
  467. package/dist/services/release-download.js +67 -0
  468. package/dist/services/release-envelope.js +104 -0
  469. package/dist/services/release-manifest.js +45 -0
  470. package/dist/services/release-payload.js +114 -0
  471. package/dist/services/release-producer.js +63 -0
  472. package/dist/services/release-provenance.js +160 -0
  473. package/dist/services/release-registry.js +66 -0
  474. package/dist/services/release-source.js +194 -0
  475. package/dist/services/repair-intents.js +31 -0
  476. package/dist/services/repair-receipt.js +13 -0
  477. package/dist/services/review-copy.js +165 -0
  478. package/dist/services/review-deferral.js +23 -0
  479. package/dist/services/run-control-receipt.js +56 -0
  480. package/dist/services/run-control-worker.js +428 -0
  481. package/dist/services/run-control.js +1092 -0
  482. package/dist/services/run-controller-adapter.js +400 -0
  483. package/dist/services/run-controller-capture.js +186 -0
  484. package/dist/services/run-controller-process.js +205 -0
  485. package/dist/services/run-controller-recovery.js +295 -0
  486. package/dist/services/run-controller-state.js +97 -0
  487. package/dist/services/run-controller.js +1326 -0
  488. package/dist/services/run-engine-bindings.js +1 -1
  489. package/dist/services/run-fork.js +147 -0
  490. package/dist/services/run-health.js +149 -0
  491. package/dist/services/run-observations.js +152 -0
  492. package/dist/services/run-projection.js +22 -64
  493. package/dist/services/run-recovery-guard.js +107 -0
  494. package/dist/services/run-recovery-runtime.js +112 -0
  495. package/dist/services/run-recovery.js +456 -0
  496. package/dist/services/run-start-custody.js +189 -0
  497. package/dist/services/runs.js +1023 -246
  498. package/dist/services/runtime-budget.js +446 -0
  499. package/dist/services/runtime-command.js +43 -0
  500. package/dist/services/runtime-scope-capture.js +52 -0
  501. package/dist/services/runtime-scope-control.js +468 -0
  502. package/dist/services/runtime-scope-resume.js +605 -0
  503. package/dist/services/runtime-scope-stop.js +211 -0
  504. package/dist/services/runtime-scope-worker.js +314 -0
  505. package/dist/services/runtime-service.js +19 -14
  506. package/dist/services/schema-validation.js +10 -8
  507. package/dist/services/scope-writer-cleanup.js +27 -0
  508. package/dist/services/sessions.js +36 -91
  509. package/dist/services/setup.js +427 -0
  510. package/dist/services/stage-blocker.js +17 -7
  511. package/dist/services/stage-context.js +193 -19
  512. package/dist/services/stage-handlers.js +89 -0
  513. package/dist/services/stage-lifecycle.js +152 -116
  514. package/dist/services/stage-pause.js +202 -91
  515. package/dist/services/stage-report-renderer.js +234 -6
  516. package/dist/services/stage-work-graph.js +52 -0
  517. package/dist/services/tooling.js +41 -30
  518. package/dist/services/usage.js +49 -101
  519. package/dist/services/verification-matrix.js +393 -0
  520. package/dist/services/version-status.js +1 -1
  521. package/dist/services/vnext-code-review.js +235 -88
  522. package/dist/services/vnext-code.js +327 -226
  523. package/dist/services/vnext-contracts.js +10 -1
  524. package/dist/services/vnext-execution-profile.js +80 -5
  525. package/dist/services/vnext-fanout.js +355 -21
  526. package/dist/services/vnext-merge.js +332 -111
  527. package/dist/services/vnext-plan-review.js +287 -132
  528. package/dist/services/vnext-plan.js +228 -104
  529. package/dist/services/vnext-protocolize.js +533 -95
  530. package/dist/services/vnext-specify.js +123 -81
  531. package/dist/services/vnext-workspace-policy.js +7 -2
  532. package/dist/services/work-registry.js +1706 -200
  533. package/dist/services/workspace-bootstrap.js +53 -15
  534. package/dist/services/workspace-files.js +85 -0
  535. package/dist/services/worktrees.js +105 -48
  536. package/dist/shared/entity-references.js +1 -0
  537. package/dist/shared/errors.js +27 -0
  538. package/dist/storage/agent-output.js +26 -0
  539. package/dist/storage/data-preservation.js +65 -0
  540. package/dist/storage/database.js +930 -40
  541. package/dist/storage/foreign-key-transaction.js +39 -0
  542. package/dist/storage/immutable-input.js +45 -0
  543. package/dist/storage/import-guard.js +159 -0
  544. package/dist/storage/memory-upgrade-schema-bootstrap.js +38 -0
  545. package/dist/storage/native-cleanup.js +52 -0
  546. package/dist/storage/paired-writer-migration.js +424 -0
  547. package/dist/storage/paths.js +17 -4
  548. package/dist/storage/projection-lock.js +73 -0
  549. package/dist/storage/work-references.js +23 -0
  550. package/dist/storage/writer-contract.js +96 -0
  551. package/dist/storage/writer-migration.js +346 -0
  552. package/dist/storage/writer-restore.js +217 -0
  553. package/package.json +50 -13
  554. package/tools/create-canon-release.mjs +33 -0
  555. package/tools/probe-codex-history.mjs +37 -0
  556. package/tools/produce-hybrid-release.mjs +41 -0
  557. package/tools/repair-paused-run-status.mjs +84 -0
@@ -0,0 +1,129 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { spawnSync } from "node:child_process";
4
+ import { isDeepStrictEqual } from "node:util";
5
+ import { AppError } from "../shared/errors.js";
6
+ import { readOperatorProfiles, resolveOperatorProfile } from "./operator-profiles.js";
7
+ import { validateVnextExecutionProfile } from "./vnext-execution-profile.js";
8
+ import { loadVnextWorkspacePolicy } from "./vnext-workspace-policy.js";
9
+ import { readMemoryInitGitPolicy } from "./memory-init-git-policy.js";
10
+ export const ordinaryConfigurationPaths = [".memory-bank/dd-flow/project-execution.json", ".memory-bank/dd-flow/project-workspace.json"];
11
+ function gitObservation(context, workspace, args) {
12
+ const env = Object.fromEntries(Object.entries(context.env ?? process.env).filter(([key]) => !key.startsWith("GIT_")));
13
+ const result = spawnSync("git", ["-C", workspace, ...args], { env: { ...env, GIT_OPTIONAL_LOCKS: "0" }, encoding: "utf8", timeout: 10000, maxBuffer: 65536 });
14
+ return result.status === 0 ? result.stdout.trim() : null;
15
+ }
16
+ function retainedUnbornBranch(context, workspace, scope) {
17
+ if (!scope || scope.projectRoot !== workspace || scope.workspaceRoot !== workspace)
18
+ return null;
19
+ const policy = readMemoryInitGitPolicy(context, scope);
20
+ if (!policy || policy.initial_head !== null || policy.route !== "integration_branch_direct")
21
+ return null;
22
+ const git = (args) => gitObservation(context, workspace, args), common = git(["rev-parse", "--git-common-dir"]);
23
+ if (!common || fs.realpathSync(path.resolve(workspace, common)) !== policy.repository
24
+ || git(["symbolic-ref", "--quiet", "--short", "HEAD"]) !== policy.workspace_branch
25
+ || policy.workspace_branch !== policy.integration_branch || git(["rev-parse", "--verify", "HEAD"]) !== null
26
+ || git(["for-each-ref", "--format=%(refname)", "refs/heads/"]) !== "")
27
+ return null;
28
+ return policy.integration_branch;
29
+ }
30
+ /** Project-owned technical defaults only; never grants authority to a future task. */
31
+ export function prepareMemoryOrdinaryDefaults(context, workspace, selectedProfile, scope, integrationBranch, targetFeatureBranchTemplate) {
32
+ const proposals = [], missing = [];
33
+ const existing = ordinaryConfigurationPaths.map(logical => fs.existsSync(path.join(workspace, logical)));
34
+ if (existing[0])
35
+ validateVnextExecutionProfile(JSON.parse(fs.readFileSync(path.join(workspace, ordinaryConfigurationPaths[0]), "utf8")));
36
+ if (existing[1])
37
+ loadVnextWorkspacePolicy(workspace);
38
+ if (!existing[0]) {
39
+ const settings = readOperatorProfiles(context.ddFlowHome);
40
+ let profile;
41
+ try {
42
+ profile = resolveOperatorProfile(settings, selectedProfile);
43
+ }
44
+ catch {
45
+ if (settings.default_profile)
46
+ profile = resolveOperatorProfile(settings);
47
+ }
48
+ if (!profile)
49
+ missing.push("configured ordinary executor profile");
50
+ else {
51
+ const value = { schema_id: "dd-flow/project-execution@3", stage_session_mode: "new_session", plan_review_mode: "auto", code_review_mode: "auto",
52
+ merge_mode: "server", merge_delivery: { strategy: "local" }, merge_cleanup: { source: "retain" }, stop_target: "merge_completed",
53
+ execution: { agent_profile_id: profile.id, delegation: { mode: "external", max_parallel: 1 } } };
54
+ validateVnextExecutionProfile(value);
55
+ proposals.push({ path: ordinaryConfigurationPaths[0], value });
56
+ }
57
+ }
58
+ let reason = "existing_valid_project_configuration";
59
+ if (!existing[1]) {
60
+ const git = (args) => gitObservation(context, workspace, args);
61
+ const remote = git(["symbolic-ref", "--quiet", "refs/remotes/origin/HEAD"]);
62
+ const branches = git(["for-each-ref", "--format=%(refname:short)", "refs/heads/"])?.split("\n").filter(Boolean) ?? [];
63
+ const unborn = !remote && !branches.length ? retainedUnbornBranch(context, workspace, scope) : null;
64
+ const remoteBranch = remote?.startsWith("refs/remotes/origin/") ? remote.slice("refs/remotes/origin/".length) : null;
65
+ // The Memory flow's retained explicit choice is also a technical default, not
66
+ // new merge/push authority. Existing ordinary configuration wins above.
67
+ const branch = integrationBranch ?? remoteBranch ?? (branches.length === 1 ? branches[0] : unborn);
68
+ reason = integrationBranch !== undefined ? "retained_explicit_integration_branch" : remoteBranch ? "verified_origin_head" : unborn ? "retained_unborn_init_branch_technical_default" : branch ? "verified_single_local_branch_technical_default" : "integration_branch_choice_required";
69
+ if (!branch || branch !== unborn && !git(["rev-parse", "--verify", `${integrationBranch === undefined && remoteBranch ? `refs/remotes/origin/${branch}` : `refs/heads/${branch}`}^{commit}`]))
70
+ missing.push("ordinary integration branch (multiple or unavailable candidates)");
71
+ else {
72
+ const contractFile = path.join(workspace, ".memory-bank/dd-flow/flow-contract.json");
73
+ const contract = fs.existsSync(contractFile) ? JSON.parse(fs.readFileSync(contractFile, "utf8")) : null;
74
+ const localTemplate = contract?.workspace?.feature_branch_template;
75
+ // Preserve compatible project routing; legacy PRT contracts use the
76
+ // retained upgrade target's default, not an unrelated local canon.
77
+ const template = typeof localTemplate === "string" && localTemplate.includes("<RUN>") ? localTemplate : targetFeatureBranchTemplate;
78
+ if (typeof template !== "string" || !template.includes("<RUN>"))
79
+ missing.push("ordinary feature branch template from selected flow contract");
80
+ else
81
+ proposals.push({ path: ordinaryConfigurationPaths[1], value: { schema_id: "dd-flow/project-workspace@1", workspace: {
82
+ route: "feature_worktree", integration_branch: branch, feature_branch_template: template, provision_stage: "protocolize_start"
83
+ } } });
84
+ }
85
+ }
86
+ return { proposals, preserved_paths: ordinaryConfigurationPaths.filter((_, index) => existing[index]), required_paths: ordinaryConfigurationPaths.filter((_, index) => !existing[index]), missing, reason };
87
+ }
88
+ /** Existing compose output custody selects these files; this checks their executable meaning. */
89
+ export function assertMemoryOrdinaryConfigurationOutputs(context, workspace, defaults, artifacts, scope) {
90
+ for (const logical of defaults.required_paths)
91
+ if (!artifacts.some(artifact => artifact.root === "workspace" && artifact.path === logical)) {
92
+ throw new AppError("memory_stage_result_invalid", "Compose must retain each required ordinary configuration as an accepted Work output", 2, { phase: "prepare", effect: "no_effect", recoverable: true, reason: "ordinary_configuration_output_missing", path: logical });
93
+ }
94
+ const values = new Map(ordinaryConfigurationPaths.map(logical => [logical, JSON.parse(fs.readFileSync(path.join(workspace, logical), "utf8"))]));
95
+ const profile = validateVnextExecutionProfile(values.get(ordinaryConfigurationPaths[0]));
96
+ const policy = loadVnextWorkspacePolicy(workspace);
97
+ if (profile.execution)
98
+ resolveOperatorProfile(readOperatorProfiles(context.ddFlowHome), profile.execution.agent_profile_id);
99
+ for (const item of defaults.proposals)
100
+ if (!isDeepStrictEqual(values.get(item.path), item.value)) {
101
+ throw new AppError("memory_stage_result_invalid", "Compose changed supplied technical defaults", 2, { phase: "prepare", effect: "no_effect", reason: "ordinary_configuration_changed", path: item.path });
102
+ }
103
+ const branch = policy.workspace.integration_branch;
104
+ const exists = gitObservation(context, workspace, ["rev-parse", "--verify", `refs/heads/${branch}^{commit}`]);
105
+ const remote = exists ? null : gitObservation(context, workspace, ["rev-parse", "--verify", `refs/remotes/origin/${branch}^{commit}`]);
106
+ if (!exists && !remote && retainedUnbornBranch(context, workspace, scope) !== branch)
107
+ throw new AppError("memory_stage_result_invalid", "Ordinary integration branch is not an existing repository branch", 2, { phase: "prepare", effect: "no_effect", reason: "ordinary_integration_branch_unavailable" });
108
+ }
109
+ export function assertMemoryOrdinaryConfigurationCoverage(value, defaults) {
110
+ const plan = value;
111
+ if (plan.details?.works?.some(work => work.write_scopes.some(scope => scope.root === "workspace" && defaults.preserved_paths.includes(scope.path)))) {
112
+ throw new AppError("memory_stage_result_invalid", "Fresh init preserves valid existing ordinary configuration; remove that configuration write scope", 2, { phase: "prepare", effect: "no_effect", recoverable: true, reason: "existing_ordinary_configuration_write" });
113
+ }
114
+ for (const logical of defaults.required_paths)
115
+ if (!plan.details?.works?.some(work => work.unit_ids.length && work.write_scopes.some(scope => scope.root === "workspace" && scope.path === logical))) {
116
+ throw new AppError("memory_stage_result_invalid", "Compose must assign the missing ordinary configuration to a reviewed unit and an exact write scope", 2, { phase: "prepare", effect: "no_effect", recoverable: true, reason: "ordinary_configuration_unassigned", path: logical });
117
+ }
118
+ }
119
+ /** Upgrade must admit missing project-owned paths before its diff is immutable. */
120
+ export function assertMemoryOrdinaryUpgradeConfigurationCoverage(value, defaults) {
121
+ const changes = value.details.path_map;
122
+ if (changes.some(change => change.action !== "retain" && [change.from, change.to].some(path => path !== null && defaults.preserved_paths.includes(path)))) {
123
+ throw new AppError("memory_stage_result_invalid", "Upgrade preserves valid existing ordinary configuration", 2, { phase: "prepare", effect: "no_effect", recoverable: true, reason: "existing_ordinary_configuration_write" });
124
+ }
125
+ for (const logical of defaults.required_paths)
126
+ if (!changes.some(change => change.from === null && change.to === logical && change.ownership === "project" && change.action === "add")) {
127
+ throw new AppError("memory_stage_result_invalid", "Upgrade analysis must assign each missing ordinary configuration as an exact project-owned addition", 2, { phase: "prepare", effect: "no_effect", recoverable: true, reason: "ordinary_configuration_unassigned", path: logical });
128
+ }
129
+ }
@@ -0,0 +1,115 @@
1
+ import { AppError } from "../shared/errors.js";
2
+ import { FrozenGenericExecution } from "./generic-execution.js";
3
+ import { hybridDigest } from "./hybrid-contracts.js";
4
+ import { readMemoryInitBootstrapReadiness } from "./memory-init-bootstrap-readiness.js";
5
+ import { PreparedMemoryStageResult } from "./memory-stage-results.js";
6
+ import { PreparedMemoryInitProjectBootstrap } from "./memory-init-project-bootstrap.js";
7
+ import { PreparedMemoryInitBootstrapReadiness } from "./memory-init-bootstrap-readiness.js";
8
+ import { AdmittedFrozenEngine } from "./frozen-engine.js";
9
+ import { observeMemoryInitSourceInventory } from "./memory-init-preflight.js";
10
+ import { RetainedExecutionBundle } from "./execution-bundles.js";
11
+ function refuse(reason) {
12
+ throw new AppError("memory_preflight_bootstrap_custody_invalid", "Preflight does not consume its independently accepted bootstrap", 2, { reason, effect: "no_effect" });
13
+ }
14
+ /** Bootstrap-specific admission for the productive preflight handler. Result
15
+ * schema, RUN/input identity, physical revalidation and coordinator settlement
16
+ * remain separate handler obligations; this is not stage completion authority.
17
+ */
18
+ export class PreparedMemoryPreflightBootstrapCustody {
19
+ #scope;
20
+ #authoritySha256;
21
+ #resultSha256;
22
+ #physical = null;
23
+ #semanticScope;
24
+ constructor(scope, authoritySha256, resultSha256, semanticScope) {
25
+ this.#scope = { ...scope };
26
+ this.#authoritySha256 = authoritySha256;
27
+ this.#resultSha256 = resultSha256;
28
+ this.#semanticScope = semanticScope;
29
+ Object.freeze(this);
30
+ }
31
+ static prepare(context, input) {
32
+ if (!(input.execution instanceof FrozenGenericExecution) || !(input.result instanceof PreparedMemoryStageResult)
33
+ || input.execution.settings.flow_id !== "mb-init")
34
+ refuse("unprepared_preflight");
35
+ const frozen = input.execution.snapshot();
36
+ const scope = { requestId: frozen.scope.requestId, projectRoot: frozen.scope.projectRoot, workspaceRoot: frozen.scope.workspace };
37
+ const accepted = readMemoryInitBootstrapReadiness(context, scope);
38
+ if (!accepted || accepted.authority.binding.execution_sha256 !== input.execution.sha256)
39
+ refuse("missing_or_foreign_bootstrap");
40
+ const result = input.result.value(), details = result.details;
41
+ if (result.stage !== "preflight" || result.schema_id !== "dd-flow/mb-init-preflight-result@1")
42
+ refuse("foreign_stage");
43
+ const semanticScope = details.semantic_scope;
44
+ if (typeof semanticScope !== "string" || !semanticScope.trim() || Buffer.byteLength(semanticScope) > 16384 || semanticScope.includes("\0"))
45
+ refuse("invalid_semantic_scope");
46
+ return new PreparedMemoryPreflightBootstrapCustody(scope, hybridDigest(accepted.authority), input.result.sha256, semanticScope);
47
+ }
48
+ /** Productive preparation additionally restores the request-owned bootstrap
49
+ * and rechecks its physical prerequisites. No publication or model probe is
50
+ * dispatched. Result/RUN input and invoking assertBundleReference remain
51
+ * obligations of the registered stage handler, not this bootstrap fence.
52
+ */
53
+ static preparePhysical(context, input) {
54
+ if (!(input.engine instanceof AdmittedFrozenEngine))
55
+ refuse("selected_engine_not_admitted");
56
+ const prepared = PreparedMemoryPreflightBootstrapCustody.prepare(context, input);
57
+ const bootstrap = PreparedMemoryInitProjectBootstrap.restore(context, input.execution);
58
+ PreparedMemoryInitBootstrapReadiness.prepare(context, { bootstrap, engine: input.engine });
59
+ const inventory = prepared.observeInventory(context);
60
+ prepared.assertCustody(context);
61
+ prepared.#physical = { bootstrap, engine: input.engine, inventorySha256: inventory.sha256 };
62
+ return prepared;
63
+ }
64
+ /** Outside writers: recheck current root/source/tools/pack/engine/storage.
65
+ * The acceptance writer uses assertCustody only, with no filesystem access.
66
+ */
67
+ revalidate(context) {
68
+ if (!this.#physical)
69
+ refuse("physical_preparation_required");
70
+ PreparedMemoryInitBootstrapReadiness.prepare(context, this.#physical);
71
+ if (this.observeInventory(context).sha256 !== this.#physical.inventorySha256)
72
+ refuse("preserved_inventory_changed");
73
+ this.assertCustody(context);
74
+ }
75
+ /** SQL-only fence for the handler's eventual atomic acceptance writer. */
76
+ assertCustody(context) {
77
+ const accepted = readMemoryInitBootstrapReadiness(context, this.#scope);
78
+ if (!accepted || hybridDigest(accepted.authority) !== this.#authoritySha256)
79
+ refuse("bootstrap_changed_after_preparation");
80
+ }
81
+ /** Exact manifest reference, not merely a same-hash path supplied by an agent.
82
+ * RUN/input identity is separately fenced by its prepared result binding and
83
+ * descriptor settlement; this method alone is not RUN execution authority.
84
+ */
85
+ assertBundleReference(context, bundle, result) {
86
+ if (!(bundle instanceof RetainedExecutionBundle) || !(result instanceof PreparedMemoryStageResult))
87
+ refuse("unprepared_bundle_reference");
88
+ context.db.readSnapshot(() => {
89
+ this.assertCustody(context);
90
+ const frozen = bundle.execution.snapshot(), accepted = readMemoryInitBootstrapReadiness(context, this.#scope);
91
+ if (!accepted)
92
+ refuse("missing_or_foreign_bootstrap");
93
+ const value = result.value(), details = value.details;
94
+ if (bundle.descriptor.descriptor.id !== "mb-init" || bundle.execution.sha256 !== accepted.authority.binding.execution_sha256
95
+ || frozen.scope.requestId !== this.#scope.requestId || frozen.scope.projectRoot !== this.#scope.projectRoot || frozen.scope.workspace !== this.#scope.workspaceRoot
96
+ || value.stage !== "preflight" || value.run_id !== bundle.manifest.run_id
97
+ || bundle.manifest.bootstrap_receipts.length !== 1
98
+ || bundle.manifest.bootstrap_receipts[0].sha256 !== accepted.authority.bootstrap_sha256
99
+ || !bundle.blob(bundle.manifest.bootstrap_receipts[0].path).equals(Buffer.from(JSON.stringify(accepted.authority.receipt))))
100
+ refuse("foreign_bundle_bootstrap_reference");
101
+ if (details.semantic_scope !== this.#semanticScope)
102
+ refuse("foreign_preflight_semantic_scope");
103
+ // Bootstrap/physical preparation belongs to the exact result that was
104
+ // checked, not another schema-valid result with the same selected fields.
105
+ if (result.sha256 !== this.#resultSha256)
106
+ refuse("preflight_result_changed_after_preparation");
107
+ });
108
+ }
109
+ observeInventory(context) {
110
+ const accepted = readMemoryInitBootstrapReadiness(context, this.#scope);
111
+ if (!accepted)
112
+ refuse("missing_or_foreign_bootstrap");
113
+ return observeMemoryInitSourceInventory(accepted.authority.binding.target, accepted.authority.receipt.baseline_sha256, context.env);
114
+ }
115
+ }
@@ -0,0 +1,274 @@
1
+ import { AppError } from "../shared/errors.js";
2
+ import { RetainedExecutionBundle } from "./execution-bundles.js";
3
+ import { PreparedMemoryStageResult } from "./memory-stage-results.js";
4
+ import { PreparedMemoryPreflightBootstrapCustody } from "./memory-preflight-bootstrap-custody.js";
5
+ import { PreparedMemoryBaselinePreservation } from "./memory-baseline-preservation.js";
6
+ import { PreparedMemoryResultBinding } from "./memory-result-binding.js";
7
+ import { ObservedMemorySources } from "./memory-source-observations.js";
8
+ import { memorySourceKey } from "./memory-stage-results.js";
9
+ import { readMemoryInitBootstrapReadiness } from "./memory-init-bootstrap-readiness.js";
10
+ import { observeMemoryInitSourceInventory } from "./memory-init-preflight.js";
11
+ import { readMemoryInitProjectBootstrap } from "./memory-init-project-bootstrap.js";
12
+ import { readPublishedMemoryReferenceInventory } from "./memory-layer-publication.js";
13
+ import path from "node:path";
14
+ import { PreparedDescriptorStageStart } from "./descriptor-stage-start.js";
15
+ import { PreparedDescriptorStageCoordinator, readDescriptorStageInput } from "./descriptor-stage-coordinator.js";
16
+ import { PreparedDescriptorStageSettlement } from "./descriptor-stage-settlement.js";
17
+ import { assertPreparedRunBundleSqlAuthority, readFlowRunExecutionBundle } from "./runs.js";
18
+ import { requireProjectByRoot } from "./projects.js";
19
+ import { resolveProjectRoot } from "../storage/paths.js";
20
+ import { readAcceptedStageData } from "./stage-report-renderer.js";
21
+ import { readMemoryCompositionRegistration } from "./memory-composition-registration.js";
22
+ import { hybridDigest } from "./hybrid-contracts.js";
23
+ import { captureMemoryUpgradeSources } from "./memory-upgrade-analysis-handler.js";
24
+ function refuse(reason) {
25
+ throw new AppError("memory_preflight_handler_invalid", "Memory preflight cannot accept this execution or result", 2, { reason, effect: "no_effect" });
26
+ }
27
+ function bounded(bytes, empty = false) {
28
+ if (!(bytes instanceof Uint8Array) || bytes.length > 1024 * 1024 || !empty && !bytes.length)
29
+ refuse("invalid_result_bytes");
30
+ }
31
+ function selected(context, input) {
32
+ const bundle = readFlowRunExecutionBundle(context, input);
33
+ if (!bundle || bundle.descriptor.descriptor.id !== "mb-init" || bundle.descriptor.descriptor.entry_stage !== "preflight")
34
+ refuse("registered_memory_bundle_required");
35
+ const project = requireProjectByRoot(context, resolveProjectRoot(input.projectRoot));
36
+ const scope = { projectId: project.id, runId: input.runId, stage: "preflight" };
37
+ const run = assertPreparedRunBundleSqlAuthority(context, scope, bundle);
38
+ const stage = JSON.parse(run.index_json).stage_runs.find((entry) => entry.stage === "preflight");
39
+ return { bundle, scope, accepted: stage?.status === "done" };
40
+ }
41
+ /** Proposed references select a subset, never establish the source allowlist.
42
+ * Only regular files in the independently restored bootstrap baseline may be
43
+ * preflight project evidence. Ignored/private, linked, runtime and canon paths
44
+ * are not silently read as project truth. Their other proof roles are separate.
45
+ */
46
+ export function captureMemoryPreflightSources(context, bundle, bytes) {
47
+ return captureSources(context, bundle, bytes).sources;
48
+ }
49
+ /** Historical blueprint support comes only from the independently registered
50
+ * graph. It is not a current output observation or a caller-supplied allowlist. */
51
+ export function captureRegisteredMemoryCompositionSources(context, bundle, registrationScope) {
52
+ const registration = readMemoryCompositionRegistration(context, registrationScope);
53
+ if (registration.run_id !== bundle.manifest.run_id || registration.execution_sha256 !== bundle.execution.sha256)
54
+ refuse("foreign_composition_registration");
55
+ if (bundle.descriptor.descriptor.id === "mb-upgrade") {
56
+ const blueprint = JSON.parse(Buffer.from(registration.result_base64, "base64").toString("utf8"));
57
+ const historical = new Map();
58
+ // Only restoring the independently registered blueprint. Its initial
59
+ // artifact references are not freshly produced Work or current outputs;
60
+ // final acceptance selects those independently from settled SQL results.
61
+ for (const unit of blueprint.units) {
62
+ for (const artifact of unit.artifacts)
63
+ historical.set(`${artifact.root}\0${artifact.path}`, artifact.sha256);
64
+ unit.artifacts = [];
65
+ }
66
+ return { sources: captureMemoryUpgradeSources(context, bundle, registrationScope.stage, Buffer.from(JSON.stringify(blueprint))),
67
+ historical, registrationSha256: hybridDigest(registration), inputSha256: registration.input_sha256 };
68
+ }
69
+ return { ...captureSources(context, bundle, Buffer.from(registration.result_base64, "base64"), true),
70
+ registrationSha256: hybridDigest(registration), inputSha256: registration.input_sha256 };
71
+ }
72
+ function captureSources(context, bundle, bytes, registeredBlueprint = false) {
73
+ bounded(bytes);
74
+ if (!(bundle instanceof RetainedExecutionBundle) || bundle.descriptor.descriptor.id !== "mb-init")
75
+ refuse("prepared_memory_bundle_required");
76
+ const preservation = PreparedMemoryBaselinePreservation.prepare(context, bundle.execution), scope = bundle.execution.snapshot().scope;
77
+ const ready = readMemoryInitBootstrapReadiness(context, { requestId: scope.requestId, projectRoot: scope.projectRoot, workspaceRoot: scope.workspace });
78
+ if (!ready || ready.authority.binding.execution_sha256 !== bundle.execution.sha256)
79
+ refuse("accepted_bootstrap_required");
80
+ const inventory = observeMemoryInitSourceInventory(ready.authority.binding.target, ready.authority.receipt.baseline_sha256, context.env);
81
+ const allowed = new Map(inventory.entries.filter(entry => entry.kind === "file").map(entry => [entry.path, entry.sha256]));
82
+ let value;
83
+ try {
84
+ value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
85
+ }
86
+ catch {
87
+ refuse("invalid_result_json");
88
+ }
89
+ const registered = readMemoryInitProjectBootstrap(context, ready.authority.binding.scope);
90
+ if (!registered)
91
+ refuse("accepted_bootstrap_required");
92
+ const owned = readPublishedMemoryReferenceInventory(context.ddFlowHome, { ...ready.authority.binding.scope,
93
+ targetSha256: registered.receipt.target_sha256, layerSha256: registered.receipt.layer_sha256,
94
+ packSha256: ready.authority.binding.pack_sha256, installationSha256: ready.authority.binding.installation_manifest_sha256 }, ready.authority.binding.target, registered.receipt.layer_publication_sha256, registered.receipt.draft_identity_sha256);
95
+ const receipts = new Map(bundle.manifest.bootstrap_receipts.map(ref => [`execution-bundle/${ref.path}`, ref.sha256]));
96
+ for (const ref of ready.authority.evidence) {
97
+ const selected = bundle.manifest.inventory.find(item => item.path === ref.path && item.sha256 === ref.sha256);
98
+ if (selected)
99
+ receipts.set(`execution-bundle/${ref.path}`, ref.sha256);
100
+ }
101
+ let run = null;
102
+ const acceptedReferences = new Map();
103
+ const selectRun = () => run ??= assertPreparedRunBundleSqlAuthority(context, { projectId: ready.projectId, runId: bundle.manifest.run_id }, bundle);
104
+ let selectedAccepted = false;
105
+ const rejectProposal = (reason, reference, message) => {
106
+ const proposal = value;
107
+ if (registeredBlueprint || proposal.run_id !== bundle.manifest.run_id || typeof proposal.stage !== "string" || typeof proposal.input_sha256 !== "string")
108
+ refuse("unselected_preflight_source");
109
+ const index = JSON.parse(selectRun().index_json), stage = index.stage_runs.find((stage) => stage.stage === proposal.stage);
110
+ if (index.current_stage !== proposal.stage || stage?.status !== "running" || stage.input_sha256 !== proposal.input_sha256)
111
+ refuse("unselected_preflight_source");
112
+ throw new AppError("memory_preflight_handler_invalid", message, 2, { reason, ...reference, phase: "prepare", effect: "no_effect", recoverable: true });
113
+ };
114
+ const proposedMismatches = [];
115
+ const pending = [{ value, role: "source", original: false }], locations = new Map(), expected = new Map(), historical = new Map();
116
+ let nodes = 0;
117
+ while (pending.length) {
118
+ if (++nodes > 100000)
119
+ refuse("result_tree_exceeds_bound");
120
+ const entry = pending.pop(), node = entry.value;
121
+ if (Array.isArray(node)) {
122
+ for (const child of node)
123
+ pending.push({ ...entry, value: child });
124
+ continue;
125
+ }
126
+ if (!node || typeof node !== "object")
127
+ continue;
128
+ const record = node;
129
+ if (typeof record.root === "string" && typeof record.path === "string" && typeof record.sha256 === "string") {
130
+ let selected;
131
+ if (["project", "workspace"].includes(record.root)) {
132
+ selected = allowed.get(record.path) ?? undefined;
133
+ if (!entry.original && ["evidence", "artifacts"].includes(entry.role))
134
+ selected ??= owned.artifacts.get(record.path);
135
+ }
136
+ else if (!entry.original && (entry.role === "evidence" || entry.role === "artifacts")) {
137
+ if (record.root === "run") {
138
+ selected = receipts.get(record.path);
139
+ if (selected === undefined) {
140
+ if (!selectedAccepted) {
141
+ let stage = value.stage;
142
+ const declared = bundle.descriptor.descriptor.stages.find(item => item.id === stage);
143
+ if (!declared)
144
+ refuse("unselected_preflight_source");
145
+ selectedAccepted = true;
146
+ const index = JSON.parse(selectRun().index_json);
147
+ const acceptedStage = index.stage_runs?.some((item) => item.stage === stage && item.status === "done");
148
+ if (acceptedStage)
149
+ readAcceptedStageData(context, { projectId: ready.projectId, runId: bundle.manifest.run_id, stage: declared.id });
150
+ if (index.current_stage === stage || acceptedStage) {
151
+ const input = readDescriptorStageInput(context, { projectId: ready.projectId, runId: bundle.manifest.run_id, stage: declared.id }, bundle, true, acceptedStage);
152
+ acceptedReferences.set(`${declared.directory}/stage-input.json`, input.inputSha256);
153
+ }
154
+ const visited = new Set();
155
+ while (stage && !visited.has(stage)) {
156
+ visited.add(stage);
157
+ stage = bundle.descriptor.descriptor.edges.find(edge => edge.to === stage && edge.on === "accepted")?.from;
158
+ if (stage && index.stage_runs?.some((item) => item.stage === stage && item.status === "done")) {
159
+ const accepted = readAcceptedStageData(context, { projectId: ready.projectId, runId: bundle.manifest.run_id, stage });
160
+ const result = JSON.parse(accepted.bytes.toString("utf8"));
161
+ if (result.schema_id !== `dd-flow/mb-init-${stage}-result@1` || result.run_id !== bundle.manifest.run_id
162
+ || result.stage !== stage || !(result.outcome === "accepted" || stage === "verify" && result.outcome === "needs_repair" && bundle.descriptor.successor("verify", "needs_repair") === "review"))
163
+ refuse("unselected_preflight_source");
164
+ acceptedReferences.set(accepted.result.path, accepted.result.sha256);
165
+ const input = readDescriptorStageInput(context, { projectId: ready.projectId, runId: bundle.manifest.run_id, stage }, bundle, true, true);
166
+ acceptedReferences.set(`${bundle.descriptor.stage(stage).directory}/stage-input.json`, input.inputSha256);
167
+ }
168
+ }
169
+ }
170
+ selected = acceptedReferences.get(record.path);
171
+ }
172
+ }
173
+ if (record.root === "canon")
174
+ selected = owned.canon.get(record.path);
175
+ }
176
+ if (selected === undefined)
177
+ return rejectProposal("unselected_preflight_source", { root: record.root, path: record.path }, "Remove or replace this unselected reference with an admitted project source, preflight result or Stage input; Git metadata is not project source evidence");
178
+ if (selected !== record.sha256) {
179
+ if (registeredBlueprint)
180
+ refuse("registered_source_sha256_mismatch");
181
+ proposedMismatches.push({ root: record.root, path: record.path });
182
+ }
183
+ const key = memorySourceKey(record.root, record.path);
184
+ if (registeredBlueprint && !entry.original && ["evidence", "artifacts"].includes(entry.role)
185
+ && ["project", "workspace"].includes(record.root) && !allowed.has(record.path) && owned.artifacts.get(record.path) === selected) {
186
+ historical.set(key, selected);
187
+ }
188
+ else {
189
+ expected.set(key, selected);
190
+ locations.set(key, { root: record.root, path: record.path });
191
+ }
192
+ }
193
+ for (const [key, child] of Object.entries(record))
194
+ pending.push({ value: child, role: ["evidence", "artifacts"].includes(key) ? key : entry.role,
195
+ original: entry.original || key === "inventory" });
196
+ }
197
+ const selectedRun = [...locations.values()].some(location => location.root === "run") ? selectRun() : null;
198
+ const observation = ObservedMemorySources.capture({ project: scope.projectRoot, workspace: scope.workspace,
199
+ canon: path.join(scope.workspace, ".memory-bank"), ...(selectedRun ? { run: selectedRun.run_root ?? selectedRun.run_dir } : {}) }, [...locations.values()]);
200
+ const hashes = observation.hashes();
201
+ for (const [key, sha256] of expected)
202
+ if (hashes.get(key) !== sha256)
203
+ refuse("preflight_source_changed");
204
+ preservation.assertCustody(context);
205
+ if (proposedMismatches.length) {
206
+ rejectProposal("proposed_source_sha256_mismatch", proposedMismatches[0], "Proposed evidence SHA differs from the CLI-selected source; correct the result reference without changing the source");
207
+ }
208
+ return { sources: observation, historical };
209
+ }
210
+ /** The bootstrap-specific acceptance part of the preflight handler. It does
211
+ * not establish RUN/input/coordinator authority; finishMemoryPreflight supplies
212
+ * those independently. Kept separate for actual bootstrap qualification.
213
+ */
214
+ export class PreparedMemoryPreflightAcceptance {
215
+ #bundle;
216
+ #result;
217
+ #bootstrap;
218
+ constructor(bundle, result, bootstrap) {
219
+ this.#bundle = bundle;
220
+ this.#result = result;
221
+ this.#bootstrap = bootstrap;
222
+ Object.freeze(this);
223
+ }
224
+ static prepare(context, input) {
225
+ if (!(input.bundle instanceof RetainedExecutionBundle) || !(input.result instanceof PreparedMemoryStageResult))
226
+ refuse("prepared_bundle_and_result_required");
227
+ const value = JSON.parse(input.result.bytes().toString("utf8"));
228
+ // Preliminary units/minor findings are allowed by the frozen contract;
229
+ // DISCOVER establishes final inventory. Material blockers cannot advance.
230
+ if (value.stage !== "preflight" || value.outcome !== "accepted"
231
+ || value.findings.some((finding) => finding.severity !== "minor" && finding.status !== "resolved"))
232
+ refuse("preflight_not_accepted");
233
+ const bootstrap = PreparedMemoryPreflightBootstrapCustody.preparePhysical(context, { execution: input.bundle.execution, result: input.result, engine: input.bundle.engine() });
234
+ const prepared = new PreparedMemoryPreflightAcceptance(input.bundle, input.result, bootstrap);
235
+ prepared.assertCustody(context);
236
+ return prepared;
237
+ }
238
+ revalidate(context) { this.#bootstrap.revalidate(context); this.assertCustody(context); }
239
+ assertCustody(context) { this.#bootstrap.assertBundleReference(context, this.#bundle, this.#result); }
240
+ }
241
+ /** Handler implementation awaiting the complete memory-handler registry. No
242
+ * RUN allocation, profile mutation, installation fallback or provider dispatch.
243
+ * Returns the retained prompt for the controller's separately fenced dispatch.
244
+ */
245
+ export function startMemoryPreflight(context, input) {
246
+ bounded(input.bytes, true);
247
+ const { bundle, accepted } = selected(context, input);
248
+ if (accepted)
249
+ refuse("use_accepted_finish_replay");
250
+ const preservation = PreparedMemoryBaselinePreservation.prepare(context, bundle.execution);
251
+ const start = PreparedDescriptorStageStart.prepare(context, { ...input, stage: "preflight" });
252
+ preservation.revalidate(context);
253
+ const stage = start.apply(context, writer => preservation.assertCustody(writer));
254
+ const coordinator = PreparedDescriptorStageCoordinator.prepare(context, { ...input, stage: "preflight" });
255
+ preservation.revalidate(context);
256
+ const work = coordinator.apply(context, writer => preservation.assertCustody(writer));
257
+ return { ...stage, ...work };
258
+ }
259
+ export function finishMemoryPreflight(context, input) {
260
+ bounded(input.bytes);
261
+ const { bundle, scope, accepted } = selected(context, input);
262
+ const sources = captureMemoryPreflightSources(context, bundle, input.bytes);
263
+ const binding = PreparedMemoryResultBinding.prepare(context, { ...scope, flow: bundle.descriptor, execution: bundle.execution, bundle,
264
+ sources, acceptedReplay: accepted });
265
+ const replay = binding.acceptedBytes();
266
+ if (replay && !replay.equals(input.bytes))
267
+ refuse("accepted_result_changed");
268
+ const result = PreparedMemoryStageResult.prepare(input.bytes, bundle.descriptor, binding.binding());
269
+ const acceptance = PreparedMemoryPreflightAcceptance.prepare(context, { bundle, result });
270
+ const settlement = PreparedDescriptorStageSettlement.prepare(context, { ...input, stage: "preflight", bytes: result.bytes() });
271
+ binding.revalidate(context);
272
+ acceptance.revalidate(context);
273
+ return settlement.apply(context, writer => { binding.assertCustody(writer); acceptance.assertCustody(writer); });
274
+ }