@stigmer/runner 3.15.0 → 3.15.2-dev.20260913223433

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 (518) hide show
  1. package/README.md +2 -4
  2. package/dist/.build-fingerprint +1 -1
  3. package/dist/__test-utils__/execution-record-fixture.d.ts +14 -0
  4. package/dist/__test-utils__/execution-record-fixture.js +4 -0
  5. package/dist/__test-utils__/execution-record-fixture.js.map +1 -1
  6. package/dist/__test-utils__/file-review-projection.d.ts +40 -0
  7. package/dist/__test-utils__/file-review-projection.js +136 -0
  8. package/dist/__test-utils__/file-review-projection.js.map +1 -0
  9. package/dist/__test-utils__/harness-contract/types.d.ts +23 -1
  10. package/dist/__test-utils__/harness-contract/types.js +15 -0
  11. package/dist/__test-utils__/harness-contract/types.js.map +1 -1
  12. package/dist/__test-utils__/hermetic-activity.d.ts +44 -12
  13. package/dist/__test-utils__/hermetic-activity.js +52 -14
  14. package/dist/__test-utils__/hermetic-activity.js.map +1 -1
  15. package/dist/__test-utils__/model-registry-fixture.d.ts +32 -7
  16. package/dist/__test-utils__/model-registry-fixture.js +31 -7
  17. package/dist/__test-utils__/model-registry-fixture.js.map +1 -1
  18. package/dist/__test-utils__/turn-input-fixture.d.ts +1 -1
  19. package/dist/__test-utils__/turn-input-fixture.js +1 -1
  20. package/dist/__test-utils__/turn-input-fixture.js.map +1 -1
  21. package/dist/activities/call-agent.js +2 -2
  22. package/dist/activities/call-agent.js.map +1 -1
  23. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +45 -3
  24. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -1
  25. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +0 -9
  26. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +2 -41
  27. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
  28. package/dist/activities/execute-cursor/adapter.d.ts +7 -5
  29. package/dist/activities/execute-cursor/adapter.js +7 -5
  30. package/dist/activities/execute-cursor/adapter.js.map +1 -1
  31. package/dist/activities/execute-cursor/approval-policy.d.ts +5 -2
  32. package/dist/activities/execute-cursor/approval-policy.js +5 -2
  33. package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
  34. package/dist/activities/execute-cursor/approval-state.d.ts +16 -8
  35. package/dist/activities/execute-cursor/approval-state.js +6 -3
  36. package/dist/activities/execute-cursor/approval-state.js.map +1 -1
  37. package/dist/activities/execute-cursor/cas-observations.d.ts +14 -2
  38. package/dist/activities/execute-cursor/cas-observations.js +19 -2
  39. package/dist/activities/execute-cursor/cas-observations.js.map +1 -1
  40. package/dist/activities/execute-cursor/cursor-capabilities.d.ts +8 -4
  41. package/dist/activities/execute-cursor/cursor-capabilities.js +21 -4
  42. package/dist/activities/execute-cursor/cursor-capabilities.js.map +1 -1
  43. package/dist/activities/execute-cursor/message-translator.d.ts +12 -20
  44. package/dist/activities/execute-cursor/message-translator.js +19 -32
  45. package/dist/activities/execute-cursor/message-translator.js.map +1 -1
  46. package/dist/activities/execute-cursor/prompt-builder.d.ts +48 -58
  47. package/dist/activities/execute-cursor/prompt-builder.js +76 -95
  48. package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
  49. package/dist/activities/execute-cursor/turn-boundary.d.ts +27 -55
  50. package/dist/activities/execute-cursor/turn-boundary.js +30 -90
  51. package/dist/activities/execute-cursor/turn-boundary.js.map +1 -1
  52. package/dist/activities/execute-cursor/turn-settle.d.ts +11 -7
  53. package/dist/activities/execute-cursor/turn-settle.js +37 -49
  54. package/dist/activities/execute-cursor/turn-settle.js.map +1 -1
  55. package/dist/activities/execute-cursor/turn-setup.d.ts +16 -24
  56. package/dist/activities/execute-cursor/turn-setup.js +29 -59
  57. package/dist/activities/execute-cursor/turn-setup.js.map +1 -1
  58. package/dist/activities/execute-cursor/turn-stream.d.ts +3 -8
  59. package/dist/activities/execute-cursor/turn-stream.js +9 -22
  60. package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
  61. package/dist/activities/execute-cursor/turn.js +5 -1
  62. package/dist/activities/execute-cursor/turn.js.map +1 -1
  63. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.d.ts +93 -0
  64. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js +348 -0
  65. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js.map +1 -0
  66. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +170 -0
  67. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +225 -0
  68. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -0
  69. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.d.ts +24 -0
  70. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js +41 -0
  71. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js.map +1 -0
  72. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.d.ts +54 -0
  73. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js +72 -0
  74. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js.map +1 -0
  75. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +187 -23
  76. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +238 -27
  77. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
  78. package/dist/activities/execute-deep-agent/adapter.d.ts +41 -0
  79. package/dist/activities/execute-deep-agent/adapter.js +78 -0
  80. package/dist/activities/execute-deep-agent/adapter.js.map +1 -0
  81. package/dist/activities/execute-deep-agent/cas-capture-observer.d.ts +8 -0
  82. package/dist/activities/execute-deep-agent/cas-capture-observer.js +9 -0
  83. package/dist/activities/execute-deep-agent/cas-capture-observer.js.map +1 -1
  84. package/dist/activities/execute-deep-agent/deep-agent-capabilities.d.ts +31 -0
  85. package/dist/activities/execute-deep-agent/deep-agent-capabilities.js +40 -0
  86. package/dist/activities/execute-deep-agent/deep-agent-capabilities.js.map +1 -0
  87. package/dist/activities/execute-deep-agent/execution-state.d.ts +4 -11
  88. package/dist/activities/execute-deep-agent/execution-state.js +4 -12
  89. package/dist/activities/execute-deep-agent/execution-state.js.map +1 -1
  90. package/dist/activities/execute-deep-agent/hitl.d.ts +49 -47
  91. package/dist/activities/execute-deep-agent/hitl.js +77 -103
  92. package/dist/activities/execute-deep-agent/hitl.js.map +1 -1
  93. package/dist/activities/execute-deep-agent/prompt-builder.d.ts +51 -23
  94. package/dist/activities/execute-deep-agent/prompt-builder.js +115 -76
  95. package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
  96. package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +18 -32
  97. package/dist/activities/execute-deep-agent/status-builder-shared.js +10 -65
  98. package/dist/activities/execute-deep-agent/status-builder-shared.js.map +1 -1
  99. package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +10 -8
  100. package/dist/activities/execute-deep-agent/streaming-side-effects.js +12 -14
  101. package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
  102. package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +36 -13
  103. package/dist/activities/execute-deep-agent/subagent-tracker.js +76 -39
  104. package/dist/activities/execute-deep-agent/subagent-tracker.js.map +1 -1
  105. package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +25 -28
  106. package/dist/activities/execute-deep-agent/subagent-transformer.js +29 -82
  107. package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
  108. package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +3 -2
  109. package/dist/activities/execute-deep-agent/subagent-wiring.js +2 -2
  110. package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -1
  111. package/dist/activities/execute-deep-agent/turn-settle.d.ts +42 -0
  112. package/dist/activities/execute-deep-agent/turn-settle.js +146 -0
  113. package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -0
  114. package/dist/activities/execute-deep-agent/turn-setup.d.ts +212 -0
  115. package/dist/activities/execute-deep-agent/turn-setup.js +430 -0
  116. package/dist/activities/execute-deep-agent/turn-setup.js.map +1 -0
  117. package/dist/activities/execute-deep-agent/turn-stream.d.ts +97 -0
  118. package/dist/activities/execute-deep-agent/turn-stream.js +242 -0
  119. package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -0
  120. package/dist/activities/execute-deep-agent/turn.d.ts +42 -0
  121. package/dist/activities/execute-deep-agent/turn.js +116 -0
  122. package/dist/activities/execute-deep-agent/turn.js.map +1 -0
  123. package/dist/activities/execute-deep-agent/v3-event-recorder.d.ts +6 -5
  124. package/dist/activities/execute-deep-agent/v3-event-recorder.js +6 -5
  125. package/dist/activities/execute-deep-agent/v3-event-recorder.js.map +1 -1
  126. package/dist/activities/execute-deep-agent/v3-events.d.ts +1 -1
  127. package/dist/activities/execute-deep-agent/v3-events.js +1 -1
  128. package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +60 -17
  129. package/dist/activities/execute-deep-agent/v3-status-builder.js +72 -57
  130. package/dist/activities/execute-deep-agent/v3-status-builder.js.map +1 -1
  131. package/dist/harness/approval-decisions.d.ts +61 -0
  132. package/dist/harness/approval-decisions.js +102 -0
  133. package/dist/harness/approval-decisions.js.map +1 -0
  134. package/dist/harness/capabilities.d.ts +16 -5
  135. package/dist/harness/capabilities.js +9 -0
  136. package/dist/harness/capabilities.js.map +1 -1
  137. package/dist/harness/capture.d.ts +144 -0
  138. package/dist/harness/capture.js +219 -0
  139. package/dist/harness/capture.js.map +1 -0
  140. package/dist/harness/persist-chokepoint.d.ts +19 -4
  141. package/dist/harness/persist-chokepoint.js +17 -4
  142. package/dist/harness/persist-chokepoint.js.map +1 -1
  143. package/dist/harness/run-turn.js +115 -29
  144. package/dist/harness/run-turn.js.map +1 -1
  145. package/dist/harness/terminal-table.d.ts +40 -11
  146. package/dist/harness/terminal-table.js +58 -19
  147. package/dist/harness/terminal-table.js.map +1 -1
  148. package/dist/harness/turn-context.d.ts +141 -76
  149. package/dist/harness/turn-context.js +194 -99
  150. package/dist/harness/turn-context.js.map +1 -1
  151. package/dist/harness/types.d.ts +65 -12
  152. package/dist/harness/types.js +8 -2
  153. package/dist/harness/types.js.map +1 -1
  154. package/dist/harness-adapters.d.ts +12 -8
  155. package/dist/harness-adapters.js +17 -9
  156. package/dist/harness-adapters.js.map +1 -1
  157. package/dist/middleware/approval-gate.d.ts +1 -1
  158. package/dist/middleware/approval-gate.js +1 -1
  159. package/dist/middleware/approval-gate.js.map +1 -1
  160. package/dist/middleware/cost-advisory.d.ts +39 -0
  161. package/dist/middleware/{cost-cap.js → cost-advisory.js} +37 -55
  162. package/dist/middleware/cost-advisory.js.map +1 -0
  163. package/dist/middleware/index.d.ts +23 -12
  164. package/dist/middleware/index.js +26 -18
  165. package/dist/middleware/index.js.map +1 -1
  166. package/dist/middleware/types.d.ts +3 -2
  167. package/dist/runner-manager.js +1 -5
  168. package/dist/runner-manager.js.map +1 -1
  169. package/dist/runner.js +1 -5
  170. package/dist/runner.js.map +1 -1
  171. package/dist/shared/attachment-resolver.d.ts +41 -18
  172. package/dist/shared/attachment-resolver.js +178 -46
  173. package/dist/shared/attachment-resolver.js.map +1 -1
  174. package/dist/shared/attachment-zip.d.ts +85 -0
  175. package/dist/shared/attachment-zip.js +185 -0
  176. package/dist/shared/attachment-zip.js.map +1 -0
  177. package/dist/shared/connect-backfill.js +5 -4
  178. package/dist/shared/connect-backfill.js.map +1 -1
  179. package/dist/shared/cost-guard.d.ts +3 -3
  180. package/dist/shared/cost-guard.js +3 -3
  181. package/dist/shared/execution-status-writer.d.ts +5 -5
  182. package/dist/shared/execution-status-writer.js +5 -5
  183. package/dist/shared/extract-structured-output.d.ts +8 -7
  184. package/dist/shared/extract-structured-output.js +8 -7
  185. package/dist/shared/extract-structured-output.js.map +1 -1
  186. package/dist/shared/filereview/cas-progress.d.ts +1 -18
  187. package/dist/shared/filereview/cas-progress.js +4 -0
  188. package/dist/shared/filereview/cas-progress.js.map +1 -1
  189. package/dist/shared/filereview/cas-touched.d.ts +56 -0
  190. package/dist/shared/filereview/cas-touched.js +63 -0
  191. package/dist/shared/filereview/cas-touched.js.map +1 -0
  192. package/dist/shared/filereview/index.d.ts +2 -1
  193. package/dist/shared/filereview/index.js +2 -1
  194. package/dist/shared/filereview/index.js.map +1 -1
  195. package/dist/shared/mcp-resolver.d.ts +4 -5
  196. package/dist/shared/mcp-resolver.js +4 -5
  197. package/dist/shared/mcp-resolver.js.map +1 -1
  198. package/dist/shared/persist-decision.d.ts +3 -4
  199. package/dist/shared/persist-decision.js +3 -4
  200. package/dist/shared/persist-decision.js.map +1 -1
  201. package/dist/shared/plan-mode-permissions.d.ts +2 -2
  202. package/dist/shared/plan-mode-permissions.js +2 -2
  203. package/dist/shared/plan-mode-prompt.d.ts +1 -1
  204. package/dist/shared/plan-mode-prompt.js +1 -1
  205. package/dist/shared/prompt-sections.d.ts +163 -0
  206. package/dist/shared/prompt-sections.js +164 -0
  207. package/dist/shared/prompt-sections.js.map +1 -0
  208. package/dist/shared/skill-resolver.d.ts +4 -2
  209. package/dist/shared/skill-resolver.js +4 -2
  210. package/dist/shared/skill-resolver.js.map +1 -1
  211. package/dist/shared/tool-rounds.d.ts +32 -0
  212. package/dist/shared/tool-rounds.js +43 -0
  213. package/dist/shared/tool-rounds.js.map +1 -1
  214. package/dist/shared/tool-row.d.ts +34 -0
  215. package/dist/shared/tool-row.js +52 -0
  216. package/dist/shared/tool-row.js.map +1 -1
  217. package/dist/shared/workspace/session-provision.d.ts +3 -3
  218. package/dist/shared/workspace/session-provision.js +3 -3
  219. package/dist/shared/workspace/stigmer-link.d.ts +3 -3
  220. package/dist/shared/workspace/stigmer-link.js +3 -3
  221. package/dist/shared/workspace/writeback-coordinator.d.ts +15 -22
  222. package/dist/shared/workspace/writeback-coordinator.js +16 -53
  223. package/dist/shared/workspace/writeback-coordinator.js.map +1 -1
  224. package/dist/tools/index.d.ts +1 -1
  225. package/dist/tools/index.js +1 -1
  226. package/package.json +4 -4
  227. package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +1 -0
  228. package/src/__test-utils__/execution-record-fixture.ts +18 -2
  229. package/src/__test-utils__/file-review-projection.ts +156 -0
  230. package/src/__test-utils__/git-workspace-fixture.ts +58 -0
  231. package/src/__test-utils__/harness-boot-order-child.ts +7 -2
  232. package/src/__test-utils__/harness-contract/contract.ts +33 -20
  233. package/src/__test-utils__/harness-contract/recording-sink.ts +11 -1
  234. package/src/__test-utils__/harness-contract/runtime-contract.ts +328 -10
  235. package/src/__test-utils__/harness-contract/scripted-adapter.ts +38 -6
  236. package/src/__test-utils__/harness-contract/types.ts +27 -3
  237. package/src/__test-utils__/hermetic-activity.ts +52 -14
  238. package/src/__test-utils__/model-registry-fixture.ts +32 -7
  239. package/src/__test-utils__/module-specifiers.ts +24 -0
  240. package/src/__test-utils__/turn-input-fixture.ts +2 -2
  241. package/src/__tests__/harness-boot-order.test.ts +9 -2
  242. package/src/activities/call-agent.ts +2 -2
  243. package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +47 -3
  244. package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +2 -48
  245. package/src/activities/execute-cursor/__tests__/approval-decisions-agree.test.ts +1 -1
  246. package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +6 -1
  247. package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +52 -27
  248. package/src/activities/execute-cursor/__tests__/cas-observations.test.ts +25 -0
  249. package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.everything.prompt.md +166 -0
  250. package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.plan-mode.prompt.md +186 -0
  251. package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.recovery.prompt.md +191 -0
  252. package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.reinvocation.prompt.md +13 -0
  253. package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.prefixed.prompt.md +32 -0
  254. package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.raw.prompt.md +1 -0
  255. package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +1 -2
  256. package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-error-at-create.status.json +4 -0
  257. package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +24 -4
  258. package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +6 -5
  259. package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +9 -0
  260. package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +11 -8
  261. package/src/activities/execute-cursor/__tests__/prompt-goldens.test.ts +229 -0
  262. package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +3 -3
  263. package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +2 -2
  264. package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +78 -234
  265. package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +1 -26
  266. package/src/activities/execute-cursor/adapter.ts +7 -5
  267. package/src/activities/execute-cursor/approval-policy.ts +5 -2
  268. package/src/activities/execute-cursor/approval-state.ts +16 -8
  269. package/src/activities/execute-cursor/cas-observations.ts +20 -2
  270. package/src/activities/execute-cursor/cursor-capabilities.ts +24 -5
  271. package/src/activities/execute-cursor/message-translator.ts +29 -41
  272. package/src/activities/execute-cursor/prompt-builder.ts +99 -157
  273. package/src/activities/execute-cursor/turn-boundary.ts +34 -140
  274. package/src/activities/execute-cursor/turn-settle.ts +37 -51
  275. package/src/activities/execute-cursor/turn-setup.ts +30 -70
  276. package/src/activities/execute-cursor/turn-stream.ts +8 -31
  277. package/src/activities/execute-cursor/turn.ts +5 -1
  278. package/src/activities/execute-deep-agent/__test-utils__/contract-subject.ts +391 -0
  279. package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +313 -0
  280. package/src/activities/execute-deep-agent/__test-utils__/hitl-script.ts +48 -0
  281. package/src/activities/execute-deep-agent/__test-utils__/scripted-model-module.ts +85 -0
  282. package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +383 -36
  283. package/src/activities/execute-deep-agent/__tests__/adapter-graph-is-sdk-free.test.ts +76 -0
  284. package/src/activities/execute-deep-agent/__tests__/adapter-is-temporal-free.test.ts +47 -0
  285. package/src/activities/execute-deep-agent/__tests__/adapter.test.ts +80 -0
  286. package/src/activities/execute-deep-agent/__tests__/cas-capture-backend.test.ts +1 -1
  287. package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +0 -2
  288. package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +0 -3
  289. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.build-from-plan.prompt.md +172 -0
  290. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.everything.prompt.md +167 -0
  291. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.minimal.prompt.md +36 -0
  292. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.plan-mode.prompt.md +178 -0
  293. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.skills-below-threshold.prompt.md +158 -0
  294. package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +210 -0
  295. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn1.status.json +74 -0
  296. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn2.status.json +104 -0
  297. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve.turn2.status.json +78 -0
  298. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +138 -0
  299. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/gate.turn1.status.json +68 -0
  300. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +154 -0
  301. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +116 -0
  302. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.after-tool.status.json +69 -0
  303. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.mid-tool.status.json +67 -0
  304. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/plain-turn.status.json +47 -0
  305. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/platform-stop.status.json +68 -0
  306. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +280 -0
  307. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/reject.turn2.status.json +77 -0
  308. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/resolution-error.status.json +18 -0
  309. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn2.status.json +99 -0
  310. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn3.status.json +109 -0
  311. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/skip.turn2.status.json +76 -0
  312. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.text-fallback.status.json +51 -0
  313. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tier2.status.json +51 -0
  314. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tool-strategy.status.json +56 -0
  315. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sub-agent-delegation.status.json +90 -0
  316. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/tool-call.status.json +70 -0
  317. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/worker-shutdown.status.json +71 -0
  318. package/src/activities/execute-deep-agent/__tests__/hermetic/harness-contract.test.ts +144 -0
  319. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-approve-all-lease.test.ts +184 -0
  320. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-round-trips.test.ts +203 -0
  321. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-sequential-gates.test.ts +170 -0
  322. package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +175 -0
  323. package/src/activities/execute-deep-agent/__tests__/hermetic/pause-vs-shutdown.test.ts +206 -0
  324. package/src/activities/execute-deep-agent/__tests__/hermetic/plain-turn.test.ts +142 -0
  325. package/src/activities/execute-deep-agent/__tests__/hermetic/platform-stop.test.ts +126 -0
  326. package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +139 -0
  327. package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +122 -0
  328. package/src/activities/execute-deep-agent/__tests__/hermetic/structured-output.test.ts +236 -0
  329. package/src/activities/execute-deep-agent/__tests__/hermetic/sub-agent-delegation.test.ts +161 -0
  330. package/src/activities/execute-deep-agent/__tests__/hermetic/tool-call.test.ts +157 -0
  331. package/src/activities/execute-deep-agent/__tests__/hermetic/workspace-lock-timeout.test.ts +152 -0
  332. package/src/activities/execute-deep-agent/__tests__/hitl.test.ts +50 -122
  333. package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +8 -6
  334. package/src/activities/execute-deep-agent/__tests__/plan-mode-path-normalization.test.ts +2 -2
  335. package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +35 -35
  336. package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +247 -0
  337. package/src/activities/execute-deep-agent/__tests__/scripted-model.test.ts +329 -0
  338. package/src/activities/execute-deep-agent/__tests__/status-builder-shared.test.ts +1 -20
  339. package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +78 -0
  340. package/src/activities/execute-deep-agent/__tests__/subagent-gitignored-capture.test.ts +1 -1
  341. package/src/activities/execute-deep-agent/__tests__/subagent-plan-mode-permissions.test.ts +2 -2
  342. package/src/activities/execute-deep-agent/__tests__/subagent-tracker.test.ts +57 -31
  343. package/src/activities/execute-deep-agent/__tests__/subagent-transformer.test.ts +19 -79
  344. package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +15 -15
  345. package/src/activities/execute-deep-agent/__tests__/summarization-verification.test.ts +1 -1
  346. package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +391 -0
  347. package/src/activities/execute-deep-agent/__tests__/v3-status-builder.test.ts +343 -38
  348. package/src/activities/execute-deep-agent/__tests__/vision-input.test.ts +5 -5
  349. package/src/activities/execute-deep-agent/adapter.ts +94 -0
  350. package/src/activities/execute-deep-agent/cas-capture-observer.ts +11 -0
  351. package/src/activities/execute-deep-agent/deep-agent-capabilities.ts +43 -0
  352. package/src/activities/execute-deep-agent/execution-state.ts +4 -13
  353. package/src/activities/execute-deep-agent/hitl.ts +100 -123
  354. package/src/activities/execute-deep-agent/prompt-builder.ts +141 -115
  355. package/src/activities/execute-deep-agent/status-builder-shared.ts +21 -84
  356. package/src/activities/execute-deep-agent/streaming-side-effects.ts +13 -19
  357. package/src/activities/execute-deep-agent/subagent-tracker.ts +77 -42
  358. package/src/activities/execute-deep-agent/subagent-transformer.ts +46 -105
  359. package/src/activities/execute-deep-agent/subagent-wiring.ts +5 -4
  360. package/src/activities/execute-deep-agent/turn-settle.ts +164 -0
  361. package/src/activities/execute-deep-agent/turn-setup.ts +541 -0
  362. package/src/activities/execute-deep-agent/turn-stream.ts +313 -0
  363. package/src/activities/execute-deep-agent/turn.ts +131 -0
  364. package/src/activities/execute-deep-agent/v3-event-recorder.ts +6 -5
  365. package/src/activities/execute-deep-agent/v3-events.ts +1 -1
  366. package/src/activities/execute-deep-agent/v3-status-builder.ts +84 -63
  367. package/src/harness/__tests__/approval-decisions.test.ts +116 -0
  368. package/src/harness/__tests__/capture.test.ts +268 -0
  369. package/src/harness/__tests__/mount-skills.test.ts +169 -0
  370. package/src/harness/__tests__/persist-chokepoint.test.ts +38 -2
  371. package/src/harness/__tests__/run-turn-deterministic.test.ts +94 -0
  372. package/src/harness/__tests__/run-turn.test.ts +39 -23
  373. package/src/harness/__tests__/turn-attachments-vision.test.ts +80 -0
  374. package/src/harness/__tests__/turn-context.test.ts +73 -26
  375. package/src/harness/approval-decisions.ts +104 -0
  376. package/src/harness/capabilities.ts +16 -5
  377. package/src/harness/capture.ts +301 -0
  378. package/src/harness/persist-chokepoint.ts +24 -4
  379. package/src/harness/run-turn.ts +120 -29
  380. package/src/harness/terminal-table.ts +61 -20
  381. package/src/harness/turn-context.ts +208 -111
  382. package/src/harness/types.ts +66 -12
  383. package/src/harness-adapters.ts +17 -9
  384. package/src/middleware/__tests__/approval-gate.test.ts +1 -1
  385. package/src/middleware/__tests__/cost-advisory.test.ts +113 -0
  386. package/src/middleware/approval-gate.ts +2 -2
  387. package/src/middleware/{cost-cap.ts → cost-advisory.ts} +40 -70
  388. package/src/middleware/index.ts +29 -29
  389. package/src/middleware/types.ts +3 -2
  390. package/src/runner-manager.ts +0 -8
  391. package/src/runner.ts +0 -8
  392. package/src/shared/__tests__/attachment-naming.test.ts +6 -19
  393. package/src/shared/__tests__/attachment-resolver.test.ts +158 -8
  394. package/src/shared/__tests__/attachment-zip.test.ts +236 -0
  395. package/src/shared/__tests__/bedrock-adapter.test.ts +1 -1
  396. package/src/shared/__tests__/blueprint-resolver.test.ts +43 -0
  397. package/src/shared/__tests__/cost-guard.test.ts +3 -3
  398. package/src/shared/__tests__/prompt-sections.test.ts +167 -0
  399. package/src/shared/__tests__/secret-leak-scan.test.ts +2 -2
  400. package/src/{activities/execute-deep-agent → shared}/__tests__/stamp-flowed-rows.test.ts +33 -10
  401. package/src/shared/__tests__/vertex-adapter.test.ts +1 -1
  402. package/src/shared/attachment-resolver.ts +218 -55
  403. package/src/shared/attachment-zip.ts +281 -0
  404. package/src/shared/connect-backfill.ts +9 -11
  405. package/src/shared/cost-guard.ts +3 -3
  406. package/src/shared/execution-status-writer.ts +5 -5
  407. package/src/shared/extract-structured-output.ts +8 -7
  408. package/src/shared/filereview/__tests__/capture.test.ts +86 -4
  409. package/src/shared/filereview/__tests__/cas-progress.test.ts +2 -1
  410. package/src/shared/filereview/cas-progress.ts +5 -19
  411. package/src/shared/filereview/cas-touched.ts +89 -0
  412. package/src/shared/filereview/index.ts +4 -2
  413. package/src/shared/mcp-resolver.ts +4 -5
  414. package/src/shared/persist-decision.ts +3 -4
  415. package/src/shared/plan-mode-permissions.ts +2 -2
  416. package/src/shared/plan-mode-prompt.ts +1 -1
  417. package/src/shared/prompt-sections.ts +256 -0
  418. package/src/shared/skill-resolver.ts +4 -2
  419. package/src/shared/tool-rounds.ts +48 -0
  420. package/src/shared/tool-row.ts +61 -0
  421. package/src/shared/workspace/__tests__/stigmer-link.test.ts +7 -22
  422. package/src/shared/workspace/__tests__/writeback-coordinator.test.ts +20 -61
  423. package/src/shared/workspace/session-provision.ts +3 -3
  424. package/src/shared/workspace/stigmer-link.ts +3 -3
  425. package/src/shared/workspace/writeback-coordinator.ts +16 -64
  426. package/src/tools/index.ts +1 -1
  427. package/dist/activities/execute-cursor/capture-flow.d.ts +0 -142
  428. package/dist/activities/execute-cursor/capture-flow.js +0 -285
  429. package/dist/activities/execute-cursor/capture-flow.js.map +0 -1
  430. package/dist/activities/execute-cursor/command-provenance.d.ts +0 -48
  431. package/dist/activities/execute-cursor/command-provenance.js +0 -38
  432. package/dist/activities/execute-cursor/command-provenance.js.map +0 -1
  433. package/dist/activities/execute-deep-agent/attachment-injector.d.ts +0 -134
  434. package/dist/activities/execute-deep-agent/attachment-injector.js +0 -386
  435. package/dist/activities/execute-deep-agent/attachment-injector.js.map +0 -1
  436. package/dist/activities/execute-deep-agent/command-provenance.d.ts +0 -61
  437. package/dist/activities/execute-deep-agent/command-provenance.js +0 -72
  438. package/dist/activities/execute-deep-agent/command-provenance.js.map +0 -1
  439. package/dist/activities/execute-deep-agent/environment.d.ts +0 -24
  440. package/dist/activities/execute-deep-agent/environment.js +0 -58
  441. package/dist/activities/execute-deep-agent/environment.js.map +0 -1
  442. package/dist/activities/execute-deep-agent/event-recorder.d.ts +0 -21
  443. package/dist/activities/execute-deep-agent/event-recorder.js +0 -67
  444. package/dist/activities/execute-deep-agent/event-recorder.js.map +0 -1
  445. package/dist/activities/execute-deep-agent/index.d.ts +0 -15
  446. package/dist/activities/execute-deep-agent/index.js +0 -918
  447. package/dist/activities/execute-deep-agent/index.js.map +0 -1
  448. package/dist/activities/execute-deep-agent/mcp-gate.d.ts +0 -28
  449. package/dist/activities/execute-deep-agent/mcp-gate.js +0 -22
  450. package/dist/activities/execute-deep-agent/mcp-gate.js.map +0 -1
  451. package/dist/activities/execute-deep-agent/post-stream.d.ts +0 -23
  452. package/dist/activities/execute-deep-agent/post-stream.js +0 -71
  453. package/dist/activities/execute-deep-agent/post-stream.js.map +0 -1
  454. package/dist/activities/execute-deep-agent/setup.d.ts +0 -136
  455. package/dist/activities/execute-deep-agent/setup.js +0 -767
  456. package/dist/activities/execute-deep-agent/setup.js.map +0 -1
  457. package/dist/activities/execute-deep-agent/stamp-flowed-rows.d.ts +0 -36
  458. package/dist/activities/execute-deep-agent/stamp-flowed-rows.js +0 -56
  459. package/dist/activities/execute-deep-agent/stamp-flowed-rows.js.map +0 -1
  460. package/dist/activities/execute-deep-agent/status-builder.d.ts +0 -93
  461. package/dist/activities/execute-deep-agent/status-builder.js +0 -365
  462. package/dist/activities/execute-deep-agent/status-builder.js.map +0 -1
  463. package/dist/activities/execute-deep-agent/streaming-terminal.d.ts +0 -21
  464. package/dist/activities/execute-deep-agent/streaming-terminal.js +0 -80
  465. package/dist/activities/execute-deep-agent/streaming-terminal.js.map +0 -1
  466. package/dist/activities/execute-deep-agent/streaming-v3.d.ts +0 -13
  467. package/dist/activities/execute-deep-agent/streaming-v3.js +0 -174
  468. package/dist/activities/execute-deep-agent/streaming-v3.js.map +0 -1
  469. package/dist/activities/execute-deep-agent/streaming.d.ts +0 -81
  470. package/dist/activities/execute-deep-agent/streaming.js +0 -160
  471. package/dist/activities/execute-deep-agent/streaming.js.map +0 -1
  472. package/dist/middleware/cost-cap.d.ts +0 -22
  473. package/dist/middleware/cost-cap.js.map +0 -1
  474. package/dist/middleware/graceful-stop.d.ts +0 -17
  475. package/dist/middleware/graceful-stop.js +0 -63
  476. package/dist/middleware/graceful-stop.js.map +0 -1
  477. package/dist/shared/skill-writer.d.ts +0 -75
  478. package/dist/shared/skill-writer.js +0 -207
  479. package/dist/shared/skill-writer.js.map +0 -1
  480. package/src/activities/execute-cursor/__tests__/capture-flow.test.ts +0 -1032
  481. package/src/activities/execute-cursor/__tests__/command-provenance.test.ts +0 -240
  482. package/src/activities/execute-cursor/__tests__/progress-substrate.test.ts +0 -169
  483. package/src/activities/execute-cursor/capture-flow.ts +0 -379
  484. package/src/activities/execute-cursor/command-provenance.ts +0 -73
  485. package/src/activities/execute-deep-agent/__tests__/attachment-injector.test.ts +0 -1161
  486. package/src/activities/execute-deep-agent/__tests__/command-provenance.test.ts +0 -252
  487. package/src/activities/execute-deep-agent/__tests__/environment.test.ts +0 -108
  488. package/src/activities/execute-deep-agent/__tests__/event-recorder.test.ts +0 -150
  489. package/src/activities/execute-deep-agent/__tests__/hitl-integration.test.ts +0 -226
  490. package/src/activities/execute-deep-agent/__tests__/hitl-reject.test.ts +0 -318
  491. package/src/activities/execute-deep-agent/__tests__/hitl-resume-approve-all.test.ts +0 -351
  492. package/src/activities/execute-deep-agent/__tests__/hitl-resume-history.test.ts +0 -293
  493. package/src/activities/execute-deep-agent/__tests__/index.test.ts +0 -99
  494. package/src/activities/execute-deep-agent/__tests__/mcp-gate.test.ts +0 -44
  495. package/src/activities/execute-deep-agent/__tests__/post-stream.test.ts +0 -112
  496. package/src/activities/execute-deep-agent/__tests__/sequential-gate-resume.test.ts +0 -358
  497. package/src/activities/execute-deep-agent/__tests__/status-builder.test.ts +0 -1933
  498. package/src/activities/execute-deep-agent/__tests__/streaming-terminal.test.ts +0 -40
  499. package/src/activities/execute-deep-agent/__tests__/streaming-v3.test.ts +0 -597
  500. package/src/activities/execute-deep-agent/__tests__/streaming.test.ts +0 -508
  501. package/src/activities/execute-deep-agent/attachment-injector.ts +0 -627
  502. package/src/activities/execute-deep-agent/command-provenance.ts +0 -102
  503. package/src/activities/execute-deep-agent/environment.ts +0 -76
  504. package/src/activities/execute-deep-agent/event-recorder.ts +0 -95
  505. package/src/activities/execute-deep-agent/index.ts +0 -1072
  506. package/src/activities/execute-deep-agent/mcp-gate.ts +0 -37
  507. package/src/activities/execute-deep-agent/post-stream.ts +0 -109
  508. package/src/activities/execute-deep-agent/setup.ts +0 -1081
  509. package/src/activities/execute-deep-agent/stamp-flowed-rows.ts +0 -64
  510. package/src/activities/execute-deep-agent/status-builder.ts +0 -481
  511. package/src/activities/execute-deep-agent/streaming-terminal.ts +0 -106
  512. package/src/activities/execute-deep-agent/streaming-v3.ts +0 -277
  513. package/src/activities/execute-deep-agent/streaming.ts +0 -313
  514. package/src/middleware/__tests__/cost-cap.test.ts +0 -192
  515. package/src/middleware/__tests__/graceful-stop.test.ts +0 -105
  516. package/src/middleware/graceful-stop.ts +0 -86
  517. package/src/shared/__tests__/skill-writer.test.ts +0 -372
  518. package/src/shared/skill-writer.ts +0 -266
