@kontourai/flow-agents 3.11.0 → 3.12.1

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 (254) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/src/builder-flow-run-adapter.d.ts +1 -0
  3. package/build/src/builder-flow-run-adapter.js +2 -0
  4. package/build/src/builder-flow-runtime.d.ts +5 -0
  5. package/build/src/builder-flow-runtime.js +90 -68
  6. package/build/src/builder-gate-action-envelope.d.ts +152 -0
  7. package/build/src/builder-gate-action-envelope.js +368 -0
  8. package/build/src/cli/public-contracts.d.ts +139 -0
  9. package/build/src/cli/public-contracts.js +37 -0
  10. package/build/src/cli/workflow-sidecar.js +9 -13
  11. package/build/src/cli/workflow.d.ts +1 -0
  12. package/build/src/cli/workflow.js +49 -12
  13. package/build/src/continuation-driver.d.ts +40 -3
  14. package/build/src/continuation-driver.js +361 -412
  15. package/build/src/continuation-persistence.d.ts +4 -0
  16. package/build/src/continuation-persistence.js +296 -0
  17. package/build/src/continuation-validation.d.ts +9 -0
  18. package/build/src/continuation-validation.js +169 -0
  19. package/build/src/flow-kit/action-metadata.d.ts +28 -0
  20. package/build/src/flow-kit/action-metadata.js +162 -0
  21. package/build/src/flow-kit/action-repository-validation.d.ts +16 -0
  22. package/build/src/flow-kit/action-repository-validation.js +237 -0
  23. package/build/src/flow-kit/validate.d.ts +2 -14
  24. package/build/src/flow-kit/validate.js +18 -345
  25. package/build/src/index.d.ts +4 -2
  26. package/build/src/index.js +2 -1
  27. package/dist/base/build/package.json +1 -1
  28. package/dist/base/build/src/builder-flow-run-adapter.d.ts +1 -0
  29. package/dist/base/build/src/builder-flow-run-adapter.js +2 -0
  30. package/dist/base/build/src/builder-flow-runtime.d.ts +5 -0
  31. package/dist/base/build/src/builder-flow-runtime.js +90 -68
  32. package/dist/base/build/src/builder-gate-action-envelope.d.ts +152 -0
  33. package/dist/base/build/src/builder-gate-action-envelope.js +368 -0
  34. package/dist/base/build/src/cli/public-contracts.d.ts +139 -0
  35. package/dist/base/build/src/cli/public-contracts.js +37 -0
  36. package/dist/base/build/src/cli/workflow-sidecar.js +9 -13
  37. package/dist/base/build/src/cli/workflow.d.ts +1 -0
  38. package/dist/base/build/src/cli/workflow.js +49 -12
  39. package/dist/base/build/src/continuation-driver.d.ts +40 -3
  40. package/dist/base/build/src/continuation-driver.js +361 -412
  41. package/dist/base/build/src/continuation-persistence.d.ts +4 -0
  42. package/dist/base/build/src/continuation-persistence.js +296 -0
  43. package/dist/base/build/src/continuation-validation.d.ts +9 -0
  44. package/dist/base/build/src/continuation-validation.js +169 -0
  45. package/dist/base/build/src/flow-kit/action-metadata.d.ts +28 -0
  46. package/dist/base/build/src/flow-kit/action-metadata.js +162 -0
  47. package/dist/base/build/src/flow-kit/action-repository-validation.d.ts +16 -0
  48. package/dist/base/build/src/flow-kit/action-repository-validation.js +237 -0
  49. package/dist/base/build/src/flow-kit/validate.d.ts +2 -14
  50. package/dist/base/build/src/flow-kit/validate.js +18 -345
  51. package/dist/base/build/src/index.d.ts +4 -2
  52. package/dist/base/build/src/index.js +2 -1
  53. package/dist/base/docs/migrations.md +5 -0
  54. package/dist/base/docs/public-workflow-cli.md +41 -5
  55. package/dist/base/docs/spec/builder-flow-runtime.md +117 -0
  56. package/dist/base/evals/integration/test_builder_step_producers.sh +60 -21
  57. package/dist/base/evals/integration/test_bundle_install.sh +15 -15
  58. package/dist/base/evals/integration/test_phase_map_and_gate_claim.sh +9 -22
  59. package/dist/base/install.sh +1 -1
  60. package/dist/base/kits/builder/kit.json +88 -14
  61. package/dist/claude-code/build/package.json +1 -1
  62. package/dist/claude-code/build/src/builder-flow-run-adapter.d.ts +1 -0
  63. package/dist/claude-code/build/src/builder-flow-run-adapter.js +2 -0
  64. package/dist/claude-code/build/src/builder-flow-runtime.d.ts +5 -0
  65. package/dist/claude-code/build/src/builder-flow-runtime.js +90 -68
  66. package/dist/claude-code/build/src/builder-gate-action-envelope.d.ts +152 -0
  67. package/dist/claude-code/build/src/builder-gate-action-envelope.js +368 -0
  68. package/dist/claude-code/build/src/cli/public-contracts.d.ts +139 -0
  69. package/dist/claude-code/build/src/cli/public-contracts.js +37 -0
  70. package/dist/claude-code/build/src/cli/workflow-sidecar.js +9 -13
  71. package/dist/claude-code/build/src/cli/workflow.d.ts +1 -0
  72. package/dist/claude-code/build/src/cli/workflow.js +49 -12
  73. package/dist/claude-code/build/src/continuation-driver.d.ts +40 -3
  74. package/dist/claude-code/build/src/continuation-driver.js +361 -412
  75. package/dist/claude-code/build/src/continuation-persistence.d.ts +4 -0
  76. package/dist/claude-code/build/src/continuation-persistence.js +296 -0
  77. package/dist/claude-code/build/src/continuation-validation.d.ts +9 -0
  78. package/dist/claude-code/build/src/continuation-validation.js +169 -0
  79. package/dist/claude-code/build/src/flow-kit/action-metadata.d.ts +28 -0
  80. package/dist/claude-code/build/src/flow-kit/action-metadata.js +162 -0
  81. package/dist/claude-code/build/src/flow-kit/action-repository-validation.d.ts +16 -0
  82. package/dist/claude-code/build/src/flow-kit/action-repository-validation.js +237 -0
  83. package/dist/claude-code/build/src/flow-kit/validate.d.ts +2 -14
  84. package/dist/claude-code/build/src/flow-kit/validate.js +18 -345
  85. package/dist/claude-code/build/src/index.d.ts +4 -2
  86. package/dist/claude-code/build/src/index.js +2 -1
  87. package/dist/claude-code/docs/migrations.md +5 -0
  88. package/dist/claude-code/docs/public-workflow-cli.md +41 -5
  89. package/dist/claude-code/docs/spec/builder-flow-runtime.md +117 -0
  90. package/dist/claude-code/evals/integration/test_builder_step_producers.sh +60 -21
  91. package/dist/claude-code/evals/integration/test_bundle_install.sh +15 -15
  92. package/dist/claude-code/evals/integration/test_phase_map_and_gate_claim.sh +9 -22
  93. package/dist/claude-code/install.sh +1 -1
  94. package/dist/claude-code/kits/builder/kit.json +88 -14
  95. package/dist/codex/build/package.json +1 -1
  96. package/dist/codex/build/src/builder-flow-run-adapter.d.ts +1 -0
  97. package/dist/codex/build/src/builder-flow-run-adapter.js +2 -0
  98. package/dist/codex/build/src/builder-flow-runtime.d.ts +5 -0
  99. package/dist/codex/build/src/builder-flow-runtime.js +90 -68
  100. package/dist/codex/build/src/builder-gate-action-envelope.d.ts +152 -0
  101. package/dist/codex/build/src/builder-gate-action-envelope.js +368 -0
  102. package/dist/codex/build/src/cli/public-contracts.d.ts +139 -0
  103. package/dist/codex/build/src/cli/public-contracts.js +37 -0
  104. package/dist/codex/build/src/cli/workflow-sidecar.js +9 -13
  105. package/dist/codex/build/src/cli/workflow.d.ts +1 -0
  106. package/dist/codex/build/src/cli/workflow.js +49 -12
  107. package/dist/codex/build/src/continuation-driver.d.ts +40 -3
  108. package/dist/codex/build/src/continuation-driver.js +361 -412
  109. package/dist/codex/build/src/continuation-persistence.d.ts +4 -0
  110. package/dist/codex/build/src/continuation-persistence.js +296 -0
  111. package/dist/codex/build/src/continuation-validation.d.ts +9 -0
  112. package/dist/codex/build/src/continuation-validation.js +169 -0
  113. package/dist/codex/build/src/flow-kit/action-metadata.d.ts +28 -0
  114. package/dist/codex/build/src/flow-kit/action-metadata.js +162 -0
  115. package/dist/codex/build/src/flow-kit/action-repository-validation.d.ts +16 -0
  116. package/dist/codex/build/src/flow-kit/action-repository-validation.js +237 -0
  117. package/dist/codex/build/src/flow-kit/validate.d.ts +2 -14
  118. package/dist/codex/build/src/flow-kit/validate.js +18 -345
  119. package/dist/codex/build/src/index.d.ts +4 -2
  120. package/dist/codex/build/src/index.js +2 -1
  121. package/dist/codex/docs/migrations.md +5 -0
  122. package/dist/codex/docs/public-workflow-cli.md +41 -5
  123. package/dist/codex/docs/spec/builder-flow-runtime.md +117 -0
  124. package/dist/codex/evals/integration/test_builder_step_producers.sh +60 -21
  125. package/dist/codex/evals/integration/test_bundle_install.sh +15 -15
  126. package/dist/codex/evals/integration/test_phase_map_and_gate_claim.sh +9 -22
  127. package/dist/codex/install.sh +1 -1
  128. package/dist/codex/kits/builder/kit.json +88 -14
  129. package/dist/kiro/build/package.json +1 -1
  130. package/dist/kiro/build/src/builder-flow-run-adapter.d.ts +1 -0
  131. package/dist/kiro/build/src/builder-flow-run-adapter.js +2 -0
  132. package/dist/kiro/build/src/builder-flow-runtime.d.ts +5 -0
  133. package/dist/kiro/build/src/builder-flow-runtime.js +90 -68
  134. package/dist/kiro/build/src/builder-gate-action-envelope.d.ts +152 -0
  135. package/dist/kiro/build/src/builder-gate-action-envelope.js +368 -0
  136. package/dist/kiro/build/src/cli/public-contracts.d.ts +139 -0
  137. package/dist/kiro/build/src/cli/public-contracts.js +37 -0
  138. package/dist/kiro/build/src/cli/workflow-sidecar.js +9 -13
  139. package/dist/kiro/build/src/cli/workflow.d.ts +1 -0
  140. package/dist/kiro/build/src/cli/workflow.js +49 -12
  141. package/dist/kiro/build/src/continuation-driver.d.ts +40 -3
  142. package/dist/kiro/build/src/continuation-driver.js +361 -412
  143. package/dist/kiro/build/src/continuation-persistence.d.ts +4 -0
  144. package/dist/kiro/build/src/continuation-persistence.js +296 -0
  145. package/dist/kiro/build/src/continuation-validation.d.ts +9 -0
  146. package/dist/kiro/build/src/continuation-validation.js +169 -0
  147. package/dist/kiro/build/src/flow-kit/action-metadata.d.ts +28 -0
  148. package/dist/kiro/build/src/flow-kit/action-metadata.js +162 -0
  149. package/dist/kiro/build/src/flow-kit/action-repository-validation.d.ts +16 -0
  150. package/dist/kiro/build/src/flow-kit/action-repository-validation.js +237 -0
  151. package/dist/kiro/build/src/flow-kit/validate.d.ts +2 -14
  152. package/dist/kiro/build/src/flow-kit/validate.js +18 -345
  153. package/dist/kiro/build/src/index.d.ts +4 -2
  154. package/dist/kiro/build/src/index.js +2 -1
  155. package/dist/kiro/docs/migrations.md +5 -0
  156. package/dist/kiro/docs/public-workflow-cli.md +41 -5
  157. package/dist/kiro/docs/spec/builder-flow-runtime.md +117 -0
  158. package/dist/kiro/evals/integration/test_builder_step_producers.sh +60 -21
  159. package/dist/kiro/evals/integration/test_bundle_install.sh +15 -15
  160. package/dist/kiro/evals/integration/test_phase_map_and_gate_claim.sh +9 -22
  161. package/dist/kiro/install.sh +1 -1
  162. package/dist/kiro/kits/builder/kit.json +88 -14
  163. package/dist/opencode/build/package.json +1 -1
  164. package/dist/opencode/build/src/builder-flow-run-adapter.d.ts +1 -0
  165. package/dist/opencode/build/src/builder-flow-run-adapter.js +2 -0
  166. package/dist/opencode/build/src/builder-flow-runtime.d.ts +5 -0
  167. package/dist/opencode/build/src/builder-flow-runtime.js +90 -68
  168. package/dist/opencode/build/src/builder-gate-action-envelope.d.ts +152 -0
  169. package/dist/opencode/build/src/builder-gate-action-envelope.js +368 -0
  170. package/dist/opencode/build/src/cli/public-contracts.d.ts +139 -0
  171. package/dist/opencode/build/src/cli/public-contracts.js +37 -0
  172. package/dist/opencode/build/src/cli/workflow-sidecar.js +9 -13
  173. package/dist/opencode/build/src/cli/workflow.d.ts +1 -0
  174. package/dist/opencode/build/src/cli/workflow.js +49 -12
  175. package/dist/opencode/build/src/continuation-driver.d.ts +40 -3
  176. package/dist/opencode/build/src/continuation-driver.js +361 -412
  177. package/dist/opencode/build/src/continuation-persistence.d.ts +4 -0
  178. package/dist/opencode/build/src/continuation-persistence.js +296 -0
  179. package/dist/opencode/build/src/continuation-validation.d.ts +9 -0
  180. package/dist/opencode/build/src/continuation-validation.js +169 -0
  181. package/dist/opencode/build/src/flow-kit/action-metadata.d.ts +28 -0
  182. package/dist/opencode/build/src/flow-kit/action-metadata.js +162 -0
  183. package/dist/opencode/build/src/flow-kit/action-repository-validation.d.ts +16 -0
  184. package/dist/opencode/build/src/flow-kit/action-repository-validation.js +237 -0
  185. package/dist/opencode/build/src/flow-kit/validate.d.ts +2 -14
  186. package/dist/opencode/build/src/flow-kit/validate.js +18 -345
  187. package/dist/opencode/build/src/index.d.ts +4 -2
  188. package/dist/opencode/build/src/index.js +2 -1
  189. package/dist/opencode/docs/migrations.md +5 -0
  190. package/dist/opencode/docs/public-workflow-cli.md +41 -5
  191. package/dist/opencode/docs/spec/builder-flow-runtime.md +117 -0
  192. package/dist/opencode/evals/integration/test_builder_step_producers.sh +60 -21
  193. package/dist/opencode/evals/integration/test_bundle_install.sh +15 -15
  194. package/dist/opencode/evals/integration/test_phase_map_and_gate_claim.sh +9 -22
  195. package/dist/opencode/install.sh +1 -1
  196. package/dist/opencode/kits/builder/kit.json +88 -14
  197. package/dist/pi/build/package.json +1 -1
  198. package/dist/pi/build/src/builder-flow-run-adapter.d.ts +1 -0
  199. package/dist/pi/build/src/builder-flow-run-adapter.js +2 -0
  200. package/dist/pi/build/src/builder-flow-runtime.d.ts +5 -0
  201. package/dist/pi/build/src/builder-flow-runtime.js +90 -68
  202. package/dist/pi/build/src/builder-gate-action-envelope.d.ts +152 -0
  203. package/dist/pi/build/src/builder-gate-action-envelope.js +368 -0
  204. package/dist/pi/build/src/cli/public-contracts.d.ts +139 -0
  205. package/dist/pi/build/src/cli/public-contracts.js +37 -0
  206. package/dist/pi/build/src/cli/workflow-sidecar.js +9 -13
  207. package/dist/pi/build/src/cli/workflow.d.ts +1 -0
  208. package/dist/pi/build/src/cli/workflow.js +49 -12
  209. package/dist/pi/build/src/continuation-driver.d.ts +40 -3
  210. package/dist/pi/build/src/continuation-driver.js +361 -412
  211. package/dist/pi/build/src/continuation-persistence.d.ts +4 -0
  212. package/dist/pi/build/src/continuation-persistence.js +296 -0
  213. package/dist/pi/build/src/continuation-validation.d.ts +9 -0
  214. package/dist/pi/build/src/continuation-validation.js +169 -0
  215. package/dist/pi/build/src/flow-kit/action-metadata.d.ts +28 -0
  216. package/dist/pi/build/src/flow-kit/action-metadata.js +162 -0
  217. package/dist/pi/build/src/flow-kit/action-repository-validation.d.ts +16 -0
  218. package/dist/pi/build/src/flow-kit/action-repository-validation.js +237 -0
  219. package/dist/pi/build/src/flow-kit/validate.d.ts +2 -14
  220. package/dist/pi/build/src/flow-kit/validate.js +18 -345
  221. package/dist/pi/build/src/index.d.ts +4 -2
  222. package/dist/pi/build/src/index.js +2 -1
  223. package/dist/pi/docs/migrations.md +5 -0
  224. package/dist/pi/docs/public-workflow-cli.md +41 -5
  225. package/dist/pi/docs/spec/builder-flow-runtime.md +117 -0
  226. package/dist/pi/evals/integration/test_builder_step_producers.sh +60 -21
  227. package/dist/pi/evals/integration/test_bundle_install.sh +15 -15
  228. package/dist/pi/evals/integration/test_phase_map_and_gate_claim.sh +9 -22
  229. package/dist/pi/install.sh +1 -1
  230. package/dist/pi/kits/builder/kit.json +88 -14
  231. package/docs/migrations.md +5 -0
  232. package/docs/public-workflow-cli.md +41 -5
  233. package/docs/spec/builder-flow-runtime.md +117 -0
  234. package/evals/integration/test_builder_step_producers.sh +60 -21
  235. package/evals/integration/test_bundle_install.sh +15 -15
  236. package/evals/integration/test_phase_map_and_gate_claim.sh +9 -22
  237. package/kits/builder/kit.json +88 -14
  238. package/package.json +1 -1
  239. package/src/builder-flow-run-adapter.ts +3 -0
  240. package/src/builder-flow-runtime.ts +73 -46
  241. package/src/builder-gate-action-envelope.ts +531 -0
  242. package/src/cli/builder-flow-runtime.test.mjs +289 -58
  243. package/src/cli/continuation-driver.test.mjs +542 -24
  244. package/src/cli/kit-metadata-security.test.mjs +161 -8
  245. package/src/cli/public-contracts.ts +41 -0
  246. package/src/cli/workflow-sidecar.ts +9 -13
  247. package/src/cli/workflow.ts +48 -12
  248. package/src/continuation-driver.ts +466 -378
  249. package/src/continuation-persistence.ts +228 -0
  250. package/src/continuation-validation.ts +137 -0
  251. package/src/flow-kit/action-metadata.ts +155 -0
  252. package/src/flow-kit/action-repository-validation.ts +192 -0
  253. package/src/flow-kit/validate.ts +19 -326
  254. package/src/index.ts +17 -0
