@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,565 +0,0 @@
1
- /**
2
- * V3StatusBuilder — consumes StigmerRunEvents from the V3ProtocolNormalizer
3
- * and progressively builds the transcript half of the AgentExecutionStatus
4
- * proto it is handed: messages, tool-call rows and their approval status,
5
- * sub-agent rows, todos, artifacts, write-backs.
6
- *
7
- * The one transcript builder of the native harness since S3 M2b: v3 event
8
- * semantics (tool_call_id keying, content-block-level deltas, explicit tool
9
- * lifecycle). Its predecessor, the v2 `StatusBuilder` over LangChain's
10
- * `streamEvents` v2, was retired with the v2 stream (Q-S3-1); the eight
11
- * golden sequences both once had to agree on are this builder's test's.
12
- *
13
- * What this builder deliberately does NOT write, and who does (the adapter
14
- * contract's field ownership, `harness/types.ts` `TurnSink`): the phase,
15
- * `startedAt` and `streamingUsage` are the turn runtime's. A gated tool
16
- * start is reported as the {@link awaitingApproval} fact and the caller
17
- * (`turn-stream.ts`) decides what that means for the turn; usage is reported
18
- * raw through {@link V3StatusBuilderOptions.onUsage} and the caller prices
19
- * it into the sink (until S3 M2a this builder flipped WAITING_FOR_APPROVAL
20
- * itself and summed usage into `streamingUsage` — a second writer of each
21
- * field beside the runtime's).
22
- *
23
- * Usage is reported on message_finish only (standalone usage events are
24
- * no-ops) to prevent double-counting — v3 emits both for the same turn.
25
- * EVERY graph's usage is reported, the sub-agents' included (S3 M2b,
26
- * Q-M2b-1): a sub-agent's `message_finish` fires the same hook before it is
27
- * routed to the tracker, so the execution's usage — and the cost cap the
28
- * runtime enforces over it — is the whole execution's spend. Until M2b the
29
- * sub-agents' turns were discarded (S3 M2a finding F-M2a-12); the cost cap
30
- * then lived inside the graph, where a middleware saw every model call.
31
- */
32
-
33
- import { create, type JsonObject } from "@bufbuild/protobuf";
34
- import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
35
- import {
36
- AgentMessageSchema,
37
- ToolCallSchema,
38
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
39
- import type { AgentMessage, ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
40
- import type { ExecutionArtifact } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/artifact_pb";
41
- import type { WorkspaceWriteBack } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
42
- import {
43
- MessageType,
44
- ToolCallStatus,
45
- ToolKind,
46
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
47
- import { resolveApprovalMessage as resolveApprovalMsg } from "../../shared/approval-policy.js";
48
- import { classifyTool } from "../../shared/tool-kind.js";
49
- import { applyTodoUpdate } from "../../shared/todos.js";
50
- import { ExecutionState } from "./execution-state.js";
51
- import { utcTimestamp } from "../../shared/status.js";
52
- import type { ExecutionStatusWriter } from "../../shared/execution-status-writer.js";
53
- import type { StigmerRunEvent, V3UsagePayload } from "./v3-events.js";
54
- import { namespaceDepth } from "./v3-events.js";
55
- import {
56
- extractToolResultV3,
57
- sanitizeArgsPreview,
58
- stampApprovalProvenance,
59
- type ApprovalPolicyProvider,
60
- } from "./status-builder-shared.js";
61
- import { SubAgentTracker } from "./subagent-tracker.js";
62
-
63
- export interface V3StatusBuilderOptions {
64
- /**
65
- * Fired once per `message_finish` that carries usage — the parent graph's
66
- * and every sub-agent's — with the payload exactly as the protocol
67
- * delivered it. The builder never sums or prices: the caller accounts (the
68
- * turn runtime through `TurnSink.reportUsage`, priced at the turn's model;
69
- * a sub-agent on its own model is priced at the parent's rate, as the
70
- * in-graph cost cap always did — per-sub-agent pricing is an S5 item).
71
- */
72
- readonly onUsage?: (usage: V3UsagePayload) => void;
73
- }
74
-
75
- export class V3StatusBuilder implements ExecutionStatusWriter {
76
- readonly executionId: string;
77
- private readonly state: ExecutionState;
78
- private _forceNextUpdate = false;
79
- private _awaitingApproval = false;
80
- private approvalProvider: ApprovalPolicyProvider | null = null;
81
- private readonly onUsage: ((usage: V3UsagePayload) => void) | undefined;
82
- private readonly subAgentTracker: SubAgentTracker;
83
-
84
- /** Progressive tool call arg accumulation keyed by callId. */
85
- private readonly toolArgBuffers = new Map<string, string>();
86
-
87
- /**
88
- * Builds INTO `status`, by reference: its `messages` and
89
- * `subAgentExecutions` arrays are the ones indexed and pushed into, never
90
- * replaced, so a caller that wraps the same status (the write-back
91
- * coordinator's writer, the runtime's chokepoint) keeps seeing every row.
92
- */
93
- constructor(executionId: string, status: AgentExecutionStatus, options: V3StatusBuilderOptions = {}) {
94
- this.executionId = executionId;
95
- this.state = new ExecutionState(status);
96
- this.onUsage = options.onUsage;
97
-
98
- // Resume path: when constructed over a persisted transcript (seeded by the
99
- // caller on a reinvocation), rebuild the tool-call index so resumed
100
- // tool_started/tool_finished events reconcile to the existing calls
101
- // instead of duplicating them. A first run carries no messages, so this
102
- // is a no-op. The tracker does the same for the seeded sub-agent rows.
103
- if (status.messages.length > 0) {
104
- this.state.rebuildToolCallIndex();
105
- }
106
-
107
- this.subAgentTracker = new SubAgentTracker(status.subAgentExecutions);
108
- }
109
-
110
- setApprovalProvider(provider: ApprovalPolicyProvider): void {
111
- this.approvalProvider = provider;
112
- }
113
-
114
- get currentStatus(): AgentExecutionStatus {
115
- return this.state.proto;
116
- }
117
-
118
- /**
119
- * True once a tool call this turn was gated and left WAITING_APPROVAL: the
120
- * engine has interrupted (or will, at this step's end) and the turn should
121
- * end awaiting a decision. A fact about the transcript, not a phase — the
122
- * caller owns the phase.
123
- */
124
- get awaitingApproval(): boolean {
125
- return this._awaitingApproval;
126
- }
127
-
128
- get forceNextUpdate(): boolean {
129
- return this._forceNextUpdate;
130
- }
131
-
132
- clearForceFlag(): void {
133
- this._forceNextUpdate = false;
134
- }
135
-
136
- processEvent(event: StigmerRunEvent): void {
137
- try {
138
- // Sub-agent routing: detect "task" tool starts at depth 0 (root) or depth 1
139
- // (inside LangGraph tools-node). In real runtime, task tool-started arrives
140
- // at depth 1 with namespace like "tools:<pregelTaskUuid>".
141
- if (event.kind === "tool_started" && event.name === "task" && namespaceDepth(event.namespace) <= 1) {
142
- const routingPrefix = event.namespace || `tools:${event.callId}`;
143
- this.subAgentTracker.onTaskToolStarted(event.callId, event.input, routingPrefix);
144
- this.handleToolStarted(event.callId, event.name, event.input, event.namespace);
145
- this._forceNextUpdate = true;
146
- return;
147
- }
148
-
149
- if (event.kind === "tool_finished" && this.isTrackedTaskTool(event.callId)) {
150
- this.subAgentTracker.onTaskToolFinished(event.callId, event.output);
151
- this.handleToolFinished(event.callId, event.output);
152
- this._forceNextUpdate = true;
153
- return;
154
- }
155
-
156
- if (event.kind === "tool_error" && this.isTrackedTaskTool(event.callId)) {
157
- this.subAgentTracker.onTaskToolError(event.callId, event.message);
158
- this.handleToolError(event.callId, event.message);
159
- this._forceNextUpdate = true;
160
- return;
161
- }
162
-
163
- if (this.subAgentTracker.isSubAgentNamespace(event.namespace)) {
164
- // A sub-agent's spend is the execution's spend (Q-M2b-1): report it
165
- // through the one hook before the tracker folds the message.
166
- if (event.kind === "message_finish" && event.usage) this.onUsage?.(event.usage);
167
- this.subAgentTracker.routeEvent(event);
168
- return;
169
- }
170
-
171
- // Parent event routing (unchanged for non-sub-agent events)
172
- switch (event.kind) {
173
- case "message_start":
174
- this.handleMessageStart(event.runId, event.namespace);
175
- break;
176
- case "text_delta":
177
- this.appendTextContent(event.runId, event.namespace, event.text);
178
- break;
179
- case "reasoning_delta":
180
- this.appendThinkingContent(event.runId, event.namespace, event.text);
181
- break;
182
- case "tool_call_arg_delta":
183
- this.handleToolCallArgDelta(event.callId, event.argsChunk);
184
- break;
185
- case "message_finish":
186
- this.handleMessageFinish(event.runId, event.namespace, event.usage);
187
- break;
188
- case "tool_started":
189
- this.handleToolStarted(event.callId, event.name, event.input, event.namespace);
190
- break;
191
- case "tool_finished":
192
- this.handleToolFinished(event.callId, event.output);
193
- break;
194
- case "tool_error":
195
- this.handleToolError(event.callId, event.message);
196
- break;
197
- case "tool_output_delta":
198
- this.handleToolOutputDelta(event.callId, event.delta);
199
- break;
200
- case "usage":
201
- case "lifecycle":
202
- case "provider":
203
- break;
204
- }
205
- } catch (err) {
206
- console.error(
207
- `[V3StatusBuilder] Event handler error: execution=${this.executionId} ` +
208
- `kind=${event.kind} seq=${event.seq}: ${err}`,
209
- );
210
- }
211
- }
212
-
213
- // ── Artifact & WriteBack ───────────────────────────────────────────
214
-
215
- addArtifact(artifact: ExecutionArtifact): void {
216
- const artifacts = this.state.proto.artifacts;
217
- const idx = artifacts.findIndex(a => a.sandboxPath === artifact.sandboxPath);
218
-
219
- if (idx >= 0) {
220
- if (artifacts[idx].contentHash !== artifact.contentHash) {
221
- artifacts[idx] = artifact;
222
- this._forceNextUpdate = true;
223
- }
224
- return;
225
- }
226
-
227
- artifacts.push(artifact);
228
- this._forceNextUpdate = true;
229
- }
230
-
231
- addWriteBack(wb: WorkspaceWriteBack): void {
232
- const backs = this.state.proto.workspaceWriteBacks;
233
- const idx = backs.findIndex(b => b.workspaceEntryName === wb.workspaceEntryName);
234
-
235
- if (idx >= 0) {
236
- backs[idx] = wb;
237
- } else {
238
- backs.push(wb);
239
- }
240
- this._forceNextUpdate = true;
241
- }
242
-
243
- // ── Message Handlers ───────────────────────────────────────────────
244
-
245
- private handleMessageStart(runId: string, namespace: string): void {
246
- // Record the runId for turn-boundary detection but do NOT create
247
- // the AI message yet. The message is created lazily on the first
248
- // text_delta, preserving the v2 ordering (THINKING before AI text
249
- // when both appear in the same turn).
250
- const lastRunId = this.state.lastLlmRunId.get(namespace);
251
- if (lastRunId && lastRunId !== runId) {
252
- const existingMsg = this.state.currentAiMessage.get(namespace);
253
- if (existingMsg) {
254
- existingMsg.isStreaming = false;
255
- }
256
- }
257
- this.state.lastLlmRunId.set(namespace, runId);
258
- }
259
-
260
- private handleMessageFinish(runId: string, _namespace: string, usage?: V3UsagePayload): void {
261
- const msg = this.state.messagesByRun.get(runId);
262
- if (msg) {
263
- msg.isStreaming = false;
264
- }
265
-
266
- if (usage) {
267
- this.onUsage?.(usage);
268
- }
269
- }
270
-
271
- private appendTextContent(runId: string, namespace: string, text: string): void {
272
- const msg = this.ensureAiMessage(runId, namespace, MessageType.MESSAGE_AI);
273
- msg.content += text;
274
- msg.isStreaming = true;
275
- }
276
-
277
- private appendThinkingContent(runId: string, namespace: string, text: string): void {
278
- const thinkingKey = `thinking:${namespace}`;
279
- const existingMsg = this.state.messagesByRun.get(thinkingKey);
280
- if (existingMsg && existingMsg.type === MessageType.MESSAGE_THINKING) {
281
- existingMsg.content += text;
282
- existingMsg.isStreaming = true;
283
- return;
284
- }
285
-
286
- const msg = create(AgentMessageSchema, {
287
- type: MessageType.MESSAGE_THINKING,
288
- content: text,
289
- timestamp: utcTimestamp(),
290
- isStreaming: true,
291
- });
292
- this.state.proto.messages.push(msg);
293
- this.state.messagesByRun.set(thinkingKey, msg);
294
- }
295
-
296
- // ── Tool Handlers ──────────────────────────────────────────────────
297
-
298
- private handleToolStarted(
299
- callId: string,
300
- name: string,
301
- input: Record<string, unknown>,
302
- namespace: string,
303
- ): void {
304
- // Resume reconciliation: the gated tool call already exists, seeded from the
305
- // persisted transcript of a prior invocation (the runtime's
306
- // `seedFromPersistedStatus`, `harness/turn-context.ts`). The durable
307
- // checkpoint re-emits tool_started now that approval
308
- // is granted — flip the existing call to RUNNING in place rather than
309
- // appending a duplicate or re-triggering the approval gate. v3 keys by
310
- // tool_call_id, so this is an exact match (no name heuristics needed).
311
- const existing = this.state.toolCalls.get(callId);
312
- if (existing) {
313
- if (existing.status === ToolCallStatus.TOOL_CALL_WAITING_APPROVAL) {
314
- existing.status = ToolCallStatus.TOOL_CALL_RUNNING;
315
- }
316
- if (Object.keys(input).length > 0 && !existing.args) {
317
- existing.args = input as JsonObject;
318
- }
319
- this._forceNextUpdate = true;
320
- return;
321
- }
322
-
323
- const agentNs = this.resolveAgentNamespace(namespace);
324
- const parentMsg = this.state.currentAiMessage.get(agentNs)
325
- ?? this.ensureAiMessageForToolCall(agentNs);
326
- if (!parentMsg) return;
327
-
328
- const approvalReq = this.checkApprovalRequirement(name, input);
329
-
330
- const tc = create(ToolCallSchema, {
331
- id: callId,
332
- name,
333
- status: approvalReq.requiresApproval
334
- ? ToolCallStatus.TOOL_CALL_WAITING_APPROVAL
335
- : ToolCallStatus.TOOL_CALL_RUNNING,
336
- startedAt: utcTimestamp(),
337
- });
338
-
339
- if (Object.keys(input).length > 0) {
340
- tc.args = input as JsonObject;
341
- }
342
-
343
- if (approvalReq.serverSlug) {
344
- tc.mcpServerSlug = approvalReq.serverSlug;
345
- }
346
-
347
- // Classify after mcpServerSlug is set so MCP tools resolve correctly.
348
- tc.toolKind = classifyTool(tc.name, tc.mcpServerSlug);
349
-
350
- // Stamp authorization provenance in the same spot as tool_kind, for every
351
- // observed tool call (gated or auto-approved). A gated call is re-seeded on
352
- // reinvocation (the runtime's wide seed) with the same source carried
353
- // through the interrupt.
354
- stampApprovalProvenance(tc, this.approvalProvider);
355
-
356
- if (approvalReq.requiresApproval) {
357
- tc.requiresApproval = true;
358
- tc.approvalMessage = approvalReq.message;
359
- tc.approvalRequestedAt = utcTimestamp();
360
-
361
- const argsPreview = sanitizeArgsPreview(input);
362
- if (argsPreview) {
363
- tc.argsPreview = argsPreview;
364
- }
365
-
366
- this._awaitingApproval = true;
367
- }
368
-
369
- parentMsg.toolCalls.push(tc);
370
- this.state.toolCalls.set(callId, tc);
371
-
372
- this._forceNextUpdate = true;
373
- }
374
-
375
- private handleToolFinished(callId: string, output: unknown): void {
376
- const tc = this.state.toolCalls.get(callId);
377
- if (!tc) return;
378
-
379
- // Store the faithful result; bounding the gRPC payload is owned solely by
380
- // the persist chokepoint (offload + enforce in status.ts/status-offload.ts).
381
- // Truncating here would corrupt binary content (e.g. a screenshot's base64)
382
- // before offload can lift it into a renderable ToolCallOutputRef.
383
- tc.status = ToolCallStatus.TOOL_CALL_COMPLETED;
384
- tc.result = extractToolResultV3(output);
385
- tc.completedAt = utcTimestamp();
386
- tc.isStreaming = false;
387
- this.toolArgBuffers.delete(callId);
388
-
389
- // Project a completed to-do write into status.todos. deepagents' write_todos
390
- // runs its state-mutating Command when the tool node COMPLETES, so we mirror
391
- // it here (not at tool-start) — a call cancelled before finishing correctly
392
- // projects nothing. Keyed on the harness-agnostic ToolKind.TODO (stamped at
393
- // tool-start) and fed by the same shared mapper the Cursor tracker uses;
394
- // deepagents always full-replaces (no merge field). The tool call itself
395
- // stays in messages (the client filters ToolKind.TODO from the thread).
396
- if (tc.toolKind === ToolKind.TODO) {
397
- applyTodoUpdate(this.state.proto.todos, tc.args?.todos, { merge: false });
398
- }
399
-
400
- this._forceNextUpdate = true;
401
- }
402
-
403
- private handleToolError(callId: string, message: string): void {
404
- const tc = this.state.toolCalls.get(callId);
405
- if (!tc) return;
406
-
407
- tc.status = ToolCallStatus.TOOL_CALL_FAILED;
408
- tc.error = message;
409
- tc.completedAt = utcTimestamp();
410
- tc.isStreaming = false;
411
- this.toolArgBuffers.delete(callId);
412
-
413
- this._forceNextUpdate = true;
414
- }
415
-
416
- private handleToolCallArgDelta(callId: string, argsChunk: string): void {
417
- const tc = this.state.toolCalls.get(callId);
418
- if (!tc) return;
419
-
420
- const buffer = (this.toolArgBuffers.get(callId) ?? "") + argsChunk;
421
- this.toolArgBuffers.set(callId, buffer);
422
-
423
- try {
424
- tc.args = JSON.parse(buffer) as JsonObject;
425
- } catch {
426
- // Partial JSON — will parse on next chunk or tool-finished
427
- }
428
- }
429
-
430
- private handleToolOutputDelta(callId: string, delta: string): void {
431
- const tc = this.state.toolCalls.get(callId);
432
- if (!tc) return;
433
- tc.result = (tc.result ?? "") + delta;
434
- }
435
-
436
- // ── Namespace Resolution ────────────────────────────────────────
437
-
438
- /**
439
- * v3 tool events carry namespace like "tools:toolu_abc" or
440
- * "subagent:worker-1|tools:toolu_abc". Strip tools:* segments
441
- * to get the agent namespace for AI message lookup.
442
- */
443
- private resolveAgentNamespace(ns: string): string {
444
- if (!ns) return "";
445
- const parts = ns.split("|").filter(p => !p.startsWith("tools:"));
446
- return parts.join("|");
447
- }
448
-
449
- // ── Approval ──────────────────────────────────────────────────────
450
-
451
- private checkApprovalRequirement(
452
- toolName: string,
453
- args: Record<string, unknown>,
454
- ): { requiresApproval: boolean; message: string; serverSlug: string } {
455
- if (!this.approvalProvider) {
456
- return { requiresApproval: false, message: "", serverSlug: "" };
457
- }
458
-
459
- const serverSlug = this.approvalProvider.toolServerMap.get(toolName) ?? "";
460
-
461
- if (this.approvalProvider.globalBypass) {
462
- return { requiresApproval: false, message: "", serverSlug };
463
- }
464
-
465
- // Unattended mode: the gate auto-skips instead of interrupting, so no row
466
- // is ever WAITING_APPROVAL and the phase never flips — the streamed row
467
- // runs to its skip result and reconcileUnattendedSkips terminalizes it.
468
- if (this.approvalProvider.unattended) {
469
- return { requiresApproval: false, message: "", serverSlug };
470
- }
471
-
472
- if (serverSlug) {
473
- const key = `${serverSlug}/${toolName}`;
474
- const policy = this.approvalProvider.policies.get(key);
475
- if (policy?.requiresApproval) {
476
- return {
477
- requiresApproval: true,
478
- message: resolveApprovalMsg(policy.approvalMessage, toolName, args),
479
- serverSlug,
480
- };
481
- }
482
- return { requiresApproval: false, message: "", serverSlug };
483
- }
484
-
485
- return { requiresApproval: false, message: "", serverSlug: "" };
486
- }
487
-
488
- // ── Content Helpers ───────────────────────────────────────────────
489
-
490
- private ensureAiMessage(
491
- runId: string,
492
- namespace: string,
493
- type: MessageType,
494
- ): AgentMessage {
495
- const existingByRun = this.state.messagesByRun.get(runId);
496
- if (existingByRun) return existingByRun;
497
-
498
- const lastRunId = this.state.lastLlmRunId.get(namespace);
499
- if (lastRunId && lastRunId !== runId) {
500
- const existingMsg = this.state.currentAiMessage.get(namespace);
501
- if (existingMsg) {
502
- existingMsg.isStreaming = false;
503
- }
504
- }
505
-
506
- const msg = create(AgentMessageSchema, {
507
- type,
508
- content: "",
509
- timestamp: utcTimestamp(),
510
- isStreaming: true,
511
- });
512
-
513
- this.state.proto.messages.push(msg);
514
- this.state.messagesByRun.set(runId, msg);
515
- this.state.currentAiMessage.set(namespace, msg);
516
- this.state.lastLlmRunId.set(namespace, runId);
517
-
518
- return msg;
519
- }
520
-
521
- private ensureAiMessageForToolCall(namespace: string): AgentMessage | null {
522
- const lastRunId = this.state.lastLlmRunId.get(namespace);
523
- if (lastRunId) {
524
- const existing = this.state.messagesByRun.get(lastRunId);
525
- if (existing) {
526
- this.state.currentAiMessage.set(namespace, existing);
527
- return existing;
528
- }
529
- }
530
-
531
- const msg = create(AgentMessageSchema, {
532
- type: MessageType.MESSAGE_AI,
533
- content: "",
534
- timestamp: utcTimestamp(),
535
- isStreaming: false,
536
- });
537
-
538
- this.state.proto.messages.push(msg);
539
- this.state.currentAiMessage.set(namespace, msg);
540
-
541
- return msg;
542
- }
543
-
544
- // ── Sub-Agent Integration ──────────────────────────────────────────
545
-
546
- /**
547
- * Check if a tool_call_id belongs to a tracked "task" tool invocation.
548
- * Used to route tool_finished/tool_error events to both parent and tracker.
549
- */
550
- private isTrackedTaskTool(callId: string): boolean {
551
- const tc = this.state.toolCalls.get(callId);
552
- return tc?.name === "task";
553
- }
554
-
555
- /**
556
- * Clear the streaming flag on every sub-agent message still marked as
557
- * streaming — what a turn that stopped mid-delegation owes the transcript
558
- * beside the CANCELLED status the caller stamps on the row itself
559
- * (`shared/subagent-rows.ts` `cancelInProgressSubAgentProtos`, the one
560
- * home of that transition for every harness).
561
- */
562
- finalizeSubAgentStreaming(): void {
563
- this.subAgentTracker.finalizeAllStreaming();
564
- }
565
- }
@@ -1,56 +0,0 @@
1
- /**
2
- * Shared interface for proto mutation consumed by side-effect classes
3
- * (InlinePublisher, WriteBackCoordinator) and streaming loops.
4
- *
5
- * The deep-agent harness implements it on its `V3StatusBuilder`; the Cursor
6
- * harness — which mutates a bare status proto with no builder — uses
7
- * {@link statusProtoWriter}. Side-effect classes depend only on this
8
- * interface, never on a specific implementation.
9
- */
10
-
11
- import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
12
- import type { ExecutionArtifact } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/artifact_pb";
13
- import type { WorkspaceWriteBack } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
14
-
15
- export interface ExecutionStatusWriter {
16
- readonly currentStatus: AgentExecutionStatus;
17
- readonly forceNextUpdate: boolean;
18
- clearForceFlag(): void;
19
- addArtifact(artifact: ExecutionArtifact): void;
20
- addWriteBack(wb: WorkspaceWriteBack): void;
21
- }
22
-
23
- /**
24
- * An {@link ExecutionStatusWriter} over a bare status proto, for harnesses
25
- * that mutate the status directly instead of through a builder (the Cursor
26
- * harness). Mutations apply synchronously to the given proto; the caller's
27
- * own persist points pick them up — the force flag is a streaming-loop
28
- * concern the direct-mutation style has no use for, so it stays `false`.
29
- *
30
- * Write-backs upsert by `workspaceEntryName` — the same contract as the
31
- * deep-agent `V3StatusBuilder.addWriteBack`: each git-backed workspace entry
32
- * carries at most one record, progressing through phases.
33
- */
34
- export function statusProtoWriter(status: AgentExecutionStatus): ExecutionStatusWriter {
35
- return {
36
- get currentStatus() {
37
- return status;
38
- },
39
- forceNextUpdate: false,
40
- clearForceFlag() {},
41
- addArtifact(artifact: ExecutionArtifact) {
42
- status.artifacts.push(artifact);
43
- },
44
- addWriteBack(wb: WorkspaceWriteBack) {
45
- const backs = status.workspaceWriteBacks;
46
- const idx = backs.findIndex(
47
- (b) => b.workspaceEntryName === wb.workspaceEntryName,
48
- );
49
- if (idx >= 0) {
50
- backs[idx] = wb;
51
- } else {
52
- backs.push(wb);
53
- }
54
- },
55
- };
56
- }