@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,7 +1,9 @@
1
1
  import { describe, it, expect, beforeEach } from "vitest";
2
2
  import { create } from "@bufbuild/protobuf";
3
3
  import { AgentExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
4
+ import { SubAgentExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/subagent_pb";
4
5
  import { SubAgentStatus, MessageType, ToolCallStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
6
+ import { cancelInProgressSubAgentProtos } from "../../../shared/subagent-rows.js";
5
7
  import { V3StatusBuilder } from "../v3-status-builder.js";
6
8
  import { normalize } from "../v3-protocol-normalizer.js";
7
9
  import type { V3ProtocolEvent } from "../v3-event-recorder.js";
@@ -88,8 +90,6 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
88
90
  makeMessageFinish("parent-1"),
89
91
  makeTaskToolStarted("call_sub_1", "researcher", "Research renewable energy"),
90
92
  ]);
91
-
92
- sb.syncSubAgentExecutions();
93
93
  const subs = sb.currentStatus.subAgentExecutions;
94
94
  expect(subs).toHaveLength(1);
95
95
  expect(subs[0].id).toBe("call_sub_1");
@@ -106,8 +106,6 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
106
106
  makeTaskToolStarted("call_sub_1", "researcher", "Research topic"),
107
107
  makeTaskToolFinished("call_sub_1", "Renewable energy summary here."),
108
108
  ]);
109
-
110
- sb.syncSubAgentExecutions();
111
109
  const sub = sb.currentStatus.subAgentExecutions[0];
112
110
  expect(sub.status).toBe(SubAgentStatus.SUB_AGENT_COMPLETED);
113
111
  expect(sub.output).toBe("Renewable energy summary here.");
@@ -120,8 +118,6 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
120
118
  makeTaskToolStarted("call_sub_1", "researcher", "Research topic"),
121
119
  makeTaskToolError("call_sub_1", "Context overflow in sub-agent"),
122
120
  ]);
123
-
124
- sb.syncSubAgentExecutions();
125
121
  const sub = sb.currentStatus.subAgentExecutions[0];
126
122
  expect(sub.status).toBe(SubAgentStatus.SUB_AGENT_FAILED);
127
123
  expect(sub.error).toBe("Context overflow in sub-agent");
@@ -129,19 +125,19 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
129
125
  });
130
126
  });
131
127
 
