@stigmer/runner 3.15.1 → 3.15.2-dev.20260913223433

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/README.md +2 -4
  2. package/dist/.build-fingerprint +1 -1
  3. package/dist/__test-utils__/execution-record-fixture.d.ts +14 -0
  4. package/dist/__test-utils__/execution-record-fixture.js +4 -0
  5. package/dist/__test-utils__/execution-record-fixture.js.map +1 -1
  6. package/dist/__test-utils__/file-review-projection.d.ts +40 -0
  7. package/dist/__test-utils__/file-review-projection.js +136 -0
  8. package/dist/__test-utils__/file-review-projection.js.map +1 -0
  9. package/dist/__test-utils__/harness-contract/types.d.ts +23 -1
  10. package/dist/__test-utils__/harness-contract/types.js +15 -0
  11. package/dist/__test-utils__/harness-contract/types.js.map +1 -1
  12. package/dist/__test-utils__/hermetic-activity.d.ts +44 -12
  13. package/dist/__test-utils__/hermetic-activity.js +52 -14
  14. package/dist/__test-utils__/hermetic-activity.js.map +1 -1
  15. package/dist/__test-utils__/model-registry-fixture.d.ts +32 -7
  16. package/dist/__test-utils__/model-registry-fixture.js +31 -7
  17. package/dist/__test-utils__/model-registry-fixture.js.map +1 -1
  18. package/dist/__test-utils__/turn-input-fixture.d.ts +1 -1
  19. package/dist/__test-utils__/turn-input-fixture.js +1 -1
  20. package/dist/__test-utils__/turn-input-fixture.js.map +1 -1
  21. package/dist/activities/call-agent.js +2 -2
  22. package/dist/activities/call-agent.js.map +1 -1
  23. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +45 -3
  24. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -1
  25. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +0 -9
  26. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +2 -41
  27. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
  28. package/dist/activities/execute-cursor/adapter.d.ts +7 -5
  29. package/dist/activities/execute-cursor/adapter.js +7 -5
  30. package/dist/activities/execute-cursor/adapter.js.map +1 -1
  31. package/dist/activities/execute-cursor/approval-policy.d.ts +5 -2
  32. package/dist/activities/execute-cursor/approval-policy.js +5 -2
  33. package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
  34. package/dist/activities/execute-cursor/approval-state.d.ts +16 -8
  35. package/dist/activities/execute-cursor/approval-state.js +6 -3
  36. package/dist/activities/execute-cursor/approval-state.js.map +1 -1
  37. package/dist/activities/execute-cursor/cas-observations.d.ts +14 -2
  38. package/dist/activities/execute-cursor/cas-observations.js +19 -2
  39. package/dist/activities/execute-cursor/cas-observations.js.map +1 -1
  40. package/dist/activities/execute-cursor/cursor-capabilities.d.ts +8 -4
  41. package/dist/activities/execute-cursor/cursor-capabilities.js +21 -4
  42. package/dist/activities/execute-cursor/cursor-capabilities.js.map +1 -1
  43. package/dist/activities/execute-cursor/message-translator.d.ts +12 -20
  44. package/dist/activities/execute-cursor/message-translator.js +19 -32
  45. package/dist/activities/execute-cursor/message-translator.js.map +1 -1
  46. package/dist/activities/execute-cursor/prompt-builder.d.ts +48 -58
  47. package/dist/activities/execute-cursor/prompt-builder.js +76 -95
  48. package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
  49. package/dist/activities/execute-cursor/turn-boundary.d.ts +27 -55
  50. package/dist/activities/execute-cursor/turn-boundary.js +30 -90
  51. package/dist/activities/execute-cursor/turn-boundary.js.map +1 -1
  52. package/dist/activities/execute-cursor/turn-settle.d.ts +11 -7
  53. package/dist/activities/execute-cursor/turn-settle.js +37 -49
  54. package/dist/activities/execute-cursor/turn-settle.js.map +1 -1
  55. package/dist/activities/execute-cursor/turn-setup.d.ts +16 -24
  56. package/dist/activities/execute-cursor/turn-setup.js +29 -59
  57. package/dist/activities/execute-cursor/turn-setup.js.map +1 -1
  58. package/dist/activities/execute-cursor/turn-stream.d.ts +3 -8
  59. package/dist/activities/execute-cursor/turn-stream.js +9 -22
  60. package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
  61. package/dist/activities/execute-cursor/turn.js +5 -1
  62. package/dist/activities/execute-cursor/turn.js.map +1 -1
  63. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.d.ts +93 -0
  64. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js +348 -0
  65. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js.map +1 -0
  66. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +170 -0
  67. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +225 -0
  68. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -0
  69. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.d.ts +24 -0
  70. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js +41 -0
  71. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js.map +1 -0
  72. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.d.ts +54 -0
  73. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js +72 -0
  74. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js.map +1 -0
  75. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +187 -23
  76. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +238 -27
  77. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
  78. package/dist/activities/execute-deep-agent/adapter.d.ts +41 -0
  79. package/dist/activities/execute-deep-agent/adapter.js +78 -0
  80. package/dist/activities/execute-deep-agent/adapter.js.map +1 -0
  81. package/dist/activities/execute-deep-agent/cas-capture-observer.d.ts +8 -0
  82. package/dist/activities/execute-deep-agent/cas-capture-observer.js +9 -0
  83. package/dist/activities/execute-deep-agent/cas-capture-observer.js.map +1 -1
  84. package/dist/activities/execute-deep-agent/deep-agent-capabilities.d.ts +31 -0
  85. package/dist/activities/execute-deep-agent/deep-agent-capabilities.js +40 -0
  86. package/dist/activities/execute-deep-agent/deep-agent-capabilities.js.map +1 -0
  87. package/dist/activities/execute-deep-agent/execution-state.d.ts +4 -11
  88. package/dist/activities/execute-deep-agent/execution-state.js +4 -12
  89. package/dist/activities/execute-deep-agent/execution-state.js.map +1 -1
  90. package/dist/activities/execute-deep-agent/hitl.d.ts +49 -47
  91. package/dist/activities/execute-deep-agent/hitl.js +77 -103
  92. package/dist/activities/execute-deep-agent/hitl.js.map +1 -1
  93. package/dist/activities/execute-deep-agent/prompt-builder.d.ts +51 -23
  94. package/dist/activities/execute-deep-agent/prompt-builder.js +115 -76
  95. package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
  96. package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +18 -32
  97. package/dist/activities/execute-deep-agent/status-builder-shared.js +10 -65
  98. package/dist/activities/execute-deep-agent/status-builder-shared.js.map +1 -1
  99. package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +10 -8
  100. package/dist/activities/execute-deep-agent/streaming-side-effects.js +12 -14
  101. package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
  102. package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +36 -13
  103. package/dist/activities/execute-deep-agent/subagent-tracker.js +76 -39
  104. package/dist/activities/execute-deep-agent/subagent-tracker.js.map +1 -1
  105. package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +25 -28
  106. package/dist/activities/execute-deep-agent/subagent-transformer.js +29 -82
  107. package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
  108. package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +3 -2
  109. package/dist/activities/execute-deep-agent/subagent-wiring.js +2 -2
  110. package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -1
  111. package/dist/activities/execute-deep-agent/turn-settle.d.ts +42 -0
  112. package/dist/activities/execute-deep-agent/turn-settle.js +146 -0
  113. package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -0
  114. package/dist/activities/execute-deep-agent/turn-setup.d.ts +212 -0
  115. package/dist/activities/execute-deep-agent/turn-setup.js +430 -0
  116. package/dist/activities/execute-deep-agent/turn-setup.js.map +1 -0
  117. package/dist/activities/execute-deep-agent/turn-stream.d.ts +97 -0
  118. package/dist/activities/execute-deep-agent/turn-stream.js +242 -0
  119. package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -0
  120. package/dist/activities/execute-deep-agent/turn.d.ts +42 -0
  121. package/dist/activities/execute-deep-agent/turn.js +116 -0
  122. package/dist/activities/execute-deep-agent/turn.js.map +1 -0
  123. package/dist/activities/execute-deep-agent/v3-event-recorder.d.ts +6 -5
  124. package/dist/activities/execute-deep-agent/v3-event-recorder.js +6 -5
  125. package/dist/activities/execute-deep-agent/v3-event-recorder.js.map +1 -1
  126. package/dist/activities/execute-deep-agent/v3-events.d.ts +1 -1
  127. package/dist/activities/execute-deep-agent/v3-events.js +1 -1
  128. package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +60 -17
  129. package/dist/activities/execute-deep-agent/v3-status-builder.js +72 -57
  130. package/dist/activities/execute-deep-agent/v3-status-builder.js.map +1 -1
  131. package/dist/harness/approval-decisions.d.ts +61 -0
  132. package/dist/harness/approval-decisions.js +102 -0
  133. package/dist/harness/approval-decisions.js.map +1 -0
  134. package/dist/harness/capabilities.d.ts +16 -5
  135. package/dist/harness/capabilities.js +9 -0
  136. package/dist/harness/capabilities.js.map +1 -1
  137. package/dist/harness/capture.d.ts +144 -0
  138. package/dist/harness/capture.js +219 -0
  139. package/dist/harness/capture.js.map +1 -0
  140. package/dist/harness/persist-chokepoint.d.ts +19 -4
  141. package/dist/harness/persist-chokepoint.js +17 -4
  142. package/dist/harness/persist-chokepoint.js.map +1 -1
  143. package/dist/harness/run-turn.js +115 -29
  144. package/dist/harness/run-turn.js.map +1 -1
  145. package/dist/harness/terminal-table.d.ts +40 -11
  146. package/dist/harness/terminal-table.js +58 -19
  147. package/dist/harness/terminal-table.js.map +1 -1
  148. package/dist/harness/turn-context.d.ts +141 -76
  149. package/dist/harness/turn-context.js +194 -99
  150. package/dist/harness/turn-context.js.map +1 -1
  151. package/dist/harness/types.d.ts +65 -12
  152. package/dist/harness/types.js +8 -2
  153. package/dist/harness/types.js.map +1 -1
  154. package/dist/harness-adapters.d.ts +12 -8
  155. package/dist/harness-adapters.js +17 -9
  156. package/dist/harness-adapters.js.map +1 -1
  157. package/dist/middleware/approval-gate.d.ts +1 -1
  158. package/dist/middleware/approval-gate.js +1 -1
  159. package/dist/middleware/approval-gate.js.map +1 -1
  160. package/dist/middleware/cost-advisory.d.ts +39 -0
  161. package/dist/middleware/{cost-cap.js → cost-advisory.js} +37 -55
  162. package/dist/middleware/cost-advisory.js.map +1 -0
  163. package/dist/middleware/index.d.ts +23 -12
  164. package/dist/middleware/index.js +26 -18
  165. package/dist/middleware/index.js.map +1 -1
  166. package/dist/middleware/types.d.ts +3 -2
  167. package/dist/runner-manager.js +1 -5
  168. package/dist/runner-manager.js.map +1 -1
  169. package/dist/runner.js +1 -5
  170. package/dist/runner.js.map +1 -1
  171. package/dist/shared/attachment-resolver.d.ts +41 -18
  172. package/dist/shared/attachment-resolver.js +178 -46
  173. package/dist/shared/attachment-resolver.js.map +1 -1
  174. package/dist/shared/attachment-zip.d.ts +85 -0
  175. package/dist/shared/attachment-zip.js +185 -0
  176. package/dist/shared/attachment-zip.js.map +1 -0
  177. package/dist/shared/connect-backfill.js +5 -4
  178. package/dist/shared/connect-backfill.js.map +1 -1
  179. package/dist/shared/cost-guard.d.ts +3 -3
  180. package/dist/shared/cost-guard.js +3 -3
  181. package/dist/shared/execution-status-writer.d.ts +5 -5
  182. package/dist/shared/execution-status-writer.js +5 -5
  183. package/dist/shared/extract-structured-output.d.ts +8 -7
  184. package/dist/shared/extract-structured-output.js +8 -7
  185. package/dist/shared/extract-structured-output.js.map +1 -1
  186. package/dist/shared/filereview/cas-progress.d.ts +1 -18
  187. package/dist/shared/filereview/cas-progress.js +4 -0
  188. package/dist/shared/filereview/cas-progress.js.map +1 -1
  189. package/dist/shared/filereview/cas-touched.d.ts +56 -0
  190. package/dist/shared/filereview/cas-touched.js +63 -0
  191. package/dist/shared/filereview/cas-touched.js.map +1 -0
  192. package/dist/shared/filereview/index.d.ts +2 -1
  193. package/dist/shared/filereview/index.js +2 -1
  194. package/dist/shared/filereview/index.js.map +1 -1
  195. package/dist/shared/mcp-resolver.d.ts +4 -5
  196. package/dist/shared/mcp-resolver.js +4 -5
  197. package/dist/shared/mcp-resolver.js.map +1 -1
  198. package/dist/shared/persist-decision.d.ts +3 -4
  199. package/dist/shared/persist-decision.js +3 -4
  200. package/dist/shared/persist-decision.js.map +1 -1
  201. package/dist/shared/plan-mode-permissions.d.ts +2 -2
  202. package/dist/shared/plan-mode-permissions.js +2 -2
  203. package/dist/shared/plan-mode-prompt.d.ts +1 -1
  204. package/dist/shared/plan-mode-prompt.js +1 -1
  205. package/dist/shared/prompt-sections.d.ts +163 -0
  206. package/dist/shared/prompt-sections.js +164 -0
  207. package/dist/shared/prompt-sections.js.map +1 -0
  208. package/dist/shared/skill-resolver.d.ts +4 -2
  209. package/dist/shared/skill-resolver.js +4 -2
  210. package/dist/shared/skill-resolver.js.map +1 -1
  211. package/dist/shared/tool-rounds.d.ts +32 -0
  212. package/dist/shared/tool-rounds.js +43 -0
  213. package/dist/shared/tool-rounds.js.map +1 -1
  214. package/dist/shared/tool-row.d.ts +34 -0
  215. package/dist/shared/tool-row.js +52 -0
  216. package/dist/shared/tool-row.js.map +1 -1
  217. package/dist/shared/workspace/session-provision.d.ts +3 -3
  218. package/dist/shared/workspace/session-provision.js +3 -3
  219. package/dist/shared/workspace/stigmer-link.d.ts +3 -3
  220. package/dist/shared/workspace/stigmer-link.js +3 -3
  221. package/dist/shared/workspace/writeback-coordinator.d.ts +15 -22
  222. package/dist/shared/workspace/writeback-coordinator.js +16 -53
  223. package/dist/shared/workspace/writeback-coordinator.js.map +1 -1
  224. package/dist/tools/index.d.ts +1 -1
  225. package/dist/tools/index.js +1 -1
  226. package/package.json +4 -4
  227. package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +1 -0
  228. package/src/__test-utils__/execution-record-fixture.ts +18 -2
  229. package/src/__test-utils__/file-review-projection.ts +156 -0
  230. package/src/__test-utils__/git-workspace-fixture.ts +58 -0
  231. package/src/__test-utils__/harness-boot-order-child.ts +7 -2
  232. package/src/__test-utils__/harness-contract/contract.ts +33 -20
  233. package/src/__test-utils__/harness-contract/recording-sink.ts +11 -1
  234. package/src/__test-utils__/harness-contract/runtime-contract.ts +328 -10
  235. package/src/__test-utils__/harness-contract/scripted-adapter.ts +38 -6
  236. package/src/__test-utils__/harness-contract/types.ts +27 -3
  237. package/src/__test-utils__/hermetic-activity.ts +52 -14
  238. package/src/__test-utils__/model-registry-fixture.ts +32 -7
  239. package/src/__test-utils__/module-specifiers.ts +24 -0
  240. package/src/__test-utils__/turn-input-fixture.ts +2 -2
  241. package/src/__tests__/harness-boot-order.test.ts +9 -2
  242. package/src/activities/call-agent.ts +2 -2
  243. package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +47 -3
  244. package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +2 -48
  245. package/src/activities/execute-cursor/__tests__/approval-decisions-agree.test.ts +1 -1
  246. package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +6 -1
  247. package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +52 -27
  248. package/src/activities/execute-cursor/__tests__/cas-observations.test.ts +25 -0
  249. package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.everything.prompt.md +166 -0
  250. package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.plan-mode.prompt.md +186 -0
  251. package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.recovery.prompt.md +191 -0
  252. package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.reinvocation.prompt.md +13 -0
  253. package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.prefixed.prompt.md +32 -0
  254. package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.raw.prompt.md +1 -0
  255. package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +1 -2
  256. package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-error-at-create.status.json +4 -0
  257. package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +24 -4
  258. package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +6 -5
  259. package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +9 -0
  260. package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +11 -8
  261. package/src/activities/execute-cursor/__tests__/prompt-goldens.test.ts +229 -0
  262. package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +3 -3
  263. package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +2 -2
  264. package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +78 -234
  265. package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +1 -26
  266. package/src/activities/execute-cursor/adapter.ts +7 -5
  267. package/src/activities/execute-cursor/approval-policy.ts +5 -2
  268. package/src/activities/execute-cursor/approval-state.ts +16 -8
  269. package/src/activities/execute-cursor/cas-observations.ts +20 -2
  270. package/src/activities/execute-cursor/cursor-capabilities.ts +24 -5
  271. package/src/activities/execute-cursor/message-translator.ts +29 -41
  272. package/src/activities/execute-cursor/prompt-builder.ts +99 -157
  273. package/src/activities/execute-cursor/turn-boundary.ts +34 -140
  274. package/src/activities/execute-cursor/turn-settle.ts +37 -51
  275. package/src/activities/execute-cursor/turn-setup.ts +30 -70
  276. package/src/activities/execute-cursor/turn-stream.ts +8 -31
  277. package/src/activities/execute-cursor/turn.ts +5 -1
  278. package/src/activities/execute-deep-agent/__test-utils__/contract-subject.ts +391 -0
  279. package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +313 -0
  280. package/src/activities/execute-deep-agent/__test-utils__/hitl-script.ts +48 -0
  281. package/src/activities/execute-deep-agent/__test-utils__/scripted-model-module.ts +85 -0
  282. package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +383 -36
  283. package/src/activities/execute-deep-agent/__tests__/adapter-graph-is-sdk-free.test.ts +76 -0
  284. package/src/activities/execute-deep-agent/__tests__/adapter-is-temporal-free.test.ts +47 -0
  285. package/src/activities/execute-deep-agent/__tests__/adapter.test.ts +80 -0
  286. package/src/activities/execute-deep-agent/__tests__/cas-capture-backend.test.ts +1 -1
  287. package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +0 -2
  288. package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +0 -3
  289. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.build-from-plan.prompt.md +172 -0
  290. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.everything.prompt.md +167 -0
  291. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.minimal.prompt.md +36 -0
  292. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.plan-mode.prompt.md +178 -0
  293. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.skills-below-threshold.prompt.md +158 -0
  294. package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +210 -0
  295. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn1.status.json +74 -0
  296. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn2.status.json +104 -0
  297. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve.turn2.status.json +78 -0
  298. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +138 -0
  299. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/gate.turn1.status.json +68 -0
  300. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +154 -0
  301. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +116 -0
  302. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.after-tool.status.json +69 -0
  303. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.mid-tool.status.json +67 -0
  304. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/plain-turn.status.json +47 -0
  305. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/platform-stop.status.json +68 -0
  306. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +280 -0
  307. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/reject.turn2.status.json +77 -0
  308. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/resolution-error.status.json +18 -0
  309. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn2.status.json +99 -0
  310. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn3.status.json +109 -0
  311. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/skip.turn2.status.json +76 -0
  312. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.text-fallback.status.json +51 -0
  313. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tier2.status.json +51 -0
  314. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tool-strategy.status.json +56 -0
  315. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sub-agent-delegation.status.json +90 -0
  316. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/tool-call.status.json +70 -0
  317. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/worker-shutdown.status.json +71 -0
  318. package/src/activities/execute-deep-agent/__tests__/hermetic/harness-contract.test.ts +144 -0
  319. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-approve-all-lease.test.ts +184 -0
  320. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-round-trips.test.ts +203 -0
  321. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-sequential-gates.test.ts +170 -0
  322. package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +175 -0
  323. package/src/activities/execute-deep-agent/__tests__/hermetic/pause-vs-shutdown.test.ts +206 -0
  324. package/src/activities/execute-deep-agent/__tests__/hermetic/plain-turn.test.ts +142 -0
  325. package/src/activities/execute-deep-agent/__tests__/hermetic/platform-stop.test.ts +126 -0
  326. package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +139 -0
  327. package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +122 -0
  328. package/src/activities/execute-deep-agent/__tests__/hermetic/structured-output.test.ts +236 -0
  329. package/src/activities/execute-deep-agent/__tests__/hermetic/sub-agent-delegation.test.ts +161 -0
  330. package/src/activities/execute-deep-agent/__tests__/hermetic/tool-call.test.ts +157 -0
  331. package/src/activities/execute-deep-agent/__tests__/hermetic/workspace-lock-timeout.test.ts +152 -0
  332. package/src/activities/execute-deep-agent/__tests__/hitl.test.ts +50 -122
  333. package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +8 -6
  334. package/src/activities/execute-deep-agent/__tests__/plan-mode-path-normalization.test.ts +2 -2
  335. package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +35 -35
  336. package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +247 -0
  337. package/src/activities/execute-deep-agent/__tests__/scripted-model.test.ts +329 -0
  338. package/src/activities/execute-deep-agent/__tests__/status-builder-shared.test.ts +1 -20
  339. package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +78 -0
  340. package/src/activities/execute-deep-agent/__tests__/subagent-gitignored-capture.test.ts +1 -1
  341. package/src/activities/execute-deep-agent/__tests__/subagent-plan-mode-permissions.test.ts +2 -2
  342. package/src/activities/execute-deep-agent/__tests__/subagent-tracker.test.ts +57 -31
  343. package/src/activities/execute-deep-agent/__tests__/subagent-transformer.test.ts +19 -79
  344. package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +15 -15
  345. package/src/activities/execute-deep-agent/__tests__/summarization-verification.test.ts +1 -1
  346. package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +391 -0
  347. package/src/activities/execute-deep-agent/__tests__/v3-status-builder.test.ts +343 -38
  348. package/src/activities/execute-deep-agent/__tests__/vision-input.test.ts +5 -5
  349. package/src/activities/execute-deep-agent/adapter.ts +94 -0
  350. package/src/activities/execute-deep-agent/cas-capture-observer.ts +11 -0
  351. package/src/activities/execute-deep-agent/deep-agent-capabilities.ts +43 -0
  352. package/src/activities/execute-deep-agent/execution-state.ts +4 -13
  353. package/src/activities/execute-deep-agent/hitl.ts +100 -123
  354. package/src/activities/execute-deep-agent/prompt-builder.ts +141 -115
  355. package/src/activities/execute-deep-agent/status-builder-shared.ts +21 -84
  356. package/src/activities/execute-deep-agent/streaming-side-effects.ts +13 -19
  357. package/src/activities/execute-deep-agent/subagent-tracker.ts +77 -42
  358. package/src/activities/execute-deep-agent/subagent-transformer.ts +46 -105
  359. package/src/activities/execute-deep-agent/subagent-wiring.ts +5 -4
  360. package/src/activities/execute-deep-agent/turn-settle.ts +164 -0
  361. package/src/activities/execute-deep-agent/turn-setup.ts +541 -0
  362. package/src/activities/execute-deep-agent/turn-stream.ts +313 -0
  363. package/src/activities/execute-deep-agent/turn.ts +131 -0
  364. package/src/activities/execute-deep-agent/v3-event-recorder.ts +6 -5
  365. package/src/activities/execute-deep-agent/v3-events.ts +1 -1
  366. package/src/activities/execute-deep-agent/v3-status-builder.ts +84 -63
  367. package/src/harness/__tests__/approval-decisions.test.ts +116 -0
  368. package/src/harness/__tests__/capture.test.ts +268 -0
  369. package/src/harness/__tests__/mount-skills.test.ts +169 -0
  370. package/src/harness/__tests__/persist-chokepoint.test.ts +38 -2
  371. package/src/harness/__tests__/run-turn-deterministic.test.ts +94 -0
  372. package/src/harness/__tests__/run-turn.test.ts +39 -23
  373. package/src/harness/__tests__/turn-attachments-vision.test.ts +80 -0
  374. package/src/harness/__tests__/turn-context.test.ts +73 -26
  375. package/src/harness/approval-decisions.ts +104 -0
  376. package/src/harness/capabilities.ts +16 -5
  377. package/src/harness/capture.ts +301 -0
  378. package/src/harness/persist-chokepoint.ts +24 -4
  379. package/src/harness/run-turn.ts +120 -29
  380. package/src/harness/terminal-table.ts +61 -20
  381. package/src/harness/turn-context.ts +208 -111
  382. package/src/harness/types.ts +66 -12
  383. package/src/harness-adapters.ts +17 -9
  384. package/src/middleware/__tests__/approval-gate.test.ts +1 -1
  385. package/src/middleware/__tests__/cost-advisory.test.ts +113 -0
  386. package/src/middleware/approval-gate.ts +2 -2
  387. package/src/middleware/{cost-cap.ts → cost-advisory.ts} +40 -70
  388. package/src/middleware/index.ts +29 -29
  389. package/src/middleware/types.ts +3 -2
  390. package/src/runner-manager.ts +0 -8
  391. package/src/runner.ts +0 -8
  392. package/src/shared/__tests__/attachment-naming.test.ts +6 -19
  393. package/src/shared/__tests__/attachment-resolver.test.ts +158 -8
  394. package/src/shared/__tests__/attachment-zip.test.ts +236 -0
  395. package/src/shared/__tests__/bedrock-adapter.test.ts +1 -1
  396. package/src/shared/__tests__/blueprint-resolver.test.ts +43 -0
  397. package/src/shared/__tests__/cost-guard.test.ts +3 -3
  398. package/src/shared/__tests__/prompt-sections.test.ts +167 -0
  399. package/src/shared/__tests__/secret-leak-scan.test.ts +2 -2
  400. package/src/{activities/execute-deep-agent → shared}/__tests__/stamp-flowed-rows.test.ts +33 -10
  401. package/src/shared/__tests__/vertex-adapter.test.ts +1 -1
  402. package/src/shared/attachment-resolver.ts +218 -55
  403. package/src/shared/attachment-zip.ts +281 -0
  404. package/src/shared/connect-backfill.ts +9 -11
  405. package/src/shared/cost-guard.ts +3 -3
  406. package/src/shared/execution-status-writer.ts +5 -5
  407. package/src/shared/extract-structured-output.ts +8 -7
  408. package/src/shared/filereview/__tests__/capture.test.ts +86 -4
  409. package/src/shared/filereview/__tests__/cas-progress.test.ts +2 -1
  410. package/src/shared/filereview/cas-progress.ts +5 -19
  411. package/src/shared/filereview/cas-touched.ts +89 -0
  412. package/src/shared/filereview/index.ts +4 -2
  413. package/src/shared/mcp-resolver.ts +4 -5
  414. package/src/shared/persist-decision.ts +3 -4
  415. package/src/shared/plan-mode-permissions.ts +2 -2
  416. package/src/shared/plan-mode-prompt.ts +1 -1
  417. package/src/shared/prompt-sections.ts +256 -0
  418. package/src/shared/skill-resolver.ts +4 -2
  419. package/src/shared/tool-rounds.ts +48 -0
  420. package/src/shared/tool-row.ts +61 -0
  421. package/src/shared/workspace/__tests__/stigmer-link.test.ts +7 -22
  422. package/src/shared/workspace/__tests__/writeback-coordinator.test.ts +20 -61
  423. package/src/shared/workspace/session-provision.ts +3 -3
  424. package/src/shared/workspace/stigmer-link.ts +3 -3
  425. package/src/shared/workspace/writeback-coordinator.ts +16 -64
  426. package/src/tools/index.ts +1 -1
  427. package/dist/activities/execute-cursor/capture-flow.d.ts +0 -142
  428. package/dist/activities/execute-cursor/capture-flow.js +0 -285
  429. package/dist/activities/execute-cursor/capture-flow.js.map +0 -1
  430. package/dist/activities/execute-cursor/command-provenance.d.ts +0 -48
  431. package/dist/activities/execute-cursor/command-provenance.js +0 -38
  432. package/dist/activities/execute-cursor/command-provenance.js.map +0 -1
  433. package/dist/activities/execute-deep-agent/attachment-injector.d.ts +0 -134
  434. package/dist/activities/execute-deep-agent/attachment-injector.js +0 -386
  435. package/dist/activities/execute-deep-agent/attachment-injector.js.map +0 -1
  436. package/dist/activities/execute-deep-agent/command-provenance.d.ts +0 -61
  437. package/dist/activities/execute-deep-agent/command-provenance.js +0 -72
  438. package/dist/activities/execute-deep-agent/command-provenance.js.map +0 -1
  439. package/dist/activities/execute-deep-agent/environment.d.ts +0 -24
  440. package/dist/activities/execute-deep-agent/environment.js +0 -58
  441. package/dist/activities/execute-deep-agent/environment.js.map +0 -1
  442. package/dist/activities/execute-deep-agent/event-recorder.d.ts +0 -21
  443. package/dist/activities/execute-deep-agent/event-recorder.js +0 -67
  444. package/dist/activities/execute-deep-agent/event-recorder.js.map +0 -1
  445. package/dist/activities/execute-deep-agent/index.d.ts +0 -15
  446. package/dist/activities/execute-deep-agent/index.js +0 -918
  447. package/dist/activities/execute-deep-agent/index.js.map +0 -1
  448. package/dist/activities/execute-deep-agent/mcp-gate.d.ts +0 -28
  449. package/dist/activities/execute-deep-agent/mcp-gate.js +0 -22
  450. package/dist/activities/execute-deep-agent/mcp-gate.js.map +0 -1
  451. package/dist/activities/execute-deep-agent/post-stream.d.ts +0 -23
  452. package/dist/activities/execute-deep-agent/post-stream.js +0 -71
  453. package/dist/activities/execute-deep-agent/post-stream.js.map +0 -1
  454. package/dist/activities/execute-deep-agent/setup.d.ts +0 -136
  455. package/dist/activities/execute-deep-agent/setup.js +0 -767
  456. package/dist/activities/execute-deep-agent/setup.js.map +0 -1
  457. package/dist/activities/execute-deep-agent/stamp-flowed-rows.d.ts +0 -36
  458. package/dist/activities/execute-deep-agent/stamp-flowed-rows.js +0 -56
  459. package/dist/activities/execute-deep-agent/stamp-flowed-rows.js.map +0 -1
  460. package/dist/activities/execute-deep-agent/status-builder.d.ts +0 -93
  461. package/dist/activities/execute-deep-agent/status-builder.js +0 -365
  462. package/dist/activities/execute-deep-agent/status-builder.js.map +0 -1
  463. package/dist/activities/execute-deep-agent/streaming-terminal.d.ts +0 -21
  464. package/dist/activities/execute-deep-agent/streaming-terminal.js +0 -80
  465. package/dist/activities/execute-deep-agent/streaming-terminal.js.map +0 -1
  466. package/dist/activities/execute-deep-agent/streaming-v3.d.ts +0 -13
  467. package/dist/activities/execute-deep-agent/streaming-v3.js +0 -174
  468. package/dist/activities/execute-deep-agent/streaming-v3.js.map +0 -1
  469. package/dist/activities/execute-deep-agent/streaming.d.ts +0 -81
  470. package/dist/activities/execute-deep-agent/streaming.js +0 -160
  471. package/dist/activities/execute-deep-agent/streaming.js.map +0 -1
  472. package/dist/middleware/cost-cap.d.ts +0 -22
  473. package/dist/middleware/cost-cap.js.map +0 -1
  474. package/dist/middleware/graceful-stop.d.ts +0 -17
  475. package/dist/middleware/graceful-stop.js +0 -63
  476. package/dist/middleware/graceful-stop.js.map +0 -1
  477. package/dist/shared/skill-writer.d.ts +0 -75
  478. package/dist/shared/skill-writer.js +0 -207
  479. package/dist/shared/skill-writer.js.map +0 -1
  480. package/src/activities/execute-cursor/__tests__/capture-flow.test.ts +0 -1032
  481. package/src/activities/execute-cursor/__tests__/command-provenance.test.ts +0 -240
  482. package/src/activities/execute-cursor/__tests__/progress-substrate.test.ts +0 -169
  483. package/src/activities/execute-cursor/capture-flow.ts +0 -379
  484. package/src/activities/execute-cursor/command-provenance.ts +0 -73
  485. package/src/activities/execute-deep-agent/__tests__/attachment-injector.test.ts +0 -1161
  486. package/src/activities/execute-deep-agent/__tests__/command-provenance.test.ts +0 -252
  487. package/src/activities/execute-deep-agent/__tests__/environment.test.ts +0 -108
  488. package/src/activities/execute-deep-agent/__tests__/event-recorder.test.ts +0 -150
  489. package/src/activities/execute-deep-agent/__tests__/hitl-integration.test.ts +0 -226
  490. package/src/activities/execute-deep-agent/__tests__/hitl-reject.test.ts +0 -318
  491. package/src/activities/execute-deep-agent/__tests__/hitl-resume-approve-all.test.ts +0 -351
  492. package/src/activities/execute-deep-agent/__tests__/hitl-resume-history.test.ts +0 -293
  493. package/src/activities/execute-deep-agent/__tests__/index.test.ts +0 -99
  494. package/src/activities/execute-deep-agent/__tests__/mcp-gate.test.ts +0 -44
  495. package/src/activities/execute-deep-agent/__tests__/post-stream.test.ts +0 -112
  496. package/src/activities/execute-deep-agent/__tests__/sequential-gate-resume.test.ts +0 -358
  497. package/src/activities/execute-deep-agent/__tests__/status-builder.test.ts +0 -1933
  498. package/src/activities/execute-deep-agent/__tests__/streaming-terminal.test.ts +0 -40
  499. package/src/activities/execute-deep-agent/__tests__/streaming-v3.test.ts +0 -597
  500. package/src/activities/execute-deep-agent/__tests__/streaming.test.ts +0 -508
  501. package/src/activities/execute-deep-agent/attachment-injector.ts +0 -627
  502. package/src/activities/execute-deep-agent/command-provenance.ts +0 -102
  503. package/src/activities/execute-deep-agent/environment.ts +0 -76
  504. package/src/activities/execute-deep-agent/event-recorder.ts +0 -95
  505. package/src/activities/execute-deep-agent/index.ts +0 -1072
  506. package/src/activities/execute-deep-agent/mcp-gate.ts +0 -37
  507. package/src/activities/execute-deep-agent/post-stream.ts +0 -109
  508. package/src/activities/execute-deep-agent/setup.ts +0 -1081
  509. package/src/activities/execute-deep-agent/stamp-flowed-rows.ts +0 -64
  510. package/src/activities/execute-deep-agent/status-builder.ts +0 -481
  511. package/src/activities/execute-deep-agent/streaming-terminal.ts +0 -106
  512. package/src/activities/execute-deep-agent/streaming-v3.ts +0 -277
  513. package/src/activities/execute-deep-agent/streaming.ts +0 -313
  514. package/src/middleware/__tests__/cost-cap.test.ts +0 -192
  515. package/src/middleware/__tests__/graceful-stop.test.ts +0 -105
  516. package/src/middleware/graceful-stop.ts +0 -86
  517. package/src/shared/__tests__/skill-writer.test.ts +0 -372
  518. package/src/shared/skill-writer.ts +0 -266