@@ -1,35 +1,37 @@
1
1
  /**
2
- * The Cursor harness's turn boundary — the single post-run pipeline that turns
3
- * a finished agent run into the durable review surfaces:
2
+ * The Cursor harness's turn boundary — the post-run pipeline that turns the
3
+ * deny-and-retry primitive's evidence into the runtime's review surfaces:
4
4
  *
5
5
  * 1. read the denial ledger the preToolUse hook appended this turn (ALL
6
6
  * kinds — every entry means "this action did not execute"; only the
7
7
  * approval-kind subset may pause, see approval-state.ts);
8
- * 2. derive the approved-command provenance (DD-28 auto-keep facts);
9
- * 3. capture the turn's net file change set to the file_review ledger
10
- * (CANDIDATE_CAPTURED) and stamp the flowed edit rows;
11
- * 4. reconcile denied (approval-kind) tool calls to WAITING_APPROVAL gate rows
8
+ * 2. reconcile denied (approval-kind) tool calls to WAITING_APPROVAL gate rows
12
9
  * and redact the model's provisional post-denial narration;
13
- * 5. detect UNATTRIBUTED hook blocks (issue #205) — a tool blocked by a hook
10
+ * 3. settle unattended-mode denials as SKIPPED (DD-014);
11
+ * 4. detect UNATTRIBUTED hook blocks (issue #205) — a tool blocked by a hook
14
12
  * with no ledger entry of any kind was denied by a FOREIGN hook the merge
15
13
  * preserved, and the caller fails the run rather than completing silently;
16
- * 6. settle UNRESOLVED tool calls (issue #965) — a this-turn row still
14
+ * 5. settle UNRESOLVED tool calls (issue #965) — a this-turn row still
17
15
  * non-terminal on a completing turn with no ledger attribution hung inside
18
16
  * the harness and can never complete; it is settled to an honest
19
17
  * TOOL_CALL_INTERRUPTED and disclosed on the transcript instead of being
20
18
  * silently stamped by the server's terminal settle after the fact.
21
19
  *
20
+ * `waiting` means "a denial pauses": a gated tool call the user must decide.
21
+ * The turn's FILE CHANGES are not this boundary's since S3 M4 — the runtime
22
+ * captures them once, over whatever the whole turn left on the tree, after
23
+ * `runTurn` returns (`harness/capture.ts`), and decides the review pause
24
+ * itself. Two consequences the boundary used to suppress when it could see
25
+ * the capture: steps 4 and 5 now run on a turn whose only pause would have
26
+ * been a file review, so a hung row is disclosed and a foreign-hook block is
27
+ * failed BEFORE the review rather than after it (F-M4-P9, F-M4-P10, Q-M4-11).
28
+ *
22
29
  * Extracted from the activity entry point (index.ts Phase 12) so it is directly
23
30
  * unit-testable AND re-enterable: the poisoned-handle / transport-timeout
24
31
  * recoveries re-run the agent with a fresh handle AFTER the primary boundary
25
- * already ran, so their edits must flow through this exact pipeline again or
26
- * they silently escape review (production case aex_01kws27q1e2esvkqjpvectttxf,
27
- * where a Build-from-plan retry created a file with no review gate).
28
- *
29
- * Re-entry is safe by construction: a retry is only reachable when the primary
30
- * boundary captured nothing (a captured change pauses the turn before
31
- * run.wait() is ever consulted), `stampFlowedFileEditRows` skips already-stamped
32
- * rows, and the denial ledger is per-turn append-only.
32
+ * already ran, so their denials must flow through this exact pipeline again.
33
+ * Re-entry is safe by construction: the denial ledger is per-turn append-only
34
+ * and the reconcile is idempotent over it.
33
35
  *
34
36
  * The caller owns everything around the boundary: the stream epilogue
35
37
  * (accumulator/enricher finalize), the WAITING_FOR_APPROVAL phase flip +
@@ -37,21 +39,14 @@
37
39
  */
