@deksden-com/dd-flow-cli 0.9.0-beta.14 → 0.9.0-beta.140

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 (493) hide show
  1. package/CHANGELOG.md +733 -0
  2. package/README.md +143 -1
  3. package/dist/build-info.json +8 -8
  4. package/dist/cli/argument-values.js +38 -0
  5. package/dist/cli/command-inputs.js +376 -0
  6. package/dist/cli/command-metadata.js +197 -0
  7. package/dist/cli/command-option-descriptions.js +191 -0
  8. package/dist/cli/completion-cli.js +70 -0
  9. package/dist/cli/completion.js +57 -0
  10. package/dist/cli/error-output.js +52 -0
  11. package/dist/cli/executor-onboarding.js +76 -0
  12. package/dist/cli/flows.js +29 -0
  13. package/dist/cli/harnesses.js +84 -0
  14. package/dist/cli/help.js +328 -18
  15. package/dist/cli/hook-ingress.js +78 -0
  16. package/dist/cli/input-preparation.js +165 -0
  17. package/dist/cli/memory-flow-admission.js +44 -0
  18. package/dist/cli/memory-init-invocation.js +78 -0
  19. package/dist/cli/memory-init.js +240 -0
  20. package/dist/cli/memory-storage-admission.js +53 -0
  21. package/dist/cli/models.js +39 -0
  22. package/dist/cli/native-hook-ingress.js +80 -0
  23. package/dist/cli/operator-profiles.js +61 -0
  24. package/dist/cli/output-options.js +35 -0
  25. package/dist/cli/response-file.js +71 -0
  26. package/dist/cli/run-cli.js +1689 -545
  27. package/dist/cli/runtime-maintenance-diagnostics.js +46 -0
  28. package/dist/cli/runtime-maintenance-ingress.js +52 -0
  29. package/dist/cli/runtime-process.js +153 -0
  30. package/dist/cli/setup.js +149 -0
  31. package/dist/cli.js +71 -2
  32. package/dist/domain/stage-catalog.js +1 -1
  33. package/dist/domain/stage-handler-identities.js +20 -0
  34. package/dist/harness-runtime/DD-ZCODE.md +112 -0
  35. package/dist/harness-runtime/OPENCODE-LICENSE.txt +24 -0
  36. package/dist/harness-runtime/bin/dd-agy.mjs +56 -0
  37. package/dist/harness-runtime/bin/dd-codex.mjs +27 -0
  38. package/dist/harness-runtime/bin/dd-droid.mjs +34 -0
  39. package/dist/harness-runtime/bin/dd-grok.mjs +40 -0
  40. package/dist/harness-runtime/bin/dd-opencode.mjs +22 -0
  41. package/dist/harness-runtime/bin/dd-zcode.mjs +87 -0
  42. package/dist/harness-runtime/lib/adapter-timeouts.d.mts +5 -0
  43. package/dist/harness-runtime/lib/adapter-timeouts.mjs +34 -0
  44. package/dist/harness-runtime/lib/agy-hooks.d.mts +1 -0
  45. package/dist/harness-runtime/lib/agy-hooks.mjs +9 -0
  46. package/dist/harness-runtime/lib/daemon-observation.d.mts +2 -0
  47. package/dist/harness-runtime/lib/daemon-observation.mjs +163 -0
  48. package/dist/harness-runtime/lib/daemon-operations.d.mts +1 -0
  49. package/dist/harness-runtime/lib/daemon-operations.mjs +371 -0
  50. package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +6 -0
  51. package/dist/harness-runtime/lib/dd-agy-daemon.mjs +724 -0
  52. package/dist/harness-runtime/lib/dd-agy.mjs +70 -0
  53. package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
  54. package/dist/harness-runtime/lib/dd-codex-daemon.mjs +196 -0
  55. package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
  56. package/dist/harness-runtime/lib/dd-codex.mjs +817 -0
  57. package/dist/harness-runtime/lib/dd-droid-daemon.mjs +129 -0
  58. package/dist/harness-runtime/lib/dd-droid.mjs +584 -0
  59. package/dist/harness-runtime/lib/dd-grok-daemon.mjs +498 -0
  60. package/dist/harness-runtime/lib/dd-grok.mjs +177 -0
  61. package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +507 -0
  62. package/dist/harness-runtime/lib/dd-opencode.mjs +354 -0
  63. package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +750 -0
  64. package/dist/harness-runtime/lib/dd-zcode.mjs +1145 -0
  65. package/dist/harness-runtime/lib/delegation-instructions.d.mts +14 -0
  66. package/dist/harness-runtime/lib/delegation-instructions.mjs +157 -0
  67. package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
  68. package/dist/harness-runtime/lib/driver-recovery.mjs +139 -0
  69. package/dist/harness-runtime/lib/droid-observation.mjs +66 -0
  70. package/dist/harness-runtime/lib/lease-renewal.d.mts +8 -0
  71. package/dist/harness-runtime/lib/lease-renewal.mjs +37 -0
  72. package/dist/harness-runtime/lib/lifecycle-command.d.mts +20 -0
  73. package/dist/harness-runtime/lib/lifecycle-command.mjs +273 -0
  74. package/dist/harness-runtime/lib/lifecycle-contract.d.mts +10 -0
  75. package/dist/harness-runtime/lib/lifecycle-contract.mjs +19 -0
  76. package/dist/harness-runtime/lib/managed-daemon.d.mts +13 -0
  77. package/dist/harness-runtime/lib/managed-daemon.mjs +654 -0
  78. package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
  79. package/dist/harness-runtime/lib/model-observations.mjs +101 -0
  80. package/dist/harness-runtime/lib/native-children.d.mts +16 -0
  81. package/dist/harness-runtime/lib/native-children.mjs +113 -0
  82. package/dist/harness-runtime/lib/native-hook-command.d.mts +7 -0
  83. package/dist/harness-runtime/lib/native-hook-command.mjs +251 -0
  84. package/dist/harness-runtime/lib/native-request-proof.d.mts +2 -0
  85. package/dist/harness-runtime/lib/native-request-proof.mjs +65 -0
  86. package/dist/harness-runtime/lib/native-streams.mjs +45 -0
  87. package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
  88. package/dist/harness-runtime/lib/observation-clock.mjs +92 -0
  89. package/dist/harness-runtime/lib/opencode-plugin.mjs +85 -0
  90. package/dist/harness-runtime/lib/operation-context.mjs +5 -0
  91. package/dist/harness-runtime/lib/operation-errors.d.mts +14 -0
  92. package/dist/harness-runtime/lib/operation-errors.mjs +116 -0
  93. package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
  94. package/dist/harness-runtime/lib/operation-progress.mjs +114 -0
  95. package/dist/harness-runtime/lib/process-json.d.mts +5 -0
  96. package/dist/harness-runtime/lib/process-json.mjs +201 -0
  97. package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
  98. package/dist/harness-runtime/lib/provider-overload-policy.d.mts +13 -0
  99. package/dist/harness-runtime/lib/provider-overload-policy.mjs +138 -0
  100. package/dist/harness-runtime/lib/runner-events.mjs +200 -0
  101. package/dist/harness-runtime/lib/runner-lock.mjs +42 -0
  102. package/dist/harness-runtime/lib/session-settlement.mjs +30 -0
  103. package/dist/harness-runtime/lib/setup-progress.d.mts +9 -0
  104. package/dist/harness-runtime/lib/setup-progress.mjs +51 -0
  105. package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
  106. package/dist/harness-runtime/lib/tool-observations.mjs +228 -0
  107. package/dist/harness-runtime/lib/zcode-usage.mjs +55 -0
  108. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-1y4a697q.js +81 -0
  109. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-2ny4vxct.js +92 -0
  110. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-6mptkzbc.js +0 -0
  111. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-7x67cf1q.js +52 -0
  112. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9rqn6x4v.js +16 -0
  113. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9vdz0zwn.js +1661 -0
  114. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ecs5ftka.js +1466 -0
  115. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-frbwqjmf.js +145 -0
  116. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gne7h7mq.js +50 -0
  117. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gx9wnkzr.js +105 -0
  118. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-m2eywc8w.js +0 -0
  119. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-nwcpakzx.js +12 -0
  120. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-q4g3afnw.js +623 -0
  121. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-qav6mfdz.js +0 -0
  122. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-sxt88q69.js +12 -0
  123. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-t1xa31vm.js +39 -0
  124. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ve4aws36.js +103 -0
  125. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vmytr4q8.js +4 -0
  126. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vt9jbch8.js +36 -0
  127. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vyas3vgt.js +0 -0
  128. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-wjyeq25y.js +30 -0
  129. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-xgnj2w4v.js +20 -0
  130. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-y2etg5bs.js +9 -0
  131. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ydhz1zrh.js +238 -0
  132. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-z6qdwcsf.js +62 -0
  133. package/dist/harness-runtime/vendor/opencode-client/contract.d.ts +1 -0
  134. package/dist/harness-runtime/vendor/opencode-client/contract.js +12 -0
  135. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.d.ts +2806 -0
  136. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.js +0 -0
  137. package/dist/harness-runtime/vendor/opencode-client/effect/api.d.ts +4 -0
  138. package/dist/harness-runtime/vendor/opencode-client/effect/api.js +0 -0
  139. package/dist/harness-runtime/vendor/opencode-client/effect/client.d.ts +2530 -0
  140. package/dist/harness-runtime/vendor/opencode-client/effect/client.js +15 -0
  141. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.d.ts +7 -0
  142. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.js +6 -0
  143. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.d.ts +2529 -0
  144. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.js +8 -0
  145. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.d.ts +2 -0
  146. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.js +12 -0
  147. package/dist/harness-runtime/vendor/opencode-client/effect/index.d.ts +35 -0
  148. package/dist/harness-runtime/vendor/opencode-client/effect/index.js +75 -0
  149. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.d.ts +20 -0
  150. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.js +11 -0
  151. package/dist/harness-runtime/vendor/opencode-client/effect/service.d.ts +90 -0
  152. package/dist/harness-runtime/vendor/opencode-client/effect/service.js +187 -0
  153. package/dist/harness-runtime/vendor/opencode-client/package.json +84 -0
  154. package/dist/harness-runtime/vendor/opencode-client/promise/api.d.ts +21 -0
  155. package/dist/harness-runtime/vendor/opencode-client/promise/api.js +0 -0
  156. package/dist/harness-runtime/vendor/opencode-client/promise/client.d.ts +252 -0
  157. package/dist/harness-runtime/vendor/opencode-client/promise/client.js +14 -0
  158. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.d.ts +8 -0
  159. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.js +6 -0
  160. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.d.ts +259 -0
  161. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.js +7 -0
  162. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.d.ts +3 -0
  163. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.js +79 -0
  164. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.d.ts +8932 -0
  165. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.js +70 -0
  166. package/dist/harness-runtime/vendor/opencode-client/promise/index.d.ts +6 -0
  167. package/dist/harness-runtime/vendor/opencode-client/promise/index.js +83 -0
  168. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.d.ts +32 -0
  169. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.js +7 -0
  170. package/dist/harness-runtime/vendor/opencode-client/promise/service.d.ts +24 -0
  171. package/dist/harness-runtime/vendor/opencode-client/promise/service.js +187 -0
  172. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.d.ts +12 -0
  173. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.js +14 -0
  174. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.d.ts +20 -0
  175. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.js +14 -0
  176. package/dist/harness-runtime/vendor/opencode-client/service-contender.d.ts +37 -0
  177. package/dist/harness-runtime/vendor/opencode-client/service-contender.js +10 -0
  178. package/dist/harness-runtime/vendor/opencode-client/service-probe.d.ts +70 -0
  179. package/dist/harness-runtime/vendor/opencode-client/service-probe.js +16 -0
  180. package/dist/harness-runtime/vendor/opencode-client/service-timing.d.ts +12 -0
  181. package/dist/harness-runtime/vendor/opencode-client/service-timing.js +10 -0
  182. package/dist/harness-runtime/vendor/opencode-client/service-version.d.ts +2 -0
  183. package/dist/harness-runtime/vendor/opencode-client/service-version.js +6 -0
  184. package/dist/harness-runtime/vendor/opencode-client/service.d.ts +52 -0
  185. package/dist/harness-runtime/vendor/opencode-client/service.js +1 -0
  186. package/dist/harness-runtime/vendor/opencode-client/shared-events.d.ts +11 -0
  187. package/dist/harness-runtime/vendor/opencode-client/shared-events.js +8 -0
  188. package/dist/harness-runtime/vendor/opencode-client/solid/connection.d.ts +37 -0
  189. package/dist/harness-runtime/vendor/opencode-client/solid/connection.js +10 -0
  190. package/dist/harness-runtime/vendor/opencode-client/solid/data.d.ts +211 -0
  191. package/dist/harness-runtime/vendor/opencode-client/solid/data.js +18 -0
  192. package/dist/harness-runtime/vendor/opencode-client/solid/index.d.ts +3 -0
  193. package/dist/harness-runtime/vendor/opencode-client/solid/index.js +32 -0
  194. package/dist/harness-runtime/vendor/opencode-client/solid/pty.d.ts +22 -0
  195. package/dist/harness-runtime/vendor/opencode-client/solid/pty.js +8 -0
  196. package/dist/harness-runtime/vendor/opencode-plugin.mjs +3 -0
  197. package/dist/protocol/local-files.js +18 -9
  198. package/dist/runtime/context.js +8 -4
  199. package/dist/schemas/agent-profile.schema.json +1 -1
  200. package/dist/schemas/code-review-result.schema.json +1 -1
  201. package/dist/schemas/code-verification.schema.json +7 -5
  202. package/dist/schemas/code-work-batch.schema.json +2 -2
  203. package/dist/schemas/discovery-result.schema.json +184 -0
  204. package/dist/schemas/execution-bundle.schema.json +205 -0
  205. package/dist/schemas/execution-settings.schema.json +162 -0
  206. package/dist/schemas/flow-descriptor.schema.json +54 -0
  207. package/dist/schemas/flow-run.schema.json +28 -0
  208. package/dist/schemas/harness-catalog.schema.json +80 -0
  209. package/dist/schemas/mb-init-compose-result.schema.json +457 -0
  210. package/dist/schemas/mb-init-discover-result.schema.json +500 -0
  211. package/dist/schemas/mb-init-finish-result.schema.json +422 -0
  212. package/dist/schemas/mb-init-preflight-result.schema.json +367 -0
  213. package/dist/schemas/mb-init-review-result.schema.json +396 -0
  214. package/dist/schemas/mb-init-verify-result.schema.json +391 -0
  215. package/dist/schemas/memory-bootstrap-receipt-v2.schema.json +67 -0
  216. package/dist/schemas/memory-bootstrap-receipt.schema.json +354 -0
  217. package/dist/schemas/memory-composition-work-result.schema.json +38 -0
  218. package/dist/schemas/memory-repair-work-result.schema.json +49 -0
  219. package/dist/schemas/memory-review-correction-plan.schema.json +30 -0
  220. package/dist/schemas/memory-review-work-result.schema.json +43 -0
  221. package/dist/schemas/model-catalog.schema.json +153 -0
  222. package/dist/schemas/plan-review-decision.schema.json +3 -3
  223. package/dist/schemas/plan-review-result.schema.json +2 -2
  224. package/dist/schemas/profile-settings.schema.json +122 -0
  225. package/dist/schemas/release-manifest.schema.json +291 -0
  226. package/dist/schemas/run-control-receipt.schema.json +118 -0
  227. package/dist/schemas/run-control-request.schema.json +36 -0
  228. package/dist/schemas/run-engine-binding.schema.json +1 -1
  229. package/dist/schemas/vnext-protocol-plan.schema.json +2 -2
  230. package/dist/services/branch-context.js +3 -3
  231. package/dist/services/canon.js +11 -8
  232. package/dist/services/check-runner-evidence.js +168 -0
  233. package/dist/services/cleanup.js +133 -40
  234. package/dist/services/cli-operation-classifier.js +25 -62
  235. package/dist/services/cli-upgrade-allowlist.js +27 -0
  236. package/dist/services/code-checks.js +1156 -107
  237. package/dist/services/codex-hook-delivery.js +32 -0
  238. package/dist/services/command-context.js +80 -0
  239. package/dist/services/compatibility-preflight.js +13 -3
  240. package/dist/services/config.js +11 -8
  241. package/dist/services/continuation-outcome.js +20 -0
  242. package/dist/services/controller-child-capacity.js +13 -0
  243. package/dist/services/controller-child-observer.js +115 -0
  244. package/dist/services/controller-execution.js +88 -0
  245. package/dist/services/controller-fanout.js +202 -0
  246. package/dist/services/dashboard.js +143 -58
  247. package/dist/services/descriptor-coordinator-session.js +35 -0
  248. package/dist/services/descriptor-root-work.js +53 -0
  249. package/dist/services/descriptor-run-settlement.js +105 -0
  250. package/dist/services/descriptor-run-start.js +449 -0
  251. package/dist/services/descriptor-stage-coordinator.js +197 -0
  252. package/dist/services/descriptor-stage-settlement.js +222 -0
  253. package/dist/services/descriptor-stage-start.js +139 -0
  254. package/dist/services/discovery/agy-discovery.js +2 -0
  255. package/dist/services/discovery/codex-discovery.js +2 -0
  256. package/dist/services/discovery/droid-discovery.js +2 -0
  257. package/dist/services/discovery/grok-discovery.js +2 -0
  258. package/dist/services/discovery/opencode-discovery.js +2 -0
  259. package/dist/services/discovery/static.js +31 -0
  260. package/dist/services/discovery/zcode-discovery.js +2 -0
  261. package/dist/services/engines.js +294 -153
  262. package/dist/services/eval-snapshots.js +1215 -116
  263. package/dist/services/execution-bundles.js +263 -0
  264. package/dist/services/execution-policy.js +185 -0
  265. package/dist/services/executor-onboarding.js +56 -0
  266. package/dist/services/external-work-launch.js +308 -0
  267. package/dist/services/flow-catalog.js +21 -0
  268. package/dist/services/flow-descriptors.js +82 -0
  269. package/dist/services/frozen-engine.js +250 -0
  270. package/dist/services/generic-execution.js +164 -0
  271. package/dist/services/harness-adapter.js +355 -36
  272. package/dist/services/harness-config.js +2 -0
  273. package/dist/services/harness-discovery.js +29 -0
  274. package/dist/services/harness-doctor.js +75 -0
  275. package/dist/services/harness-probe-effects.js +51 -0
  276. package/dist/services/harness-version-probe.js +100 -0
  277. package/dist/services/hooks.js +771 -325
  278. package/dist/services/hybrid-contracts.js +483 -0
  279. package/dist/services/ids.js +29 -1
  280. package/dist/services/installation-lock.js +95 -0
  281. package/dist/services/installed-flow-source.js +183 -0
  282. package/dist/services/lanes.js +78 -65
  283. package/dist/services/lifecycle-command.js +1 -288
  284. package/dist/services/lifecycle-contract.js +1 -0
  285. package/dist/services/lifecycle-invocations.js +2007 -0
  286. package/dist/services/managed-daemon-binding.js +38 -0
  287. package/dist/services/managed-lease-monitor.js +133 -0
  288. package/dist/services/managed-processes.js +475 -55
  289. package/dist/services/memory-accepted-composition.js +77 -0
  290. package/dist/services/memory-baseline-preservation.js +65 -0
  291. package/dist/services/memory-completed-correction-wave.js +320 -0
  292. package/dist/services/memory-compose-handler.js +258 -0
  293. package/dist/services/memory-composition-acceptance.js +199 -0
  294. package/dist/services/memory-composition-graph.js +134 -0
  295. package/dist/services/memory-composition-registration.js +146 -0
  296. package/dist/services/memory-composition-work-custody.js +151 -0
  297. package/dist/services/memory-composition-work-results.js +96 -0
  298. package/dist/services/memory-corrected-review-acceptance.js +129 -0
  299. package/dist/services/memory-corrected-review-batch.js +30 -0
  300. package/dist/services/memory-corrected-review-findings.js +106 -0
  301. package/dist/services/memory-corrected-review-inputs.js +210 -0
  302. package/dist/services/memory-corrected-review-projection.js +78 -0
  303. package/dist/services/memory-corrected-review-receipt.js +170 -0
  304. package/dist/services/memory-corrected-review-registration.js +191 -0
  305. package/dist/services/memory-correction-check-receipt.js +219 -0
  306. package/dist/services/memory-correction-input-owner.js +6 -0
  307. package/dist/services/memory-discover-handler.js +104 -0
  308. package/dist/services/memory-finish-evidence.js +435 -0
  309. package/dist/services/memory-finish-handler.js +215 -0
  310. package/dist/services/memory-finish-integration.js +280 -0
  311. package/dist/services/memory-finish-readiness.js +122 -0
  312. package/dist/services/memory-git-integration.js +151 -0
  313. package/dist/services/memory-historical-corrected-review.js +206 -0
  314. package/dist/services/memory-historical-original-review.js +130 -0
  315. package/dist/services/memory-historical-repair-registration.js +99 -0
  316. package/dist/services/memory-historical-second-review.js +128 -0
  317. package/dist/services/memory-init-bootstrap-readiness.js +210 -0
  318. package/dist/services/memory-init-contexts.js +89 -0
  319. package/dist/services/memory-init-controller-start.js +84 -0
  320. package/dist/services/memory-init-engine-release.js +223 -0
  321. package/dist/services/memory-init-git-policy.js +136 -0
  322. package/dist/services/memory-init-lint-capability.js +185 -0
  323. package/dist/services/memory-init-native-capacity.js +296 -0
  324. package/dist/services/memory-init-preflight.js +330 -0
  325. package/dist/services/memory-init-project-bootstrap.js +599 -0
  326. package/dist/services/memory-init-request-candidate.js +157 -0
  327. package/dist/services/memory-init-request-input.js +66 -0
  328. package/dist/services/memory-init-resource-storage.js +125 -0
  329. package/dist/services/memory-init-run-allocation.js +81 -0
  330. package/dist/services/memory-init-run-bundle.js +98 -0
  331. package/dist/services/memory-init-start.js +181 -0
  332. package/dist/services/memory-init-startup-custody.js +80 -0
  333. package/dist/services/memory-init-startup-input.js +240 -0
  334. package/dist/services/memory-init-storage.js +81 -0
  335. package/dist/services/memory-init-stores.js +359 -0
  336. package/dist/services/memory-init-worktrunk-capability.js +178 -0
  337. package/dist/services/memory-layer-publication.js +611 -0
  338. package/dist/services/memory-layer.js +156 -0
  339. package/dist/services/memory-lint-config.js +85 -0
  340. package/dist/services/memory-native-review-copy.js +165 -0
  341. package/dist/services/memory-normal-flow-entry.js +75 -0
  342. package/dist/services/memory-ordinary-defaults.js +112 -0
  343. package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
  344. package/dist/services/memory-preflight-handler.js +259 -0
  345. package/dist/services/memory-repair-current-view.js +299 -0
  346. package/dist/services/memory-repair-document-delta.js +451 -0
  347. package/dist/services/memory-repair-history.js +491 -0
  348. package/dist/services/memory-repair-physical-binding.js +312 -0
  349. package/dist/services/memory-repair-publication-files.js +152 -0
  350. package/dist/services/memory-repair-publication-intent.js +27 -0
  351. package/dist/services/memory-repair-publication-plan.js +160 -0
  352. package/dist/services/memory-repair-publication-source.js +225 -0
  353. package/dist/services/memory-repair-publication.js +794 -0
  354. package/dist/services/memory-repair-registration.js +239 -0
  355. package/dist/services/memory-repair-work-baseline.js +413 -0
  356. package/dist/services/memory-repair-work-completion.js +97 -0
  357. package/dist/services/memory-repair-work-custody.js +73 -0
  358. package/dist/services/memory-repair-work-results.js +89 -0
  359. package/dist/services/memory-repair-workspace.js +252 -0
  360. package/dist/services/memory-repair-writer-copy.js +735 -0
  361. package/dist/services/memory-result-binding.js +173 -0
  362. package/dist/services/memory-retained-review-authority.js +129 -0
  363. package/dist/services/memory-retained-review-results.js +70 -0
  364. package/dist/services/memory-retained-second-baseline.js +102 -0
  365. package/dist/services/memory-retained-second-repairs.js +156 -0
  366. package/dist/services/memory-review-acceptance.js +214 -0
  367. package/dist/services/memory-review-correction-plan.js +171 -0
  368. package/dist/services/memory-review-handler.js +585 -0
  369. package/dist/services/memory-review-inputs.js +200 -0
  370. package/dist/services/memory-review-receipt.js +180 -0
  371. package/dist/services/memory-review-registration.js +108 -0
  372. package/dist/services/memory-review-work-custody.js +124 -0
  373. package/dist/services/memory-review-work-input.js +72 -0
  374. package/dist/services/memory-review-work-results.js +73 -0
  375. package/dist/services/memory-second-corrected-review-inputs.js +165 -0
  376. package/dist/services/memory-second-correction-plan.js +76 -0
  377. package/dist/services/memory-second-repair-baseline.js +91 -0
  378. package/dist/services/memory-second-repair-launch.js +614 -0
  379. package/dist/services/memory-second-repair-registration.js +88 -0
  380. package/dist/services/memory-second-repair-source.js +187 -0
  381. package/dist/services/memory-second-review-acceptance.js +115 -0
  382. package/dist/services/memory-source-observations.js +117 -0
  383. package/dist/services/memory-stage-dispatch.js +28 -0
  384. package/dist/services/memory-stage-results.js +199 -0
  385. package/dist/services/memory-verification-acceptance.js +135 -0
  386. package/dist/services/memory-verification-checks.js +252 -0
  387. package/dist/services/memory-verification-receipt.js +159 -0
  388. package/dist/services/memory-verify-handler.js +135 -0
  389. package/dist/services/memory-work-result-preparation.js +63 -0
  390. package/dist/services/merge-queue.js +228 -149
  391. package/dist/services/merge-server.js +161 -35
  392. package/dist/services/migrations.js +37 -16
  393. package/dist/services/model-catalog.js +109 -0
  394. package/dist/services/model-discovery.js +46 -0
  395. package/dist/services/native-daemon-history.js +49 -0
  396. package/dist/services/native-session-control.js +39 -0
  397. package/dist/services/operator-profiles.js +236 -0
  398. package/dist/services/plan-runtime.js +26 -11
  399. package/dist/services/plans.js +28 -25
  400. package/dist/services/projects.js +37 -17
  401. package/dist/services/prompts.js +28 -17
  402. package/dist/services/protocols.js +163 -87
  403. package/dist/services/provider-capacity.js +385 -0
  404. package/dist/services/recovery-observation-budget.js +121 -0
  405. package/dist/services/recovery-snapshot-database.js +560 -0
  406. package/dist/services/release-archive-producer.js +52 -0
  407. package/dist/services/release-archive.js +143 -0
  408. package/dist/services/release-cache.js +142 -0
  409. package/dist/services/release-compatibility.js +18 -0
  410. package/dist/services/release-download.js +67 -0
  411. package/dist/services/release-envelope.js +104 -0
  412. package/dist/services/release-manifest.js +45 -0
  413. package/dist/services/release-payload.js +114 -0
  414. package/dist/services/release-producer.js +63 -0
  415. package/dist/services/release-provenance.js +160 -0
  416. package/dist/services/release-registry.js +66 -0
  417. package/dist/services/release-source.js +194 -0
  418. package/dist/services/repair-intents.js +42 -0
  419. package/dist/services/review-copy.js +165 -0
  420. package/dist/services/review-deferral.js +23 -0
  421. package/dist/services/run-control-receipt.js +56 -0
  422. package/dist/services/run-control-worker.js +411 -0
  423. package/dist/services/run-control.js +1056 -0
  424. package/dist/services/run-controller-adapter.js +399 -0
  425. package/dist/services/run-controller-capture.js +186 -0
  426. package/dist/services/run-controller-process.js +208 -0
  427. package/dist/services/run-controller-recovery.js +289 -0
  428. package/dist/services/run-controller-state.js +97 -0
  429. package/dist/services/run-controller.js +1205 -0
  430. package/dist/services/run-engine-bindings.js +1 -1
  431. package/dist/services/run-fork.js +147 -0
  432. package/dist/services/run-health.js +149 -0
  433. package/dist/services/run-observations.js +152 -0
  434. package/dist/services/run-projection.js +22 -64
  435. package/dist/services/run-recovery-guard.js +77 -0
  436. package/dist/services/run-recovery-runtime.js +112 -0
  437. package/dist/services/run-recovery.js +489 -0
  438. package/dist/services/run-start-custody.js +177 -0
  439. package/dist/services/runs.js +1019 -247
  440. package/dist/services/runtime-budget.js +430 -0
  441. package/dist/services/runtime-command.js +43 -0
  442. package/dist/services/runtime-scope-capture.js +52 -0
  443. package/dist/services/runtime-scope-control.js +468 -0
  444. package/dist/services/runtime-scope-resume.js +599 -0
  445. package/dist/services/runtime-scope-stop.js +210 -0
  446. package/dist/services/runtime-scope-worker.js +287 -0
  447. package/dist/services/runtime-service.js +96 -0
  448. package/dist/services/schema-validation.js +10 -8
  449. package/dist/services/scope-writer-cleanup.js +27 -0
  450. package/dist/services/sessions.js +35 -69
  451. package/dist/services/setup.js +377 -0
  452. package/dist/services/stage-blocker.js +17 -7
  453. package/dist/services/stage-context.js +193 -19
  454. package/dist/services/stage-handlers.js +74 -0
  455. package/dist/services/stage-lifecycle.js +100 -108
  456. package/dist/services/stage-pause.js +89 -75
  457. package/dist/services/stage-report-renderer.js +234 -6
  458. package/dist/services/stage-work-graph.js +52 -0
  459. package/dist/services/tooling.js +32 -23
  460. package/dist/services/usage.js +49 -101
  461. package/dist/services/verification-matrix.js +374 -0
  462. package/dist/services/vnext-code-review.js +223 -88
  463. package/dist/services/vnext-code.js +327 -226
  464. package/dist/services/vnext-contracts.js +10 -1
  465. package/dist/services/vnext-execution-profile.js +80 -5
  466. package/dist/services/vnext-fanout.js +311 -19
  467. package/dist/services/vnext-merge.js +332 -111
  468. package/dist/services/vnext-plan-review.js +279 -127
  469. package/dist/services/vnext-plan.js +229 -104
  470. package/dist/services/vnext-protocolize.js +411 -86
  471. package/dist/services/vnext-specify.js +119 -81
  472. package/dist/services/vnext-workspace-policy.js +7 -2
  473. package/dist/services/work-registry.js +1627 -199
  474. package/dist/services/workspace-bootstrap.js +52 -15
  475. package/dist/services/workspace-files.js +85 -0
  476. package/dist/services/worktrees.js +98 -44
  477. package/dist/shared/entity-references.js +8 -0
  478. package/dist/shared/errors.js +17 -0
  479. package/dist/storage/agent-output.js +26 -0
  480. package/dist/storage/database.js +891 -39
  481. package/dist/storage/foreign-key-transaction.js +39 -0
  482. package/dist/storage/immutable-input.js +45 -0
  483. package/dist/storage/import-guard.js +102 -0
  484. package/dist/storage/native-cleanup.js +52 -0
  485. package/dist/storage/paths.js +17 -4
  486. package/dist/storage/projection-lock.js +73 -0
  487. package/dist/storage/work-references.js +23 -0
  488. package/dist/storage/writer-contract.js +89 -0
  489. package/dist/storage/writer-migration.js +85 -0
  490. package/package.json +43 -13
  491. package/tools/create-canon-release.mjs +33 -0
  492. package/tools/produce-hybrid-release.mjs +41 -0
  493. package/tools/repair-paused-run-status.mjs +84 -0
