@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,99 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import { createDeepAgentActivities } from "../index.js";
3
- import type { Config } from "../../../config.js";
4
-
5
- // The activity reads the Temporal activity context (cancellation signal,
6
- // heartbeat) via `Context.current()`. Outside a worker there is no live
7
- // context, so provide a minimal stand-in.
8
- vi.mock("@temporalio/activity", () => ({
9
- Context: {
10
- current: () => ({
11
- // A real AbortSignal: the workspace-lock wait registers abort listeners
12
- // on it, which a bare `{ aborted: false }` stub cannot satisfy.
13
- cancellationSignal: new AbortController().signal,
14
- heartbeat: vi.fn(),
15
- info: { taskQueue: "test-queue" },
16
- }),
17
- },
18
- CancelledFailure: class CancelledFailure extends Error {},
19
- }));
20
-
21
- vi.mock("../../../idle-watchdog.js", () => ({
22
- activityStarted: vi.fn(),
23
- activityFinished: vi.fn(),
24
- }));
25
-
26
- vi.mock("../../../client/stigmer-client.js", () => ({
27
- StigmerClient: vi.fn().mockImplementation(() => ({
28
- updateStatus: vi.fn().mockResolvedValue({ signal: 0 }),
29
- getExecution: vi.fn().mockRejectedValue(new Error("not mocked")),
30
- })),
31
- }));
32
-
33
- describe("ExecuteDeepAgent activity", () => {
34
- const mockConfig: Config = {
35
- taskQueue: "test-queue",
36
- temporalAddress: "localhost:7233",
37
- temporalNamespace: "default",
38
- stigmerBackendEndpoint: "http://localhost:7234",
39
- mcpBridgeEndpoint: null,
40
- stigmerToken: null,
41
- cursorApiKey: "",
42
- workspaceRootDir: "/tmp/test",
43
- mode: "local",
44
- proxyEndpoint: null,
45
- maxConcurrentActivities: 5,
46
- idleTimeoutSeconds: null,
47
- cloudModeEnabled: false,
48
- checkpointerType: "memory",
49
- checkpointerProxyEndpoint: null,
50
- artifactProxyEndpoint: null,
51
- primaryModel: "gpt-4.1",
52
- cursorStreamStallTimeoutMs: 180000,
53
- agentResolveTimeoutMs: 120000,
54
- workspaceLockTimeoutMs: 900000,
55
- };
56
-
57
- let activities: ReturnType<typeof createDeepAgentActivities>;
58
-
59
- beforeEach(() => {
60
- activities = createDeepAgentActivities(mockConfig);
61
- });
62
-
63
- it("registers ExecuteDeepAgent activity", () => {
64
- expect(activities).toHaveProperty("ExecuteDeepAgent");
65
- expect(typeof activities.ExecuteDeepAgent).toBe("function");
66
- });
67
-
68
- it("returns EXECUTION_FAILED status when setup fails", async () => {
69
- const result = await activities.ExecuteDeepAgent("exec-123", "thread-456");
70
-
71
- expect(result).toBeDefined();
72
- const status = result as Record<string, unknown>;
73
- expect(status).toHaveProperty("phase");
74
- expect(status.phase).toBe("EXECUTION_FAILED");
75
- });
76
-
77
- it("includes error message in failed status", async () => {
78
- const result = await activities.ExecuteDeepAgent("exec-123", "thread-456");
79
- const status = result as Record<string, unknown>;
80
- expect(status.error).toContain("not mocked");
81
- });
82
-
83
- it("accepts the correct signature (executionId, threadId)", async () => {
84
- await expect(
85
- activities.ExecuteDeepAgent("execution-id", "thread-id"),
86
- ).resolves.toBeDefined();
87
- });
88
-
89
- it("handles empty threadId gracefully", async () => {
90
- await expect(
91
- activities.ExecuteDeepAgent("execution-id", ""),
92
- ).resolves.toBeDefined();
93
- });
94
-
95
- it("always returns a serializable result", async () => {
96
- const result = await activities.ExecuteDeepAgent("exec-err", "thread-1");
97
- expect(() => JSON.stringify(result)).not.toThrow();
98
- });
99
- });
@@ -1,44 +0,0 @@
1
- /**
2
- * The deep-agent MCP gate, arm by arm. A missing arm here means a tool
3
- * source silently dropped for exactly the agents whose only source it
4
- * is — the failure DD-006 D7 documented for channel messaging and the
5
- * reason the predicate lives in its own testable module instead of
6
- * inline in setup.ts (whose import graph forbids a setup.test.ts).
7
- */
8
-
9
- import { describe, expect, it } from "vitest";
10
-
11
- import { shouldConnectMcp } from "../mcp-gate.js";
12
-
13
- const nothing = {
14
- mcpServerUsageCount: 0,
15
- channelMessagingCount: 0,
16
- conversationChannelId: undefined,
17
- memoryCaptureEnabled: false,
18
- };
19
-
20
- describe("shouldConnectMcp", () => {
21
- it("skips the MCP block when no tool source exists", () => {
22
- expect(shouldConnectMcp(nothing)).toBe(false);
23
- });
24
-
25
- it("enters on declared MCP server usages alone", () => {
26
- expect(shouldConnectMcp({ ...nothing, mcpServerUsageCount: 1 })).toBe(true);
27
- });
28
-
29
- it("enters on a serving proactive channel alone (the channels attachment)", () => {
30
- expect(shouldConnectMcp({ ...nothing, channelMessagingCount: 1 })).toBe(true);
31
- });
32
-
33
- it("enters on a channel conversation alone (the conversation attachment)", () => {
34
- // The reply-only pilot shape: no declared servers, no proactive
35
- // channel — the escalation tool is the ONLY source.
36
- expect(shouldConnectMcp({ ...nothing, conversationChannelId: "agch_1" })).toBe(true);
37
- });
38
-
39
- it("enters on memory capture alone (the memory attachment)", () => {
40
- // A tool-less agent whose user has memory on: the remember tool is
41
- // the ONLY source, and skipping the block would silently drop it.
42
- expect(shouldConnectMcp({ ...nothing, memoryCaptureEnabled: true })).toBe(true);
43
- });
44
- });
@@ -1,112 +0,0 @@
1
- import { describe, it, expect, vi } from "vitest";
2
- import { create } from "@bufbuild/protobuf";
3
- import { AgentExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
4
- import { processPostStream } from "../post-stream.js";
5
- import type { InlinePublisher } from "../inline-publisher.js";
6
- import type { WriteBackCoordinator } from "../../../shared/workspace/writeback-coordinator.js";
7
-
8
- function mockInlinePublisher(): InlinePublisher {
9
- return {
10
- publishedPaths: new Set(),
11
- publish: vi.fn(),
12
- } as any;
13
- }
14
-
15
- function mockWritebackCoordinator(): WriteBackCoordinator & { finalizeCalls: number } {
16
- let finalizeCalls = 0;
17
- return {
18
- get finalizeCalls() { return finalizeCalls; },
19
- hasEligibleEntries: true,
20
- onFileModified: vi.fn(),
21
- finalize: vi.fn(async () => { finalizeCalls++; }),
22
- } as any;
23
- }
24
-
25
- describe("processPostStream", () => {
26
- it("drains pending publish and writeback promises", async () => {
27
- let publishResolved = false;
28
- let writebackResolved = false;
29
-
30
- await processPostStream({
31
- status: create(AgentExecutionStatusSchema, {}),
32
- inlinePublisher: mockInlinePublisher(),
33
- writebackCoordinator: mockWritebackCoordinator(),
34
- pendingPublishPromises: [
35
- new Promise<void>(resolve => { publishResolved = true; resolve(); }),
36
- ],
37
- pendingWritebackPromises: [
38
- new Promise<void>(resolve => { writebackResolved = true; resolve(); }),
39
- ],
40
- executionId: "exec-test",
41
- });
42
-
43
- expect(publishResolved).toBe(true);
44
- expect(writebackResolved).toBe(true);
45
- });
46
-
47
- it("calls writeback finalize", async () => {
48
- const coordinator = mockWritebackCoordinator();
49
-
50
- await processPostStream({
51
- status: create(AgentExecutionStatusSchema, {}),
52
- inlinePublisher: mockInlinePublisher(),
53
- writebackCoordinator: coordinator,
54
- pendingPublishPromises: [],
55
- pendingWritebackPromises: [],
56
- executionId: "exec-test",
57
- });
58
-
59
- expect(coordinator.finalize).toHaveBeenCalledOnce();
60
- });
61
-
62
- it("skips writeback finalize when coordinator is null", async () => {
63
- await processPostStream({
64
- status: create(AgentExecutionStatusSchema, {}),
65
- inlinePublisher: mockInlinePublisher(),
66
- writebackCoordinator: null,
67
- pendingPublishPromises: [],
68
- pendingWritebackPromises: [],
69
- executionId: "exec-test",
70
- });
71
-
72
- // no error thrown
73
- });
74
-
75
- it("continues even when pending promise rejects", async () => {
76
- const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
77
- const coordinator = mockWritebackCoordinator();
78
-
79
- await processPostStream({
80
- status: create(AgentExecutionStatusSchema, {}),
81
- inlinePublisher: mockInlinePublisher(),
82
- writebackCoordinator: coordinator,
83
- pendingPublishPromises: [Promise.reject(new Error("publish boom"))],
84
- pendingWritebackPromises: [],
85
- executionId: "exec-test",
86
- });
87
-
88
- expect(coordinator.finalize).toHaveBeenCalledOnce();
89
- warnSpy.mockRestore();
90
- });
91
-
92
- it("continues even when writeback finalize throws", async () => {
93
- const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
94
- const coordinator = mockWritebackCoordinator();
95
- (coordinator.finalize as ReturnType<typeof vi.fn>).mockRejectedValueOnce(
96
- new Error("finalize boom"),
97
- );
98
-
99
- await processPostStream({
100
- status: create(AgentExecutionStatusSchema, {}),
101
- inlinePublisher: mockInlinePublisher(),
102
- writebackCoordinator: coordinator,
103
- pendingPublishPromises: [],
104
- pendingWritebackPromises: [],
105
- executionId: "exec-test",
106
- });
107
-
108
- // no error thrown, just warned
109
- expect(warnSpy).toHaveBeenCalled();
110
- warnSpy.mockRestore();
111
- });
112
- });
@@ -1,358 +0,0 @@
1
- /**
2
- * Regression: two SEQUENTIAL approval gates under the ephemeral memory
3
- * checkpointer (the OSS local / desktop default — config.ts resolves
4
- * `checkpointerType: "memory"`).
5
- *
6
- * Unlike the durable (http) checkpointer — which resumes via Command(resume) and
7
- * re-emits only post-checkpoint events — the memory checkpointer is recreated
8
- * empty every invocation (factory.ts), so the Temporal workflow's post-approval
9
- * re-invocation REPLAYS the graph from scratch. The langgraph input is just the
10
- * original user message (setup.ts), and the blind-FIFO mock LLM advances exactly
11
- * one gate per invocation, so the replay reaches the NEXT gate (gate B) directly.
12
- *
13
- * The defect this pins: on that gate-B re-invocation the live checkpoint is
14
- * empty, so a status rebuilt from an empty proto emits a transcript that holds
15
- * ONLY gate B and silently drops gate A's already-committed tool-call id. The
16
- * server's append-only-at-identity guard (update_status.go
17
- * nonTerminalTranscriptRegression) then rejects the update and keeps the old
18
- * messages, but projects pending_approvals from those kept messages — gate A is
19
- * already decided, so pending=0, and WAITING_FOR_APPROVAL + pending=0 makes the
20
- * workflow auto-resume, skipping gate B. The fix seeds the status from the
21
- * persisted transcript whenever the execution already has history, so gate B's
22
- * update is a superset of gate A rather than a replacement.
23
- *
24
- * This test exercises BOTH invocations through the real activity, asserting the
25
- * gate-A tool call survives into the gate-B update — the single behavior that,
26
- * if regressed, reintroduces the silent skip.
27
- */
28
-
29
- import { describe, it, expect, vi, beforeEach } from "vitest";
30
- import { makeInMemoryArtifactStorage } from "../../../__test-utils__/fake-artifact-storage.js";
31
- import { create, clone } from "@bufbuild/protobuf";
32
- import {
33
- AgentExecutionStatusSchema,
34
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
35
- import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
36
- import {
37
- AgentMessageSchema,
38
- ToolCallSchema,
39
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
40
- import {
41
- ApprovalAction,
42
- ExecutionPhase,
43
- MessageType,
44
- ToolCallStatus,
45
- } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
46
- import type { V3ProtocolEvent } from "../v3-event-recorder.js";
47
- import type { Config } from "../../../config.js";
48
- import type { SetupResult } from "../setup.js";
49
-
50
- // The Temporal activity context is unavailable outside a worker.
51
- vi.mock("@temporalio/activity", () => ({
52
- Context: {
53
- current: () => ({
54
- // A real AbortSignal: the workspace-lock wait registers abort listeners
55
- // on it, which a bare `{ aborted: false }` stub cannot satisfy.
56
- cancellationSignal: new AbortController().signal,
57
- heartbeat: vi.fn(),
58
- info: { taskQueue: "test-queue" },
59
- }),
60
- },
61
- CancelledFailure: class CancelledFailure extends Error {},
62
- }));
63
-
64
- vi.mock("../../../idle-watchdog.js", () => ({
65
- activityStarted: vi.fn(),
66
- activityFinished: vi.fn(),
67
- }));
68
-
69
- // Capture every persisted status (the gRPC chokepoint) for assertions.
70
- const { persistedStatuses } = vi.hoisted(() => ({
71
- persistedStatuses: [] as AgentExecutionStatus[],
72
- }));
73
-
74
- vi.mock("../../../client/stigmer-client.js", () => ({
75
- StigmerClient: vi.fn().mockImplementation(() => ({
76
- updateStatus: vi.fn(async (_id: string, status: AgentExecutionStatus) => {
77
- // Snapshot point-in-time: persistStatus mutates the same object in place.
78
- persistedStatuses.push(clone(AgentExecutionStatusSchema, status));
79
- return { signal: 0 };
80
- }),
81
- getExecution: vi.fn(),
82
- })),
83
- }));
84
-
85
- // performSetup is mocked per-invocation to return a fake memory-replay SetupResult.
86
- vi.mock("../setup.js", () => ({ performSetup: vi.fn() }));
87
-
88
- import { createDeepAgentActivities } from "../index.js";
89
- import { performSetup } from "../setup.js";
90
-
91
- const GATE_A_ID = "toolu_gate_a";
92
- const GATE_B_ID = "toolu_gate_b";
93
-
94
- function v3Event(
95
- seq: number,
96
- method: string,
97
- data: unknown,
98
- namespace: string[] = [],
99
- ): V3ProtocolEvent {
100
- return {
101
- type: "event",
102
- seq,
103
- method,
104
- params: { namespace, timestamp: Date.now(), data },
105
- };
106
- }
107
-
108
- /**
109
- * Events for a replayed turn that proposes a gated tool but pauses BEFORE
110
- * execution. The model turn commits no transcript message (no text/tool deltas);
111
- * the gated tool call is authored downstream by the activity from the pending
112
- * interrupt, matching the live e2e's single-tool gate update. Two events keep the
113
- * v3 loop from erroring on an empty stream.
114
- */
115
- function gateTurnEvents(): V3ProtocolEvent[] {
116
- return [
117
- v3Event(0, "messages", { event: "message-start", run_id: "g1" }),
118
- v3Event(1, "messages", { event: "message-finish", run_id: "g1" }),
119
- ];
120
- }
121
-
122
- function mockV3Run(events: V3ProtocolEvent[]) {
123
- return {
124
- [Symbol.asyncIterator]: async function* () {
125
- for (const e of events) yield e;
126
- },
127
- output: Promise.resolve({ messages: [] }),
128
- abort: vi.fn(),
129
- signal: new AbortController().signal,
130
- };
131
- }
132
-
133
- /** The empty live checkpoint a freshly-recreated MemorySaver reports pre-stream. */
134
- const EMPTY_REPLAY_STATE = { values: { messages: [] as unknown[] }, tasks: [] };
135
-
136
- /** The paused graph state after the replayed stream reaches the next gate. */
137
- function gatedGraphState(toolCallId: string, toolName: string, filePath: string) {
138
- return {
139
- values: {
140
- messages: [{
141
- role: "assistant",
142
- content: "",
143
- tool_calls: [{ id: toolCallId, name: toolName, args: { file_path: filePath, content: "x\n" } }],
144
- }],
145
- },
146
- tasks: [{
147
- id: "task-gate",
148
- interrupts: [{
149
- value: {
150
- tool_call_id: toolCallId,
151
- tool_name: toolName,
152
- message: `Execute ${toolName}`,
153
- },
154
- resumeValue: undefined,
155
- }],
156
- }],
157
- };
158
- }
159
-
160
- /**
161
- * A memory-checkpointer invocation that replays from scratch and re-pauses at a
162
- * single gate: getState reports an empty live checkpoint before the stream and a
163
- * pending interrupt after it.
164
- */
165
- function fakeMemoryGateSetup(opts: {
166
- gateId: string;
167
- gateName: string;
168
- filePath: string;
169
- executionStatus: AgentExecutionStatus;
170
- }): SetupResult {
171
- let streamed = false;
172
- const gated = gatedGraphState(opts.gateId, opts.gateName, opts.filePath);
173
-
174
- const agentGraph = {
175
- getState: vi.fn(async () => (streamed ? gated : EMPTY_REPLAY_STATE)),
176
- streamEvents: vi.fn(async () => {
177
- streamed = true;
178
- return mockV3Run(gateTurnEvents());
179
- }),
180
- };
181
-
182
- return {
183
- agentGraph,
184
- langgraphConfig: { configurable: { thread_id: "thread-seq" } },
185
- langgraphInput: { messages: [{ role: "user", content: "Write A then B" }] },
186
- execution: {
187
- spec: { message: "Write file A, then write file B." },
188
- status: opts.executionStatus,
189
- },
190
- agent: {},
191
- session: { spec: { workspaceEntries: [] } },
192
- workspaceBackend: {
193
- // Unique per test file: the workspace turn lock keys on this path, and a
194
- // path shared across files would serialize parallel test workers for real.
195
- rootDir: "/tmp/stigmer-test-ws-seq-gate",
196
- exists: vi.fn(async () => false),
197
- readFile: vi.fn(async () => ""),
198
- },
199
- mcpConnection: null,
200
- mergedEnvVars: {},
201
- secretKeys: new Set<string>(),
202
- modelName: "claude-sonnet",
203
- gracefulStop: undefined,
204
- artifactStorage: makeInMemoryArtifactStorage({ urlBase: "https://artifacts.local/" }).storage,
205
- provisionResults: [],
206
- approvalPolicies: new Map(),
207
- toolServerMap: new Map(),
208
- leasedCategories: new Set(),
209
- globalBypass: false,
210
- hasStructuredOutput: false,
211
- streamVersion: "v3",
212
- } as unknown as SetupResult;
213
- }
214
-
215
- /** Run-1 transcript persisted on the execution, with the user's APPROVE recorded. */
216
- function approvedGateAStatus(): AgentExecutionStatus {
217
- return create(AgentExecutionStatusSchema, {
218
- phase: ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
219
- startedAt: "2026-06-20T00:00:00.000Z",
220
- messages: [
221
- create(AgentMessageSchema, {
222
- type: MessageType.MESSAGE_AI,
223
- content: "",
224
- timestamp: "2026-06-20T00:00:01.000Z",
225
- toolCalls: [
226
- create(ToolCallSchema, {
227
- id: GATE_A_ID,
228
- name: "write_file",
229
- status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL,
230
- requiresApproval: true,
231
- approvalMessage: "Execute write_file",
232
- // The user approved gate A; SubmitApproval records the decision on
233
- // the persisted transcript (status stays WAITING_APPROVAL until the
234
- // resumed tool runs), which is what re-invokes the activity.
235
- approvalAction: ApprovalAction.APPROVE,
236
- }),
237
- ],
238
- }),
239
- ],
240
- });
241
- }
242
-
243
- const memoryConfig: Config = {
244
- taskQueue: "test-queue",
245
- temporalAddress: "localhost:7233",
246
- temporalNamespace: "default",
247
- stigmerBackendEndpoint: "http://localhost:7234",
248
- mcpBridgeEndpoint: null,
249
- stigmerToken: null,
250
- cursorApiKey: "",
251
- workspaceRootDir: "/tmp/test",
252
- mode: "local",
253
- proxyEndpoint: null,
254
- maxConcurrentActivities: 5,
255
- idleTimeoutSeconds: null,
256
- cloudModeEnabled: false,
257
- checkpointerType: "memory",
258
- checkpointerProxyEndpoint: null,
259
- artifactProxyEndpoint: null,
260
- primaryModel: "claude-sonnet",
261
- cursorStreamStallTimeoutMs: 180000,
262
- agentResolveTimeoutMs: 120000,
263
- workspaceLockTimeoutMs: 900000,
264
- };
265
-
266
- function toolCallIds(status: AgentExecutionStatus): string[] {
267
- return status.messages.flatMap(m => m.toolCalls).map(tc => tc.id);
268
- }
269
-
270
- describe("ExecuteDeepAgent — sequential gates under the memory checkpointer", () => {
271
- beforeEach(() => {
272
- persistedStatuses.length = 0;
273
- vi.mocked(performSetup).mockReset();
274
- });
275
-
276
- it("preserves gate A's committed tool call when resuming into gate B", async () => {
277
- const activities = createDeepAgentActivities(memoryConfig);
278
-
279
- // ── Invocation 1: first run reaches gate A (no prior history to seed). ──
280
- vi.mocked(performSetup).mockResolvedValueOnce(
281
- fakeMemoryGateSetup({
282
- gateId: GATE_A_ID,
283
- gateName: "write_file",
284
- filePath: "a.txt",
285
- executionStatus: create(AgentExecutionStatusSchema, {}),
286
- }),
287
- );
288
- await activities.ExecuteDeepAgent("exec-seq", "thread-seq");
289
-
290
- const afterGateA = persistedStatuses.at(-1)!;
291
- expect(afterGateA.phase).toBe(ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL);
292
- expect(toolCallIds(afterGateA)).toContain(GATE_A_ID);
293
-
294
- // ── User approves gate A; the server records the decision on the persisted
295
- // transcript. The next invocation re-invocation reads this status. ──
296
- const approved = clone(AgentExecutionStatusSchema, afterGateA);
297
- for (const m of approved.messages) {
298
- for (const tc of m.toolCalls) {
299
- if (tc.id === GATE_A_ID) tc.approvalAction = ApprovalAction.APPROVE;
300
- }
301
- }
302
-
303
- // ── Invocation 2: re-invoked after approval. The memory checkpointer replays
304
- // from scratch (empty live checkpoint) and the mock serves gate B. ──
305
- persistedStatuses.length = 0;
306
- vi.mocked(performSetup).mockResolvedValueOnce(
307
- fakeMemoryGateSetup({
308
- gateId: GATE_B_ID,
309
- gateName: "write_file",
310
- filePath: "b.txt",
311
- executionStatus: approved,
312
- }),
313
- );
314
- await activities.ExecuteDeepAgent("exec-seq", "thread-seq");
315
-
316
- const afterGateB = persistedStatuses.at(-1)!;
317
- const ids = toolCallIds(afterGateB);
318
-
319
- // Gate B is the new pending approval.
320
- expect(afterGateB.phase).toBe(ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL);
321
- expect(ids.filter(id => id === GATE_B_ID)).toHaveLength(1);
322
-
323
- // The regression guard: gate A's committed tool call survives the resume.
324
- // Dropping it lets the server guard reject the update and project pending=0,
325
- // which auto-resumes the workflow and silently skips gate B.
326
- expect(ids).toContain(GATE_A_ID);
327
- });
328
-
329
- /** A status that is a strict superset of the persisted transcript is what the
330
- * server's append-only-at-identity guard accepts (no committed id dropped). */
331
- it("emits a gate-B transcript that is a superset of the persisted gate-A transcript", async () => {
332
- const activities = createDeepAgentActivities(memoryConfig);
333
-
334
- const approved = approvedGateAStatus();
335
- const priorIds = toolCallIds(approved);
336
-
337
- vi.mocked(performSetup).mockResolvedValueOnce(
338
- fakeMemoryGateSetup({
339
- gateId: GATE_B_ID,
340
- gateName: "write_file",
341
- filePath: "b.txt",
342
- executionStatus: approved,
343
- }),
344
- );
345
- await activities.ExecuteDeepAgent("exec-seq", "thread-seq");
346
-
347
- const afterGateB = persistedStatuses.at(-1)!;
348
- const ids = new Set(toolCallIds(afterGateB));
349
-
350
- // Every previously-committed tool-call id is still present (no drop), and the
351
- // transcript did not shrink — exactly the two regressions the server guard
352
- // rejects (update_status.go nonTerminalTranscriptRegression).
353
- for (const id of priorIds) {
354
- expect(ids.has(id)).toBe(true);
355
- }
356
- expect(afterGateB.messages.length).toBeGreaterThanOrEqual(approved.messages.length);
357
- });
358
- });