@stigmer/runner 3.15.1 → 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
@@ -22,7 +22,7 @@ const SESSION_ID = "ses-01test";
22
22
  const SESSION_BRANCH = `stigmer/${SESSION_ID}`;
23
23
 
24
24
  // The shared proto-backed writer — the same implementation the Cursor harness
25
- // wires in, and upsert-compatible with the deep-agent StatusBuilder.
25
+ // wires in, and upsert-compatible with the deep-agent V3StatusBuilder.
26
26
  function makeStatusBuilder(): ExecutionStatusWriter {
27
27
  return statusProtoWriter(create(AgentExecutionStatusSchema, {}));
28
28
  }
@@ -185,11 +185,14 @@ describe("WriteBackCoordinator", () => {
185
185
 
186
186
  // ── Full cycle ──────────────────────────────────────────────────────
187
187
 
188
+ // Every cycle below runs through `finalize()`, the coordinator's one entry
189
+ // point since S3 M2b (Q-M1-1; the per-file `onFileModified` went with the
190
+ // native stream loop that called it). The mechanics it pins are the same.
188
191
  it("performs full cycle on the SESSION branch: branch -> commit -> push -> PR", async () => {
189
192
  const backend = mockWorkspaceBackend();
190
193
  const coord = makeCoordinator({ sb, backend });
191
194
 
192
- await coord.onFileModified("src/main.ts");
195
+ await coord.finalize();
193
196
 
194
197
  const wbs = sb.currentStatus.workspaceWriteBacks;
195
198
  expect(wbs).toHaveLength(1);
@@ -213,7 +216,7 @@ describe("WriteBackCoordinator", () => {
213
216
  const backend = mockWorkspaceBackend();
214
217
  const coord = makeCoordinator({ sb, backend, executionId: "exec-12345678rest" });
215
218
 
216
- await coord.onFileModified("src/main.ts");
219
+ await coord.finalize();
217
220
 
218
221
  const commands = (backend.execute as ReturnType<typeof vi.fn>).mock.calls
219
222
  .map((c: any) => c[0] as string);
@@ -233,19 +236,19 @@ describe("WriteBackCoordinator", () => {
233
236
  });
234
237
  const coord = makeCoordinator({ sb, backend });
235
238
 
236
- await coord.onFileModified("src/main.ts");
239
+ await coord.finalize();
237
240
 
238
241
  expect(sb.currentStatus.workspaceWriteBacks).toHaveLength(0);
239
242
  });
240
243
 
241
244
  // ── Session-branch idempotency ──────────────────────────────────────
242
245
 
243
- it("on second call, commits to the existing branch without re-creating", async () => {
246
+ it("a second finalize commits to the existing branch without re-creating it", async () => {
244
247
  const backend = mockWorkspaceBackend();
245
248
  const coord = makeCoordinator({ sb, backend });
246
249
 
247
- await coord.onFileModified("first.ts");
248
- await coord.onFileModified("second.ts");
250
+ await coord.finalize();
251
+ await coord.finalize();
249
252
 
250
253
  const commands = (backend.execute as ReturnType<typeof vi.fn>).mock.calls
251
254
  .map((c: any) => c[0] as string);
@@ -263,7 +266,7 @@ describe("WriteBackCoordinator", () => {
263
266
  });
264
267
  const coord = makeCoordinator({ sb, backend, executionId: "exec-turn2" });
265
268
 
266
- await coord.onFileModified("src/more.ts");
269
+ await coord.finalize();
267
270
 
268
271
  const commands = (backend.execute as ReturnType<typeof vi.fn>).mock.calls
269
272
  .map((c: any) => c[0] as string);
@@ -278,7 +281,7 @@ describe("WriteBackCoordinator", () => {
278
281
  });
279
282
  const coord = makeCoordinator({ sb, backend });
280
283
 
281
- await coord.onFileModified("src/main.ts");
284
+ await coord.finalize();
282
285
 
283
286
  const commands = (backend.execute as ReturnType<typeof vi.fn>).mock.calls
284
287
  .map((c: any) => c[0] as string);
@@ -296,7 +299,7 @@ describe("WriteBackCoordinator", () => {
296
299
  });
297
300
  const coord = makeCoordinator({ sb, backend });
298
301
 
299
- await coord.onFileModified("src/main.ts");
302
+ await coord.finalize();
300
303
 
301
304
  const commands = (backend.execute as ReturnType<typeof vi.fn>).mock.calls
302
305
  .map((c: any) => c[0] as string);
@@ -312,7 +315,7 @@ describe("WriteBackCoordinator", () => {
312
315
  });
313
316
  const coord = makeCoordinator({ sb });
314
317
 
315
- await coord.onFileModified("src/main.ts");
318
+ await coord.finalize();
316
319
 
317
320
  const wbs = sb.currentStatus.workspaceWriteBacks;
318
321
  expect(wbs[0].pullRequestNumber).toBe(7);
@@ -328,7 +331,7 @@ describe("WriteBackCoordinator", () => {
328
331
  const calls = mockGithubApi();
329
332
  const coord = makeCoordinator({ sb, githubToken: "ghp_plumbed_token" });
330
333
 
331
- await coord.onFileModified("src/main.ts");
334
+ await coord.finalize();
332
335
 
333
336
  expect(calls.length).toBeGreaterThan(0);
334
337
  for (const call of calls) {
@@ -350,7 +353,7 @@ describe("WriteBackCoordinator", () => {
350
353
  });
351
354
  const coord = makeCoordinator({ sb, backend });
352
355
 
353
- await coord.onFileModified("src/main.ts");
356
+ await coord.finalize();
354
357
 
355
358
  const wbs = sb.currentStatus.workspaceWriteBacks;
356
359
  expect(wbs).toHaveLength(1);
@@ -364,7 +367,7 @@ describe("WriteBackCoordinator", () => {
364
367
  mockGithubApi({ createStatus: 403 });
365
368
  const coord = makeCoordinator({ sb });
366
369
 
367
- await coord.onFileModified("src/main.ts");
370
+ await coord.finalize();
368
371
 
369
372
  const wbs = sb.currentStatus.workspaceWriteBacks;
370
373
  expect(wbs).toHaveLength(1);
@@ -381,7 +384,7 @@ describe("WriteBackCoordinator", () => {
381
384
  const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
382
385
  const coord = makeCoordinator({ sb, githubToken: "" });
383
386
 
384
- await coord.onFileModified("src/main.ts");
387
+ await coord.finalize();
385
388
 
386
389
  const wbs = sb.currentStatus.workspaceWriteBacks;
387
390
  expect(wbs).toHaveLength(1);
@@ -391,9 +394,9 @@ describe("WriteBackCoordinator", () => {
391
394
  warnSpy.mockRestore();
392
395
  });
393
396
 
394
- // ── finalize / path resolution ──────────────────────────────────────
397
+ // ── finalize on a fresh coordinator ─────────────────────────────────
395
398
 
396
- it("finalize catches remaining uncommitted changes", async () => {
399
+ it("finalize commits, pushes and opens the PR for the entry's uncommitted changes", async () => {
397
400
  const coord = makeCoordinator({ sb });
398
401
 
399
402
  await coord.finalize();
@@ -403,50 +406,6 @@ describe("WriteBackCoordinator", () => {
403
406
  WorkspaceWriteBackPhase.WORKSPACE_WRITE_BACK_PR_CREATED,
404
407
  );
405
408
  });
406
-
407
- it("resolves path to single entry without prefix matching", async () => {
408
- const coord = makeCoordinator({ sb });
409
-
410
- await coord.onFileModified("any/path/file.ts");
411
-
412
- expect(sb.currentStatus.workspaceWriteBacks).toHaveLength(1);
413
- });
414
-
415
- it("resolves path to correct entry in multi-entry workspace", async () => {
416
- const coord = makeCoordinator({
417
- sb,
418
- provisionResults: [
419
- makeProvisionResult({ entryName: "frontend", rootDir: "/workspace/frontend" }),
420
- makeProvisionResult({ entryName: "backend", rootDir: "/workspace/backend" }),
421
- ],
422
- workspaceEntries: [
423
- makeWorkspaceEntry("frontend"),
424
- makeWorkspaceEntry("backend"),
425
- ],
426
- });
427
-
428
- await coord.onFileModified("frontend/src/app.tsx");
429
-
430
- const wbs = sb.currentStatus.workspaceWriteBacks;
431
- expect(wbs).toHaveLength(1);
432
- expect(wbs[0].workspaceEntryName).toBe("frontend");
433
- });
434
-
435
- it("ignores paths outside eligible entries in multi-entry mode", async () => {
436
- const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
437
- const coord = makeCoordinator({
438
- sb,
439
- provisionResults: [
440
- makeProvisionResult({ entryName: "fe", rootDir: "/workspace/fe" }),
441
- makeProvisionResult({ entryName: "be", rootDir: "/workspace/be" }),
442
- ],
443
- workspaceEntries: [makeWorkspaceEntry("fe"), makeWorkspaceEntry("be")],
444
- });
445
-
446
- await coord.onFileModified("unknown/file.ts");
447
- expect(sb.currentStatus.workspaceWriteBacks).toHaveLength(0);
448
- warnSpy.mockRestore();
449
- });
450
409
  });
451
410
 
452
411
  describe("parseGithubRepo", () => {
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Local workspace provisioning for a harness turn.
3
3
  *
4
- * Harness-agnostic: the Cursor activity is today's only caller, the turn
5
- * runtime takes it over in S2 M3, and S3 retires the native twin
6
- * (execute-deep-agent/setup.ts `provisionWorkspace`). Agents run LOCAL
4
+ * Harness-agnostic: the turn runtime's workspace phase, serving both
5
+ * adapters (the native orchestrator's twin, `provisionWorkspace`, retired
6
+ * with it at S3 M2b; Q-S3-8 carried its one difference). Agents run LOCAL
7
7
  * (cloud is disabled — see execute-cursor/cursor-mode.ts), so the runner
8
8
  * must clone git-repo workspace entries itself and mount local-path entries
9
9
  * before the agent runs. Cloud agents previously cloned git repos
@@ -16,9 +16,9 @@
16
16
  * - Created per turn, under the workspace turn lock — the link is a
17
17
  * working-tree mutation, and re-pointing it while another session's turn is
18
18
  * running on a shared tree would redirect that turn's reads mid-flight.
19
- * Cursor creates it in its skill/attachment resolvers (which run after lock
20
- * acquisition); the native harness creates it right after acquiring the
21
- * lock (execute-deep-agent/index.ts).
19
+ * the turn runtime creates it in its skill and attachment phases (which
20
+ * run after lock acquisition), for both harnesses; until S3 M2a the native
21
+ * orchestrator created it unconditionally right after the lock.
22
22
  * - Removed at turn end ({@link removeStigmerSymlink} in the activity's
23
23
  * cleanup), so a real repo is left untouched once the turn ends; a
24
24
  * multi-turn session recreates the link on the next turn.
@@ -14,16 +14,18 @@
14
14
  * already exists (locally, or on the remote after a sandbox re-provision), and
15
15
  * an already-open PR for the branch is adopted instead of re-created.
16
16
  *
17
- * When this runs depends on the harness's file-review mode:
18
- * - Capture mode (apply-then-review every git workspace): the streaming
19
- * trigger is suppressed and `finalize()` runs exactly once on the APPROVED
20
- * tree, after review decisions reconcile (see processCaptureWriteback in
21
- * index.ts). Speculative mid-turn edits never reach GitHub.
22
- * - Legacy non-capture turns: `onFileModified(path)` triggers an incremental
23
- * commit/push per file-modifying tool call (DD-5), with `finalize()` as the
24
- * post-stream safety net.
17
+ * It runs ONCE per turn, at the end: the turn runtime calls `finalize()`
18
+ * (`harness/run-turn.ts`) in capture mode on the APPROVED tree after the
19
+ * review decisions reconcile, so speculative mid-turn edits never reach
20
+ * GitHub; on a non-capture git turn on whatever the turn left in the tree.
21
+ * Until S3 M2b (Q-M1-1) an incremental path also existed — `onFileModified`,
22
+ * a commit-and-push per file-modifying tool call on non-capture turns and
23
+ * was reachable in no supported posture (every git workspace with artifact
24
+ * storage is a capture workspace, `shared/filereview/capture.ts`
25
+ * `deriveCaptureMode`); it went with the native stream loop that called it.
25
26
  *
26
- * Concurrency: one mutex per workspace entry serializes git operations.
27
+ * Entries are written back in sequence, one cycle each; nothing here runs
28
+ * concurrently with itself.
27
29
  */
28
30
 
29
31
  import { create } from "@bufbuild/protobuf";
@@ -81,7 +83,6 @@ export class WriteBackCoordinator {
81
83
 
82
84
  private readonly eligible = new Map<string, EligibleEntry>();
83
85
  private readonly state = new Map<string, EntryState>();
84
- private readonly locks = new Map<string, Promise<void>>();
85
86
 
86
87
  constructor(opts: {
87
88
  statusWriter: ExecutionStatusWriter;
@@ -109,38 +110,15 @@ export class WriteBackCoordinator {
109
110
  }
110
111
 
111
112
  /**
112
- * Called after a file-modifying tool completes (legacy non-capture turns
113
- * only). Resolves the path to a workspace entry and runs an incremental
114
- * commit/push cycle. Fire-and-forget: errors are logged, never thrown.
115
- */
116
- async onFileModified(path: string): Promise<void> {
117
- try {
118
- const entryName = this.resolveEntry(path);
119
- if (!entryName) return;
120
-
121
- await this.withLock(entryName, () =>
122
- this.writeBackEntry(entryName),
123
- );
124
- } catch (err) {
125
- console.warn(
126
- `[WriteBack] execution=${this.executionId} — ` +
127
- `onFileModified error for '${path}': ${err}`,
128
- );
129
- }
130
- }
131
-
132
- /**
133
- * Commits and pushes every eligible workspace entry's remaining uncommitted
134
- * changes. In capture mode this is THE write-back — invoked once on the
135
- * approved tree after review reconcile; on legacy turns it is the
136
- * post-stream safety net.
113
+ * Commits and pushes every eligible workspace entry's uncommitted changes —
114
+ * THE write-back, once per turn (see the header). An entry's failure is
115
+ * recorded on its own write-back row and logged; it never throws, and it
116
+ * never stops the next entry.
137
117
  */
138
118
  async finalize(): Promise<void> {
139
119
  for (const entryName of this.eligible.keys()) {
140
120
  try {
141
- await this.withLock(entryName, () =>
142
- this.writeBackEntry(entryName),
143
- );
121
+ await this.writeBackEntry(entryName);
144
122
  } catch (err) {
145
123
  console.warn(
146
124
  `[WriteBack] execution=${this.executionId} entry=${entryName} — ` +
@@ -199,21 +177,6 @@ export class WriteBackCoordinator {
199
177
  }
200
178
  }
201
179
 
202
- // ── Path Resolution ─────────────────────────────────────────────────
203
-
204
- private resolveEntry(path: string): string | null {
205
- if (this.eligible.size === 0) return null;
206
- if (this.eligible.size === 1) return this.eligible.keys().next().value!;
207
-
208
- const normalized = path.replace(/^\/+/, "");
209
- for (const entryName of this.eligible.keys()) {
210
- if (normalized.startsWith(entryName + "/") || normalized === entryName) {
211
- return entryName;
212
- }
213
- }
214
- return null;
215
- }
216
-
217
180
  // ── Core Write-Back Cycle ───────────────────────────────────────────
218
181
 
219
182
  /**
@@ -506,17 +469,6 @@ export class WriteBackCoordinator {
506
469
  this.statusWriter.addWriteBack(wb);
507
470
  }
508
471
 
509
- // ── Concurrency ─────────────────────────────────────────────────────
510
-
511
- private async withLock(
512
- entryName: string,
513
- fn: () => Promise<void>,
514
- ): Promise<void> {
515
- const existing = this.locks.get(entryName) ?? Promise.resolve();
516
- const next = existing.then(fn, fn);
517
- this.locks.set(entryName, next);
518
- await next;
519
- }
520
472
  }
521
473
 
522
474
  // ── Helpers ───────────────────────────────────────────────────────────
@@ -2,7 +2,7 @@
2
2
  * Native built-in tools for the deep-agent harness.
3
3
  *
4
4
  * These are Stigmer-authored capabilities appended to the agent's tool list
5
- * in execute-deep-agent/setup.ts (and mirrored for sub-agents in
5
+ * in execute-deep-agent/turn-setup.ts (and mirrored for sub-agents in
6
6
  * subagent-transformer.ts) — distinct from deepagents' backend tools
7
7
  * (ls/read_file/execute/…) and from MCP tools, which arrive via the
8
8
  * connection layer.
@@ -1,142 +0,0 @@
1
- /**
2
- * Cursor adapter over the harness-agnostic capture-mode orchestration
3
- * ({@link ../../shared/filereview/capture.js}).
4
- *
5
- * The substrate (git snapshot/restore) and the orchestration (baseline/candidate/
6
- * reconcile authoring) live in `shared/filereview/` so the Cursor and deep-agent
7
- * harnesses author IDENTICAL ledger entries. This adapter binds the Cursor
8
- * specifics:
9
- * - `harnessId = "cursor"` (stamped on the BASELINE payload the projection reads);
10
- * - the Cursor gate files written into the workspace, excluded from the captured
11
- * diff (`CURSOR_RUNNER_OWNED_PATHS`);
12
- * - stamping the streamed file-edit transcript rows that flowed this turn with
13
- * the change set id (`stampFlowedFileEditRows`) — the rows stay visible as
14
- * observational/audit records at their transcript positions, while
15
- * `file_change_sets` remains the single DECISION surface.
16
- *
17
- * The resume-time reconcile is NOT here since S2 M2: the turn runtime's
18
- * `reconcileReinvocation` (`harness/turn-context.ts`) calls the shared
19
- * reconcile directly under {@link CURSOR_FILE_REVIEW_IDENTITY}, the one
20
- * export that carries the two Cursor facts it needs. The two capture
21
- * functions keep their original signatures so the activity wiring (index.ts)
22
- * and the cutover tests are unchanged.
23
- */
24
- import type { AgentMessage } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
25
- import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
26
- import type { TurnCommandProvenance } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
27
- import { type ProgressSubstrate } from "../../shared/filereview/progress.js";
28
- import type { GitSubstrateChange as GitCapturedChange } from "../../shared/filereview/git-substrate.js";
29
- import type { ArtifactStorage } from "../../shared/artifact-storage.js";
30
- import type { FileReviewIdentity } from "../../harness/capabilities.js";
31
- /**
32
- * The two facts the runtime's resume-time reconcile needs from this harness
33
- * (`harness/turn-context.ts` `reconcileReinvocation`): the same id and
34
- * exclude list the capture functions below stamp and apply, so the baseline a
35
- * turn authors and the reconcile a resume runs agree by construction.
36
- */
37
- export declare const CURSOR_FILE_REVIEW_IDENTITY: FileReviewIdentity;
38
- export { deriveCaptureMode } from "../../shared/filereview/capture.js";
39
- /**
40
- * Turn start: pin the pre-turn working tree behind the baseline ref and author
41
- * BASELINE_CAPTURED (harnessId "cursor"). Returns the baseline tree sha for the
42
- * turn-end diff.
43
- */
44
- export declare function captureBaselineToLedger(opts: {
45
- readonly status: AgentExecutionStatus;
46
- readonly gitRoot: string;
47
- readonly executionId: string;
48
- readonly changeSetId: string;
49
- /** True (default) for a git work tree; false for a CAS-only non-git workspace. */
50
- readonly gitWorkspace?: boolean;
51
- }): Promise<string>;
52
- /**
53
- * Turn end: capture the change set + author CANDIDATE_CAPTURED, then stamp the
54
- * streamed file-edit rows that flowed this turn with the change set id — the
55
- * rows stay visible in place as observational records while `file_change_sets`
56
- * remains the single decision surface. The working tree is LEFT applied
57
- * (Cursor parity).
58
- *
59
- * The change set is HYBRID (git tree) or CAS-only (non-git): the hook-staged
60
- * writes from the cas-observations sidecar this turn ({@link readCasObservations})
61
- * — the Cursor analog of deep-agent's `buildCasTurnCaptures` — composed with the
62
- * git-tracked diff when `gitWorkspace`. Non-secret staged paths become
63
- * `GIT_IGNORED_CAPTURED` (git tree) or `NON_GIT_CAS` (non-git) CAS captures
64
- * (before-bytes from the sidecar, after-bytes re-read from disk);
65
- * secret-blocked paths become content-less `DIFF_UNREVIEWABLE` entries. The
66
- * boundary re-runs {@link partitionIgnoredPathsBySecret} as a fail-closed
67
- * backstop, so a secret that ever slipped into the captured set still has its
68
- * bytes withheld from durable storage.
69
- *
70
- * `deniedTokens` are the identities the hook gated this turn (shell/MCP, or a
71
- * secret-like delete — non-secret CAS deletes flow since issue #303). A streamed
72
- * file-edit row whose identity is in that set is left for the deny-gate
73
- * reconcile path — it did NOT flow. A flowed gitignored write or delete is NOT
74
- * in that set (the hook allowed it), so it is stamped like any other flowed
75
- * edit and its captured delta surfaces as a CAS entry in the set.
76
- *
77
- * `hitlDir`/`storage` are omitted only by callers with no artifact storage
78
- * (captureIgnored off); the CAS half is then skipped and this is a git-only
79
- * capture exactly as before.
80
- *
81
- * Mutates `messages` and `status` in place. Returns the captured git changes.
82
- */
83
- export declare function captureTurnToLedger(opts: {
84
- readonly status: AgentExecutionStatus;
85
- readonly gitRoot: string;
86
- readonly executionId: string;
87
- readonly changeSetId: string;
88
- readonly baselineTree: string;
89
- readonly messages: AgentMessage[];
90
- readonly deniedTokens: ReadonlySet<string>;
91
- readonly hitlDir?: string;
92
- readonly storage?: ArtifactStorage;
93
- /**
94
- * Sub-agent tool-call ids that existed BEFORE this turn's stream (the seeded
95
- * prior sub-agents). Sub-agent edit rows created this turn are stamped with the
96
- * parent change set id; rows in this set are skipped so a resume never
97
- * re-stamps a prior turn's sub-agent rows. Omit when there are no prior
98
- * sub-agents.
99
- */
100
- readonly priorSubAgentToolCallIds?: ReadonlySet<string>;
101
- /**
102
- * True (default) for a git work tree — the candidate is the git diff composed
103
- * with the gitignored CAS captures (`GIT_IGNORED_CAPTURED`). False for a non-git
104
- * workspace (Slice 2c): there is no git diff, so the whole change set is the CAS
105
- * captures the hook staged for EVERY touched path (`NON_GIT_CAS`).
106
- */
107
- readonly gitWorkspace?: boolean;
108
- /**
109
- * The approved-command turn facts (DD-28), derived by the caller from the
110
- * turn's tool calls ({@link ../command-provenance.js}). Present only when the
111
- * turn qualifies; carried verbatim to the CANDIDATE event.
112
- */
113
- readonly commandProvenance?: TurnCommandProvenance;
114
- }): Promise<readonly GitCapturedChange[]>;
115
- /**
116
- * Choose the mid-run progress substrate for this turn's workspace shape (DD-32 /
117
- * DD-33), returning `undefined` when there is nothing to observe (not capture
118
- * mode, or no workspace). Built ONCE per turn — the substrate owns its own
119
- * short-circuit cache across the loop's persists; the floor lives in the caller's
120
- * `ProgressCaptureState`. The live count and the turn-boundary reviewed set agree
121
- * by construction: the git slice binds the SAME `CURSOR_RUNNER_OWNED_PATHS`
122
- * exclusion {@link captureTurnToLedger} uses, and the CAS slice reads the SAME
123
- * hook sidecar ({@link readCasObservations}) the boundary reads.
124
- *
125
- * - git tree, no storage -> git substrate only (tracked-file `--numstat`);
126
- * - git tree, storage (HYBRID) -> git + CAS (the gitignored writes the hook staged);
127
- * - non-git workspace -> CAS only (every tool-mediated write is CAS-staged).
128
- *
129
- * The CAS slice needs the hook sidecar, which exists only when `captureIgnored`
130
- * is on (storage configured). A non-git capture already required storage
131
- * (`deriveCaptureMode`), so its sidecar is always present; a git tree with no
132
- * storage simply gets the git-only substrate (parity with the pre-DD-33 behavior).
133
- */
134
- export declare function buildCursorProgressSubstrate(opts: {
135
- readonly captureMode: boolean;
136
- readonly gitWorkspace: boolean;
137
- readonly workspaceRoot: string | undefined;
138
- readonly baselineTree: string | undefined;
139
- readonly executionId: string;
140
- readonly hitlDir: string | undefined;
141
- readonly storage: ArtifactStorage | undefined;
142
- }): ProgressSubstrate | undefined;