@deksden-com/dd-flow-cli 0.9.0-beta.15 → 0.9.0-beta.151

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 (560) hide show
  1. package/CHANGELOG.md +907 -0
  2. package/README.md +139 -10
  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 +79 -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/agy-terminal-envelope.mjs +67 -0
  58. package/dist/harness-runtime/lib/daemon-observation.d.mts +2 -0
  59. package/dist/harness-runtime/lib/daemon-observation.mjs +163 -0
  60. package/dist/harness-runtime/lib/daemon-operations.d.mts +2 -0
  61. package/dist/harness-runtime/lib/daemon-operations.mjs +462 -0
  62. package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +6 -0
  63. package/dist/harness-runtime/lib/dd-agy-daemon.mjs +1092 -0
  64. package/dist/harness-runtime/lib/dd-agy.mjs +86 -0
  65. package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
  66. package/dist/harness-runtime/lib/dd-codex-daemon.mjs +231 -0
  67. package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
  68. package/dist/harness-runtime/lib/dd-codex.mjs +954 -0
  69. package/dist/harness-runtime/lib/dd-droid-daemon.mjs +141 -0
  70. package/dist/harness-runtime/lib/dd-droid.mjs +626 -0
  71. package/dist/harness-runtime/lib/dd-grok-daemon.mjs +555 -0
  72. package/dist/harness-runtime/lib/dd-grok.mjs +180 -0
  73. package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +627 -0
  74. package/dist/harness-runtime/lib/dd-opencode.mjs +390 -0
  75. package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +752 -0
  76. package/dist/harness-runtime/lib/dd-zcode.mjs +1200 -0
  77. package/dist/harness-runtime/lib/delegation-instructions.d.mts +14 -0
  78. package/dist/harness-runtime/lib/delegation-instructions.mjs +166 -0
  79. package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
  80. package/dist/harness-runtime/lib/driver-recovery.mjs +140 -0
  81. package/dist/harness-runtime/lib/droid-observation.mjs +66 -0
  82. package/dist/harness-runtime/lib/entity-references.d.mts +2 -0
  83. package/dist/harness-runtime/lib/entity-references.mjs +9 -0
  84. package/dist/harness-runtime/lib/lease-renewal.d.mts +8 -0
  85. package/dist/harness-runtime/lib/lease-renewal.mjs +37 -0
  86. package/dist/harness-runtime/lib/lifecycle-command.d.mts +20 -0
  87. package/dist/harness-runtime/lib/lifecycle-command.mjs +273 -0
  88. package/dist/harness-runtime/lib/lifecycle-contract.d.mts +10 -0
  89. package/dist/harness-runtime/lib/lifecycle-contract.mjs +19 -0
  90. package/dist/harness-runtime/lib/managed-daemon.d.mts +16 -0
  91. package/dist/harness-runtime/lib/managed-daemon.mjs +698 -0
  92. package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
  93. package/dist/harness-runtime/lib/model-observations.mjs +113 -0
  94. package/dist/harness-runtime/lib/native-children.d.mts +34 -0
  95. package/dist/harness-runtime/lib/native-children.mjs +265 -0
  96. package/dist/harness-runtime/lib/native-hook-command.d.mts +7 -0
  97. package/dist/harness-runtime/lib/native-hook-command.mjs +251 -0
  98. package/dist/harness-runtime/lib/native-request-proof.d.mts +2 -0
  99. package/dist/harness-runtime/lib/native-request-proof.mjs +65 -0
  100. package/dist/harness-runtime/lib/native-streams.mjs +45 -0
  101. package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
  102. package/dist/harness-runtime/lib/observation-clock.mjs +95 -0
  103. package/dist/harness-runtime/lib/opencode-plugin.mjs +85 -0
  104. package/dist/harness-runtime/lib/operation-context.mjs +5 -0
  105. package/dist/harness-runtime/lib/operation-errors.d.mts +16 -0
  106. package/dist/harness-runtime/lib/operation-errors.mjs +127 -0
  107. package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
  108. package/dist/harness-runtime/lib/operation-progress.mjs +114 -0
  109. package/dist/harness-runtime/lib/process-json.d.mts +5 -0
  110. package/dist/harness-runtime/lib/process-json.mjs +201 -0
  111. package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
  112. package/dist/harness-runtime/lib/provider-overload-policy.d.mts +23 -0
  113. package/dist/harness-runtime/lib/provider-overload-policy.mjs +242 -0
  114. package/dist/harness-runtime/lib/runner-events.mjs +202 -0
  115. package/dist/harness-runtime/lib/runner-lock.mjs +42 -0
  116. package/dist/harness-runtime/lib/session-settlement.mjs +30 -0
  117. package/dist/harness-runtime/lib/setup-progress.d.mts +9 -0
  118. package/dist/harness-runtime/lib/setup-progress.mjs +53 -0
  119. package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
  120. package/dist/harness-runtime/lib/tool-observations.mjs +228 -0
  121. package/dist/harness-runtime/lib/zcode-usage.mjs +55 -0
  122. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-1y4a697q.js +81 -0
  123. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-2ny4vxct.js +92 -0
  124. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-6mptkzbc.js +0 -0
  125. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-7x67cf1q.js +52 -0
  126. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9rqn6x4v.js +16 -0
  127. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9vdz0zwn.js +1661 -0
  128. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ecs5ftka.js +1466 -0
  129. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-frbwqjmf.js +145 -0
  130. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gne7h7mq.js +50 -0
  131. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gx9wnkzr.js +105 -0
  132. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-m2eywc8w.js +0 -0
  133. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-nwcpakzx.js +12 -0
  134. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-q4g3afnw.js +623 -0
  135. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-qav6mfdz.js +0 -0
  136. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-sxt88q69.js +12 -0
  137. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-t1xa31vm.js +39 -0
  138. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ve4aws36.js +103 -0
  139. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vmytr4q8.js +4 -0
  140. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vt9jbch8.js +36 -0
  141. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vyas3vgt.js +0 -0
  142. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-wjyeq25y.js +30 -0
  143. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-xgnj2w4v.js +20 -0
  144. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-y2etg5bs.js +9 -0
  145. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ydhz1zrh.js +238 -0
  146. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-z6qdwcsf.js +62 -0
  147. package/dist/harness-runtime/vendor/opencode-client/contract.d.ts +1 -0
  148. package/dist/harness-runtime/vendor/opencode-client/contract.js +12 -0
  149. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.d.ts +2806 -0
  150. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.js +0 -0
  151. package/dist/harness-runtime/vendor/opencode-client/effect/api.d.ts +4 -0
  152. package/dist/harness-runtime/vendor/opencode-client/effect/api.js +0 -0
  153. package/dist/harness-runtime/vendor/opencode-client/effect/client.d.ts +2530 -0
  154. package/dist/harness-runtime/vendor/opencode-client/effect/client.js +15 -0
  155. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.d.ts +7 -0
  156. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.js +6 -0
  157. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.d.ts +2529 -0
  158. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.js +8 -0
  159. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.d.ts +2 -0
  160. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.js +12 -0
  161. package/dist/harness-runtime/vendor/opencode-client/effect/index.d.ts +35 -0
  162. package/dist/harness-runtime/vendor/opencode-client/effect/index.js +75 -0
  163. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.d.ts +20 -0
  164. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.js +11 -0
  165. package/dist/harness-runtime/vendor/opencode-client/effect/service.d.ts +90 -0
  166. package/dist/harness-runtime/vendor/opencode-client/effect/service.js +187 -0
  167. package/dist/harness-runtime/vendor/opencode-client/package.json +84 -0
  168. package/dist/harness-runtime/vendor/opencode-client/promise/api.d.ts +21 -0
  169. package/dist/harness-runtime/vendor/opencode-client/promise/api.js +0 -0
  170. package/dist/harness-runtime/vendor/opencode-client/promise/client.d.ts +252 -0
  171. package/dist/harness-runtime/vendor/opencode-client/promise/client.js +14 -0
  172. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.d.ts +8 -0
  173. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.js +6 -0
  174. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.d.ts +259 -0
  175. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.js +7 -0
  176. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.d.ts +3 -0
  177. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.js +79 -0
  178. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.d.ts +8932 -0
  179. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.js +70 -0
  180. package/dist/harness-runtime/vendor/opencode-client/promise/index.d.ts +6 -0
  181. package/dist/harness-runtime/vendor/opencode-client/promise/index.js +83 -0
  182. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.d.ts +32 -0
  183. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.js +7 -0
  184. package/dist/harness-runtime/vendor/opencode-client/promise/service.d.ts +24 -0
  185. package/dist/harness-runtime/vendor/opencode-client/promise/service.js +187 -0
  186. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.d.ts +12 -0
  187. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.js +14 -0
  188. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.d.ts +20 -0
  189. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.js +14 -0
  190. package/dist/harness-runtime/vendor/opencode-client/service-contender.d.ts +37 -0
  191. package/dist/harness-runtime/vendor/opencode-client/service-contender.js +10 -0
  192. package/dist/harness-runtime/vendor/opencode-client/service-probe.d.ts +70 -0
  193. package/dist/harness-runtime/vendor/opencode-client/service-probe.js +16 -0
  194. package/dist/harness-runtime/vendor/opencode-client/service-timing.d.ts +12 -0
  195. package/dist/harness-runtime/vendor/opencode-client/service-timing.js +10 -0
  196. package/dist/harness-runtime/vendor/opencode-client/service-version.d.ts +2 -0
  197. package/dist/harness-runtime/vendor/opencode-client/service-version.js +6 -0
  198. package/dist/harness-runtime/vendor/opencode-client/service.d.ts +52 -0
  199. package/dist/harness-runtime/vendor/opencode-client/service.js +1 -0
  200. package/dist/harness-runtime/vendor/opencode-client/shared-events.d.ts +11 -0
  201. package/dist/harness-runtime/vendor/opencode-client/shared-events.js +8 -0
  202. package/dist/harness-runtime/vendor/opencode-client/solid/connection.d.ts +37 -0
  203. package/dist/harness-runtime/vendor/opencode-client/solid/connection.js +10 -0
  204. package/dist/harness-runtime/vendor/opencode-client/solid/data.d.ts +211 -0
  205. package/dist/harness-runtime/vendor/opencode-client/solid/data.js +18 -0
  206. package/dist/harness-runtime/vendor/opencode-client/solid/index.d.ts +3 -0
  207. package/dist/harness-runtime/vendor/opencode-client/solid/index.js +32 -0
  208. package/dist/harness-runtime/vendor/opencode-client/solid/pty.d.ts +22 -0
  209. package/dist/harness-runtime/vendor/opencode-client/solid/pty.js +8 -0
  210. package/dist/harness-runtime/vendor/opencode-plugin.mjs +3 -0
  211. package/dist/protocol/local-files.js +18 -9
  212. package/dist/runtime/context.js +8 -4
  213. package/dist/schemas/agent-profile.schema.json +1 -1
  214. package/dist/schemas/code-review-decision.schema.json +9 -0
  215. package/dist/schemas/code-review-result.schema.json +1 -1
  216. package/dist/schemas/code-verification.schema.json +7 -5
  217. package/dist/schemas/code-work-batch.schema.json +2 -2
  218. package/dist/schemas/diagnostic-stage-result.schema.json +354 -0
  219. package/dist/schemas/diagnostic-work-result.schema.json +296 -0
  220. package/dist/schemas/discovery-result.schema.json +184 -0
  221. package/dist/schemas/execution-bundle.schema.json +211 -0
  222. package/dist/schemas/execution-settings.schema.json +162 -0
  223. package/dist/schemas/flow-descriptor.schema.json +54 -0
  224. package/dist/schemas/flow-run.schema.json +29 -0
  225. package/dist/schemas/harness-catalog.schema.json +80 -0
  226. package/dist/schemas/mb-init-compose-result.schema.json +457 -0
  227. package/dist/schemas/mb-init-discover-result.schema.json +500 -0
  228. package/dist/schemas/mb-init-finish-result.schema.json +422 -0
  229. package/dist/schemas/mb-init-preflight-result.schema.json +367 -0
  230. package/dist/schemas/mb-init-review-result.schema.json +396 -0
  231. package/dist/schemas/mb-init-verify-result.schema.json +391 -0
  232. package/dist/schemas/mb-upgrade-stage-result.schema.json +863 -0
  233. package/dist/schemas/memory-bootstrap-receipt-v2.schema.json +67 -0
  234. package/dist/schemas/memory-bootstrap-receipt.schema.json +354 -0
  235. package/dist/schemas/memory-composition-work-result.schema.json +38 -0
  236. package/dist/schemas/memory-repair-work-result.schema.json +56 -0
  237. package/dist/schemas/memory-review-correction-plan.schema.json +30 -0
  238. package/dist/schemas/memory-review-work-result.schema.json +43 -0
  239. package/dist/schemas/model-catalog.schema.json +153 -0
  240. package/dist/schemas/plan-review-decision.schema.json +12 -3
  241. package/dist/schemas/plan-review-result.schema.json +2 -2
  242. package/dist/schemas/profile-settings.schema.json +122 -0
  243. package/dist/schemas/project-flow-pack-manifest.schema.json +1 -1
  244. package/dist/schemas/release-impact.schema.json +3 -3
  245. package/dist/schemas/release-manifest.schema.json +291 -0
  246. package/dist/schemas/run-control-receipt.schema.json +118 -0
  247. package/dist/schemas/run-control-request.schema.json +36 -0
  248. package/dist/schemas/run-engine-binding.schema.json +1 -1
  249. package/dist/schemas/stage-start-response.schema.json +4 -0
  250. package/dist/schemas/vnext-protocol-plan.schema.json +2 -2
  251. package/dist/services/accepted-intent.js +139 -0
  252. package/dist/services/branch-context.js +3 -3
  253. package/dist/services/canon.js +54 -15
  254. package/dist/services/check-environment.js +21 -0
  255. package/dist/services/check-runner-evidence.js +277 -0
  256. package/dist/services/check-runner-proof.js +305 -0
  257. package/dist/services/cleanup.js +133 -40
  258. package/dist/services/cli-operation-classifier.js +26 -63
  259. package/dist/services/cli-upgrade-allowlist.js +27 -0
  260. package/dist/services/code-checks.js +1401 -119
  261. package/dist/services/codex-hook-delivery.js +32 -0
  262. package/dist/services/command-context.js +80 -0
  263. package/dist/services/compatibility-preflight.js +16 -3
  264. package/dist/services/config.js +11 -8
  265. package/dist/services/continuation-outcome.js +20 -0
  266. package/dist/services/controller-child-capacity.js +71 -0
  267. package/dist/services/controller-child-observer.js +121 -0
  268. package/dist/services/controller-execution.js +94 -0
  269. package/dist/services/controller-fanout.js +226 -0
  270. package/dist/services/controller-memory-task.js +45 -0
  271. package/dist/services/controller-memory-worker.js +49 -0
  272. package/dist/services/dashboard.js +143 -58
  273. package/dist/services/descriptor-coordinator-session.js +35 -0
  274. package/dist/services/descriptor-root-work.js +53 -0
  275. package/dist/services/descriptor-run-settlement.js +107 -0
  276. package/dist/services/descriptor-run-start.js +475 -0
  277. package/dist/services/descriptor-stage-coordinator.js +250 -0
  278. package/dist/services/descriptor-stage-settlement.js +223 -0
  279. package/dist/services/descriptor-stage-start.js +175 -0
  280. package/dist/services/diagnostic-evidence.js +73 -0
  281. package/dist/services/diagnostic-report-publication.js +72 -0
  282. package/dist/services/diagnostic-report.js +67 -0
  283. package/dist/services/diagnostic-run-bundle.js +74 -0
  284. package/dist/services/diagnostic-snapshot.js +159 -0
  285. package/dist/services/diagnostic-stage-handlers.js +108 -0
  286. package/dist/services/diagnostic-stage-results.js +132 -0
  287. package/dist/services/diagnostic-start.js +84 -0
  288. package/dist/services/diagnostic-work-batch.js +34 -0
  289. package/dist/services/diagnostic-work-collection.js +97 -0
  290. package/dist/services/diagnostic-work-registration.js +101 -0
  291. package/dist/services/diagnostic-work-results.js +93 -0
  292. package/dist/services/discovery/agy-discovery.js +2 -0
  293. package/dist/services/discovery/codex-discovery.js +2 -0
  294. package/dist/services/discovery/droid-discovery.js +2 -0
  295. package/dist/services/discovery/grok-discovery.js +2 -0
  296. package/dist/services/discovery/opencode-discovery.js +2 -0
  297. package/dist/services/discovery/static.js +31 -0
  298. package/dist/services/discovery/zcode-discovery.js +2 -0
  299. package/dist/services/engines.js +354 -163
  300. package/dist/services/eval-snapshots.js +1316 -150
  301. package/dist/services/execution-bundles.js +275 -0
  302. package/dist/services/execution-policy.js +185 -0
  303. package/dist/services/executor-onboarding.js +56 -0
  304. package/dist/services/external-work-launch.js +310 -0
  305. package/dist/services/flow-catalog.js +30 -0
  306. package/dist/services/flow-descriptors.js +82 -0
  307. package/dist/services/frozen-engine.js +387 -0
  308. package/dist/services/generic-execution.js +164 -0
  309. package/dist/services/harness-adapter.js +355 -36
  310. package/dist/services/harness-config.js +2 -0
  311. package/dist/services/harness-discovery.js +29 -0
  312. package/dist/services/harness-doctor.js +75 -0
  313. package/dist/services/harness-probe-effects.js +51 -0
  314. package/dist/services/harness-version-probe.js +100 -0
  315. package/dist/services/hook-memory-routing.js +188 -0
  316. package/dist/services/hook-recovery-guard.js +14 -0
  317. package/dist/services/hook-session-observation.js +24 -0
  318. package/dist/services/hooks.js +791 -326
  319. package/dist/services/hybrid-contracts.js +474 -0
  320. package/dist/services/hybrid-digest.js +14 -0
  321. package/dist/services/ids.js +29 -1
  322. package/dist/services/installation-lock.js +95 -0
  323. package/dist/services/installed-flow-source.js +226 -0
  324. package/dist/services/lanes.js +78 -65
  325. package/dist/services/lifecycle-command.js +1 -288
  326. package/dist/services/lifecycle-contract.js +1 -0
  327. package/dist/services/lifecycle-invocations.js +2148 -0
  328. package/dist/services/managed-daemon-binding.js +38 -0
  329. package/dist/services/managed-lease-monitor.js +133 -0
  330. package/dist/services/managed-processes.js +449 -69
  331. package/dist/services/memory-accepted-composition.js +78 -0
  332. package/dist/services/memory-baseline-preservation.js +65 -0
  333. package/dist/services/memory-completed-correction-wave.js +328 -0
  334. package/dist/services/memory-compose-handler.js +400 -0
  335. package/dist/services/memory-composition-acceptance.js +375 -0
  336. package/dist/services/memory-composition-graph.js +165 -0
  337. package/dist/services/memory-composition-registration.js +161 -0
  338. package/dist/services/memory-composition-work-custody.js +156 -0
  339. package/dist/services/memory-composition-work-results.js +108 -0
  340. package/dist/services/memory-corrected-review-acceptance.js +129 -0
  341. package/dist/services/memory-corrected-review-batch.js +37 -0
  342. package/dist/services/memory-corrected-review-findings.js +108 -0
  343. package/dist/services/memory-corrected-review-inputs.js +215 -0
  344. package/dist/services/memory-corrected-review-projection.js +78 -0
  345. package/dist/services/memory-corrected-review-receipt.js +178 -0
  346. package/dist/services/memory-corrected-review-registration.js +192 -0
  347. package/dist/services/memory-correction-check-receipt.js +235 -0
  348. package/dist/services/memory-correction-input-owner.js +6 -0
  349. package/dist/services/memory-custody-snapshot.js +36 -0
  350. package/dist/services/memory-discover-handler.js +104 -0
  351. package/dist/services/memory-finish-evidence.js +457 -0
  352. package/dist/services/memory-finish-handler.js +229 -0
  353. package/dist/services/memory-finish-integration.js +450 -0
  354. package/dist/services/memory-finish-readiness.js +169 -0
  355. package/dist/services/memory-git-integration.js +220 -0
  356. package/dist/services/memory-historical-corrected-review.js +212 -0
  357. package/dist/services/memory-historical-original-review.js +143 -0
  358. package/dist/services/memory-historical-repair-registration.js +105 -0
  359. package/dist/services/memory-historical-second-review.js +147 -0
  360. package/dist/services/memory-init-bootstrap-readiness.js +210 -0
  361. package/dist/services/memory-init-contexts.js +131 -0
  362. package/dist/services/memory-init-controller-start.js +103 -0
  363. package/dist/services/memory-init-engine-release.js +223 -0
  364. package/dist/services/memory-init-git-policy.js +165 -0
  365. package/dist/services/memory-init-lint-capability.js +203 -0
  366. package/dist/services/memory-init-native-capacity.js +309 -0
  367. package/dist/services/memory-init-preflight.js +334 -0
  368. package/dist/services/memory-init-project-bootstrap.js +599 -0
  369. package/dist/services/memory-init-request-candidate.js +213 -0
  370. package/dist/services/memory-init-request-input.js +82 -0
  371. package/dist/services/memory-init-resource-storage.js +125 -0
  372. package/dist/services/memory-init-run-allocation.js +81 -0
  373. package/dist/services/memory-init-run-bundle.js +135 -0
  374. package/dist/services/memory-init-start.js +181 -0
  375. package/dist/services/memory-init-startup-custody.js +80 -0
  376. package/dist/services/memory-init-startup-input.js +240 -0
  377. package/dist/services/memory-init-storage.js +91 -0
  378. package/dist/services/memory-init-stores.js +359 -0
  379. package/dist/services/memory-init-worktrunk-capability.js +174 -0
  380. package/dist/services/memory-layer-publication.js +611 -0
  381. package/dist/services/memory-layer.js +221 -0
  382. package/dist/services/memory-lint-config.js +194 -0
  383. package/dist/services/memory-native-review-copy.js +103 -0
  384. package/dist/services/memory-normal-flow-entry.js +87 -0
  385. package/dist/services/memory-ordinary-defaults.js +129 -0
  386. package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
  387. package/dist/services/memory-preflight-handler.js +274 -0
  388. package/dist/services/memory-repair-current-view.js +299 -0
  389. package/dist/services/memory-repair-document-delta.js +488 -0
  390. package/dist/services/memory-repair-history.js +496 -0
  391. package/dist/services/memory-repair-physical-binding.js +194 -0
  392. package/dist/services/memory-repair-publication-files.js +152 -0
  393. package/dist/services/memory-repair-publication-intent.js +27 -0
  394. package/dist/services/memory-repair-publication-plan.js +162 -0
  395. package/dist/services/memory-repair-publication-source.js +225 -0
  396. package/dist/services/memory-repair-publication.js +795 -0
  397. package/dist/services/memory-repair-registration.js +240 -0
  398. package/dist/services/memory-repair-work-baseline.js +415 -0
  399. package/dist/services/memory-repair-work-completion.js +117 -0
  400. package/dist/services/memory-repair-work-custody.js +73 -0
  401. package/dist/services/memory-repair-work-results.js +108 -0
  402. package/dist/services/memory-repair-workspace.js +261 -0
  403. package/dist/services/memory-repair-writer-copy.js +736 -0
  404. package/dist/services/memory-result-binding.js +239 -0
  405. package/dist/services/memory-retained-review-authority.js +138 -0
  406. package/dist/services/memory-retained-review-results.js +70 -0
  407. package/dist/services/memory-retained-second-baseline.js +102 -0
  408. package/dist/services/memory-retained-second-repairs.js +162 -0
  409. package/dist/services/memory-review-acceptance.js +214 -0
  410. package/dist/services/memory-review-correction-plan.js +206 -0
  411. package/dist/services/memory-review-handler.js +585 -0
  412. package/dist/services/memory-review-inputs.js +246 -0
  413. package/dist/services/memory-review-limits.js +10 -0
  414. package/dist/services/memory-review-receipt.js +180 -0
  415. package/dist/services/memory-review-registration.js +117 -0
  416. package/dist/services/memory-review-work-custody.js +126 -0
  417. package/dist/services/memory-review-work-input.js +91 -0
  418. package/dist/services/memory-review-work-results.js +95 -0
  419. package/dist/services/memory-second-corrected-review-inputs.js +167 -0
  420. package/dist/services/memory-second-correction-plan.js +77 -0
  421. package/dist/services/memory-second-repair-baseline.js +91 -0
  422. package/dist/services/memory-second-repair-launch.js +614 -0
  423. package/dist/services/memory-second-repair-registration.js +88 -0
  424. package/dist/services/memory-second-repair-source.js +187 -0
  425. package/dist/services/memory-second-review-acceptance.js +115 -0
  426. package/dist/services/memory-source-observations.js +117 -0
  427. package/dist/services/memory-stage-dispatch.js +65 -0
  428. package/dist/services/memory-stage-results.js +290 -0
  429. package/dist/services/memory-tool-probe.js +25 -0
  430. package/dist/services/memory-upgrade-analysis-handler.js +243 -0
  431. package/dist/services/memory-upgrade-bootstrap-readiness.js +251 -0
  432. package/dist/services/memory-upgrade-evidence.js +100 -0
  433. package/dist/services/memory-upgrade-inventory.js +442 -0
  434. package/dist/services/memory-upgrade-publication-custody.js +73 -0
  435. package/dist/services/memory-upgrade-publication.js +413 -0
  436. package/dist/services/memory-upgrade-selection.js +430 -0
  437. package/dist/services/memory-upgrade-start.js +60 -0
  438. package/dist/services/memory-upgrade-storage-readiness.js +340 -0
  439. package/dist/services/memory-verification-acceptance.js +156 -0
  440. package/dist/services/memory-verification-checks.js +317 -0
  441. package/dist/services/memory-verification-receipt.js +160 -0
  442. package/dist/services/memory-verify-handler.js +137 -0
  443. package/dist/services/memory-work-result-json.js +12 -0
  444. package/dist/services/memory-work-result-preparation.js +64 -0
  445. package/dist/services/merge-queue.js +228 -149
  446. package/dist/services/merge-server.js +163 -35
  447. package/dist/services/migrations.js +164 -114
  448. package/dist/services/model-catalog.js +109 -0
  449. package/dist/services/model-discovery.js +46 -0
  450. package/dist/services/native-daemon-history.js +50 -0
  451. package/dist/services/native-session-control.js +39 -0
  452. package/dist/services/operator-profiles.js +236 -0
  453. package/dist/services/physical-startup.js +45 -0
  454. package/dist/services/plan-runtime.js +26 -11
  455. package/dist/services/plans.js +28 -25
  456. package/dist/services/project-registry.js +97 -0
  457. package/dist/services/project-summary.js +1 -1
  458. package/dist/services/projects.js +17 -87
  459. package/dist/services/prompt-delivery.js +71 -0
  460. package/dist/services/prompts.js +28 -17
  461. package/dist/services/protocols.js +163 -87
  462. package/dist/services/provider-capacity.js +463 -0
  463. package/dist/services/recovery-observation-budget.js +121 -0
  464. package/dist/services/recovery-snapshot-database.js +588 -0
  465. package/dist/services/release-archive-producer.js +52 -0
  466. package/dist/services/release-archive.js +143 -0
  467. package/dist/services/release-cache.js +150 -0
  468. package/dist/services/release-compatibility.js +18 -0
  469. package/dist/services/release-download.js +67 -0
  470. package/dist/services/release-envelope.js +104 -0
  471. package/dist/services/release-manifest.js +45 -0
  472. package/dist/services/release-payload.js +114 -0
  473. package/dist/services/release-producer.js +63 -0
  474. package/dist/services/release-provenance.js +160 -0
  475. package/dist/services/release-registry.js +66 -0
  476. package/dist/services/release-source.js +194 -0
  477. package/dist/services/repair-intents.js +31 -0
  478. package/dist/services/repair-receipt.js +13 -0
  479. package/dist/services/review-copy.js +165 -0
  480. package/dist/services/review-deferral.js +23 -0
  481. package/dist/services/run-control-receipt.js +56 -0
  482. package/dist/services/run-control-worker.js +428 -0
  483. package/dist/services/run-control.js +1092 -0
  484. package/dist/services/run-controller-adapter.js +400 -0
  485. package/dist/services/run-controller-capture.js +186 -0
  486. package/dist/services/run-controller-process.js +205 -0
  487. package/dist/services/run-controller-recovery.js +295 -0
  488. package/dist/services/run-controller-state.js +97 -0
  489. package/dist/services/run-controller.js +1395 -0
  490. package/dist/services/run-engine-bindings.js +1 -1
  491. package/dist/services/run-fork.js +147 -0
  492. package/dist/services/run-health.js +149 -0
  493. package/dist/services/run-observations.js +152 -0
  494. package/dist/services/run-projection.js +22 -64
  495. package/dist/services/run-recovery-guard.js +107 -0
  496. package/dist/services/run-recovery-runtime.js +112 -0
  497. package/dist/services/run-recovery.js +456 -0
  498. package/dist/services/run-start-custody.js +189 -0
  499. package/dist/services/runs.js +1023 -246
  500. package/dist/services/runtime-budget.js +446 -0
  501. package/dist/services/runtime-command.js +43 -0
  502. package/dist/services/runtime-scope-capture.js +52 -0
  503. package/dist/services/runtime-scope-control.js +468 -0
  504. package/dist/services/runtime-scope-resume.js +605 -0
  505. package/dist/services/runtime-scope-stop.js +211 -0
  506. package/dist/services/runtime-scope-worker.js +314 -0
  507. package/dist/services/runtime-service.js +19 -14
  508. package/dist/services/schema-validation.js +10 -8
  509. package/dist/services/scope-writer-cleanup.js +27 -0
  510. package/dist/services/sessions.js +36 -91
  511. package/dist/services/setup.js +427 -0
  512. package/dist/services/stage-blocker.js +17 -7
  513. package/dist/services/stage-context.js +240 -18
  514. package/dist/services/stage-handlers.js +89 -0
  515. package/dist/services/stage-lifecycle.js +152 -116
  516. package/dist/services/stage-pause.js +202 -91
  517. package/dist/services/stage-report-renderer.js +234 -6
  518. package/dist/services/stage-work-graph.js +52 -0
  519. package/dist/services/tooling.js +41 -30
  520. package/dist/services/usage.js +49 -101
  521. package/dist/services/verification-matrix.js +393 -0
  522. package/dist/services/version-status.js +1 -1
  523. package/dist/services/vnext-code-review.js +235 -88
  524. package/dist/services/vnext-code.js +327 -226
  525. package/dist/services/vnext-contracts.js +10 -1
  526. package/dist/services/vnext-execution-profile.js +80 -5
  527. package/dist/services/vnext-fanout.js +355 -21
  528. package/dist/services/vnext-merge.js +332 -111
  529. package/dist/services/vnext-plan-review.js +287 -132
  530. package/dist/services/vnext-plan.js +228 -104
  531. package/dist/services/vnext-protocolize.js +533 -95
  532. package/dist/services/vnext-specify.js +123 -81
  533. package/dist/services/vnext-workspace-policy.js +7 -2
  534. package/dist/services/work-registry.js +1706 -200
  535. package/dist/services/workspace-bootstrap.js +53 -15
  536. package/dist/services/workspace-files.js +85 -0
  537. package/dist/services/worktrees.js +105 -48
  538. package/dist/shared/entity-references.js +1 -0
  539. package/dist/shared/errors.js +27 -0
  540. package/dist/storage/agent-output.js +26 -0
  541. package/dist/storage/data-preservation.js +65 -0
  542. package/dist/storage/database.js +930 -40
  543. package/dist/storage/foreign-key-transaction.js +39 -0
  544. package/dist/storage/immutable-input.js +45 -0
  545. package/dist/storage/import-guard.js +159 -0
  546. package/dist/storage/memory-upgrade-schema-bootstrap.js +38 -0
  547. package/dist/storage/native-cleanup.js +52 -0
  548. package/dist/storage/paired-writer-migration.js +424 -0
  549. package/dist/storage/paths.js +17 -4
  550. package/dist/storage/projection-lock.js +73 -0
  551. package/dist/storage/work-references.js +23 -0
  552. package/dist/storage/writer-contract.js +96 -0
  553. package/dist/storage/writer-migration.js +346 -0
  554. package/dist/storage/writer-restore.js +217 -0
  555. package/dist/verification-components.json +299 -0
  556. package/package.json +51 -13
  557. package/tools/create-canon-release.mjs +33 -0
  558. package/tools/probe-codex-history.mjs +37 -0
  559. package/tools/produce-hybrid-release.mjs +41 -0
  560. package/tools/repair-paused-run-status.mjs +84 -0
