@stigmer/runner 3.15.3-dev.20260914100347 → 3.15.3-dev.20260916211208

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 (549) hide show
  1. package/README.md +1 -0
  2. package/dist/.build-fingerprint +1 -1
  3. package/dist/__test-utils__/approval-contract/types.d.ts +1 -1
  4. package/dist/__test-utils__/hermetic-activity.d.ts +61 -7
  5. package/dist/__test-utils__/hermetic-activity.js +100 -9
  6. package/dist/__test-utils__/hermetic-activity.js.map +1 -1
  7. package/dist/__test-utils__/model-registry-fixture.d.ts +22 -3
  8. package/dist/__test-utils__/model-registry-fixture.js +22 -7
  9. package/dist/__test-utils__/model-registry-fixture.js.map +1 -1
  10. package/dist/activities/execute-cursor/__test-utils__/contract-subject.d.ts +2 -2
  11. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +14 -11
  12. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -1
  13. package/dist/activities/execute-cursor/__test-utils__/fold.d.ts +61 -0
  14. package/dist/activities/execute-cursor/__test-utils__/fold.js +94 -0
  15. package/dist/activities/execute-cursor/__test-utils__/fold.js.map +1 -0
  16. package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js +1 -1
  17. package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js.map +1 -1
  18. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +52 -14
  19. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +46 -12
  20. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
  21. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.d.ts +21 -28
  22. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js +27 -11
  23. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js.map +1 -1
  24. package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.d.ts +70 -26
  25. package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js +82 -32
  26. package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js.map +1 -1
  27. package/dist/activities/execute-cursor/adapter.d.ts +8 -7
  28. package/dist/activities/execute-cursor/adapter.js +13 -9
  29. package/dist/activities/execute-cursor/adapter.js.map +1 -1
  30. package/dist/activities/execute-cursor/approval-policy.d.ts +10 -10
  31. package/dist/activities/execute-cursor/approval-policy.js +12 -23
  32. package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
  33. package/dist/activities/execute-cursor/approval-state.d.ts +35 -1
  34. package/dist/activities/execute-cursor/approval-state.js +65 -0
  35. package/dist/activities/execute-cursor/approval-state.js.map +1 -1
  36. package/dist/activities/execute-cursor/{message-translator.d.ts → boundary-rows.d.ts} +45 -341
  37. package/dist/activities/execute-cursor/boundary-rows.js +1018 -0
  38. package/dist/activities/execute-cursor/boundary-rows.js.map +1 -0
  39. package/dist/activities/execute-cursor/cursor-capabilities.d.ts +1 -1
  40. package/dist/activities/execute-cursor/cursor-capabilities.js +1 -1
  41. package/dist/activities/execute-cursor/cursor-event-recorder.d.ts +33 -14
  42. package/dist/activities/execute-cursor/cursor-event-recorder.js +43 -21
  43. package/dist/activities/execute-cursor/cursor-event-recorder.js.map +1 -1
  44. package/dist/activities/execute-cursor/prompt-builder.d.ts +3 -3
  45. package/dist/activities/execute-cursor/prompt-builder.js +4 -4
  46. package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
  47. package/dist/activities/execute-cursor/sdk-warmup.d.ts +15 -6
  48. package/dist/activities/execute-cursor/sdk-warmup.js +15 -6
  49. package/dist/activities/execute-cursor/sdk-warmup.js.map +1 -1
  50. package/dist/activities/execute-cursor/service-tier.js +1 -2
  51. package/dist/activities/execute-cursor/service-tier.js.map +1 -1
  52. package/dist/activities/execute-cursor/session-lifecycle.d.ts +38 -59
  53. package/dist/activities/execute-cursor/session-lifecycle.js +59 -96
  54. package/dist/activities/execute-cursor/session-lifecycle.js.map +1 -1
  55. package/dist/activities/execute-cursor/session-store.d.ts +100 -0
  56. package/dist/activities/execute-cursor/session-store.js +157 -0
  57. package/dist/activities/execute-cursor/session-store.js.map +1 -0
  58. package/dist/activities/execute-cursor/sub-agent-steps.d.ts +79 -0
  59. package/dist/activities/execute-cursor/sub-agent-steps.js +180 -0
  60. package/dist/activities/execute-cursor/sub-agent-steps.js.map +1 -0
  61. package/dist/activities/execute-cursor/tool-result.d.ts +49 -0
  62. package/dist/activities/execute-cursor/tool-result.js +130 -0
  63. package/dist/activities/execute-cursor/tool-result.js.map +1 -0
  64. package/dist/activities/execute-cursor/translator.d.ts +178 -0
  65. package/dist/activities/execute-cursor/translator.js +485 -0
  66. package/dist/activities/execute-cursor/translator.js.map +1 -0
  67. package/dist/activities/execute-cursor/turn-boundary.d.ts +15 -5
  68. package/dist/activities/execute-cursor/turn-boundary.js +10 -14
  69. package/dist/activities/execute-cursor/turn-boundary.js.map +1 -1
  70. package/dist/activities/execute-cursor/turn-settle.d.ts +11 -7
  71. package/dist/activities/execute-cursor/turn-settle.js +47 -34
  72. package/dist/activities/execute-cursor/turn-settle.js.map +1 -1
  73. package/dist/activities/execute-cursor/turn-setup.d.ts +2 -2
  74. package/dist/activities/execute-cursor/turn-setup.js +5 -5
  75. package/dist/activities/execute-cursor/turn-setup.js.map +1 -1
  76. package/dist/activities/execute-cursor/turn-stream.d.ts +23 -14
  77. package/dist/activities/execute-cursor/turn-stream.js +41 -28
  78. package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
  79. package/dist/activities/execute-cursor/turn.d.ts +4 -4
  80. package/dist/activities/execute-cursor/turn.js +5 -5
  81. package/dist/activities/execute-cursor/usage-pricing.d.ts +2 -2
  82. package/dist/activities/execute-cursor/usage-pricing.js +2 -2
  83. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.d.ts +2 -2
  84. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js +2 -2
  85. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +16 -11
  86. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +22 -10
  87. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -1
  88. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js +1 -1
  89. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js.map +1 -1
  90. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.d.ts +2 -3
  91. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js +2 -3
  92. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js.map +1 -1
  93. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +12 -3
  94. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +18 -4
  95. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
  96. package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.d.ts +10 -1
  97. package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js +24 -11
  98. package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js.map +1 -1
  99. package/dist/activities/execute-deep-agent/adapter.d.ts +1 -1
  100. package/dist/activities/execute-deep-agent/adapter.js +1 -1
  101. package/dist/activities/execute-deep-agent/approval-file-change.d.ts +19 -19
  102. package/dist/activities/execute-deep-agent/approval-file-change.js +16 -15
  103. package/dist/activities/execute-deep-agent/approval-file-change.js.map +1 -1
  104. package/dist/activities/execute-deep-agent/deep-agent-capabilities.d.ts +2 -2
  105. package/dist/activities/execute-deep-agent/deep-agent-capabilities.js +2 -2
  106. package/dist/activities/execute-deep-agent/hitl.d.ts +2 -2
  107. package/dist/activities/execute-deep-agent/hitl.js +2 -2
  108. package/dist/activities/execute-deep-agent/inline-publisher.d.ts +13 -3
  109. package/dist/activities/execute-deep-agent/inline-publisher.js +3 -3
  110. package/dist/activities/execute-deep-agent/inline-publisher.js.map +1 -1
  111. package/dist/activities/execute-deep-agent/prompt-builder.d.ts +3 -3
  112. package/dist/activities/execute-deep-agent/prompt-builder.js +6 -7
  113. package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
  114. package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +16 -8
  115. package/dist/activities/execute-deep-agent/streaming-side-effects.js +20 -33
  116. package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
  117. package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +3 -3
  118. package/dist/activities/execute-deep-agent/subagent-transformer.js +1 -1
  119. package/dist/activities/execute-deep-agent/translator.d.ts +134 -0
  120. package/dist/activities/execute-deep-agent/translator.js +418 -0
  121. package/dist/activities/execute-deep-agent/translator.js.map +1 -0
  122. package/dist/activities/execute-deep-agent/turn-settle.d.ts +13 -7
  123. package/dist/activities/execute-deep-agent/turn-settle.js +34 -45
  124. package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -1
  125. package/dist/activities/execute-deep-agent/turn-setup.d.ts +8 -8
  126. package/dist/activities/execute-deep-agent/turn-setup.js +7 -7
  127. package/dist/activities/execute-deep-agent/turn-stream.d.ts +13 -10
  128. package/dist/activities/execute-deep-agent/turn-stream.js +44 -41
  129. package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -1
  130. package/dist/activities/execute-deep-agent/turn.d.ts +3 -3
  131. package/dist/activities/execute-deep-agent/turn.js +3 -3
  132. package/dist/config.d.ts +2 -2
  133. package/dist/harness/approval-decisions.d.ts +1 -1
  134. package/dist/harness/approval-decisions.js +1 -1
  135. package/dist/harness/capabilities.d.ts +21 -11
  136. package/dist/harness/capabilities.js +2 -2
  137. package/dist/harness/capture.d.ts +4 -4
  138. package/dist/harness/capture.js +4 -4
  139. package/dist/harness/persist-chokepoint.d.ts +3 -3
  140. package/dist/harness/persist-chokepoint.js +3 -3
  141. package/dist/harness/registry.d.ts +2 -2
  142. package/dist/harness/registry.js +2 -2
  143. package/dist/harness/run-turn.d.ts +6 -4
  144. package/dist/harness/run-turn.js +31 -9
  145. package/dist/harness/run-turn.js.map +1 -1
  146. package/dist/harness/stop-controller.d.ts +1 -1
  147. package/dist/harness/stop-controller.js +1 -1
  148. package/dist/harness/terminal-table.d.ts +7 -7
  149. package/dist/harness/terminal-table.js +7 -7
  150. package/dist/harness/transcript/builder.d.ts +182 -0
  151. package/dist/harness/transcript/builder.js +693 -0
  152. package/dist/harness/transcript/builder.js.map +1 -0
  153. package/dist/harness/transcript/events.d.ts +218 -0
  154. package/dist/harness/transcript/events.js +50 -0
  155. package/dist/harness/transcript/events.js.map +1 -0
  156. package/dist/harness/transcript/state.d.ts +110 -0
  157. package/dist/harness/transcript/state.js +148 -0
  158. package/dist/harness/transcript/state.js.map +1 -0
  159. package/dist/harness/turn-context.d.ts +54 -38
  160. package/dist/harness/turn-context.js +42 -43
  161. package/dist/harness/turn-context.js.map +1 -1
  162. package/dist/harness/types.d.ts +63 -22
  163. package/dist/harness/types.js +12 -11
  164. package/dist/harness/types.js.map +1 -1
  165. package/dist/harness/usage-accumulator.d.ts +2 -2
  166. package/dist/harness/usage-accumulator.js +2 -2
  167. package/dist/harness-adapters.d.ts +5 -4
  168. package/dist/harness-adapters.js +5 -4
  169. package/dist/harness-adapters.js.map +1 -1
  170. package/dist/middleware/approval-gate.d.ts +6 -0
  171. package/dist/middleware/approval-gate.js +7 -57
  172. package/dist/middleware/approval-gate.js.map +1 -1
  173. package/dist/middleware/cost-advisory.d.ts +3 -3
  174. package/dist/middleware/cost-advisory.js +3 -3
  175. package/dist/middleware/index.d.ts +1 -1
  176. package/dist/middleware/index.js +1 -1
  177. package/dist/runner-manager.js +1 -1
  178. package/dist/runner-manager.js.map +1 -1
  179. package/dist/shared/approval-policy.d.ts +53 -0
  180. package/dist/shared/approval-policy.js +76 -0
  181. package/dist/shared/approval-policy.js.map +1 -1
  182. package/dist/shared/args-preview.d.ts +45 -22
  183. package/dist/shared/args-preview.js +51 -41
  184. package/dist/shared/args-preview.js.map +1 -1
  185. package/dist/shared/attachment-resolver.d.ts +4 -4
  186. package/dist/shared/attachment-resolver.js +4 -4
  187. package/dist/shared/attachment-vision.d.ts +2 -1
  188. package/dist/shared/attachment-vision.js.map +1 -1
  189. package/dist/shared/attachment-zip.d.ts +2 -2
  190. package/dist/shared/attachment-zip.js +2 -2
  191. package/dist/shared/cost-guard.d.ts +2 -2
  192. package/dist/shared/cost-guard.js +2 -2
  193. package/dist/shared/exact-apply.d.ts +1 -1
  194. package/dist/shared/exact-apply.js +1 -1
  195. package/dist/shared/execution-context.d.ts +2 -2
  196. package/dist/shared/execution-context.js +2 -2
  197. package/dist/shared/extract-structured-output.d.ts +2 -2
  198. package/dist/shared/extract-structured-output.js +2 -2
  199. package/dist/shared/filereview/cas-touched.d.ts +2 -2
  200. package/dist/shared/filereview/cas-touched.js +2 -2
  201. package/dist/shared/heartbeat.d.ts +1 -1
  202. package/dist/shared/heartbeat.js +1 -1
  203. package/dist/shared/llm-backend.d.ts +0 -4
  204. package/dist/shared/llm-backend.js +0 -4
  205. package/dist/shared/llm-backend.js.map +1 -1
  206. package/dist/shared/model-error.d.ts +1 -2
  207. package/dist/shared/model-error.js +1 -2
  208. package/dist/shared/model-error.js.map +1 -1
  209. package/dist/shared/persist-decision.d.ts +18 -24
  210. package/dist/shared/persist-decision.js +19 -11
  211. package/dist/shared/persist-decision.js.map +1 -1
  212. package/dist/shared/prompt-sections.d.ts +4 -4
  213. package/dist/shared/prompt-sections.js +4 -4
  214. package/dist/shared/skill-resolver.d.ts +3 -3
  215. package/dist/shared/skill-resolver.js +3 -3
  216. package/dist/shared/status-offload.d.ts +1 -1
  217. package/dist/shared/status-offload.js +2 -2
  218. package/dist/shared/status-offload.js.map +1 -1
  219. package/dist/shared/streaming-scheduler.d.ts +2 -7
  220. package/dist/shared/streaming-scheduler.js +6 -14
  221. package/dist/shared/streaming-scheduler.js.map +1 -1
  222. package/dist/shared/subagent-rows.d.ts +2 -2
  223. package/dist/shared/subagent-rows.js +2 -2
  224. package/dist/shared/todos.d.ts +3 -3
  225. package/dist/shared/todos.js +3 -3
  226. package/dist/shared/tool-row.d.ts +19 -1
  227. package/dist/shared/tool-row.js +36 -2
  228. package/dist/shared/tool-row.js.map +1 -1
  229. package/dist/shared/worker-shutdown.d.ts +1 -1
  230. package/dist/shared/worker-shutdown.js +1 -1
  231. package/dist/shared/workspace/session-provision.d.ts +1 -1
  232. package/dist/shared/workspace/session-provision.js +1 -1
  233. package/dist/shared/workspace/sources/empty.d.ts +1 -1
  234. package/dist/shared/workspace/sources/empty.js +1 -2
  235. package/dist/shared/workspace/sources/empty.js.map +1 -1
  236. package/dist/shared/workspace/sources/git.js +4 -4
  237. package/dist/shared/workspace/sources/git.js.map +1 -1
  238. package/dist/shared/workspace/sources/local-path.js +6 -6
  239. package/dist/shared/workspace/sources/local-path.js.map +1 -1
  240. package/dist/shared/workspace/stigmer-link.d.ts +1 -1
  241. package/dist/shared/workspace/stigmer-link.js +1 -1
  242. package/dist/shared/workspace/types.d.ts +2 -5
  243. package/dist/shared/workspace/types.js +0 -6
  244. package/dist/shared/workspace/types.js.map +1 -1
  245. package/dist/shared/workspace/writeback-coordinator.d.ts +17 -4
  246. package/dist/shared/workspace/writeback-coordinator.js +7 -9
  247. package/dist/shared/workspace/writeback-coordinator.js.map +1 -1
  248. package/package.json +5 -5
  249. package/src/__test-utils__/__tests__/execution-record-barrier.test.ts +70 -0
  250. package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +35 -1
  251. package/src/__test-utils__/approval-contract/contract.ts +1 -1
  252. package/src/__test-utils__/approval-contract/types.ts +1 -1
  253. package/src/__test-utils__/harness-boot-order-child.ts +1 -1
  254. package/src/__test-utils__/harness-contract/contract.ts +8 -8
  255. package/src/__test-utils__/harness-contract/recording-sink.ts +11 -1
  256. package/src/__test-utils__/harness-contract/runtime-contract.ts +52 -16
  257. package/src/__test-utils__/harness-contract/scripted-adapter.ts +47 -43
  258. package/src/__test-utils__/hermetic-activity.ts +113 -9
  259. package/src/__test-utils__/model-registry-fixture.ts +31 -7
  260. package/src/__test-utils__/module-specifiers.ts +32 -3
  261. package/src/__tests__/harness-boot-order.test.ts +1 -1
  262. package/src/__tests__/harness-contract.test.ts +1 -1
  263. package/src/__tests__/runner-manager.test.ts +1 -1
  264. package/src/activities/execute-cursor/__test-utils__/__tests__/scripted-double.test.ts +32 -8
  265. package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +12 -10
  266. package/src/activities/execute-cursor/__test-utils__/fold.ts +116 -0
  267. package/src/activities/execute-cursor/__test-utils__/gateway-substrate.ts +1 -1
  268. package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +72 -19
  269. package/src/activities/execute-cursor/__test-utils__/scripted-agent.ts +35 -29
  270. package/src/activities/execute-cursor/__test-utils__/scripted-sdk.ts +94 -38
  271. package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +2 -1
  272. package/src/activities/execute-cursor/__tests__/approval-state.test.ts +14 -21
  273. package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +3 -3
  274. package/src/activities/execute-cursor/__tests__/coarse-fingerprint.test.ts +2 -1
  275. package/src/activities/execute-cursor/__tests__/cursor-baseurl-routing.test.ts +10 -8
  276. package/src/activities/execute-cursor/__tests__/cursor-event-recorder.test.ts +142 -0
  277. package/src/activities/execute-cursor/__tests__/cursor-fetch-interceptor-bypass.test.ts +24 -12
  278. package/src/activities/execute-cursor/__tests__/cursor-generate-image-live.test.ts +7 -2
  279. package/src/activities/execute-cursor/__tests__/cursor-hook-protocol-live.test.ts +163 -0
  280. package/src/activities/execute-cursor/__tests__/cursor-sdk-auth-smoke.test.ts +23 -20
  281. package/src/activities/execute-cursor/__tests__/cursor-transcript-live.test.ts +298 -0
  282. package/src/activities/execute-cursor/__tests__/deny-gate-exact-apply.test.ts +4 -2
  283. package/src/activities/execute-cursor/__tests__/fetch-interceptor.test.ts +1 -1
  284. package/src/activities/execute-cursor/__tests__/hermetic/deny-and-retry.test.ts +5 -2
  285. package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +5 -2
  286. package/src/activities/execute-cursor/__tests__/hermetic/goldens/mcp-tool-call.status.json +71 -0
  287. package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-task-note.status.json +73 -0
  288. package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.error-delta.status.json +78 -0
  289. package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.output-first.status.json +72 -0
  290. package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.status.json +72 -0
  291. package/src/activities/execute-cursor/__tests__/hermetic/goldens/sub-agent-delegation.status.json +109 -0
  292. package/src/activities/execute-cursor/__tests__/hermetic/goldens/thinking-turn.status.json +78 -0
  293. package/src/activities/execute-cursor/__tests__/hermetic/goldens/todo-write.status.json +119 -0
  294. package/src/activities/execute-cursor/__tests__/hermetic/goldens/tool-error.status.json +68 -0
  295. package/src/activities/execute-cursor/__tests__/hermetic/goldens/tool-only-step.status.json +67 -0
  296. package/src/activities/execute-cursor/__tests__/hermetic/goldens/unattributed-hook-block.status.json +1 -1
  297. package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +10 -7
  298. package/src/activities/execute-cursor/__tests__/hermetic/mcp-tool-call.test.ts +146 -0
  299. package/src/activities/execute-cursor/__tests__/hermetic/pause-vs-shutdown.test.ts +8 -5
  300. package/src/activities/execute-cursor/__tests__/hermetic/plain-turn.test.ts +6 -2
  301. package/src/activities/execute-cursor/__tests__/hermetic/recovery-fresh-agent.test.ts +4 -1
  302. package/src/activities/execute-cursor/__tests__/hermetic/run-wait-arms.test.ts +6 -2
  303. package/src/activities/execute-cursor/__tests__/hermetic/sdk-task-note.test.ts +122 -0
  304. package/src/activities/execute-cursor/__tests__/hermetic/shell-output-delta.test.ts +276 -0
  305. package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +12 -9
  306. package/src/activities/execute-cursor/__tests__/hermetic/sub-agent-delegation.test.ts +196 -0
  307. package/src/activities/execute-cursor/__tests__/hermetic/thinking-turn.test.ts +145 -0
  308. package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +4 -1
  309. package/src/activities/execute-cursor/__tests__/hermetic/todo-write.test.ts +165 -0
  310. package/src/activities/execute-cursor/__tests__/hermetic/tool-call.test.ts +7 -4
  311. package/src/activities/execute-cursor/__tests__/hermetic/tool-error.test.ts +138 -0
  312. package/src/activities/execute-cursor/__tests__/hermetic/tool-only-step.test.ts +130 -0
  313. package/src/activities/execute-cursor/__tests__/hermetic/unattributed-hook-block.test.ts +17 -2
  314. package/src/activities/execute-cursor/__tests__/hermetic/workspace-lock-timeout.test.ts +5 -2
  315. package/src/activities/execute-cursor/__tests__/hitl-ledger.test.ts +43 -60
  316. package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +23 -28
  317. package/src/activities/execute-cursor/__tests__/hook-script.test.ts +2 -1
  318. package/src/activities/execute-cursor/__tests__/http2-interceptor.test.ts +1 -1
  319. package/src/activities/execute-cursor/__tests__/prompt-goldens.test.ts +5 -5
  320. package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +11 -13
  321. package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +8 -11
  322. package/src/activities/execute-cursor/__tests__/session-lifecycle.test.ts +86 -58
  323. package/src/activities/execute-cursor/__tests__/session-store.test.ts +220 -0
  324. package/src/activities/execute-cursor/__tests__/tool-result-image.test.ts +8 -22
  325. package/src/activities/execute-cursor/__tests__/translator.test.ts +594 -0
  326. package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +8 -5
  327. package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +87 -63
  328. package/src/activities/execute-cursor/adapter.ts +13 -9
  329. package/src/activities/execute-cursor/approval-policy.ts +12 -24
  330. package/src/activities/execute-cursor/approval-state.ts +66 -1
  331. package/src/activities/execute-cursor/boundary-rows.ts +1132 -0
  332. package/src/activities/execute-cursor/cursor-capabilities.ts +1 -1
  333. package/src/activities/execute-cursor/cursor-event-recorder.ts +57 -28
  334. package/src/activities/execute-cursor/fetch-interceptor.ts +1 -1
  335. package/src/activities/execute-cursor/http2-interceptor.ts +1 -1
  336. package/src/activities/execute-cursor/prompt-builder.ts +6 -6
  337. package/src/activities/execute-cursor/sdk-warmup.ts +15 -6
  338. package/src/activities/execute-cursor/service-tier.ts +1 -2
  339. package/src/activities/execute-cursor/session-lifecycle.ts +63 -109
  340. package/src/activities/execute-cursor/session-store.ts +187 -0
  341. package/src/activities/execute-cursor/sub-agent-steps.ts +188 -0
  342. package/src/activities/execute-cursor/tool-result.ts +128 -0
  343. package/src/activities/execute-cursor/translator.ts +541 -0
  344. package/src/activities/execute-cursor/turn-boundary.ts +21 -14
  345. package/src/activities/execute-cursor/turn-settle.ts +46 -34
  346. package/src/activities/execute-cursor/turn-setup.ts +5 -5
  347. package/src/activities/execute-cursor/turn-stream.ts +49 -46
  348. package/src/activities/execute-cursor/turn.ts +5 -5
  349. package/src/activities/execute-cursor/usage-pricing.ts +2 -2
  350. package/src/activities/execute-deep-agent/__test-utils__/contract-subject.ts +2 -2
  351. package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +23 -11
  352. package/src/activities/execute-deep-agent/__test-utils__/hitl-script.ts +1 -1
  353. package/src/activities/execute-deep-agent/__test-utils__/scripted-model-module.ts +2 -3
  354. package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +25 -4
  355. package/src/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.ts +25 -11
  356. package/src/activities/execute-deep-agent/__tests__/adapter-graph-is-sdk-free.test.ts +1 -1
  357. package/src/activities/execute-deep-agent/__tests__/adapter-is-temporal-free.test.ts +1 -1
  358. package/src/activities/execute-deep-agent/__tests__/approval-file-change.test.ts +6 -17
  359. package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +25 -8
  360. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn1.status.json +2 -7
  361. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn2.status.json +4 -14
  362. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve.turn2.status.json +1 -5
  363. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +4 -7
  364. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/gate.turn1.status.json +1 -5
  365. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +2 -9
  366. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +2 -9
  367. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.after-tool.status.json +1 -4
  368. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.mid-tool.status.json +1 -4
  369. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/platform-stop.status.json +1 -4
  370. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +109 -76
  371. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/reject.turn2.status.json +1 -5
  372. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn2.status.json +2 -10
  373. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn3.status.json +2 -10
  374. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/skip.turn2.status.json +1 -5
  375. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sub-agent-delegation.status.json +3 -6
  376. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/tool-call.status.json +1 -4
  377. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/worker-shutdown.status.json +1 -4
  378. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/write-todos.status.json +92 -0
  379. package/src/activities/execute-deep-agent/__tests__/hermetic/harness-contract.test.ts +3 -3
  380. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-approve-all-lease.test.ts +9 -5
  381. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-round-trips.test.ts +3 -3
  382. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-sequential-gates.test.ts +3 -3
  383. package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +7 -6
  384. package/src/activities/execute-deep-agent/__tests__/hermetic/pause-vs-shutdown.test.ts +10 -11
  385. package/src/activities/execute-deep-agent/__tests__/hermetic/plain-turn.test.ts +4 -4
  386. package/src/activities/execute-deep-agent/__tests__/hermetic/platform-stop.test.ts +9 -8
  387. package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +21 -13
  388. package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +2 -2
  389. package/src/activities/execute-deep-agent/__tests__/hermetic/structured-output.test.ts +7 -7
  390. package/src/activities/execute-deep-agent/__tests__/hermetic/sub-agent-delegation.test.ts +28 -12
  391. package/src/activities/execute-deep-agent/__tests__/hermetic/tool-call.test.ts +21 -21
  392. package/src/activities/execute-deep-agent/__tests__/hermetic/workspace-lock-timeout.test.ts +5 -5
  393. package/src/activities/execute-deep-agent/__tests__/hermetic/write-todos.test.ts +160 -0
  394. package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +35 -30
  395. package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +3 -4
  396. package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +12 -10
  397. package/src/activities/execute-deep-agent/__tests__/scripted-model.test.ts +13 -3
  398. package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +26 -18
  399. package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +1 -1
  400. package/src/activities/execute-deep-agent/__tests__/{subagent-tracker.test.ts → translator-subagents.test.ts} +76 -57
  401. package/src/activities/execute-deep-agent/__tests__/{v3-status-builder.test.ts → translator-through-builder.test.ts} +213 -299
  402. package/src/activities/execute-deep-agent/__tests__/translator.test.ts +505 -0
  403. package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +11 -29
  404. package/src/activities/execute-deep-agent/adapter.ts +1 -1
  405. package/src/activities/execute-deep-agent/approval-file-change.ts +20 -22
  406. package/src/activities/execute-deep-agent/deep-agent-capabilities.ts +2 -2
  407. package/src/activities/execute-deep-agent/hitl.ts +2 -2
  408. package/src/activities/execute-deep-agent/inline-publisher.ts +16 -5
  409. package/src/activities/execute-deep-agent/prompt-builder.ts +6 -7
  410. package/src/activities/execute-deep-agent/streaming-side-effects.ts +22 -31
  411. package/src/activities/execute-deep-agent/subagent-transformer.ts +3 -3
  412. package/src/activities/execute-deep-agent/translator.ts +463 -0
  413. package/src/activities/execute-deep-agent/turn-settle.ts +35 -43
  414. package/src/activities/execute-deep-agent/turn-setup.ts +8 -8
  415. package/src/activities/execute-deep-agent/turn-stream.ts +53 -51
  416. package/src/activities/execute-deep-agent/turn.ts +3 -3
  417. package/src/config.ts +2 -2
  418. package/src/harness/README.md +335 -0
  419. package/src/harness/__tests__/approval-decisions.test.ts +2 -2
  420. package/src/harness/__tests__/capture.test.ts +3 -3
  421. package/src/harness/__tests__/import-direction.test.ts +3 -2
  422. package/src/harness/__tests__/mount-skills.test.ts +4 -1
  423. package/src/harness/__tests__/readme-index.test.ts +339 -0
  424. package/src/harness/__tests__/run-turn.test.ts +131 -6
  425. package/src/harness/__tests__/transcript-is-engine-free.test.ts +83 -0
  426. package/src/harness/__tests__/transcript-writers.test.ts +191 -0
  427. package/src/harness/__tests__/turn-attachments-vision.test.ts +5 -2
  428. package/src/harness/__tests__/turn-context.test.ts +5 -5
  429. package/src/harness/approval-decisions.ts +1 -1
  430. package/src/harness/capabilities.ts +21 -11
  431. package/src/harness/capture.ts +4 -4
  432. package/src/harness/persist-chokepoint.ts +3 -3
  433. package/src/harness/registry.ts +2 -2
  434. package/src/harness/run-turn.ts +33 -9
  435. package/src/harness/stop-controller.ts +1 -1
  436. package/src/harness/terminal-table.ts +7 -7
  437. package/src/harness/transcript/__tests__/builder.test.ts +975 -0
  438. package/src/harness/transcript/__tests__/state.test.ts +143 -0
  439. package/src/harness/transcript/builder.ts +755 -0
  440. package/src/harness/transcript/events.ts +262 -0
  441. package/src/harness/transcript/state.ts +167 -0
  442. package/src/harness/turn-context.ts +61 -46
  443. package/src/harness/types.ts +64 -22
  444. package/src/harness/usage-accumulator.ts +2 -2
  445. package/src/harness-adapters.ts +5 -4
  446. package/src/middleware/__tests__/cost-advisory.test.ts +2 -2
  447. package/src/middleware/approval-gate.ts +7 -74
  448. package/src/middleware/cost-advisory.ts +3 -3
  449. package/src/middleware/index.ts +1 -1
  450. package/src/runner-manager.ts +1 -1
  451. package/src/shared/__tests__/approval-policy.test.ts +45 -0
  452. package/src/shared/__tests__/args-preview.test.ts +40 -20
  453. package/src/shared/__tests__/attachment-naming.test.ts +1 -1
  454. package/src/shared/__tests__/attachment-resolver.test.ts +5 -5
  455. package/src/shared/__tests__/attachment-zip.test.ts +1 -1
  456. package/src/shared/__tests__/blueprint-resolver.test.ts +1 -1
  457. package/src/shared/__tests__/cost-guard.test.ts +1 -1
  458. package/src/shared/__tests__/exact-apply.test.ts +2 -1
  459. package/src/shared/__tests__/persist-decision.test.ts +19 -33
  460. package/src/shared/__tests__/prompt-sections.test.ts +1 -1
  461. package/src/shared/__tests__/stamp-flowed-rows.test.ts +1 -1
  462. package/src/shared/__tests__/status-offload.test.ts +1 -1
  463. package/src/shared/__tests__/streaming-scheduler.test.ts +8 -9
  464. package/src/shared/__tests__/todos.test.ts +1 -1
  465. package/src/shared/__tests__/tool-row.test.ts +1 -1
  466. package/src/shared/approval-policy.ts +95 -0
  467. package/src/shared/args-preview.ts +51 -42
  468. package/src/shared/attachment-resolver.ts +4 -4
  469. package/src/shared/attachment-vision.ts +2 -1
  470. package/src/shared/attachment-zip.ts +2 -2
  471. package/src/shared/cost-guard.ts +2 -2
  472. package/src/shared/exact-apply.ts +1 -1
  473. package/src/shared/execution-context.ts +2 -2
  474. package/src/shared/extract-structured-output.ts +2 -2
  475. package/src/shared/filereview/__tests__/capture.test.ts +9 -5
  476. package/src/shared/filereview/__tests__/git-substrate.test.ts +4 -1
  477. package/src/shared/filereview/__tests__/proxy-reconcile.test.ts +3 -3
  478. package/src/shared/filereview/cas-touched.ts +2 -2
  479. package/src/shared/heartbeat.ts +1 -1
  480. package/src/shared/llm-backend.ts +0 -4
  481. package/src/shared/model-error.ts +1 -2
  482. package/src/shared/persist-decision.ts +19 -28
  483. package/src/shared/prompt-sections.ts +4 -4
  484. package/src/shared/skill-resolver.ts +3 -3
  485. package/src/shared/status-offload.ts +2 -2
  486. package/src/shared/streaming-scheduler.ts +8 -13
  487. package/src/shared/subagent-rows.ts +2 -2
  488. package/src/shared/todos.ts +3 -3
  489. package/src/shared/tool-row.ts +38 -2
  490. package/src/shared/worker-shutdown.ts +1 -1
  491. package/src/shared/workspace/__tests__/git-source.test.ts +3 -3
  492. package/src/shared/workspace/__tests__/provisioner.test.ts +5 -5
  493. package/src/shared/workspace/__tests__/session-provision.test.ts +2 -2
  494. package/src/shared/workspace/__tests__/writeback-coordinator.integration.test.ts +8 -9
  495. package/src/shared/workspace/__tests__/writeback-coordinator.test.ts +25 -25
  496. package/src/shared/workspace/provisioner.ts +1 -1
  497. package/src/shared/workspace/session-provision.ts +1 -1
  498. package/src/shared/workspace/sources/empty.ts +2 -2
  499. package/src/shared/workspace/sources/git.ts +3 -4
  500. package/src/shared/workspace/sources/local-path.ts +5 -6
  501. package/src/shared/workspace/stigmer-link.ts +1 -1
  502. package/src/shared/workspace/types.ts +2 -5
  503. package/src/shared/workspace/writeback-coordinator.ts +23 -12
  504. package/dist/activities/execute-cursor/delta-enricher.d.ts +0 -87
  505. package/dist/activities/execute-cursor/delta-enricher.js +0 -265
  506. package/dist/activities/execute-cursor/delta-enricher.js.map +0 -1
  507. package/dist/activities/execute-cursor/message-translator.js +0 -2040
  508. package/dist/activities/execute-cursor/message-translator.js.map +0 -1
  509. package/dist/activities/execute-cursor/todo-tracker.d.ts +0 -40
  510. package/dist/activities/execute-cursor/todo-tracker.js +0 -80
  511. package/dist/activities/execute-cursor/todo-tracker.js.map +0 -1
  512. package/dist/activities/execute-deep-agent/execution-state.d.ts +0 -54
  513. package/dist/activities/execute-deep-agent/execution-state.js +0 -68
  514. package/dist/activities/execute-deep-agent/execution-state.js.map +0 -1
  515. package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +0 -65
  516. package/dist/activities/execute-deep-agent/status-builder-shared.js +0 -90
  517. package/dist/activities/execute-deep-agent/status-builder-shared.js.map +0 -1
  518. package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +0 -113
  519. package/dist/activities/execute-deep-agent/subagent-tracker.js +0 -400
  520. package/dist/activities/execute-deep-agent/subagent-tracker.js.map +0 -1
  521. package/dist/activities/execute-deep-agent/v3-events.d.ts +0 -102
  522. package/dist/activities/execute-deep-agent/v3-events.js +0 -35
  523. package/dist/activities/execute-deep-agent/v3-events.js.map +0 -1
  524. package/dist/activities/execute-deep-agent/v3-protocol-normalizer.d.ts +0 -15
  525. package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js +0 -235
  526. package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js.map +0 -1
  527. package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +0 -111
  528. package/dist/activities/execute-deep-agent/v3-status-builder.js +0 -457
  529. package/dist/activities/execute-deep-agent/v3-status-builder.js.map +0 -1
  530. package/dist/shared/execution-status-writer.d.ts +0 -31
  531. package/dist/shared/execution-status-writer.js +0 -43
  532. package/dist/shared/execution-status-writer.js.map +0 -1
  533. package/src/activities/execute-cursor/__tests__/delta-enricher.test.ts +0 -310
  534. package/src/activities/execute-cursor/__tests__/message-translator.test.ts +0 -1033
  535. package/src/activities/execute-cursor/__tests__/todo-tracker.test.ts +0 -498
  536. package/src/activities/execute-cursor/delta-enricher.ts +0 -307
  537. package/src/activities/execute-cursor/message-translator.ts +0 -2319
  538. package/src/activities/execute-cursor/todo-tracker.ts +0 -91
  539. package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +0 -148
  540. package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +0 -154
  541. package/src/activities/execute-deep-agent/__tests__/status-builder-shared.test.ts +0 -47
  542. package/src/activities/execute-deep-agent/__tests__/v3-protocol-normalizer.test.ts +0 -324
  543. package/src/activities/execute-deep-agent/execution-state.ts +0 -78
  544. package/src/activities/execute-deep-agent/status-builder-shared.ts +0 -142
  545. package/src/activities/execute-deep-agent/subagent-tracker.ts +0 -479
  546. package/src/activities/execute-deep-agent/v3-events.ts +0 -153
  547. package/src/activities/execute-deep-agent/v3-protocol-normalizer.ts +0 -264
  548. package/src/activities/execute-deep-agent/v3-status-builder.ts +0 -565
  549. package/src/shared/execution-status-writer.ts +0 -56