132
- describe("lifecycle — cancellation", () => {
133
- it("cancelSubAgents marks active sub-agents as CANCELLED", () => {
128
+ describe("lifecycle — a stopped turn (the shared cancel act + the tracker's streaming finalize)", () => {
129
+ it("the shared cancelInProgressSubAgentProtos marks the tracked rows CANCELLED in place", () => {
134
130
  const sb = makeBuilder();
135
131
  feedAll(sb, [
136
132
  makeTaskToolStarted("call_sub_1", "researcher", "Task 1"),
137
133
  makeTaskToolStarted("call_sub_2", "shell", "Task 2"),
138
134
  ]);
139
135
 
140
- sb.cancelSubAgents();
136
+ cancelInProgressSubAgentProtos(sb.currentStatus.subAgentExecutions);
141
137
  const subs = sb.currentStatus.subAgentExecutions;
142
138
  expect(subs).toHaveLength(2);
143
139
  expect(subs[0].status).toBe(SubAgentStatus.SUB_AGENT_CANCELLED);
144
- expect(subs[0].error).toContain("parent execution was cancelled");
140
+ expect(subs[0].completedAt).toBeTruthy();
145
141
  expect(subs[1].status).toBe(SubAgentStatus.SUB_AGENT_CANCELLED);
146
142
  });
147
143
 
@@ -153,11 +149,61 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
153
149
  makeTaskToolStarted("call_sub_2", "shell", "Task 2"),
154
150
  ]);
155
151
 
156
- sb.cancelSubAgents();
152
+ cancelInProgressSubAgentProtos(sb.currentStatus.subAgentExecutions);
157
153
  const subs = sb.currentStatus.subAgentExecutions;
158
154
  expect(subs[0].status).toBe(SubAgentStatus.SUB_AGENT_COMPLETED);
159
155
  expect(subs[1].status).toBe(SubAgentStatus.SUB_AGENT_CANCELLED);
160
156
  });
157
+
158
+ it("finalizeSubAgentStreaming clears the streaming flag on a sub-agent's in-flight message", () => {
159
+ const sb = makeBuilder();
160
+ feedAll(sb, [
161
+ makeTaskToolStarted("call_sub_1", "researcher", "Task 1"),
162
+ makeSubAgentEvent("call_sub_1", "messages", { event: "message-start", id: "msg_sub_1", run_id: "sub-run-1" }),
163
+ makeSubAgentEvent("call_sub_1", "messages", {
164
+ event: "content-block-delta", index: 0, delta: { type: "text-delta", text: "Half a sente" }, run_id: "sub-run-1",
165
+ }),
166
+ ]);
167
+ const msg = sb.currentStatus.subAgentExecutions[0].messages[0];
168
+ expect(msg.isStreaming, "the delta left the message streaming").toBe(true);
169
+
170
+ sb.finalizeSubAgentStreaming();
171
+ expect(msg.isStreaming).toBe(false);
172
+ });
173
+ });
174
+
175
+ describe("the status's array is built into by reference (S3 M1 deferred debt)", () => {
176
+ it("new rows are pushed onto the array the builder was handed, never a replacement", () => {
177
+ const status = create(AgentExecutionStatusSchema, {});
178
+ const rows = status.subAgentExecutions;
179
+ const sb = new V3StatusBuilder("exec-test", status);
180
+ feedAll(sb, [makeTaskToolStarted("call_sub_1", "researcher", "Task 1")]);
181
+ expect(status.subAgentExecutions, "the same array object").toBe(rows);
182
+ expect(rows).toHaveLength(1);
183
+ });
184
+
185
+ it("a seeded row re-announced by a replayed task start is reconciled, not duplicated", () => {
186
+ const seeded = create(SubAgentExecutionSchema, {
187
+ id: "call_sub_1",
188
+ name: "researcher",
189
+ status: SubAgentStatus.SUB_AGENT_IN_PROGRESS,
190
+ });
191
+ const status = create(AgentExecutionStatusSchema, { subAgentExecutions: [seeded] });
192
+ const sb = new V3StatusBuilder("exec-test", status);
193
+ feedAll(sb, [
194
+ makeTaskToolStarted("call_sub_1", "researcher", "Task 1"),
195
+ makeSubAgentEvent("call_sub_1", "messages", { event: "message-start", id: "msg_sub_1", run_id: "sub-run-1" }),
196
+ makeSubAgentEvent("call_sub_1", "messages", {
197
+ event: "content-block-delta", index: 0, delta: { type: "text-delta", text: "Resumed." }, run_id: "sub-run-1",
198
+ }),
199
+ makeSubAgentEvent("call_sub_1", "messages", { event: "message-finish", reason: "end_turn", run_id: "sub-run-1" }),
200
+ makeTaskToolFinished("call_sub_1", "done"),
201
+ ]);
202
+ expect(status.subAgentExecutions, "one row, the seeded one").toHaveLength(1);
203
+ expect(status.subAgentExecutions[0]).toBe(seeded);
204
+ expect(seeded.status).toBe(SubAgentStatus.SUB_AGENT_COMPLETED);
205
+ expect(seeded.messages.map((m) => m.content), "child events routed onto the seeded row").toEqual(["Resumed."]);
206
+ });
161
207
  });
162
208
 
163
209
  describe("namespace routing — sub-agent messages isolated from parent", () => {
@@ -182,8 +228,6 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
182
228
  makeTaskToolFinished("call_sub_1", "Research complete."),
183
229
  ]);
184
230
 
185
- sb.syncSubAgentExecutions();
186
-
187
231
  // Parent messages should NOT contain sub-agent text
188
232
  const parentMessages = sb.currentStatus.messages;
189
233
  expect(parentMessages).toHaveLength(1);
@@ -219,8 +263,6 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
219
263
  event: "message-finish", reason: "end_turn", run_id: "sub-run-1",
220
264
  }),
221
265
  ]);
