@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,351 +0,0 @@
1
- /**
2
- * Diagnostic regression test (triangulation — RUNNER boundary).
3
- *
4
- * Reproduces the user-reported scenario exactly: a gated `getAppState` call
5
- * (open-computer-use MCP) is approved with APPROVE_ALL, which leases the whole
6
- * server so the resume runs `getAppState` AND every following computer-use tool
7
- * to completion in ONE durable-checkpoint resume — no further interrupts.
8
- *
9
- * The reported symptom is that the LEADING thinking block and the FIRST tool
10
- * call (`getAppState`) vanish from the transcript after approve-all, while the
11
- * later auto-executed tools remain. This test pins what the RUNNER persists at
12
- * its single gRPC chokepoint (`updateStatus`). If the runner is faithful, the
13
- * final status it sends must be a SUPERSET of run-1's transcript: the leading
14
- * thinking block survives, the gated tool call is reconciled in place (exactly
15
- * one copy, now COMPLETED), and the leased follow-up tool is appended.
16
- *
17
- * Models the cloud path deterministically, mirroring hitl-resume-history.test.ts:
18
- * - the persisted execution already holds the run-1 transcript
19
- * (THINKING + AI(getAppState WAITING_APPROVAL, approvalAction=APPROVE_ALL));
20
- * - the durable checkpoint exists (getState reports prior values + a pending
21
- * interrupt), so streamEvents re-emits ONLY post-interrupt events;
22
- * - the lease drops open-computer-use from the policy map, so the follow-up
23
- * `click` is NOT re-gated (its key is absent from approvalPolicies) and the
24
- * resume reaches a terminal COMPLETED phase.
25
- */
26
-
27
- import { describe, it, expect, vi, beforeEach } from "vitest";
28
- import { makeInMemoryArtifactStorage } from "../../../__test-utils__/fake-artifact-storage.js";
29
- import { create, clone } from "@bufbuild/protobuf";
30
- import {
31
- AgentExecutionStatusSchema,
32
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
33
- import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
34
- import {
35
- AgentMessageSchema,
36
- ToolCallSchema,
37
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
38
- import {
39
- ApprovalAction,
40
- ExecutionPhase,
41
- MessageType,
42
- ToolCallStatus,
43
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
44
- import type { V3ProtocolEvent } from "../v3-event-recorder.js";
45
- import type { Config } from "../../../config.js";
46
- import type { SetupResult } from "../setup.js";
47
-
48
- // The Temporal activity context is unavailable outside a worker.
49
- vi.mock("@temporalio/activity", () => ({
50
- Context: {
51
- current: () => ({
52
- // A real AbortSignal: the workspace-lock wait registers abort listeners
53
- // on it, which a bare `{ aborted: false }` stub cannot satisfy.
54
- cancellationSignal: new AbortController().signal,
55
- heartbeat: vi.fn(),
56
- info: { taskQueue: "test-queue" },
57
- }),
58
- },
59
- CancelledFailure: class CancelledFailure extends Error {},
60
- }));
61
-
62
- vi.mock("../../../idle-watchdog.js", () => ({
63
- activityStarted: vi.fn(),
64
- activityFinished: vi.fn(),
65
- }));
66
-
67
- // Capture every persisted status (the gRPC chokepoint) for assertions.
68
- const { persistedStatuses } = vi.hoisted(() => ({
69
- persistedStatuses: [] as AgentExecutionStatus[],
70
- }));
71
-
72
- vi.mock("../../../client/stigmer-client.js", () => ({
73
- StigmerClient: vi.fn().mockImplementation(() => ({
74
- updateStatus: vi.fn(async (_id: string, status: AgentExecutionStatus) => {
75
- // Snapshot point-in-time: persistStatus mutates the same object in place.
76
- persistedStatuses.push(clone(AgentExecutionStatusSchema, status));
77
- return { signal: 0 };
78
- }),
79
- getExecution: vi.fn(),
80
- })),
81
- }));
82
-
83
- // performSetup is mocked per-test to return a fake durable-resume SetupResult.
84
- vi.mock("../setup.js", () => ({ performSetup: vi.fn() }));
85
-
86
- import { createDeepAgentActivities } from "../index.js";
87
- import { performSetup } from "../setup.js";
88
-
89
- const MCP_SLUG = "open-computer-use";
90
- const GATED_TOOL_CALL_ID = "toolu_getappstate_01";
91
- const LEASED_TOOL_CALL_ID = "toolu_click_01";
92
- const THINKING_TEXT = "Let me capture the current app state before clicking anything.";
93
- const PRE_RESUME_AI_TEXT = "I'll capture the app state first.";
94
- const POST_RESUME_AI_TEXT = "Captured the app state and clicked the element.";
95
-
96
- function v3Event(
97
- seq: number,
98
- method: string,
99
- data: unknown,
100
- namespace: string[] = [],
101
- ): V3ProtocolEvent {
102
- return {
103
- type: "event",
104
- seq,
105
- method,
106
- params: { namespace, timestamp: Date.now(), data },
107
- };
108
- }
109
-
110
- function toolMessageOutput(content: string, toolCallId: string): unknown {
111
- return {
112
- lc: 1,
113
- type: "constructor",
114
- id: ["langchain_core", "messages", "ToolMessage"],
115
- kwargs: { content, tool_call_id: toolCallId },
116
- };
117
- }
118
-
119
- /**
120
- * The events a durable resume re-emits after APPROVE_ALL: the gated tool
121
- * executes (reconciled in place), then the leased follow-up tool auto-runs,
122
- * then the assistant produces a final turn. No interrupts — the lease dropped
123
- * open-computer-use from the policy map.
124
- */
125
- function resumeEvents(): V3ProtocolEvent[] {
126
- return [
127
- // 1. Gated getAppState now runs (reconciled to the seeded WAITING call).
128
- v3Event(0, "tools", {
129
- event: "tool-started",
130
- tool_call_id: GATED_TOOL_CALL_ID,
131
- tool_name: "getAppState",
132
- input: {},
133
- }, [`tools:${GATED_TOOL_CALL_ID}`]),
134
- v3Event(1, "tools", {
135
- event: "tool-finished",
136
- tool_call_id: GATED_TOOL_CALL_ID,
137
- output: toolMessageOutput("app-state-captured: 3 windows", GATED_TOOL_CALL_ID),
138
- }, [`tools:${GATED_TOOL_CALL_ID}`]),
139
- // 2. The model decides to click; the leased tool auto-runs (no gate).
140
- v3Event(2, "messages", { event: "message-start", run_id: "r2" }),
141
- v3Event(3, "tools", {
142
- event: "tool-started",
143
- tool_call_id: LEASED_TOOL_CALL_ID,
144
- tool_name: "click",
145
- input: { x: 10, y: 20 },
146
- }, [`tools:${LEASED_TOOL_CALL_ID}`]),
147
- v3Event(4, "tools", {
148
- event: "tool-finished",
149
- tool_call_id: LEASED_TOOL_CALL_ID,
150
- output: toolMessageOutput("clicked at (10,20)", LEASED_TOOL_CALL_ID),
151
- }, [`tools:${LEASED_TOOL_CALL_ID}`]),
152
- // 3. Final assistant turn.
153
- v3Event(5, "messages", { event: "message-start", run_id: "r3" }),
154
- v3Event(6, "messages", {
155
- event: "content-block-delta",
156
- index: 0,
157
- delta: { type: "text-delta", text: POST_RESUME_AI_TEXT },
158
- run_id: "r3",
159
- }),
160
- v3Event(7, "messages", { event: "message-finish", run_id: "r3" }),
161
- ];
162
- }
163
-
164
- function mockV3Run(events: V3ProtocolEvent[]) {
165
- return {
166
- [Symbol.asyncIterator]: async function* () {
167
- for (const e of events) yield e;
168
- },
169
- output: Promise.resolve({ messages: [] }),
170
- abort: vi.fn(),
171
- signal: new AbortController().signal,
172
- };
173
- }
174
-
175
- /**
176
- * The run-1 transcript already persisted on the execution: a leading thinking
177
- * block, then the gated getAppState call the user approved with APPROVE_ALL.
178
- */
179
- function persistedRunOneStatus(): AgentExecutionStatus {
180
- return create(AgentExecutionStatusSchema, {
181
- phase: ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
182
- startedAt: "2026-06-15T00:00:00.000Z",
183
- messages: [
184
- create(AgentMessageSchema, {
185
- type: MessageType.MESSAGE_THINKING,
186
- content: THINKING_TEXT,
187
- timestamp: "2026-06-15T00:00:01.000Z",
188
- }),
189
- create(AgentMessageSchema, {
190
- type: MessageType.MESSAGE_AI,
191
- content: PRE_RESUME_AI_TEXT,
192
- timestamp: "2026-06-15T00:00:02.000Z",
193
- toolCalls: [
194
- create(ToolCallSchema, {
195
- id: GATED_TOOL_CALL_ID,
196
- name: "getAppState",
197
- status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL,
198
- requiresApproval: true,
199
- approvalMessage: "Execute getAppState tool",
200
- approvalAction: ApprovalAction.APPROVE_ALL,
201
- mcpServerSlug: MCP_SLUG,
202
- }),
203
- ],
204
- }),
205
- ],
206
- });
207
- }
208
-
209
- function fakeDurableResumeSetup(): SetupResult {
210
- let streamed = false;
211
-
212
- const pendingInterruptState = {
213
- values: { messages: [{ role: "assistant", content: PRE_RESUME_AI_TEXT }] },
214
- tasks: [{
215
- id: "task-1",
216
- interrupts: [{
217
- value: {
218
- tool_call_id: GATED_TOOL_CALL_ID,
219
- tool_name: "getAppState",
220
- mcp_server_slug: MCP_SLUG,
221
- message: "Execute getAppState tool",
222
- },
223
- resumeValue: undefined,
224
- }],
225
- }],
226
- };
227
- const resolvedState = {
228
- values: { messages: [{ role: "assistant", content: PRE_RESUME_AI_TEXT }] },
229
- tasks: [],
230
- };
231
-
232
- const agentGraph = {
233
- // Before the resumed stream: a pending interrupt awaits the decision.
234
- // After the stream: the interrupt is resolved (no pending approvals).
235
- getState: vi.fn(async () => (streamed ? resolvedState : pendingInterruptState)),
236
- streamEvents: vi.fn(async () => {
237
- streamed = true;
238
- return mockV3Run(resumeEvents());
239
- }),
240
- };
241
-
242
- // Approve-all leased open-computer-use: the resume's policy map no longer
243
- // contains the leased server's tools, so the follow-up `click` is NOT gated.
244
- // Only the originally-gated getAppState policy remains for resume resolution.
245
- const approvalPolicies = new Map([
246
- [`${MCP_SLUG}/getAppState`, {
247
- toolName: "getAppState",
248
- mcpServerSlug: MCP_SLUG,
249
- requiresApproval: true,
250
- approvalMessage: "Execute getAppState tool",
251
- }],
252
- ]);
253
-
254
- return {
255
- agentGraph,
256
- langgraphConfig: { configurable: { thread_id: "thread-1" } },
257
- langgraphInput: { messages: [{ role: "user", content: "Self-DM me" }] },
258
- execution: {
259
- spec: { message: "Self-DM me to confirm you can." },
260
- status: persistedRunOneStatus(),
261
- },
262
- agent: {},
263
- session: { spec: { workspaceEntries: [] } },
264
- // Unique per test file: the workspace turn lock keys on this path, and a
265
- // path shared across files would serialize parallel test workers for real.
266
- workspaceBackend: { rootDir: "/tmp/stigmer-test-ws-hitl-approve-all" },
267
- mcpConnection: null,
268
- mergedEnvVars: {},
269
- secretKeys: new Set<string>(),
270
- modelName: "claude-sonnet",
271
- gracefulStop: undefined,
272
- artifactStorage: makeInMemoryArtifactStorage({ urlBase: "https://artifacts.local/" }).storage,
273
- provisionResults: [],
274
- approvalPolicies,
275
- // Both computer-use tools belong to the leased server.
276
- toolServerMap: new Map([["getAppState", MCP_SLUG], ["click", MCP_SLUG]]),
277
- autoApproveAll: false,
278
- hasStructuredOutput: false,
279
- streamVersion: "v3",
280
- } as unknown as SetupResult;
281
- }
282
-
283
- const baseConfig: Config = {
284
- taskQueue: "test-queue",
285
- temporalAddress: "localhost:7233",
286
- temporalNamespace: "default",
287
- stigmerBackendEndpoint: "http://localhost:7234",
288
- mcpBridgeEndpoint: null,
289
- stigmerToken: null,
290
- cursorApiKey: "",
291
- workspaceRootDir: "/tmp/test",
292
- mode: "cloud",
293
- proxyEndpoint: "http://localhost:7234",
294
- maxConcurrentActivities: 5,
295
- idleTimeoutSeconds: null,
296
- cloudModeEnabled: true,
297
- checkpointerType: "http",
298
- checkpointerProxyEndpoint: "http://localhost:7234",
299
- artifactProxyEndpoint: null,
300
- primaryModel: "claude-sonnet",
301
- cursorStreamStallTimeoutMs: 180000,
302
- agentResolveTimeoutMs: 120000,
303
- workspaceLockTimeoutMs: 900000,
304
- };
305
-
306
- describe("ExecuteDeepAgent — APPROVE_ALL durable resume preserves leading thinking + first tool call", () => {
307
- beforeEach(() => {
308
- persistedStatuses.length = 0;
309
- vi.mocked(performSetup).mockResolvedValue(fakeDurableResumeSetup());
310
- });
311
-
312
- it("keeps the leading thinking block and the gated getAppState call, and appends the leased tool", async () => {
313
- const activities = createDeepAgentActivities(baseConfig);
314
- await activities.ExecuteDeepAgent("exec-1", "thread-1");
315
-
316
- expect(persistedStatuses.length).toBeGreaterThan(0);
317
- const finalStatus = persistedStatuses.at(-1)!;
318
-
319
- // 1. The LEADING thinking block survives the resume (the reported symptom).
320
- const thinkingMessages = finalStatus.messages.filter(
321
- m => m.type === MessageType.MESSAGE_THINKING,
322
- );
323
- expect(thinkingMessages).toHaveLength(1);
324
- expect(thinkingMessages[0].content).toBe(THINKING_TEXT);
325
-
326
- // 2. The thinking block stays at the FRONT — it is still messages[0], proving
327
- // the transcript was not front-truncated and rebuilt from a later turn.
328
- expect(finalStatus.messages[0].type).toBe(MessageType.MESSAGE_THINKING);
329
-
330
- // 3. The FIRST tool call (getAppState) is reconciled in place: exactly one
331
- // copy, now COMPLETED with its result — not dropped, not duplicated.
332
- const getAppStateCalls = finalStatus.messages
333
- .flatMap(m => m.toolCalls)
334
- .filter(tc => tc.id === GATED_TOOL_CALL_ID);
335
- expect(getAppStateCalls).toHaveLength(1);
336
- expect(getAppStateCalls[0].status).toBe(ToolCallStatus.TOOL_CALL_COMPLETED);
337
- expect(getAppStateCalls[0].result).toContain("app-state-captured");
338
-
339
- // 4. The leased follow-up tool is appended.
340
- const clickCalls = finalStatus.messages
341
- .flatMap(m => m.toolCalls)
342
- .filter(tc => tc.id === LEASED_TOOL_CALL_ID);
343
- expect(clickCalls).toHaveLength(1);
344
- expect(clickCalls[0].status).toBe(ToolCallStatus.TOOL_CALL_COMPLETED);
345
-
346
- // 5. The post-resume assistant turn is appended and the run completes.
347
- const allText = finalStatus.messages.map(m => m.content).join("\n");
348
- expect(allText).toContain(POST_RESUME_AI_TEXT);
349
- expect(finalStatus.phase).toBe(ExecutionPhase.EXECUTION_COMPLETED);
350
- });
351
- });
@@ -1,293 +0,0 @@
1
- /**
2
- * Regression test: resuming an execution from a durable LangGraph checkpoint
3
- * must NOT wipe the message transcript.
4
- *
5
- * This models the cloud path deterministically. On the post-approval
6
- * re-invocation of ExecuteDeepAgent:
7
- * - the persisted execution already holds the run-1 transcript (an AI message
8
- * plus the gated tool call in WAITING_APPROVAL, approved by the user);
9
- * - the durable checkpoint exists (getState reports prior values + a pending
10
- * interrupt), so streamEvents re-emits ONLY the post-interrupt events
11
- * (the resumed tool execution + the following assistant turn).
12
- *
13
- * The activity must seed its status from the persisted execution so the
14
- * streamed delta appends onto the existing history, and the resumed tool
15
- * events must reconcile to the existing gated tool call rather than
16
- * duplicating it. The persisted status after resume must therefore contain
17
- * the full transcript with exactly one copy of the gated tool call.
18
- */
19
-
20
- import { describe, it, expect, vi, beforeEach } from "vitest";
21
- import { makeInMemoryArtifactStorage } from "../../../__test-utils__/fake-artifact-storage.js";
22
- import { create, clone } from "@bufbuild/protobuf";
23
- import {
24
- AgentExecutionStatusSchema,
25
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
26
- import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
27
- import {
28
- AgentMessageSchema,
29
- ToolCallSchema,
30
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
31
- import {
32
- ApprovalAction,
33
- ExecutionPhase,
34
- MessageType,
35
- ToolCallStatus,
36
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
37
- import type { V3ProtocolEvent } from "../v3-event-recorder.js";
38
- import type { Config } from "../../../config.js";
39
- import type { SetupResult } from "../setup.js";
40
-
41
- // The Temporal activity context is unavailable outside a worker.
42
- vi.mock("@temporalio/activity", () => ({
43
- Context: {
44
- current: () => ({
45
- // A real AbortSignal: the workspace-lock wait registers abort listeners
46
- // on it, which a bare `{ aborted: false }` stub cannot satisfy.
47
- cancellationSignal: new AbortController().signal,
48
- heartbeat: vi.fn(),
49
- info: { taskQueue: "test-queue" },
50
- }),
51
- },
52
- CancelledFailure: class CancelledFailure extends Error {},
53
- }));
54
-
55
- vi.mock("../../../idle-watchdog.js", () => ({
56
- activityStarted: vi.fn(),
57
- activityFinished: vi.fn(),
58
- }));
59
-
60
- // Capture every persisted status (the gRPC chokepoint) for assertions.
61
- const { persistedStatuses } = vi.hoisted(() => ({
62
- persistedStatuses: [] as AgentExecutionStatus[],
63
- }));
64
-
65
- vi.mock("../../../client/stigmer-client.js", () => ({
66
- StigmerClient: vi.fn().mockImplementation(() => ({
67
- updateStatus: vi.fn(async (_id: string, status: AgentExecutionStatus) => {
68
- // Snapshot point-in-time: persistStatus mutates the same object in place.
69
- persistedStatuses.push(clone(AgentExecutionStatusSchema, status));
70
- return { signal: 0 };
71
- }),
72
- getExecution: vi.fn(),
73
- })),
74
- }));
75
-
76
- // performSetup is mocked per-test to return a fake durable-resume SetupResult.
77
- vi.mock("../setup.js", () => ({ performSetup: vi.fn() }));
78
-
79
- import { createDeepAgentActivities } from "../index.js";
80
- import { performSetup } from "../setup.js";
81
-
82
- const GATED_TOOL_CALL_ID = "toolu_hitl_01";
83
- const PRE_RESUME_AI_TEXT = "I'll call the echo tool.";
84
- const POST_RESUME_AI_TEXT = "The echo tool returned the result.";
85
-
86
- function v3Event(
87
- seq: number,
88
- method: string,
89
- data: unknown,
90
- namespace: string[] = [],
91
- ): V3ProtocolEvent {
92
- return {
93
- type: "event",
94
- seq,
95
- method,
96
- params: { namespace, timestamp: Date.now(), data },
97
- };
98
- }
99
-
100
- /** The events a durable resume re-emits: tool execution + assistant turn. */
101
- function resumeEvents(): V3ProtocolEvent[] {
102
- return [
103
- v3Event(0, "tools", {
104
- event: "tool-started",
105
- tool_call_id: GATED_TOOL_CALL_ID,
106
- tool_name: "echo",
107
- input: { input: "hello-hitl" },
108
- }, [`tools:${GATED_TOOL_CALL_ID}`]),
109
- v3Event(1, "tools", {
110
- event: "tool-finished",
111
- tool_call_id: GATED_TOOL_CALL_ID,
112
- output: {
113
- lc: 1,
114
- type: "constructor",
115
- id: ["langchain_core", "messages", "ToolMessage"],
116
- kwargs: { content: "hello-hitl", tool_call_id: GATED_TOOL_CALL_ID },
117
- },
118
- }, [`tools:${GATED_TOOL_CALL_ID}`]),
119
- v3Event(2, "messages", { event: "message-start", run_id: "r2" }),
120
- v3Event(3, "messages", {
121
- event: "content-block-delta",
122
- index: 0,
123
- delta: { type: "text-delta", text: POST_RESUME_AI_TEXT },
124
- run_id: "r2",
125
- }),
126
- v3Event(4, "messages", { event: "message-finish", run_id: "r2" }),
127
- ];
128
- }
129
-
130
- function mockV3Run(events: V3ProtocolEvent[]) {
131
- return {
132
- [Symbol.asyncIterator]: async function* () {
133
- for (const e of events) yield e;
134
- },
135
- output: Promise.resolve({ messages: [] }),
136
- abort: vi.fn(),
137
- signal: new AbortController().signal,
138
- };
139
- }
140
-
141
- /** The run-1 transcript already persisted on the execution. */
142
- function persistedRunOneStatus(): AgentExecutionStatus {
143
- return create(AgentExecutionStatusSchema, {
144
- phase: ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
145
- startedAt: "2026-06-15T00:00:00.000Z",
146
- messages: [
147
- create(AgentMessageSchema, {
148
- type: MessageType.MESSAGE_AI,
149
- content: PRE_RESUME_AI_TEXT,
150
- timestamp: "2026-06-15T00:00:01.000Z",
151
- toolCalls: [
152
- create(ToolCallSchema, {
153
- id: GATED_TOOL_CALL_ID,
154
- name: "echo",
155
- status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL,
156
- requiresApproval: true,
157
- approvalMessage: "Execute echo tool",
158
- approvalAction: ApprovalAction.APPROVE,
159
- mcpServerSlug: "test-mcp",
160
- }),
161
- ],
162
- }),
163
- ],
164
- });
165
- }
166
-
167
- function fakeDurableResumeSetup(): SetupResult {
168
- let streamed = false;
169
-
170
- const pendingInterruptState = {
171
- values: { messages: [{ role: "assistant", content: PRE_RESUME_AI_TEXT }] },
172
- tasks: [{
173
- id: "task-1",
174
- interrupts: [{
175
- value: {
176
- tool_call_id: GATED_TOOL_CALL_ID,
177
- tool_name: "echo",
178
- mcp_server_slug: "test-mcp",
179
- message: "Execute echo tool",
180
- },
181
- resumeValue: undefined,
182
- }],
183
- }],
184
- };
185
- const resolvedState = {
186
- values: { messages: [{ role: "assistant", content: PRE_RESUME_AI_TEXT }] },
187
- tasks: [],
188
- };
189
-
190
- const agentGraph = {
191
- // Before the resumed stream: a pending interrupt awaits the decision.
192
- // After the stream: the interrupt is resolved (no pending approvals).
193
- getState: vi.fn(async () => (streamed ? resolvedState : pendingInterruptState)),
194
- streamEvents: vi.fn(async () => {
195
- streamed = true;
196
- return mockV3Run(resumeEvents());
197
- }),
198
- };
199
-
200
- const approvalPolicies = new Map([
201
- ["test-mcp/echo", {
202
- toolName: "echo",
203
- mcpServerSlug: "test-mcp",
204
- requiresApproval: true,
205
- approvalMessage: "Execute echo tool",
206
- }],
207
- ]);
208
-
209
- return {
210
- agentGraph,
211
- langgraphConfig: { configurable: { thread_id: "thread-1" } },
212
- langgraphInput: { messages: [{ role: "user", content: "Call echo" }] },
213
- execution: {
214
- spec: { message: "Call echo with 'hello-hitl'." },
215
- status: persistedRunOneStatus(),
216
- },
217
- agent: {},
218
- session: { spec: { workspaceEntries: [] } },
219
- // Unique per test file: the workspace turn lock keys on this path, and a
220
- // path shared across files would serialize parallel test workers for real.
221
- workspaceBackend: { rootDir: "/tmp/stigmer-test-ws-hitl-history" },
222
- mcpConnection: null,
223
- mergedEnvVars: {},
224
- secretKeys: new Set<string>(),
225
- modelName: "claude-sonnet",
226
- gracefulStop: undefined,
227
- artifactStorage: makeInMemoryArtifactStorage({ urlBase: "https://artifacts.local/" }).storage,
228
- provisionResults: [],
229
- approvalPolicies,
230
- toolServerMap: new Map([["echo", "test-mcp"]]),
231
- autoApproveAll: false,
232
- hasStructuredOutput: false,
233
- streamVersion: "v3",
234
- } as unknown as SetupResult;
235
- }
236
-
237
- const baseConfig: Config = {
238
- taskQueue: "test-queue",
239
- temporalAddress: "localhost:7233",
240
- temporalNamespace: "default",
241
- stigmerBackendEndpoint: "http://localhost:7234",
242
- mcpBridgeEndpoint: null,
243
- stigmerToken: null,
244
- cursorApiKey: "",
245
- workspaceRootDir: "/tmp/test",
246
- mode: "cloud",
247
- proxyEndpoint: "http://localhost:7234",
248
- maxConcurrentActivities: 5,
249
- idleTimeoutSeconds: null,
250
- cloudModeEnabled: true,
251
- checkpointerType: "http",
252
- checkpointerProxyEndpoint: "http://localhost:7234",
253
- artifactProxyEndpoint: null,
254
- primaryModel: "claude-sonnet",
255
- cursorStreamStallTimeoutMs: 180000,
256
- agentResolveTimeoutMs: 120000,
257
- workspaceLockTimeoutMs: 900000,
258
- };
259
-
260
- describe("ExecuteDeepAgent — durable-checkpoint resume preserves history", () => {
261
- beforeEach(() => {
262
- persistedStatuses.length = 0;
263
- vi.mocked(performSetup).mockResolvedValue(fakeDurableResumeSetup());
264
- });
265
-
266
- it("retains the full transcript and resolves the gated tool call in place", async () => {
267
- const activities = createDeepAgentActivities(baseConfig);
268
- await activities.ExecuteDeepAgent("exec-1", "thread-1");
269
-
270
- expect(persistedStatuses.length).toBeGreaterThan(0);
271
- const finalStatus = persistedStatuses.at(-1)!;
272
-
273
- // 1. The pre-resume transcript survives the resume.
274
- const allText = finalStatus.messages.map(m => m.content).join("\n");
275
- expect(allText).toContain(PRE_RESUME_AI_TEXT);
276
-
277
- // 2. The post-resume assistant turn is appended.
278
- expect(allText).toContain(POST_RESUME_AI_TEXT);
279
-
280
- // 3. Exactly one copy of the gated tool call — no duplicate on resume.
281
- const gatedToolCalls = finalStatus.messages
282
- .flatMap(m => m.toolCalls)
283
- .filter(tc => tc.id === GATED_TOOL_CALL_ID);
284
- expect(gatedToolCalls).toHaveLength(1);
285
-
286
- // 4. The gated tool call is resolved with its result, not stuck waiting.
287
- expect(gatedToolCalls[0].status).toBe(ToolCallStatus.TOOL_CALL_COMPLETED);
288
- expect(gatedToolCalls[0].result).toContain("hello-hitl");
289
-
290
- // 5. The execution reaches a terminal COMPLETED phase.
291
- expect(finalStatus.phase).toBe(ExecutionPhase.EXECUTION_COMPLETED);
292
- });
293
- });