@@ -0,0 +1,46 @@
1
+ import { channel } from "node:diagnostics_channel";
2
+ import { AsyncLocalStorage } from "node:async_hooks";
3
+ const requests = new AsyncLocalStorage();
4
+ export function isRuntimeMaintenance(args) {
5
+ return args[0] === "runtime" && args[1] === "process" && ["register", "heartbeat", "confirm", "admission", "finish", "check-admission", "release-turn", "status"].includes(args[2] ?? "");
6
+ }
7
+ export const withMaintenanceDiagnosticScope = (action) => requests.run(Symbol(), action);
8
+ /** Request-local, bounded evidence; never command bytes, paths or lease tokens. */
9
+ export function runtimeMaintenanceDiagnostics(args, deadline, write) {
10
+ const started = performance.now();
11
+ const request = requests.getStore();
12
+ const option = (name) => { const at = args.indexOf(`--${name}`); return at < 0 ? undefined : args[at + 1]; };
13
+ const safe = (value) => typeof value === "string" && /^[A-Za-z0-9:._-]{1,128}$/.test(value) ? value : undefined;
14
+ const identity = { action: safe(args[2]), process_id: safe(option("id")), operation_id: safe(option("operation-id") ?? option("operation")), native_dispatch_started: false };
15
+ let previous = "", count = 0, committed = false;
16
+ const phase = (name, details = {}) => {
17
+ const key = `${details.store_kind ?? ""}:${name}`;
18
+ if (key === previous || count >= 64)
19
+ return;
20
+ previous = key;
21
+ count++;
22
+ write(`${JSON.stringify({ kind: "process_maintenance_phase", ...identity, phase: name, elapsed_ms: Math.round(performance.now() - started), ...(deadline !== undefined ? { remaining_ms: Math.max(0, deadline - Date.now()) } : {}), ...details, ...(["ack", "failed"].includes(name) ? { maintenance_effect: committed ? "committed" : name === "ack" ? "no_mutation_observed" : "unknown" } : {}) })}\n`);
23
+ };
24
+ const timing = channel("dd-flow.sqlite.ingress");
25
+ const log = (message) => {
26
+ if (requests.getStore() !== request)
27
+ return;
28
+ const record = message;
29
+ if (record.phase === "committed" && record.store_kind === "resource")
30
+ committed = true;
31
+ phase(record.phase, { ...(record.store_kind ? { store_kind: record.store_kind } : {}) });
32
+ };
33
+ timing.subscribe(log);
34
+ phase("request", { maintenance_effect: "unknown" });
35
+ return { phase, failure: (error) => {
36
+ let current = error;
37
+ let sqlite;
38
+ for (let depth = 0; current && depth < 8; depth++) {
39
+ sqlite = current.errcode ?? current.sqlite_extended_code ?? current.details?.sqlite_extended_code;
40
+ if (Number.isSafeInteger(sqlite))
41
+ break;
42
+ current = (current.cause ?? current.details?.cause);
43
+ }
44
+ phase("failed", { ...(Number.isSafeInteger(sqlite) ? { sqlite_extended_code: sqlite } : {}) });
45
+ }, close: () => timing.unsubscribe(log) };
46
+ }
@@ -0,0 +1,52 @@
1
+ import { isRuntimeMaintenance, runtimeMaintenanceDiagnostics, withMaintenanceDiagnosticScope } from "./runtime-maintenance-diagnostics.js";
2
+ import { errorRecord, isAppError } from "../shared/errors.js";
3
+ import { writeJson } from "../shared/json.js";
4
+ /** Only the already-selected engine's internal JSON transport takes this path.
5
+ * Operator calls and richer output formats retain the ordinary engine router. */
6
+ export function isRuntimeMaintenanceIngress(args, env) {
7
+ return env.DD_FLOW_ENGINE_MODE === "1" && Number.isFinite(Number(env.DD_FLOW_HOOK_DEADLINE_AT))
8
+ && Number(env.DD_FLOW_HOOK_DEADLINE_AT) > 0 && args.includes("--json")
9
+ && isRuntimeMaintenance(args)
10
+ && !args.some(arg => ["--help", "-h", "--progress-jsonl", "--response-file"].includes(arg) || arg.startsWith("--response-file="));
11
+ }
12
+ export async function runRuntimeMaintenanceIngress(args, env = process.env, io = { stdout: process.stdout, stderr: process.stderr }) {
13
+ return withMaintenanceDiagnosticScope(async () => {
14
+ const deadline = Number(env.DD_FLOW_HOOK_DEADLINE_AT);
15
+ // Publish evidence before loading even the maintenance service graph.
16
+ const diagnostics = runtimeMaintenanceDiagnostics(args, deadline, line => io.stderr.write(line));
17
+ let context;
18
+ try {
19
+ const [{ createContext }, { prepareCommandRoute }, { resolveCommandProjectRoot, resolveCommandPaths }, processCommands, { preflightCliCompatibility }] = await Promise.all([
20
+ import("../runtime/context.js"), import("./command-inputs.js"), import("../services/command-context.js"), import("./runtime-process.js"),
21
+ import("../services/compatibility-preflight.js")
22
+ ]);
23
+ diagnostics.phase("imports_ready");
24
+ const invocation = args.filter(arg => arg !== "--json");
25
+ const options = { databaseDeadlineAt: deadline, resourceDatabaseMode: args[2] === "register" ? "initialize" : args[2] === "status" ? "read_existing" : "prepared_existing" };
26
+ context = createContext({ ...env, DD_FLOW_INVOCATION_READONLY: args[2] === "status" ? "1" : undefined }, "read_existing", undefined, options);
27
+ const root = resolveCommandProjectRoot(context, invocation, null);
28
+ const routedArgs = resolveCommandPaths(context, invocation, root);
29
+ const route = prepareCommandRoute(routedArgs);
30
+ const prepared = processCommands.prepareRuntimeProcess(context, route.key, route.parsed);
31
+ // Preserve the common compatibility gate; this is not a second dispatch
32
+ // implementation or permission granted by the ingress predicate.
33
+ await preflightCliCompatibility(context, routedArgs, env, root);
34
+ const result = await processCommands.dispatchRuntimeProcess(context, args[2], route.parsed, prepared);
35
+ const receipt = result;
36
+ const expiry = receipt?.lease_expires_at ?? receipt?.process?.lease_expires_at;
37
+ diagnostics.phase("ack", { ...(expiry && Number.isFinite(Date.parse(expiry)) ? { lease_expires_at: expiry } : {}) });
38
+ writeJson(io.stdout, result);
39
+ return 0;
40
+ }
41
+ catch (error) {
42
+ diagnostics.failure(error);
43
+ const record = errorRecord(error);
44
+ writeJson(io.stderr, { ok: false, error: { ...record, details: { ...(!isAppError(error) ? { effect: "unknown" } : {}), ...record.details } } });
45
+ return record.exitCode;
46
+ }
47
+ finally {
48
+ context?.db.close?.();
49
+ diagnostics.close();
50
+ }
51
+ });
52
+ }
@@ -0,0 +1,153 @@
1
+ import { AppError } from "../shared/errors.js";
2
+ import { requiredOption, optionalOption, optionalNumber, optionalPositiveNumber } from "./argument-values.js";
3
+ import { prepareError } from "./input-preparation.js";
4
+ import { recoveryGuard, assertRunMutationAllowed } from "../services/run-recovery-guard.js";
5
+ import { recoveryRuntimeAdmission } from "../services/run-recovery-guard.js";
6
+ import { prepareManagedProcessRegistration, prepareManagedProcessConfirmation, prepareManagedProcessHeartbeat, prepareManagedProcessFinish, prepareManagedProcessStopOperation, prepareManagedProcessReconcile, stopManagedProcess, confirmManagedProcess, finishManagedProcess, renewManagedProcess, assertManagedProcessAdmission, managedProcessRuntimeHome, managedProcessStatus, processIsAlive, reconcileExpiredManagedProcesses, registerManagedProcess } from "../services/managed-processes.js";
7
+ import { admitRuntimeCheck, parseRuntimeBudget, reserveProviderTurn, releaseProviderTurns, prepareProviderTurnRelease } from "../services/runtime-budget.js";
8
+ import { managedProcessBinding, resourceHome } from "../services/managed-processes.js";
9
+ function runtimeProcessStopInput(parsed) {
10
+ const graceMs = optionalNumber(parsed, "grace-ms");
11
+ return { id: requiredOption(parsed, "id"), leaseToken: requiredOption(parsed, "lease-token"), ...(graceMs !== undefined ? { graceMs } : {}) };
12
+ }
13
+ function runtimeProcessRegistrationInput(context, parsed) {
14
+ const leaseMs = optionalPositiveNumber(parsed, "lease-ms", true);
15
+ const budget = parseRuntimeBudget(optionalOption(parsed, "budget-json"));
16
+ const kind = requiredOption(parsed, "kind");
17
+ const projectId = optionalOption(parsed, "project-id") ?? null, runId = optionalOption(parsed, "run") ?? null;
18
+ const guard = projectId && runId ? recoveryGuard(context, projectId, runId) : null;
19
+ const run = projectId && runId ? context.db.get("SELECT id FROM runs WHERE project_id = ? AND id = ?", [projectId, runId]) : null;
20
+ return {
21
+ ...(optionalOption(parsed, "id") ? { id: optionalOption(parsed, "id") } : {}), kind, ownerId: requiredOption(parsed, "owner"), uniqueActiveOperation: kind === "eval-observer",
22
+ ...(kind === "eval-observer" ? { pid: optionalPositiveNumber(parsed, "pid", true) ?? 0, ...(optionalPositiveNumber(parsed, "process-group-id", true) ? { processGroupId: optionalPositiveNumber(parsed, "process-group-id", true) } : {}) } : {}),
23
+ ownerPid: optionalPositiveNumber(parsed, "owner-pid", true), projectId, runId,
24
+ workId: optionalOption(parsed, "work") ?? null, checkId: optionalOption(parsed, "check") ?? null,
25
+ operationId: optionalOption(parsed, "operation") ?? null, stdoutPath: optionalOption(parsed, "stdout") ?? null,
26
+ stderrPath: optionalOption(parsed, "stderr") ?? null, ...(leaseMs !== undefined ? { leaseMs } : {}),
27
+ metadata: { ...(budget ? { budget, harness: optionalOption(parsed, "harness") ?? null } : {}), ...(projectId && runId ? { run_generation: guard?.generation ?? 0, run_admitted: Boolean(run) && !["draining", "sealed", "resuming"].includes(guard?.status ?? "") } : {}), ...(optionalOption(parsed, "dispatch-barrier") ? { dispatch_barrier: optionalOption(parsed, "dispatch-barrier") } : {}), ...(optionalOption(parsed, "role") ? { role: optionalOption(parsed, "role") } : {}), ...(optionalOption(parsed, "state-dir") ? { state_dir: optionalOption(parsed, "state-dir") } : {}), ...(optionalOption(parsed, "adapter-executable") ? { adapter_executable: optionalOption(parsed, "adapter-executable") } : {}) }
28
+ };
29
+ }
30
+ function runtimeProcessConfirmationInput(parsed) {
31
+ const leaseMs = optionalPositiveNumber(parsed, "lease-ms", true), processGroupId = optionalPositiveNumber(parsed, "process-group-id", true);
32
+ return { id: requiredOption(parsed, "id"), leaseToken: requiredOption(parsed, "lease-token"), ownerPid: optionalPositiveNumber(parsed, "owner-pid", true), pid: optionalPositiveNumber(parsed, "pid", true) ?? 0, ...(processGroupId !== undefined ? { processGroupId } : {}), ...(leaseMs !== undefined ? { leaseMs } : {}) };
33
+ }
34
+ function runtimeProcessHeartbeatInput(parsed) {
35
+ const leaseMs = optionalPositiveNumber(parsed, "lease-ms", true);
36
+ return { id: requiredOption(parsed, "id"), leaseToken: requiredOption(parsed, "lease-token"), ...(leaseMs !== undefined ? { leaseMs } : {}) };
37
+ }
38
+ function runtimeProcessFinishInput(parsed) {
39
+ const state = requiredOption(parsed, "state");
40
+ if (state !== "stopped" && state !== "failed")
41
+ throw new AppError("validation", "--state must be stopped or failed", 2);
42
+ return { id: requiredOption(parsed, "id"), leaseToken: requiredOption(parsed, "lease-token"), state, reason: optionalOption(parsed, "reason") ?? null };
43
+ }
44
+ export function prepareRuntimeProcess(context, key, parsed) {
45
+ try {
46
+ return prepareRuntimeProcessInput(context, key, parsed);
47
+ }
48
+ catch (error) {
49
+ return prepareError(error);
50
+ }
51
+ }
52
+ function prepareRuntimeProcessInput(context, key, parsed) {
53
+ const prepared = {};
54
+ if (key === "runtime process register") {
55
+ prepareManagedProcessRegistration(context, runtimeProcessRegistrationInput(context, parsed));
56
+ }
57
+ if (key === "runtime process heartbeat")
58
+ prepareManagedProcessHeartbeat(context, runtimeProcessHeartbeatInput(parsed));
59
+ if (key === "runtime process finish")
60
+ prepareManagedProcessFinish(context, runtimeProcessFinishInput(parsed));
61
+ if (key === "runtime process confirm")
62
+ prepareManagedProcessConfirmation(context, runtimeProcessConfirmationInput(parsed));
63
+ if (key === "runtime process stop")
64
+ prepareManagedProcessStopOperation(context, runtimeProcessStopInput(parsed));
65
+ if (key === "runtime process reconcile")
66
+ prepareManagedProcessReconcile(requiredOption(parsed, "owner"), optionalNumber(parsed, "grace-ms"));
67
+ if (key === "runtime process release-turn") {
68
+ prepared.providerTurnRelease = prepareProviderTurnRelease({ daemonId: requiredOption(parsed, "daemon-id"), operationId: optionalOption(parsed, "operation-id"), observationFile: optionalOption(parsed, "observation-file") });
69
+ }
70
+ return prepared;
71
+ }
72
+ export async function dispatchRuntimeProcess(context, action, parsed, prepared = {}) {
73
+ if (action === "check-admission")
74
+ return { ok: true, ...admitRuntimeCheck(context, requiredOption(parsed, "id"), requiredOption(parsed, "lease-token")) };
75
+ if (action === "stop")
76
+ return { ok: true, process: await stopManagedProcess(context, runtimeProcessStopInput(parsed)) };
77
+ if (action === "register") {
78
+ const process = registerManagedProcess(context, runtimeProcessRegistrationInput(context, parsed));
79
+ return { ok: true, process };
80
+ }
81
+ if (action === "confirm")
82
+ return { ok: true, process: confirmManagedProcess(context, runtimeProcessConfirmationInput(parsed)) };
83
+ if (action === "heartbeat") {
84
+ const hash = optionalOption(parsed, "registration-sha256");
85
+ if (hash) {
86
+ const record = managedProcessStatus(context).find(value => value.id === requiredOption(parsed, "id"));
87
+ if (!/^[a-f0-9]{64}$/.test(hash) || !record || managedProcessBinding(record, resourceHome(context)).registration_sha256 !== hash)
88
+ throw new AppError("process_maintenance_receipt_invalid", "Heartbeat registration changed", 1);
89
+ }
90
+ const receipt = renewManagedProcess(context, runtimeProcessHeartbeatInput(parsed));
91
+ return { ...receipt, ok: receipt.owned };
92
+ }
93
+ if (action === "admission") {
94
+ const [{ controllerHitlAdmission }, { assertCapacityOwnerAdmission }] = await Promise.all([import("../services/run-controller-adapter.js"), import("../services/provider-capacity.js")]);
95
+ const record = managedProcessStatus(context).find(process => process.id === requiredOption(parsed, "id"));
96
+ if (!record || record.lease_token !== requiredOption(parsed, "lease-token") || record.owner_id !== requiredOption(parsed, "owner") || record.state !== "running" || !record.pid || !record.pid_started_at || !processIsAlive(record))
97
+ throw new AppError("process_ownership_unknown", "Productive dispatch requires its current confirmed runtime owner", 1);
98
+ assertManagedProcessAdmission(context, record);
99
+ const metadata = JSON.parse(record.metadata_json);
100
+ if (metadata.state_dir !== requiredOption(parsed, "state-dir"))
101
+ throw new AppError("process_ownership_unknown", "Runtime admission belongs to another state directory", 1);
102
+ if (record.project_id && record.run_id) {
103
+ if (managedProcessRuntimeHome(record, context) !== context.ddFlowHome)
104
+ throw new AppError("process_runtime_scope_mismatch", "Runtime admission belongs to another or unproven flow home", 1);
105
+ const recovering = recoveryRuntimeAdmission(context, record, { stateDir: requiredOption(parsed, "state-dir"), daemonId: optionalOption(parsed, "daemon-id"), operationId: optionalOption(parsed, "operation-id"), operation: optionalOption(parsed, "operation"), nativeSessionId: optionalOption(parsed, "native-session-id"), promptSha256: optionalOption(parsed, "prompt-sha256") });
106
+ if (!recovering) {
107
+ if (metadata.run_admitted !== true || !Number.isSafeInteger(metadata.run_generation))
108
+ throw new AppError("run_recovery_guarded", "Runtime was not admitted before the RUN fence; reconcile its launch", 1);
109
+ assertRunMutationAllowed(context, record.project_id, record.run_id, metadata.run_generation);
110
+ }
111
+ const run = context.db.get("SELECT status FROM runs WHERE project_id = ? AND id = ?", [record.project_id, record.run_id]);
112
+ const retainedHitlPrompt = recovering && ["paused", "waiting_for_user"].includes(run?.status ?? "") && ["session.prompt", "session.resume"].includes(optionalOption(parsed, "operation") ?? "") && context.db.get("SELECT 1 FROM run_recovery_bindings b JOIN run_recovery_guards g ON g.recovery_id = b.recovery_id WHERE g.project_id = ? AND g.run_id = ? AND g.generation = ? AND b.daemon_id = ? AND b.provider_session_id = ?", [record.project_id, record.run_id, metadata.run_generation, optionalOption(parsed, "daemon-id"), optionalOption(parsed, "native-session-id")]);
113
+ const acceptedHitlPrompt = ["paused", "waiting_for_user"].includes(run?.status ?? "") && controllerHitlAdmission(context, record, { stateDir: requiredOption(parsed, "state-dir"), operationId: optionalOption(parsed, "operation-id"), operation: optionalOption(parsed, "operation"), nativeSessionId: optionalOption(parsed, "native-session-id"), promptSha256: optionalOption(parsed, "prompt-sha256") });
114
+ if (!run || run.status !== "running" && !retainedHitlPrompt && !acceptedHitlPrompt && !["judge", "probe"].includes(metadata.role ?? ""))
115
+ throw new AppError("invalid_run_state", "Subject dispatch requires a running RUN or its retained recovery/HITL prompt", 1);
116
+ if (!recovering)
117
+ assertCapacityOwnerAdmission(context, record, optionalOption(parsed, "operation-id"), { nativeSessionId: optionalOption(parsed, "native-session-id"), promptSha256: optionalOption(parsed, "prompt-sha256") });
118
+ }
119
+ const budget = reserveProviderTurn(context, record, { operationId: optionalOption(parsed, "operation-id") ?? "", operation: optionalOption(parsed, "operation") ?? "", sessionId: optionalOption(parsed, "native-session-id"), daemonId: optionalOption(parsed, "daemon-id"), promptSha256: optionalOption(parsed, "prompt-sha256") });
120
+ return { ok: true, ...budget, process_id: record.id, generation: metadata.run_generation ?? null };
121
+ }
122
+ if (action === "release-turn") {
123
+ const record = managedProcessStatus(context).find(process => process.id === requiredOption(parsed, "id"));
124
+ if (!record || record.lease_token !== requiredOption(parsed, "lease-token") || record.owner_id !== requiredOption(parsed, "owner") || managedProcessRuntimeHome(record, context) !== context.ddFlowHome)
125
+ throw new AppError("process_ownership_unknown", "Budget release requires its retained physical owner", 1);
126
+ return releaseProviderTurns(context, record, { daemonId: requiredOption(parsed, "daemon-id"), operationId: optionalOption(parsed, "operation-id"), observationFile: optionalOption(parsed, "observation-file") }, prepared.providerTurnRelease);
127
+ }
128
+ if (action === "finish")
129
+ return { ok: finishManagedProcess(context, runtimeProcessFinishInput(parsed)) };
130
+ if (action === "status") {
131
+ const id = optionalOption(parsed, "id"), token = optionalOption(parsed, "lease-token"), hash = optionalOption(parsed, "registration-sha256");
132
+ if (!id && !token && !hash)
133
+ return { ok: true, processes: managedProcessStatus(context) };
134
+ if (!id || !token || !hash || !/^[a-f0-9]{64}$/.test(hash))
135
+ throw new AppError("usage", "Exact status requires id, lease-token and registration-sha256", 2);
136
+ const record = managedProcessStatus(context).find(value => value.id === id);
137
+ if (!record || record.lease_token !== token || managedProcessBinding(record, resourceHome(context)).registration_sha256 !== hash || record.state !== "running" || !processIsAlive(record))
138
+ throw new AppError("process_maintenance_receipt_invalid", "Readback binding or physical owner changed", 1);
139
+ assertManagedProcessAdmission(context, record);
140
+ const metadata = JSON.parse(record.metadata_json);
141
+ if (record.project_id && record.run_id) {
142
+ if (metadata.run_admitted !== true || !Number.isSafeInteger(metadata.run_generation))
143
+ throw new AppError("run_recovery_guarded", "Readback has no admitted generation", 1);
144
+ assertRunMutationAllowed(context, record.project_id, record.run_id, metadata.run_generation);
145
+ if (managedProcessRuntimeHome(record, context) !== context.ddFlowHome)
146
+ throw new AppError("process_runtime_scope_mismatch", "Readback belongs to another engine home", 1);
147
+ }
148
+ return { ok: true, process_id: id, lease_expires_at: record.lease_expires_at, registration_sha256: hash, readback: true };
149
+ }
150
+ if (action === "reconcile")
151
+ return { ok: true, processes: await reconcileExpiredManagedProcesses(context, requiredOption(parsed, "owner"), optionalNumber(parsed, "grace-ms")) };
152
+ throw new AppError("usage", "Usage: dd-flow runtime process <start|stop|register|confirm|heartbeat|admission|finish|status|reconcile>", 2);
153
+ }
@@ -0,0 +1,149 @@
1
+ import { prepareCommandRoute } from "./command-inputs.js";
2
+ import path from "node:path";
3
+ import { parseOutputOptions } from "./output-options.js";
4
+ import { resolveDdFlowHome } from "../storage/paths.js";
5
+ import { readSetupStatus, installAuthenticatedRelease, readRetainedSetupExecutor, hasDeferredSetupOnboarding, readSetupOnboarding, commitSetupOnboarding } from "../services/setup.js";
6
+ import { readTrustedReleaseProducers, readReleaseBundle } from "../services/release-source.js";
7
+ import { createReleaseCompatibility, installedCatalogVersions } from "../services/release-compatibility.js";
8
+ import { getCliVersionReport } from "../services/build-info.js";
9
+ import { readOperatorProfiles, readProfileCreationIntent } from "../services/operator-profiles.js";
10
+ import { onboardExecutor, selectOnboardingExecutor } from "../services/executor-onboarding.js";
11
+ import { askExecutorChoice } from "./executor-onboarding.js";
12
+ import { requiredOption, optionalOption } from "./argument-values.js";
13
+ import { AppError, errorRecord } from "../shared/errors.js";
14
+ import { hybridDigest } from "../services/hybrid-contracts.js";
15
+ import { prepareResponseDestination, writeResponseFile } from "./response-file.js";
16
+ import { readRegistryRelease } from "../services/release-registry.js";
17
+ import { writePreparationError } from "./error-output.js";
18
+ import { publishSetup } from "../harness-runtime/lib/setup-progress.mjs";
19
+ /** Lightweight global diagnostic ingress; never creates a runtime context. */
20
+ export async function runSetupCli(args, env, io = { stdout: process.stdout, stderr: process.stderr, stdin: process.stdin }) {
21
+ let json = false;
22
+ try {
23
+ const output = parseOutputOptions(args);
24
+ json = output.json;
25
+ if (output.responseFile)
26
+ prepareResponseDestination(output.responseFile);
27
+ const route = prepareCommandRoute(output.args);
28
+ const humanProgress = !output.json && !output.progressJsonl;
29
+ const reportHumanProgress = (message) => {
30
+ // Diagnostic delivery cannot turn a completed installation into failure.
31
+ try {
32
+ io.stderr.write(`setup: ${message}\n`);
33
+ }
34
+ catch { /* Best-effort human progress only. */ }
35
+ };
36
+ const home = resolveDdFlowHome(env);
37
+ let result;
38
+ if (route.key === "setup status")
39
+ result = { ok: true, action: "setup_status", observed_cli: getCliVersionReport().cli, ...readSetupStatus(home) };
40
+ else if (route.key === "setup" || route.key === "setup update") {
41
+ const parsed = route.parsed;
42
+ const source = optionalOption(parsed, "canon-source"), version = optionalOption(parsed, "canon-version");
43
+ const registryFile = optionalOption(parsed, "release-registry");
44
+ if (source && (version || registryFile))
45
+ throw new AppError("usage", "--canon-source is exclusive with --canon-version and --release-registry; see dd-flow setup --help", 2, { effect: "no_effect" });
46
+ const channel = (optionalOption(parsed, "channel") ?? "stable");
47
+ const selection = source ? null : readRegistryRelease(registryFile ?? env.DD_FLOW_RELEASE_REGISTRY ?? path.join(home, "release-registry.json"), channel, version);
48
+ const profile = optionalOption(parsed, "profile"), skip = parsed.options.has("skip-agent-setup");
49
+ const intentFile = optionalOption(parsed, "save-profile-intent");
50
+ if (intentFile && skip)
51
+ throw new AppError("usage", "--save-profile-intent conflicts with --skip-agent-setup", 2, { effect: "no_effect" });
52
+ let profileCreation = intentFile ? readProfileCreationIntent(intentFile) : undefined;
53
+ const stdin = io.stdin ?? process.stdin;
54
+ const nonInteractive = parsed.options.has("non-interactive") || output.json || output.progressJsonl
55
+ || !stdin.isTTY || !io.stderr.isTTY;
56
+ const profileFile = optionalOption(parsed, "profile-file");
57
+ const requestId = requiredOption(parsed, "request-id");
58
+ const retained = profile === undefined && profileFile === undefined && !intentFile && !skip ? readRetainedSetupExecutor(home, requestId) : null;
59
+ if (retained?.profileCreation)
60
+ profileCreation = retained.profileCreation;
61
+ const choice = { ...(profile !== undefined ? { profileId: profile } : {}),
62
+ ...(profileFile !== undefined ? { profileFile } : {}),
63
+ ...(retained?.executor ? { profile: retained.executor } : profileCreation && profile === undefined && profileFile === undefined ? { profile: profileCreation.profile } : {}),
64
+ skip: skip || retained !== null && retained.executor === null };
65
+ let deferred = hasDeferredSetupOnboarding(home, requestId);
66
+ let selected;
67
+ if (!deferred) {
68
+ try {
69
+ selected = selectOnboardingExecutor(choice, () => readOperatorProfiles(home), { allowSkip: true });
70
+ }
71
+ catch (error) {
72
+ if (!(error instanceof AppError) || error.code !== "agent_profile_missing" || nonInteractive
73
+ || profile !== undefined || profileFile !== undefined || intentFile || skip)
74
+ throw error;
75
+ deferred = true;
76
+ }
77
+ }
78
+ else if (profile !== undefined || profileFile !== undefined || intentFile || skip) {
79
+ // Explicit continuation inputs still fail before downloading or replaying.
80
+ selected = selectOnboardingExecutor(choice, () => readOperatorProfiles(home), { allowSkip: true });
81
+ }
82
+ const observedCli = getCliVersionReport().cli;
83
+ const compatibility = createReleaseCompatibility({ channel,
84
+ catalogVersions: installedCatalogVersions, routerVersion: observedCli.version });
85
+ const producers = readTrustedReleaseProducers(requiredOption(parsed, "trust-file"));
86
+ const bundle = await readReleaseBundle(source ?? selection.envelope_url, producers, compatibility, {
87
+ ...(selection ? { expectedVersion: selection.version } : {}),
88
+ ...((output.progressJsonl || humanProgress) ? { onProgress: (progress) => {
89
+ if (output.progressJsonl)
90
+ io.stdout.write(`${JSON.stringify({ type: "setup_download_progress", request_id: requestId, ...progress })}\n`);
91
+ else if (progress.received_bytes === progress.expected_bytes)
92
+ reportHumanProgress(`${progress.artifact} archive received (${progress.received_bytes} bytes); integrity validation follows`);
93
+ } } : {})
94
+ });
95
+ if (selection && bundle.authenticated.manifest.version !== selection.version)
96
+ throw new AppError("release_registry", "Authenticated release differs from selected registry version", 1, { reason: "selected_version_mismatch", phase: "release_selection", effect: "no_effect", help: "setup" });
97
+ const installed = installAuthenticatedRelease(home, { requestId, action: route.key === "setup update" ? "update" : "install",
98
+ envelope: bundle.envelope, trustedProducers: producers, compatibility, canonArchive: bundle.canonArchive, engineArchive: bundle.engineArchive,
99
+ ...(deferred ? { deferredOnboarding: true } : { executor: selected.profile, ...(profileCreation ? { profileCreation } : {}) }),
100
+ onCheckpoint: phase => {
101
+ publishSetup("dependency_check_completed", `release-setup:${phase}`);
102
+ if (output.progressJsonl)
103
+ io.stdout.write(`${JSON.stringify({ type: "setup_progress", request_id: requestId, phase })}\n`);
104
+ else if (humanProgress)
105
+ reportHumanProgress({ prepared: "verified release request retained", canon_cached: "canon cache verified", engine_cached: "engine cache verified",
106
+ profiles_saved: "profile settings saved", committed: "installation committed; runtime qualification remains unknown" }[phase]);
107
+ } });
108
+ if (humanProgress && installed.replayed)
109
+ reportHumanProgress("exact request replay verified; retained selection was not reactivated");
110
+ if (deferred) {
111
+ const saved = readSetupOnboarding(home, requestId);
112
+ const explicit = profile !== undefined || profileFile !== undefined || intentFile !== undefined || skip;
113
+ const deferredChoice = saved && !explicit ? { ...(saved.executor ? { profile: saved.executor } : { skip: true }),
114
+ ...(saved.profileCreation ? { profileCreation: saved.profileCreation } : {}) } : choice;
115
+ try {
116
+ selected ??= await onboardExecutor(deferredChoice, () => readOperatorProfiles(home), { allowSkip: true, nonInteractive }, settings => askExecutorChoice(settings, { stdin, stderr: io.stderr }));
117
+ const consent = commitSetupOnboarding(home, requestId, { executor: selected.profile,
118
+ ...(profileCreation ?? selected.profileCreation ? { profileCreation: profileCreation ?? selected.profileCreation } : {}) });
119
+ installed.executor = consent.executor;
120
+ if (humanProgress)
121
+ reportHumanProgress("executor onboarding committed after installation");
122
+ }
123
+ catch (error) {
124
+ if (error instanceof AppError) {
125
+ error.details.installation = "committed";
126
+ error.details.request_id = requestId;
127
+ error.details.next_action = "Replay the same setup request to resume executor onboarding; installation remains retained";
128
+ }
129
+ throw error;
130
+ }
131
+ }
132
+ result = { ...installed, action: route.key === "setup update" ? "setup_update" : "setup_install", observed_cli: observedCli,
133
+ executor: installed.executor ? { profile_id: installed.executor.id, revision: hybridDigest(installed.executor), readiness: "unknown_requires_qualification" } : { profile_id: null, readiness: "not_configured" },
134
+ ...readSetupStatus(home) };
135
+ }
136
+ else
137
+ throw new AppError("usage", "Unknown setup command; see dd-flow setup --help", 2, { effect: "no_effect" });
138
+ io.stdout.write(`${JSON.stringify(writeResponseFile(result, output), null, json ? undefined : 2)}\n`);
139
+ return 0;
140
+ }
141
+ catch (error) {
142
+ const record = errorRecord(error);
143
+ writePreparationError(io, args, record);
144
+ if (!json && error instanceof AppError && error.details.installation === "committed") {
145
+ io.stderr.write("setup: installation remains committed; replay the same request to resume executor onboarding\n");
146
+ }
147
+ return record.exitCode;
148
+ }
149
+ }
package/dist/cli.js CHANGED
@@ -1,4 +1,73 @@
1
1
  #!/usr/bin/env node