222
-
223
- sb.syncSubAgentExecutions();
224
266
  const sub = sb.currentStatus.subAgentExecutions[0];
225
267
  expect(sub.messages).toHaveLength(2);
226
268
  expect(sub.messages[0].type).toBe(MessageType.MESSAGE_THINKING);
@@ -262,8 +304,6 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
262
304
  output: { lc: 1, type: "constructor", id: ["langchain_core", "messages", "ToolMessage"], kwargs: { content: "Found 3 matches", status: "success", tool_call_id: subToolCallId, name: "grep" } },
263
305
  }, { namespace: [toolsNodeSegment(taskCallId), `tools:${subToolCallId}`] }),
264
306
  ]);
265
-
266
- sb.syncSubAgentExecutions();
267
307
  const sub = sb.currentStatus.subAgentExecutions[0];
268
308
  expect(sub.messages).toHaveLength(1);
269
309
  expect(sub.messages[0].toolCalls).toHaveLength(1);
@@ -307,8 +347,6 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
307
347
  makeTaskToolFinished("call_sub_1", "A done"),
308
348
  makeTaskToolFinished("call_sub_2", "B done"),
309
349
  ]);
310
-
311
- sb.syncSubAgentExecutions();
312
350
  const subs = sb.currentStatus.subAgentExecutions;
313
351
  expect(subs).toHaveLength(2);
314
352
 
@@ -332,8 +370,6 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
332
370
  makeTaskToolStarted("call_2", "researcher", "Research B"),
333
371
  makeTaskToolFinished("call_2", "Result B"),
334
372
  ]);
335
-
336
- sb.syncSubAgentExecutions();
337
373
  const subs = sb.currentStatus.subAgentExecutions;
338
374
  expect(subs).toHaveLength(2);
339
375
  expect(subs[0].id).toBe("call_1");
@@ -356,8 +392,6 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
356
392
  makeTextDelta("parent-2", "The research is complete."),
357
393
  makeMessageFinish("parent-2"),
358
394
  ]);
359
-
360
- sb.syncSubAgentExecutions();
361
395
  const msgs = sb.currentStatus.messages;
362
396
 
363
397
  // First AI message has the task tool call
@@ -380,8 +414,6 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
380
414
  makeTaskToolStarted("call_sub_1", "researcher", "Research"),
381
415
  makeTaskToolStarted("call_sub_1", "researcher", "Research"),
382
416
  ]);
383
-
384
- sb.syncSubAgentExecutions();
385
417
  expect(sb.currentStatus.subAgentExecutions).toHaveLength(1);
386
418
  });
387
419
 
@@ -390,8 +422,6 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
390
422
  feedAll(sb, [
391
423
  makeTaskToolFinished("unknown_call_id", "output"),
392
424
  ]);
393
-
394
- sb.syncSubAgentExecutions();
395
425
  expect(sb.currentStatus.subAgentExecutions).toHaveLength(0);
396
426
  });
397
427
 
@@ -431,8 +461,6 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
431
461
  event: "message-finish", reason: "end_turn", run_id: "sub-run",
432
462
  }, { namespace: [`tools:${callId}`, "model_request"], node: "model_request" }),
433
463
  ]);
434
-
435
- sb.syncSubAgentExecutions();
436
464
  const subs = sb.currentStatus.subAgentExecutions;
437
465
  expect(subs).toHaveLength(1);
438
466
  expect(subs[0].name).toBe("researcher");
@@ -459,8 +487,6 @@ describe("SubAgentTracker (via V3StatusBuilder integration)", () => {
459
487
  event: "message-finish", reason: "end_turn", run_id: "parent-run",
460
488
  }, { namespace: [], node: "model_request" }),
461
489
  ]);
462
-
463
- sb.syncSubAgentExecutions();
464
490
  // First message: AI message with task tool call (created by handleToolStarted)
465
491
  // Second message: parent text that follows
466
492
  expect(sb.currentStatus.messages).toHaveLength(2);