@@ -1,7 +1,7 @@
1
1
  import { describe, it, expect, vi, beforeEach } from "vitest";
2
2
  import { mockWorkspaceBackend } from "../../../__test-utils__/mock-workspace.js";
3
3
  import { provisionGit } from "../sources/git.js";
4
- import { SourceType, WorkspaceProvisionError } from "../types.js";
4
+ import { WorkspaceProvisionError } from "../types.js";
5
5
 
6
6
  /**
7
7
  * Command-routing mock for `backend.execute`.
@@ -55,7 +55,7 @@ describe("provisionGit", () => {
55
55
 
56
56
  it("returns GIT_REPO source type", async () => {
57
57
  const result = await provisionGit(makeOptions());
58
- expect(result.sourceType).toBe(SourceType.GIT_REPO);
58
+ expect(result.sourceType).toBe("git_repo");
59
59
  });
60
60
 
61
61
  it("clones in place (init/remote/fetch/checkout) instead of git clone", async () => {
@@ -119,7 +119,7 @@ describe("provisionGit", () => {
119
119
  });
120
120
 
121
121
  const result = await provisionGit(makeOptions({ backend }));
122
- expect(result.sourceType).toBe(SourceType.GIT_REPO);
122
+ expect(result.sourceType).toBe("git_repo");
123
123
  expect(result.workspaceDescription).toContain("existing repo detected");
124
124
 
125
125
  expect(calls(backend).some((c) => c.includes("git init"))).toBe(false);
@@ -3,7 +3,7 @@ import { mkdtempSync, mkdirSync, writeFileSync, existsSync, readlinkSync } from
3
3
  import { join } from "node:path";
4
4
  import { tmpdir } from "node:os";
5
5
  import { WorkspaceProvisioner } from "../provisioner.js";
6
- import { SourceType, WorkspaceProvisionError } from "../types.js";
6
+ import { WorkspaceProvisionError } from "../types.js";
7
7
  import { LocalWorkspaceBackend } from "../local-backend.js";
8
8
 
9
9
  function makeTempDir(): string {
@@ -22,7 +22,7 @@ describe("WorkspaceProvisioner", () => {
22
22
  const root = makeTempDir();
23
23
  const backend = new LocalWorkspaceBackend(root);
24
24
  const result = await provisioner.provision(undefined, backend, {}, true);
25
- expect(result.sourceType).toBe(SourceType.EMPTY);
25
+ expect(result.sourceType).toBe("empty");
26
26
  expect(result.rootDir).toBe(root);
27
27
  expect(result.consumedKeys).toEqual([]);
28
28
  });
@@ -34,7 +34,7 @@ describe("WorkspaceProvisioner", () => {
34
34
  { source: { case: undefined, value: undefined } },
35
35
  backend, {}, true,
36
36
  );
37
- expect(result.sourceType).toBe(SourceType.EMPTY);
37
+ expect(result.sourceType).toBe("empty");
38
38
  });
39
39
  });
40
40
 
@@ -47,7 +47,7 @@ describe("WorkspaceProvisioner", () => {
47
47
  { source: { case: "localPath", value: { path: projectDir } } },
48
48
  backend, {}, true,
49
49
  );
50
- expect(result.sourceType).toBe(SourceType.LOCAL_PATH);
50
+ expect(result.sourceType).toBe("local_path");
51
51
  expect(result.rootDir).toBe(projectDir);
52
52
  });
53
53
 
@@ -102,7 +102,7 @@ describe("WorkspaceProvisioner", () => {
102
102
  );
103
103
  expect(results).toHaveLength(1);
104
104
  expect(results[0].entryName).toBe("app");
105
- expect(results[0].sourceType).toBe(SourceType.EMPTY);
105
+ expect(results[0].sourceType).toBe("empty");
106
106
  });
107
107
  });
108
108
 
@@ -2,8 +2,8 @@
2
2
  * Pins session workspace provisioning: git-repo workspace entries are cloned
3
3
  * locally (never delegated to a cloud agent), local-path entries are
4
4
  * mounted, and a session with no entries gets its own empty per-session root.
5
- * Harness-agnostic; the Cursor activity is today's only caller and the turn
6
- * runtime takes it over in S2 M3.
5
+ * Harness-agnostic; the Cursor activity was its only caller until the turn
6
+ * runtime took it over in #1070.
7
7
  *
8
8
  * Uses a real, hermetic local git repository (no network, no harness API) so
9
9
  * the clone is deterministic.
@@ -20,9 +20,8 @@ import { WorkspaceWriteBackPhase } from "@stigmer/protos/ai/stigmer/agentic/agen
20
20
  import { GitWriteBackMode } from "@stigmer/protos/ai/stigmer/agentic/session/v1/enum_pb";
21
21
  import { WriteBackCoordinator } from "../writeback-coordinator.js";
22
22
  import { LocalWorkspaceBackend } from "../local-backend.js";
23
- import { statusProtoWriter, type ExecutionStatusWriter } from "../../execution-status-writer.js";
23
+ import { TranscriptBuilder } from "../../../harness/transcript/builder.js";
24
24
  import type { ProvisionResult } from "../types.js";
25
- import { SourceType } from "../types.js";
26
25
  import { AGENT_GIT_AUTHOR_EMAIL } from "../git-identity.js";
27
26
 
28
27
  const SESSION_ID = "ses-int-01";
@@ -52,11 +51,11 @@ function git(cwd: string, args: string[]): string {
52
51
 
53
52
  function makeCoordinator(
54
53
  executionId: string,
55
- writer: ExecutionStatusWriter,
54
+ writeBacks: TranscriptBuilder,
56
55
  ): WriteBackCoordinator {
57
56
  const provisionResult: ProvisionResult = {
58
57
  rootDir: workDir,
59
- sourceType: SourceType.GIT_REPO,
58
+ sourceType: "git_repo",
60
59
  consumedKeys: [],
61
60
  workspaceDescription: "integration",
62
61
  entryName: "repo",
@@ -68,7 +67,7 @@ function makeCoordinator(
68
67
  },
69
68
  };
70
69
  return new WriteBackCoordinator({
71
- statusWriter: writer,
70
+ writeBacks,
72
71
  executionId,
73
72
  sessionId: SESSION_ID,
74
73
  githubToken: "ghp_test",
@@ -139,7 +138,7 @@ describe("WriteBackCoordinator against real git", () => {
139
138
  // ── Turn 1: the agent created a file; the review kept it. ──
140
139
  writeFileSync(join(workDir, "notes.md"), "approved content\n");
141
140
  const status1 = create(AgentExecutionStatusSchema, {});
142
- const coord1 = makeCoordinator("exec-turn-1", statusProtoWriter(status1));
141
+ const coord1 = makeCoordinator("exec-turn-1", new TranscriptBuilder("exec-int", status1));
143
142
  await coord1.finalize();
144
143
 
145
144
  const wb1 = status1.workspaceWriteBacks[0];
@@ -163,7 +162,7 @@ describe("WriteBackCoordinator against real git", () => {
163
162
  rmSync(join(workDir, "rejected.md")); // the reconcile's snap-back
164
163
 
165
164
  const status2 = create(AgentExecutionStatusSchema, {});
166
- const coord2 = makeCoordinator("exec-turn-2", statusProtoWriter(status2));
165
+ const coord2 = makeCoordinator("exec-turn-2", new TranscriptBuilder("exec-int", status2));
167
166
  await coord2.finalize();
168
167
 
169
168
  const wb2 = status2.workspaceWriteBacks[0];
@@ -200,7 +199,7 @@ describe("WriteBackCoordinator against real git", () => {
200
199
  writeFileSync(join(workDir, "notes.md"), "turn one\n");
201
200
  const coord1 = makeCoordinator(
202
201
  "exec-a",
203
- statusProtoWriter(create(AgentExecutionStatusSchema, {})),
202
+ new TranscriptBuilder("exec-int", create(AgentExecutionStatusSchema, {})),
204
203
  );
205
204
  await coord1.finalize();
206
205
 
@@ -214,7 +213,7 @@ describe("WriteBackCoordinator against real git", () => {
214
213
  // new one from main (which would orphan turn 1's commit).
215
214
  writeFileSync(join(workDir, "more.md"), "turn two\n");
216
215
  const status2 = create(AgentExecutionStatusSchema, {});
217
- const coord2 = makeCoordinator("exec-b", statusProtoWriter(status2));
216
+ const coord2 = makeCoordinator("exec-b", new TranscriptBuilder("exec-int", status2));
218
217
  await coord2.finalize();
219
218
 
220
219
  expect(status2.workspaceWriteBacks[0].branchName).toBe(SESSION_BRANCH);
@@ -1,18 +1,14 @@
1
1
  import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
2
  import { create } from "@bufbuild/protobuf";
3
- import { AgentExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
3
+ import { type AgentExecutionStatus, AgentExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
4
4
  import { WorkspaceWriteBackPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
5
5
  import { GitWriteBackMode } from "@stigmer/protos/ai/stigmer/agentic/session/v1/enum_pb";
6
- import {
7
- statusProtoWriter,
8
- type ExecutionStatusWriter,
9
- } from "../../execution-status-writer.js";
6
+ import { TranscriptBuilder } from "../../../harness/transcript/builder.js";
10
7
  import {
11
8
  WriteBackCoordinator,
12
9
  parseGithubRepo,
13
10
  } from "../writeback-coordinator.js";
14
11
  import type { WorkspaceBackend, ProvisionResult } from "../types.js";
15
- import { SourceType } from "../types.js";
16
12
  import {
17
13
  AGENT_GIT_AUTHOR_NAME,
18
14
  AGENT_GIT_AUTHOR_EMAIL,
@@ -21,16 +17,19 @@ import {
21
17
  const SESSION_ID = "ses-01test";
22
18
  const SESSION_BRANCH = `stigmer/${SESSION_ID}`;
23
19
 
24
- // The shared proto-backed writer — the same implementation the Cursor harness
25
- // wires in, and upsert-compatible with the deep-agent V3StatusBuilder.
26
- function makeStatusBuilder(): ExecutionStatusWriter {
27
- return statusProtoWriter(create(AgentExecutionStatusSchema, {}));
20
+ // The writer production wires in: the turn's transcript builder, whose
21
+ // `addWriteBack` owns the upsert-by-entry rule these arms read the result of
22
+ // (the coordinator itself only registers records through `WriteBackSink`).
23
+ /** A builder and the status it builds into: the test writes through `sb` and reads `status`, as production reads `TurnSink.status`. */
24
+ function makeStatusBuilder(): { sb: TranscriptBuilder; status: AgentExecutionStatus } {
25
+ const status = create(AgentExecutionStatusSchema, {});
26
+ return { sb: new TranscriptBuilder("exec-test", status), status };
28
27
  }