38
40
 
39
41
  import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
40
- import type { SubAgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/subagent_pb";
41
- import { collectSubAgentToolCallIds } from "../../shared/tool-row.js";
42
42
  import { LocalWorkspaceBackend } from "../../shared/workspace/local-backend.js";
43
- import type { ArtifactStorage } from "../../shared/artifact-storage.js";
44
43
  import type { MergedToolPolicy } from "../../shared/approval-policy.js";
45
44
  import {
46
45
  approvalDenials,
47
46
  denialKindOf,
48
- primaryToken,
49
47
  readDenialLedger,
50
48
  unattendedDenials,
51
- type ApprovalGrant,
52
49
  } from "./approval-state.js";
53
- import { deriveTurnCommandProvenance } from "./command-provenance.js";
54
- import { captureTurnToLedger } from "./capture-flow.js";
55
50
  import {
56
51
  clearProvisionalPostDenialNarration,
57
52
  detectUnattributedHookBlocks,
@@ -66,48 +61,25 @@ import { AgentMessageSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexec
66
61
  import { MessageType } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
67
62
 
68
63
  // How long the boundary waits for the first-denial-stop's run.cancel() to
69
- // settle before reading the final denial ledger and capturing the turn's tree.
70
- // Long enough for the SDK's normal teardown, short enough that a wedged cancel
71
- // cannot noticeably delay the approval pause the user is already waiting on.
64
+ // settle before reading the final denial ledger. Long enough for the SDK's
65
+ // normal teardown, short enough that a wedged cancel cannot noticeably delay
66
+ // the approval pause the user is already waiting on. (The runtime's capture
67
+ // runs after the adapter's whole turn, its gate already torn down, so a late
68
+ // tool can no longer mutate the tree mid-capture.)
72
69
  const FIRST_DENIAL_CANCEL_TIMEOUT_MS = 5_000;
73
70
 
74
71
  export interface TurnBoundaryOptions {
75
- /** Mutated in place: gate rows overlaid, edit rows stamped, narration redacted. */
72
+ /** Mutated in place: gate rows overlaid, narration redacted. */
76
73
  readonly status: AgentExecutionStatus;
77
74
  readonly executionId: string;
78
- /** This turn's change set id (`{executionId}:{turnSeq}`). */
79
- readonly changeSetId: string;
80
- /** Session HITL dir holding the denial ledger + CAS sidecar; undefined → no gate installed. */
75
+ /** Session HITL dir holding the denial ledger; undefined → no gate installed. */
81
76
  readonly hitlDir: string | undefined;
82
- /** Whether this turn runs apply-then-review capture (vs. the deny-gate fallback). */
83
- readonly captureMode: boolean;
84
- /**
85
- * The baseline authored at turn start — the git tree sha for a git workspace,
86
- * or "" (empty, but authored) for a non-git one. `undefined` means no baseline
87
- * was authored this turn, which skips capture entirely; a plain truthiness
88
- * check would wrongly skip the non-git capture.
89
- */
90
- readonly baselineTree: string | undefined;
91
77
  readonly primaryWorkspaceDir: string;
92
- /** True for a git work tree; false for a CAS-only non-git workspace. */
93
- readonly gitWorkspace: boolean;
94
78
  /**
95
79
  * Index of the first message produced by THIS turn's stream — the positional
96
- * turn boundary the approved-command provenance (DD-28) scopes to.
80
+ * scope the #205 attribution and the #965 settle read.
97
81
  */
98
82
  readonly turnStartMessageIndex: number;
99
- /** Reinvocation grants; their tokens map back to the consent rows for DD-28. */
100
- readonly approvalGrants: ApprovalGrant[] | undefined;
101
- /** spec.auto_approve_all — qualifies every command as consented for DD-28. */
102
- readonly globalBypass: boolean;
103
- /**
104
- * Sub-agent executions that existed BEFORE this turn's stream (cloned in on
105
- * resume); their rows are skipped when stamping so a resume never re-stamps a
106
- * prior turn's sub-agent rows.
107
- */
108
- readonly seededSubAgents: readonly SubAgentExecution[];
109
- /** CAS blob store for gitignored/non-git captures; undefined → git-only capture. */
110
- readonly artifactStorage: ArtifactStorage | undefined;
111
83
  /** Merged approval policies, threaded to the denied-call reconcile for gate provenance. */
112
84
  readonly mergedPolicies: ReadonlyMap<string, MergedToolPolicy>;
113
85
  /**
@@ -132,13 +104,11 @@ export interface TurnBoundaryOptions {
132
104
 
133
105
  export interface TurnBoundaryResult {
134
106
  /**
135
- * True when the turn must pause for human review — at least one gated tool
136
- * call or one captured file change. The caller flips the phase to
137
- * WAITING_FOR_APPROVAL, persists, and returns without consulting run.wait().
107
+ * True when a denial pauses the turn — at least one gated tool call the
108
+ * user must decide. The caller ends the turn `awaiting_approval` without
109
+ * consulting run.wait().
138
110
  */
139
111
  readonly waiting: boolean;
140
- /** File changes authored to the file_review ledger this call (0 = no candidate). */
141
- readonly capturedChangeCount: number;
142
112
  /** Denied tool calls reconciled to WAITING_APPROVAL gate rows this call. */
143
113
  readonly deniedToolCallCount: number;
144
114
  /**
@@ -163,9 +133,9 @@ export interface TurnBoundaryResult {
163
133
  }
164
134
 
165
135
  /**
166
- * Run the turn boundary: author this turn's change set to the file_review
167
- * ledger and overlay the hook's denials as approval gates. Mutates
168
- * `opts.status` in place and reports whether the turn must pause.
136
+ * Run the turn boundary: overlay the hook's denials as approval gates and
137
+ * settle what the ledger accounts for. Mutates `opts.status` in place and
138
+ * reports whether a denial pauses the turn.
169
139
  *
170
140
  * The hook records each denial to the ledger; we mark the corresponding tool
171
141
  * calls WAITING_APPROVAL. The backend projects pending_approvals from that
@@ -178,17 +148,9 @@ export async function runTurnBoundary(opts: TurnBoundaryOptions): Promise<TurnBo
178
148
  const {
179
149
  status,
180
150
  executionId,
181
- changeSetId,
182
151
  hitlDir,
183
- captureMode,
184
- baselineTree,
185
152
  primaryWorkspaceDir,
186
- gitWorkspace,
187
153
  turnStartMessageIndex,
188
- approvalGrants,
189
- globalBypass,
190
- seededSubAgents,
191
- artifactStorage,
192
154
  mergedPolicies,
193
155
  denialCancelSettled,
194
156
  foreignGatingHooks,
@@ -207,79 +169,12 @@ export async function runTurnBoundary(opts: TurnBoundaryOptions): Promise<TurnBo
207
169
  }
208
170
  // The FULL ledger (all kinds) vs its APPROVAL subset — the kind split:
209
171
  // every ledger entry means "this action did NOT execute", so the full set
210
- // feeds capture stamping, DD-28 provenance, and foreign-hook attribution;
172
+ // feeds the unattended settle and the foreign-hook attribution;
211
173
  // only approval-kind entries may become WAITING_APPROVAL gates (a secret
212
174
  // hard-block or fail-closed deny is attributable but never pausable).
213
175
  const deniedLedger = await readDenialLedger(hitlDir ?? "");
214
176
  const approvalLedger = approvalDenials(deniedLedger);
215
177
 
216
- // Capture mode: author the net change set to the file_review ledger as the
217
- // CANDIDATE_CAPTURED event (projected server-side to a file_change_set
218
- // AWAITING_REVIEW — the single review surface). The runner-owned gate files
219
- // are excluded from the capture. The agent's edits are LEFT applied on the
220
- // working tree (Cursor parity — the user reviews the real change; nothing is
221
- // committed and the next turn is blocked until approval, and a reject snaps
222
- // each file back on resume). Runs BEFORE the denial reconcile so a denied
223
- // (gitignored) write stays on the deny-gate path while every flowed edit is
224
- // captured to the ledger.
225
- let capturedChangeCount = 0;
226
- if (captureMode && baselineTree !== undefined && primaryWorkspaceDir) {
227
- const deniedTokens = new Set(deniedLedger.map((e) => e.token));
228
- // Approved-command turn facts (DD-28): when every mutation-capable call
229
- // this turn was a consented shell command, attach the provenance so the
230
- // backend can verify the cited consent rows and auto-keep the set instead
231
- // of arming a second gate. Fail-closed: any non-qualifying turn attaches
232
- // nothing and reviews manually exactly as before.
233
- const commandProvenance = deriveTurnCommandProvenance({
234
- messages: status.messages,
235
- turnStartIndex: turnStartMessageIndex,
236
- deniedTokens,
237
- grantTokenToConsentId: new Map(
238
- (approvalGrants ?? []).map((g) => [
239
- primaryToken(g.key, g.salient, g.contentDigest),
240
- g.sourceToolCallId,
241
- ]),
242
- ),
243
- globalBypass,
244
- });
245
- if (commandProvenance) {
246
- console.log(
247
- `ExecuteCursor capture: turn qualifies for approved-command auto-keep ` +
248
- `(consent rows: ${commandProvenance.consentToolCallIds.join(",") || "(auto_approve_all)"}); ` +
249
- `attaching provenance to candidate (execution=${executionId})`,
250
- );
251
- }
252
- const captured = await captureTurnToLedger({
253
- status,
254
- gitRoot: primaryWorkspaceDir,
255
- executionId,
256
- changeSetId,
257
- baselineTree,
258
- messages: status.messages,
259
- deniedTokens,
260
- commandProvenance,
261
- // Scope sub-agent row stamping to this turn: the seeded prior sub-agents
262
- // (cloned in on resume) are the "before this turn" rows to skip.
263
- priorSubAgentToolCallIds: collectSubAgentToolCallIds(seededSubAgents),
264
- // The CAS half: read the sidecar the hook staged this turn and compose it
265
- // into the change set. hitlDir + storage are present when captureIgnored
266
- // was on (a git tree's gitignored writes, or ALL writes in a non-git
267
- // workspace). In a git tree this composes with the git diff (HYBRID); in a
268
- // non-git workspace it IS the whole change set (CAS-only).
269
- hitlDir,
270
- storage: artifactStorage,
271
- gitWorkspace,
272
- });
273
- capturedChangeCount = captured.length;
274
- if (capturedChangeCount > 0) {
275
- console.log(
276
- `ExecuteCursor capture: ${capturedChangeCount} file change(s) authored to the ` +
277
- `file_review ledger (change_set=${changeSetId}), working tree left applied ` +
278
- `for review (execution=${executionId})`,
279
- );
280
- }
281
- }
282
-
283
178
  // The gate reads each denied file's pre-edit `before` from the workspace the
284
179
  // runner is co-located with (local FS for OSS; the sandbox in cloud), so a
285
180
  // whole-file rewrite gate renders a true before/after diff. The tool was
@@ -357,7 +252,7 @@ export async function runTurnBoundary(opts: TurnBoundaryOptions): Promise<TurnBo
357
252
  deniedLedger,
358
253
  primaryWorkspaceDir,
359
254
  );
360
- const waiting = deniedToolCalls.length > 0 || capturedChangeCount > 0;
255
+ const waiting = deniedToolCalls.length > 0;
361
256
 
362
257
  // Issue #965 invariant: an unresolved tool must never silently complete.
363
258
  // On a COMPLETING (non-pausing) turn, any this-turn row still PENDING /
@@ -426,7 +321,6 @@ export async function runTurnBoundary(opts: TurnBoundaryOptions): Promise<TurnBo
426
321
 
427
322
  return {
428
323
  waiting,
429
- capturedChangeCount,
430
324
  deniedToolCallCount: deniedToolCalls.length,
431
325
  unattributedHookBlocks,
432
326
  settledUnresolvedCount: settledUnresolved.length,
@@ -4,10 +4,10 @@
4
4
  * In order: the post-stream finalize (transcript, enrichments, sub-agents,
5
5
  * the usage snapshot's carrier, the recorder flush, one persist so the UI
6
6
  * sees settled rows); the runtime's stop, if it fired, settled as
7
- * `interrupted` with nothing further; the turn boundary (`turn-boundary.ts`,
8
- * whole, Q-S2-1) that authors this turn's change set and overlays the hook's
9
- * denials as WAITING rows, ending `awaiting_approval` when it says so or
10
- * failing on an unattributed hook block (#205); `run.wait()` and the
7
+ * `interrupted` with nothing further; the turn boundary (`turn-boundary.ts`)
8
+ * that overlays the hook's denials as WAITING rows, ending `awaiting_approval`
9
+ * when a denial pauses or failing on an unattributed hook block (#205);
10
+ * `run.wait()` and the
11
11
  * classifier; the two recovery spines (a poisoned resumed handle, a
12
12
  * transport timeout on a created agent), each running the IDENTICAL stream,
13
13
  * finalize and boundary against a fresh agent at most once; the collapse of
@@ -15,9 +15,13 @@
15
15
  *
16
16
  * What this module never does: write a phase, a terminal copy or
17
17
  * `completedAt` — those are the runtime's (`harness/run-turn.ts`,
18
- * `terminal-table.ts`); the outcome carries what the runtime cannot read
19
- * from the status (`failed`'s message and surface, `cancelled`). It does
20
- * mutate `sink.status`'s transcript rows, which are this harness's to write.
18
+ * `terminal-table.ts`); capture the turn's file changes or decide whether a
19
+ * review is pending — the runtime's too (`harness/capture.ts`, once over the
20
+ * whole turn after this settle returns, so a recovery's edits reach review
21
+ * without the boundary being re-entered for them; S3 M4). The outcome carries
22
+ * what the runtime cannot read from the status (`failed`'s message and
23
+ * surface, `cancelled`). It does mutate `sink.status`'s transcript rows,
24
+ * which are this harness's to write.
21
25
  *
22
26
  * Moved from `index.ts` `executeCursorInner` phases 11 to 13 at S2 M3b; the
23
27
  * bodies are the orchestrator's, with the runtime's arms taken out.
@@ -133,15 +137,15 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
133
137
  }
134
138
 
135
139
  // Everything at an index >= this was produced by THIS turn's stream — the
136
- // positional turn boundary the approved-command provenance (DD-28) scopes
137
- // its qualification to. Snapshotted before the accumulator can append.
140
+ // positional scope the boundary's #205 attribution and #965 settle read.
141
+ // Snapshotted before the accumulator can append.
138
142
  const turnStartMessageIndex = status.messages.length;
139
143
 
140
144
  const accumulator = new MessageAccumulator(status.messages, {
141
145
  mergedPolicies: mcp.policies,
142
146
  provenance: { globalBypass: mcp.leases.global, leasedCategories: mcp.leases.categories },
143
147
  workspaceRoot: workspace.primaryDir,
144
- seededSubAgents: rows.seededSubAgents,
148
+ subAgentExecutions: status.subAgentExecutions,
145
149
  });
146
150
  // Shared cadence with the native harness: discrete state changes force a
147
151
  // flush; high-frequency token deltas ride this scheduler's time cadence
@@ -156,9 +160,6 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
156
160
  todoTracker,
157
161
  eventRecorder,
158
162
  scheduler,
159
- progressSubstrate: gate.progressSubstrate,
160
- progressState: gate.progressState,
161
- changeSetId: workspace.changeSetId,
162
163
  hitlDir: gate.hitlDir,
163
164
  };
164
165
 
@@ -177,7 +178,6 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
177
178
  if (sink.stopSignal.aborted) {
178
179
  accumulator.cancelInProgressSubAgents();
179
180
  }
180
- status.subAgentExecutions = accumulator.subAgentExecutions;
181
181
  await eventRecorder?.flush();
182
182
  console.log(
183
183
  `ExecuteCursor stream ended: execution=${executionId}, events=${streamState.eventCount}, messages=${status.messages.length}, subAgents=${status.subAgentExecutions.length}`,
@@ -188,41 +188,28 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
188
188
  sink.recordActivity();
189
189
  };
190
190
 
191
- // The turn boundary — author this turn's change set to the file_review
192
- // ledger (CANDIDATE_CAPTURED) and overlay the hook's denials as
193
- // WAITING_APPROVAL gate rows. The full pipeline and its ordering rationale
194
- // live in turn-boundary.ts; this closure binds the turn's state so the
195
- // recovery retries (which re-run the agent AFTER this primary call) can
196
- // re-enter the IDENTICAL pipeline — a retry's edits must reach the ledger
197
- // or they silently escape review.
191
+ // The turn boundary — overlay the hook's denials as WAITING_APPROVAL gate
192
+ // rows and settle what the ledger accounts for. The pipeline and its
193
+ // ordering rationale live in turn-boundary.ts; this closure binds the
194
+ // turn's state so the recovery retries (which re-run the agent AFTER this
195
+ // primary call) re-enter the IDENTICAL pipeline for their denials.
198
196
  const runBoundary = (denialSettled?: Promise<void>): Promise<TurnBoundaryResult> =>
199
197
  runTurnBoundary({
200
198
  status,
201
199
  executionId,
202
- changeSetId: workspace.changeSetId,
203
200
  hitlDir: gate.hitlDir,
204
- captureMode: workspace.captureMode,
205
- baselineTree: gate.baselineTree,
206
201
  primaryWorkspaceDir: workspace.primaryDir,
207
- gitWorkspace: workspace.gitWorkspace,
208
202
  turnStartMessageIndex,
209
- approvalGrants: gate.approvalGrants,
210
- globalBypass: mcp.leases.global,
211
- seededSubAgents: rows.seededSubAgents,
212
- artifactStorage: input.artifactStorage,
213
203
  mergedPolicies: mcp.policies,
214
204
  denialCancelSettled: denialSettled,
215
205
  foreignGatingHooks: gate.hitlGate.foreignGatingHooks,
216
206
  });
217
207
 
218
- // The boundary mutated the transcript in place and asked to pause for
219
- // review: the runtime flips the phase, persists, and returns to the
220
- // workflow, which waits for the approval/file-review signal and reinvokes.
208
+ // The boundary mutated the transcript in place and a denial pauses the
209
+ // turn: the runtime flips the phase, persists, and returns to the
210
+ // workflow, which waits for the approval signal and reinvokes.
221
211
  const awaitingApproval = (boundary: TurnBoundaryResult): TurnOutcome => {
222
- console.log(
223
- `ExecuteCursor returning WAITING_FOR_APPROVAL: ${boundary.deniedToolCallCount} gated tool(s), ` +
224
- `${boundary.capturedChangeCount} file card(s) pending`,
225
- );
212
+ console.log(`ExecuteCursor returning WAITING_FOR_APPROVAL: ${boundary.deniedToolCallCount} gated tool(s)`);
226
213
  return { kind: "awaiting_approval" };
227
214
  };
228
215
 
@@ -252,13 +239,13 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
252
239
  return { kind: "failed", surface: "actionable", message };
253
240
  };
254
241
 
255
- // Re-enter the turn boundary for a recovery retry: author the retry's net
256
- // change set to the file_review ledger and overlay any denials as gates —
257
- // without this a retry's file edits silently escape review (production case
258
- // aex_01kws27q1e2esvkqjpvectttxf). Returns undefined for a cancelled retry —
259
- // there is no review to open. Passes denialCancelSettled so a first denial
260
- // that stopped the RETRY waits for run.cancel() before the ledger read,
261
- // exactly like the primary path.
242
+ // Re-enter the turn boundary for a recovery retry: overlay the retry's
243
+ // denials as gates. (Its file edits need no re-entry: the runtime captures
244
+ // the whole turn's tree once after `runTurn` returns — the shape production
245
+ // case aex_01kws27q1e2esvkqjpvectttxf asked for, now by construction.)
246
+ // Returns undefined for a cancelled retry — there is no gate to open.
247
+ // Passes denialCancelSettled so a first denial that stopped the RETRY waits
248
+ // for run.cancel() before the ledger read, exactly like the primary path.
262
249
  const settleRetryTurn = async (retryResultStatus: string): Promise<TurnBoundaryResult | undefined> =>
263
250
  retryResultStatus === "cancelled"
264
251
  ? undefined
@@ -419,11 +406,10 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
419
406
 
420
407
  const { retryRun, retryResult, retryBoundary } = recovery;
421
408
  if (retryBoundary?.waiting) {
422
- // The retry's edits/denials armed the gate — pause for review. On a
423
- // retry error this supersedes the failure, exactly as on the primary
424
- // path (a captured change pauses the turn before run.wait() is
425
- // consulted).
426
- console.log(`ExecuteCursor poisoned-handle recovery paused for review: execution=${executionId}`);
409
+ // The retry's denials armed the gate — pause for approval. On a
410
+ // retry error this supersedes the failure, exactly as on the
411
+ // primary path.
412
+ console.log(`ExecuteCursor poisoned-handle recovery paused for approval: execution=${executionId}`);
427
413
  return awaitingApproval(retryBoundary);
428
414
  }
429
415
  if (retryBoundary && retryBoundary.unattributedHookBlocks.length > 0) {
@@ -484,9 +470,9 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
484
470
 
485
471
  const { retryResult, retryBoundary } = recovery;
486
472
  if (retryBoundary?.waiting) {
487
- // The retry's edits/denials armed the gate — pause for review (see
488
- // the poisoned-handle branch above for the precedence rationale).
489
- console.log(`ExecuteCursor transport-timeout recovery paused for review: execution=${executionId}`);
473
+ // The retry's denials armed the gate — pause for approval (see the
474
+ // poisoned-handle branch above for the precedence rationale).
475
+ console.log(`ExecuteCursor transport-timeout recovery paused for approval: execution=${executionId}`);
490
476
  return awaitingApproval(retryBoundary);
491
477
  }
492
478
  if (retryBoundary && retryBoundary.unattributedHookBlocks.length > 0) {