@@ -7,7 +7,6 @@ import {
7
7
  createBuiltinSubagents,
8
8
  transformSingleSubagent,
9
9
  filterMcpToolsForSubagent,
10
- collectAllSkillRefs,
11
10
  resolveSubagentSkillPrompt,
12
11
  compileSubagents,
13
12
  transformAndCompileSubagents,
@@ -448,7 +447,7 @@ describe("transformAndCompileSubagents", () => {
448
447
  parentMcpTools: [] as StructuredTool[],
449
448
  parentMcpServerToolMap: new Map<string, StructuredTool[]>(),
450
449
  parentMcpUsages: [] as McpServerUsage[],
451
- skillClient: {} as unknown,
450
+ skills: new Map(),
452
451
  workspaceBackend: mockWorkspaceBackend(),
453
452
  approvalGate: null,
454
453
  parentModelName: "claude-sonnet-4-6",
@@ -543,91 +542,32 @@ describe("transformAndCompileSubagents", () => {
543
542
  });
544
543
  });
545
544
 
546
- // =========================================================================
547
- // Tests: collectAllSkillRefs
548
- // =========================================================================
549
-
550
- describe("collectAllSkillRefs", () => {
551
- it("returns empty for subagents without skills", () => {
552
- const result = collectAllSkillRefs([
553
- mockSubAgentProto({ skillRefs: [] }),
554
- mockSubAgentProto({ skillRefs: [] }),
555
- ] as unknown as import("@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb").SubAgent[]);
556
-
557
- expect(result).toEqual([]);
558
- });
559
-
560
- it("collects unique refs from multiple subagents", () => {
561
- const result = collectAllSkillRefs([
562
- mockSubAgentProto({ skillRefs: [{ slug: "org/skill-a" }] }),
563
- mockSubAgentProto({ skillRefs: [{ slug: "org/skill-b" }] }),
564
- ] as unknown as import("@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb").SubAgent[]);
565
-
566
- expect(result).toHaveLength(2);
567
- expect(result.map((r) => r.slug)).toEqual(["org/skill-a", "org/skill-b"]);
568
- });
569
-
570
- it("deduplicates refs by slug", () => {
571
- const result = collectAllSkillRefs([
572
- mockSubAgentProto({ skillRefs: [{ slug: "org/same-skill" }] }),
573
- mockSubAgentProto({ skillRefs: [{ slug: "org/same-skill" }] }),
574
- ] as unknown as import("@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb").SubAgent[]);
575
-
576
- expect(result).toHaveLength(1);
577
- expect(result[0].slug).toBe("org/same-skill");
578
- });
579
-
580
- it("skips refs without slugs", () => {
581
- const result = collectAllSkillRefs([
582
- mockSubAgentProto({ skillRefs: [{ slug: "" }, { slug: "org/valid" }] }),
583
- ] as unknown as import("@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb").SubAgent[]);
584
-
585
- expect(result).toHaveLength(1);
586
- expect(result[0].slug).toBe("org/valid");
587
- });
588
- });
589
-
590
545
  // =========================================================================
591
546
  // Tests: resolveSubagentSkillPrompt
592
547
  // =========================================================================
593
548
 
594
549
  describe("resolveSubagentSkillPrompt", () => {
595
- it("returns empty string for subagent without skill refs", () => {
596
- const proto = mockSubAgentProto({ skillRefs: [] });
597
- const result = resolveSubagentSkillPrompt(
598
- proto as unknown as import("@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb").SubAgent,
599
- new Map(),
600
- );
601
- expect(result).toBe("");
550
+ const asSubAgent = (proto: unknown): import("@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb").SubAgent =>
551
+ proto as import("@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb").SubAgent;
552
+
553
+ it("returns empty string for a sub-agent the runtime mounted no skills for", () => {
554
+ const proto = mockSubAgentProto({ name: "researcher", skillRefs: [] });
555
+ expect(resolveSubagentSkillPrompt(asSubAgent(proto), new Map())).toBe("");
602
556
  });
603
557
 
604
- it("returns empty string when no skills match", () => {
605
- const proto = mockSubAgentProto({ skillRefs: [{ slug: "org/missing" }] });
606
- const result = resolveSubagentSkillPrompt(
607
- proto as unknown as import("@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb").SubAgent,
608
- new Map(),
609
- );
610
- expect(result).toBe("");
611
- });
612
-
613
- it("generates prompt section for matched skills", () => {
614
- const proto = mockSubAgentProto({ skillRefs: [{ slug: "org/my-skill" }] });
615
- const skillsBySlug = new Map([
616
- ["org/my-skill", {
617
- skill: {
618
- metadata: { id: "sk-1", name: "my-skill", slug: "org/my-skill" },
619
- spec: { name: "my-skill", description: "A test skill", skillMd: "# Skill\nDo things." },
620
- },
621
- path: ".stigmer/skills/my-skill",
622
- }],
558
+ it("renders the skills section from the sub-agent's own mounted skills, keyed by its name", () => {
559
+ const proto = mockSubAgentProto({ name: "researcher", skillRefs: [{ slug: "org/my-skill" }] });
560
+ const skills = new Map([
561
+ ["researcher", [{ name: "my-skill", description: "A test skill", path: ".stigmer/skills/my-skill/SKILL.md" }]],
562
+ ["other", [{ name: "not-mine", description: "Another agent's", path: ".stigmer/skills/not-mine/SKILL.md" }]],
623
563
  ]);
624
564
 
625
- const result = resolveSubagentSkillPrompt(
626
- proto as unknown as import("@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb").SubAgent,
627
- skillsBySlug,
628
- );
565
+ const result = resolveSubagentSkillPrompt(asSubAgent(proto), skills);
629
566
 
630
- expect(result.length).toBeGreaterThan(0);
567
+ expect(result).toContain("## Skills");
568
+ expect(result).toContain("### my-skill");
569
+ expect(result).toContain("**Location**: `.stigmer/skills/my-skill/`");
570
+ expect(result).not.toContain("not-mine");
631
571
  });
632
572
  });
633
573
 
@@ -681,7 +621,7 @@ describe("subagent-transformer edge cases", () => {
681
621
  parentMcpTools: [],
682
622
  parentMcpServerToolMap: new Map(),
683
623
  parentMcpUsages: [],
684
- skillClient: {} as unknown,
624
+ skills: new Map(),
685
625
  workspaceBackend: mockWorkspaceBackend({ rootDir: "" }),
686
626
  approvalGate: null,
687
627
  parentModelName: "claude-sonnet-4-6",
@@ -705,7 +645,7 @@ describe("subagent-transformer edge cases", () => {
705
645
  parentMcpTools: [],
706
646
  parentMcpServerToolMap: new Map(),
707
647
  parentMcpUsages: [],
708
- skillClient: {} as unknown,
648
+ skills: new Map(),
709
649
  workspaceBackend: mockWorkspaceBackend(),
710
650
  approvalGate: null,
711
651
  parentModelName: "claude-sonnet-4-6",
@@ -1,10 +1,10 @@
1
1
  import { describe, it, expect, vi } from "vitest";
2
2
  import { buildSubAgentMiddleware } from "../subagent-wiring.js";
3
- import { createCostCapMiddleware } from "../../../middleware/cost-cap.js";
3
+ import { createCostAdvisoryMiddleware } from "../../../middleware/cost-advisory.js";
4
4
  import * as approvalGateModule from "../../../middleware/approval-gate.js";
5
5
 
6
6
  describe("buildSubAgentMiddleware", () => {
7
- it("returns the correct middleware order without cost cap", () => {
7
+ it("returns the correct middleware order without a cost advisory", () => {
8
8
  const stack = buildSubAgentMiddleware();
9
9
 
10
10
  expect(stack).toHaveLength(5);
@@ -15,8 +15,8 @@ describe("buildSubAgentMiddleware", () => {
15
15
  expect(stack[4].name).toBe("ErrorHintsMiddleware");
16
16
  });
17
17
 
18
- it("includes cost cap view when parent cost cap is provided", () => {
19
- const parentCostCap = createCostCapMiddleware({
18
+ it("includes the parent's cost advisory view when one is provided", () => {
19
+ const parentCostAdvisory = createCostAdvisoryMiddleware({
20
20
  maxCostUsd: 10,
21
21
  inputPricePerMillion: 3,
22
22
  outputPricePerMillion: 15,
@@ -24,15 +24,15 @@ describe("buildSubAgentMiddleware", () => {
24
24
  warningPct: 80,
25
25
  });
26
26
 
27
- const stack = buildSubAgentMiddleware({ costCap: parentCostCap });
27
+ const stack = buildSubAgentMiddleware({ costAdvisory: parentCostAdvisory });
28
28
 
29
29
  expect(stack).toHaveLength(6);
30
- expect(stack[4].name).toBe("CostCapSubAgentView");
30
+ expect(stack[4].name).toBe("CostAdvisorySubAgentView");
31
31
  expect(stack[5].name).toBe("ErrorHintsMiddleware");
32
32
  });
33
33
 
34
- it("sub-agent cost cap view shares parent state", () => {
35
- const parentCostCap = createCostCapMiddleware({
34
+ it("the sub-agent advisory view shares the parent's running total and has no tool hook", () => {
35
+ const parentCostAdvisory = createCostAdvisoryMiddleware({
36
36
  maxCostUsd: 1,
37
37
  inputPricePerMillion: 3,
38
38
  outputPricePerMillion: 15,
@@ -40,13 +40,13 @@ describe("buildSubAgentMiddleware", () => {
40
40
  warningPct: 80,
41
41
  });
42
42
 
43
- const stack = buildSubAgentMiddleware({ costCap: parentCostCap });
43
+ const stack = buildSubAgentMiddleware({ costAdvisory: parentCostAdvisory });
44
44
 
45
- expect(parentCostCap.runningCost).toBe(0);
45
+ expect(parentCostAdvisory.runningCost).toBe(0);
46
46
 
47
47
  const subView = stack[4];
48
48
  expect(subView.afterModel).toBeDefined();
49
- expect(subView.wrapToolCall).toBeDefined();
49
+ expect(subView.wrapToolCall, "the advisory never blocks a tool; the runtime enforces the cap (Q-S3-3)").toBeUndefined();
50
50
  expect(subView.beforeAgent).toBeUndefined();
51
51
  });
52
52
 
@@ -92,7 +92,7 @@ describe("buildSubAgentMiddleware", () => {
92
92
  });
93
93
 
94
94
  it("orders the gate before the cost-cap view", () => {
95
- const parentCostCap = createCostCapMiddleware({
95
+ const parentCostAdvisory = createCostAdvisoryMiddleware({
96
96
  maxCostUsd: 10,
97
97
  inputPricePerMillion: 3,
98
98
  outputPricePerMillion: 15,
@@ -101,16 +101,16 @@ describe("buildSubAgentMiddleware", () => {
101
101
  });
102
102
 
103
103
  const stack = buildSubAgentMiddleware({
104
- costCap: parentCostCap,
104
+ costAdvisory: parentCostAdvisory,
105
105
  approvalGate: { policies: new Map(), toolServerMap: new Map() },
106
106
  });
107
107
 
108
- // loop, budget, tool intent, truncation, approval gate, cost cap view,
108
+ // loop, budget, tool intent, truncation, approval gate, cost advisory view,
109
109
  // error hints. Hints AFTER the gate matches the parent nesting: the
110
110
  // gate's HITL interrupt stays outside the hints' try/catch (issue #255).
111
111
  expect(stack).toHaveLength(7);
112
112
  expect(stack[4].name).toBe("ApprovalGateMiddleware");
113
- expect(stack[5].name).toBe("CostCapSubAgentView");
113
+ expect(stack[5].name).toBe("CostAdvisorySubAgentView");
114
114
  expect(stack[6].name).toBe("ErrorHintsMiddleware");
115
115
  });
116
116
 
@@ -309,7 +309,7 @@ describe("middleware stack ordering in createDeepAgent", () => {
309
309
  * const resolvedModel = request.model ?? await getChatModel();
310
310
  *
311
311
  * Since no model option is provided, the middleware uses request.model
312
- * which is the same ChatAnthropic instance from setup.ts with the
312
+ * which is the same ChatAnthropic instance from turn-setup.ts with the
313
313
  * proxy baseURL. All summarization LLM calls route through the proxy.
314
314
  */
315
315