@deksden-com/dd-flow-cli 0.9.0-beta.16 → 0.9.0-beta.160

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (670) hide show
  1. package/CHANGELOG.md +959 -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 +417 -0
  6. package/dist/cli/command-metadata.js +303 -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/delivery.js +108 -0
  11. package/dist/cli/diagnostic-invocation.js +62 -0
  12. package/dist/cli/diagnostic.js +131 -0
  13. package/dist/cli/error-output.js +62 -0
  14. package/dist/cli/executor-onboarding.js +76 -0
  15. package/dist/cli/flows.js +29 -0
  16. package/dist/cli/harnesses.js +84 -0
  17. package/dist/cli/help.js +521 -19
  18. package/dist/cli/hook-ingress.js +89 -0
  19. package/dist/cli/input-preparation.js +193 -0
  20. package/dist/cli/interactive-invocation.js +33 -0
  21. package/dist/cli/interactive.js +114 -0
  22. package/dist/cli/memory-fix-invocation.js +52 -0
  23. package/dist/cli/memory-fix.js +100 -0
  24. package/dist/cli/memory-flow-admission.js +54 -0
  25. package/dist/cli/memory-init-invocation.js +85 -0
  26. package/dist/cli/memory-init.js +250 -0
  27. package/dist/cli/memory-storage-admission.js +54 -0
  28. package/dist/cli/memory-storage-qualification.js +105 -0
  29. package/dist/cli/memory-storage-transition.js +123 -0
  30. package/dist/cli/memory-upgrade.js +189 -0
  31. package/dist/cli/models.js +39 -0
  32. package/dist/cli/native-hook-ingress.js +94 -0
  33. package/dist/cli/native-hook-preparation.js +82 -0
  34. package/dist/cli/operator-profiles.js +61 -0
  35. package/dist/cli/output-options.js +35 -0
  36. package/dist/cli/response-file.js +72 -0
  37. package/dist/cli/run-cli.js +2020 -555
  38. package/dist/cli/runtime-maintenance-diagnostics.js +46 -0
  39. package/dist/cli/runtime-maintenance-ingress.js +52 -0
  40. package/dist/cli/runtime-process.js +153 -0
  41. package/dist/cli/setup.js +150 -0
  42. package/dist/cli.js +103 -2
  43. package/dist/domain/delivery-flows.js +8 -0
  44. package/dist/domain/diagnostic-aspects.js +103 -0
  45. package/dist/domain/diagnostic-flows.js +8 -0
  46. package/dist/domain/distill-flow.js +20 -0
  47. package/dist/domain/interactive-flow.js +1 -0
  48. package/dist/domain/memory-fix-flow.js +2 -0
  49. package/dist/domain/review-fix-flow.js +2 -0
  50. package/dist/domain/source-snapshot-flows.js +4 -0
  51. package/dist/domain/stage-catalog.js +1 -1
  52. package/dist/domain/stage-handler-identities.js +28 -0
  53. package/dist/harness-runtime/DD-ZCODE.md +112 -0
  54. package/dist/harness-runtime/OPENCODE-LICENSE.txt +24 -0
  55. package/dist/harness-runtime/bin/dd-agy.mjs +71 -0
  56. package/dist/harness-runtime/bin/dd-codex.mjs +27 -0
  57. package/dist/harness-runtime/bin/dd-droid.mjs +34 -0
  58. package/dist/harness-runtime/bin/dd-grok.mjs +50 -0
  59. package/dist/harness-runtime/bin/dd-opencode.mjs +22 -0
  60. package/dist/harness-runtime/bin/dd-zcode.mjs +95 -0
  61. package/dist/harness-runtime/lib/adapter-timeouts.d.mts +5 -0
  62. package/dist/harness-runtime/lib/adapter-timeouts.mjs +34 -0
  63. package/dist/harness-runtime/lib/agy-error-boundary.mjs +87 -0
  64. package/dist/harness-runtime/lib/agy-hooks.d.mts +1 -0
  65. package/dist/harness-runtime/lib/agy-hooks.mjs +9 -0
  66. package/dist/harness-runtime/lib/agy-native-inspection.mjs +225 -0
  67. package/dist/harness-runtime/lib/agy-native-inventory.mjs +19 -0
  68. package/dist/harness-runtime/lib/agy-native_pb.js +117 -0
  69. package/dist/harness-runtime/lib/agy-terminal-envelope.mjs +74 -0
  70. package/dist/harness-runtime/lib/agy-transcript-stream.mjs +54 -0
  71. package/dist/harness-runtime/lib/daemon-observation.d.mts +3 -0
  72. package/dist/harness-runtime/lib/daemon-observation.mjs +171 -0
  73. package/dist/harness-runtime/lib/daemon-operations.d.mts +2 -0
  74. package/dist/harness-runtime/lib/daemon-operations.mjs +512 -0
  75. package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +7 -0
  76. package/dist/harness-runtime/lib/dd-agy-daemon.mjs +1362 -0
  77. package/dist/harness-runtime/lib/dd-agy.mjs +105 -0
  78. package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
  79. package/dist/harness-runtime/lib/dd-codex-daemon.mjs +271 -0
  80. package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
  81. package/dist/harness-runtime/lib/dd-codex.mjs +986 -0
  82. package/dist/harness-runtime/lib/dd-droid-daemon.mjs +155 -0
  83. package/dist/harness-runtime/lib/dd-droid.mjs +739 -0
  84. package/dist/harness-runtime/lib/dd-grok-daemon.d.mts +1 -0
  85. package/dist/harness-runtime/lib/dd-grok-daemon.mjs +667 -0
  86. package/dist/harness-runtime/lib/dd-grok.mjs +182 -0
  87. package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +772 -0
  88. package/dist/harness-runtime/lib/dd-opencode.mjs +411 -0
  89. package/dist/harness-runtime/lib/dd-zcode-daemon.d.mts +1 -0
  90. package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +845 -0
  91. package/dist/harness-runtime/lib/dd-zcode.mjs +1239 -0
  92. package/dist/harness-runtime/lib/delegation-instructions.d.mts +16 -0
  93. package/dist/harness-runtime/lib/delegation-instructions.mjs +179 -0
  94. package/dist/harness-runtime/lib/delivery-command.mjs +84 -0
  95. package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
  96. package/dist/harness-runtime/lib/driver-recovery.mjs +121 -0
  97. package/dist/harness-runtime/lib/droid-observation.mjs +70 -0
  98. package/dist/harness-runtime/lib/entity-references.d.mts +2 -0
  99. package/dist/harness-runtime/lib/entity-references.mjs +9 -0
  100. package/dist/harness-runtime/lib/lease-renewal.d.mts +8 -0
  101. package/dist/harness-runtime/lib/lease-renewal.mjs +37 -0
  102. package/dist/harness-runtime/lib/lifecycle-command.d.mts +20 -0
  103. package/dist/harness-runtime/lib/lifecycle-command.mjs +273 -0
  104. package/dist/harness-runtime/lib/lifecycle-contract.d.mts +11 -0
  105. package/dist/harness-runtime/lib/lifecycle-contract.mjs +20 -0
  106. package/dist/harness-runtime/lib/managed-daemon.d.mts +16 -0
  107. package/dist/harness-runtime/lib/managed-daemon.mjs +698 -0
  108. package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
  109. package/dist/harness-runtime/lib/model-observations.mjs +113 -0
  110. package/dist/harness-runtime/lib/native-children.d.mts +34 -0
  111. package/dist/harness-runtime/lib/native-children.mjs +265 -0
  112. package/dist/harness-runtime/lib/native-hook-command.d.mts +8 -0
  113. package/dist/harness-runtime/lib/native-hook-command.mjs +306 -0
  114. package/dist/harness-runtime/lib/native-request-proof.d.mts +2 -0
  115. package/dist/harness-runtime/lib/native-request-proof.mjs +65 -0
  116. package/dist/harness-runtime/lib/native-streams.mjs +38 -0
  117. package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
  118. package/dist/harness-runtime/lib/observation-clock.mjs +95 -0
  119. package/dist/harness-runtime/lib/opencode-plugin.mjs +112 -0
  120. package/dist/harness-runtime/lib/operation-context.mjs +5 -0
  121. package/dist/harness-runtime/lib/operation-errors.d.mts +16 -0
  122. package/dist/harness-runtime/lib/operation-errors.mjs +140 -0
  123. package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
  124. package/dist/harness-runtime/lib/operation-progress.mjs +118 -0
  125. package/dist/harness-runtime/lib/process-json.d.mts +5 -0
  126. package/dist/harness-runtime/lib/process-json.mjs +200 -0
  127. package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
  128. package/dist/harness-runtime/lib/provider-overload-policy.d.mts +23 -0
  129. package/dist/harness-runtime/lib/provider-overload-policy.mjs +242 -0
  130. package/dist/harness-runtime/lib/runner-events.mjs +202 -0
  131. package/dist/harness-runtime/lib/runner-lock.mjs +42 -0
  132. package/dist/harness-runtime/lib/session-settlement.mjs +30 -0
  133. package/dist/harness-runtime/lib/setup-progress.d.mts +9 -0
  134. package/dist/harness-runtime/lib/setup-progress.mjs +53 -0
  135. package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
  136. package/dist/harness-runtime/lib/tool-observations.mjs +238 -0
  137. package/dist/harness-runtime/lib/zcode-native-hook-ownership.mjs +109 -0
  138. package/dist/harness-runtime/lib/zcode-usage.mjs +55 -0
  139. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-1y4a697q.js +81 -0
  140. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-2ny4vxct.js +92 -0
  141. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-6mptkzbc.js +0 -0
  142. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-7x67cf1q.js +52 -0
  143. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9rqn6x4v.js +16 -0
  144. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9vdz0zwn.js +1661 -0
  145. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ecs5ftka.js +1466 -0
  146. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-frbwqjmf.js +145 -0
  147. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gne7h7mq.js +50 -0
  148. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gx9wnkzr.js +105 -0
  149. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-m2eywc8w.js +0 -0
  150. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-nwcpakzx.js +12 -0
  151. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-q4g3afnw.js +623 -0
  152. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-qav6mfdz.js +0 -0
  153. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-sxt88q69.js +12 -0
  154. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-t1xa31vm.js +39 -0
  155. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ve4aws36.js +103 -0
  156. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vmytr4q8.js +4 -0
  157. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vt9jbch8.js +36 -0
  158. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vyas3vgt.js +0 -0
  159. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-wjyeq25y.js +30 -0
  160. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-xgnj2w4v.js +20 -0
  161. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-y2etg5bs.js +9 -0
  162. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ydhz1zrh.js +238 -0
  163. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-z6qdwcsf.js +62 -0
  164. package/dist/harness-runtime/vendor/opencode-client/contract.d.ts +1 -0
  165. package/dist/harness-runtime/vendor/opencode-client/contract.js +12 -0
  166. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.d.ts +2806 -0
  167. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.js +0 -0
  168. package/dist/harness-runtime/vendor/opencode-client/effect/api.d.ts +4 -0
  169. package/dist/harness-runtime/vendor/opencode-client/effect/api.js +0 -0
  170. package/dist/harness-runtime/vendor/opencode-client/effect/client.d.ts +2530 -0
  171. package/dist/harness-runtime/vendor/opencode-client/effect/client.js +15 -0
  172. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.d.ts +7 -0
  173. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.js +6 -0
  174. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.d.ts +2529 -0
  175. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.js +8 -0
  176. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.d.ts +2 -0
  177. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.js +12 -0
  178. package/dist/harness-runtime/vendor/opencode-client/effect/index.d.ts +35 -0
  179. package/dist/harness-runtime/vendor/opencode-client/effect/index.js +75 -0
  180. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.d.ts +20 -0
  181. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.js +11 -0
  182. package/dist/harness-runtime/vendor/opencode-client/effect/service.d.ts +90 -0
  183. package/dist/harness-runtime/vendor/opencode-client/effect/service.js +187 -0
  184. package/dist/harness-runtime/vendor/opencode-client/package.json +84 -0
  185. package/dist/harness-runtime/vendor/opencode-client/promise/api.d.ts +21 -0
  186. package/dist/harness-runtime/vendor/opencode-client/promise/api.js +0 -0
  187. package/dist/harness-runtime/vendor/opencode-client/promise/client.d.ts +252 -0
  188. package/dist/harness-runtime/vendor/opencode-client/promise/client.js +14 -0
  189. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.d.ts +8 -0
  190. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.js +6 -0
  191. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.d.ts +259 -0
  192. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.js +7 -0
  193. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.d.ts +3 -0
  194. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.js +79 -0
  195. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.d.ts +8932 -0
  196. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.js +70 -0
  197. package/dist/harness-runtime/vendor/opencode-client/promise/index.d.ts +6 -0
  198. package/dist/harness-runtime/vendor/opencode-client/promise/index.js +83 -0
  199. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.d.ts +32 -0
  200. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.js +7 -0
  201. package/dist/harness-runtime/vendor/opencode-client/promise/service.d.ts +24 -0
  202. package/dist/harness-runtime/vendor/opencode-client/promise/service.js +187 -0
  203. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.d.ts +12 -0
  204. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.js +14 -0
  205. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.d.ts +20 -0
  206. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.js +14 -0
  207. package/dist/harness-runtime/vendor/opencode-client/service-contender.d.ts +37 -0
  208. package/dist/harness-runtime/vendor/opencode-client/service-contender.js +10 -0
  209. package/dist/harness-runtime/vendor/opencode-client/service-probe.d.ts +70 -0
  210. package/dist/harness-runtime/vendor/opencode-client/service-probe.js +16 -0
  211. package/dist/harness-runtime/vendor/opencode-client/service-timing.d.ts +12 -0
  212. package/dist/harness-runtime/vendor/opencode-client/service-timing.js +10 -0
  213. package/dist/harness-runtime/vendor/opencode-client/service-version.d.ts +2 -0
  214. package/dist/harness-runtime/vendor/opencode-client/service-version.js +6 -0
  215. package/dist/harness-runtime/vendor/opencode-client/service.d.ts +52 -0
  216. package/dist/harness-runtime/vendor/opencode-client/service.js +1 -0
  217. package/dist/harness-runtime/vendor/opencode-client/shared-events.d.ts +11 -0
  218. package/dist/harness-runtime/vendor/opencode-client/shared-events.js +8 -0
  219. package/dist/harness-runtime/vendor/opencode-client/solid/connection.d.ts +37 -0
  220. package/dist/harness-runtime/vendor/opencode-client/solid/connection.js +10 -0
  221. package/dist/harness-runtime/vendor/opencode-client/solid/data.d.ts +211 -0
  222. package/dist/harness-runtime/vendor/opencode-client/solid/data.js +18 -0
  223. package/dist/harness-runtime/vendor/opencode-client/solid/index.d.ts +3 -0
  224. package/dist/harness-runtime/vendor/opencode-client/solid/index.js +32 -0
  225. package/dist/harness-runtime/vendor/opencode-client/solid/pty.d.ts +22 -0
  226. package/dist/harness-runtime/vendor/opencode-client/solid/pty.js +8 -0
  227. package/dist/harness-runtime/vendor/opencode-plugin.mjs +3 -0
  228. package/dist/protocol/local-files.js +18 -9
  229. package/dist/runtime/context.js +8 -4
  230. package/dist/schemas/agent-profile.schema.json +1 -1
  231. package/dist/schemas/code-review-decision.schema.json +9 -0
  232. package/dist/schemas/code-review-result.schema.json +1 -1
  233. package/dist/schemas/code-verification.schema.json +7 -5
  234. package/dist/schemas/code-work-batch.schema.json +2 -2
  235. package/dist/schemas/code-work-result.schema.json +2 -1
  236. package/dist/schemas/delivery-stage-result.schema.json +286 -0
  237. package/dist/schemas/diagnostic-stage-result.schema.json +354 -0
  238. package/dist/schemas/diagnostic-work-result.schema.json +296 -0
  239. package/dist/schemas/discovery-result.schema.json +184 -0
  240. package/dist/schemas/distill-stage-result.schema.json +667 -0
  241. package/dist/schemas/distill-work-result.schema.json +428 -0
  242. package/dist/schemas/execution-bundle.schema.json +215 -0
  243. package/dist/schemas/execution-settings.schema.json +162 -0
  244. package/dist/schemas/flow-descriptor.schema.json +54 -0
  245. package/dist/schemas/flow-run.schema.json +29 -0
  246. package/dist/schemas/harness-catalog.schema.json +80 -0
  247. package/dist/schemas/interactive-stage-result.schema.json +47 -0
  248. package/dist/schemas/interactive-work-result.schema.json +63 -0
  249. package/dist/schemas/mb-fix-stage-result.schema.json +93 -0
  250. package/dist/schemas/mb-init-compose-result.schema.json +457 -0
  251. package/dist/schemas/mb-init-discover-result.schema.json +500 -0
  252. package/dist/schemas/mb-init-finish-result.schema.json +422 -0
  253. package/dist/schemas/mb-init-preflight-result.schema.json +367 -0
  254. package/dist/schemas/mb-init-review-result.schema.json +396 -0
  255. package/dist/schemas/mb-init-verify-result.schema.json +391 -0
  256. package/dist/schemas/mb-upgrade-stage-result.schema.json +863 -0
  257. package/dist/schemas/memory-bootstrap-receipt-v2.schema.json +67 -0
  258. package/dist/schemas/memory-bootstrap-receipt.schema.json +354 -0
  259. package/dist/schemas/memory-composition-work-result.schema.json +38 -0
  260. package/dist/schemas/memory-repair-work-result.schema.json +56 -0
  261. package/dist/schemas/memory-review-correction-plan.schema.json +30 -0
  262. package/dist/schemas/memory-review-work-result.schema.json +43 -0
  263. package/dist/schemas/model-catalog.schema.json +153 -0
  264. package/dist/schemas/plan-review-decision.schema.json +12 -3
  265. package/dist/schemas/plan-review-result.schema.json +2 -2
  266. package/dist/schemas/profile-settings.schema.json +122 -0
  267. package/dist/schemas/project-flow-pack-manifest.schema.json +2 -2
  268. package/dist/schemas/release-impact.schema.json +3 -3
  269. package/dist/schemas/release-manifest.schema.json +291 -0
  270. package/dist/schemas/review-fix-stage-result.schema.json +210 -0
  271. package/dist/schemas/run-control-receipt.schema.json +119 -0
  272. package/dist/schemas/run-control-request.schema.json +36 -0
  273. package/dist/schemas/run-engine-binding.schema.json +1 -1
  274. package/dist/schemas/stage-start-response.schema.json +4 -0
  275. package/dist/schemas/vnext-protocol-plan.schema.json +3 -3
  276. package/dist/services/accepted-intent.js +139 -0
  277. package/dist/services/assigned-lifecycle.js +382 -0
  278. package/dist/services/branch-context.js +3 -3
  279. package/dist/services/canon.js +54 -15
  280. package/dist/services/check-environment.js +21 -0
  281. package/dist/services/check-runner-evidence.js +344 -0
  282. package/dist/services/check-runner-proof.js +373 -0
  283. package/dist/services/cleanup.js +133 -40
  284. package/dist/services/cli-operation-classifier.js +32 -64
  285. package/dist/services/cli-upgrade-allowlist.js +27 -0
  286. package/dist/services/code-checks.js +1426 -121
  287. package/dist/services/codex-capacity.js +367 -0
  288. package/dist/services/codex-hook-delivery.js +41 -0
  289. package/dist/services/command-context.js +80 -0
  290. package/dist/services/compatibility-preflight.js +16 -3
  291. package/dist/services/config.js +11 -8
  292. package/dist/services/continuation-outcome.js +25 -0
  293. package/dist/services/controller-child-capacity.js +71 -0
  294. package/dist/services/controller-child-observer.js +121 -0
  295. package/dist/services/controller-child-repair.js +117 -0
  296. package/dist/services/controller-execution.js +97 -0
  297. package/dist/services/controller-fanout.js +277 -0
  298. package/dist/services/controller-memory-task.js +45 -0
  299. package/dist/services/controller-memory-worker.js +51 -0
  300. package/dist/services/controller-result-authority.js +127 -0
  301. package/dist/services/controller-work-failure.js +198 -0
  302. package/dist/services/dashboard.js +145 -58
  303. package/dist/services/delivery-access.js +123 -0
  304. package/dist/services/delivery-approval.js +68 -0
  305. package/dist/services/delivery-artifact.js +86 -0
  306. package/dist/services/delivery-checks.js +178 -0
  307. package/dist/services/delivery-execution.js +181 -0
  308. package/dist/services/delivery-intents.js +212 -0
  309. package/dist/services/delivery-operation.js +81 -0
  310. package/dist/services/delivery-policy.js +91 -0
  311. package/dist/services/delivery-procedures.js +43 -0
  312. package/dist/services/delivery-request.js +99 -0
  313. package/dist/services/delivery-result.js +144 -0
  314. package/dist/services/delivery-stage-commands.js +26 -0
  315. package/dist/services/delivery-stage-entry.js +56 -0
  316. package/dist/services/delivery-stage-handlers.js +135 -0
  317. package/dist/services/delivery-stage-results.js +94 -0
  318. package/dist/services/descriptor-coordinator-session.js +37 -0
  319. package/dist/services/descriptor-root-work.js +53 -0
  320. package/dist/services/descriptor-run-settlement.js +107 -0
  321. package/dist/services/descriptor-run-start.js +495 -0
  322. package/dist/services/descriptor-stage-coordinator.js +318 -0
  323. package/dist/services/descriptor-stage-settlement.js +268 -0
  324. package/dist/services/descriptor-stage-start.js +175 -0
  325. package/dist/services/diagnostic-evidence.js +73 -0
  326. package/dist/services/diagnostic-repair-intake.js +123 -0
  327. package/dist/services/diagnostic-repair-source-intake.js +102 -0
  328. package/dist/services/diagnostic-report-publication.js +72 -0
  329. package/dist/services/diagnostic-report.js +97 -0
  330. package/dist/services/diagnostic-run-bundle.js +113 -0
  331. package/dist/services/diagnostic-snapshot.js +159 -0
  332. package/dist/services/diagnostic-stage-handlers.js +109 -0
  333. package/dist/services/diagnostic-stage-results.js +158 -0
  334. package/dist/services/diagnostic-start.js +134 -0
  335. package/dist/services/diagnostic-work-batch.js +34 -0
  336. package/dist/services/diagnostic-work-collection.js +97 -0
  337. package/dist/services/diagnostic-work-registration.js +101 -0
  338. package/dist/services/diagnostic-work-results.js +93 -0
  339. package/dist/services/discovery/agy-discovery.js +2 -0
  340. package/dist/services/discovery/codex-discovery.js +2 -0
  341. package/dist/services/discovery/droid-discovery.js +2 -0
  342. package/dist/services/discovery/grok-discovery.js +2 -0
  343. package/dist/services/discovery/opencode-discovery.js +2 -0
  344. package/dist/services/discovery/static.js +31 -0
  345. package/dist/services/discovery/zcode-discovery.js +2 -0
  346. package/dist/services/distill-document-publication.js +280 -0
  347. package/dist/services/distill-promotion.js +197 -0
  348. package/dist/services/distill-publication-custody.js +162 -0
  349. package/dist/services/distill-stage-handlers.js +249 -0
  350. package/dist/services/distill-stage-results.js +105 -0
  351. package/dist/services/distill-user-inputs.js +4 -0
  352. package/dist/services/distill-work-batch.js +42 -0
  353. package/dist/services/distill-work-collection.js +74 -0
  354. package/dist/services/distill-work-registration.js +93 -0
  355. package/dist/services/distill-work-results.js +98 -0
  356. package/dist/services/engines.js +354 -163
  357. package/dist/services/eval-snapshots.js +1326 -150
  358. package/dist/services/execution-bundles.js +275 -0
  359. package/dist/services/execution-policy.js +185 -0
  360. package/dist/services/executor-onboarding.js +56 -0
  361. package/dist/services/external-work-launch.js +316 -0
  362. package/dist/services/flow-catalog.js +54 -0
  363. package/dist/services/flow-descriptors.js +82 -0
  364. package/dist/services/frozen-engine.js +404 -0
  365. package/dist/services/generic-execution.js +165 -0
  366. package/dist/services/harness-adapter.js +342 -35
  367. package/dist/services/harness-config.js +2 -0
  368. package/dist/services/harness-discovery.js +29 -0
  369. package/dist/services/harness-doctor.js +75 -0
  370. package/dist/services/harness-probe-effects.js +51 -0
  371. package/dist/services/harness-version-probe.js +100 -0
  372. package/dist/services/hook-memory-routing.js +188 -0
  373. package/dist/services/hook-recovery-guard.js +14 -0
  374. package/dist/services/hook-session-observation.js +24 -0
  375. package/dist/services/hooks.js +813 -327
  376. package/dist/services/hybrid-contracts.js +479 -0
  377. package/dist/services/hybrid-digest.js +14 -0
  378. package/dist/services/ids.js +29 -1
  379. package/dist/services/installation-lock.js +95 -0
  380. package/dist/services/installed-flow-source.js +261 -0
  381. package/dist/services/interactive-attached-session.js +215 -0
  382. package/dist/services/interactive-baseline-custody.js +54 -0
  383. package/dist/services/interactive-before-versions.js +148 -0
  384. package/dist/services/interactive-bundle-data.js +85 -0
  385. package/dist/services/interactive-checks.js +179 -0
  386. package/dist/services/interactive-execution.js +33 -0
  387. package/dist/services/interactive-finish-integration.js +236 -0
  388. package/dist/services/interactive-git-baseline.js +230 -0
  389. package/dist/services/interactive-git-dispatch.js +278 -0
  390. package/dist/services/interactive-input-delivery.js +82 -0
  391. package/dist/services/interactive-mutation-scope.js +231 -0
  392. package/dist/services/interactive-request.js +287 -0
  393. package/dist/services/interactive-run-bundle.js +109 -0
  394. package/dist/services/interactive-stage-entry.js +41 -0
  395. package/dist/services/interactive-stage-handlers.js +289 -0
  396. package/dist/services/interactive-stage-observation.js +136 -0
  397. package/dist/services/interactive-stage-results.js +111 -0
  398. package/dist/services/interactive-user-inputs.js +142 -0
  399. package/dist/services/interactive-work-batch.js +43 -0
  400. package/dist/services/interactive-work-collection.js +119 -0
  401. package/dist/services/interactive-work-completion.js +180 -0
  402. package/dist/services/interactive-work-context.js +249 -0
  403. package/dist/services/interactive-work-history.js +112 -0
  404. package/dist/services/interactive-work-registration.js +124 -0
  405. package/dist/services/interactive-work-results.js +115 -0
  406. package/dist/services/interactive-work-start.js +155 -0
  407. package/dist/services/lanes.js +78 -65
  408. package/dist/services/lifecycle-command.js +1 -288
  409. package/dist/services/lifecycle-contract.js +1 -0
  410. package/dist/services/lifecycle-invocations.js +2549 -0
  411. package/dist/services/managed-daemon-binding.js +129 -0
  412. package/dist/services/managed-lease-monitor.js +133 -0
  413. package/dist/services/managed-processes.js +449 -69
  414. package/dist/services/memory-accepted-composition.js +78 -0
  415. package/dist/services/memory-baseline-preservation.js +65 -0
  416. package/dist/services/memory-completed-correction-wave.js +328 -0
  417. package/dist/services/memory-compose-handler.js +380 -0
  418. package/dist/services/memory-composition-acceptance.js +375 -0
  419. package/dist/services/memory-composition-graph.js +165 -0
  420. package/dist/services/memory-composition-registration.js +161 -0
  421. package/dist/services/memory-composition-work-custody.js +156 -0
  422. package/dist/services/memory-composition-work-results.js +108 -0
  423. package/dist/services/memory-corrected-review-acceptance.js +129 -0
  424. package/dist/services/memory-corrected-review-batch.js +37 -0
  425. package/dist/services/memory-corrected-review-findings.js +108 -0
  426. package/dist/services/memory-corrected-review-inputs.js +215 -0
  427. package/dist/services/memory-corrected-review-projection.js +78 -0
  428. package/dist/services/memory-corrected-review-receipt.js +178 -0
  429. package/dist/services/memory-corrected-review-registration.js +192 -0
  430. package/dist/services/memory-correction-check-receipt.js +235 -0
  431. package/dist/services/memory-correction-input-owner.js +6 -0
  432. package/dist/services/memory-custody-snapshot.js +36 -0
  433. package/dist/services/memory-discover-handler.js +104 -0
  434. package/dist/services/memory-finish-evidence.js +457 -0
  435. package/dist/services/memory-finish-handler.js +229 -0
  436. package/dist/services/memory-finish-integration.js +491 -0
  437. package/dist/services/memory-finish-readiness.js +169 -0
  438. package/dist/services/memory-fix-finish-integration.js +129 -0
  439. package/dist/services/memory-fix-git-dispatch.js +139 -0
  440. package/dist/services/memory-fix-intake-custody.js +11 -0
  441. package/dist/services/memory-fix-intake-settlement.js +127 -0
  442. package/dist/services/memory-fix-publication.js +196 -0
  443. package/dist/services/memory-fix-repair-admission.js +116 -0
  444. package/dist/services/memory-fix-request.js +141 -0
  445. package/dist/services/memory-fix-run-bundle.js +83 -0
  446. package/dist/services/memory-fix-scope.js +78 -0
  447. package/dist/services/memory-fix-sources.js +85 -0
  448. package/dist/services/memory-fix-stage-entry.js +24 -0
  449. package/dist/services/memory-fix-stage-handlers.js +282 -0
  450. package/dist/services/memory-fix-stage-results.js +106 -0
  451. package/dist/services/memory-fix-workspace.js +127 -0
  452. package/dist/services/memory-flow-user-inputs.js +88 -0
  453. package/dist/services/memory-git-integration.js +220 -0
  454. package/dist/services/memory-historical-corrected-review.js +212 -0
  455. package/dist/services/memory-historical-original-review.js +143 -0
  456. package/dist/services/memory-historical-repair-registration.js +105 -0
  457. package/dist/services/memory-historical-second-review.js +147 -0
  458. package/dist/services/memory-init-bootstrap-readiness.js +210 -0
  459. package/dist/services/memory-init-contexts.js +181 -0
  460. package/dist/services/memory-init-controller-start.js +119 -0
  461. package/dist/services/memory-init-engine-release.js +223 -0
  462. package/dist/services/memory-init-git-policy.js +165 -0
  463. package/dist/services/memory-init-lint-capability.js +203 -0
  464. package/dist/services/memory-init-native-capacity.js +309 -0
  465. package/dist/services/memory-init-preflight.js +334 -0
  466. package/dist/services/memory-init-project-bootstrap.js +599 -0
  467. package/dist/services/memory-init-request-candidate.js +213 -0
  468. package/dist/services/memory-init-request-input.js +82 -0
  469. package/dist/services/memory-init-resource-storage.js +125 -0
  470. package/dist/services/memory-init-run-allocation.js +81 -0
  471. package/dist/services/memory-init-run-bundle.js +135 -0
  472. package/dist/services/memory-init-start.js +181 -0
  473. package/dist/services/memory-init-startup-custody.js +80 -0
  474. package/dist/services/memory-init-startup-input.js +240 -0
  475. package/dist/services/memory-init-storage.js +91 -0
  476. package/dist/services/memory-init-stores.js +359 -0
  477. package/dist/services/memory-init-worktrunk-capability.js +174 -0
  478. package/dist/services/memory-layer-publication.js +611 -0
  479. package/dist/services/memory-layer.js +225 -0
  480. package/dist/services/memory-lint-config.js +194 -0
  481. package/dist/services/memory-native-review-copy.js +127 -0
  482. package/dist/services/memory-normal-flow-entry.js +87 -0
  483. package/dist/services/memory-ordinary-defaults.js +129 -0
  484. package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
  485. package/dist/services/memory-preflight-handler.js +274 -0
  486. package/dist/services/memory-repair-current-view.js +299 -0
  487. package/dist/services/memory-repair-document-delta.js +489 -0
  488. package/dist/services/memory-repair-history.js +496 -0
  489. package/dist/services/memory-repair-physical-binding.js +194 -0
  490. package/dist/services/memory-repair-publication-files.js +152 -0
  491. package/dist/services/memory-repair-publication-intent.js +27 -0
  492. package/dist/services/memory-repair-publication-plan.js +162 -0
  493. package/dist/services/memory-repair-publication-source.js +225 -0
  494. package/dist/services/memory-repair-publication.js +795 -0
  495. package/dist/services/memory-repair-registration.js +240 -0
  496. package/dist/services/memory-repair-work-baseline.js +415 -0
  497. package/dist/services/memory-repair-work-completion.js +117 -0
  498. package/dist/services/memory-repair-work-custody.js +73 -0
  499. package/dist/services/memory-repair-work-results.js +108 -0
  500. package/dist/services/memory-repair-workspace.js +261 -0
  501. package/dist/services/memory-repair-writer-copy.js +736 -0
  502. package/dist/services/memory-result-binding.js +239 -0
  503. package/dist/services/memory-retained-review-authority.js +138 -0
  504. package/dist/services/memory-retained-review-results.js +70 -0
  505. package/dist/services/memory-retained-second-baseline.js +102 -0
  506. package/dist/services/memory-retained-second-repairs.js +162 -0
  507. package/dist/services/memory-review-acceptance.js +214 -0
  508. package/dist/services/memory-review-correction-plan.js +206 -0
  509. package/dist/services/memory-review-handler.js +585 -0
  510. package/dist/services/memory-review-inputs.js +246 -0
  511. package/dist/services/memory-review-limits.js +10 -0
  512. package/dist/services/memory-review-receipt.js +180 -0
  513. package/dist/services/memory-review-registration.js +117 -0
  514. package/dist/services/memory-review-work-custody.js +126 -0
  515. package/dist/services/memory-review-work-input.js +91 -0
  516. package/dist/services/memory-review-work-results.js +95 -0
  517. package/dist/services/memory-second-corrected-review-inputs.js +167 -0
  518. package/dist/services/memory-second-correction-plan.js +77 -0
  519. package/dist/services/memory-second-repair-baseline.js +91 -0
  520. package/dist/services/memory-second-repair-launch.js +614 -0
  521. package/dist/services/memory-second-repair-registration.js +88 -0
  522. package/dist/services/memory-second-repair-source.js +187 -0
  523. package/dist/services/memory-second-review-acceptance.js +115 -0
  524. package/dist/services/memory-source-observations.js +117 -0
  525. package/dist/services/memory-stage-dispatch.js +65 -0
  526. package/dist/services/memory-stage-results.js +290 -0
  527. package/dist/services/memory-tool-probe.js +25 -0
  528. package/dist/services/memory-upgrade-analysis-handler.js +243 -0
  529. package/dist/services/memory-upgrade-bootstrap-readiness.js +251 -0
  530. package/dist/services/memory-upgrade-evidence.js +100 -0
  531. package/dist/services/memory-upgrade-inventory.js +442 -0
  532. package/dist/services/memory-upgrade-publication-custody.js +73 -0
  533. package/dist/services/memory-upgrade-publication.js +413 -0
  534. package/dist/services/memory-upgrade-selection.js +430 -0
  535. package/dist/services/memory-upgrade-start.js +60 -0
  536. package/dist/services/memory-upgrade-storage-readiness.js +340 -0
  537. package/dist/services/memory-verification-acceptance.js +156 -0
  538. package/dist/services/memory-verification-checks.js +317 -0
  539. package/dist/services/memory-verification-receipt.js +160 -0
  540. package/dist/services/memory-verify-handler.js +137 -0
  541. package/dist/services/memory-work-result-json.js +12 -0
  542. package/dist/services/memory-work-result-preparation.js +64 -0
  543. package/dist/services/merge-queue.js +228 -149
  544. package/dist/services/merge-server.js +163 -35
  545. package/dist/services/migrations.js +164 -114
  546. package/dist/services/model-catalog.js +109 -0
  547. package/dist/services/model-discovery.js +46 -0
  548. package/dist/services/native-daemon-history.js +50 -0
  549. package/dist/services/native-session-control.js +39 -0
  550. package/dist/services/operator-profiles.js +236 -0
  551. package/dist/services/physical-startup.js +45 -0
  552. package/dist/services/plan-runtime.js +26 -11
  553. package/dist/services/plans.js +28 -25
  554. package/dist/services/project-flow-source.js +195 -0
  555. package/dist/services/project-git-integration.js +92 -0
  556. package/dist/services/project-registry.js +97 -0
  557. package/dist/services/project-summary.js +1 -1
  558. package/dist/services/projects.js +17 -87
  559. package/dist/services/prompt-delivery.js +71 -0
  560. package/dist/services/prompts.js +28 -17
  561. package/dist/services/protocols.js +163 -87
  562. package/dist/services/provider-capacity.js +463 -0
  563. package/dist/services/recovery-observation-budget.js +121 -0
  564. package/dist/services/recovery-snapshot-database.js +588 -0
  565. package/dist/services/release-archive-producer.js +52 -0
  566. package/dist/services/release-archive.js +143 -0
  567. package/dist/services/release-cache.js +150 -0
  568. package/dist/services/release-compatibility.js +18 -0
  569. package/dist/services/release-download.js +67 -0
  570. package/dist/services/release-envelope.js +104 -0
  571. package/dist/services/release-manifest.js +45 -0
  572. package/dist/services/release-payload.js +114 -0
  573. package/dist/services/release-producer.js +63 -0
  574. package/dist/services/release-provenance.js +160 -0
  575. package/dist/services/release-registry.js +66 -0
  576. package/dist/services/release-source.js +194 -0
  577. package/dist/services/repair-intents.js +29 -0
  578. package/dist/services/repair-receipt.js +13 -0
  579. package/dist/services/retained-native-hook.js +274 -0
  580. package/dist/services/review-copy.js +165 -0
  581. package/dist/services/review-deferral.js +23 -0
  582. package/dist/services/review-fix-handoff.js +82 -0
  583. package/dist/services/review-fix-intake-custody.js +17 -0
  584. package/dist/services/review-fix-stage-entry.js +43 -0
  585. package/dist/services/review-fix-stage-handlers.js +176 -0
  586. package/dist/services/review-fix-stage-results.js +86 -0
  587. package/dist/services/run-control-receipt.js +56 -0
  588. package/dist/services/run-control-worker.js +469 -0
  589. package/dist/services/run-control.js +1109 -0
  590. package/dist/services/run-controller-adapter.js +434 -0
  591. package/dist/services/run-controller-capture.js +186 -0
  592. package/dist/services/run-controller-process.js +226 -0
  593. package/dist/services/run-controller-recovery.js +335 -0
  594. package/dist/services/run-controller-state.js +106 -0
  595. package/dist/services/run-controller.js +1717 -0
  596. package/dist/services/run-engine-bindings.js +1 -1
  597. package/dist/services/run-fork.js +147 -0
  598. package/dist/services/run-health.js +149 -0
  599. package/dist/services/run-observations.js +152 -0
  600. package/dist/services/run-projection.js +22 -64
  601. package/dist/services/run-recovery-guard.js +107 -0
  602. package/dist/services/run-recovery-runtime.js +112 -0
  603. package/dist/services/run-recovery.js +485 -0
  604. package/dist/services/run-start-custody.js +189 -0
  605. package/dist/services/run-timeline.js +59 -0
  606. package/dist/services/runs.js +996 -271
  607. package/dist/services/runtime-budget.js +446 -0
  608. package/dist/services/runtime-command.js +43 -0
  609. package/dist/services/runtime-scope-capture.js +52 -0
  610. package/dist/services/runtime-scope-control.js +468 -0
  611. package/dist/services/runtime-scope-resume.js +605 -0
  612. package/dist/services/runtime-scope-stop.js +211 -0
  613. package/dist/services/runtime-scope-worker.js +314 -0
  614. package/dist/services/runtime-service.js +19 -14
  615. package/dist/services/schema-validation.js +10 -8
  616. package/dist/services/scope-writer-cleanup.js +27 -0
  617. package/dist/services/sessions.js +37 -91
  618. package/dist/services/setup.js +427 -0
  619. package/dist/services/stage-blocker.js +17 -7
  620. package/dist/services/stage-context.js +240 -18
  621. package/dist/services/stage-handlers.js +141 -0
  622. package/dist/services/stage-lifecycle.js +156 -119
  623. package/dist/services/stage-pause.js +222 -94
  624. package/dist/services/stage-report-renderer.js +230 -6
  625. package/dist/services/stage-work-graph.js +52 -0
  626. package/dist/services/technical-notes.js +31 -0
  627. package/dist/services/tooling.js +111 -44
  628. package/dist/services/usage.js +49 -101
  629. package/dist/services/verification-matrix.js +393 -0
  630. package/dist/services/version-status.js +1 -1
  631. package/dist/services/vnext-code-review.js +302 -91
  632. package/dist/services/vnext-code.js +325 -251
  633. package/dist/services/vnext-contracts.js +10 -1
  634. package/dist/services/vnext-execution-profile.js +80 -5
  635. package/dist/services/vnext-fanout.js +399 -20
  636. package/dist/services/vnext-merge.js +336 -114
  637. package/dist/services/vnext-plan-review.js +288 -133
  638. package/dist/services/vnext-plan.js +230 -106
  639. package/dist/services/vnext-protocolize.js +534 -96
  640. package/dist/services/vnext-specify.js +131 -84
  641. package/dist/services/vnext-workspace-policy.js +7 -2
  642. package/dist/services/work-registry.js +1950 -215
  643. package/dist/services/work-retry-context.js +55 -0
  644. package/dist/services/workspace-bootstrap.js +53 -15
  645. package/dist/services/workspace-files.js +85 -0
  646. package/dist/services/worktrees.js +108 -48
  647. package/dist/shared/entity-references.js +1 -0
  648. package/dist/shared/errors.js +27 -0
  649. package/dist/storage/agent-output.js +26 -0
  650. package/dist/storage/data-preservation.js +65 -0
  651. package/dist/storage/database.js +931 -40
  652. package/dist/storage/foreign-key-transaction.js +39 -0
  653. package/dist/storage/immutable-input.js +45 -0
  654. package/dist/storage/import-guard.js +159 -0
  655. package/dist/storage/memory-upgrade-schema-bootstrap.js +38 -0
  656. package/dist/storage/native-cleanup.js +52 -0
  657. package/dist/storage/paired-writer-migration.js +424 -0
  658. package/dist/storage/paths.js +17 -4
  659. package/dist/storage/projection-lock.js +73 -0
  660. package/dist/storage/work-references.js +23 -0
  661. package/dist/storage/writer-contract.js +96 -0
  662. package/dist/storage/writer-migration.js +346 -0
  663. package/dist/storage/writer-restore.js +217 -0
  664. package/dist/verification-components.json +384 -0
  665. package/package.json +52 -13
  666. package/tools/create-canon-release.mjs +33 -0
  667. package/tools/probe-codex-history.mjs +37 -0
  668. package/tools/produce-hybrid-release.mjs +41 -0
  669. package/tools/repair-paused-run-status.mjs +84 -0
  670. package/tools/verification-jobs.mjs +342 -0