2
- import { runCli } from "./cli/run-cli.js";
3
- const exitCode = await runCli(process.argv.slice(2));
2
+ import { isNativeHookIngress } from "./cli/native-hook-ingress.js";
3
+ import { isRuntimeMaintenanceIngress, runRuntimeMaintenanceIngress } from "./cli/runtime-maintenance-ingress.js";
4
+ import { resolveHelp } from "./cli/help.js";
5
+ import { errorRecord } from "./shared/errors.js";
6
+ import { writePreparationError } from "./cli/error-output.js";
7
+ import { publishSetup } from './harness-runtime/lib/setup-progress.mjs';
8
+ const args = process.argv.slice(2);
9
+ let help;
10
+ try {
11
+ help = resolveHelp(args);
12
+ }
13
+ catch (error) {
14
+ const record = errorRecord(error);
15
+ writePreparationError({ stderr: process.stderr }, args, record);
16
+ process.exit(record.exitCode);
17
+ }
18
+ if (help) {
19
+ process.stdout.write(`${help.json ? JSON.stringify(help.data) : help.text}\n`);
20
+ process.exit(0);
21
+ }
22
+ if (args[0] === "completion") {
23
+ const { runCompletionCli } = await import("./cli/completion-cli.js");
24
+ process.exit(runCompletionCli(args));
25
+ }
26
+ if (args[0] === "profiles") {
27
+ const { runOperatorProfilesCli } = await import("./cli/operator-profiles.js");
28
+ process.exit(runOperatorProfilesCli(args, process.env));
29
+ }
30
+ if (args[0] === "setup") {
31
+ const { runSetupCli } = await import("./cli/setup.js");
32
+ process.exit(await runSetupCli(args, process.env));
33
+ }
34
+ if (args[0] === "harnesses") {
35
+ const { runHarnessesCli } = await import("./cli/harnesses.js");
36
+ process.exit(await runHarnessesCli(args, process.env));
37
+ }
38
+ if (args[0] === "models") {
39
+ const { runModelsCli } = await import("./cli/models.js");
40
+ process.exit(runModelsCli(args));
41
+ }
42
+ if (args[0] === "flow" && ["list", "show"].includes(args[1] ?? "")) {
43
+ const { runFlowCatalogCli } = await import("./cli/flows.js");
44
+ process.exit(runFlowCatalogCli(args));
45
+ }
46
+ if (args[0] === "init" || args[0] === "flow" && args[1] === "mb-init") {
47
+ publishSetup('ingress_entered');
48
+ const { runMemoryInitCli } = await import("./cli/memory-init.js");
49
+ publishSetup('imports_ready');
50
+ process.exit(await runMemoryInitCli(args, process.env));
51
+ }
52
+ if (args.slice(0, 3).join(" ") === "runtime storage admit") {
53
+ const { runMemoryStorageAdmissionCli } = await import("./cli/memory-storage-admission.js");
54
+ process.exit(runMemoryStorageAdmissionCli(args));
55
+ }
56
+ if (args.slice(0, 3).join(" ") === "runtime flow admit") {
57
+ const { runMemoryFlowAdmissionCli } = await import("./cli/memory-flow-admission.js");
58
+ process.exit(await runMemoryFlowAdmissionCli(args));
59
+ }
60
+ const managedHook = Boolean(process.env.DD_FLOW_CODEX_STATE_DIR) && args.slice(0, 3).join(" ") === "codex hook handle";
61
+ const exitCode = isRuntimeMaintenanceIngress(args, process.env)
62
+ ? await runRuntimeMaintenanceIngress(args)
63
+ : managedHook
64
+ ? await (await import("./cli/hook-ingress.js")).runHookIngress(args)
65
+ : isNativeHookIngress(args)
66
+ ? await (await import("./cli/native-hook-ingress.js")).runNativeHookIngress(args)
67
+ : await (async () => {
68
+ publishSetup('ingress_entered');
69
+ const cli = await import('./cli/run-cli.js');
70
+ publishSetup('imports_ready');
71
+ return await cli.runCli(args);
72
+ })();
4
73
  process.exitCode = exitCode;