29
28
 
30
29
  function makeProvisionResult(overrides: Partial<ProvisionResult> = {}): ProvisionResult {
31
30
  return {
32
31
  rootDir: "/workspace/my-app",
33
- sourceType: SourceType.GIT_REPO,
32
+ sourceType: "git_repo",
34
33
  consumedKeys: [],
35
34
  workspaceDescription: "test",
36
35
  entryName: "my-app",
@@ -92,7 +91,7 @@ function mockWorkspaceBackend(responses: Record<string, string> = {}): Workspace
92
91
  }
93
92
 
94
93
  function makeCoordinator(opts: {
95
- sb: ExecutionStatusWriter;
94
+ sb: TranscriptBuilder;
96
95
  backend?: WorkspaceBackend;
97
96
  executionId?: string;
98
97
  sessionId?: string;
@@ -101,7 +100,7 @@ function makeCoordinator(opts: {
101
100
  workspaceEntries?: any[];
102
101
  }): WriteBackCoordinator {
103
102
  return new WriteBackCoordinator({
104
- statusWriter: opts.sb,
103
+ writeBacks: opts.sb,
105
104
  executionId: opts.executionId ?? "exec-12345678rest",
106
105
  sessionId: opts.sessionId ?? SESSION_ID,
107
106
  githubToken: opts.githubToken ?? "ghp_plumbed_token",
@@ -139,10 +138,11 @@ function mockGithubApi(opts: {
139
138
  const originalFetch = globalThis.fetch;
140
139
 
141
140
  describe("WriteBackCoordinator", () => {
142
- let sb: ExecutionStatusWriter;
141
+ let sb: TranscriptBuilder;
142
+ let status: AgentExecutionStatus;
143
143
 
144
144
  beforeEach(() => {
145
- sb = makeStatusBuilder();
145
+ ({ sb, status } = makeStatusBuilder());
146
146
  mockGithubApi();
147
147
  });
148
148
 
@@ -155,7 +155,7 @@ describe("WriteBackCoordinator", () => {
155
155
  it("filters out non-git workspace entries", () => {
156
156
  const coord = makeCoordinator({
157
157
  sb,
158
- provisionResults: [makeProvisionResult({ sourceType: SourceType.LOCAL_PATH })],
158
+ provisionResults: [makeProvisionResult({ sourceType: "local_path" })],
159
159
  });
160
160
  expect(coord.hasEligibleEntries).toBe(false);
161
161
  });
@@ -186,7 +186,7 @@ describe("WriteBackCoordinator", () => {
186
186
  // ── Full cycle ──────────────────────────────────────────────────────
187
187
 
188
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
189
+ // point since #1096 (the per-file `onFileModified` went with the
190
190
  // native stream loop that called it). The mechanics it pins are the same.
191
191
  it("performs full cycle on the SESSION branch: branch -> commit -> push -> PR", async () => {
192
192
  const backend = mockWorkspaceBackend();
@@ -194,7 +194,7 @@ describe("WriteBackCoordinator", () => {
194
194
 
195
195
  await coord.finalize();
196
196
 
197
- const wbs = sb.currentStatus.workspaceWriteBacks;
197
+ const wbs = status.workspaceWriteBacks;
198
198
  expect(wbs).toHaveLength(1);
199
199
  expect(wbs[0].branchName).toBe(SESSION_BRANCH);
200
200
  expect(wbs[0].baseBranch).toBe("main");
@@ -238,7 +238,7 @@ describe("WriteBackCoordinator", () => {
238
238
 
239
239
  await coord.finalize();
240
240
 
241
- expect(sb.currentStatus.workspaceWriteBacks).toHaveLength(0);
241
+ expect(status.workspaceWriteBacks).toHaveLength(0);
242
242
  });
243
243
 
244
244
  // ── Session-branch idempotency ──────────────────────────────────────
@@ -317,7 +317,7 @@ describe("WriteBackCoordinator", () => {
317
317
 
318
318
  await coord.finalize();
319
319
 
320
- const wbs = sb.currentStatus.workspaceWriteBacks;
320
+ const wbs = status.workspaceWriteBacks;
321
321
  expect(wbs[0].pullRequestNumber).toBe(7);
322
322
  expect(wbs[0].pullRequestUrl).toBe("https://github.com/acme/my-app/pull/7");
323
323
  expect(wbs[0].phase).toBe(WorkspaceWriteBackPhase.WORKSPACE_WRITE_BACK_PR_CREATED);
@@ -355,7 +355,7 @@ describe("WriteBackCoordinator", () => {
355
355
 
356
356
  await coord.finalize();
357
357
 
358
- const wbs = sb.currentStatus.workspaceWriteBacks;
358
+ const wbs = status.workspaceWriteBacks;
359
359
  expect(wbs).toHaveLength(1);
360
360
  expect(wbs[0].phase).toBe(WorkspaceWriteBackPhase.WORKSPACE_WRITE_BACK_FAILED);
361
361
  expect(wbs[0].error).toContain("commit failed");
@@ -369,7 +369,7 @@ describe("WriteBackCoordinator", () => {
369
369
 
370
370
  await coord.finalize();
371
371
 
372
- const wbs = sb.currentStatus.workspaceWriteBacks;
372
+ const wbs = status.workspaceWriteBacks;
373
373
  expect(wbs).toHaveLength(1);
374
374
  expect(wbs[0].phase,
375
375
  "a pushed branch must never be reported FAILED for a PR-step error",
@@ -386,7 +386,7 @@ describe("WriteBackCoordinator", () => {
386
386
 
387
387
  await coord.finalize();
388
388
 
389
- const wbs = sb.currentStatus.workspaceWriteBacks;
389
+ const wbs = status.workspaceWriteBacks;
390
390
  expect(wbs).toHaveLength(1);
391
391
  expect(wbs[0].phase).toBe(WorkspaceWriteBackPhase.WORKSPACE_WRITE_BACK_PUSHED);
392
392
  expect(wbs[0].error).toContain("No GitHub token");
@@ -401,8 +401,8 @@ describe("WriteBackCoordinator", () => {
401
401
 
402
402
  await coord.finalize();
403
403
 
404
- expect(sb.currentStatus.workspaceWriteBacks).toHaveLength(1);
405
- expect(sb.currentStatus.workspaceWriteBacks[0].phase).toBe(
404
+ expect(status.workspaceWriteBacks).toHaveLength(1);
405
+ expect(status.workspaceWriteBacks[0].phase).toBe(
406
406
  WorkspaceWriteBackPhase.WORKSPACE_WRITE_BACK_PR_CREATED,
407
407
  );
408
408
  });
@@ -15,7 +15,7 @@
15
15
  */
16
16
 
17
17
  import type { ProvisionResult, WorkspaceBackend } from "./types.js";
18
- import { SourceType, WorkspaceProvisionError } from "./types.js";
18
+ import { WorkspaceProvisionError } from "./types.js";
19
19
  import { provisionEmpty } from "./sources/empty.js";
20
20
  import { provisionLocalPath } from "./sources/local-path.js";
21
21
  import { provisionGit } from "./sources/git.js";
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Harness-agnostic: the turn runtime's workspace phase, serving both
5
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
6
+ * with it in #1096, which also 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
@@ -5,12 +5,12 @@
5
5
  * This handler simply records the fact and returns the existing root.
6
6
  */
7
7
 
8
- import { SourceType, type ProvisionResult, type WorkspaceBackend } from "../types.js";
8
+ import type { ProvisionResult, WorkspaceBackend } from "../types.js";
9
9
 
10
10
  export function provisionEmpty(backend: WorkspaceBackend): ProvisionResult {
11
11
  return {
12
12
  rootDir: backend.rootDir,
13
- sourceType: SourceType.EMPTY,
13
+ sourceType: "empty",
14
14
  consumedKeys: [],
15
15
  workspaceDescription:
16
16
  "Your workspace is empty. " +
@@ -12,7 +12,6 @@
12
12
 
13
13
  import { join } from "node:path";
14
14
  import {
15
- SourceType,
16
15
  WorkspaceProvisionError,
17
16
  type ProvisionResult,
18
17
  type GitMetadata,
@@ -63,7 +62,7 @@ export async function provisionGit(options: GitProvisionOptions): Promise<Provis
63
62
  ? message.replaceAll(githubToken, "***")
64
63
  : message;
65
64
  throw new WorkspaceProvisionError(
66
- SourceType.GIT_REPO,
65
+ "git_repo",
67
66
  `Git clone failed: ${sanitized}`,
68
67
  { cause: err instanceof Error ? err : undefined, transient: true },
69
68
  );
@@ -82,7 +81,7 @@ export async function provisionGit(options: GitProvisionOptions): Promise<Provis
82
81
 
83
82
  return {
84
83
  rootDir: cloneDir,
85
- sourceType: SourceType.GIT_REPO,
84
+ sourceType: "git_repo",
86
85
  consumedKeys,
87
86
  workspaceDescription:
88
87
  `Your workspace is a git clone of ${url}` +
@@ -113,7 +112,7 @@ async function reuseExistingRepo(
113
112
 
114
113
  return {
115
114
  rootDir: cloneDir,
116
- sourceType: SourceType.GIT_REPO,
115
+ sourceType: "git_repo",
117
116
  consumedKeys: [],
118
117
  workspaceDescription:
119
118
  `Your workspace is a git clone of ${url}` +
@@ -12,7 +12,6 @@ import { existsSync, statSync, symlinkSync, readlinkSync, unlinkSync, mkdirSync
12
12
  import { join, isAbsolute } from "node:path";
13
13
  import { realpathSync } from "node:fs";
14
14
  import {
15
- SourceType,
16
15
  WorkspaceProvisionError,
17
16
  type ProvisionResult,
18
17
  } from "../types.js";
@@ -29,7 +28,7 @@ export function provisionLocalPath(options: LocalPathProvisionOptions): Provisio
29
28
 
30
29
  if (!isLocalMode) {
31
30
  throw new WorkspaceProvisionError(
32
- SourceType.LOCAL_PATH,
31
+ "local_path",
33
32
  "LocalPathSource is only supported in local mode. " +
34
33
  "Use git_repo for cloud deployments.",
35
34
  );
@@ -37,21 +36,21 @@ export function provisionLocalPath(options: LocalPathProvisionOptions): Provisio
37
36
 
38
37
  if (!isAbsolute(path)) {
39
38
  throw new WorkspaceProvisionError(
40
- SourceType.LOCAL_PATH,
39
+ "local_path",
41
40
  `Path must be absolute, got relative path: '${path}'`,
42
41
  );
43
42
  }
44
43
 
45
44
  if (!existsSync(path)) {
46
45
  throw new WorkspaceProvisionError(
47
- SourceType.LOCAL_PATH,
46
+ "local_path",
48
47
  `Path does not exist: '${path}'`,
49
48
  );
50
49
  }
51
50
 
52
51
  if (!statSync(path).isDirectory()) {
53
52
  throw new WorkspaceProvisionError(
54
- SourceType.LOCAL_PATH,
53
+ "local_path",
55
54
  `Path is not a directory: '${path}'`,
56
55
  );
57
56
  }
@@ -62,7 +61,7 @@ export function provisionLocalPath(options: LocalPathProvisionOptions): Provisio
62
61
 
63
62
  return {
64
63
  rootDir: path,
65
- sourceType: SourceType.LOCAL_PATH,
64
+ sourceType: "local_path",
66
65
  consumedKeys: [],
67
66
  workspaceDescription:
68
67
  `Your workspace is the user's project directory: ${path}\n` +
@@ -17,7 +17,7 @@
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
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
20
+ * run after lock acquisition), for both harnesses; until #1096 the native
21
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
@@ -5,11 +5,8 @@
5
5
  * harness-agnostic and used by both ExecuteCursor and ExecuteDeepAgent.
6
6
  */
7
7
 
8
- export enum SourceType {
9
- GIT_REPO = "git_repo",
10
- LOCAL_PATH = "local_path",
11
- EMPTY = "empty",
12
- }
8
+ /** Where a provisioned workspace came from; the same strings the error prefix and the prompt builder read. */
9
+ export type SourceType = "git_repo" | "local_path" | "empty";
13
10
 
14
11
  export interface GitMetadata {
15
12
  readonly repoUrl: string;
@@ -18,7 +18,7 @@
18
18
  * (`harness/run-turn.ts`) — in capture mode on the APPROVED tree after the
19
19
  * review decisions reconcile, so speculative mid-turn edits never reach
20
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`,
21
+ * Until #1096 an incremental path also existed — `onFileModified`,
22
22
  * a commit-and-push per file-modifying tool call on non-capture turns — and
23
23
  * was reachable in no supported posture (every git workspace with artifact
24
24
  * storage is a capture workspace, `shared/filereview/capture.ts`
@@ -29,18 +29,29 @@
29
29
  */
30
30
 
31
31
  import { create } from "@bufbuild/protobuf";
32
- import {
33
- WorkspaceWriteBackSchema,
34
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
35
32
  import {
36
33
  WorkspaceWriteBackPhase,
34
+ WorkspaceWriteBackSchema,
35
+ type WorkspaceWriteBack,
37
36
  } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
38
37
  import { GitWriteBackMode } from "@stigmer/protos/ai/stigmer/agentic/session/v1/enum_pb";
39
38
  import type { WorkspaceEntry } from "@stigmer/protos/ai/stigmer/agentic/session/v1/workspace_pb";
40
39
  import type { WorkspaceBackend, ProvisionResult } from "./types.js";
41
- import { SourceType } from "./types.js";
42
40
  import { gitCommitAsAgent } from "./git-identity.js";
43
- import type { ExecutionStatusWriter } from "../execution-status-writer.js";
41
+
42
+ /**
43
+ * Where a write-back record is registered: the one member of the turn's
44
+ * transcript builder this coordinator needs (`harness/transcript/builder.ts`
45
+ * `addWriteBack`, which owns the upsert-by-entry rule — each git-backed
46
+ * workspace entry carries at most one record, progressing through phases).
47
+ * Declared here as the narrow view this consumer needs, never the whole
48
+ * builder, so `shared/` keeps importing nothing from `harness/` (the
49
+ * `SessionProvisionConfig` rule: a shared helper is handed a narrowed view,
50
+ * never the other way round).
51
+ */
52
+ export interface WriteBackSink {
53
+ addWriteBack(wb: WorkspaceWriteBack): void;
54
+ }
44
55
 
45
56
  const WRITE_BACK_ENABLED_MODES = new Set([
46
57
  GitWriteBackMode.GIT_WRITE_BACK_MODE_UNSPECIFIED,
@@ -68,7 +79,7 @@ interface EligibleEntry {
68
79
  }
69
80
 
70
81
  export class WriteBackCoordinator {
71
- private readonly statusWriter: ExecutionStatusWriter;
82
+ private readonly writeBacks: WriteBackSink;
72
83
  private readonly executionId: string;
73
84
  private readonly workspaceBackend: WorkspaceBackend;
74
85
  private readonly branchName: string;
@@ -85,7 +96,7 @@ export class WriteBackCoordinator {
85
96
  private readonly state = new Map<string, EntryState>();
86
97
 
87
98
  constructor(opts: {
88
- statusWriter: ExecutionStatusWriter;
99
+ writeBacks: WriteBackSink;
89
100
  executionId: string;
90
101
  /** The owning session's id — the branch/PR are session-scoped. */
91
102
  sessionId: string;
@@ -94,7 +105,7 @@ export class WriteBackCoordinator {
94
105
  workspaceEntries: readonly WorkspaceEntry[];
95
106
  workspaceBackend: WorkspaceBackend;
96
107
  }) {
97
- this.statusWriter = opts.statusWriter;
108
+ this.writeBacks = opts.writeBacks;
98
109
  this.executionId = opts.executionId;
99
110
  this.workspaceBackend = opts.workspaceBackend;
100
111
  this.githubToken = opts.githubToken;
@@ -143,7 +154,7 @@ export class WriteBackCoordinator {
143
154
  }
144
155
 
145
156
  for (const pr of provisionResults) {
146
- if (pr.sourceType !== SourceType.GIT_REPO) continue;
157
+ if (pr.sourceType !== "git_repo") continue;
147
158
  if (!pr.gitMetadata) continue;
148
159
  if (!pr.gitMetadata.gitCredentialsConfigured) continue;
149
160
 
@@ -222,7 +233,7 @@ export class WriteBackCoordinator {
222
233
  wb.pullRequestUrl = entryState.prUrl;
223
234
  wb.pullRequestNumber = entryState.prNumber;
224
235
  }
225
- this.statusWriter.addWriteBack(wb);
236
+ this.writeBacks.addWriteBack(wb);
226
237
  return;
227
238
  }
228
239
 
@@ -466,7 +477,7 @@ export class WriteBackCoordinator {
466
477
  error: prError,
467
478
  });
468
479
 
469
- this.statusWriter.addWriteBack(wb);
480
+ this.writeBacks.addWriteBack(wb);
470
481
  }
471
482
 
472
483
  }
@@ -1,87 +0,0 @@
1
- /**
2
- * DeltaEnricher processes Cursor SDK InteractionUpdate events to provide
3
- * real-time enrichments that the stream channel alone cannot deliver.
4
- *
5
- * The Cursor SDK provides two concurrent event channels:
6
- * - run.stream() (SDKMessage) — coarse-grained, post-hoc events
7
- * - onDelta (InteractionUpdate) — fine-grained, real-time deltas
8
- *
9
- * The stream channel remains the source of truth for message construction.
10
- * The delta channel provides supplementary real-time signals:
11
- * - shell-output-delta: live stdout/stderr from running shell commands
12
- * - tool-call-started/completed: precise lifecycle timestamps
13
- * - thinking-completed: accurate thinking duration from the SDK
14
- *
15
- * Concurrency model: Node.js is single-threaded. The onDelta callback fires
16
- * between iterations of the for-await stream loop (during event loop yields).
17
- * The enricher buffers data internally; the stream loop calls
18
- * applyEnrichments() on each iteration to flush buffered state onto the
19
- * message array. No locks needed — access is always sequential.
20
- *
21
- * Design invariant: The enricher never creates messages or tool calls.
22
- * It only mutates existing ones that the MessageAccumulator has created.
23
- * If a delta arrives before its corresponding stream event (e.g.,
24
- * shell-output-delta before tool_call running), the data is buffered
25
- * and applied retroactively on the next applyEnrichments() call that
26
- * finds the matching ToolCall.
27
- */
28
- import type { AgentMessage } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
29
- import type { InteractionUpdate } from "@cursor/sdk";
30
- export declare class DeltaEnricher {
31
- private shellOutputByCallId;
32
- private timingByCallId;
33
- private thinkingDurationMs;
34
- private _isDirty;
35
- private lastPersistTime;
36
- private lastShellCallId;
37
- /**
38
- * Minimum interval between persist-triggering dirty flags (milliseconds).
39
- * Prevents excessive backend writes during rapid shell output bursts.
40
- * Matches the Python agent-runner's update_scheduler interval.
41
- */
42
- static readonly PERSIST_DEBOUNCE_MS = 500;
43
- /**
44
- * Process a single InteractionUpdate from the onDelta callback.
45
- * Buffers enrichment data for later application by applyEnrichments().
46
- *
47
- * Called from the onDelta callback (between stream loop iterations).
48
- */
49
- processDelta(update: InteractionUpdate): void;
50
- /**
51
- * Apply all buffered enrichments to the current message array.
52
- * Called from the stream loop after each processEvent() iteration.
53
- *
54
- * Returns true if any enrichments were applied (messages were mutated).
55
- */
56
- applyEnrichments(messages: AgentMessage[]): boolean;
57
- /**
58
- * Whether the enricher has pending data that warrants an immediate persist.
59
- * Only returns true when meaningful UI-visible data has arrived AND the
60
- * debounce interval has elapsed since the last persist.
61
- */
62
- get isDirty(): boolean;
63
- /**
64
- * Acknowledge that a persist has occurred. Resets the dirty flag and
65
- * records the persist timestamp for debounce calculations.
66
- */
67
- markPersisted(): void;
68
- /**
69
- * Finalize streaming state and reconcile tool call statuses.
70
- *
71
- * Called after the stream loop ends (alongside accumulator.finalize()).
72
- * Two passes:
73
- * 1. Clear `isStreaming` on all tool calls (existing behavior).
74
- * 2. Reconciliation sweep: any tool call still RUNNING with evidence
75
- * of completion (completedAt set or result non-empty) is promoted
76
- * to COMPLETED. This is the catch-all safety net — when the stream
77
- * ends, no tool call should remain in a non-terminal status.
78
- */
79
- finalize(messages: AgentMessage[]): void;
80
- private handleShellOutputDelta;
81
- private handleToolCallStarted;
82
- private handleToolCallCompleted;
83
- private getOrCreateTiming;
84
- private applyShellOutput;
85
- private applyTiming;
86
- private applyThinkingDuration;
87
- }