@stigmer/runner 3.15.0 → 3.15.2-dev.20260913223433

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/README.md +2 -4
  2. package/dist/.build-fingerprint +1 -1
  3. package/dist/__test-utils__/execution-record-fixture.d.ts +14 -0
  4. package/dist/__test-utils__/execution-record-fixture.js +4 -0
  5. package/dist/__test-utils__/execution-record-fixture.js.map +1 -1
  6. package/dist/__test-utils__/file-review-projection.d.ts +40 -0
  7. package/dist/__test-utils__/file-review-projection.js +136 -0
  8. package/dist/__test-utils__/file-review-projection.js.map +1 -0
  9. package/dist/__test-utils__/harness-contract/types.d.ts +23 -1
  10. package/dist/__test-utils__/harness-contract/types.js +15 -0
  11. package/dist/__test-utils__/harness-contract/types.js.map +1 -1
  12. package/dist/__test-utils__/hermetic-activity.d.ts +44 -12
  13. package/dist/__test-utils__/hermetic-activity.js +52 -14
  14. package/dist/__test-utils__/hermetic-activity.js.map +1 -1
  15. package/dist/__test-utils__/model-registry-fixture.d.ts +32 -7
  16. package/dist/__test-utils__/model-registry-fixture.js +31 -7
  17. package/dist/__test-utils__/model-registry-fixture.js.map +1 -1
  18. package/dist/__test-utils__/turn-input-fixture.d.ts +1 -1
  19. package/dist/__test-utils__/turn-input-fixture.js +1 -1
  20. package/dist/__test-utils__/turn-input-fixture.js.map +1 -1
  21. package/dist/activities/call-agent.js +2 -2
  22. package/dist/activities/call-agent.js.map +1 -1
  23. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +45 -3
  24. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -1
  25. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +0 -9
  26. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +2 -41
  27. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
  28. package/dist/activities/execute-cursor/adapter.d.ts +7 -5
  29. package/dist/activities/execute-cursor/adapter.js +7 -5
  30. package/dist/activities/execute-cursor/adapter.js.map +1 -1
  31. package/dist/activities/execute-cursor/approval-policy.d.ts +5 -2
  32. package/dist/activities/execute-cursor/approval-policy.js +5 -2
  33. package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
  34. package/dist/activities/execute-cursor/approval-state.d.ts +16 -8
  35. package/dist/activities/execute-cursor/approval-state.js +6 -3
  36. package/dist/activities/execute-cursor/approval-state.js.map +1 -1
  37. package/dist/activities/execute-cursor/cas-observations.d.ts +14 -2
  38. package/dist/activities/execute-cursor/cas-observations.js +19 -2
  39. package/dist/activities/execute-cursor/cas-observations.js.map +1 -1
  40. package/dist/activities/execute-cursor/cursor-capabilities.d.ts +8 -4
  41. package/dist/activities/execute-cursor/cursor-capabilities.js +21 -4
  42. package/dist/activities/execute-cursor/cursor-capabilities.js.map +1 -1
  43. package/dist/activities/execute-cursor/message-translator.d.ts +12 -20
  44. package/dist/activities/execute-cursor/message-translator.js +19 -32
  45. package/dist/activities/execute-cursor/message-translator.js.map +1 -1
  46. package/dist/activities/execute-cursor/prompt-builder.d.ts +48 -58
  47. package/dist/activities/execute-cursor/prompt-builder.js +76 -95
  48. package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
  49. package/dist/activities/execute-cursor/turn-boundary.d.ts +27 -55
  50. package/dist/activities/execute-cursor/turn-boundary.js +30 -90
  51. package/dist/activities/execute-cursor/turn-boundary.js.map +1 -1
  52. package/dist/activities/execute-cursor/turn-settle.d.ts +11 -7
  53. package/dist/activities/execute-cursor/turn-settle.js +37 -49
  54. package/dist/activities/execute-cursor/turn-settle.js.map +1 -1
  55. package/dist/activities/execute-cursor/turn-setup.d.ts +16 -24
  56. package/dist/activities/execute-cursor/turn-setup.js +29 -59
  57. package/dist/activities/execute-cursor/turn-setup.js.map +1 -1
  58. package/dist/activities/execute-cursor/turn-stream.d.ts +3 -8
  59. package/dist/activities/execute-cursor/turn-stream.js +9 -22
  60. package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
  61. package/dist/activities/execute-cursor/turn.js +5 -1
  62. package/dist/activities/execute-cursor/turn.js.map +1 -1
  63. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.d.ts +93 -0
  64. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js +348 -0
  65. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js.map +1 -0
  66. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +170 -0
  67. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +225 -0
  68. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -0
  69. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.d.ts +24 -0
  70. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js +41 -0
  71. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js.map +1 -0
  72. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.d.ts +54 -0
  73. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js +72 -0
  74. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js.map +1 -0
  75. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +187 -23
  76. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +238 -27
  77. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
  78. package/dist/activities/execute-deep-agent/adapter.d.ts +41 -0
  79. package/dist/activities/execute-deep-agent/adapter.js +78 -0
  80. package/dist/activities/execute-deep-agent/adapter.js.map +1 -0
  81. package/dist/activities/execute-deep-agent/cas-capture-observer.d.ts +8 -0
  82. package/dist/activities/execute-deep-agent/cas-capture-observer.js +9 -0
  83. package/dist/activities/execute-deep-agent/cas-capture-observer.js.map +1 -1
  84. package/dist/activities/execute-deep-agent/deep-agent-capabilities.d.ts +31 -0
  85. package/dist/activities/execute-deep-agent/deep-agent-capabilities.js +40 -0
  86. package/dist/activities/execute-deep-agent/deep-agent-capabilities.js.map +1 -0
  87. package/dist/activities/execute-deep-agent/execution-state.d.ts +4 -11
  88. package/dist/activities/execute-deep-agent/execution-state.js +4 -12
  89. package/dist/activities/execute-deep-agent/execution-state.js.map +1 -1
  90. package/dist/activities/execute-deep-agent/hitl.d.ts +49 -47
  91. package/dist/activities/execute-deep-agent/hitl.js +77 -103
  92. package/dist/activities/execute-deep-agent/hitl.js.map +1 -1
  93. package/dist/activities/execute-deep-agent/prompt-builder.d.ts +51 -23
  94. package/dist/activities/execute-deep-agent/prompt-builder.js +115 -76
  95. package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
  96. package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +18 -32
  97. package/dist/activities/execute-deep-agent/status-builder-shared.js +10 -65
  98. package/dist/activities/execute-deep-agent/status-builder-shared.js.map +1 -1
  99. package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +10 -8
  100. package/dist/activities/execute-deep-agent/streaming-side-effects.js +12 -14
  101. package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
  102. package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +36 -13
  103. package/dist/activities/execute-deep-agent/subagent-tracker.js +76 -39
  104. package/dist/activities/execute-deep-agent/subagent-tracker.js.map +1 -1
  105. package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +25 -28
  106. package/dist/activities/execute-deep-agent/subagent-transformer.js +29 -82
  107. package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
  108. package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +3 -2
  109. package/dist/activities/execute-deep-agent/subagent-wiring.js +2 -2
  110. package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -1
  111. package/dist/activities/execute-deep-agent/turn-settle.d.ts +42 -0
  112. package/dist/activities/execute-deep-agent/turn-settle.js +146 -0
  113. package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -0
  114. package/dist/activities/execute-deep-agent/turn-setup.d.ts +212 -0
  115. package/dist/activities/execute-deep-agent/turn-setup.js +430 -0
  116. package/dist/activities/execute-deep-agent/turn-setup.js.map +1 -0
  117. package/dist/activities/execute-deep-agent/turn-stream.d.ts +97 -0
  118. package/dist/activities/execute-deep-agent/turn-stream.js +242 -0
  119. package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -0
  120. package/dist/activities/execute-deep-agent/turn.d.ts +42 -0
  121. package/dist/activities/execute-deep-agent/turn.js +116 -0
  122. package/dist/activities/execute-deep-agent/turn.js.map +1 -0
  123. package/dist/activities/execute-deep-agent/v3-event-recorder.d.ts +6 -5
  124. package/dist/activities/execute-deep-agent/v3-event-recorder.js +6 -5
  125. package/dist/activities/execute-deep-agent/v3-event-recorder.js.map +1 -1
  126. package/dist/activities/execute-deep-agent/v3-events.d.ts +1 -1
  127. package/dist/activities/execute-deep-agent/v3-events.js +1 -1
  128. package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +60 -17
  129. package/dist/activities/execute-deep-agent/v3-status-builder.js +72 -57
  130. package/dist/activities/execute-deep-agent/v3-status-builder.js.map +1 -1
  131. package/dist/harness/approval-decisions.d.ts +61 -0
  132. package/dist/harness/approval-decisions.js +102 -0
  133. package/dist/harness/approval-decisions.js.map +1 -0
  134. package/dist/harness/capabilities.d.ts +16 -5
  135. package/dist/harness/capabilities.js +9 -0
  136. package/dist/harness/capabilities.js.map +1 -1
  137. package/dist/harness/capture.d.ts +144 -0
  138. package/dist/harness/capture.js +219 -0
  139. package/dist/harness/capture.js.map +1 -0
  140. package/dist/harness/persist-chokepoint.d.ts +19 -4
  141. package/dist/harness/persist-chokepoint.js +17 -4
  142. package/dist/harness/persist-chokepoint.js.map +1 -1
  143. package/dist/harness/run-turn.js +115 -29
  144. package/dist/harness/run-turn.js.map +1 -1
  145. package/dist/harness/terminal-table.d.ts +40 -11
  146. package/dist/harness/terminal-table.js +58 -19
  147. package/dist/harness/terminal-table.js.map +1 -1
  148. package/dist/harness/turn-context.d.ts +141 -76
  149. package/dist/harness/turn-context.js +194 -99
  150. package/dist/harness/turn-context.js.map +1 -1
  151. package/dist/harness/types.d.ts +65 -12
  152. package/dist/harness/types.js +8 -2
  153. package/dist/harness/types.js.map +1 -1
  154. package/dist/harness-adapters.d.ts +12 -8
  155. package/dist/harness-adapters.js +17 -9
  156. package/dist/harness-adapters.js.map +1 -1
  157. package/dist/middleware/approval-gate.d.ts +1 -1
  158. package/dist/middleware/approval-gate.js +1 -1
  159. package/dist/middleware/approval-gate.js.map +1 -1
  160. package/dist/middleware/cost-advisory.d.ts +39 -0
  161. package/dist/middleware/{cost-cap.js → cost-advisory.js} +37 -55
  162. package/dist/middleware/cost-advisory.js.map +1 -0
  163. package/dist/middleware/index.d.ts +23 -12
  164. package/dist/middleware/index.js +26 -18
  165. package/dist/middleware/index.js.map +1 -1
  166. package/dist/middleware/types.d.ts +3 -2
  167. package/dist/runner-manager.js +1 -5
  168. package/dist/runner-manager.js.map +1 -1
  169. package/dist/runner.js +1 -5
  170. package/dist/runner.js.map +1 -1
  171. package/dist/shared/attachment-resolver.d.ts +41 -18
  172. package/dist/shared/attachment-resolver.js +178 -46
  173. package/dist/shared/attachment-resolver.js.map +1 -1
  174. package/dist/shared/attachment-zip.d.ts +85 -0
  175. package/dist/shared/attachment-zip.js +185 -0
  176. package/dist/shared/attachment-zip.js.map +1 -0
  177. package/dist/shared/connect-backfill.js +5 -4
  178. package/dist/shared/connect-backfill.js.map +1 -1
  179. package/dist/shared/cost-guard.d.ts +3 -3
  180. package/dist/shared/cost-guard.js +3 -3
  181. package/dist/shared/execution-status-writer.d.ts +5 -5
  182. package/dist/shared/execution-status-writer.js +5 -5
  183. package/dist/shared/extract-structured-output.d.ts +8 -7
  184. package/dist/shared/extract-structured-output.js +8 -7
  185. package/dist/shared/extract-structured-output.js.map +1 -1
  186. package/dist/shared/filereview/cas-progress.d.ts +1 -18
  187. package/dist/shared/filereview/cas-progress.js +4 -0
  188. package/dist/shared/filereview/cas-progress.js.map +1 -1
  189. package/dist/shared/filereview/cas-touched.d.ts +56 -0
  190. package/dist/shared/filereview/cas-touched.js +63 -0
  191. package/dist/shared/filereview/cas-touched.js.map +1 -0
  192. package/dist/shared/filereview/index.d.ts +2 -1
  193. package/dist/shared/filereview/index.js +2 -1
  194. package/dist/shared/filereview/index.js.map +1 -1
  195. package/dist/shared/mcp-resolver.d.ts +4 -5
  196. package/dist/shared/mcp-resolver.js +4 -5
  197. package/dist/shared/mcp-resolver.js.map +1 -1
  198. package/dist/shared/persist-decision.d.ts +3 -4
  199. package/dist/shared/persist-decision.js +3 -4
  200. package/dist/shared/persist-decision.js.map +1 -1
  201. package/dist/shared/plan-mode-permissions.d.ts +2 -2
  202. package/dist/shared/plan-mode-permissions.js +2 -2
  203. package/dist/shared/plan-mode-prompt.d.ts +1 -1
  204. package/dist/shared/plan-mode-prompt.js +1 -1
  205. package/dist/shared/prompt-sections.d.ts +163 -0
  206. package/dist/shared/prompt-sections.js +164 -0
  207. package/dist/shared/prompt-sections.js.map +1 -0
  208. package/dist/shared/skill-resolver.d.ts +4 -2
  209. package/dist/shared/skill-resolver.js +4 -2
  210. package/dist/shared/skill-resolver.js.map +1 -1
  211. package/dist/shared/tool-rounds.d.ts +32 -0
  212. package/dist/shared/tool-rounds.js +43 -0
  213. package/dist/shared/tool-rounds.js.map +1 -1
  214. package/dist/shared/tool-row.d.ts +34 -0
  215. package/dist/shared/tool-row.js +52 -0
  216. package/dist/shared/tool-row.js.map +1 -1
  217. package/dist/shared/workspace/session-provision.d.ts +3 -3
  218. package/dist/shared/workspace/session-provision.js +3 -3
  219. package/dist/shared/workspace/stigmer-link.d.ts +3 -3
  220. package/dist/shared/workspace/stigmer-link.js +3 -3
  221. package/dist/shared/workspace/writeback-coordinator.d.ts +15 -22
  222. package/dist/shared/workspace/writeback-coordinator.js +16 -53
  223. package/dist/shared/workspace/writeback-coordinator.js.map +1 -1
  224. package/dist/tools/index.d.ts +1 -1
  225. package/dist/tools/index.js +1 -1
  226. package/package.json +4 -4
  227. package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +1 -0
  228. package/src/__test-utils__/execution-record-fixture.ts +18 -2
  229. package/src/__test-utils__/file-review-projection.ts +156 -0
  230. package/src/__test-utils__/git-workspace-fixture.ts +58 -0
  231. package/src/__test-utils__/harness-boot-order-child.ts +7 -2
  232. package/src/__test-utils__/harness-contract/contract.ts +33 -20
  233. package/src/__test-utils__/harness-contract/recording-sink.ts +11 -1
  234. package/src/__test-utils__/harness-contract/runtime-contract.ts +328 -10
  235. package/src/__test-utils__/harness-contract/scripted-adapter.ts +38 -6
  236. package/src/__test-utils__/harness-contract/types.ts +27 -3
  237. package/src/__test-utils__/hermetic-activity.ts +52 -14
  238. package/src/__test-utils__/model-registry-fixture.ts +32 -7
  239. package/src/__test-utils__/module-specifiers.ts +24 -0
  240. package/src/__test-utils__/turn-input-fixture.ts +2 -2
  241. package/src/__tests__/harness-boot-order.test.ts +9 -2
  242. package/src/activities/call-agent.ts +2 -2
  243. package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +47 -3
  244. package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +2 -48
  245. package/src/activities/execute-cursor/__tests__/approval-decisions-agree.test.ts +1 -1
  246. package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +6 -1
  247. package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +52 -27
  248. package/src/activities/execute-cursor/__tests__/cas-observations.test.ts +25 -0
  249. package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.everything.prompt.md +166 -0
  250. package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.plan-mode.prompt.md +186 -0
  251. package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.recovery.prompt.md +191 -0
  252. package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.reinvocation.prompt.md +13 -0
  253. package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.prefixed.prompt.md +32 -0
  254. package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.raw.prompt.md +1 -0
  255. package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +1 -2
  256. package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-error-at-create.status.json +4 -0
  257. package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +24 -4
  258. package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +6 -5
  259. package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +9 -0
  260. package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +11 -8
  261. package/src/activities/execute-cursor/__tests__/prompt-goldens.test.ts +229 -0
  262. package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +3 -3
  263. package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +2 -2
  264. package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +78 -234
  265. package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +1 -26
  266. package/src/activities/execute-cursor/adapter.ts +7 -5
  267. package/src/activities/execute-cursor/approval-policy.ts +5 -2
  268. package/src/activities/execute-cursor/approval-state.ts +16 -8
  269. package/src/activities/execute-cursor/cas-observations.ts +20 -2
  270. package/src/activities/execute-cursor/cursor-capabilities.ts +24 -5
  271. package/src/activities/execute-cursor/message-translator.ts +29 -41
  272. package/src/activities/execute-cursor/prompt-builder.ts +99 -157
  273. package/src/activities/execute-cursor/turn-boundary.ts +34 -140
  274. package/src/activities/execute-cursor/turn-settle.ts +37 -51
  275. package/src/activities/execute-cursor/turn-setup.ts +30 -70
  276. package/src/activities/execute-cursor/turn-stream.ts +8 -31
  277. package/src/activities/execute-cursor/turn.ts +5 -1
  278. package/src/activities/execute-deep-agent/__test-utils__/contract-subject.ts +391 -0
  279. package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +313 -0
  280. package/src/activities/execute-deep-agent/__test-utils__/hitl-script.ts +48 -0
  281. package/src/activities/execute-deep-agent/__test-utils__/scripted-model-module.ts +85 -0
  282. package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +383 -36
  283. package/src/activities/execute-deep-agent/__tests__/adapter-graph-is-sdk-free.test.ts +76 -0
  284. package/src/activities/execute-deep-agent/__tests__/adapter-is-temporal-free.test.ts +47 -0
  285. package/src/activities/execute-deep-agent/__tests__/adapter.test.ts +80 -0
  286. package/src/activities/execute-deep-agent/__tests__/cas-capture-backend.test.ts +1 -1
  287. package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +0 -2
  288. package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +0 -3
  289. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.build-from-plan.prompt.md +172 -0
  290. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.everything.prompt.md +167 -0
  291. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.minimal.prompt.md +36 -0
  292. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.plan-mode.prompt.md +178 -0
  293. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.skills-below-threshold.prompt.md +158 -0
  294. package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +210 -0
  295. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn1.status.json +74 -0
  296. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn2.status.json +104 -0
  297. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve.turn2.status.json +78 -0
  298. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +138 -0
  299. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/gate.turn1.status.json +68 -0
  300. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +154 -0
  301. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +116 -0
  302. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.after-tool.status.json +69 -0
  303. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.mid-tool.status.json +67 -0
  304. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/plain-turn.status.json +47 -0
  305. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/platform-stop.status.json +68 -0
  306. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +280 -0
  307. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/reject.turn2.status.json +77 -0
  308. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/resolution-error.status.json +18 -0
  309. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn2.status.json +99 -0
  310. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn3.status.json +109 -0
  311. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/skip.turn2.status.json +76 -0
  312. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.text-fallback.status.json +51 -0
  313. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tier2.status.json +51 -0
  314. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tool-strategy.status.json +56 -0
  315. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sub-agent-delegation.status.json +90 -0
  316. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/tool-call.status.json +70 -0
  317. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/worker-shutdown.status.json +71 -0
  318. package/src/activities/execute-deep-agent/__tests__/hermetic/harness-contract.test.ts +144 -0
  319. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-approve-all-lease.test.ts +184 -0
  320. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-round-trips.test.ts +203 -0
  321. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-sequential-gates.test.ts +170 -0
  322. package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +175 -0
  323. package/src/activities/execute-deep-agent/__tests__/hermetic/pause-vs-shutdown.test.ts +206 -0
  324. package/src/activities/execute-deep-agent/__tests__/hermetic/plain-turn.test.ts +142 -0
  325. package/src/activities/execute-deep-agent/__tests__/hermetic/platform-stop.test.ts +126 -0
  326. package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +139 -0
  327. package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +122 -0
  328. package/src/activities/execute-deep-agent/__tests__/hermetic/structured-output.test.ts +236 -0
  329. package/src/activities/execute-deep-agent/__tests__/hermetic/sub-agent-delegation.test.ts +161 -0
  330. package/src/activities/execute-deep-agent/__tests__/hermetic/tool-call.test.ts +157 -0
  331. package/src/activities/execute-deep-agent/__tests__/hermetic/workspace-lock-timeout.test.ts +152 -0
  332. package/src/activities/execute-deep-agent/__tests__/hitl.test.ts +50 -122
  333. package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +8 -6
  334. package/src/activities/execute-deep-agent/__tests__/plan-mode-path-normalization.test.ts +2 -2
  335. package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +35 -35
  336. package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +247 -0
  337. package/src/activities/execute-deep-agent/__tests__/scripted-model.test.ts +329 -0
  338. package/src/activities/execute-deep-agent/__tests__/status-builder-shared.test.ts +1 -20
  339. package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +78 -0
  340. package/src/activities/execute-deep-agent/__tests__/subagent-gitignored-capture.test.ts +1 -1
  341. package/src/activities/execute-deep-agent/__tests__/subagent-plan-mode-permissions.test.ts +2 -2
  342. package/src/activities/execute-deep-agent/__tests__/subagent-tracker.test.ts +57 -31
  343. package/src/activities/execute-deep-agent/__tests__/subagent-transformer.test.ts +19 -79
  344. package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +15 -15
  345. package/src/activities/execute-deep-agent/__tests__/summarization-verification.test.ts +1 -1
  346. package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +391 -0
  347. package/src/activities/execute-deep-agent/__tests__/v3-status-builder.test.ts +343 -38
  348. package/src/activities/execute-deep-agent/__tests__/vision-input.test.ts +5 -5
  349. package/src/activities/execute-deep-agent/adapter.ts +94 -0
  350. package/src/activities/execute-deep-agent/cas-capture-observer.ts +11 -0
  351. package/src/activities/execute-deep-agent/deep-agent-capabilities.ts +43 -0
  352. package/src/activities/execute-deep-agent/execution-state.ts +4 -13
  353. package/src/activities/execute-deep-agent/hitl.ts +100 -123
  354. package/src/activities/execute-deep-agent/prompt-builder.ts +141 -115
  355. package/src/activities/execute-deep-agent/status-builder-shared.ts +21 -84
  356. package/src/activities/execute-deep-agent/streaming-side-effects.ts +13 -19
  357. package/src/activities/execute-deep-agent/subagent-tracker.ts +77 -42
  358. package/src/activities/execute-deep-agent/subagent-transformer.ts +46 -105
  359. package/src/activities/execute-deep-agent/subagent-wiring.ts +5 -4
  360. package/src/activities/execute-deep-agent/turn-settle.ts +164 -0
  361. package/src/activities/execute-deep-agent/turn-setup.ts +541 -0
  362. package/src/activities/execute-deep-agent/turn-stream.ts +313 -0
  363. package/src/activities/execute-deep-agent/turn.ts +131 -0
  364. package/src/activities/execute-deep-agent/v3-event-recorder.ts +6 -5
  365. package/src/activities/execute-deep-agent/v3-events.ts +1 -1
  366. package/src/activities/execute-deep-agent/v3-status-builder.ts +84 -63
  367. package/src/harness/__tests__/approval-decisions.test.ts +116 -0
  368. package/src/harness/__tests__/capture.test.ts +268 -0
  369. package/src/harness/__tests__/mount-skills.test.ts +169 -0
  370. package/src/harness/__tests__/persist-chokepoint.test.ts +38 -2
  371. package/src/harness/__tests__/run-turn-deterministic.test.ts +94 -0
  372. package/src/harness/__tests__/run-turn.test.ts +39 -23
  373. package/src/harness/__tests__/turn-attachments-vision.test.ts +80 -0
  374. package/src/harness/__tests__/turn-context.test.ts +73 -26
  375. package/src/harness/approval-decisions.ts +104 -0
  376. package/src/harness/capabilities.ts +16 -5
  377. package/src/harness/capture.ts +301 -0
  378. package/src/harness/persist-chokepoint.ts +24 -4
  379. package/src/harness/run-turn.ts +120 -29
  380. package/src/harness/terminal-table.ts +61 -20
  381. package/src/harness/turn-context.ts +208 -111
  382. package/src/harness/types.ts +66 -12
  383. package/src/harness-adapters.ts +17 -9
  384. package/src/middleware/__tests__/approval-gate.test.ts +1 -1
  385. package/src/middleware/__tests__/cost-advisory.test.ts +113 -0
  386. package/src/middleware/approval-gate.ts +2 -2
  387. package/src/middleware/{cost-cap.ts → cost-advisory.ts} +40 -70
  388. package/src/middleware/index.ts +29 -29
  389. package/src/middleware/types.ts +3 -2
  390. package/src/runner-manager.ts +0 -8
  391. package/src/runner.ts +0 -8
  392. package/src/shared/__tests__/attachment-naming.test.ts +6 -19
  393. package/src/shared/__tests__/attachment-resolver.test.ts +158 -8
  394. package/src/shared/__tests__/attachment-zip.test.ts +236 -0
  395. package/src/shared/__tests__/bedrock-adapter.test.ts +1 -1
  396. package/src/shared/__tests__/blueprint-resolver.test.ts +43 -0
  397. package/src/shared/__tests__/cost-guard.test.ts +3 -3
  398. package/src/shared/__tests__/prompt-sections.test.ts +167 -0
  399. package/src/shared/__tests__/secret-leak-scan.test.ts +2 -2
  400. package/src/{activities/execute-deep-agent → shared}/__tests__/stamp-flowed-rows.test.ts +33 -10
  401. package/src/shared/__tests__/vertex-adapter.test.ts +1 -1
  402. package/src/shared/attachment-resolver.ts +218 -55
  403. package/src/shared/attachment-zip.ts +281 -0
  404. package/src/shared/connect-backfill.ts +9 -11
  405. package/src/shared/cost-guard.ts +3 -3
  406. package/src/shared/execution-status-writer.ts +5 -5
  407. package/src/shared/extract-structured-output.ts +8 -7
  408. package/src/shared/filereview/__tests__/capture.test.ts +86 -4
  409. package/src/shared/filereview/__tests__/cas-progress.test.ts +2 -1
  410. package/src/shared/filereview/cas-progress.ts +5 -19
  411. package/src/shared/filereview/cas-touched.ts +89 -0
  412. package/src/shared/filereview/index.ts +4 -2
  413. package/src/shared/mcp-resolver.ts +4 -5
  414. package/src/shared/persist-decision.ts +3 -4
  415. package/src/shared/plan-mode-permissions.ts +2 -2
  416. package/src/shared/plan-mode-prompt.ts +1 -1
  417. package/src/shared/prompt-sections.ts +256 -0
  418. package/src/shared/skill-resolver.ts +4 -2
  419. package/src/shared/tool-rounds.ts +48 -0
  420. package/src/shared/tool-row.ts +61 -0
  421. package/src/shared/workspace/__tests__/stigmer-link.test.ts +7 -22
  422. package/src/shared/workspace/__tests__/writeback-coordinator.test.ts +20 -61
  423. package/src/shared/workspace/session-provision.ts +3 -3
  424. package/src/shared/workspace/stigmer-link.ts +3 -3
  425. package/src/shared/workspace/writeback-coordinator.ts +16 -64
  426. package/src/tools/index.ts +1 -1
  427. package/dist/activities/execute-cursor/capture-flow.d.ts +0 -142
  428. package/dist/activities/execute-cursor/capture-flow.js +0 -285
  429. package/dist/activities/execute-cursor/capture-flow.js.map +0 -1
  430. package/dist/activities/execute-cursor/command-provenance.d.ts +0 -48
  431. package/dist/activities/execute-cursor/command-provenance.js +0 -38
  432. package/dist/activities/execute-cursor/command-provenance.js.map +0 -1
  433. package/dist/activities/execute-deep-agent/attachment-injector.d.ts +0 -134
  434. package/dist/activities/execute-deep-agent/attachment-injector.js +0 -386
  435. package/dist/activities/execute-deep-agent/attachment-injector.js.map +0 -1
  436. package/dist/activities/execute-deep-agent/command-provenance.d.ts +0 -61
  437. package/dist/activities/execute-deep-agent/command-provenance.js +0 -72
  438. package/dist/activities/execute-deep-agent/command-provenance.js.map +0 -1
  439. package/dist/activities/execute-deep-agent/environment.d.ts +0 -24
  440. package/dist/activities/execute-deep-agent/environment.js +0 -58
  441. package/dist/activities/execute-deep-agent/environment.js.map +0 -1
  442. package/dist/activities/execute-deep-agent/event-recorder.d.ts +0 -21
  443. package/dist/activities/execute-deep-agent/event-recorder.js +0 -67
  444. package/dist/activities/execute-deep-agent/event-recorder.js.map +0 -1
  445. package/dist/activities/execute-deep-agent/index.d.ts +0 -15
  446. package/dist/activities/execute-deep-agent/index.js +0 -918
  447. package/dist/activities/execute-deep-agent/index.js.map +0 -1
  448. package/dist/activities/execute-deep-agent/mcp-gate.d.ts +0 -28
  449. package/dist/activities/execute-deep-agent/mcp-gate.js +0 -22
  450. package/dist/activities/execute-deep-agent/mcp-gate.js.map +0 -1
  451. package/dist/activities/execute-deep-agent/post-stream.d.ts +0 -23
  452. package/dist/activities/execute-deep-agent/post-stream.js +0 -71
  453. package/dist/activities/execute-deep-agent/post-stream.js.map +0 -1
  454. package/dist/activities/execute-deep-agent/setup.d.ts +0 -136
  455. package/dist/activities/execute-deep-agent/setup.js +0 -767
  456. package/dist/activities/execute-deep-agent/setup.js.map +0 -1
  457. package/dist/activities/execute-deep-agent/stamp-flowed-rows.d.ts +0 -36
  458. package/dist/activities/execute-deep-agent/stamp-flowed-rows.js +0 -56
  459. package/dist/activities/execute-deep-agent/stamp-flowed-rows.js.map +0 -1
  460. package/dist/activities/execute-deep-agent/status-builder.d.ts +0 -93
  461. package/dist/activities/execute-deep-agent/status-builder.js +0 -365
  462. package/dist/activities/execute-deep-agent/status-builder.js.map +0 -1
  463. package/dist/activities/execute-deep-agent/streaming-terminal.d.ts +0 -21
  464. package/dist/activities/execute-deep-agent/streaming-terminal.js +0 -80
  465. package/dist/activities/execute-deep-agent/streaming-terminal.js.map +0 -1
  466. package/dist/activities/execute-deep-agent/streaming-v3.d.ts +0 -13
  467. package/dist/activities/execute-deep-agent/streaming-v3.js +0 -174
  468. package/dist/activities/execute-deep-agent/streaming-v3.js.map +0 -1
  469. package/dist/activities/execute-deep-agent/streaming.d.ts +0 -81
  470. package/dist/activities/execute-deep-agent/streaming.js +0 -160
  471. package/dist/activities/execute-deep-agent/streaming.js.map +0 -1
  472. package/dist/middleware/cost-cap.d.ts +0 -22
  473. package/dist/middleware/cost-cap.js.map +0 -1
  474. package/dist/middleware/graceful-stop.d.ts +0 -17
  475. package/dist/middleware/graceful-stop.js +0 -63
  476. package/dist/middleware/graceful-stop.js.map +0 -1
  477. package/dist/shared/skill-writer.d.ts +0 -75
  478. package/dist/shared/skill-writer.js +0 -207
  479. package/dist/shared/skill-writer.js.map +0 -1
  480. package/src/activities/execute-cursor/__tests__/capture-flow.test.ts +0 -1032
  481. package/src/activities/execute-cursor/__tests__/command-provenance.test.ts +0 -240
  482. package/src/activities/execute-cursor/__tests__/progress-substrate.test.ts +0 -169
  483. package/src/activities/execute-cursor/capture-flow.ts +0 -379
  484. package/src/activities/execute-cursor/command-provenance.ts +0 -73
  485. package/src/activities/execute-deep-agent/__tests__/attachment-injector.test.ts +0 -1161
  486. package/src/activities/execute-deep-agent/__tests__/command-provenance.test.ts +0 -252
  487. package/src/activities/execute-deep-agent/__tests__/environment.test.ts +0 -108
  488. package/src/activities/execute-deep-agent/__tests__/event-recorder.test.ts +0 -150
  489. package/src/activities/execute-deep-agent/__tests__/hitl-integration.test.ts +0 -226
  490. package/src/activities/execute-deep-agent/__tests__/hitl-reject.test.ts +0 -318
  491. package/src/activities/execute-deep-agent/__tests__/hitl-resume-approve-all.test.ts +0 -351
  492. package/src/activities/execute-deep-agent/__tests__/hitl-resume-history.test.ts +0 -293
  493. package/src/activities/execute-deep-agent/__tests__/index.test.ts +0 -99
  494. package/src/activities/execute-deep-agent/__tests__/mcp-gate.test.ts +0 -44
  495. package/src/activities/execute-deep-agent/__tests__/post-stream.test.ts +0 -112
  496. package/src/activities/execute-deep-agent/__tests__/sequential-gate-resume.test.ts +0 -358
  497. package/src/activities/execute-deep-agent/__tests__/status-builder.test.ts +0 -1933
  498. package/src/activities/execute-deep-agent/__tests__/streaming-terminal.test.ts +0 -40
  499. package/src/activities/execute-deep-agent/__tests__/streaming-v3.test.ts +0 -597
  500. package/src/activities/execute-deep-agent/__tests__/streaming.test.ts +0 -508
  501. package/src/activities/execute-deep-agent/attachment-injector.ts +0 -627
  502. package/src/activities/execute-deep-agent/command-provenance.ts +0 -102
  503. package/src/activities/execute-deep-agent/environment.ts +0 -76
  504. package/src/activities/execute-deep-agent/event-recorder.ts +0 -95
  505. package/src/activities/execute-deep-agent/index.ts +0 -1072
  506. package/src/activities/execute-deep-agent/mcp-gate.ts +0 -37
  507. package/src/activities/execute-deep-agent/post-stream.ts +0 -109
  508. package/src/activities/execute-deep-agent/setup.ts +0 -1081
  509. package/src/activities/execute-deep-agent/stamp-flowed-rows.ts +0 -64
  510. package/src/activities/execute-deep-agent/status-builder.ts +0 -481
  511. package/src/activities/execute-deep-agent/streaming-terminal.ts +0 -106
  512. package/src/activities/execute-deep-agent/streaming-v3.ts +0 -277
  513. package/src/activities/execute-deep-agent/streaming.ts +0 -313
  514. package/src/middleware/__tests__/cost-cap.test.ts +0 -192
  515. package/src/middleware/__tests__/graceful-stop.test.ts +0 -105
  516. package/src/middleware/graceful-stop.ts +0 -86
  517. package/src/shared/__tests__/skill-writer.test.ts +0 -372
  518. package/src/shared/skill-writer.ts +0 -266