@@ -6,7 +6,8 @@ import { isDeepStrictEqual } from "node:util";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import { validateDefinition } from "@kontourai/flow";
8
8
  import { loadBuilderFlowRun } from "../builder-flow-run-adapter.js";
9
- import { driveBuilderFlowSession, withContinuationDriverLock } from "../continuation-driver.js";
9
+ import { parseKitFlowStepActions } from "../flow-kit/validate.js";
10
+ import { MAX_CONTINUATION_TURN_RESULT_BYTES, createFileContinuationStore, driveBuilderFlowSession, withContinuationDriverLock } from "../continuation-driver.js";
10
11
  import { inspectBuilderFlowSession, recoverBuilderFlowSession, syncBuilderFlowSession } from "../builder-flow-runtime.js";
11
12
  import { flowAgentsPackageRoot, flowAgentsPackageVersion } from "../lib/package-version.js";
12
13
  import { pinnedFlowAgentsCommand } from "../lib/pinned-cli-command.js";
@@ -87,12 +88,14 @@ async function drive(sessionDir, argv, json) {
87
88
  assertOrdinaryMatchingAssignmentActor(sessionDir, slug);
88
89
  const adapterCommand = loadContinuationAdapterCommand(adapterCommandFile);
89
90
  let evidenceSigner = null;
90
- const observedAdapterTurns = [];
91
+ let observedAdapterTurns = [];
91
92
  const result = await withContinuationDriverLock(sessionDir, async (lock) => {
92
93
  assertOrdinaryMatchingAssignmentActor(sessionDir, slug);
93
94
  evidenceSigner = evidenceSigningKeyFile ? consumeEvidenceSigningKey(evidenceSigningKeyFile) : null;
94
- return driveBuilderFlowSession({
95
+ const continuationStore = createFileContinuationStore(sessionDir);
96
+ const outcome = await driveBuilderFlowSession({
95
97
  sessionDir,
98
+ store: continuationStore,
96
99
  maxTurns,
97
100
  adapterCommandIdentity: adapterCommand.identity,
98
101
  authorizeTurn: async () => { assertOrdinaryMatchingAssignmentActor(sessionDir, slug); },
@@ -120,18 +123,14 @@ async function drive(sessionDir, argv, json) {
120
123
  continuationTurnSecret: context?.continuationTurnSecret,
121
124
  continuationRunId: context?.continuationRunId,
122
125
  }),
123
- ...(evidenceSigningKeyFile ? { onTurnAccepted: async (request, adapterResult) => {
124
- const next = [...observedAdapterTurns, {
125
- request: structuredClone(request),
126
- result: structuredClone(adapterResult),
127
- }];
128
- if (Buffer.byteLength(JSON.stringify(next), "utf8") > 1_048_576) {
129
- throw new Error("continuation accepted-turn evidence must not exceed 1048576 aggregate bytes");
130
- }
131
- observedAdapterTurns.push(next.at(-1));
126
+ ...(evidenceSigningKeyFile ? { preflightTurn: async (request) => {
127
+ assertAcceptedTurnEvidenceCapacity(attestationTurns(continuationStore.acceptedTurns()), request);
132
128
  } } : {}),
133
129
  waitForBarrier: async (barrier) => waitForContinuationBarrier(barrier, { maxWaitMs: barrierWaitMs, pollMs: barrierPollMs }),
134
130
  });
131
+ if (evidenceSigningKeyFile)
132
+ observedAdapterTurns = attestationTurns(continuationStore.acceptedTurns());
133
+ return outcome;
135
134
  });
136
135
  const output = evidenceSigner
137
136
  ? { ...result, evidence_attestation: signDriveEvidence(evidenceSigner, adapterCommand.identity, maxTurns, result, observedAdapterTurns) }
@@ -142,6 +141,21 @@ async function drive(sessionDir, argv, json) {
142
141
  console.log(`Continuation driver ${result.outcome} after ${result.turns_started} turn(s); canonical Flow is ${result.snapshot.status} at ${result.snapshot.current_step}.`);
143
142
  return 0;
144
143
  }
144
+ function attestationTurns(turns) {
145
+ const covered = turns.map((turn) => ({ request: structuredClone(turn.request), result: structuredClone(turn.result) }));
146
+ if (Buffer.byteLength(JSON.stringify(covered), "utf8") > 1_048_576) {
147
+ throw new Error("continuation accepted-turn evidence must not exceed 1048576 aggregate bytes");
148
+ }
149
+ return covered;
150
+ }
151
+ export function assertAcceptedTurnEvidenceCapacity(observedTurns, request) {
152
+ const base = [...observedTurns, { request: structuredClone(request), result: null }];
153
+ const bytesWithPlaceholder = Buffer.byteLength(JSON.stringify(base), "utf8");
154
+ const exactReservedBytes = bytesWithPlaceholder - Buffer.byteLength("null", "utf8") + MAX_CONTINUATION_TURN_RESULT_BYTES;
155
+ if (exactReservedBytes > 1_048_576) {
156
+ throw new Error("continuation accepted-turn evidence lacks capacity for another bounded result");
157
+ }
158
+ }
145
159
  function consumeEvidenceSigningKey(fileInput) {
146
160
  if (!path.isAbsolute(fileInput) || fileInput !== path.normalize(fileInput)) {
147
161
  throw new Error("workflow drive evidence signing key file must be an absolute canonical path");
@@ -326,6 +340,15 @@ async function evidence(sessionDir, argv, json) {
326
340
  if (Object.hasOwn(parsed.flags, "command") && commands.length === 0) {
327
341
  throw new Error("workflow evidence --command requires a shell command value");
328
342
  }
343
+ const expectation = flagString(parsed.flags, "expectation");
344
+ // Operation-bound expectations deliberately have no generic evidence writer.
345
+ // Check before recovery, locking, or actor resolution so a locally authored
346
+ // operation result cannot cause any canonical or projection mutation.
347
+ const inspected = await inspectBuilderFlowSession({ sessionDir });
348
+ const operation = builderOperationForExpectation(inspected.run.definitionId, expectation);
349
+ if (operation) {
350
+ throw new Error(`workflow evidence cannot satisfy operation-bound expectation ${expectation}; ${operation} requires authenticated external ChangeProvider completion`);
351
+ }
329
352
  const requiresTestEvidence = flagString(parsed.flags, "expectation") === "tests-evidence" && flagString(parsed.flags, "status") === "pass";
330
353
  // Argument and command-shape rejection must be read-only. Recovery below may
331
354
  // repair stale projections, so it runs only after every command is accepted.
@@ -374,6 +397,20 @@ async function evidence(sessionDir, argv, json) {
374
397
  : `Recorded evidence; canonical run is awaiting the remaining gate expectations at ${report.current_step}.`);
375
398
  return 0;
376
399
  }
400
+ function builderOperationForExpectation(flowId, expectationId) {
401
+ const kit = readJsonFile(path.join(PACKAGE_ROOT, "kits", "builder", "kit.json"), "Builder kit metadata");
402
+ const parsed = parseKitFlowStepActions(kit, "kits/builder/kit.json");
403
+ if (parsed.errors.length)
404
+ throw new Error(`Builder kit metadata is invalid: ${parsed.errors.join("; ")}`);
405
+ for (const action of parsed.entries) {
406
+ if (action.flow_id !== flowId)
407
+ continue;
408
+ const binding = action.expectation_bindings.find((candidate) => candidate.expectation_id === expectationId);
409
+ if (binding?.interface === "operation")
410
+ return binding.operation ?? "the declared external operation";
411
+ }
412
+ return null;
413
+ }
377
414
  async function critique(sessionDir, argv, json) {
378
415
  const parsed = parseArgs(argv);
379
416
  assertOnlyFlags(parsed.flags, new Set(["artifact-root", "session-dir", "json", "id", "verdict", "summary", "artifact-ref", "finding-json", "lane-json", "timestamp"]), "workflow critique");
@@ -1,3 +1,6 @@
1
+ import { type GateActionEnvelope, type GateActionPriorProgress, type GateActionProgressSnapshot } from "./builder-gate-action-envelope.js";
2
+ export { MAX_CONTINUATION_TURNS, createFileContinuationStore, withContinuationDriverLock } from "./continuation-persistence.js";
3
+ export { MAX_CONTINUATION_ADAPTER_EVIDENCE_BYTES, MAX_CONTINUATION_TURN_RESULT_BYTES } from "./continuation-validation.js";
1
4
  export type ContinuationBarrier = {
2
5
  kind: "pid";
3
6
  pid: number;
@@ -12,6 +15,10 @@ export type ContinuationSnapshot = {
12
15
  disposition: "continue" | "waiting" | "done" | "failed";
13
16
  current_step: string;
14
17
  next_action: Record<string, unknown> | null;
18
+ /** Additive Builder-specific execution context. Generic adapters may ignore it. */
19
+ gate_action_envelope?: GateActionEnvelope;
20
+ /** Canonical progress observation, available even when no action envelope is emitted. */
21
+ progress_snapshot?: GateActionProgressSnapshot;
15
22
  };
16
23
  export type ContinuationTurnRequest = {
17
24
  schema_version: "1.0";
@@ -21,6 +28,8 @@ export type ContinuationTurnRequest = {
21
28
  iteration: number;
22
29
  max_turns: number;
23
30
  next_action: Record<string, unknown> | null;
31
+ /** Additive schema-1.0 field; older external adapters remain valid. */
32
+ gate_action_envelope?: GateActionEnvelope;
24
33
  };
25
34
  export type ContinuationTurnResult = {
26
35
  status: "completed";
@@ -45,12 +54,20 @@ export type ContinuationDriverState = {
45
54
  turns_started: number;
46
55
  active_turn_step?: string | null;
47
56
  active_turn_public_key_digest?: string | null;
57
+ /** Durable recovery marker for an adapter turn without a post-turn measurement. */
58
+ active_turn_phase?: "prepared" | "started" | "measured" | null;
59
+ active_turn_progress?: GateActionProgressSnapshot | null;
60
+ /** Crash-recovery journal entry retained until capture and audit are durable. */
61
+ active_turn_capture?: ContinuationAcceptedTurn | null;
62
+ /** Last canonical progress observed after an adapter turn. Additive to state schema 1.0. */
63
+ last_progress?: GateActionProgressSnapshot | null;
64
+ prior_progress?: GateActionPriorProgress | null;
48
65
  pending_barrier: ContinuationBarrier | null;
49
66
  updated_at: string;
50
67
  };
51
68
  export type ContinuationDriverEvent = {
52
69
  schema_version: "1.0";
53
- type: "started" | "turn_started" | "turn_completed" | "gate_not_advanced" | "turn_failed" | "authority_cleanup_failed" | "parked" | "resumed" | "done" | "budget_exhausted";
70
+ type: "started" | "turn_started" | "turn_completed" | "turn_recovered" | "gate_not_advanced" | "turn_failed" | "authority_cleanup_failed" | "parked" | "resumed" | "done" | "budget_exhausted";
54
71
  run_id: string;
55
72
  definition_id: string;
56
73
  current_step: string;
@@ -59,12 +76,31 @@ export type ContinuationDriverEvent = {
59
76
  barrier?: ContinuationBarrier;
60
77
  summary?: string;
61
78
  failure_kind?: "adapter_error" | "timeout";
79
+ progress?: GateActionPriorProgress;
80
+ turn_id?: string;
81
+ };
82
+ export type ContinuationAcceptedTurn = {
83
+ schema_version: "1.0";
84
+ turn_id: string;
85
+ iteration: number;
86
+ request: ContinuationTurnRequest;
87
+ result: ContinuationTurnResult;
88
+ progress: GateActionPriorProgress | null;
89
+ captured_at: string;
62
90
  };
63
91
  export interface ContinuationStateStore {
64
92
  load(): ContinuationDriverState | null;
65
93
  save(state: ContinuationDriverState): void;
66
94
  append(event: ContinuationDriverEvent): void;
67
95
  }
96
+ /**
97
+ * Optional durable accepted-turn journal. Kept separate so existing stores that
98
+ * only implement load/save/append remain valid continuation drivers.
99
+ */
100
+ export interface ContinuationAcceptedTurnJournal {
101
+ captureAcceptedTurn(turn: ContinuationAcceptedTurn): void;
102
+ acceptedTurns(): ContinuationAcceptedTurn[];
103
+ }
68
104
  export interface ContinuationRuntimePort {
69
105
  inspect(): Promise<ContinuationSnapshot>;
70
106
  synchronize(): Promise<ContinuationSnapshot>;
@@ -99,6 +135,7 @@ export interface RunContinuationDriverInput {
99
135
  waitForBarrier?: (barrier: ContinuationBarrier) => Promise<"ready" | "pending">;
100
136
  authorizeTurn?: () => Promise<void>;
101
137
  issueTurnAuthority?: (request: ContinuationTurnRequest) => Promise<ContinuationTurnAuthority>;
138
+ preflightTurn?: (request: ContinuationTurnRequest) => void | Promise<void>;
102
139
  onTurnAccepted?: (request: ContinuationTurnRequest, result: ContinuationTurnResult) => void | Promise<void>;
103
140
  now?: () => Date;
104
141
  }
@@ -110,10 +147,10 @@ export interface DriveBuilderFlowSessionInput {
110
147
  waitForBarrier?: RunContinuationDriverInput["waitForBarrier"];
111
148
  authorizeTurn?: RunContinuationDriverInput["authorizeTurn"];
112
149
  issueTurnAuthority?: RunContinuationDriverInput["issueTurnAuthority"];
150
+ preflightTurn?: RunContinuationDriverInput["preflightTurn"];
113
151
  onTurnAccepted?: RunContinuationDriverInput["onTurnAccepted"];
114
152
  now?: () => Date;
153
+ store?: ContinuationStateStore;
115
154
  }
116
155
  export declare function runContinuationDriver(input: RunContinuationDriverInput): Promise<ContinuationDriverOutcome>;
117
156
  export declare function driveBuilderFlowSession(input: DriveBuilderFlowSessionInput): Promise<ContinuationDriverOutcome>;
118
- export declare function withContinuationDriverLock<T>(sessionDirInput: string, body: (lease: ContinuationDriverLockLease) => Promise<T>): Promise<T>;
119
- export declare function createFileContinuationStore(sessionDirInput: string): ContinuationStateStore;