@@ -0,0 +1,89 @@
1
+ import { fileURLToPath } from "node:url";
2
+ import { performance } from "node:perf_hooks";
3
+ import { parseCommandArgs, parseLifecycleCommand, lifecycleCommandFromPayload, continuationCommand } from "../services/lifecycle-command.js";
4
+ import { errorRecord, AppError } from "../shared/errors.js";
5
+ import { parseJsonObject } from "../shared/json.js";
6
+ import { assignedLifecycleHookCommand, retainedWorkStartHookCommand } from "./native-hook-preparation.js";
7
+ const workerFile = fileURLToPath(import.meta.url);
8
+ const ingressBudgetMs = 20_000; // Shared admission budget; host separately allows cold CLI startup/cleanup.
9
+ const { hookBudget, readNativeHookInput } = await import("../harness-runtime/lib/native-hook-command.mjs");
10
+ /** Lightweight entry: unrelated hooks never load the router or open storage. */
11
+ export async function runHookIngress(args) {
12
+ try {
13
+ const parsed = parseCommandArgs(args.slice(3));
14
+ for (const [key, values] of parsed.options)
15
+ if (!["event", "project-root", "json"].includes(key) || values.length !== 1)
16
+ throw new AppError("usage", `Invalid hook option: ${key}`, 2);
17
+ const event = parsed.options.get("event")?.[0];
18
+ if (!event?.trim() || event === "__dd_flow_flag__" || parsed.positional.length)
19
+ throw new AppError("usage", "Hook ingress requires --event with a value", 2);
20
+ const root = parsed.options.get("project-root")?.[0];
21
+ if (root !== undefined && (!root.trim() || root === "__dd_flow_flag__"))
22
+ throw new AppError("usage", "--project-root requires a value", 2);
23
+ if (parsed.options.has("json") && parsed.options.get("json")?.[0] !== "__dd_flow_flag__")
24
+ throw new AppError("usage", "--json does not take a value", 2);
25
+ const started = performance.now();
26
+ const budget = hookBudget(ingressBudgetMs, process.env.DD_FLOW_HOOK_DEADLINE_AT ? Number(process.env.DD_FLOW_HOOK_DEADLINE_AT) : null);
27
+ const stdin = await readNativeHookInput(process.stdin, budget);
28
+ const payload = parseJsonObject(stdin || "{}", "native hook stdin");
29
+ const command = lifecycleCommandFromPayload(payload);
30
+ const analysis = command ? parseLifecycleCommand(command) : { kind: "none", unresolved: false };
31
+ if (event !== "PreToolUse" || !command || (analysis.kind === "none" && (!("participation" in analysis) || !["lifecycle", "auxiliary"].includes(analysis.participation)) && !continuationCommand(command))) {
32
+ process.stdout.write("{}\n");
33
+ return 0;
34
+ }
35
+ // Assigned Stage and settlement commands are admitted by the CLI's
36
+ // retained packet/CAS, not by a second live hook delivery. A supplied ID
37
+ // is not authority: the CLI still validates the current assignment, owner,
38
+ // generation and exact arguments before any mutation. Work start and all
39
+ // hook-only/legacy commands still need their native identity receipt.
40
+ if (process.env.DD_FLOW_CODEX_STATE_DIR && assignedLifecycleHookCommand(command, process.env)) {
41
+ process.stdout.write("{}\n");
42
+ return 0;
43
+ }
44
+ // Legacy and bootstrap/native-receipt paths still use their existing
45
+ // identity checks. Run them here rather than launching a second Node
46
+ // process with a second deadline; unknown outcomes must not be reissued.
47
+ const phase = (name) => {
48
+ process.stderr.write(`${JSON.stringify({ kind: "native_hook_phase", phase: name, elapsed_ms: Math.round(performance.now() - started), remaining_ms: budget.remaining(name) })}\n`);
49
+ };
50
+ phase("input");
51
+ phase("verification");
52
+ const { verifyCodexHookDelivery } = await import("../services/codex-hook-delivery.js");
53
+ const proof = await verifyCodexHookDelivery(process.env, payload);
54
+ if (proof && retainedWorkStartHookCommand(command, proof.nativeHookBinding)) {
55
+ process.stdout.write("{}\n");
56
+ return 0;
57
+ }
58
+ phase("import");
59
+ const [{ createContext }, { handleCodexHook }] = await Promise.all([import("../runtime/context.js"), import("../services/hooks.js")]);
60
+ phase("store_open");
61
+ const context = createContext(process.env, "hook");
62
+ try {
63
+ if (proof)
64
+ context.codexHookProof = proof;
65
+ phase("receipt");
66
+ const result = handleCodexHook(context, { event, ...(root ? { projectRoot: root } : {}), stdin });
67
+ phase("committed");
68
+ // Preserve the legacy public response; managed Codex only consumes the
69
+ // native hook protocol field, not internal receipt metadata.
70
+ const output = process.env.DD_FLOW_CODEX_STATE_DIR
71
+ ? result.hookSpecificOutput ? { hookSpecificOutput: result.hookSpecificOutput } : {}
72
+ : result;
73
+ process.stdout.write(`${JSON.stringify(output)}\n`);
74
+ }
75
+ finally {
76
+ context.db.close?.();
77
+ }
78
+ return 0;
79
+ }
80
+ catch (error) {
81
+ const record = errorRecord(error);
82
+ process.stderr.write(`${JSON.stringify({ ok: false, error: record })}\n`);
83
+ return record.exitCode;
84
+ }
85
+ }
86
+ // Compatibility with direct invocations of the formerly nested worker.
87
+ if (process.argv[1] === workerFile) {
88
+ process.exitCode = await runHookIngress(process.argv.slice(2));
89
+ }
@@ -0,0 +1,193 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import crypto from "node:crypto";
4
+ import { AsyncLocalStorage } from "node:async_hooks";
5
+ import { AppError, isAppError } from "../shared/errors.js";
6
+ import { validateSchema } from "../services/schema-validation.js";
7
+ // Observe only bytes already consumed by CLI preparation; never reread a file
8
+ // in a hook or while replaying a retained outcome.
9
+ const consumedInputs = new AsyncLocalStorage();
10
+ export function recordConsumedInput(bytes) {
11
+ recordConsumedInputDigest(crypto.createHash("sha256").update(bytes).digest("hex"));
12
+ }
13
+ export function recordConsumedInputDigest(digest) { consumedInputs.getStore()?.push(digest); }
14
+ export async function withPreparedInputBinding(prepare) {
15
+ return consumedInputs.run([], async () => {
16
+ try {
17
+ return await prepare();
18
+ }
19
+ catch (error) {
20
+ const inputs = consumedInputs.getStore();
21
+ if (isAppError(error) && inputs.length)
22
+ error.details.consumed_input_sha256 = crypto.createHash("sha256").update(JSON.stringify(inputs)).digest("hex");
23
+ throw error;
24
+ }
25
+ });
26
+ }
27
+ export function prepareError(error, input = {}) {
28
+ if (isAppError(error)) {
29
+ // A malformed user input is safely correctable. A broken schema registry,
30
+ // binding, or storage is not; do not disguise infrastructure damage as a
31
+ // retryable command typo.
32
+ const inputErrorCodes = new Set([
33
+ "usage", "validation", "schema_validation", "invalid_json", "not_found",
34
+ "path_escape", "input_file_missing", "input_file_not_regular", "input_file_unreadable",
35
+ "response_file_parent_invalid", "response_file_invalid", "context_checksum_mismatch", "invalid_run_config_state", "invalid_work_state", "invalid_stage_state", "runtime_budget_invalid", "runtime_scope_manifest_invalid", "runtime_scope_resume_invalid",
36
+ "fork_path_conflict", "fork_output_not_empty", "fork_checkpoint_invalid", "fork_engine_unavailable", "snapshot_missing",
37
+ "repair_check_declaration_missing", "review_repair_check_required", "review_check_reference_unknown", "semantic_status_inconsistent", "migration_report_invalid", "controller_context_missing", "snapshot_output_inside_runtime"
38
+ ]);
39
+ if (!inputErrorCodes.has(error.code) && error.details.phase !== "prepare")
40
+ throw error;
41
+ throw new AppError(error.code, error.message, 2, {
42
+ ...error.details,
43
+ phase: "prepare",
44
+ effect: error.details.effect ?? "no_effect",
45
+ recoverable: error.details.recoverable ?? true,
46
+ ...input
47
+ });
48
+ }
49
+ const code = error?.code;
50
+ if (typeof input.file !== "string" || !["ENOENT", "EACCES", "EPERM", "EISDIR", "ENOTDIR", "ELOOP", "ENAMETOOLONG"].includes(code ?? ""))
51
+ throw error;
52
+ throw new AppError("input_file_unreadable", `Cannot read input file${typeof input.file === "string" ? `: ${input.file}` : ""}`, 2, {
53
+ phase: "prepare", effect: "no_effect", recoverable: true, ...input, cause: code ?? String(error)
54
+ });
55
+ }
56
+ export function prepareTextFile(file, label = "input file", maxBytes) {
57
+ const prepared = prepareFileBytes(file, label, maxBytes);
58
+ if (maxBytes === undefined)
59
+ return { file: prepared.file, text: prepared.bytes.toString("utf8") };
60
+ try {
61
+ return { file: prepared.file, text: new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(prepared.bytes) };
62
+ }
63
+ catch {
64
+ return prepareError(new AppError("validation", `${label} must contain valid UTF-8`, 2), { file: prepared.file, label });
65
+ }
66
+ }
67
+ export async function readBoundedUtf8Stream(stream, maxBytes) {
68
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 0)
69
+ throw new AppError("usage", "Invalid input byte bound", 2);
70
+ const decoder = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
71
+ let data = "", byteLength = 0;
72
+ for await (const chunk of stream) {
73
+ const bytes = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
74
+ byteLength += bytes.length;
75
+ if (byteLength > maxBytes)
76
+ throw new AppError("usage", "Standard input exceeds its byte bound", 2);
77
+ try {
78
+ data += decoder.decode(bytes, { stream: true });
79
+ }
80
+ catch {
81
+ throw new AppError("validation", "Standard input must contain valid UTF-8", 2);
82
+ }
83
+ }
84
+ try {
85
+ const text = data + decoder.decode();
86
+ recordConsumedInput(text);
87
+ return text;
88
+ }
89
+ catch {
90
+ throw new AppError("validation", "Standard input must contain valid UTF-8", 2);
91
+ }
92
+ }
93
+ export function prepareFileBytes(file, label = "input file", maxBytes) {
94
+ const absolute = path.resolve(file);
95
+ let descriptor;
96
+ try {
97
+ descriptor = fs.openSync(absolute, fs.constants.O_RDONLY | fs.constants.O_NONBLOCK);
98
+ const stat = fs.fstatSync(descriptor);
99
+ if (!stat.isFile()) {
100
+ throw new AppError("input_file_not_regular", `${label} must be a readable regular file: ${absolute}`, 2, { file: absolute, label });
101
+ }
102
+ if (maxBytes === undefined) {
103
+ const bytes = fs.readFileSync(descriptor);
104
+ recordConsumedInput(bytes);
105
+ return { file: absolute, bytes };
106
+ }
107
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 0)
108
+ throw new AppError("usage", "Invalid input byte bound", 2);
109
+ const oversized = () => new AppError("usage", `${label} exceeds its byte bound`, 2);
110
+ if (stat.size > maxBytes)
111
+ throw oversized();
112
+ // Read at most one extra byte: the file can grow after fstat.
113
+ const buffer = Buffer.alloc(maxBytes + 1);
114
+ let length = 0;
115
+ while (length < buffer.length) {
116
+ const count = fs.readSync(descriptor, buffer, length, buffer.length - length, null);
117
+ if (!count)
118
+ break;
119
+ length += count;
120
+ }
121
+ if (length > maxBytes)
122
+ throw oversized();
123
+ const bytes = buffer.subarray(0, length);
124
+ recordConsumedInput(bytes);
125
+ return { file: absolute, bytes };
126
+ }
127
+ catch (error) {
128
+ if (error?.code === "ENOENT") {
129
+ throw new AppError("input_file_missing", `${label} does not exist: ${absolute}`, 2, {
130
+ phase: "prepare", effect: "no_effect", recoverable: true, file: absolute, label
131
+ });
132
+ }
133
+ return prepareError(error, { file: absolute, label });
134
+ }
135
+ finally {
136
+ if (descriptor !== undefined)
137
+ fs.closeSync(descriptor);
138
+ }
139
+ }
140
+ export function prepareJsonText(text, input) {
141
+ try {
142
+ return { file: input.file, text, value: JSON.parse(text) };
143
+ }
144
+ catch {
145
+ // Keep the established public code so agents can recognise this as a
146
+ // safe correction-and-retry condition.
147
+ throw new AppError("invalid_json", `Invalid JSON in ${input.label ?? "input"}: ${input.file}`, 2, {
148
+ phase: "prepare", effect: "no_effect", recoverable: true, file: input.file, label: input.label ?? "input",
149
+ cause: "Invalid JSON syntax", input_sha256: crypto.createHash("sha256").update(text).digest("hex")
150
+ });
151
+ }
152
+ }
153
+ export function prepareJsonFile(file, label = "input JSON") {
154
+ const prepared = prepareTextFile(file, label);
155
+ return prepareJsonText(prepared.text, { file: prepared.file, label });
156
+ }
157
+ export function prepareJsonSchema(file, label, schema) {
158
+ const prepared = prepareJsonFile(file, label);
159
+ try {
160
+ validateSchema({ ...schema, file: prepared.file, data: prepared.value });
161
+ }
162
+ catch (error) {
163
+ return prepareError(error, { file: prepared.file, label });
164
+ }
165
+ return prepared;
166
+ }
167
+ /** Read-only destination check; execution still handles filesystem races. */
168
+ export function prepareOutputFile(value) { return prepareOutput(value, false); }
169
+ export function prepareOutputDirectory(value) { return prepareOutput(value, true); }
170
+ function prepareOutput(value, directory) {
171
+ const file = path.resolve(value);
172
+ try {
173
+ let ancestor = directory ? file : path.dirname(file);
174
+ while (!fs.existsSync(ancestor) && path.dirname(ancestor) !== ancestor)
175
+ ancestor = path.dirname(ancestor);
176
+ if (!fs.statSync(ancestor).isDirectory())
177
+ throw new AppError("validation", "Output parent must be a directory", 2);
178
+ fs.accessSync(ancestor, fs.constants.W_OK | fs.constants.X_OK);
179
+ if (fs.existsSync(file)) {
180
+ const stat = fs.statSync(file);
181
+ if (directory ? !stat.isDirectory() : !stat.isFile())
182
+ throw new AppError("validation", directory ? "Output must name a directory" : "Output must name a regular file", 2);
183
+ fs.accessSync(file, fs.constants.W_OK | (directory ? fs.constants.X_OK : 0));
184
+ }
185
+ return file;
186
+ }
187
+ catch (error) {
188
+ const code = error?.code;
189
+ if (["ENOENT", "EACCES", "EPERM", "ENOTDIR", "ELOOP", "ENAMETOOLONG"].includes(code ?? ""))
190
+ return prepareError(new AppError("validation", "Output destination is not writable or has an invalid parent", 2, { cause: code }), { file, parameter: "output" });
191
+ return prepareError(error, { file, parameter: "output" });
192
+ }
193
+ }
@@ -0,0 +1,33 @@
1
+ import path from "node:path";
2
+ import { AppError } from "../shared/errors.js";
3
+ import { interactiveStages } from "../domain/interactive-flow.js";
4
+ import { prepareCommandRoute } from "./command-inputs.js";
5
+ import { prepareFlowExecutionSelectors } from "./diagnostic-invocation.js";
6
+ /** Pure input preparation. Defaults remain omitted for exact retained replay. */
7
+ export function prepareInteractiveInvocation(args) {
8
+ const refuse = (message) => { throw new AppError("usage", message, 2, { phase: "prepare", effect: "no_effect" }); };
9
+ const route = prepareCommandRoute(args);
10
+ if (route.key !== "flow interactive")
11
+ refuse("Use flow interactive");
12
+ const options = route.parsed.options, value = (name) => options.get(name)?.[0];
13
+ const projectRoot = value("project-root"), requestId = value("request-id"), workspace = value("workspace");
14
+ if (!path.isAbsolute(projectRoot) || path.resolve(projectRoot) !== projectRoot
15
+ || !/^[A-Za-z0-9][A-Za-z0-9_.-]{0,95}$/.test(requestId)
16
+ || workspace !== undefined && (!path.isAbsolute(workspace) || path.resolve(workspace) !== workspace))
17
+ refuse("Interactive needs canonical absolute roots and a bounded request ID");
18
+ if (options.has("detach") && options.has("prepare-only"))
19
+ refuse("--detach and --prepare-only are exclusive");
20
+ const selected = prepareFlowExecutionSelectors(options, interactiveStages);
21
+ if (selected.profileFile !== undefined && !path.isAbsolute(selected.profileFile))
22
+ refuse("--profile-file must be absolute");
23
+ const execution = value("execution");
24
+ if (execution)
25
+ selected.execution.execution = execution;
26
+ const gitRoute = value("git-route"), integrationBranch = value("integration-branch");
27
+ if (Boolean(gitRoute) !== Boolean(integrationBranch))
28
+ refuse("--git-route and --integration-branch must be supplied together");
29
+ const gitPolicy = gitRoute
30
+ ? { route: gitRoute, integrationBranch: integrationBranch } : undefined;
31
+ return { scope: { projectRoot, requestId }, workspace, ...selected, gitPolicy, intakeFile: value("intake-file"),
32
+ detach: options.has("detach"), prepareOnly: options.has("prepare-only"), nonInteractive: options.has("non-interactive") };
33
+ }
@@ -0,0 +1,114 @@
1
+ import { createContext } from "../runtime/context.js";
2
+ import { AppError, errorRecord } from "../shared/errors.js";
3
+ import { resolveDdFlowHome, resolveProjectRoot } from "../storage/paths.js";
4
+ import { readInteractiveRequest, assertInteractiveLaunchReplay, retainInteractiveRequest, startInteractiveRun } from "../services/interactive-request.js";
5
+ import { PreparedProjectFlowSource } from "../services/project-flow-source.js";
6
+ import { readSetupStatus } from "../services/setup.js";
7
+ import { selectMemoryInitInstalledEngine } from "../services/memory-init-engine-release.js";
8
+ import { readOperatorProfiles, readOperatorProfileInput } from "../services/operator-profiles.js";
9
+ import { onboardExecutor } from "../services/executor-onboarding.js";
10
+ import { prepareInteractiveExecution } from "../services/interactive-execution.js";
11
+ import { PreparedInteractiveGitBaseline } from "../services/interactive-git-baseline.js";
12
+ import { PreparedInteractiveBeforeVersions } from "../services/interactive-before-versions.js";
13
+ import { inspectMemoryGitExecutable } from "../services/memory-init-preflight.js";
14
+ import { loadVnextWorkspacePolicy } from "../services/vnext-workspace-policy.js";
15
+ import { readFlowRunExecutionBundle } from "../services/runs.js";
16
+ import { requireProjectByRoot } from "../services/projects.js";
17
+ import { requireRun } from "../services/run-controller-state.js";
18
+ import { prepareInteractiveContexts, publishInteractiveContexts } from "../services/memory-init-contexts.js";
19
+ import { prepareInteractiveInvocation } from "./interactive-invocation.js";
20
+ import { askExecutorChoice } from "./executor-onboarding.js";
21
+ import { prepareTextFile } from "./input-preparation.js";
22
+ import { parseOutputOptions } from "./output-options.js";
23
+ import { prepareResponseDestination, writeResponseFile } from "./response-file.js";
24
+ import { writePreparationError } from "./error-output.js";
25
+ import { launchAndObserveMemoryFlow } from "./memory-init.js";
26
+ /** One request/bundle/RUN owner. Attached returns candidates for the current
27
+ * trusted Session; managed uses the existing detached controller and observer. */
28
+ export async function runInteractiveCli(args, env = process.env, io = process) {
29
+ let context, effects = false;
30
+ try {
31
+ const output = parseOutputOptions(args), invocation = prepareInteractiveInvocation(output.args), home = resolveDdFlowHome(env);
32
+ if (output.responseFile)
33
+ prepareResponseDestination(output.responseFile);
34
+ if (resolveProjectRoot(invocation.scope.projectRoot) !== invocation.scope.projectRoot
35
+ || invocation.workspace !== undefined && resolveProjectRoot(invocation.workspace) !== invocation.workspace)
36
+ throw new AppError("usage", "Interactive roots must be canonical existing checkouts", 2, { effect: "no_effect" });
37
+ if (invocation.profileFile)
38
+ invocation.execution.rootProfile = readOperatorProfileInput(invocation.profileFile);
39
+ const raw = structuredClone(invocation.execution);
40
+ const requestText = invocation.intakeFile ? prepareTextFile(invocation.intakeFile, "interactive request", 64 * 1024).text : undefined;
41
+ context = createContext(env, "prepared_existing", undefined, { resourceDatabaseMode: "prepared_existing" });
42
+ const retained = readInteractiveRequest(context, invocation.scope);
43
+ if (retained) {
44
+ assertInteractiveLaunchReplay(context, invocation.scope, { launchSelection: raw,
45
+ ...(invocation.workspace !== undefined ? { workspace: invocation.workspace } : {}),
46
+ ...(requestText !== undefined ? { requestText } : {}), ...(invocation.gitPolicy ? { gitPolicy: invocation.gitPolicy } : {}) });
47
+ const originalExecution = retained.blobs.find(item => item.path === "runtime/execution.json");
48
+ if (!originalExecution)
49
+ throw new AppError("interactive_request_invalid", "Restore the original execution selection", 2, { effect: "no_effect" });
50
+ const execution = JSON.parse(Buffer.from(originalExecution.base64, "base64").toString());
51
+ if (invocation.detach && execution.execution !== "managed")
52
+ throw new AppError("usage", "--detach requires managed execution", 2, { effect: "no_effect" });
53
+ }
54
+ else {
55
+ if (!requestText?.trim())
56
+ throw new AppError("usage", "Fresh interactive flow requires --intake-file", 2, { effect: "no_effect" });
57
+ if (invocation.detach && invocation.execution.execution !== "managed")
58
+ throw new AppError("usage", "--detach requires explicit managed execution", 2, { effect: "no_effect" });
59
+ const workspace = invocation.workspace ?? invocation.scope.projectRoot;
60
+ const source = PreparedProjectFlowSource.fromProject({ projectRoot: invocation.scope.projectRoot, workspace, flowId: "interactive" });
61
+ const installation = readSetupStatus(home).installation;
62
+ if (!installation)
63
+ throw new AppError("interactive_setup_required", "Install the desired CLI release before interactive execution", 2, { effect: "no_effect" });
64
+ const engine = selectMemoryInitInstalledEngine(home, installation.manifest_sha256);
65
+ engine.admitInteractiveFlow(source);
66
+ const settings = readOperatorProfiles(home), selectedRoot = invocation.execution.rootProfile, stdin = io.stdin ?? process.stdin;
67
+ const executor = await onboardExecutor(typeof selectedRoot === "string" ? { profileId: selectedRoot } : selectedRoot ? { profile: selectedRoot } : {}, () => settings, { allowSkip: false, nonInteractive: invocation.nonInteractive || output.json || output.progressJsonl
68
+ || !stdin.isTTY || !io.stderr.isTTY }, profiles => askExecutorChoice(profiles, { stdin, stderr: io.stderr }, { allowSave: false, allowSkip: false }));
69
+ if (!executor.profile)
70
+ throw new AppError("interactive_executor_required", "Select an interactive executor", 2, { effect: "no_effect" });
71
+ const execution = prepareInteractiveExecution(context, { scope: { ...invocation.scope, workspace }, flow: source.resolveRegisteredFlow(), profiles: settings,
72
+ selection: { ...raw, rootProfile: selectedRoot ?? executor.profile }, launchArgs: args });
73
+ const gitExecutable = inspectMemoryGitExecutable(env).executable;
74
+ const defaults = invocation.gitPolicy ? null : loadVnextWorkspacePolicy(invocation.scope.projectRoot).workspace;
75
+ const gitPolicy = invocation.gitPolicy ?? { route: defaults.route, integrationBranch: defaults.integration_branch };
76
+ const baseline = PreparedInteractiveGitBaseline.capture({ projectRoot: invocation.scope.projectRoot, workspace, gitExecutable, env });
77
+ const beforeVersions = PreparedInteractiveBeforeVersions.capture(baseline, []);
78
+ effects = true;
79
+ retainInteractiveRequest(context, { source, engine, execution: execution.execution, baseline, beforeVersions,
80
+ boundAt: context.now(), requestText, gitExecutable, gitPolicy, launchSelection: raw, receipts: execution.receipts, receiptBytes: execution.receiptBytes }, execution.attached ?? undefined);
81
+ }
82
+ effects = true;
83
+ const started = startInteractiveRun(context, invocation.scope), bundle = readFlowRunExecutionBundle(context, { projectRoot: invocation.scope.projectRoot, runId: started.runId });
84
+ if (!bundle || bundle.manifest.flow_id !== "interactive")
85
+ throw new AppError("interactive_bundle_missing", "Restore the original interactive RUN bundle", 1, { effect: "committed" });
86
+ const workspaceRoot = bundle.execution.snapshot().scope.workspace;
87
+ if (bundle.execution.settings.execution === "managed")
88
+ return await launchAndObserveMemoryFlow(context, { scope: { ...invocation.scope, workspaceRoot }, prepareOnly: invocation.prepareOnly, detach: invocation.detach }, started, "interactive", output, env, io);
89
+ const run = requireRun(context, requireProjectByRoot(context, invocation.scope.projectRoot).id, started.runId);
90
+ const row = context.db.get("SELECT payload_json FROM audit_events WHERE project_id=? AND event_type='flow_run.start_root_owned' AND json_extract(payload_json,'$.run_id')=?", [run.project_id, run.id]);
91
+ const owner = row ? JSON.parse(row.payload_json).owner : null;
92
+ if (!owner || !Number.isSafeInteger(owner.dev) || !Number.isSafeInteger(owner.ino))
93
+ throw new AppError("interactive_root_owner_missing", "Restore original RUN directory ownership", 1, { effect: "committed" });
94
+ const contexts = prepareInteractiveContexts(bundle, run.run_root);
95
+ publishInteractiveContexts(bundle, contexts.objective, run.run_root, contexts.sha256, owner);
96
+ const entry = bundle.descriptor.descriptor.entry_stage;
97
+ const response = { ok: true, action: invocation.prepareOnly ? "flow_interactive_prepared" : "flow_interactive_attached", flow_id: "interactive",
98
+ ...started, run_id: started.runId, request_id: invocation.scope.requestId, project_root: run.project_root,
99
+ workspace_root: run.workspace_root, run_root: run.run_root, context_file: contexts.file, context_sha256: contexts.sha256,
100
+ entry_stage: entry, entry_context: JSON.parse(contexts.files.get(contexts.file).toString()).stages[entry] };
101
+ io.stdout.write(`${JSON.stringify(writeResponseFile(response, output), null, output.json || output.progressJsonl ? undefined : 2)}\n`);
102
+ return 0;
103
+ }
104
+ catch (error) {
105
+ const record = errorRecord(error);
106
+ if (effects)
107
+ record.details = { ...record.details, effect: ["unknown", "committed", "partial"].includes(String(record.details.effect)) ? record.details.effect : "partial", next_action: "reconcile_exact_request" };
108
+ writePreparationError(io, args, record);
109
+ return record.exitCode;
110
+ }
111
+ finally {
112
+ context?.db.close?.();
113
+ }
114
+ }
@@ -0,0 +1,52 @@
1
+ import path from "node:path";
2
+ import { AppError } from "../shared/errors.js";
3
+ import { memoryFixStages } from "../domain/memory-fix-flow.js";
4
+ import { prepareCommandRoute } from "./command-inputs.js";
5
+ import { prepareFlowExecutionSelectors } from "./diagnostic-invocation.js";
6
+ import { hybridDigest } from "../services/hybrid-contracts.js";
7
+ function refuse(message) { throw new AppError("usage", message, 2, { phase: "prepare", effect: "no_effect" }); }
8
+ /** No file/profile lookup, workspace creation or RUN allocation. Omitted fresh
9
+ * selectors remain omitted so a replay can use its retained choices. */
10
+ export function prepareMemoryFixInvocation(args) {
11
+ const route = prepareCommandRoute(args);
12
+ if (route.key !== "flow mb-fix")
13
+ refuse("Use flow mb-fix");
14
+ const options = route.parsed.options, value = (name) => options.get(name)?.[0];
15
+ const projectRoot = value("project-root"), requestId = value("request-id"), workspaceRoot = value("workspace-root");
16
+ if (!path.isAbsolute(projectRoot) || path.resolve(projectRoot) !== projectRoot
17
+ || !/^[A-Za-z0-9][A-Za-z0-9_.-]{0,95}$/.test(requestId)
18
+ || workspaceRoot !== undefined && (!path.isAbsolute(workspaceRoot) || path.resolve(workspaceRoot) !== workspaceRoot))
19
+ refuse("Repair needs canonical absolute roots and a bounded request ID");
20
+ const sourceRunId = value("source-run"), findingIds = options.get("finding");
21
+ if (sourceRunId !== undefined && !/^RUN-[0-9]+(?:-[a-z0-9][a-z0-9-]*)?$/.test(sourceRunId))
22
+ refuse("--source-run must identify one diagnostic RUN");
23
+ if (Boolean(sourceRunId) !== Boolean(findingIds) || findingIds && (!findingIds.length || findingIds.length > 4096
24
+ || findingIds.some(id => !id.trim() || id.length > 256 || /[\r\n\0]/.test(id)) || new Set(findingIds).size !== findingIds.length))
25
+ refuse("Select one --source-run with unique explicit --finding IDs, or omit both on replay");
26
+ if (options.has("detach") && options.has("prepare-only"))
27
+ refuse("--detach and --prepare-only are exclusive");
28
+ const gitRoute = value("git-route"), integrationBranch = value("integration-branch");
29
+ if (Boolean(gitRoute) !== Boolean(integrationBranch))
30
+ refuse("--git-route and --integration-branch must be supplied together");
31
+ const gitPolicy = gitRoute ? { route: gitRoute, integrationBranch: integrationBranch } : undefined;
32
+ const selected = prepareFlowExecutionSelectors(options, memoryFixStages);
33
+ if (selected.profileFile !== undefined && !path.isAbsolute(selected.profileFile))
34
+ refuse("--profile-file must be absolute");
35
+ return { scope: { projectRoot, requestId }, workspaceRoot, sourceRunId, findingIds: findingIds ? [...findingIds] : undefined,
36
+ ...selected, gitPolicy, intakeFile: value("intake-file"), detach: options.has("detach"), prepareOnly: options.has("prepare-only"),
37
+ nonInteractive: options.has("non-interactive") };
38
+ }
39
+ /** Supplied selectors compare with original raw intent, never current aliases,
40
+ * defaults or an inferred equivalent model. Omitted selectors remain pinned. */
41
+ export function assertMemoryFixInvocationReplay(invocation, original, intakeText) {
42
+ if (hybridDigest(invocation.scope) !== hybridDigest(original.scope)
43
+ || invocation.workspaceRoot !== undefined && invocation.workspaceRoot !== original.execution.scope.workspace
44
+ || invocation.sourceRunId !== undefined && invocation.sourceRunId !== original.source_run_id
45
+ || invocation.findingIds !== undefined && hybridDigest(invocation.findingIds) !== hybridDigest(original.finding_ids)
46
+ || invocation.gitPolicy !== undefined && hybridDigest(invocation.gitPolicy) !== hybridDigest(original.git_policy)
47
+ || invocation.intakeFile !== undefined && intakeText !== original.request_text
48
+ || Object.entries(invocation.execution).some(([key, value]) => !original.launch_selection
49
+ || !Object.hasOwn(original.launch_selection, key)
50
+ || hybridDigest(value) !== hybridDigest(original.launch_selection[key])))
51
+ throw new AppError("memory_fix_request_conflict", "Repair request belongs to different original launch inputs", 2, { effect: "no_effect", next_action: "replay_exact_request_or_choose_new_id" });
52
+ }
@@ -0,0 +1,100 @@
1
+ import { createContext } from "../runtime/context.js";
2
+ import { AppError, errorRecord } from "../shared/errors.js";
3
+ import { resolveDdFlowHome, resolveProjectRoot } from "../storage/paths.js";
4
+ import { readMemoryFixRequest, retainMemoryFixRequest, startMemoryFixRun } from "../services/memory-fix-request.js";
5
+ import { readDiagnosticRepairIntake } from "../services/diagnostic-repair-intake.js";
6
+ import { prepareMemoryFixWorkspace } from "../services/memory-fix-workspace.js";
7
+ import { readSetupStatus } from "../services/setup.js";
8
+ import { PreparedInstalledFlowSource } from "../services/installed-flow-source.js";
9
+ import { selectMemoryInitInstalledEngine } from "../services/memory-init-engine-release.js";
10
+ import { FrozenGenericExecution } from "../services/generic-execution.js";
11
+ import { readOperatorProfiles, readOperatorProfileInput } from "../services/operator-profiles.js";
12
+ import { onboardExecutor } from "../services/executor-onboarding.js";
13
+ import { askExecutorChoice } from "./executor-onboarding.js";
14
+ import { prepareMemoryFixInvocation, assertMemoryFixInvocationReplay } from "./memory-fix-invocation.js";
15
+ import { parseOutputOptions } from "./output-options.js";
16
+ import { prepareTextFile } from "./input-preparation.js";
17
+ import { prepareResponseDestination } from "./response-file.js";
18
+ import { writePreparationError } from "./error-output.js";
19
+ import { launchAndObserveMemoryFlow } from "./memory-init.js";
20
+ import { readFlowRunExecutionBundle } from "../services/runs.js";
21
+ import { hybridDigest } from "../services/hybrid-contracts.js";
22
+ /** Public repair entry uses existing prepared stores: a fresh repair already
23
+ * requires an accepted source diagnostic in this Home. Never initializes a new
24
+ * project/Home, migrates stores or changes global profiles to find that source. */
25
+ export async function runMemoryFixCli(args, env = process.env, io = process) {
26
+ let context, effects = false;
27
+ try {
28
+ const output = parseOutputOptions(args), invocation = prepareMemoryFixInvocation(output.args), home = resolveDdFlowHome(env);
29
+ if (output.responseFile)
30
+ prepareResponseDestination(output.responseFile);
31
+ if (resolveProjectRoot(invocation.scope.projectRoot) !== invocation.scope.projectRoot)
32
+ throw new AppError("usage", "Repair project root must be canonical", 2, { effect: "no_effect" });
33
+ const reader = createContext(env, "read_existing");
34
+ let retained;
35
+ try {
36
+ retained = readMemoryFixRequest(reader, invocation.scope);
37
+ if (!retained) {
38
+ if (!invocation.sourceRunId || !invocation.findingIds)
39
+ throw new AppError("usage", "Fresh repair requires --source-run and explicit --finding IDs", 2, { effect: "no_effect" });
40
+ readDiagnosticRepairIntake(reader, { projectRoot: invocation.scope.projectRoot, sourceRunId: invocation.sourceRunId, findingIds: invocation.findingIds });
41
+ }
42
+ }
43
+ finally {
44
+ reader.db.close?.();
45
+ }
46
+ if (invocation.profileFile)
47
+ invocation.execution.rootProfile = readOperatorProfileInput(invocation.profileFile);
48
+ let objective;
49
+ if (invocation.intakeFile)
50
+ objective = prepareTextFile(invocation.intakeFile, "repair intake", 64 * 1024).text;
51
+ if (retained)
52
+ assertMemoryFixInvocationReplay(invocation, retained, objective);
53
+ else if (!objective?.trim())
54
+ throw new AppError("usage", "Fresh repair requires --intake-file with its original request and constraints", 2, { effect: "no_effect" });
55
+ if (!retained) {
56
+ const installation = readSetupStatus(home).installation;
57
+ if (!installation)
58
+ throw new AppError("memory_fix_setup_required", "Install the desired canon and CLI before repair", 2, { effect: "no_effect" });
59
+ const source = PreparedInstalledFlowSource.fromInstalledRelease(home, installation.manifest_sha256, "mb-fix");
60
+ const engine = selectMemoryInitInstalledEngine(home, installation.manifest_sha256);
61
+ engine.admitMemoryFixFlow(source);
62
+ const settings = readOperatorProfiles(home), selectedRoot = invocation.execution.rootProfile, stdin = io.stdin ?? process.stdin;
63
+ const executor = await onboardExecutor(typeof selectedRoot === "string" ? { profileId: selectedRoot } : selectedRoot ? { profile: selectedRoot } : {}, () => settings, { allowSkip: false, nonInteractive: invocation.nonInteractive || output.json || output.progressJsonl
64
+ || !stdin.isTTY || !io.stderr.isTTY }, profiles => askExecutorChoice(profiles, { stdin, stderr: io.stderr }, { allowSave: false, allowSkip: false }));
65
+ if (!executor.profile)
66
+ throw new AppError("memory_fix_executor_required", "Select a repair executor", 2, { effect: "no_effect" });
67
+ const selection = { ...invocation.execution, rootProfile: selectedRoot ?? executor.profile,
68
+ execution: "managed", stageSessionMode: "new_session", delegation: invocation.execution.delegation ?? { mode: "external", max_parallel: 1 } };
69
+ const preview = FrozenGenericExecution.prepare(source.resolveRegisteredFlow(), settings, selection, { ...invocation.scope, workspace: invocation.workspaceRoot ?? invocation.scope.projectRoot });
70
+ context = createContext(env, "prepared_existing", undefined, { resourceDatabaseMode: "prepared_existing" });
71
+ effects = true;
72
+ const workspace = await prepareMemoryFixWorkspace(context, { ...invocation.scope,
73
+ ...(invocation.workspaceRoot ? { workspaceRoot: invocation.workspaceRoot } : {}), ...(invocation.gitPolicy ? { gitPolicy: invocation.gitPolicy } : {}),
74
+ selectionSha256: hybridDigest({ objective, source_run: invocation.sourceRunId, finding_ids: invocation.findingIds,
75
+ raw: invocation.execution, profiles: preview.snapshot().profiles, settings: preview.settings,
76
+ source_sha256: source.sha256, engine_manifest_sha256: engine.manifestSha256 }) });
77
+ const execution = FrozenGenericExecution.prepare(source.resolveRegisteredFlow(), settings, selection, { ...invocation.scope, workspace: workspace.workspaceRoot });
78
+ retainMemoryFixRequest(context, { source, execution, engine, boundAt: context.now(), requestText: objective, sourceRunId: invocation.sourceRunId,
79
+ findingIds: invocation.findingIds, gitExecutable: workspace.gitExecutable, gitPolicy: workspace.gitPolicy }, invocation.execution);
80
+ }
81
+ else
82
+ context = createContext(env, "prepared_existing", undefined, { resourceDatabaseMode: "prepared_existing" });
83
+ effects = true;
84
+ const started = startMemoryFixRun(context, invocation.scope), bundle = readFlowRunExecutionBundle(context, { projectRoot: invocation.scope.projectRoot, runId: started.runId });
85
+ if (!bundle || bundle.manifest.flow_id !== "mb-fix")
86
+ throw new AppError("memory_fix_bundle_missing", "Restore the retained repair bundle", 1, { effect: "committed" });
87
+ return await launchAndObserveMemoryFlow(context, { scope: { ...invocation.scope, workspaceRoot: bundle.execution.snapshot().scope.workspace },
88
+ prepareOnly: invocation.prepareOnly, detach: invocation.detach }, started, "mb-fix", output, env, io);
89
+ }
90
+ catch (error) {
91
+ const record = errorRecord(error);
92
+ if (effects)
93
+ record.details = { ...record.details, effect: ["unknown", "committed", "partial"].includes(String(record.details.effect)) ? record.details.effect : "partial", next_action: "reconcile_exact_request" };
94
+ writePreparationError(io, args, record);
95
+ return record.exitCode;
96
+ }
97
+ finally {
98
+ context?.db.close?.();
99
+ }
100
+ }