@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,105 @@
1
+ import { assertMemorySqlCustody } from "./memory-custody-snapshot.js";
2
+ import { AppError } from "../shared/errors.js";
3
+ import { hybridDigest } from "./hybrid-contracts.js";
4
+ import { PreparedHistoricalOriginalMemoryReview } from "./memory-historical-original-review.js";
5
+ import { readRetainedMemoryRepairRegistration, assertRetainedMemoryRepairAllocation, memoryRepairBatch, memoryRepairWorkerSchema } from "./memory-repair-registration.js";
6
+ import { validateMemoryReviewCorrectionPlan, memoryRepairCanonicalPaths } from "./memory-review-correction-plan.js";
7
+ import { memoryReviewWaveProjection } from "./memory-review-acceptance.js";
8
+ const token = Symbol("historical-memory-repair-registration");
9
+ function refuse(reason) {
10
+ throw new AppError("memory_historical_repair_registration_invalid", "Closed review lacks retained repair graph custody", 2, { reason, effect: "no_effect" });
11
+ }
12
+ function selected(context, original) {
13
+ original.assertCustody(context);
14
+ const registration = original.registration(), receipt = readRetainedMemoryRepairRegistration(context, registration.scope);
15
+ const results = original.results(), bundle = original.bundle();
16
+ if (receipt.original_registration_sha256 !== hybridDigest(registration) || receipt.review_sha256 !== original.reviewSha256()
17
+ || results.some(result => result.outcome === "blocked"))
18
+ refuse("historical_original_review_changed");
19
+ const engine = bundle.engine();
20
+ const plan = validateMemoryReviewCorrectionPlan(Buffer.from(receipt.plan_base64, "base64"), engine, {
21
+ runId: registration.run_id, wave: 1, reviewSha256: original.reviewSha256(), units: registration.view.unit_inventory,
22
+ canonicalPaths: memoryRepairCanonicalPaths(context, bundle),
23
+ findings: memoryReviewWaveProjection(results, registration.view.diagnostic_findings).findings
24
+ });
25
+ for (const item of plan.works)
26
+ bundle.execution.work("review", item.profile_id ?? undefined);
27
+ if (JSON.parse(engine.schema("memory-repair-work-result").toString("utf8")).$id !== memoryRepairWorkerSchema)
28
+ refuse("frozen_repair_schema_required");
29
+ const batch = memoryRepairBatch({ scope: registration.scope, plan, planSha256: receipt.plan_sha256,
30
+ originalRegistrationSha256: hybridDigest(registration), references: [...registration.view.run_inputs,
31
+ ...original.references().map(ref => ({ root: "run", ...ref.result }))], findings: memoryReviewWaveProjection(results, registration.view.diagnostic_findings).findings });
32
+ assertRetainedMemoryRepairAllocation(context, receipt, batch);
33
+ return { receipt, batch };
34
+ }
35
+ /** Closed-Stage repair graph only. Deliberately a distinct private-branded
36
+ * type: fresh repair baseline/copy/start/allocation APIs do not accept it.
37
+ * Settled-history validation may consume it without requiring live review. */
38
+ export class PreparedHistoricalMemoryRepairRegistration {
39
+ #custodyKey = {};
40
+ static isPrepared(value) {
41
+ return typeof value === "object" && value !== null && #original in value;
42
+ }
43
+ sha256;
44
+ #original;
45
+ #receipt;
46
+ #batch;
47
+ constructor(key, original, value) {
48
+ if (key !== token)
49
+ refuse("historical_registration_token_required");
50
+ this.#original = original;
51
+ this.#receipt = structuredClone(value.receipt);
52
+ this.#batch = structuredClone(value.batch);
53
+ this.sha256 = hybridDigest(value.receipt);
54
+ Object.freeze(this);
55
+ }
56
+ static prepare(context, original) {
57
+ if (!PreparedHistoricalOriginalMemoryReview.isPrepared(original))
58
+ refuse("historical_original_owner_required");
59
+ if (context.db.isOwnedWriteTransaction?.())
60
+ refuse("preparation_outside_writer_required");
61
+ original.revalidate(context);
62
+ const value = context.db.readSnapshot(() => selected(context, original));
63
+ const prepared = new PreparedHistoricalMemoryRepairRegistration(token, original, value);
64
+ prepared.assertCustody(context);
65
+ return prepared;
66
+ }
67
+ receipt() { return structuredClone(this.#receipt); }
68
+ batch() { return structuredClone(this.#batch); }
69
+ review() { return { original: () => this.#original }; }
70
+ completedWorkOrder(context) {
71
+ this.assertCustody(context);
72
+ const receipt = this.#receipt, scope = receipt.scope, batch = this.#batch;
73
+ const all = context.db.all("SELECT id,json_extract(payload_json,'$.work_id') AS work_id FROM audit_events WHERE project_id=? AND event_type='memory.repair_work_settlement' AND json_extract(payload_json,'$.run_id')=? ORDER BY id LIMIT 257", [scope.project_id, scope.run_id]);
74
+ if (all.length > 256)
75
+ refuse("unbounded_historical_settlements");
76
+ const ids = new Set(Object.values(receipt.work_ids)), rows = all.filter(row => ids.has(row.work_id));
77
+ if (rows.length !== batch.works.length || new Set(rows.map(row => row.work_id)).size !== batch.works.length
78
+ || rows.some(row => !Number.isSafeInteger(row.id) || row.id <= 0))
79
+ refuse("historical_settlement_coverage_changed");
80
+ const order = new Map(rows.map((row, index) => [row.work_id, index]));
81
+ for (const item of batch.works) {
82
+ const workId = receipt.work_ids[item.key];
83
+ const work = context.db.get("SELECT status FROM works WHERE project_id=? AND run_id=? AND work_id=? AND parent_work_id=?", [scope.project_id, scope.run_id, workId, scope.parent_work_id]);
84
+ if (work?.status !== "completed" || item.depends_on.some(key => {
85
+ const dependency = receipt.work_ids[key];
86
+ return !dependency || order.get(dependency) >= order.get(workId);
87
+ }))
88
+ refuse("historical_dependency_order_changed");
89
+ }
90
+ return rows.map(row => row.work_id);
91
+ }
92
+ assertCustody(context) {
93
+ const original = this.#original;
94
+ assertMemorySqlCustody(context, this.#custodyKey, () => {
95
+ original.assertCustody(context);
96
+ const receipt = readRetainedMemoryRepairRegistration(context, this.#receipt.scope);
97
+ if (hybridDigest(receipt) !== this.sha256)
98
+ refuse("historical_repair_registration_changed");
99
+ // The immutable plan/batch was admitted by prepare. Custody checks reread
100
+ // scoped SQL allocation, not the same frozen engine and plan again.
101
+ assertRetainedMemoryRepairAllocation(context, receipt, this.#batch);
102
+ });
103
+ }
104
+ revalidate(context) { this.#original.revalidate(context); this.assertCustody(context); }
105
+ }
@@ -0,0 +1,147 @@
1
+ import { assertMemorySqlCustody } from "./memory-custody-snapshot.js";
2
+ import { AppError } from "../shared/errors.js";
3
+ import { hybridDigest } from "./hybrid-contracts.js";
4
+ import { PreparedHistoricalSecondMemoryCorrectionWave } from "./memory-completed-correction-wave.js";
5
+ import { assertHistoricalMemoryReviewSources } from "./memory-historical-corrected-review.js";
6
+ import { readRetainedSecondCorrectedMemoryReviewRegistration } from "./memory-corrected-review-registration.js";
7
+ import { PreparedRetainedMemoryCorrectionChecks } from "./memory-correction-check-receipt.js";
8
+ import { secondCorrectedMemoryReviewAssignments, secondCorrectedMemoryReviewReferences } from "./memory-second-corrected-review-inputs.js";
9
+ import { memoryCorrectedReviewBatch } from "./memory-corrected-review-batch.js";
10
+ import { runtimeHarness } from "./execution-policy.js";
11
+ import { readMemoryReviewWorkSettlement } from "./memory-review-acceptance.js";
12
+ import { validateMemoryReviewWorkResult } from "./memory-review-work-results.js";
13
+ import { assertSelectiveMemoryReviewCoverage } from "./memory-corrected-review-acceptance.js";
14
+ import { correctedMemoryReviewUnits } from "./memory-corrected-review-projection.js";
15
+ import { correctedMemoryReviewFindings } from "./memory-corrected-review-findings.js";
16
+ import { ObservedMemorySources } from "./memory-source-observations.js";
17
+ import { memorySourceKey } from "./memory-stage-results.js";
18
+ const token = Symbol("historical-second-memory-review");
19
+ function refuse(reason) {
20
+ throw new AppError("memory_historical_second_review_invalid", "Closed final review lacks independent second-wave custody", 2, { reason, effect: "no_effect" });
21
+ }
22
+ /** Reconstructs closed wave-two fan-in from retained proofs. Expected hashes
23
+ * come from an independently accepted receipt, not current workspace policy.
24
+ * This owner alone neither accepts a Stage nor admits another correction. */
25
+ export class PreparedHistoricalSecondMemoryReview {
26
+ #custodyKey = {};
27
+ static isPrepared(value) {
28
+ return typeof value === "object" && value !== null && #wave in value;
29
+ }
30
+ #wave;
31
+ #registration;
32
+ #checks;
33
+ #workers;
34
+ #previous;
35
+ #projection;
36
+ #observed;
37
+ constructor(key, wave, registration, checks, workers, previous, projection, observed) {
38
+ if (key !== token)
39
+ refuse("historical_second_review_token_required");
40
+ this.#wave = wave;
41
+ this.#registration = structuredClone(registration);
42
+ this.#checks = checks;
43
+ this.#workers = workers;
44
+ this.#previous = structuredClone(previous);
45
+ this.#projection = structuredClone(projection);
46
+ this.#observed = observed;
47
+ Object.freeze(this);
48
+ }
49
+ static prepare(context, input) {
50
+ if (context.db.isOwnedWriteTransaction?.())
51
+ refuse("preparation_outside_writer_required");
52
+ const wave = PreparedHistoricalSecondMemoryCorrectionWave.prepare(context, input), repairs = wave.repairResults();
53
+ const retained = wave.registration(), first = retained.initialInputView(), receipt = retained.receipt();
54
+ const registration = context.db.readSnapshot(() => readRetainedSecondCorrectedMemoryReviewRegistration(context, first.scope, input.correctedInputSha256, input.checkReceiptSha256));
55
+ if (!registration)
56
+ refuse("historical_second_registration_required");
57
+ const view = registration.view, paths = [...new Set(retained.plan().works.flatMap(work => work.write_paths))].sort();
58
+ assertHistoricalMemoryReviewSources(wave.histories(), paths, view.run_inputs, retained.initialDocumentBaseline());
59
+ const files = view.run_inputs.filter(ref => ref.root === "workspace");
60
+ const projected = secondCorrectedMemoryReviewAssignments({ first, affected: wave.affectedUnitIds(), files, repairs });
61
+ const runInputs = secondCorrectedMemoryReviewReferences({ firstInputs: first.run_inputs,
62
+ firstWorkers: retained.firstReviewProof(context).workers, repairs, files });
63
+ if (view.schema_id !== "dd-flow/memory-corrected-review-inputs@2" || view.wave !== 2
64
+ || view.original_review_sha256 !== receipt.review_sha256 || view.base !== first.base || view.source_policy !== first.source_policy
65
+ || view.first_review_input_sha256 !== receipt.first_review_input_sha256
66
+ || view.first_check_receipt_sha256 !== receipt.first_check_receipt_sha256
67
+ || view.first_review_registration_sha256 !== receipt.first_review_registration_sha256
68
+ || hybridDigest(view.instruction) !== hybridDigest(first.instruction)
69
+ || hybridDigest([view.upgrade_baseline, view.preservation_invariants]) !== hybridDigest([first.upgrade_baseline, first.preservation_invariants])
70
+ || hybridDigest(view.unit_inventory) !== hybridDigest(projected.units)
71
+ || hybridDigest(view.assignments) !== hybridDigest(projected.assignments)
72
+ || hybridDigest(view.affected_unit_ids) !== hybridDigest(wave.affectedUnitIds())
73
+ || hybridDigest(view.run_inputs) !== hybridDigest(runInputs)
74
+ || hybridDigest(view.repairs) !== hybridDigest(repairs.map(repair => ({ work_id: repair.work_id,
75
+ authority_sha256: repair.authority_sha256, result: repair.reference }))))
76
+ refuse("historical_second_input_projection_changed");
77
+ const checks = PreparedRetainedMemoryCorrectionChecks.prepareSecond(context, { ...input.scope,
78
+ correctedInputSha256: registration.input_sha256, receiptSha256: registration.check_receipt_sha256 });
79
+ if (checks.value(context).completed_correction_sha256 !== view.completed_correction_sha256)
80
+ refuse("historical_second_check_wave_changed");
81
+ const batch = memoryCorrectedReviewBatch(view), harness = runtimeHarness(input.bundle.execution.work("review").worker);
82
+ const workers = context.db.readSnapshot(() => batch.works.map(item => readMemoryReviewWorkSettlement(context, registration, registration.work_ids[item.key], harness)));
83
+ const results = workers.map((worker, index) => validateMemoryReviewWorkResult(worker.bytes, input.bundle.engine(), {
84
+ workId: worker.workId, packet: batch.works[index].payload.memory_review, references: view.run_inputs
85
+ }));
86
+ assertSelectiveMemoryReviewCoverage(view.affected_unit_ids, results);
87
+ const references = workers.map((worker, index) => ({ reviewer_work_id: worker.workId, input_sha256: registration.input_sha256,
88
+ result: worker.result, unit_ids: [results[index].unit_id] }));
89
+ const previous = retained.firstEffectiveReviewProof(context);
90
+ const coverage = correctedMemoryReviewUnits({ view, original: previous.results, current: results,
91
+ originalReferences: previous.references, currentReferences: references, repairWorkIds: repairs.map(repair => repair.work_id) });
92
+ const findings = correctedMemoryReviewFindings({ original: previous.results, current: results, affected: view.affected_unit_ids,
93
+ originalReferences: previous.references, currentReferences: references, findingHistory: previous.projection.findings, repairs });
94
+ const projection = { ...coverage, ...findings, outcome: findings.outcome === "accepted" ? "accepted" : "blocked" };
95
+ const observed = ObservedMemorySources.capture({ run: workers[0].root }, workers.map(worker => ({ root: "run", path: worker.result.path })));
96
+ const hashes = observed.hashes();
97
+ if (workers.some(worker => hashes.get(memorySourceKey("run", worker.result.path)) !== worker.result.sha256))
98
+ refuse("historical_second_reviewer_artifact_changed");
99
+ const prepared = new PreparedHistoricalSecondMemoryReview(token, wave, registration, checks, workers, previous, projection, observed);
100
+ prepared.assertCustody(context);
101
+ return prepared;
102
+ }
103
+ projection() { return structuredClone(this.#projection); }
104
+ settledDocumentBaseline() {
105
+ const registration = this.#wave.registration();
106
+ const paths = [...new Set(registration.plan().works.flatMap(work => work.write_paths))].sort();
107
+ let baseline = registration.initialDocumentBaseline().withWritePaths(paths);
108
+ const prefixes = new Set([hybridDigest(baseline.entries())]);
109
+ for (const history of this.#wave.histories()) {
110
+ if (!prefixes.has(hybridDigest(history.before().entries())))
111
+ refuse("historical_input_prefix_changed");
112
+ baseline = baseline.composeSettledDelta(history.before(), history.after(), history.result().outcome);
113
+ prefixes.add(hybridDigest(baseline.entries()));
114
+ }
115
+ return baseline;
116
+ }
117
+ retainedInputView() { return structuredClone(this.#registration.view); }
118
+ finalChecks(context) { this.assertCustody(context); return this.#checks.value(context).checks; }
119
+ settlementProof(context) {
120
+ this.assertCustody(context);
121
+ return { registration_scope: structuredClone(this.#registration.scope), registration_sha256: hybridDigest(this.#registration), wave: 2,
122
+ check_receipt_sha256: this.#registration.check_receipt_sha256, first_review_proof_sha256: hybridDigest(this.#previous),
123
+ workers: this.#workers.map(worker => ({ work_id: worker.workId, authority_sha256: worker.authority, result: { ...worker.result } })) };
124
+ }
125
+ assertCustody(context) {
126
+ const wave = this.#wave;
127
+ assertMemorySqlCustody(context, this.#custodyKey, () => {
128
+ wave.assertCustody(context);
129
+ this.#checks.assertCustody(context);
130
+ const receipt = this.#registration;
131
+ if (hybridDigest(readRetainedSecondCorrectedMemoryReviewRegistration(context, receipt.scope, receipt.input_sha256, receipt.check_receipt_sha256)) !== hybridDigest(receipt))
132
+ refuse("historical_second_registration_changed");
133
+ if (hybridDigest(this.#wave.registration().firstEffectiveReviewProof(context)) !== hybridDigest(this.#previous))
134
+ refuse("first_review_history_changed");
135
+ const harness = runtimeHarness(this.#wave.registration().bundle().execution.work("review").worker);
136
+ for (const worker of this.#workers)
137
+ if (readMemoryReviewWorkSettlement(context, receipt, worker.workId, harness).authority !== worker.authority)
138
+ refuse("historical_second_reviewer_settlement_changed");
139
+ });
140
+ }
141
+ revalidate(context) {
142
+ this.#wave.revalidate(context);
143
+ this.#checks.revalidate(context);
144
+ this.#observed.revalidate();
145
+ this.assertCustody(context);
146
+ }
147
+ }
@@ -0,0 +1,210 @@
1
+ import { createHash } from "node:crypto";
2
+ import { Ajv2020 } from "ajv/dist/2020.js";
3
+ import { AppError } from "../shared/errors.js";
4
+ import { appendAudit } from "./audit.js";
5
+ import { AdmittedFrozenEngine } from "./frozen-engine.js";
6
+ import { hybridDigest, validateHybridContract } from "./hybrid-contracts.js";
7
+ import { PreparedMemoryInitProjectBootstrap, readMemoryInitProjectBootstrap, readMemoryInitProjectBootstrapEngineAdmission, readMemoryInitReleaseSelection } from "./memory-init-project-bootstrap.js";
8
+ const receiptEvent = "memory.bootstrap_ready", intentEvent = "memory.bootstrap_readiness_intent";
9
+ const bytes = (value) => Buffer.from(JSON.stringify(value));
10
+ const hash = (value) => createHash("sha256").update(value).digest("hex");
11
+ function refuse(reason) {
12
+ throw new AppError("memory_init_bootstrap_readiness_invalid", "Bootstrap readiness lacks exact independently accepted custody", 1, { reason, effect: "no_effect", next_action: "reconcile_exact_request" });
13
+ }
14
+ function decoded(base64, sha256) {
15
+ if (typeof base64 !== "string" || base64.length > 2 * 1024 * 1024 || !/^[a-f0-9]{64}$/.test(sha256))
16
+ refuse("invalid_manifest_binding");
17
+ const content = Buffer.from(base64, "base64");
18
+ if (!content.length || content.length > 1024 * 1024 || content.toString("base64") !== base64 || hash(content) !== sha256)
19
+ refuse("changed_manifest_bytes");
20
+ return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(content));
21
+ }
22
+ /** Exact selected contract support, before invoking bootstrap publication. The
23
+ * public dispatcher must call this before its first project effect, not discover
24
+ * an unsupported engine after installing drafts. No provider operation occurs.
25
+ */
26
+ export function prepareMemoryInitBootstrapSchema(engine) {
27
+ if (!(engine instanceof AdmittedFrozenEngine))
28
+ refuse("selected_engine_not_admitted");
29
+ const manifest = engine.manifest(), id = "dd-flow/memory-bootstrap-receipt@2";
30
+ const entries = manifest.schema_registry?.entries.filter(entry => entry.id === id) ?? [];
31
+ if (!Object.values(manifest.supports_contracts).flat().includes(id) || entries.length !== 1)
32
+ refuse("bootstrap_contract_not_supported");
33
+ return new Ajv2020({ strict: true, validateFormats: false }).compile(JSON.parse(engine.schema(entries[0].name).toString("utf8")));
34
+ }
35
+ /** Pure receipt construction from the prepared selection and accepted SQL
36
+ * dependencies. It is also used by writers/readers; no filesystem/schema IO.
37
+ */
38
+ function material(context, binding) {
39
+ const scope = binding.scope, registered = readMemoryInitProjectBootstrap(context, scope);
40
+ const accepted = readMemoryInitProjectBootstrapEngineAdmission(context, scope);
41
+ const selection = readMemoryInitReleaseSelection(context, scope);
42
+ if (!registered || !accepted || registered.receipt.schema_id !== "dd-flow/memory-init-project-bootstrap@4"
43
+ || accepted.bootstrap_sha256 !== registered.sha256
44
+ || registered.receipt.target_sha256 !== hybridDigest(binding.target)
45
+ || registered.receipt.execution_sha256 !== binding.execution_sha256
46
+ || binding.target.request_id !== scope.requestId || binding.target.project_root !== scope.projectRoot
47
+ || binding.target.workspace_root !== scope.workspaceRoot
48
+ || binding.git_policy_sha256 !== accepted.git_policy_sha256
49
+ || !/^[a-f0-9]{64}$/.test(binding.pack_sha256))
50
+ refuse("changed_bootstrap_dependencies");
51
+ if (!selection || selection.bootstrap_identity !== registered.receipt.identity
52
+ || selection.execution_sha256 !== binding.execution_sha256 || selection.pack_sha256 !== binding.pack_sha256
53
+ || selection.installation_manifest_sha256 !== binding.installation_manifest_sha256
54
+ || selection.installation_manifest_base64 !== binding.installation_manifest_base64)
55
+ refuse("changed_release_selection");
56
+ if (!context.db.get("SELECT 1 FROM projects WHERE id=? AND root=? AND status='active'", [registered.receipt.project_id, scope.projectRoot]))
57
+ refuse("project_not_active");
58
+ const release = decoded(binding.installation_manifest_base64, binding.installation_manifest_sha256);
59
+ const engine = decoded(binding.engine_manifest_base64, accepted.proof.engine_manifest_sha256);
60
+ const engineSha256 = accepted.proof.engine_sha256;
61
+ if (typeof engineSha256 !== "string" || !/^[a-f0-9]{64}$/.test(engineSha256))
62
+ refuse("invalid_engine_identity");
63
+ if (release.engine.package !== engine.package_name || release.engine.version !== engine.package_version
64
+ || engine.integrity.checksum !== accepted.proof.engine_sha256)
65
+ refuse("foreign_selected_engine");
66
+ const fact = { requestId: scope.requestId, projectRoot: scope.projectRoot, workspace: scope.workspaceRoot };
67
+ const evidence = [
68
+ { kind: "storage-compatibility", path: "receipts/storage-compatibility.json", value: { schema_id: "dd-flow/memory-init-storage-evidence@1", scope, admission_identity: accepted.identity, proof: accepted.proof } },
69
+ { kind: "scaffold", path: "receipts/scaffold.json", value: { schema_id: "dd-flow/memory-init-scaffold-evidence@1", scope, bootstrap_sha256: registered.sha256, receipt: registered.receipt } },
70
+ { kind: "pack-install", path: "receipts/pack-install.json", value: { schema_id: "dd-flow/memory-init-pack-evidence@1", scope, bootstrap_sha256: registered.sha256, layer_sha256: registered.receipt.layer_sha256, pack_sha256: binding.pack_sha256, installation_sha256: binding.installation_manifest_sha256 } }
71
+ ].map(entry => ({ kind: entry.kind, path: entry.path, sha256: hash(bytes(entry.value)), base64: bytes(entry.value).toString("base64") }));
72
+ const reference = (index) => ({ path: evidence[index].path, sha256: evidence[index].sha256 });
73
+ const receipt = { schema_id: "dd-flow/memory-bootstrap-receipt@2", request_id: scope.requestId, flow_id: "mb-init",
74
+ project_root: scope.projectRoot, workspace: { path: scope.workspaceRoot, repository: binding.target.repository,
75
+ branch: binding.target.branch, commit: binding.target.head, git_state: binding.target.head === null ? "unborn" : "committed" },
76
+ baseline_sha256: registered.receipt.target_sha256, project_current: null,
77
+ upgrade_target: { canon_version: release.canon.version, pack_sha256: binding.pack_sha256 },
78
+ effective_execution: { engine_sha256: engineSha256, canon_sha256: release.canon.archive.sha256 },
79
+ readiness: "ready", storage: { route: "verified-no-op", outcome: "no-op", compatibility_receipt: reference(0),
80
+ drain_receipt: null, backup_receipt: null, plan_receipt: null, apply_receipt: null, verification_receipt: null },
81
+ effects: [{ kind: "scaffold", receipt: reference(1) }, { kind: "pack-install", receipt: reference(2) }] };
82
+ const admission = { receipts: new Map(evidence.map(entry => [entry.sha256, { kind: entry.kind, ...fact }])),
83
+ bootstrapIdentity: { ...fact, baselineSha256: registered.receipt.target_sha256,
84
+ engineSha256, canonSha256: release.canon.archive.sha256,
85
+ workspaceGit: { repository: binding.target.repository, branch: binding.target.branch, commit: binding.target.head } } };
86
+ const authority = { schema_id: "dd-flow/memory-bootstrap-authority@1", request_id: scope.requestId, project_root: scope.projectRoot,
87
+ workspace_root: scope.workspaceRoot, flow_id: "mb-init", readiness: "ready", model_access: "unknown",
88
+ bootstrap_sha256: hash(bytes(receipt)), project_bootstrap_sha256: registered.sha256,
89
+ engine_admission_identity: accepted.identity, binding, receipt, evidence };
90
+ return { authority, admission, projectId: registered.receipt.project_id };
91
+ }
92
+ function row(context, scope, event) {
93
+ const rows = context.db.all("SELECT project_id,payload_json FROM audit_events WHERE event_type=? AND json_extract(payload_json,'$.request_id')=? AND json_extract(payload_json,'$.project_root')=? AND json_extract(payload_json,'$.workspace_root')=? LIMIT 2", [event, scope.requestId, scope.projectRoot, scope.workspaceRoot]);
94
+ if (rows.length > 1)
95
+ refuse("ambiguous_readiness_custody");
96
+ if (!rows.length)
97
+ return null;
98
+ if (Buffer.byteLength(rows[0].payload_json) > 4 * 1024 * 1024)
99
+ refuse("unbounded_readiness_custody");
100
+ return { ...rows[0], value: JSON.parse(rows[0].payload_json) };
101
+ }
102
+ /** Historical readiness custody only. Current physical admission belongs to
103
+ * prepare/apply. Loss of either independent record cannot republish authority.
104
+ */
105
+ export function readMemoryInitBootstrapReadiness(context, scope) {
106
+ try {
107
+ return context.db.readSnapshot(() => {
108
+ const retained = row(context, scope, receiptEvent), intent = row(context, scope, intentEvent);
109
+ if (!retained && !intent)
110
+ return null;
111
+ if (!retained || !intent)
112
+ refuse("readiness_custody_missing");
113
+ const binding = retained.value.binding;
114
+ if (!binding || hybridDigest(binding.scope) !== hybridDigest(scope)
115
+ || (Object.hasOwn(binding, "git_policy_sha256") && (typeof binding.git_policy_sha256 !== "string" || !/^[a-f0-9]{64}$/.test(binding.git_policy_sha256)))
116
+ || Object.keys(binding).sort().join() !== (Object.hasOwn(binding, "git_policy_sha256")
117
+ ? "engine_manifest_base64,execution_sha256,git_policy_sha256,installation_manifest_base64,installation_manifest_sha256,pack_sha256,scope,target"
118
+ : "engine_manifest_base64,execution_sha256,installation_manifest_base64,installation_manifest_sha256,pack_sha256,scope,target"))
119
+ refuse("invalid_readiness_binding");
120
+ const selected = material(context, binding), expected = { schema_id: "dd-flow/memory-bootstrap-readiness-intent@1", request_id: scope.requestId,
121
+ project_root: scope.projectRoot, workspace_root: scope.workspaceRoot, authority_sha256: hybridDigest(selected.authority) };
122
+ if (retained.project_id !== selected.projectId || intent.project_id !== selected.projectId
123
+ || hybridDigest(retained.value) !== hybridDigest(selected.authority) || hybridDigest(intent.value) !== hybridDigest(expected))
124
+ refuse("changed_readiness_custody");
125
+ return { ...selected, authority: structuredClone(selected.authority) };
126
+ });
127
+ }
128
+ catch (error) {
129
+ if (error instanceof AppError)
130
+ throw error;
131
+ return refuse("invalid_readiness_custody");
132
+ }
133
+ }
134
+ /** Request-owned runtime readiness, not semantic memory acceptance or account
135
+ * qualification. Provider failures after this receipt keep a partial bootstrap;
136
+ * no hidden model turn is dispatched to obtain the receipt.
137
+ */
138
+ export class PreparedMemoryInitBootstrapReadiness {
139
+ #bootstrap;
140
+ #engine;
141
+ #binding;
142
+ #material;
143
+ constructor(bootstrap, engine, binding, selected) {
144
+ this.#bootstrap = bootstrap;
145
+ this.#engine = engine;
146
+ this.#binding = structuredClone(binding);
147
+ this.#material = selected;
148
+ Object.freeze(this);
149
+ }
150
+ static prepare(context, input) {
151
+ if (!(input.bootstrap instanceof PreparedMemoryInitProjectBootstrap))
152
+ refuse("unprepared_project_bootstrap");
153
+ const validate = prepareMemoryInitBootstrapSchema(input.engine);
154
+ const { registered: _registered, accepted: _accepted, ...binding } = input.bootstrap.prepareReadiness(context, input.engine);
155
+ void _registered;
156
+ void _accepted;
157
+ const selected = context.db.readSnapshot(() => material(context, binding));
158
+ if (!validate(selected.authority.receipt) || validateHybridContract("memory-bootstrap-receipt", selected.authority.receipt, selected.admission).length)
159
+ refuse("invalid_bootstrap_contract");
160
+ const prior = readMemoryInitBootstrapReadiness(context, binding.scope);
161
+ if (prior && hybridDigest(prior.authority) !== hybridDigest(selected.authority))
162
+ refuse("changed_readiness_request");
163
+ return new PreparedMemoryInitBootstrapReadiness(input.bootstrap, input.engine, binding, selected);
164
+ }
165
+ apply(context) {
166
+ const { registered: _registered, accepted: _accepted, ...current } = this.#bootstrap.prepareReadiness(context, this.#engine);
167
+ void _registered;
168
+ void _accepted;
169
+ if (hybridDigest(current) !== hybridDigest(this.#binding))
170
+ refuse("readiness_changed_after_preparation");
171
+ return context.db.writeTransaction(() => {
172
+ const selected = material(context, this.#binding);
173
+ if (hybridDigest(selected.authority) !== hybridDigest(this.#material.authority))
174
+ refuse("changed_bootstrap_dependencies");
175
+ const prior = readMemoryInitBootstrapReadiness(context, this.#binding.scope);
176
+ if (prior) {
177
+ if (hybridDigest(prior.authority) !== hybridDigest(selected.authority))
178
+ refuse("changed_readiness_request");
179
+ return { ...prior, changed: false };
180
+ }
181
+ const scope = this.#binding.scope;
182
+ appendAudit(context, { projectId: selected.projectId, eventType: intentEvent,
183
+ payload: { schema_id: "dd-flow/memory-bootstrap-readiness-intent@1", request_id: scope.requestId, project_root: scope.projectRoot,
184
+ workspace_root: scope.workspaceRoot, authority_sha256: hybridDigest(selected.authority) } });
185
+ appendAudit(context, { projectId: selected.projectId, eventType: receiptEvent, payload: selected.authority });
186
+ const accepted = readMemoryInitBootstrapReadiness(context, scope);
187
+ if (!accepted)
188
+ refuse("readiness_not_committed");
189
+ return { ...accepted, changed: true };
190
+ }, "memoryInit.bootstrapReadiness");
191
+ }
192
+ }
193
+ /** Productive bootstrap entry: contract admission precedes all project effects.
194
+ * A failure after draft publication is explicitly partial and resumes the same
195
+ * request; it never substitutes fresh initialization or a paid route probe.
196
+ */
197
+ export function bootstrapMemoryInit(context, input, checkpoint) {
198
+ if (!(input.bootstrap instanceof PreparedMemoryInitProjectBootstrap))
199
+ refuse("unprepared_project_bootstrap");
200
+ prepareMemoryInitBootstrapSchema(input.engine);
201
+ const registered = input.bootstrap.applyWithEngine(context, input.engine, checkpoint);
202
+ try {
203
+ return PreparedMemoryInitBootstrapReadiness.prepare(context, input).apply(context);
204
+ }
205
+ catch (error) {
206
+ throw new AppError("memory_init_bootstrap_readiness_failed", "Project drafts are retained but bootstrap readiness is incomplete", 1, { effect: "partial", project_bootstrap_sha256: registered.sha256,
207
+ reason: error instanceof AppError ? error.details.reason ?? error.code : "readiness_operation_failed",
208
+ next_action: "reconcile_exact_request" });
209
+ }
210
+ }
@@ -0,0 +1,131 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs";
3
+ import { createHash } from "node:crypto";
4
+ import { AppError } from "../shared/errors.js";
5
+ import { RetainedExecutionBundle } from "./execution-bundles.js";
6
+ import { publishImmutableInput } from "../storage/immutable-input.js";
7
+ import { readBoundedReleaseFile } from "./release-source.js";
8
+ import { readMemoryInitStartupInput } from "./memory-init-startup-custody.js";
9
+ import { readUpgradeStorageReadiness } from "./memory-upgrade-storage-readiness.js";
10
+ import { isDiagnosticFlow } from "../domain/diagnostic-flows.js";
11
+ import { readDiagnosticRequest } from "./diagnostic-start.js";
12
+ export function prepareDiagnosticContextsFromRequest(context, bundle, directory) {
13
+ const scope = bundle.execution.snapshot().scope, flowId = bundle.manifest.flow_id;
14
+ if (!isDiagnosticFlow(flowId))
15
+ throw new AppError("diagnostic_context_invalid", "Diagnostic bundle required", 2, { effect: "no_effect" });
16
+ const request = readDiagnosticRequest(context, { projectRoot: scope.projectRoot, requestId: scope.requestId, flowId });
17
+ if (!request || request.execution_sha256 !== bundle.execution.sha256)
18
+ throw new AppError("diagnostic_context_invalid", "Original diagnostic objective required", 2, { effect: "no_effect" });
19
+ return { ...prepareMemoryContexts(bundle, request.objective, directory, flowId), objective: request.objective };
20
+ }
21
+ export function publishDiagnosticContexts(bundle, objective, directory, expectedSha256, expectedOwner) {
22
+ if (!isDiagnosticFlow(bundle.manifest.flow_id))
23
+ throw new AppError("diagnostic_context_invalid", "Diagnostic bundle required", 2, { effect: "no_effect" });
24
+ return publishMemoryContexts(bundle, objective, directory, expectedSha256, expectedOwner, bundle.manifest.flow_id);
25
+ }
26
+ /** Original upgrade intake comes from the independently retained storage
27
+ * selection, including after project publication changes the old tree. */
28
+ export function prepareMemoryUpgradeContextsFromStartup(context, bundle, directory) {
29
+ if (!(bundle instanceof RetainedExecutionBundle) || bundle.manifest.flow_id !== "mb-upgrade") {
30
+ throw new AppError("memory_upgrade_context_invalid", "Upgrade contexts require a retained upgrade bundle", 2, { effect: "no_effect" });
31
+ }
32
+ const scope = bundle.execution.snapshot().scope;
33
+ const retained = readUpgradeStorageReadiness(context, { requestId: scope.requestId, projectRoot: scope.projectRoot, workspaceRoot: scope.workspace });
34
+ if (!retained?.receipt.selection || !retained.selection
35
+ || retained.selection.payload.execution.sha256 !== bundle.execution.sha256
36
+ || retained.selection.payload.engine.manifest_sha256 !== bundle.manifest.engine_manifest.sha256) {
37
+ throw new AppError("memory_upgrade_context_invalid", "Upgrade contexts require the original request selection", 1, { effect: "no_effect" });
38
+ }
39
+ const objective = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(Buffer.from(retained.receipt.selection.request_input.intake_base64, "base64"));
40
+ return { ...prepareMemoryContexts(bundle, objective, directory, "mb-upgrade"), objective };
41
+ }
42
+ /** Public init consumes the independently retained intake, never a newly
43
+ * inferred objective. Historical v1 SDK requests must not invent one. */
44
+ export function prepareMemoryInitContextsFromStartup(context, bundle, directory) {
45
+ if (!(bundle instanceof RetainedExecutionBundle) || bundle.manifest.flow_id !== "mb-init") {
46
+ throw new AppError("memory_init_context_invalid", "Init contexts require a retained memory bundle", 2, { effect: "no_effect" });
47
+ }
48
+ const scope = bundle.execution.snapshot().scope;
49
+ const retained = readMemoryInitStartupInput(context, { requestId: scope.requestId, projectRoot: scope.projectRoot, workspaceRoot: scope.workspace });
50
+ if (!retained || !["dd-flow/memory-init-startup-input@2", "dd-flow/memory-init-startup-input@3"].includes(retained.payload.schema_id)
51
+ || retained.payload.objective === undefined || retained.payload.execution.sha256 !== bundle.execution.sha256
52
+ || retained.payload.engine.manifest_sha256 !== bundle.manifest.engine_manifest.sha256) {
53
+ throw new AppError("memory_init_context_invalid", "Init contexts require the exact retained objective and execution selection", 1, { effect: "no_effect" });
54
+ }
55
+ return { ...prepareMemoryInitContexts(bundle, retained.payload.objective, directory), objective: retained.payload.objective };
56
+ }
57
+ /** Prepare bytes only. Immutable publication and the controller retain their
58
+ * existing ownership; this does not create directories, Sessions or RUNs. */
59
+ export function prepareMemoryInitContexts(bundle, objective, directory) {
60
+ return prepareMemoryContexts(bundle, objective, directory, "mb-init");
61
+ }
62
+ function prepareMemoryContexts(bundle, objective, directory, flowId) {
63
+ if (!(bundle instanceof RetainedExecutionBundle) || bundle.manifest.flow_id !== flowId
64
+ || typeof objective !== "string" || !objective.trim() || Buffer.byteLength(objective) > 64 * 1024
65
+ || !path.isAbsolute(directory) || path.resolve(directory) !== directory) {
66
+ throw new AppError("memory_init_context_invalid", "Init contexts require a retained memory bundle, bounded objective and absolute directory", 2, { effect: "no_effect" });
67
+ }
68
+ const files = new Map(), stages = Object.create(null);
69
+ const hash = (bytes) => createHash("sha256").update(bytes).digest("hex");
70
+ for (const stage of bundle.descriptor.descriptor.stages) {
71
+ const file = path.join(directory, `${stage.id}.json`);
72
+ const bytes = Buffer.from(JSON.stringify({ schema_id: "dd-flow/stage-context@1", stage: stage.id, objective }));
73
+ files.set(file, bytes);
74
+ stages[stage.id] = { file, sha256: hash(bytes) };
75
+ }
76
+ const file = path.join(directory, "managed-context.json"), bytes = Buffer.from(JSON.stringify({ schema_id: "dd-flow/managed-context@1", stages }));
77
+ files.set(file, bytes);
78
+ return { file, sha256: hash(bytes), files };
79
+ }
80
+ /** Publish candidates only; an existing controller SQL receipt still owns
81
+ * their execution authority. The caller supplies an already owned directory
82
+ * and independently retained package digest. Never replaces conflicting files. */
83
+ export function publishMemoryInitContexts(bundle, objective, directory, expectedSha256, expectedOwner) {
84
+ return publishMemoryContexts(bundle, objective, directory, expectedSha256, expectedOwner, "mb-init");
85
+ }
86
+ export function publishMemoryUpgradeContexts(bundle, objective, directory, expectedSha256, expectedOwner) {
87
+ return publishMemoryContexts(bundle, objective, directory, expectedSha256, expectedOwner, "mb-upgrade");
88
+ }
89
+ function publishMemoryContexts(bundle, objective, directory, expectedSha256, expectedOwner, flowId) {
90
+ const prepared = prepareMemoryContexts(bundle, objective, directory, flowId);
91
+ if (prepared.sha256 !== expectedSha256)
92
+ throw new AppError("memory_init_context_invalid", "Context package selection changed", 1, { effect: "no_effect" });
93
+ const owner = fs.lstatSync(directory);
94
+ if (expectedOwner && (owner.dev !== expectedOwner.dev || owner.ino !== expectedOwner.ino)) {
95
+ throw new AppError("memory_init_context_invalid", "Context directory differs from its retained owner", 1, { effect: "no_effect" });
96
+ }
97
+ const assertOwner = () => {
98
+ const current = fs.lstatSync(directory);
99
+ if (!current.isDirectory() || current.dev !== owner.dev || current.ino !== owner.ino || fs.realpathSync(directory) !== directory) {
100
+ throw new AppError("memory_init_context_invalid", "Context directory owner changed", 1, { effect: "no_effect" });
101
+ }
102
+ };
103
+ assertOwner();
104
+ // Reject any known collision before creating the first candidate.
105
+ for (const [file, bytes] of prepared.files) {
106
+ try {
107
+ fs.lstatSync(file);
108
+ }
109
+ catch (error) {
110
+ if (error.code === "ENOENT")
111
+ continue;
112
+ throw error;
113
+ }
114
+ if (!readBoundedReleaseFile(file, bytes.length).equals(bytes))
115
+ throw new AppError("memory_init_context_invalid", "Existing context bytes differ", 1, { effect: "no_effect", path: file });
116
+ }
117
+ let attempted = false;
118
+ try {
119
+ for (const [file, bytes] of prepared.files) {
120
+ assertOwner();
121
+ attempted = true;
122
+ publishImmutableInput(file, bytes, "memory_init_context_invalid");
123
+ }
124
+ assertOwner();
125
+ return { file: prepared.file, sha256: prepared.sha256 };
126
+ }
127
+ catch (error) {
128
+ throw new AppError("memory_init_context_publication_incomplete", "Context candidates require exact-request reconciliation", 1, { effect: attempted ? "partial" : "no_effect", directory, expected_sha256: expectedSha256,
129
+ reason: error instanceof AppError ? error.code : "context_publication_failed" });
130
+ }
131
+ }