@@ -1,64 +0,0 @@
1
- /**
2
- * Deep-agent turn-boundary stamping of flowed file-edit rows — the deep-agent
3
- * analog of the Cursor adapter's `stampFlowedFileEditRows` (in `capture-flow.ts`),
4
- * minus deny-token coordination (this harness has no deny gate; every
5
- * write/delete flowed). Extracted from the activity entry point so it is
6
- * directly unit-testable, mirroring how `approval-file-change.ts` isolates the
7
- * capture helpers.
8
- *
9
- * Rows stay visible in place as observational records; `file_change_sets`
10
- * remains the single decision surface (DD-24).
11
- */
12
-
13
- import type { AgentMessage } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
14
- import type { SubAgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/subagent_pb";
15
- import { toolApprovalCategory } from "../../shared/tool-kind.js";
16
- import { isToolCallRowHidden, stampFileEditRow } from "../../shared/tool-row.js";
17
-
18
- /**
19
- * Stamp every flowed file-edit row (category write/delete) with this turn's
20
- * change set id. Skips already-stamped rows (a resume seeds prior turns' rows
21
- * into this transcript — re-stamping would mis-attribute them) and legacy hidden
22
- * rows from pre-stamping sessions (they belong to an earlier turn's set).
23
- *
24
- * `skipToolCallIds` scopes the pass to rows CREATED this turn: a tool-call id
25
- * present before this turn's stream is skipped. Top-level callers omit it (a
26
- * top-level flowed row is this-turn's by the already-stamped/hidden shields);
27
- * sub-agent callers pass a pre-turn snapshot, since sub-agent rows have neither
28
- * shield (see `collectSubAgentToolCallIds` in `shared/tool-row.ts`).
29
- */
30
- export function stampFlowedFileEditRows(
31
- messages: readonly AgentMessage[],
32
- changeSetId: string,
33
- skipToolCallIds?: ReadonlySet<string>,
34
- ): void {
35
- for (const msg of messages) {
36
- for (const tc of msg.toolCalls) {
37
- if (tc.fileChangeSetId) continue;
38
- if (skipToolCallIds?.has(tc.id)) continue;
39
- if (isToolCallRowHidden(tc)) continue;
40
- const category = toolApprovalCategory(tc.name);
41
- if (category !== "write" && category !== "delete") continue;
42
- stampFileEditRow(tc, changeSetId);
43
- }
44
- }
45
- }
46
-
47
- /**
48
- * Stamp the current turn's sub-agent flowed file-edit rows with the parent
49
- * turn's change set id. Sub-agent writes fold their files into the SAME parent
50
- * turn set (shared git diff + one shared CasCaptureObserver, DD-19), so they
51
- * carry the parent change set id and badge against the same set the parent's
52
- * rows do. They live under `subAgentExecutions` (not the top-level transcript),
53
- * so they are walked separately and scoped to this turn via `priorToolCallIds`
54
- * (the sub-agent tool-call ids that existed before this turn's stream).
55
- */
56
- export function stampFlowedSubAgentFileEditRows(
57
- subAgents: readonly SubAgentExecution[],
58
- changeSetId: string,
59
- priorToolCallIds: ReadonlySet<string>,
60
- ): void {
61
- for (const sa of subAgents) {
62
- stampFlowedFileEditRows(sa.messages, changeSetId, priorToolCallIds);
63
- }
64
- }
@@ -1,481 +0,0 @@
1
- /**
2
- * LangGraph event-to-proto mapper for ExecuteDeepAgent streaming.
3
- *
4
- * Processes streamEvents v2 events and progressively builds the
5
- * AgentExecutionStatus proto. Each handler method is a focused unit
6
- * testable in isolation.
7
- *
8
- * Phase 3b-i scope: main-agent events only (no sub-agent routing,
9
- * no HITL approval, no tool input streaming). Those are added in
10
- * Phases 3b-ii and 3c.
11
- */
12
-
13
- import { create, type JsonObject } from "@bufbuild/protobuf";
14
- import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
15
- import {
16
- AgentMessageSchema,
17
- ToolCallSchema,
18
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
19
- import type { AgentMessage, ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
20
- import type { ExecutionArtifact } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/artifact_pb";
21
- import type { WorkspaceWriteBack } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
22
- import {
23
- ApprovalAction,
24
- ExecutionPhase,
25
- MessageType,
26
- ToolCallStatus,
27
- ToolKind,
28
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
29
- import { resolveApprovalMessage as resolveApprovalMsg } from "../../shared/approval-policy.js";
30
- import { classifyTool } from "../../shared/tool-kind.js";
31
- import { applyTodoUpdate } from "../../shared/todos.js";
32
- import { ExecutionState } from "./execution-state.js";
33
- import { utcTimestamp } from "../../shared/status.js";
34
- import type { ExecutionStatusWriter } from "../../shared/execution-status-writer.js";
35
- import {
36
- UsageAccumulator,
37
- extractToolResult,
38
- sanitizeArgsPreview,
39
- stampApprovalProvenance,
40
- type ApprovalProvenanceInputs,
41
- } from "./status-builder-shared.js";
42
-
43
- /** Minimal LangGraph streamEvents v2 event shape. */
44
- export interface StreamEvent {
45
- readonly event: string;
46
- readonly name?: string;
47
- readonly run_id: string;
48
- readonly data: Record<string, unknown>;
49
- readonly metadata?: Record<string, unknown>;
50
- readonly parent_ids?: readonly string[];
51
- }
52
-
53
- type EventHandler = (event: StreamEvent, namespace: string) => void;
54
-
55
- /**
56
- * The approval inputs the StatusBuilder reads to set requires-approval and to
57
- * attribute each tool call's authorization provenance.
58
- *
59
- * Extends {@link ApprovalProvenanceInputs} so the provenance stamper and the
60
- * builder share one shape. `globalBypass` is the pre-armed spec.auto_approve_all
61
- * (the one whole-run global bypass); `leasedCategories` lets a leased built-in be
62
- * attributed to its run-lifetime lease rather than the plain category gate.
63
- */
64
- export interface ApprovalPolicyProvider extends ApprovalProvenanceInputs {}
65
-
66
- export class StatusBuilder {
67
- readonly executionId: string;
68
- private readonly state: ExecutionState;
69
- private _forceNextUpdate = false;
70
- private approvalProvider: ApprovalPolicyProvider | null = null;
71
-
72
- private readonly usageAccumulator: UsageAccumulator;
73
- private readonly handlers: ReadonlyMap<string, EventHandler>;
74
-
75
- constructor(executionId: string, initialStatus: AgentExecutionStatus) {
76
- this.executionId = executionId;
77
- this.state = new ExecutionState(initialStatus);
78
-
79
- // Resume path: when constructed from a persisted transcript (status seeded
80
- // in index.ts on a durable-checkpoint resume), rebuild the tool-call index
81
- // so resumed tool events reconcile to the existing calls instead of
82
- // duplicating them. A first run carries no messages, so this is a no-op.
83
- if (initialStatus.messages.length > 0) {
84
- this.state.rebuildToolCallIndex();
85
- }
86
-
87
- initialStatus.phase = ExecutionPhase.EXECUTION_IN_PROGRESS;
88
- if (!initialStatus.startedAt) {
89
- initialStatus.startedAt = utcTimestamp();
90
- }
91
-
92
- this.usageAccumulator = new UsageAccumulator();
93
-
94
- this.handlers = new Map<string, EventHandler>([
95
- ["on_chat_model_stream", this.handleChatModelStream.bind(this)],
96
- ["on_chat_model_end", this.handleChatModelEnd.bind(this)],
97
- ["on_tool_start", this.handleToolStart.bind(this)],
98
- ["on_tool_end", this.handleToolEnd.bind(this)],
99
- ]);
100
- }
101
-
102
- setApprovalProvider(provider: ApprovalPolicyProvider): void {
103
- this.approvalProvider = provider;
104
- }
105
-
106
- get currentStatus(): AgentExecutionStatus {
107
- return this.state.proto;
108
- }
109
-
110
- get forceNextUpdate(): boolean {
111
- return this._forceNextUpdate;
112
- }
113
-
114
- clearForceFlag(): void {
115
- this._forceNextUpdate = false;
116
- }
117
-
118
- /**
119
- * Process a single streamEvents v2 event.
120
- * Unknown event types are silently ignored.
121
- */
122
- processEvent(event: StreamEvent): void {
123
- const namespace = this.extractNamespace(event);
124
- const handler = this.handlers.get(event.event);
125
- if (!handler) return;
126
-
127
- try {
128
- handler(event, namespace);
129
- } catch (err) {
130
- console.error(
131
- `[StatusBuilder] Event handler error: execution=${this.executionId} ` +
132
- `event=${event.event} run_id=${event.run_id}: ${err}`,
133
- );
134
- }
135
- }
136
-
137
- // ── Artifact & WriteBack ───────────────────────────────────────────
138
-
139
- /**
140
- * Add or update an execution artifact. Deduplicates by `sandboxPath`:
141
- * if an artifact with the same path already exists, it is replaced only
142
- * when the `contentHash` has changed (re-upload of modified file).
143
- */
144
- addArtifact(artifact: ExecutionArtifact): void {
145
- const artifacts = this.state.proto.artifacts;
146
- const idx = artifacts.findIndex(a => a.sandboxPath === artifact.sandboxPath);
147
-
148
- if (idx >= 0) {
149
- if (artifacts[idx].contentHash !== artifact.contentHash) {
150
- artifacts[idx] = artifact;
151
- this._forceNextUpdate = true;
152
- }
153
- return;
154
- }
155
-
156
- artifacts.push(artifact);
157
- this._forceNextUpdate = true;
158
- }
159
-
160
- /**
161
- * Add or update a workspace write-back entry. Upserts by
162
- * `workspaceEntryName` — each git-backed workspace entry produces
163
- * at most one write-back record that progresses through phases.
164
- */
165
- addWriteBack(wb: WorkspaceWriteBack): void {
166
- const backs = this.state.proto.workspaceWriteBacks;
167
- const idx = backs.findIndex(b => b.workspaceEntryName === wb.workspaceEntryName);
168
-
169
- if (idx >= 0) {
170
- backs[idx] = wb;
171
- } else {
172
- backs.push(wb);
173
- }
174
- this._forceNextUpdate = true;
175
- }
176
-
177
- // ── Event Handlers ─────────────────────────────────────────────────
178
-
179
- private handleChatModelStream(event: StreamEvent, namespace: string): void {
180
- const chunk = event.data?.chunk as Record<string, unknown> | undefined;
181
- if (!chunk) return;
182
-
183
- const content = chunk.content;
184
-
185
- if (Array.isArray(content)) {
186
- for (const block of content) {
187
- if (typeof block === "object" && block !== null) {
188
- const b = block as Record<string, unknown>;
189
- if (b.type === "thinking" && typeof b.thinking === "string") {
190
- this.appendThinkingContent(event.run_id, namespace, b.thinking);
191
- } else if (b.type === "text" && typeof b.text === "string") {
192
- this.appendTextContent(event.run_id, namespace, b.text);
193
- }
194
- }
195
- }
196
- } else if (typeof content === "string" && content.length > 0) {
197
- this.appendTextContent(event.run_id, namespace, content);
198
- }
199
- }
200
-
201
- private handleChatModelEnd(event: StreamEvent, namespace: string): void {
202
- const output = event.data?.output as Record<string, unknown> | undefined;
203
-
204
- const msg = this.state.messagesByRun.get(event.run_id);
205
- if (msg) {
206
- msg.isStreaming = false;
207
- }
208
-
209
- const usageMeta = (output?.usage_metadata ?? event.data?.usage_metadata) as
210
- Record<string, unknown> | undefined;
211
- if (usageMeta) {
212
- this.usageAccumulator.accumulate(usageMeta);
213
- this.syncUsageToProto();
214
- }
215
- }
216
-
217
- private handleToolStart(event: StreamEvent, namespace: string): void {
218
- const toolName = event.name ?? "unknown_tool";
219
-
220
- // Resume reconciliation (v2): the seeded WAITING_APPROVAL tool call was
221
- // indexed by its tool_call_id, but a resumed on_tool_start carries a fresh
222
- // LangGraph run_id and exposes no tool_call_id. Match by tool name +
223
- // pending-approval status so the existing call is resolved in place rather
224
- // than duplicated, then re-key it under run_id so handleToolEnd resolves the
225
- // same object. This name match is a v2-only fallback — v3 (the default) keys
226
- // by the exact tool_call_id; it resolves the first pending call of that
227
- // name, which is unambiguous for the single-gate resume the workflow drives.
228
- const seeded = this.findResumableSeededToolCall(toolName);
229
- if (seeded) {
230
- seeded.status = ToolCallStatus.TOOL_CALL_RUNNING;
231
- this.state.toolCalls.set(event.run_id, seeded);
232
- this.state.toolStartTimes.set(event.run_id, performance.now());
233
- this._forceNextUpdate = true;
234
- return;
235
- }
236
-
237
- const parentMsg = this.state.currentAiMessage.get(namespace)
238
- ?? this.ensureAiMessageForToolCall(event.run_id, namespace);
239
- if (!parentMsg) return;
240
-
241
- const rawArgs = event.data?.input as Record<string, unknown> | undefined;
242
- const args = rawArgs ?? {};
243
-
244
- const approvalReq = this.checkApprovalRequirement(toolName, args);
245
-
246
- const tc = create(ToolCallSchema, {
247
- id: event.run_id,
248
- name: toolName,
249
- status: approvalReq.requiresApproval
250
- ? ToolCallStatus.TOOL_CALL_WAITING_APPROVAL
251
- : ToolCallStatus.TOOL_CALL_RUNNING,
252
- startedAt: utcTimestamp(),
253
- });
254
-
255
- if (rawArgs) {
256
- tc.args = rawArgs as JsonObject;
257
- }
258
-
259
- if (approvalReq.serverSlug) {
260
- tc.mcpServerSlug = approvalReq.serverSlug;
261
- }
262
-
263
- // Classify after mcpServerSlug is set so MCP tools resolve correctly.
264
- tc.toolKind = classifyTool(tc.name, tc.mcpServerSlug);
265
-
266
- // Stamp authorization provenance in the same spot as tool_kind, for every
267
- // observed tool call (gated or auto-approved). A gated call is re-seeded on
268
- // reinvocation (index.ts) with the same source carried through the interrupt.
269
- stampApprovalProvenance(tc, this.approvalProvider);
270
-
271
- if (approvalReq.requiresApproval) {
272
- tc.requiresApproval = true;
273
- tc.approvalMessage = approvalReq.message;
274
- tc.approvalRequestedAt = utcTimestamp();
275
-
276
- const argsPreview = sanitizeArgsPreview(args);
277
- if (argsPreview) {
278
- tc.argsPreview = argsPreview;
279
- }
280
-
281
- this.state.proto.phase = ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL;
282
- }
283
-
284
- parentMsg.toolCalls.push(tc);
285
- this.state.toolCalls.set(event.run_id, tc);
286
- this.state.toolStartTimes.set(event.run_id, performance.now());
287
-
288
- this._forceNextUpdate = true;
289
- }
290
-
291
- /**
292
- * Find a seeded tool call awaiting approval for the given name, for v2 resume
293
- * reconciliation. Returns the first WAITING_APPROVAL call of that name in the
294
- * rebuilt index, or undefined when none is pending (the normal first-run path).
295
- */
296
- private findResumableSeededToolCall(toolName: string): ToolCall | undefined {
297
- for (const tc of this.state.toolCalls.values()) {
298
- if (
299
- tc.name === toolName &&
300
- tc.status === ToolCallStatus.TOOL_CALL_WAITING_APPROVAL
301
- ) {
302
- return tc;
303
- }
304
- }
305
- return undefined;
306
- }
307
-
308
- private checkApprovalRequirement(
309
- toolName: string,
310
- args: Record<string, unknown>,
311
- ): { requiresApproval: boolean; message: string; serverSlug: string } {
312
- if (!this.approvalProvider) {
313
- return { requiresApproval: false, message: "", serverSlug: "" };
314
- }
315
-
316
- const serverSlug = this.approvalProvider.toolServerMap.get(toolName) ?? "";
317
-
318
- if (this.approvalProvider.globalBypass) {
319
- return { requiresApproval: false, message: "", serverSlug };
320
- }
321
-
322
- // Unattended mode: the gate auto-skips instead of interrupting, so no row
323
- // is ever WAITING_APPROVAL and the phase never flips — the streamed row
324
- // runs to its skip result and reconcileUnattendedSkips terminalizes it.
325
- if (this.approvalProvider.unattended) {
326
- return { requiresApproval: false, message: "", serverSlug };
327
- }
328
-
329
- if (serverSlug) {
330
- const key = `${serverSlug}/${toolName}`;
331
- const policy = this.approvalProvider.policies.get(key);
332
- if (policy?.requiresApproval) {
333
- return {
334
- requiresApproval: true,
335
- message: resolveApprovalMsg(policy.approvalMessage, toolName, args),
336
- serverSlug,
337
- };
338
- }
339
- return { requiresApproval: false, message: "", serverSlug };
340
- }
341
-
342
- return { requiresApproval: false, message: "", serverSlug: "" };
343
- }
344
-
345
- private handleToolEnd(event: StreamEvent, _namespace: string): void {
346
- const tc = this.state.toolCalls.get(event.run_id);
347
- if (!tc) return;
348
-
349
- const output = event.data?.output as Record<string, unknown> | undefined;
350
- const errorMsg = output?.error as string | undefined;
351
-
352
- if (errorMsg) {
353
- tc.status = ToolCallStatus.TOOL_CALL_FAILED;
354
- tc.error = errorMsg;
355
- } else {
356
- // Faithful result only; payload size is bounded at the persist chokepoint
357
- // (see v3 builder note). Truncating here would corrupt image base64.
358
- tc.status = ToolCallStatus.TOOL_CALL_COMPLETED;
359
- tc.result = extractToolResult(event.data);
360
-
361
- // Project a completed to-do write into status.todos — success branch only,
362
- // since a failed write_todos never ran its state-mutating Command. Shares
363
- // the mapper and rationale documented in V3StatusBuilder.handleToolFinished.
364
- if (tc.toolKind === ToolKind.TODO) {
365
- applyTodoUpdate(this.state.proto.todos, tc.args?.todos, { merge: false });
366
- }
367
- }
368
-
369
- tc.completedAt = utcTimestamp();
370
- tc.isStreaming = false;
371
- this.state.toolStartTimes.delete(event.run_id);
372
-
373
- this._forceNextUpdate = true;
374
- }
375
-
376
- // ── Content Helpers ────────────────────────────────────────────────
377
-
378
- private appendTextContent(runId: string, namespace: string, text: string): void {
379
- const msg = this.ensureAiMessage(runId, namespace, MessageType.MESSAGE_AI);
380
- msg.content += text;
381
- msg.isStreaming = true;
382
- }
383
-
384
- private appendThinkingContent(runId: string, namespace: string, text: string): void {
385
- const thinkingKey = `thinking:${namespace}`;
386
- const existingMsg = this.state.messagesByRun.get(thinkingKey);
387
- if (existingMsg && existingMsg.type === MessageType.MESSAGE_THINKING) {
388
- existingMsg.content += text;
389
- existingMsg.isStreaming = true;
390
- return;
391
- }
392
-
393
- const msg = create(AgentMessageSchema, {
394
- type: MessageType.MESSAGE_THINKING,
395
- content: text,
396
- timestamp: utcTimestamp(),
397
- isStreaming: true,
398
- });
399
- this.state.proto.messages.push(msg);
400
- this.state.messagesByRun.set(thinkingKey, msg);
401
- }
402
-
403
- /**
404
- * Get or create the AI message for a given LLM run. A new message is
405
- * created when the run_id changes (turn boundary) to prevent token
406
- * interleaving.
407
- */
408
- private ensureAiMessage(
409
- runId: string,
410
- namespace: string,
411
- type: MessageType,
412
- ): AgentMessage {
413
- const existingByRun = this.state.messagesByRun.get(runId);
414
- if (existingByRun) return existingByRun;
415
-
416
- const lastRunId = this.state.lastLlmRunId.get(namespace);
417
- if (lastRunId && lastRunId !== runId) {
418
- const existingMsg = this.state.currentAiMessage.get(namespace);
419
- if (existingMsg) {
420
- existingMsg.isStreaming = false;
421
- }
422
- }
423
-
424
- const msg = create(AgentMessageSchema, {
425
- type,
426
- content: "",
427
- timestamp: utcTimestamp(),
428
- isStreaming: true,
429
- });
430
-
431
- this.state.proto.messages.push(msg);
432
- this.state.messagesByRun.set(runId, msg);
433
- this.state.currentAiMessage.set(namespace, msg);
434
- this.state.lastLlmRunId.set(namespace, runId);
435
-
436
- return msg;
437
- }
438
-
439
- /**
440
- * Create an AI message for a tool-only LLM turn (no preceding text).
441
- * When the model responds with only tool_use blocks and no text,
442
- * handleChatModelStream never creates an AI message. This method
443
- * ensures tool calls still get attached to a proper AI message.
444
- */
445
- private ensureAiMessageForToolCall(
446
- _toolRunId: string,
447
- namespace: string,
448
- ): AgentMessage | null {
449
- const lastRunId = this.state.lastLlmRunId.get(namespace);
450
- if (lastRunId) {
451
- const existing = this.state.messagesByRun.get(lastRunId);
452
- if (existing) {
453
- this.state.currentAiMessage.set(namespace, existing);
454
- return existing;
455
- }
456
- }
457
-
458
- const msg = create(AgentMessageSchema, {
459
- type: MessageType.MESSAGE_AI,
460
- content: "",
461
- timestamp: utcTimestamp(),
462
- isStreaming: false,
463
- });
464
-
465
- this.state.proto.messages.push(msg);
466
- this.state.currentAiMessage.set(namespace, msg);
467
-
468
- return msg;
469
- }
470
-
471
- private extractNamespace(event: StreamEvent): string {
472
- const meta = event.metadata;
473
- if (!meta) return "";
474
- const ns = (meta.langgraph_checkpoint_ns ?? meta.checkpoint_ns ?? "") as string;
475
- return typeof ns === "string" ? ns : "";
476
- }
477
-
478
- private syncUsageToProto(): void {
479
- this.state.proto.streamingUsage = this.usageAccumulator.toProto();
480
- }
481
- }
@@ -1,106 +0,0 @@
1
- /**
2
- * Shared terminal state handlers for both v2 and v3 streaming loops.
3
- *
4
- * Extracted so pause, stop, and recursion-limit handling is identical
5
- * between both paths — no silent semantic divergence.
6
- */
7
-
8
- import { create } from "@bufbuild/protobuf";
9
- import { AgentMessageSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
10
- import { ExecutionPhase, MessageType } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
11
- import type { ExecutionStatusWriter } from "../../shared/execution-status-writer.js";
12
- import type { StreamResult } from "./streaming.js";
13
- import { slimStatus, utcTimestamp } from "../../shared/status.js";
14
-
15
- export function handlePause(
16
- writer: ExecutionStatusWriter,
17
- eventsProcessed: number,
18
- pendingPublishPromises: readonly Promise<void>[],
19
- pendingWritebackPromises: readonly Promise<void>[],
20
- ): StreamResult {
21
- const status = writer.currentStatus;
22
- status.phase = ExecutionPhase.EXECUTION_PAUSED;
23
- status.messages.push(create(AgentMessageSchema, {
24
- type: MessageType.MESSAGE_SYSTEM,
25
- content: "Execution paused by user. Use resume to continue from this checkpoint.",
26
- timestamp: utcTimestamp(),
27
- }));
28
-
29
- return {
30
- eventsProcessed,
31
- terminalStatus: slimStatus(status),
32
- pendingPublishPromises,
33
- pendingWritebackPromises,
34
- };
35
- }
36
-
37
- export function handleStop(
38
- writer: ExecutionStatusWriter,
39
- eventsProcessed: number,
40
- pendingPublishPromises: readonly Promise<void>[],
41
- pendingWritebackPromises: readonly Promise<void>[],
42
- ): StreamResult {
43
- const status = writer.currentStatus;
44
- status.phase = ExecutionPhase.EXECUTION_COMPLETED;
45
- status.completedAt = utcTimestamp();
46
- status.messages.push(create(AgentMessageSchema, {
47
- type: MessageType.MESSAGE_SYSTEM,
48
- content: "Execution stopped by the platform.",
49
- timestamp: utcTimestamp(),
50
- }));
51
-
52
- return {
53
- eventsProcessed,
54
- terminalStatus: slimStatus(status),
55
- pendingPublishPromises,
56
- pendingWritebackPromises,
57
- };
58
- }
59
-
60
- /**
61
- * Stable prefix of the recursion-limit terminal error. This is a cross-repo
62
- * contract: consumers that need to distinguish "ran out of tool-call budget"
63
- * from other TERMINATED causes (e.g. Stigmer Cloud's ChannelReplyExtractor,
64
- * which shows channel users a friendly limit message instead of generic
65
- * error copy) match on this prefix, because AgentExecutionStatus carries no
66
- * structured termination reason. Do not reword without updating them.
67
- */
68
- export const TOOL_CALL_LIMIT_ERROR_PREFIX = "Agent reached the tool-call limit";
69
-
70
- export function handleRecursionLimit(
71
- writer: ExecutionStatusWriter,
72
- eventsProcessed: number,
73
- pendingPublishPromises: readonly Promise<void>[],
74
- pendingWritebackPromises: readonly Promise<void>[],
75
- ): StreamResult {
76
- const status = writer.currentStatus;
77
- status.phase = ExecutionPhase.EXECUTION_TERMINATED;
78
- status.completedAt = utcTimestamp();
79
- status.error =
80
- `${TOOL_CALL_LIMIT_ERROR_PREFIX} after processing ${eventsProcessed} events. ` +
81
- `Send another message to continue.`;
82
- status.messages.push(create(AgentMessageSchema, {
83
- type: MessageType.MESSAGE_SYSTEM,
84
- content:
85
- "The agent reached the tool-call limit for this message. " +
86
- "Work completed so far has been saved. " +
87
- "Send another message to continue where the agent left off.",
88
- timestamp: utcTimestamp(),
89
- }));
90
-
91
- return {
92
- eventsProcessed,
93
- terminalStatus: slimStatus(status),
94
- pendingPublishPromises,
95
- pendingWritebackPromises,
96
- };
97
- }
98
-
99
- export function isGraphRecursionError(err: unknown): boolean {
100
- if (err instanceof Error) {
101
- return err.constructor.name === "GraphRecursionError" ||
102
- err.message.includes("GraphRecursionError") ||
103
- err.message.includes("Recursion limit");
104
- }
105
- return false;
106
- }