@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
@@ -16,9 +16,9 @@
16
16
  * sequences them, and the adapter runs its own harness-specific steps after
17
17
  * the whole record exists.
18
18
  *
19
- * Shape, chosen against `execute-deep-agent/setup.ts`: a typed record built
20
- * from small functions (the `SetupResult` mold), never one 775-line
21
- * `performSetup`. The record is the adapter contract's `TurnInput`
19
+ * Shape, chosen against the native orchestrator's `setup.ts` (deleted at S3
20
+ * M2b): a typed record built from small functions (the `SetupResult` mold),
21
+ * never one 775-line `performSetup`. The record is the adapter contract's `TurnInput`
22
22
  * (`types.ts`): every phase returns a named slice of it, and
23
23
  * {@link resolveTurnContext} composes the whole. There is no wider
24
24
  * "runtime-private" record beside it — the lock release and the write-back
@@ -66,15 +66,15 @@
66
66
 
67
67
  import { CancelledFailure } from "@temporalio/activity";
68
68
  import { clone } from "@bufbuild/protobuf";
69
- import type { AgentExecution, AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
69
+ import { AgentExecutionStatusSchema, type AgentExecution, type AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
70
70
  import type { AgentExecutionSpec } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/spec_pb";
71
- import { AgentMessageSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
72
- import { ApprovalAction, FileChangeSetStatus, ToolCallStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
71
+ import { ApprovalAction, FileChangeSetStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
73
72
  import type { Session } from "@stigmer/protos/ai/stigmer/agentic/session/v1/api_pb";
74
73
 
75
74
  import type { Config } from "../config.js";
76
75
  import type { StigmerClient } from "../client/stigmer-client.js";
77
76
  import type { NormalizedActivityInput } from "../shared/activity-input.js";
77
+ import { approvalDecisionsOf } from "./approval-decisions.js";
78
78
  import type { ArtifactStorage } from "../shared/artifact-storage.js";
79
79
  import type { TimingRecorder } from "../shared/cold-start-timing.js";
80
80
  import { resolveBlueprint, type ResolvedBlueprint } from "../shared/blueprint-resolver.js";
@@ -104,7 +104,7 @@ import { deriveActiveLeases, mergeApprovalPolicies } from "../shared/approval-po
104
104
  import { resolveAttachments } from "../shared/attachment-resolver.js";
105
105
  import { resolveSkills, type SkillMetadata } from "../shared/skill-resolver.js";
106
106
  import { VisionBudget, type NotViewableEntry, type VisionProfile } from "../shared/attachment-vision.js";
107
- import { getModelVisionCapability } from "../shared/model-registry.js";
107
+ import { getDefaultModel, getModelVisionCapability } from "../shared/model-registry.js";
108
108
  import { applyApprovedWholeFileWrites } from "../shared/exact-apply.js";
109
109
  import { resolveEffectiveServiceTier } from "../shared/service-tier.js";
110
110
  import { resolveEffectiveThinkingMode } from "../shared/thinking-mode.js";
@@ -115,13 +115,14 @@ import { readDeclaredPreferences } from "../shared/declared-preferences.js";
115
115
  import { readConversationCatchup } from "../shared/conversation-catchup.js";
116
116
  import { selectRecalledFacts } from "../shared/memory-retrieval.js";
117
117
  import type { RecalledMemoriesContent } from "../shared/recalled-memories.js";
118
- import type { FileReviewIdentity, HarnessCapabilities, StateIdSource } from "./capabilities.js";
118
+ import type { FileReviewIdentity, HarnessCapabilities, PausePrimitive, StateIdSource } from "./capabilities.js";
119
119
  import type {
120
120
  TurnAttachments,
121
121
  TurnEnvironment,
122
122
  TurnInput,
123
123
  TurnMcp,
124
124
  TurnModelPreferences,
125
+ TurnSkills,
125
126
  TurnStandingContext,
126
127
  TurnWorkspace,
127
128
  } from "./types.js";
@@ -180,9 +181,8 @@ export interface ResolutionDeps {
180
181
  * `TurnInput`: `isReinvocation` is the adapter's own derivation from
181
182
  * `threadId` (the contract carries no flag by design, `types.ts` header) and
182
183
  * the runtime reads it only inside {@link resolveTurnContext}; the decisions
183
- * ARE on the input. The seeded sub-agent rows are the adapter's to clone from
184
- * `execution.status` (its accumulator owns `status.subAgentExecutions` and
185
- * overwrites it on every flush), so they ride nothing here.
184
+ * ARE on the input. The seeded rows of every kind are on `sink.status`
185
+ * ({@link seedFromPersistedStatus}); an adapter wraps them by reference.
186
186
  */
187
187
  export interface TurnReinvocation {
188
188
  /** The engine already holds state for this execution (derived per {@link isReinvocation}). */
@@ -204,16 +204,16 @@ export interface TurnReinvocation {
204
204
  * - `workspace-lock-timeout`: another turn held the primary tree past
205
205
  * `Config.workspaceLockTimeoutMs`. FAILED, returned (a Temporal retry
206
206
  * would queue behind the same holder).
207
- * - `rejected-by-user`: an adjudicated irreversible action (shell / MCP)
208
- * was REJECTed. FAILED, returned.
209
207
  * - `file-review-resolved`: a pure file-review resume; the agent already
210
208
  * finished its turn during capture and the reconcile is the whole act.
211
209
  * COMPLETED, returned, with the write-back finalized first when the
212
210
  * reconcile held.
211
+ *
212
+ * A REJECTed tool is not a settlement: the run continues without it
213
+ * (`approval-decisions.ts`).
213
214
  */
214
215
  export type TurnSettlement =
215
216
  | { readonly kind: "workspace-lock-timeout"; readonly error: WorkspaceLockTimeoutError }
216
- | { readonly kind: "rejected-by-user" }
217
217
  | {
218
218
  readonly kind: "file-review-resolved";
219
219
  readonly failed: boolean;
@@ -246,18 +246,32 @@ export type ReinvocationOutcome =
246
246
  * and the legacy positional wire shape yields 0, so `turnSeq` cannot be
247
247
  * the signal (`index.ts` L402-407).
248
248
  * - `deterministic` (native: the runtime-minted thread id): the id exists
249
- * on the FIRST turn too, so the evidence is the persisted transcript
250
- * (pending approvals, DECIDED sets). That arm lands in S3 with the native
251
- * adapter; until then this function refuses rather than guess.
249
+ * on the FIRST turn too, so the evidence is the persisted transcript.
250
+ * Whether the execution already has committed history is the ONE signal
251
+ * that behaves identically across the engine's checkpointer backends:
252
+ * a durable saver (sqlite locally, http in cloud) keeps the checkpoint
253
+ * and resumes from it, while the test-only memory saver recreates it
254
+ * empty and replays from scratch — so the live checkpoint cannot be the
255
+ * signal (native's `shouldSeedFromPersistedTranscript`, retired with its
256
+ * orchestrator). A first run has no persisted messages and starts from
257
+ * empty, as it always did.
258
+ *
259
+ * This is the runtime's own reading, for its phases (the seed, the reconcile,
260
+ * the exact-apply). An adapter that needs create-vs-resume for its ENGINE
261
+ * reads `input.threadId` itself — for an engine-minted harness that is the
262
+ * same bit, for a deterministic one the engine's checkpoint is the adapter's
263
+ * to consult — so the contract carries no flag with two meanings (Q-M1-7).
252
264
  */
253
- export function isReinvocation(stateIdSource: StateIdSource, input: NormalizedActivityInput): boolean {
265
+ export function isReinvocation(
266
+ stateIdSource: StateIdSource,
267
+ input: NormalizedActivityInput,
268
+ execution: AgentExecution,
269
+ ): boolean {
254
270
  switch (stateIdSource) {
255
271
  case "engine-minted":
256
272
  return input.threadId !== "";
257
273
  case "deterministic":
258
- throw new Error(
259
- "isReinvocation: the deterministic arm lands with the native adapter (S3); no S2 harness mints its state id deterministically",
260
- );
274
+ return (execution.status?.messages.length ?? 0) > 0;
261
275
  default: {
262
276
  const exhaustive: never = stateIdSource;
263
277
  throw new Error(`isReinvocation: unknown state id source ${String(exhaustive)}`);
@@ -265,27 +279,6 @@ export function isReinvocation(stateIdSource: StateIdSource, input: NormalizedAc
265
279
  }
266
280
  }
267
281
 
268
- /**
269
- * The runtime's one reader of approval decisions: every top-level tool-call
270
- * row still WAITING_APPROVAL whose `approvalAction` the server has set,
271
- * keyed by tool-call id. Derived from the status on every invocation, never
272
- * stored, so it cannot drift from the rows. The same rows, in the same
273
- * order, that the Cursor adapter's `reconstructAdjudicatedApprovals` reads
274
- * for its own facts (the pending-approval protos and content digests); a
275
- * test pins the two readers' agreement.
276
- */
277
- export function approvalDecisionsOf(status: AgentExecutionStatus): ReadonlyMap<string, ApprovalAction> {
278
- const decisions = new Map<string, ApprovalAction>();
279
- for (const message of status.messages) {
280
- for (const row of message.toolCalls) {
281
- if (row.status !== ToolCallStatus.TOOL_CALL_WAITING_APPROVAL) continue;
282
- if (row.approvalAction === ApprovalAction.UNSPECIFIED) continue;
283
- decisions.set(row.id, row.approvalAction);
284
- }
285
- }
286
- return decisions;
287
- }
288
-
289
282
  /** The facts the reinvocation decision reads; produced by {@link reconcileReinvocation}, exposed for the decision's own tests. */
290
283
  export interface ReinvocationFacts {
291
284
  readonly approvalDecisions: ReadonlyMap<string, ApprovalAction>;
@@ -298,21 +291,23 @@ export interface ReinvocationFacts {
298
291
  }
299
292
 
300
293
  /**
301
- * How a reinvocation proceeds, decided once from the facts (`index.ts`
302
- * L547-618): a REJECT of an irreversible action fails the turn; any other
303
- * adjudicated decision runs the agent (the approved shell/MCP proceeds and
304
- * may produce further edits); a resume that reconciled file review and
305
- * decided nothing else is complete, because keeping or discarding a file
306
- * never re-prompts the agent (Cursor-like). `undefined` means "run the
307
- * agent".
294
+ * How a reinvocation proceeds, decided once from the facts: any adjudicated
295
+ * decision runs the agent an approved shell/MCP proceeds and may produce
296
+ * further edits; a SKIP or REJECT denies its tool and the run continues
297
+ * without it (the row is settled SKIPPED after the turn,
298
+ * `approval-decisions.ts`); a resume that reconciled file review and decided
299
+ * nothing else is complete, because keeping or discarding a file never
300
+ * re-prompts the agent (Cursor-like). `undefined` means "run the agent".
301
+ *
302
+ * Until S3 M1 a REJECT failed the turn here with its own FAILED arm, Cursor's
303
+ * legacy; the proto (`APPROVAL_ACTION_REJECT`: "does NOT fail the run"), the
304
+ * conformance suite and the native harness said otherwise since stigmer#197,
305
+ * and the runtime now agrees (S2 M4 finding F1; Q-S3-2).
308
306
  */
309
307
  export function decideReinvocation(
310
308
  facts: ReinvocationFacts,
311
309
  ): Exclude<TurnSettlement, { kind: "workspace-lock-timeout" }> | undefined {
312
- if (facts.approvalDecisions.size > 0) {
313
- const hasReject = [...facts.approvalDecisions.values()].some((a) => a === ApprovalAction.REJECT);
314
- return hasReject ? { kind: "rejected-by-user" } : undefined;
315
- }
310
+ if (facts.approvalDecisions.size > 0) return undefined;
316
311
  if (facts.reconciledFileReview) {
317
312
  return {
318
313
  kind: "file-review-resolved",
@@ -325,41 +320,66 @@ export function decideReinvocation(
325
320
  }
326
321
 
327
322
  /**
328
- * Seed an in-progress status from the persisted execution on a durable
329
- * resume (HITL approval, pause/resume, transient recovery) so the upcoming
330
- * turn APPENDS onto prior history instead of replacing it.
323
+ * Seed an in-progress status from the persisted execution on a resume (HITL
324
+ * approval, pause/resume, transient recovery) so the upcoming turn APPENDS
325
+ * onto prior history instead of replacing it.
326
+ *
327
+ * Why the transcript must be seeded: a resumed engine re-issues the
328
+ * previously gated tool calls with brand-new call ids. Without seeding, the
329
+ * harness's accumulator would rebuild the transcript from empty and emit a
330
+ * status that drops the already-committed tool-call ids. The backend's
331
+ * append-only-at-identity guard rejects any non-terminal update that drops a
332
+ * committed tool-call id, so the resumed progress would never persist: the
333
+ * run stalls in WAITING_FOR_APPROVAL with no pending approvals and the
334
+ * workflow watchdog fails it. Seeding makes the resume status a strict
335
+ * superset; the re-runs are then reconciled in place onto these seeded calls
336
+ * by canonical identity inside the accumulator.
331
337
  *
332
- * Why it is required: a resumed engine re-issues the previously gated tool
333
- * calls with brand-new call ids. Without seeding, the harness's accumulator
334
- * would rebuild the transcript from empty and emit a status that drops the
335
- * already-committed tool-call ids. The backend's append-only-at-identity
336
- * guard rejects any non-terminal update that drops a committed tool-call id,
337
- * so the resumed progress would never persist: the run stalls in
338
- * WAITING_FOR_APPROVAL with no pending approvals and the workflow watchdog
339
- * fails it. Seeding makes the resume status a strict superset; the re-runs
340
- * are then reconciled in place onto these seeded calls by canonical identity
341
- * inside the accumulator.
338
+ * Why the OTHER collections must be seeded too the server's merge rule
339
+ * (`stigmer-server/src/domain/agentexecution/update-status.ts`): every list
340
+ * and singleton the runner owns is PRESENCE-GUARDED and then REPLACED
341
+ * wholesale `subAgentExecutions`, `todos`, `artifacts`,
342
+ * `workspaceWriteBacks` when non-empty (L327-345); `streamingUsage`,
343
+ * `recalledMemoriesReport`, `structuredOutput` when defined (L492-526). So
344
+ * the loss an unseeded resume suffers is not "empty replaces full" (the
345
+ * guard covers that) but "PARTIAL replaces full": a resumed turn that
346
+ * publishes one artifact, delegates one sub-agent, or touches one to-do
347
+ * sends a list holding only that, and the server replaces the prior turn's
348
+ * whole list with it. Seeding every one makes each write a superset again.
342
349
  *
343
- * The persisted protos are cloned so the input execution stays immutable.
344
- * Messages are pushed into `status.messages` (which the accumulator wraps by
345
- * reference) BEFORE the accumulator is constructed. Sub-agent executions are
346
- * NOT seeded here: the Cursor accumulator owns `status.subAgentExecutions`
347
- * and overwrites it on every flush, so the adapter clones them itself from
348
- * `input.execution.status` under the same "left a transcript" test.
350
+ * What is NOT seeded, and why: `fileChangeSets` and `pendingApprovals` are
351
+ * DERIVED by the server from its own ledgers on every write;
352
+ * `fileReviewEventStream` and `approvalEventStream` are server-owned ledgers
353
+ * the runner only APPENDS its own events to; `fileChangeProgress`,
354
+ * `setupProgress` and `contextInfo` are one turn's own or the server's; and
355
+ * `phase`, `startedAt`, `completedAt`, `error` are this turn's fresh
356
+ * terminal, written by the runtime.
357
+ *
358
+ * Every collection is mutated IN PLACE (pushed into, assigned into), never
359
+ * reassigned: the write-back coordinator already wraps this status through
360
+ * `statusProtoWriter`, and the harness's accumulator wraps `messages` and
361
+ * `subAgentExecutions` by reference after this runs, so a reassigned array
362
+ * would leave a wrapper holding the old one. The persisted protos are
363
+ * cloned so the input execution stays immutable.
349
364
  *
350
365
  * Moved from `execute-cursor/index.ts` `seedCursorTranscriptFromExecution`
351
- * (L2468-2478); the native twin is `execute-deep-agent/index.ts`
352
- * `seedStatusFromExecution` (S3 retires it).
366
+ * (messages only) and widened at S3 M1 to what native's whole-status clone
367
+ * (`execute-deep-agent/index.ts` `seedStatusFromExecution`, retired with its
368
+ * orchestrator) always carried, minus the fields above that it carried by
369
+ * accident (Q-S3-16).
353
370
  */
354
- export function seedTranscriptFromExecution(
355
- status: AgentExecutionStatus,
356
- execution: AgentExecution,
357
- ): void {
371
+ export function seedFromPersistedStatus(status: AgentExecutionStatus, execution: AgentExecution): void {
358
372
  const persisted = execution.status;
359
373
  if (!persisted || persisted.messages.length === 0) return;
360
- for (const message of persisted.messages) {
361
- status.messages.push(clone(AgentMessageSchema, message));
362
- }
374
+ const seed = clone(AgentExecutionStatusSchema, persisted);
375
+ status.messages.push(...seed.messages);
376
+ status.subAgentExecutions.push(...seed.subAgentExecutions);
377
+ status.artifacts.push(...seed.artifacts);
378
+ status.workspaceWriteBacks.push(...seed.workspaceWriteBacks);
379
+ for (const [id, todo] of Object.entries(seed.todos)) status.todos[id] = todo;
380
+ if (seed.streamingUsage !== undefined) status.streamingUsage = seed.streamingUsage;
381
+ if (seed.recalledMemoriesReport !== undefined) status.recalledMemoriesReport = seed.recalledMemoriesReport;
382
+ if (seed.structuredOutput !== undefined) status.structuredOutput = seed.structuredOutput;
363
383
  }
364
384
 
365
385
  // ---------------------------------------------------------------------------
@@ -529,7 +549,7 @@ export async function bindTelemetryBaggage(
529
549
  * whether this one runs the agent at all.
530
550
  *
531
551
  * On a reinvocation, first seed the in-progress status from the persisted
532
- * execution ({@link seedTranscriptFromExecution}), BEFORE the harness's
552
+ * execution ({@link seedFromPersistedStatus}), BEFORE the harness's
533
553
  * accumulator wraps `status.messages`. Then the file-review reconcile (the
534
554
  * dual-source half): every change set the server projected as DECIDED is
535
555
  * reconciled from the ledger decisions and the pinned git refs (approved
@@ -555,7 +575,7 @@ export async function reconcileReinvocation(
555
575
  },
556
576
  ): Promise<ReinvocationOutcome> {
557
577
  deps.enterPhase("reconcile_reinvocation");
558
- const reinvoked = isReinvocation(args.stateIdSource, deps.input);
578
+ const reinvoked = isReinvocation(args.stateIdSource, deps.input, args.execution);
559
579
  let reconciledFileReview = false;
560
580
  let fileReviewFailed = false;
561
581
  let fileReviewFailureDetail = "";
@@ -563,7 +583,7 @@ export async function reconcileReinvocation(
563
583
 
564
584
  if (reinvoked) {
565
585
  const existingStatus = args.execution.status;
566
- seedTranscriptFromExecution(deps.status, args.execution);
586
+ seedFromPersistedStatus(deps.status, args.execution);
567
587
 
568
588
  if (args.workspace.captureMode && args.workspace.primaryDir) {
569
589
  const decidedSets = (existingStatus?.fileChangeSets ?? []).filter(
@@ -743,26 +763,52 @@ export async function resolveMcpServersAndPolicies(
743
763
 
744
764
  /**
745
765
  * Phase 5 (`index.ts` L493-501, the orchestrator's position between the
746
- * tool surface and the attachments): mount the merged skills under the
747
- * session's platform dir, reachable from the workspace through its
748
- * `.stigmer` link, and return what a prompt renders (`shared/skill-
749
- * resolver.ts`). Reads the control plane, which is why it is the runtime's
750
- * and not a harness's; each harness places the returned metadata in its own
751
- * prompt shape. The `.stigmer` link this and the attachment phase create is
752
- * removed in the runtime's finally, after the harness's own teardown.
766
+ * tool surface and the attachments): mount the skills under the session's
767
+ * platform dir, reachable from the workspace through its `.stigmer` link,
768
+ * and return what a prompt renders, per owner (`shared/skill-resolver.ts`).
769
+ * Reads the control plane, which is why it is the runtime's and not a
770
+ * harness's; each harness places the returned metadata in its own prompt
771
+ * shapes the root's in its system prompt, a sub-agent's in that
772
+ * sub-agent's, client-free.
773
+ *
774
+ * The root's refs are the blueprint's merged set (agent plus session); a
775
+ * sub-agent's are its own `skillRefs`. Each ref resolves through the same
776
+ * resolver, so a skill the root and a sub-agent share is fetched per owner
777
+ * but MOUNTED once (the hash-keyed mount marker turns the second write into
778
+ * a no-op), and a ref that fails resolves to nothing for that owner alone,
779
+ * warned and never thrown, as the root's always did. Sub-agent refs are
780
+ * resolved only for a harness whose `capabilities.subAgents` is true: the
781
+ * blueprint's sub-agents are that harness's to compile, so their skills are
782
+ * its to render. One progress label for the whole phase, as before.
783
+ *
784
+ * The `.stigmer` link this and the attachment phase create is removed in
785
+ * the runtime's finally, after the harness's own teardown. Until S3 M1 the
786
+ * native orchestrator fetched and mounted sub-agent skills itself
787
+ * (`subagent-transformer.ts` with a client); this phase is where that read
788
+ * lives now (Q-S3-5).
753
789
  */
754
790
  export async function mountSkills(
755
791
  deps: ResolutionDeps,
756
- args: { readonly blueprint: ResolvedBlueprint; readonly sessionId: string; readonly primaryDir: string },
757
- ): Promise<readonly SkillMetadata[]> {
792
+ args: {
793
+ readonly blueprint: ResolvedBlueprint;
794
+ readonly sessionId: string;
795
+ readonly primaryDir: string;
796
+ readonly subAgents: boolean;
797
+ },
798
+ ): Promise<TurnSkills> {
758
799
  deps.enterPhase("resolve_skills");
759
800
  await deps.reportProgress("Resolving skills");
760
- const skills = await resolveSkills(deps.client, args.blueprint.mergedSkillRefs, {
761
- sessionId: args.sessionId,
762
- primaryWorkspaceDir: args.primaryDir,
763
- });
801
+ const options = { sessionId: args.sessionId, primaryWorkspaceDir: args.primaryDir };
802
+ const root = await resolveSkills(deps.client, args.blueprint.mergedSkillRefs, options);
803
+ const bySubAgent = new Map<string, readonly SkillMetadata[]>();
804
+ if (args.subAgents) {
805
+ for (const subAgent of args.blueprint.subAgents) {
806
+ if (subAgent.skillRefs.length === 0) continue;
807
+ bySubAgent.set(subAgent.name, await resolveSkills(deps.client, subAgent.skillRefs, options));
808
+ }
809
+ }
764
810
  deps.timing.mark("resolve_skills");
765
- return skills;
811
+ return { root, bySubAgent };
766
812
  }
767
813
 
768
814
  /**
@@ -771,12 +817,17 @@ export async function mountSkills(
771
817
  * Downloads by storage key through the same artifact storage resolved for
772
818
  * status offload. The vision budget rides along so image attachments are
773
819
  * selected for inline delivery while their bytes are already in hand
774
- * (`shared/attachment-vision.ts` owns all policy); it carries the requested
775
- * model's registry vision capability, looked up from the raw
776
- * executionConfig name, because full model validation isn't needed for
777
- * this and ""/"default" (the Auto pool) resolves to unknown, which the
778
- * policy treats as sighted. The vision profile is the harness's (each
779
- * engine accepts different image shapes), so it arrives as an argument.
820
+ * (`shared/attachment-vision.ts` owns all policy); it carries the vision
821
+ * capability of the model the turn will run on: the one the execution named,
822
+ * or the registry's default when it named none — the model the native
823
+ * harness builds in that case, so the budget asks about the model that will
824
+ * actually see the image. Full model validation is not needed for this. The
825
+ * Cursor harness with no model named builds its own catalog default instead
826
+ * (`resolveModelId("default")`), so for it this is an approximation: today
827
+ * both answers read as sighted, and the exact per-harness default is S4's
828
+ * to declare (S3 M1 finding F-M1-4). The vision profile is the harness's
829
+ * (each engine accepts different image shapes), so it arrives as an
830
+ * argument.
780
831
  */
781
832
  export async function resolveTurnAttachments(
782
833
  deps: ResolutionDeps,
@@ -788,8 +839,9 @@ export async function resolveTurnAttachments(
788
839
  },
789
840
  ): Promise<TurnAttachments> {
790
841
  deps.enterPhase("resolve_attachments");
842
+ const modelName = args.spec.executionConfig?.modelName || (await getDefaultModel());
791
843
  const visionBudget = new VisionBudget(args.visionProfile, {
792
- modelVision: await getModelVisionCapability(args.spec.executionConfig?.modelName ?? ""),
844
+ modelVision: await getModelVisionCapability(modelName),
793
845
  });
794
846
  const results = await resolveAttachments(args.spec.attachments, {
795
847
  sessionId: args.sessionId,
@@ -816,6 +868,35 @@ export async function resolveTurnAttachments(
816
868
  return { results, visionImages, visionNotViewable };
817
869
  }
818
870
 
871
+ /**
872
+ * Whether a harness performs an approved call by RE-RUNNING the model, so
873
+ * the bytes an approved whole-file write lands can differ from the bytes the
874
+ * user approved unless the runner pins them itself
875
+ * ({@link applyApprovedWrites}). Keyed on the pause primitive
876
+ * (`capabilities.ts`): `deny-and-retry` denies the call and re-prompts the
877
+ * model with grants; `callback` answers "deny, stop" and the resumed session
878
+ * re-attempts the call — both regenerate. An `interrupt` engine checkpoints
879
+ * AT the call and applies its exact args on `approve`, so a runner-side
880
+ * write would land the same bytes twice and pre-empt a row the engine is
881
+ * about to execute; `none` gates nothing. Until S3 M2a the phase ran for
882
+ * every harness — a deny-and-retry mechanism the native harness would have
883
+ * met on its first deny-gated file approval (F-M2a-2, Q-M2a-3).
884
+ */
885
+ export function regeneratesApprovedWrites(pausePrimitive: PausePrimitive): boolean {
886
+ switch (pausePrimitive) {
887
+ case "deny-and-retry":
888
+ case "callback":
889
+ return true;
890
+ case "interrupt":
891
+ case "none":
892
+ return false;
893
+ default: {
894
+ const exhaustive: never = pausePrimitive;
895
+ throw new Error(`regeneratesApprovedWrites: unknown pause primitive ${String(exhaustive)}`);
896
+ }
897
+ }
898
+ }
899
+
819
900
  /**
820
901
  * Phase 5b3 (`index.ts` L849-867): exact-apply approved whole-file writes
821
902
  * (HITL "what you approve is what gets applied"). A deny-only harness
@@ -828,8 +909,9 @@ export async function resolveTurnAttachments(
828
909
  * uncertain case degrades to that path, so this can never corrupt a file
829
910
  * (see `shared/exact-apply.ts`).
830
911
  *
831
- * Scoped OUT of capture mode, which does not reinvoke the model for file
832
- * edits: it applies the exact captured bytes itself in the reconcile.
912
+ * Scoped to the harnesses that regenerate ({@link regeneratesApprovedWrites})
913
+ * and OUT of capture mode, which does not reinvoke the model for file edits:
914
+ * it applies the exact captured bytes itself in the reconcile.
833
915
  *
834
916
  * The caller persists when the returned set is non-empty (the applied state
835
917
  * must be durable before the continuation runs, and the UI reflects it at
@@ -838,12 +920,18 @@ export async function resolveTurnAttachments(
838
920
  export async function applyApprovedWrites(
839
921
  deps: ResolutionDeps,
840
922
  args: {
923
+ readonly pausePrimitive: PausePrimitive;
841
924
  readonly workspace: TurnWorkspace;
842
925
  readonly reinvocation: TurnReinvocation;
843
926
  },
844
927
  ): Promise<ReadonlySet<string>> {
845
- const { workspace, reinvocation } = args;
846
- if (workspace.captureMode || !reinvocation.isReinvocation || reinvocation.approvalDecisions.size === 0) {
928
+ const { pausePrimitive, workspace, reinvocation } = args;
929
+ if (
930
+ !regeneratesApprovedWrites(pausePrimitive) ||
931
+ workspace.captureMode ||
932
+ !reinvocation.isReinvocation ||
933
+ reinvocation.approvalDecisions.size === 0
934
+ ) {
847
935
  return new Set();
848
936
  }
849
937
  deps.enterPhase("apply_approved_writes");
@@ -987,14 +1075,23 @@ export async function resolveTurnContext(
987
1075
  if (reinvoked.kind === "settled") return { kind: "settled", settlement: reinvoked.settlement };
988
1076
 
989
1077
  const mcp = await resolveMcpServersAndPolicies(deps, { execution, session, sessionId, blueprint, environment });
990
- const skills = await mountSkills(deps, { blueprint, sessionId, primaryDir: workspace.primaryDir });
1078
+ const skills = await mountSkills(deps, {
1079
+ blueprint,
1080
+ sessionId,
1081
+ primaryDir: workspace.primaryDir,
1082
+ subAgents: capabilities.subAgents,
1083
+ });
991
1084
  const attachments = await resolveTurnAttachments(deps, {
992
1085
  spec,
993
1086
  sessionId,
994
1087
  primaryDir: workspace.primaryDir,
995
1088
  visionProfile: capabilities.visionProfile,
996
1089
  });
997
- const appliedToolCallIds = await applyApprovedWrites(deps, { workspace, reinvocation: reinvoked.reinvocation });
1090
+ const appliedToolCallIds = await applyApprovedWrites(deps, {
1091
+ pausePrimitive: capabilities.pausePrimitive,
1092
+ workspace,
1093
+ reinvocation: reinvoked.reinvocation,
1094
+ });
998
1095
  if (appliedToolCallIds.size > 0) {
999
1096
  // Persist the applied writes (tool calls now COMPLETED with the approved
1000
1097
  // diff) before reinvocation, so the applied state is durable even if the