@@ -0,0 +1,213 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { createHash } from "node:crypto";
4
+ import { AppError, errorRecord } from "../shared/errors.js";
5
+ import { publishImmutableInput } from "../storage/immutable-input.js";
6
+ import { assertImportAdmission } from "../storage/import-guard.js";
7
+ import { hybridDigest } from "./hybrid-contracts.js";
8
+ import { readBoundedReleaseFile } from "./release-source.js";
9
+ import { validateMemoryInitObjective, validateMemoryInitStartupScope } from "./memory-init-startup-custody.js";
10
+ import { prepareMemoryInitRequestInput, prepareMemoryUpgradeRequestInput } from "./memory-init-request-input.js";
11
+ const preparedCandidates = new WeakMap();
12
+ /** Only a genuinely retained candidate can supply fresh startup input. Copied
13
+ * objects and caller-authored snapshots never acquire candidate authority. */
14
+ export function captureMemoryInitRequestCandidate(candidate, home, scope, objective) {
15
+ const witness = candidate && typeof candidate === "object" ? preparedCandidates.get(candidate) : undefined;
16
+ if (!witness || witness.operation !== "memory-init")
17
+ refuse("unprepared_request_candidate");
18
+ return witness.capture(home, scope, objective);
19
+ }
20
+ export function captureMemoryUpgradeRequestCandidate(candidate, home, scope, objective) {
21
+ const witness = candidate && typeof candidate === "object" ? preparedCandidates.get(candidate) : undefined;
22
+ if (!witness || witness.operation !== "memory-upgrade")
23
+ refuse("unprepared_request_candidate");
24
+ return witness.capture(home, scope, objective);
25
+ }
26
+ const sha = (bytes) => createHash("sha256").update(bytes).digest("hex");
27
+ function refuse(reason) {
28
+ throw new AppError("memory_init_request_candidate_invalid", "Init request candidate is unavailable or changed", 1, { reason, effect: "no_effect", next_action: "reconcile_exact_request" });
29
+ }
30
+ function exists(file) {
31
+ try {
32
+ fs.lstatSync(file);
33
+ return true;
34
+ }
35
+ catch (error) {
36
+ if (error.code === "ENOENT")
37
+ return false;
38
+ throw error;
39
+ }
40
+ }
41
+ function directory(file) {
42
+ const stat = fs.lstatSync(file);
43
+ if (!stat.isDirectory() || fs.realpathSync(file) !== file)
44
+ refuse("linked_candidate_directory");
45
+ return { dev: stat.dev, ino: stat.ino };
46
+ }
47
+ function syncDirectory(file) {
48
+ const fd = fs.openSync(file, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0));
49
+ try {
50
+ fs.fsyncSync(fd);
51
+ }
52
+ finally {
53
+ fs.closeSync(fd);
54
+ }
55
+ }
56
+ const candidateKey = (scope, operation) => hybridDigest(operation === "memory-upgrade"
57
+ ? { projectRoot: scope.projectRoot, requestId: scope.requestId } : scope);
58
+ /** Read-only preparation and exact byte capture. A candidate is not startup,
59
+ * storage, engine or dispatch authority. Retain only after prerequisite checks;
60
+ * no missing candidate component is reconstructed from ambient selections. */
61
+ export function prepareMemoryInitRequestCandidate(home, scope, selection, intake) {
62
+ return prepareMemoryRequestCandidate(home, scope, selection, intake, "memory-init");
63
+ }
64
+ export function prepareMemoryUpgradeRequestCandidate(home, scope, selection, intake) {
65
+ return prepareMemoryRequestCandidate(home, scope, selection, intake, "memory-upgrade");
66
+ }
67
+ /** Exact original input recovery before an incompatible SQLite store is opened.
68
+ * No profile, installed release, model, provider or missing component is chosen. */
69
+ export function readMemoryUpgradeRequestCandidate(home, scope) {
70
+ validateMemoryInitStartupScope(scope);
71
+ directory(home);
72
+ const namespace = path.join(home, "memory-upgrade-request-candidates"), key = candidateKey(scope, "memory-upgrade");
73
+ if (!exists(namespace))
74
+ return null;
75
+ directory(namespace);
76
+ const root = path.join(namespace, key), marker = path.join(namespace, `${key}.json`);
77
+ if (!exists(root) && !exists(marker))
78
+ return null;
79
+ if (!exists(root) || !exists(marker))
80
+ refuse("candidate_custody_missing");
81
+ directory(root);
82
+ const selection = readBoundedReleaseFile(path.join(root, "selection.json"), 256 * 1024);
83
+ const intake = readBoundedReleaseFile(path.join(root, "intake.txt"), 64 * 1024);
84
+ const candidate = prepareMemoryUpgradeRequestCandidate(home, scope, selection, intake);
85
+ // Existing-candidate retain verifies only; it cannot fill partial publication.
86
+ if (candidate.retain().created)
87
+ refuse("candidate_custody_missing");
88
+ return { candidate, objective: candidate.objective,
89
+ input: captureMemoryUpgradeRequestCandidate(candidate, home, scope, candidate.objective) };
90
+ }
91
+ function prepareMemoryRequestCandidate(home, scope, selection, intake, operation) {
92
+ validateMemoryInitStartupScope(scope);
93
+ scope = structuredClone(scope);
94
+ const selectionBytes = Buffer.from(selection), intakeBytes = Buffer.from(intake);
95
+ if (!selectionBytes.length || selectionBytes.length > 256 * 1024 || !intakeBytes.length || intakeBytes.length > 64 * 1024)
96
+ refuse("unbounded_request");
97
+ let objective;
98
+ try {
99
+ objective = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(intakeBytes);
100
+ }
101
+ catch {
102
+ return refuse("invalid_intake_utf8");
103
+ }
104
+ validateMemoryInitObjective(objective);
105
+ // Original-input validity is not installed-target or storage admission.
106
+ if (operation === "memory-upgrade")
107
+ prepareMemoryUpgradeRequestInput(scope, selectionBytes, intakeBytes, objective);
108
+ const homeOwner = directory(home);
109
+ if ([scope.projectRoot, scope.workspaceRoot].some(root => {
110
+ const relative = path.relative(root, home);
111
+ return relative === "" || !path.isAbsolute(relative) && relative !== ".." && !relative.startsWith(`..${path.sep}`);
112
+ }))
113
+ refuse("candidate_home_inside_project");
114
+ if (operation === "memory-init")
115
+ assertImportAdmission(home);
116
+ const namespace = path.join(home, `${operation}-request-candidates`), key = candidateKey(scope, operation);
117
+ const root = path.join(namespace, key), marker = path.join(namespace, `${key}.json`);
118
+ const inputFile = path.join(root, "intake.txt"), selectionFile = path.join(root, "selection.json");
119
+ const facts = { schema_id: `dd-flow/${operation}-request-candidate@1`, home, home_owner: homeOwner, scope,
120
+ selection_sha256: sha(selectionBytes), intake_sha256: sha(intakeBytes) };
121
+ const verify = () => {
122
+ if (hybridDigest(directory(home)) !== hybridDigest(homeOwner))
123
+ refuse("candidate_home_changed");
124
+ directory(namespace);
125
+ if (!exists(root) || !exists(marker))
126
+ refuse("candidate_custody_missing");
127
+ const expected = { ...facts, owner: directory(root) };
128
+ const bytes = readBoundedReleaseFile(marker, 16 * 1024);
129
+ let observed;
130
+ try {
131
+ observed = JSON.parse(bytes.toString("utf8"));
132
+ }
133
+ catch {
134
+ return refuse("candidate_request_changed");
135
+ }
136
+ // Metadata key order is not request identity. Original intake/selection
137
+ // remain byte-bound below; a reader must not rewrite their marker.
138
+ if (hybridDigest(observed) !== hybridDigest(expected))
139
+ refuse("candidate_request_changed");
140
+ if (!exists(inputFile) || !exists(selectionFile))
141
+ refuse("candidate_input_missing");
142
+ if (!readBoundedReleaseFile(inputFile, 64 * 1024).equals(intakeBytes)
143
+ || !readBoundedReleaseFile(selectionFile, 256 * 1024).equals(selectionBytes))
144
+ refuse("candidate_input_changed");
145
+ };
146
+ if (exists(namespace))
147
+ directory(namespace);
148
+ const found = exists(root) || exists(marker);
149
+ // Migration reconciliation must be able to read its original upgrade input
150
+ // while ordinary writers are fenced. It gains no permit or fresh write.
151
+ if (!found && operation === "memory-upgrade")
152
+ assertImportAdmission(home);
153
+ if (found)
154
+ verify();
155
+ let retained = false;
156
+ const complete = (created) => { retained = true; return { created, file: inputFile, sha256: facts.intake_sha256 }; };
157
+ const candidate = {
158
+ objective,
159
+ retain: () => {
160
+ if (found || operation === "memory-upgrade" && retained) {
161
+ verify();
162
+ return complete(false);
163
+ }
164
+ let started = false;
165
+ try {
166
+ if (hybridDigest(directory(home)) !== hybridDigest(homeOwner))
167
+ refuse("candidate_home_changed");
168
+ assertImportAdmission(home);
169
+ if (!exists(namespace)) {
170
+ try {
171
+ fs.mkdirSync(namespace, { mode: 0o700 });
172
+ started = true;
173
+ syncDirectory(home);
174
+ }
175
+ catch (error) {
176
+ if (error.code !== "EEXIST")
177
+ throw error;
178
+ }
179
+ }
180
+ directory(namespace);
181
+ // A concurrent publication is read-only to this caller. Never fill in
182
+ // another process's partial directory or claim its writes as ours.
183
+ if (exists(root) || exists(marker)) {
184
+ verify();
185
+ return complete(false);
186
+ }
187
+ fs.mkdirSync(root, { mode: 0o700 });
188
+ started = true;
189
+ syncDirectory(namespace);
190
+ publishImmutableInput(marker, Buffer.from(JSON.stringify({ ...facts, owner: directory(root) })), "memory_init_request_candidate_conflict");
191
+ publishImmutableInput(inputFile, intakeBytes, "memory_init_request_candidate_conflict");
192
+ publishImmutableInput(selectionFile, selectionBytes, "memory_init_request_candidate_conflict");
193
+ verify();
194
+ return complete(true);
195
+ }
196
+ catch (error) {
197
+ if (!started)
198
+ throw error;
199
+ throw new AppError("memory_init_request_candidate_incomplete", "Request candidate requires exact reconciliation", 1, { effect: "partial", request_id: scope.requestId, cause: errorRecord(error), next_action: "reconcile_exact_request" });
200
+ }
201
+ }
202
+ };
203
+ preparedCandidates.set(candidate, { operation, capture: (expectedHome, expectedScope, expectedObjective) => {
204
+ if (!retained)
205
+ refuse("request_candidate_not_retained");
206
+ if (home !== expectedHome || hybridDigest(scope) !== hybridDigest(expectedScope) || objective !== expectedObjective)
207
+ refuse("foreign_request_candidate");
208
+ verify();
209
+ return operation === "memory-upgrade" ? prepareMemoryUpgradeRequestInput(scope, selectionBytes, intakeBytes, objective)
210
+ : prepareMemoryInitRequestInput(scope, selectionBytes, intakeBytes, objective);
211
+ } });
212
+ return Object.freeze(candidate);
213
+ }
@@ -0,0 +1,82 @@
1
+ import { createHash } from "node:crypto";
2
+ import { AppError } from "../shared/errors.js";
3
+ import { hybridDigest } from "./hybrid-contracts.js";
4
+ const sha = (bytes) => createHash("sha256").update(bytes).digest("hex");
5
+ const object = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
6
+ const exact = (value, keys) => object(value) && Object.keys(value).sort().join() === [...keys].sort().join();
7
+ const digest = (value) => typeof value === "string" && /^[a-f0-9]{64}$/.test(value);
8
+ function refuse(reason) {
9
+ throw new AppError("memory_init_request_input_invalid", "Original init input is unavailable or inconsistent", 1, { reason, effect: "no_effect", next_action: "reconcile_exact_request" });
10
+ }
11
+ function decode(value, expected, limit) {
12
+ if (typeof value !== "string" || !value.length || value.length > 4 * Math.ceil(limit / 3) || !digest(expected))
13
+ refuse("invalid_input_encoding");
14
+ const bytes = Buffer.from(value, "base64");
15
+ if (!bytes.length || bytes.length > limit || bytes.toString("base64") !== value || sha(bytes) !== expected)
16
+ refuse("input_bytes_changed");
17
+ return bytes;
18
+ }
19
+ function text(bytes) {
20
+ try {
21
+ return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes);
22
+ }
23
+ catch {
24
+ return refuse("invalid_input_utf8");
25
+ }
26
+ }
27
+ /** Data-only decoding for SQL custody/recovery. No Home, files, engine registry,
28
+ * installed canon, current profiles or provider is consulted. */
29
+ function readMemoryRequestInput(value, scope, objective, operation) {
30
+ if (!exact(value, ["schema_id", "scope", "intake_base64", "intake_sha256", "selection_base64", "selection_sha256"])
31
+ || !object(value) || value.schema_id !== `dd-flow/${operation}-request-input@1`
32
+ || hybridDigest(value.scope) !== hybridDigest(scope))
33
+ refuse("invalid_input_scope");
34
+ const intake = decode(value.intake_base64, value.intake_sha256, 64 * 1024);
35
+ const selectionBytes = decode(value.selection_base64, value.selection_sha256, 256 * 1024);
36
+ if (typeof objective !== "string" || !objective.trim() || text(intake) !== objective)
37
+ refuse("input_objective_changed");
38
+ let selection;
39
+ try {
40
+ selection = JSON.parse(text(selectionBytes));
41
+ }
42
+ catch (error) {
43
+ if (error instanceof AppError)
44
+ throw error;
45
+ return refuse("invalid_selection_json");
46
+ }
47
+ if (!exact(selection, ["schema_id", "scope", "execution", "git_policy", "objective", "engine_checksum", "receipts",
48
+ ...(operation === "memory-upgrade" ? ["target_installation_sha256"] : [])])
49
+ || !object(selection) || selection.schema_id !== `dd-flow/${operation}-request-selection@1`
50
+ || operation === "memory-upgrade" && !digest(selection.target_installation_sha256)
51
+ || hybridDigest(selection.scope) !== hybridDigest(scope) || selection.objective !== objective
52
+ || !object(selection.execution) || !exact(selection.git_policy, ["route", "integrationBranch"])
53
+ || !object(selection.git_policy) || !["integration_branch_direct", "feature_worktree"].includes(String(selection.git_policy.route))
54
+ || typeof selection.git_policy.integrationBranch !== "string" || !selection.git_policy.integrationBranch
55
+ || selection.engine_checksum !== null && !digest(selection.engine_checksum)
56
+ || !Array.isArray(selection.receipts) || selection.receipts.some(entry => !Array.isArray(entry) || entry.length !== 2 || !digest(entry[0]) || !object(entry[1])))
57
+ refuse("invalid_original_selection");
58
+ return { intake, selectionBytes, selection: selection };
59
+ }
60
+ function prepareMemoryRequestInput(scope, selection, intake, objective, operation) {
61
+ if (!selection.byteLength || selection.byteLength > 256 * 1024 || !intake.byteLength || intake.byteLength > 64 * 1024)
62
+ refuse("unbounded_original_input");
63
+ const value = { schema_id: `dd-flow/${operation}-request-input@1`, scope: structuredClone(scope),
64
+ intake_base64: Buffer.from(intake).toString("base64"), intake_sha256: sha(intake),
65
+ selection_base64: Buffer.from(selection).toString("base64"), selection_sha256: sha(selection) };
66
+ readMemoryRequestInput(value, scope, objective, operation);
67
+ return value;
68
+ }
69
+ export function readMemoryInitRequestInput(value, scope, objective) {
70
+ const read = readMemoryRequestInput(value, scope, objective, "memory-init");
71
+ return { ...read, selection: read.selection };
72
+ }
73
+ export function readMemoryUpgradeRequestInput(value, scope, objective) {
74
+ const read = readMemoryRequestInput(value, scope, objective, "memory-upgrade");
75
+ return { ...read, selection: read.selection };
76
+ }
77
+ export function prepareMemoryInitRequestInput(scope, selection, intake, objective) {
78
+ return prepareMemoryRequestInput(scope, selection, intake, objective, "memory-init");
79
+ }
80
+ export function prepareMemoryUpgradeRequestInput(scope, selection, intake, objective) {
81
+ return prepareMemoryRequestInput(scope, selection, intake, objective, "memory-upgrade");
82
+ }
@@ -0,0 +1,125 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { getResourceDatabase } from "../storage/database.js";
4
+ import { STORE_WRITER_VERSION, storeWriterTriggerSql } from "../storage/writer-contract.js";
5
+ import { withStoreCleanup } from "../storage/native-cleanup.js";
6
+ import { AppError } from "../shared/errors.js";
7
+ import { hybridDigest } from "./hybrid-contracts.js";
8
+ import { resourceHome } from "./managed-processes.js";
9
+ const footprint = {
10
+ managed_processes: ["id", "kind", "pid", "pid_started_at", "owner_id", "lease_token", "lease_expires_at", "project_id", "run_id", "work_id", "check_id", "operation_id", "stdout_path", "stderr_path", "state", "started_at", "updated_at", "finished_at", "termination_reason", "metadata_json"],
11
+ managed_resources: ["resource_kind", "resource_key", "owner_id", "lease_token", "lease_expires_at", "process_id", "metadata_json", "created_at", "updated_at"]
12
+ };
13
+ const keys = { managed_processes: ["id"], managed_resources: ["resource_kind", "resource_key"] };
14
+ const indexes = {
15
+ idx_managed_processes_lease: { table: "managed_processes", columns: ["state", "lease_expires_at", "updated_at"] },
16
+ idx_managed_resources_lease: { table: "managed_resources", columns: ["lease_expires_at", "updated_at"] }
17
+ };
18
+ const normalize = (sql) => sql.replace(/\s+/g, " ").trim().replace(/;$/, "");
19
+ function refuse(reason) {
20
+ throw new AppError("memory_init_resource_storage_incompatible", "Memory init cannot admit the selected shared process registry without preparation", 1, { reason, effect: "no_effect", next_action: "prepare_selected_resource_store_then_retry" });
21
+ }
22
+ function inspect(db, home, owner) {
23
+ if (db.writable || db.path !== path.join(home, "runtime.sqlite"))
24
+ refuse("foreign_or_writable_reader");
25
+ const contract = db.all("SELECT id, version FROM dd_flow_writer_contract");
26
+ if (contract.length !== 1 || contract[0]?.id !== 1 || contract[0].version !== STORE_WRITER_VERSION)
27
+ refuse("writer_contract_mismatch");
28
+ const schema = {};
29
+ for (const [table, required] of Object.entries(footprint)) {
30
+ const columns = db.all(`PRAGMA table_info("${table}")`);
31
+ if (required.some(name => !columns.some(column => column.name === name)))
32
+ refuse(`missing_operation_column:${table}`);
33
+ if (required.some(name => columns.find(column => column.name === name)?.type.toUpperCase() !== (table === "managed_processes" && name === "pid" ? "INTEGER" : "TEXT")))
34
+ refuse(`operation_column_type_mismatch:${table}`);
35
+ if (JSON.stringify(columns.filter(column => column.pk > 0).sort((a, b) => a.pk - b.pk).map(column => column.name)) !== JSON.stringify(keys[table]))
36
+ refuse(`operation_primary_key_mismatch:${table}`);
37
+ schema[table] = columns.map(({ name, type, notnull, pk }) => ({ name, type, notnull, pk }));
38
+ }
39
+ for (const table of [...Object.keys(footprint), "dd_flow_writer_contract"]) {
40
+ const fences = [];
41
+ for (const action of ["INSERT", "UPDATE", "DELETE"]) {
42
+ const expected = storeWriterTriggerSql(table, action);
43
+ const actual = db.get("SELECT sql FROM sqlite_schema WHERE type = 'trigger' AND name = ? AND tbl_name = ?", [expected.name, table]);
44
+ if (!actual || normalize(actual.sql) !== normalize(expected.sql))
45
+ refuse(`writer_fence_mismatch:${table}`);
46
+ fences.push(normalize(actual.sql));
47
+ }
48
+ schema[`${table}:fences`] = fences;
49
+ }
50
+ for (const [name, expected] of Object.entries(indexes)) {
51
+ const entry = db.all(`PRAGMA index_list("${expected.table}")`).find(index => index.name === name);
52
+ if (!entry || entry.unique !== 0 || entry.partial !== 0
53
+ || JSON.stringify(db.all(`PRAGMA index_info("${name}")`).map(column => column.name)) !== JSON.stringify(expected.columns))
54
+ refuse(`operation_index_mismatch:${name}`);
55
+ schema[name] = { table: expected.table, columns: expected.columns };
56
+ }
57
+ return { schema_id: "dd-flow/memory-init-resource-storage@1", operation: "memory-init",
58
+ store_kind: "resource", store_path: db.path, store_dev: owner.dev, store_ino: owner.ino, executing_writer_version: STORE_WRITER_VERSION,
59
+ schema_sha256: hybridDigest(schema), route: "verified-no-op", outcome: "no-op" };
60
+ }
61
+ /** Retained proof shape, not current physical/storage admission. */
62
+ export function isMemoryInitResourceStorageFacts(value) {
63
+ if (!value || typeof value !== "object" || Array.isArray(value))
64
+ return false;
65
+ const facts = value;
66
+ return Object.keys(facts).length === 10 && facts.schema_id === "dd-flow/memory-init-resource-storage@1"
67
+ && facts.operation === "memory-init" && facts.store_kind === "resource"
68
+ && typeof facts.store_path === "string" && path.isAbsolute(facts.store_path)
69
+ && ["store_dev", "store_ino"].every(key => Number.isSafeInteger(facts[key]) && Number(facts[key]) >= 0)
70
+ && facts.executing_writer_version === 2 && typeof facts.schema_sha256 === "string" && /^[a-f0-9]{64}$/.test(facts.schema_sha256)
71
+ && facts.route === "verified-no-op" && facts.outcome === "no-op";
72
+ }
73
+ /** Readonly pre-open admission for the executing CLI's selected process registry.
74
+ * Never initializes/migrates an absent or incompatible store, and never reuses
75
+ * an ambient cached writer. Does not attest provider, frozen-engine support or
76
+ * draining/settlement of live processes.
77
+ */
78
+ export class PreparedMemoryInitResourceStorage {
79
+ sha256;
80
+ #home;
81
+ #facts;
82
+ constructor(home, facts) {
83
+ this.#home = home;
84
+ this.#facts = facts;
85
+ this.sha256 = hybridDigest(facts);
86
+ Object.freeze(this);
87
+ }
88
+ static prepare(context) {
89
+ const home = resourceHome(context);
90
+ if (!path.isAbsolute(home) || path.resolve(home) !== home)
91
+ refuse("resource_home_not_absolute_canonical");
92
+ const file = path.join(home, "runtime.sqlite");
93
+ try {
94
+ if (fs.realpathSync(home) !== home || !fs.lstatSync(home).isDirectory())
95
+ refuse("resource_home_linked_or_unavailable");
96
+ const owner = fs.lstatSync(file);
97
+ if (!owner.isFile() || owner.nlink !== 1)
98
+ refuse("resource_store_linked_or_unavailable");
99
+ const reader = getResourceDatabase(home, "read_isolated", context.databaseDeadlineAt);
100
+ return withStoreCleanup(() => {
101
+ const facts = reader.readSnapshot(() => {
102
+ const facts = inspect(reader, home, owner), integrity = reader.all("PRAGMA quick_check");
103
+ if (integrity.length !== 1 || integrity[0]?.quick_check !== "ok" || reader.all("PRAGMA foreign_key_check").length)
104
+ refuse("storage_integrity_failed");
105
+ return facts;
106
+ });
107
+ const current = fs.lstatSync(file);
108
+ if (!current.isFile() || current.nlink !== 1 || current.dev !== owner.dev || current.ino !== owner.ino)
109
+ refuse("resource_store_owner_changed");
110
+ return new PreparedMemoryInitResourceStorage(home, facts);
111
+ }, () => reader.close?.(), () => ({ store_kind: "resource", store_path: file }));
112
+ }
113
+ catch (error) {
114
+ if (error instanceof AppError)
115
+ throw error;
116
+ return refuse("resource_storage_observation_failed");
117
+ }
118
+ }
119
+ facts() { return { ...this.#facts }; }
120
+ revalidate(context) {
121
+ const selected = PreparedMemoryInitResourceStorage.prepare(context);
122
+ if (selected.#home !== this.#home || selected.sha256 !== this.sha256)
123
+ refuse("resource_storage_changed_after_preparation");
124
+ }
125
+ }
@@ -0,0 +1,81 @@
1
+ import path from "node:path";
2
+ import { AppError } from "../shared/errors.js";
3
+ import { parseFullEntityId } from "../domain/entity-ids.js";
4
+ import { readMemoryInitBootstrapReadiness } from "./memory-init-bootstrap-readiness.js";
5
+ import { hybridDigest } from "./hybrid-contracts.js";
6
+ import { nextRunId } from "./ids.js";
7
+ import { appendAudit } from "./audit.js";
8
+ const event = "memory.init_run_allocation", intentEvent = "memory.init_run_allocation_intent";
9
+ function refuse(reason) {
10
+ throw new AppError("memory_init_run_allocation_invalid", "Memory init RUN allocation requires exact retained bootstrap request custody", 1, { reason, effect: "no_effect", next_action: "reconcile_exact_request" });
11
+ }
12
+ function selected(context, scope) {
13
+ if (!scope || Object.keys(scope).sort().join() !== "projectRoot,requestId,workspaceRoot"
14
+ || typeof scope.requestId !== "string" || !scope.requestId.trim() || scope.requestId.length > 256
15
+ || typeof scope.projectRoot !== "string" || !path.isAbsolute(scope.projectRoot)
16
+ || typeof scope.workspaceRoot !== "string" || !path.isAbsolute(scope.workspaceRoot))
17
+ refuse("invalid_request_scope");
18
+ const ready = readMemoryInitBootstrapReadiness(context, scope);
19
+ if (!ready)
20
+ refuse("registered_bootstrap_readiness_required");
21
+ return { projectId: ready.projectId, sha256: hybridDigest(ready.authority) };
22
+ }
23
+ function retained(context, scope, selection) {
24
+ const rows = (type) => context.db.all("SELECT payload_json FROM audit_events WHERE project_id=? AND event_type=? AND json_extract(payload_json,'$.scope.requestId')=? LIMIT 2", [selection.projectId, type, scope.requestId]);
25
+ const allocations = rows(event), intents = rows(intentEvent);
26
+ if (!allocations.length && !intents.length)
27
+ return null;
28
+ if (allocations.length !== 1 || intents.length !== 1)
29
+ refuse("allocation_pair_missing_or_ambiguous");
30
+ try {
31
+ if (Buffer.byteLength(allocations[0].payload_json) > 16 * 1024 || Buffer.byteLength(intents[0].payload_json) > 16 * 1024)
32
+ refuse("unbounded_allocation");
33
+ const allocation = JSON.parse(allocations[0].payload_json);
34
+ const intent = JSON.parse(intents[0].payload_json);
35
+ if (typeof allocation?.run_id !== "string")
36
+ refuse("invalid_allocation_identity");
37
+ const parsed = parseFullEntityId(allocation.run_id), sequence = Number(parsed.shortId.slice(4));
38
+ if (parsed.type !== "RUN" || !Number.isSafeInteger(sequence) || sequence < 1)
39
+ refuse("invalid_allocation_identity");
40
+ if (Object.keys(allocation).sort().join() !== "bootstrap_authority_sha256,project_id,run_id,schema_id,scope"
41
+ || allocation.schema_id !== "dd-flow/memory-init-run-allocation@1" || allocation.project_id !== selection.projectId
42
+ || hybridDigest(allocation.scope) !== hybridDigest(scope) || allocation.bootstrap_authority_sha256 !== selection.sha256
43
+ || hybridDigest(intent) !== hybridDigest({ schema_id: "dd-flow/memory-init-run-allocation-intent@1", scope, run_id: allocation.run_id, allocation_sha256: hybridDigest(allocation) }))
44
+ refuse("allocation_custody_changed");
45
+ return Object.freeze(structuredClone(allocation));
46
+ }
47
+ catch (error) {
48
+ if (error instanceof AppError && error.code === "memory_init_run_allocation_invalid")
49
+ throw error;
50
+ return refuse("invalid_allocation_bytes");
51
+ }
52
+ }
53
+ /** Read only. Neither metadata nor an allocated id authorizes a Session,
54
+ * bundle, RUN row or project mutation. */
55
+ export function readMemoryInitRunAllocation(context, scope) {
56
+ return context.db.readSnapshot(() => retained(context, scope, selected(context, scope)));
57
+ }
58
+ /** SQL-only atomic reservation after real bootstrap readiness. The canonical
59
+ * request retains one RUN identity before bundle or RUN filesystem effects. */
60
+ export function reserveMemoryInitRunAllocation(context, scope) {
61
+ const prepared = context.db.readSnapshot(() => selected(context, scope));
62
+ return context.db.writeTransaction(() => {
63
+ if (context.db.isOwnedWriteTransaction?.() !== true)
64
+ refuse("owned_allocation_writer_required");
65
+ const current = selected(context, scope);
66
+ if (hybridDigest(current) !== hybridDigest(prepared))
67
+ refuse("bootstrap_changed_before_allocation");
68
+ const prior = retained(context, scope, current);
69
+ if (prior)
70
+ return { allocation: prior, changed: false };
71
+ const allocation = { schema_id: "dd-flow/memory-init-run-allocation@1", scope: structuredClone(scope),
72
+ project_id: current.projectId, run_id: nextRunId(context, current.projectId, "mb-init"), bootstrap_authority_sha256: current.sha256 };
73
+ appendAudit(context, { projectId: current.projectId, eventType: intentEvent,
74
+ payload: { schema_id: "dd-flow/memory-init-run-allocation-intent@1", scope, run_id: allocation.run_id, allocation_sha256: hybridDigest(allocation) } });
75
+ appendAudit(context, { projectId: current.projectId, eventType: event, payload: allocation });
76
+ const accepted = retained(context, scope, current);
77
+ if (!accepted || hybridDigest(accepted) !== hybridDigest(allocation))
78
+ refuse("allocation_readback_failed");
79
+ return { allocation: accepted, changed: true };
80
+ }, "memoryInit.reserveRun");
81
+ }
@@ -0,0 +1,135 @@
1
+ import { createHash } from "node:crypto";
2
+ import { AppError } from "../shared/errors.js";
3
+ import { PreparedInstalledFlowSource } from "./installed-flow-source.js";
4
+ import { FrozenGenericExecution } from "./generic-execution.js";
5
+ import { AdmittedFrozenEngine } from "./frozen-engine.js";
6
+ import { RetainedExecutionBundle } from "./execution-bundles.js";
7
+ import { readMemoryInitBootstrapReadiness } from "./memory-init-bootstrap-readiness.js";
8
+ import { readMemoryInitRunAllocation } from "./memory-init-run-allocation.js";
9
+ import { readMemoryInitProjectBootstrap } from "./memory-init-project-bootstrap.js";
10
+ import { bundledHandlerContext } from "./stage-handlers.js";
11
+ import { hybridDigest } from "./hybrid-contracts.js";
12
+ import { readMemoryUpgradeBootstrapReadiness } from "./memory-upgrade-bootstrap-readiness.js";
13
+ import { readUpgradeStorageReadiness } from "./memory-upgrade-storage-readiness.js";
14
+ import { nextDescriptorRunId } from "./descriptor-run-start.js";
15
+ const bytes = (value) => Buffer.from(JSON.stringify(value));
16
+ const hash = (value) => createHash("sha256").update(value).digest("hex");
17
+ function refuse(reason) {
18
+ throw new AppError("memory_init_run_bundle_invalid", "Memory RUN bundle requires the exact installed bootstrap selection", 1, { reason, phase: "prepare", effect: "no_effect", next_action: "reconcile_exact_request" });
19
+ }
20
+ /** Initial bundle construction only, outside the SQL writer. Existing RUNs
21
+ * restore their retained bundle; they must not re-read current operator canon.
22
+ * No reservation, RUN, Session, Work or filesystem publication occurs here.
23
+ */
24
+ export function prepareMemoryInitRunBundle(context, input) {
25
+ if (!(input.source instanceof PreparedInstalledFlowSource) || !(input.execution instanceof FrozenGenericExecution)
26
+ || !(input.engine instanceof AdmittedFrozenEngine))
27
+ refuse("unprepared_selection");
28
+ const snapshot = input.execution.snapshot(), scope = { requestId: snapshot.scope.requestId,
29
+ projectRoot: snapshot.scope.projectRoot, workspaceRoot: snapshot.scope.workspace };
30
+ const ready = readMemoryInitBootstrapReadiness(context, scope), allocation = readMemoryInitRunAllocation(context, scope);
31
+ const bootstrap = readMemoryInitProjectBootstrap(context, scope);
32
+ if (!ready || !allocation || !bootstrap || allocation.project_id !== ready.projectId
33
+ || ready.authority.binding.execution_sha256 !== input.execution.sha256)
34
+ refuse("bootstrap_selection_changed");
35
+ input.source.revalidate();
36
+ const flow = input.source.resolveRegisteredFlow(), canon = input.source.canonProvenance();
37
+ const release = JSON.parse(Buffer.from(ready.authority.binding.installation_manifest_base64, "base64").toString("utf8"));
38
+ if (input.source.installationSha256() !== ready.authority.binding.installation_manifest_sha256
39
+ || flow.sha256 !== snapshot.settings.descriptor_sha256 || snapshot.settings.flow_id !== "mb-init"
40
+ || canon.version !== release.canon.version || canon.commit !== release.canon.commit
41
+ || canon.archive_sha256 !== release.canon.archive.sha256
42
+ || !input.engine.manifestBytes().equals(Buffer.from(ready.authority.binding.engine_manifest_base64, "base64")))
43
+ refuse("frozen_source_changed");
44
+ return prepareMemoryRunBundle(input, ready, { runId: allocation.run_id, boundAt: bootstrap.receipt.created_at,
45
+ flowId: "mb-init", projectPack: { sha256: ready.authority.binding.pack_sha256, source_commit: canon.commit } });
46
+ }
47
+ /** Upgrade executes the target canon but starts with the original project pack.
48
+ * It must not claim that publication has already happened at RUN allocation. */
49
+ export function prepareMemoryUpgradeRunBundle(context, input) {
50
+ if (!(input.source instanceof PreparedInstalledFlowSource) || !(input.execution instanceof FrozenGenericExecution)
51
+ || !(input.engine instanceof AdmittedFrozenEngine))
52
+ refuse("unprepared_selection");
53
+ const snapshot = input.execution.snapshot(), scope = { requestId: snapshot.scope.requestId,
54
+ projectRoot: snapshot.scope.projectRoot, workspaceRoot: snapshot.scope.workspace };
55
+ const ready = readMemoryUpgradeBootstrapReadiness(context, scope), storage = readUpgradeStorageReadiness(context, scope);
56
+ if (!ready || !storage?.selection || !ready.hasFlowCapability || !ready.hasGitPolicy || !ready.hasLintCapability
57
+ || !ready.hasPreservationBaseline || ready.authority.binding.execution_sha256 !== input.execution.sha256
58
+ || ready.authority.binding.selection_sha256 !== storage.selection.sha256)
59
+ refuse("bootstrap_selection_changed");
60
+ const p = storage.selection.payload, canon = input.source.canonProvenance();
61
+ input.source.revalidate();
62
+ if (input.source.sha256 !== p.source.sha256 || input.source.installationSha256() !== p.release.manifest_sha256
63
+ || snapshot.settings.flow_id !== "mb-upgrade" || input.source.resolveRegisteredFlow().sha256 !== snapshot.settings.descriptor_sha256
64
+ || canon.version !== storage.selection.release.canon.version || canon.commit !== storage.selection.release.canon.commit
65
+ || canon.archive_sha256 !== storage.selection.release.canon.archive.sha256
66
+ || !input.engine.manifestBytes().equals(Buffer.from(ready.authority.binding.engine_manifest_base64, "base64")))
67
+ refuse("frozen_source_changed");
68
+ return prepareMemoryRunBundle(input, ready, {
69
+ runId: nextDescriptorRunId(context, { projectRoot: scope.projectRoot, requestId: scope.requestId, slug: "mb-upgrade" }),
70
+ boundAt: ready.createdAt, flowId: "mb-upgrade",
71
+ projectPack: { sha256: ready.authority.receipt.project_current.pack_sha256, source_commit: p.current.source_commit }
72
+ });
73
+ }
74
+ function prepareMemoryRunBundle(input, ready, selected) {
75
+ const snapshot = input.execution.snapshot(), scope = { requestId: snapshot.scope.requestId,
76
+ projectRoot: snapshot.scope.projectRoot, workspaceRoot: snapshot.scope.workspace };
77
+ const { bootstrapIdentity, receipts: bootstrapReceipts } = ready.admission;
78
+ if (!bootstrapIdentity || !bootstrapReceipts)
79
+ refuse("bootstrap_admission_missing");
80
+ const receipts = new Map(bootstrapReceipts);
81
+ for (const reference of [snapshot.settings.attached_session_receipt, snapshot.settings.delegation.native_capacity_receipt]) {
82
+ if (reference === null)
83
+ continue;
84
+ const fact = input.receipts?.get(reference.sha256);
85
+ if (!fact)
86
+ refuse("execution_receipt_custody_missing");
87
+ if (receipts.has(reference.sha256) && hybridDigest(receipts.get(reference.sha256)) !== hybridDigest(fact))
88
+ refuse("execution_receipt_collision");
89
+ receipts.set(reference.sha256, structuredClone(fact));
90
+ }
91
+ const flow = input.source.resolveRegisteredFlow(), canon = input.source.canonProvenance();
92
+ const manifest = input.engine.manifest(), runId = selected.runId;
93
+ if (typeof manifest.integrity.checksum !== "string")
94
+ refuse("missing_engine_checksum");
95
+ // The accepted bootstrap timestamp makes reconstruction stable after a lost
96
+ // reply. Current time is not a new selector for this request's engine binding.
97
+ const binding = { schema_id: "dd-flow/run-engine-binding@1", run_id: runId, project_root: scope.projectRoot,
98
+ bound_at: selected.boundAt, source: "run_creation", reason: selected.flowId === "mb-init" ? "Request-bound memory init bootstrap" : "Request-bound memory upgrade bootstrap",
99
+ engine: { package_name: manifest.package_name, package_version: manifest.package_version, engine_version: manifest.engine_version,
100
+ integrity_checksum: manifest.integrity.checksum, snapshot_root: manifest.snapshot_root }, probe: { status: "not_required", command: null } };
101
+ const blobs = input.source.blobs();
102
+ const put = (logical, content) => {
103
+ if (blobs.has(logical))
104
+ refuse("bundle_path_collision");
105
+ blobs.set(logical, content);
106
+ return { path: logical, sha256: hash(content) };
107
+ };
108
+ for (const reference of [snapshot.settings.attached_session_receipt, snapshot.settings.delegation.native_capacity_receipt]) {
109
+ if (reference === null)
110
+ continue;
111
+ const content = input.receiptBytes?.get(reference.sha256);
112
+ if (!content || hash(content) !== reference.sha256)
113
+ refuse("execution_receipt_evidence_missing_or_changed");
114
+ put(reference.path, Buffer.from(content));
115
+ }
116
+ const profiles = { schema_id: "dd-flow/profile-settings@1", profiles: snapshot.profiles, aliases: {}, default_profile: null };
117
+ const profile = put("runtime/profiles.json", bytes({ ...profiles, revision: hybridDigest(profiles) }));
118
+ const execution = put("runtime/execution.json", bytes(snapshot.settings));
119
+ const engineBinding = put("runtime/engine-binding.json", bytes(binding));
120
+ const engineManifest = put("runtime/engine-manifest.json", input.engine.manifestBytes());
121
+ for (const evidence of ready.authority.evidence)
122
+ put(evidence.path, Buffer.from(evidence.base64, "base64"));
123
+ const receipt = put("receipts/bootstrap.json", bytes(ready.authority.receipt));
124
+ const provenance = { canon, project_pack: selected.projectPack };
125
+ const bundle = { schema_id: "dd-flow/execution-bundle@1", run_id: runId, flow_id: selected.flowId,
126
+ descriptor: input.source.descriptorReference(), execution_settings: execution, profile_settings: profile,
127
+ engine_binding: engineBinding, engine_manifest: engineManifest, bootstrap_receipts: [receipt], ...provenance,
128
+ inventory: [...blobs].map(([logical, content]) => ({ path: logical, sha256: hash(content) })) };
129
+ const encoded = bytes(bundle);
130
+ return RetainedExecutionBundle.admit(encoded, hash(encoded), blobs, { runId, executionScope: snapshot.scope,
131
+ bundleProjectRoot: scope.projectRoot, descriptorSha256: flow.sha256, engineChecksum: manifest.integrity.checksum,
132
+ engineBindingSha256: engineBinding.sha256, engineManifestSha256: engineManifest.sha256,
133
+ descriptorContext: bundledHandlerContext(new Map()), bundleProvenance: provenance,
134
+ bootstrapIdentity, receipts });
135
+ }