@@ -1,277 +0,0 @@
1
- /**
2
- * V3 streaming execution loop for ExecuteDeepAgent.
3
- *
4
- * Feature-flagged path activated by LANGGRAPH_STREAM_EVENTS_VERSION=v3.
5
- * Calls the v3 streamEvents API (two-arg, returns Promise<GraphRunStream>),
6
- * iterates raw ProtocolEvents, feeds them through the V3ProtocolNormalizer
7
- * and V3StatusBuilder, persists status on schedule, and handles terminal
8
- * conditions (STOP, pause, recursion limit) identically to v2.
9
- *
10
- * Phase 2: full orchestration parity with streamExecutionV2.
11
- */
12
-
13
- import type { StreamDependencies, StreamResult } from "./streaming.js";
14
- import { StallTimeoutError } from "./streaming.js";
15
- import { ExecutionControlSignal, ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
16
- import { createV3EventRecorder, type V3ProtocolEvent } from "./v3-event-recorder.js";
17
- import { normalize } from "./v3-protocol-normalizer.js";
18
- import { V3StatusBuilder } from "./v3-status-builder.js";
19
- import { StreamingUpdateScheduler } from "../../shared/streaming-scheduler.js";
20
- import { persistStatus, slimStatus } from "../../shared/status.js";
21
- import { StreamingSideEffects } from "./streaming-side-effects.js";
22
- import {
23
- handlePause,
24
- handleStop,
25
- handleRecursionLimit,
26
- isGraphRecursionError,
27
- } from "./streaming-terminal.js";
28
-
29
- interface V3RunStream extends AsyncIterable<V3ProtocolEvent> {
30
- readonly output: Promise<unknown>;
31
- abort(reason?: unknown): void;
32
- readonly signal: AbortSignal;
33
- }
34
-
35
- const DEFAULT_STALL_TIMEOUT_MS = 120_000;
36
- const HEARTBEAT_INTERVAL_MS = 2_000;
37
- const RUN_OUTPUT_TIMEOUT_MS = 30_000;
38
-
39
- export async function streamExecutionV3(
40
- deps: StreamDependencies,
41
- ): Promise<StreamResult> {
42
- const {
43
- agentGraph,
44
- langgraphInput,
45
- langgraphConfig,
46
- executionId,
47
- client,
48
- initialStatus,
49
- streamingConfig,
50
- retryOptions,
51
- offload,
52
- stallTimeoutMs = DEFAULT_STALL_TIMEOUT_MS,
53
- heartbeatFn,
54
- isCancelledFn,
55
- gracefulStop,
56
- inlinePublisher,
57
- writebackCoordinator,
58
- approvalProvider,
59
- } = deps;
60
-
61
- const statusBuilder = new V3StatusBuilder(executionId, initialStatus);
62
- if (approvalProvider) {
63
- statusBuilder.setApprovalProvider(approvalProvider);
64
- }
65
-
66
- const scheduler = new StreamingUpdateScheduler(streamingConfig);
67
- const recorder = createV3EventRecorder(executionId, process.env.V3_EVENT_RECORD_DIR);
68
- const abortController = new AbortController();
69
-
70
- const sideEffects = new StreamingSideEffects({
71
- inlinePublisher,
72
- writebackCoordinator,
73
- });
74
-
75
- // Pre-loop heartbeat to cover the initial await
76
- sendHeartbeat(heartbeatFn, executionId, 0, statusBuilder);
77
-
78
- const run = await (agentGraph as any).streamEvents(langgraphInput, {
79
- ...langgraphConfig,
80
- version: "v3",
81
- signal: abortController.signal,
82
- }) as V3RunStream;
83
-
84
- let eventsProcessed = 0;
85
- let lastActivityAt = performance.now();
86
-
87
- const heartbeatTimer = setInterval(() => {
88
- sendHeartbeat(heartbeatFn, executionId, eventsProcessed, statusBuilder);
89
- }, HEARTBEAT_INTERVAL_MS);
90
-
91
- try {
92
- for await (const event of run as AsyncIterable<V3ProtocolEvent>) {
93
- if (isCancelledFn?.()) {
94
- abortController.abort("Cancelled by platform");
95
- statusBuilder.cancelSubAgents();
96
- return handlePause(
97
- statusBuilder, eventsProcessed,
98
- sideEffects.pendingPublishPromises,
99
- sideEffects.pendingWritebackPromises,
100
- );
101
- }
102
-
103
- lastActivityAt = performance.now();
104
- recorder?.record(event, eventsProcessed);
105
-
106
- for (const normalized of normalize(event)) {
107
- statusBuilder.processEvent(normalized);
108
- }
109
- sideEffects.onProtocolEvent(event);
110
- eventsProcessed++;
111
-
112
- const shouldPersist = statusBuilder.forceNextUpdate ||
113
- scheduler.shouldSendUpdate(eventsProcessed);
114
-
115
- if (shouldPersist) {
116
- if (statusBuilder.forceNextUpdate) {
117
- statusBuilder.clearForceFlag();
118
- }
119
-
120
- statusBuilder.syncSubAgentExecutions();
121
- // Mid-run live capture (DD-32): attach file_change_progress to the live
122
- // status before it is persisted. Injected so this loop stays ignorant of
123
- // file-review specifics; a no-op when the hook is absent or nothing changed.
124
- const statusToPersist = statusBuilder.currentStatus;
125
- await deps.beforePersist?.(statusToPersist);
126
- const signal = await persistStatus(
127
- client,
128
- executionId,
129
- statusToPersist,
130
- { offload, retry: retryOptions },
131
- );
132
- scheduler.markUpdateSent(eventsProcessed);
133
-
134
- if (signal === ExecutionControlSignal.STOP) {
135
- console.warn(
136
- `[streaming-v3] STOP signal received for execution ${executionId}`,
137
- );
138
- if (gracefulStop) {
139
- gracefulStop.activate("Platform STOP signal");
140
- } else {
141
- return handleStop(
142
- statusBuilder, eventsProcessed,
143
- sideEffects.pendingPublishPromises,
144
- sideEffects.pendingWritebackPromises,
145
- );
146
- }
147
- }
148
- }
149
-
150
- checkStallTimeout(lastActivityAt, stallTimeoutMs, executionId);
151
- }
152
- } catch (err: unknown) {
153
- if (isGraphRecursionError(err)) {
154
- await recorder?.flush();
155
- return handleRecursionLimit(
156
- statusBuilder, eventsProcessed,
157
- sideEffects.pendingPublishPromises,
158
- sideEffects.pendingWritebackPromises,
159
- );
160
- }
161
- throw err;
162
- } finally {
163
- clearInterval(heartbeatTimer);
164
- }
165
-
166
- await recorder?.flush();
167
-
168
- if (eventsProcessed === 0) {
169
- throw new Error(
170
- "Stream completed without processing any events. " +
171
- "This may indicate a configuration error or v3 API incompatibility.",
172
- );
173
- }
174
-
175
- statusBuilder.syncSubAgentExecutions();
176
-
177
- if (initialStatus.phase === ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL) {
178
- console.log(
179
- `[streaming-v3] execution=${executionId} stream ended with WAITING_FOR_APPROVAL. ` +
180
- `Not setting COMPLETED. pending_approvals computed server-side.`,
181
- );
182
- return {
183
- eventsProcessed,
184
- terminalStatus: slimStatus(initialStatus),
185
- pendingPublishPromises: sideEffects.pendingPublishPromises,
186
- pendingWritebackPromises: sideEffects.pendingWritebackPromises,
187
- };
188
- }
189
-
190
- console.log(
191
- `[streaming-v3] execution=${executionId} stream finished — ` +
192
- `processed ${eventsProcessed} events`,
193
- );
194
-
195
- const runOutput = await extractRunOutput(run, executionId);
196
-
197
- return {
198
- eventsProcessed,
199
- runOutput,
200
- pendingPublishPromises: sideEffects.pendingPublishPromises,
201
- pendingWritebackPromises: sideEffects.pendingWritebackPromises,
202
- };
203
- }
204
-
205
- // ── Run Output Extraction ────────────────────────────────────────────
206
-
207
- async function extractRunOutput(
208
- run: { output: Promise<unknown> },
209
- executionId: string,
210
- ): Promise<Record<string, unknown> | undefined> {
211
- try {
212
- const finalState = await Promise.race([
213
- run.output,
214
- timeoutPromise(RUN_OUTPUT_TIMEOUT_MS),
215
- ]);
216
-
217
- if (finalState === TIMEOUT_SENTINEL) {
218
- console.warn(
219
- `[streaming-v3] execution=${executionId} — run.output did not resolve ` +
220
- `within ${RUN_OUTPUT_TIMEOUT_MS}ms. Proceeding without final state.`,
221
- );
222
- return undefined;
223
- }
224
-
225
- const output = finalState as Record<string, unknown>;
226
- console.log(
227
- `[streaming-v3] execution=${executionId} — run.output resolved. ` +
228
- `Keys: [${Object.keys(output ?? {}).join(", ")}]. ` +
229
- `hasStructuredResponse=${output?.structuredResponse !== undefined}`,
230
- );
231
- return output;
232
- } catch (err) {
233
- console.warn(
234
- `[streaming-v3] execution=${executionId} — run.output rejected: ${err}`,
235
- );
236
- return undefined;
237
- }
238
- }
239
-
240
- const TIMEOUT_SENTINEL = Symbol("timeout");
241
-
242
- function timeoutPromise(ms: number): Promise<typeof TIMEOUT_SENTINEL> {
243
- return new Promise((resolve) => setTimeout(() => resolve(TIMEOUT_SENTINEL), ms));
244
- }
245
-
246
- // ── Helpers ──────────────────────────────────────────────────────────
247
-
248
- function sendHeartbeat(
249
- fn: ((details: Record<string, unknown>) => void) | undefined,
250
- executionId: string,
251
- eventsProcessed: number,
252
- sb: V3StatusBuilder,
253
- ): void {
254
- if (!fn) return;
255
- try {
256
- fn({
257
- executionId,
258
- eventsProcessed,
259
- messages: sb.currentStatus.messages.length,
260
- phase: sb.currentStatus.phase,
261
- });
262
- } catch { /* swallow */ }
263
- }
264
-
265
- function checkStallTimeout(
266
- lastActivityAt: number,
267
- stallTimeoutMs: number,
268
- executionId: string,
269
- ): void {
270
- const elapsed = performance.now() - lastActivityAt;
271
- if (elapsed > stallTimeoutMs) {
272
- throw new StallTimeoutError(
273
- `Agent stream stalled: no events received for ${Math.round(elapsed / 1000)}s ` +
274
- `for execution ${executionId}`,
275
- );
276
- }
277
- }
@@ -1,313 +0,0 @@
1
- /**
2
- * Streaming execution loop for ExecuteDeepAgent.
3
- *
4
- * Replaces the Phase 3a invoke() approach with streamEvents() v2
5
- * consumption. Feeds events to the StatusBuilder, persists status
6
- * via the scheduler + retry executor, handles terminal conditions
7
- * (STOP signal, stall, recursion limit, cancellation).
8
- *
9
- * Phase 3b-iii: inline artifact publish and incremental git writeback
10
- * on file-modifying tool completions (write, edit, create).
11
- */
12
-
13
- import { create, toJson } from "@bufbuild/protobuf";
14
- import {
15
- AgentExecutionStatusSchema,
16
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
17
- import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
18
- import { AgentMessageSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
19
- import {
20
- ExecutionControlSignal,
21
- ExecutionPhase,
22
- MessageType,
23
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
24
-
25
- import { StatusBuilder, type StreamEvent, type ApprovalPolicyProvider } from "./status-builder.js";
26
- import {
27
- handlePause,
28
- handleStop,
29
- handleRecursionLimit,
30
- isGraphRecursionError,
31
- } from "./streaming-terminal.js";
32
- import {
33
- StreamingUpdateScheduler,
34
- type StreamingConfig,
35
- } from "../../shared/streaming-scheduler.js";
36
- import { type RetryOptions } from "../../shared/grpc-retry.js";
37
- import { persistStatus, slimStatus, utcTimestamp } from "../../shared/status.js";
38
- import type { ToolOutputOffloadContext } from "../../shared/status-offload.js";
39
- import type { StigmerClient } from "../../client/stigmer-client.js";
40
- import type { GracefulStopMiddleware } from "../../middleware/index.js";
41
- import type { InlinePublisher } from "./inline-publisher.js";
42
- import type { WriteBackCoordinator } from "../../shared/workspace/writeback-coordinator.js";
43
- import { createV2EventRecorder } from "./event-recorder.js";
44
- import { streamExecutionV3 } from "./streaming-v3.js";
45
- import { extractFilePath, isFileModifyingTool } from "../../shared/file-tools.js";
46
-
47
- const DEFAULT_STALL_TIMEOUT_MS = 120_000;
48
-
49
- export interface StreamDependencies {
50
- readonly agentGraph: {
51
- streamEvents(
52
- input: Record<string, unknown>,
53
- config: Record<string, unknown>,
54
- options: { version: string },
55
- ): AsyncIterable<StreamEvent>;
56
- };
57
- readonly langgraphInput: Record<string, unknown>;
58
- readonly langgraphConfig: Record<string, unknown>;
59
- readonly executionId: string;
60
- readonly client: StigmerClient;
61
- readonly initialStatus: AgentExecutionStatus;
62
- readonly streamingConfig?: StreamingConfig;
63
- readonly retryOptions?: RetryOptions;
64
- /**
65
- * Offload context for the persist chokepoint. When set, oversized tool
66
- * outputs (e.g. computer-use screenshots) are spilled to artifact storage so
67
- * the UI can render them; when omitted, the aggregate size backstop still
68
- * keeps the payload under the gRPC cap.
69
- */
70
- readonly offload?: ToolOutputOffloadContext;
71
- readonly stallTimeoutMs?: number;
72
- /** Temporal heartbeat. Injected so the loop is testable without Temporal. */
73
- readonly heartbeatFn?: (details: Record<string, unknown>) => void;
74
- /** Temporal cancellation check. */
75
- readonly isCancelledFn?: () => boolean;
76
- /** GracefulStopMiddleware instance for platform STOP signal handling. */
77
- readonly gracefulStop?: GracefulStopMiddleware;
78
- /** Inline artifact publisher for file-modifying tool completions. */
79
- readonly inlinePublisher?: InlinePublisher;
80
- /** Incremental git write-back coordinator. */
81
- readonly writebackCoordinator?: WriteBackCoordinator;
82
- /** Approval policy provider for StatusBuilder tool-call phase tracking. */
83
- readonly approvalProvider?: ApprovalPolicyProvider;
84
- /** Streaming protocol version. Defaults to "v2" if unset. */
85
- readonly streamVersion?: "v2" | "v3";
86
- /**
87
- * Optional hook invoked with the live status just before each scheduled
88
- * persist. Used by mid-run live capture (DD-32) to attach file_change_progress.
89
- * Kept as an injected callback (closing over the turn's baseline tree / change
90
- * set id in index.ts) so this loop stays ignorant of file-review specifics.
91
- */
92
- readonly beforePersist?: (status: AgentExecutionStatus) => Promise<void>;
93
- }
94
-
95
- export interface StreamResult {
96
- readonly eventsProcessed: number;
97
- readonly terminalStatus?: unknown;
98
- readonly pendingPublishPromises: readonly Promise<void>[];
99
- readonly pendingWritebackPromises: readonly Promise<void>[];
100
- /** v3 only: the final state from run.output (includes structuredResponse if present). */
101
- readonly runOutput?: Record<string, unknown>;
102
- }
103
-
104
- /**
105
- * Run the streaming loop: consume streamEvents, map to proto via
106
- * StatusBuilder, persist on schedule, and handle terminal conditions.
107
- *
108
- * Routes to v3 when deps.streamVersion === "v3".
109
- */
110
- export async function streamExecution(
111
- deps: StreamDependencies,
112
- ): Promise<StreamResult> {
113
- if (deps.streamVersion === "v3") {
114
- return streamExecutionV3(deps);
115
- }
116
- return streamExecutionV2(deps);
117
- }
118
-
119
- async function streamExecutionV2(
120
- deps: StreamDependencies,
121
- ): Promise<StreamResult> {
122
- const {
123
- agentGraph,
124
- langgraphInput,
125
- langgraphConfig,
126
- executionId,
127
- client,
128
- initialStatus,
129
- streamingConfig,
130
- retryOptions,
131
- offload,
132
- stallTimeoutMs = DEFAULT_STALL_TIMEOUT_MS,
133
- heartbeatFn,
134
- isCancelledFn,
135
- gracefulStop,
136
- inlinePublisher,
137
- writebackCoordinator,
138
- approvalProvider,
139
- } = deps;
140
-
141
- const statusBuilder = new StatusBuilder(executionId, initialStatus);
142
- if (approvalProvider) {
143
- statusBuilder.setApprovalProvider(approvalProvider);
144
- }
145
- const scheduler = new StreamingUpdateScheduler(streamingConfig);
146
- const recorder = createV2EventRecorder(executionId, process.env.V2_EVENT_RECORD_DIR);
147
-
148
- let eventsProcessed = 0;
149
- let lastEventTime = performance.now();
150
- let lastHeartbeatTime = performance.now();
151
- const heartbeatIntervalMs = 2000;
152
-
153
- const pendingPublishPromises: Promise<void>[] = [];
154
- const pendingWritebackPromises: Promise<void>[] = [];
155
-
156
- try {
157
- const stream = agentGraph.streamEvents(
158
- langgraphInput,
159
- langgraphConfig,
160
- { version: "v2" },
161
- );
162
-
163
- for await (const event of stream) {
164
- if (isCancelledFn?.()) {
165
- return handlePause(statusBuilder, eventsProcessed, pendingPublishPromises, pendingWritebackPromises);
166
- }
167
-
168
- lastEventTime = performance.now();
169
- recorder?.record(event, eventsProcessed);
170
- statusBuilder.processEvent(event);
171
- eventsProcessed++;
172
-
173
- if (event.event === "on_tool_end" && (inlinePublisher || writebackCoordinator)) {
174
- const filePath = extractFilePathFromToolEnd(event);
175
- if (filePath) {
176
- if (inlinePublisher) {
177
- pendingPublishPromises.push(inlinePublisher.publish(filePath));
178
- }
179
- if (writebackCoordinator) {
180
- pendingWritebackPromises.push(writebackCoordinator.onFileModified(filePath));
181
- }
182
- }
183
- }
184
-
185
- const now = performance.now();
186
- if (heartbeatFn && (now - lastHeartbeatTime) >= heartbeatIntervalMs) {
187
- sendHeartbeat(heartbeatFn, executionId, eventsProcessed, statusBuilder);
188
- lastHeartbeatTime = now;
189
- }
190
-
191
- const shouldPersist = statusBuilder.forceNextUpdate ||
192
- scheduler.shouldSendUpdate(eventsProcessed);
193
-
194
- if (shouldPersist) {
195
- if (statusBuilder.forceNextUpdate) {
196
- statusBuilder.clearForceFlag();
197
- }
198
-
199
- // Mid-run live capture (DD-32): attach file_change_progress to the live
200
- // status before persisting (see streaming-v3.ts for the rationale).
201
- const statusToPersist = statusBuilder.currentStatus;
202
- await deps.beforePersist?.(statusToPersist);
203
- const signal = await persistStatus(
204
- client,
205
- executionId,
206
- statusToPersist,
207
- { offload, retry: retryOptions },
208
- );
209
- scheduler.markUpdateSent(eventsProcessed);
210
-
211
- if (signal === ExecutionControlSignal.STOP) {
212
- console.warn(
213
- `[streaming] STOP signal received for execution ${executionId}`,
214
- );
215
- if (gracefulStop) {
216
- gracefulStop.activate("Platform STOP signal");
217
- } else {
218
- return handleStop(statusBuilder, eventsProcessed, pendingPublishPromises, pendingWritebackPromises);
219
- }
220
- }
221
- }
222
-
223
- checkStallTimeout(lastEventTime, stallTimeoutMs, executionId);
224
- }
225
- } catch (err: unknown) {
226
- if (isGraphRecursionError(err)) {
227
- return handleRecursionLimit(statusBuilder, eventsProcessed, pendingPublishPromises, pendingWritebackPromises);
228
- }
229
- throw err;
230
- }
231
-
232
- await recorder?.flush();
233
-
234
- if (eventsProcessed === 0) {
235
- throw new Error(
236
- "Stream completed without processing any events. " +
237
- "This may indicate a configuration error.",
238
- );
239
- }
240
-
241
- if (initialStatus.phase === ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL) {
242
- console.log(
243
- `[streaming] execution=${executionId} stream ended with WAITING_FOR_APPROVAL. ` +
244
- `Not setting COMPLETED. pending_approvals computed server-side.`,
245
- );
246
- return {
247
- eventsProcessed,
248
- terminalStatus: slimStatus(initialStatus),
249
- pendingPublishPromises,
250
- pendingWritebackPromises,
251
- };
252
- }
253
-
254
- console.log(
255
- `[streaming] execution=${executionId} stream finished — ` +
256
- `processed ${eventsProcessed} events`,
257
- );
258
-
259
- return { eventsProcessed, pendingPublishPromises, pendingWritebackPromises };
260
- }
261
-
262
- // Terminal state handlers imported from streaming-terminal.ts
263
-
264
- // ── Helpers ──────────────────────────────────────────────────────────
265
-
266
- function sendHeartbeat(
267
- fn: (details: Record<string, unknown>) => void,
268
- executionId: string,
269
- eventsProcessed: number,
270
- sb: StatusBuilder,
271
- ): void {
272
- try {
273
- fn({
274
- executionId,
275
- eventsProcessed,
276
- messages: sb.currentStatus.messages.length,
277
- phase: sb.currentStatus.phase,
278
- });
279
- } catch (err) {
280
- console.warn(`[streaming] Heartbeat failed for ${executionId}:`, err);
281
- }
282
- }
283
-
284
- function checkStallTimeout(
285
- lastEventTime: number,
286
- stallTimeoutMs: number,
287
- executionId: string,
288
- ): void {
289
- const elapsed = performance.now() - lastEventTime;
290
- if (elapsed > stallTimeoutMs) {
291
- throw new StallTimeoutError(
292
- `Agent stream stalled: no events received for ${Math.round(elapsed / 1000)}s ` +
293
- `for execution ${executionId}`,
294
- );
295
- }
296
- }
297
-
298
- function extractFilePathFromToolEnd(event: StreamEvent): string | null {
299
- const toolName = event.name ?? "";
300
- if (!isFileModifyingTool(toolName)) return null;
301
-
302
- const input = event.data?.input as Record<string, unknown> | undefined;
303
- if (!input) return null;
304
-
305
- return extractFilePath(input);
306
- }
307
-
308
- export class StallTimeoutError extends Error {
309
- constructor(message: string) {
310
- super(message);
311
- this.name = "StallTimeoutError";
312
- }
313
- }