@@ -3,7 +3,7 @@ export const vnextStages = [
3
3
  { id: "specify", directory: "01-specify", result: "specify.json", schema: "dd-flow/vnext-specify-result@4", next: ["protocolize"] },
4
4
  { id: "protocolize", directory: "02-protocolize", result: "protocolize-result.json", schema: "dd-flow/vnext-protocolize-result@3", next: ["plan"] },
5
5
  { id: "plan", directory: "03-plan", result: "stage-report.json", schema: "dd-flow/stage-report@2", next: ["plan-review", "code"] },
6
- { id: "plan-review", directory: "04-plan-review", result: "decision.json", schema: "dd-flow/plan-review-decision@3", next: ["code"] },
6
+ { id: "plan-review", directory: "04-plan-review", result: "decision.json", schema: "dd-flow/plan-review-decision@4", next: ["code"] },
7
7
  { id: "code", directory: "05-code", result: "code-verification.json", schema: "dd-flow/code-verification@2", next: ["code-review", "merge"] },
8
8
  { id: "code-review", directory: "06-code-review", result: "decision.json", schema: "dd-flow/code-review-decision@3", next: ["merge"] },
9
9
  { id: "merge", directory: "07-merge", result: "stage-report.json", schema: "dd-flow/stage-report@2", next: [] }
@@ -0,0 +1,20 @@
1
+ /** Engine-owned identities shared by inspection and executable registration.
2
+ * Keep this module dependency-free: catalog inspection must not load handlers.
3
+ */
4
+ export const sdlcHandlerIdentities = Object.freeze({
5
+ specify: Object.freeze({ stage: "specify", entryId: "sdlc-specify-entry", finishId: "sdlc-specify-finish" }),
6
+ protocolize: Object.freeze({ stage: "protocolize", entryId: "sdlc-protocolize-entry", finishId: "sdlc-protocolize-finish" }),
7
+ plan: Object.freeze({ stage: "plan", entryId: "sdlc-plan-entry", finishId: "sdlc-plan-finish" }),
8
+ "plan-review": Object.freeze({ stage: "plan-review", entryId: "sdlc-plan-review-entry", finishId: "sdlc-plan-review-finish" }),
9
+ code: Object.freeze({ stage: "code", entryId: "sdlc-code-entry", finishId: "sdlc-code-finish" }),
10
+ "code-review": Object.freeze({ stage: "code-review", entryId: "sdlc-code-review-entry", finishId: "sdlc-code-review-finish" }),
11
+ merge: Object.freeze({ stage: "merge", entryId: "sdlc-merge-entry", finishId: "sdlc-merge-finish" })
12
+ });
13
+ export const memoryInitHandlerIdentities = Object.freeze({
14
+ preflight: Object.freeze({ stage: "preflight", entryId: "memory-stage-entry", finishId: "memory-stage-finish" }),
15
+ discover: Object.freeze({ stage: "discover", entryId: "memory-stage-entry", finishId: "memory-stage-finish" }),
16
+ compose: Object.freeze({ stage: "compose", entryId: "memory-stage-entry", finishId: "memory-stage-finish" }),
17
+ verify: Object.freeze({ stage: "verify", entryId: "memory-stage-entry", finishId: "memory-stage-finish" }),
18
+ review: Object.freeze({ stage: "review", entryId: "memory-stage-entry", finishId: "memory-stage-finish" }),
19
+ finish: Object.freeze({ stage: "finish", entryId: "memory-stage-entry", finishId: "memory-stage-finish" })
20
+ });
@@ -0,0 +1,112 @@
1
+ # dd-zcode integration boundary
2
+
3
+ `bin/dd-zcode.mjs`, `lib/dd-zcode.mjs` and `lib/dd-zcode-daemon.mjs` implement the
4
+ dd-flow adapter over ACP. The maintained bridge is
5
+ [deksden-com/zcode-acp](https://github.com/deksden-com/zcode-acp), based on upstream
6
+ [william0wang/zcode-acp](https://github.com/william0wang/zcode-acp).
7
+
8
+ | Owner | Responsibility |
9
+ | --- | --- |
10
+ | Upstream bridge | ZCode protocol compatibility, ACP transport, native event translation and general session mechanics. |
11
+ | Downstream bridge extensions | Expose native identity, evidence and control primitives missing upstream; preserve native errors and side-effect semantics. |
12
+ | dd-zcode | Requested/observed profile checks, native-to-dd-flow identity mapping, event normalization, lifecycle forwarding, execution daemon ownership, cancellation/settlement verification and usage forwarding. |
13
+ | dd-flow services | Durable lifecycle decisions, Work/RUN state and usage ingestion/accounting. |
14
+ | dd-eval | Qualify the complete tuple, pin profiles/artifacts and run/monitor evaluations. |
15
+
16
+ Native turn completion is evidence, not proof of semantic Work success. A
17
+ closed transport is not proof that its native descendants stopped. The adapter
18
+ must retain causal errors, missing observations and usage completeness rather
19
+ than turn them into successful/zero-valued results.
20
+
21
+ ## Retained child observations
22
+
23
+ Daemon capability `retained_child_observation` enables `session observe-children`
24
+ for its registered root. It reads retained topology and exact terminal metadata,
25
+ never loads/resumes a child or performs semantic work. During fanout the controller
26
+ records failed child facts before dispatching anything else; healthy in-flight
27
+ siblings may settle normally. Observation polling is not productive model activity.
28
+ Ordinary `session inspect` is not a substitute for this read-only operation.
29
+
30
+ Native attribution is a reported fact, not proof that an HTTP request reached a
31
+ provider. If the native store discarded the causal exception, retain unknown;
32
+ do not scrape ambient logs or infer overload/retry authority from an error message.
33
+
34
+ The bridge marks heuristic ACP completion with
35
+ `_meta.zcodeCompletionEvidence: "inferred"` and exhausted failed turns with
36
+ `"failed"`. dd-zcode rejects these before any post-turn materializing read:
37
+ inferred means `native_outcome_unknown` (not retryable automatically), failed
38
+ means `zcode_turn_not_completed`. This additive evidence does not change the
39
+ acceptance of already-qualified immutable older tuples. Native allocation
40
+ notifications are causal identity evidence, not authorization to replay a turn.
41
+
42
+ ## Bridge contract
43
+
44
+ The identity check uses `--dd-harness-version` (`dd-zcode-harness@1` for existing
45
+ qualified builds, `dd-zcode-harness@2` for the qualified v0.46.7 bridge) and
46
+ `--dd-harness-commit`, alongside native and bridge versions. This is the current
47
+ mechanism, not a general capability negotiation protocol. `zcodeLifecycleQualification`
48
+ also admits exact native-binary SHA / bridge-commit tuples; a new tuple requires
49
+ behavioral evidence before admission. Merely changing an allowlist is not that
50
+ evidence.
51
+
52
+ The adapter consumes `zcode/session/resolve`, `read`, `subagents`, `usage`,
53
+ `close`, `resident` and `retainedSubagents`, plus standard/existing session
54
+ operations. Resolution must preserve the session's trusted workspace.
55
+ Residency and retained-tree reads after close must not implicitly resume it.
56
+ Cancellation must target owned sessions and verify resulting tree state.
57
+ Profile facts must come from native readback. Session updates supply tool events.
58
+ The adapter forwards a standalone public lifecycle command to `dd-flow zcode
59
+ event handle`; native Session/tool identity binds it to the one exact issued
60
+ assignment in that daemon scope. The command never exposes the runtime-owned
61
+ invocation ID. Its shell inherits `DD_FLOW_DAEMON_ID`, finds the assignment and
62
+ waits for the committed receipt before any lifecycle mutation can execute.
63
+
64
+ The execution-scoped daemon preserves the live native handles needed for
65
+ background children. Inspection remains available during productive operations;
66
+ a lost owner cannot be repaired by pretending retained topology is a live tree.
67
+ Keep process identity, native identity and adapter control locator distinct.
68
+
69
+ ## Usage and contract @2
70
+
71
+ The @2 bridge returns native usage unchanged. `lib/zcode-usage.mjs` reads native
72
+ session evidence and computes request counters in the adapter. It deduplicates
73
+ identified requests, rejects conflicting/invalid measurements and records read
74
+ failures as incomplete evidence. Full history is required for cumulative usage;
75
+ turn-liveness history limits must not be applied here. Immutable @1 bridges
76
+ remain supported through their existing measured projection. All adapter usage
77
+ paths use the same helper; dd-flow services still own accounting deltas.
78
+
79
+ Contract support does not admit a new binary/commit tuple automatically. The
80
+ v0.46.7 @2 tuple is admitted for native SHA `500ae84f…f466` or the ZCode
81
+ Desktop 3.14.3 SHA `b1df2ef3…dad529`, with bridge commit `f4d47b5…2833`.
82
+ The latter passed the published beta.99 public-command probe on 2026-09-23:
83
+ root and two concurrent child Work starts/finishes, plus same-child continuation,
84
+ all with durable native identity receipts. Preserve that
85
+ fail-closed distinction when preparing later evals.
86
+
87
+ Future consumer-only retry, recovery, readiness and accounting rules belong
88
+ here or in the owning dd-flow service. Bridge changes are justified when native
89
+ access or protocol mechanics cannot be implemented through its public interface.
90
+ Review existing patches individually; do not claim that all policy has already
91
+ been extracted from the bridge.
92
+
93
+ ## Verification and operations
94
+
95
+ Relevant adapter regressions include `test/zcode-invocation-observer.test.ts`;
96
+ select the additional daemon, usage and lifecycle tests affected by a change.
97
+ Bridge tests check transport facts; adapter tests check their interpretation;
98
+ live qualification checks the actual installed tuple. Release the adapter with
99
+ dd-flow when adapter code or qualification admission changes. A bridge-only
100
+ update does not inherently require an adapter release, but current exact-commit
101
+ admission may require one.
102
+
103
+ Follow the [ZCode upgrade runbook](https://github.com/deksden-com/dd-eval/blob/main/runbooks/update-zcode.md)
104
+ for release discovery, qualification, rollout and rollback. Fork patch maintenance
105
+ is documented in the fork itself. Neither procedure is duplicated here.
106
+
107
+ Adapter changes use short-lived `feat/`, `fix/` or `docs/` branches from `main`,
108
+ reviewed with affected checks before integration (normally squash merge).
109
+ Releases identify verified immutable artifacts, not moving main HEAD. See the
110
+ [cross-repository Git workflow](https://github.com/deksden-com/dd-eval/blob/main/runbooks/git-workflow.md)
111
+ for upgrade ordering, candidate acceptance and hotfixes. Branch-protection
112
+ configuration is separate from this documented policy.