@stigmer/runner 3.15.0 → 3.15.2-dev.20260913223433

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/README.md +2 -4
  2. package/dist/.build-fingerprint +1 -1
  3. package/dist/__test-utils__/execution-record-fixture.d.ts +14 -0
  4. package/dist/__test-utils__/execution-record-fixture.js +4 -0
  5. package/dist/__test-utils__/execution-record-fixture.js.map +1 -1
  6. package/dist/__test-utils__/file-review-projection.d.ts +40 -0
  7. package/dist/__test-utils__/file-review-projection.js +136 -0
  8. package/dist/__test-utils__/file-review-projection.js.map +1 -0
  9. package/dist/__test-utils__/harness-contract/types.d.ts +23 -1
  10. package/dist/__test-utils__/harness-contract/types.js +15 -0
  11. package/dist/__test-utils__/harness-contract/types.js.map +1 -1
  12. package/dist/__test-utils__/hermetic-activity.d.ts +44 -12
  13. package/dist/__test-utils__/hermetic-activity.js +52 -14
  14. package/dist/__test-utils__/hermetic-activity.js.map +1 -1
  15. package/dist/__test-utils__/model-registry-fixture.d.ts +32 -7
  16. package/dist/__test-utils__/model-registry-fixture.js +31 -7
  17. package/dist/__test-utils__/model-registry-fixture.js.map +1 -1
  18. package/dist/__test-utils__/turn-input-fixture.d.ts +1 -1
  19. package/dist/__test-utils__/turn-input-fixture.js +1 -1
  20. package/dist/__test-utils__/turn-input-fixture.js.map +1 -1
  21. package/dist/activities/call-agent.js +2 -2
  22. package/dist/activities/call-agent.js.map +1 -1
  23. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +45 -3
  24. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -1
  25. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +0 -9
  26. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +2 -41
  27. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
  28. package/dist/activities/execute-cursor/adapter.d.ts +7 -5
  29. package/dist/activities/execute-cursor/adapter.js +7 -5
  30. package/dist/activities/execute-cursor/adapter.js.map +1 -1
  31. package/dist/activities/execute-cursor/approval-policy.d.ts +5 -2
  32. package/dist/activities/execute-cursor/approval-policy.js +5 -2
  33. package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
  34. package/dist/activities/execute-cursor/approval-state.d.ts +16 -8
  35. package/dist/activities/execute-cursor/approval-state.js +6 -3
  36. package/dist/activities/execute-cursor/approval-state.js.map +1 -1
  37. package/dist/activities/execute-cursor/cas-observations.d.ts +14 -2
  38. package/dist/activities/execute-cursor/cas-observations.js +19 -2
  39. package/dist/activities/execute-cursor/cas-observations.js.map +1 -1
  40. package/dist/activities/execute-cursor/cursor-capabilities.d.ts +8 -4
  41. package/dist/activities/execute-cursor/cursor-capabilities.js +21 -4
  42. package/dist/activities/execute-cursor/cursor-capabilities.js.map +1 -1
  43. package/dist/activities/execute-cursor/message-translator.d.ts +12 -20
  44. package/dist/activities/execute-cursor/message-translator.js +19 -32
  45. package/dist/activities/execute-cursor/message-translator.js.map +1 -1
  46. package/dist/activities/execute-cursor/prompt-builder.d.ts +48 -58
  47. package/dist/activities/execute-cursor/prompt-builder.js +76 -95
  48. package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
  49. package/dist/activities/execute-cursor/turn-boundary.d.ts +27 -55
  50. package/dist/activities/execute-cursor/turn-boundary.js +30 -90
  51. package/dist/activities/execute-cursor/turn-boundary.js.map +1 -1
  52. package/dist/activities/execute-cursor/turn-settle.d.ts +11 -7
  53. package/dist/activities/execute-cursor/turn-settle.js +37 -49
  54. package/dist/activities/execute-cursor/turn-settle.js.map +1 -1
  55. package/dist/activities/execute-cursor/turn-setup.d.ts +16 -24
  56. package/dist/activities/execute-cursor/turn-setup.js +29 -59
  57. package/dist/activities/execute-cursor/turn-setup.js.map +1 -1
  58. package/dist/activities/execute-cursor/turn-stream.d.ts +3 -8
  59. package/dist/activities/execute-cursor/turn-stream.js +9 -22
  60. package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
  61. package/dist/activities/execute-cursor/turn.js +5 -1
  62. package/dist/activities/execute-cursor/turn.js.map +1 -1
  63. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.d.ts +93 -0
  64. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js +348 -0
  65. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js.map +1 -0
  66. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +170 -0
  67. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +225 -0
  68. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -0
  69. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.d.ts +24 -0
  70. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js +41 -0
  71. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js.map +1 -0
  72. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.d.ts +54 -0
  73. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js +72 -0
  74. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js.map +1 -0
  75. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +187 -23
  76. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +238 -27
  77. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
  78. package/dist/activities/execute-deep-agent/adapter.d.ts +41 -0
  79. package/dist/activities/execute-deep-agent/adapter.js +78 -0
  80. package/dist/activities/execute-deep-agent/adapter.js.map +1 -0
  81. package/dist/activities/execute-deep-agent/cas-capture-observer.d.ts +8 -0
  82. package/dist/activities/execute-deep-agent/cas-capture-observer.js +9 -0
  83. package/dist/activities/execute-deep-agent/cas-capture-observer.js.map +1 -1
  84. package/dist/activities/execute-deep-agent/deep-agent-capabilities.d.ts +31 -0
  85. package/dist/activities/execute-deep-agent/deep-agent-capabilities.js +40 -0
  86. package/dist/activities/execute-deep-agent/deep-agent-capabilities.js.map +1 -0
  87. package/dist/activities/execute-deep-agent/execution-state.d.ts +4 -11
  88. package/dist/activities/execute-deep-agent/execution-state.js +4 -12
  89. package/dist/activities/execute-deep-agent/execution-state.js.map +1 -1
  90. package/dist/activities/execute-deep-agent/hitl.d.ts +49 -47
  91. package/dist/activities/execute-deep-agent/hitl.js +77 -103
  92. package/dist/activities/execute-deep-agent/hitl.js.map +1 -1
  93. package/dist/activities/execute-deep-agent/prompt-builder.d.ts +51 -23
  94. package/dist/activities/execute-deep-agent/prompt-builder.js +115 -76
  95. package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
  96. package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +18 -32
  97. package/dist/activities/execute-deep-agent/status-builder-shared.js +10 -65
  98. package/dist/activities/execute-deep-agent/status-builder-shared.js.map +1 -1
  99. package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +10 -8
  100. package/dist/activities/execute-deep-agent/streaming-side-effects.js +12 -14
  101. package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
  102. package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +36 -13
  103. package/dist/activities/execute-deep-agent/subagent-tracker.js +76 -39
  104. package/dist/activities/execute-deep-agent/subagent-tracker.js.map +1 -1
  105. package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +25 -28
  106. package/dist/activities/execute-deep-agent/subagent-transformer.js +29 -82
  107. package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
  108. package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +3 -2
  109. package/dist/activities/execute-deep-agent/subagent-wiring.js +2 -2
  110. package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -1
  111. package/dist/activities/execute-deep-agent/turn-settle.d.ts +42 -0
  112. package/dist/activities/execute-deep-agent/turn-settle.js +146 -0
  113. package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -0
  114. package/dist/activities/execute-deep-agent/turn-setup.d.ts +212 -0
  115. package/dist/activities/execute-deep-agent/turn-setup.js +430 -0
  116. package/dist/activities/execute-deep-agent/turn-setup.js.map +1 -0
  117. package/dist/activities/execute-deep-agent/turn-stream.d.ts +97 -0
  118. package/dist/activities/execute-deep-agent/turn-stream.js +242 -0
  119. package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -0
  120. package/dist/activities/execute-deep-agent/turn.d.ts +42 -0
  121. package/dist/activities/execute-deep-agent/turn.js +116 -0
  122. package/dist/activities/execute-deep-agent/turn.js.map +1 -0
  123. package/dist/activities/execute-deep-agent/v3-event-recorder.d.ts +6 -5
  124. package/dist/activities/execute-deep-agent/v3-event-recorder.js +6 -5
  125. package/dist/activities/execute-deep-agent/v3-event-recorder.js.map +1 -1
  126. package/dist/activities/execute-deep-agent/v3-events.d.ts +1 -1
  127. package/dist/activities/execute-deep-agent/v3-events.js +1 -1
  128. package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +60 -17
  129. package/dist/activities/execute-deep-agent/v3-status-builder.js +72 -57
  130. package/dist/activities/execute-deep-agent/v3-status-builder.js.map +1 -1
  131. package/dist/harness/approval-decisions.d.ts +61 -0
  132. package/dist/harness/approval-decisions.js +102 -0
  133. package/dist/harness/approval-decisions.js.map +1 -0
  134. package/dist/harness/capabilities.d.ts +16 -5
  135. package/dist/harness/capabilities.js +9 -0
  136. package/dist/harness/capabilities.js.map +1 -1
  137. package/dist/harness/capture.d.ts +144 -0
  138. package/dist/harness/capture.js +219 -0
  139. package/dist/harness/capture.js.map +1 -0
  140. package/dist/harness/persist-chokepoint.d.ts +19 -4
  141. package/dist/harness/persist-chokepoint.js +17 -4
  142. package/dist/harness/persist-chokepoint.js.map +1 -1
  143. package/dist/harness/run-turn.js +115 -29
  144. package/dist/harness/run-turn.js.map +1 -1
  145. package/dist/harness/terminal-table.d.ts +40 -11
  146. package/dist/harness/terminal-table.js +58 -19
  147. package/dist/harness/terminal-table.js.map +1 -1
  148. package/dist/harness/turn-context.d.ts +141 -76
  149. package/dist/harness/turn-context.js +194 -99
  150. package/dist/harness/turn-context.js.map +1 -1
  151. package/dist/harness/types.d.ts +65 -12
  152. package/dist/harness/types.js +8 -2
  153. package/dist/harness/types.js.map +1 -1
  154. package/dist/harness-adapters.d.ts +12 -8
  155. package/dist/harness-adapters.js +17 -9
  156. package/dist/harness-adapters.js.map +1 -1
  157. package/dist/middleware/approval-gate.d.ts +1 -1
  158. package/dist/middleware/approval-gate.js +1 -1
  159. package/dist/middleware/approval-gate.js.map +1 -1
  160. package/dist/middleware/cost-advisory.d.ts +39 -0
  161. package/dist/middleware/{cost-cap.js → cost-advisory.js} +37 -55
  162. package/dist/middleware/cost-advisory.js.map +1 -0
  163. package/dist/middleware/index.d.ts +23 -12
  164. package/dist/middleware/index.js +26 -18
  165. package/dist/middleware/index.js.map +1 -1
  166. package/dist/middleware/types.d.ts +3 -2
  167. package/dist/runner-manager.js +1 -5
  168. package/dist/runner-manager.js.map +1 -1
  169. package/dist/runner.js +1 -5
  170. package/dist/runner.js.map +1 -1
  171. package/dist/shared/attachment-resolver.d.ts +41 -18
  172. package/dist/shared/attachment-resolver.js +178 -46
  173. package/dist/shared/attachment-resolver.js.map +1 -1
  174. package/dist/shared/attachment-zip.d.ts +85 -0
  175. package/dist/shared/attachment-zip.js +185 -0
  176. package/dist/shared/attachment-zip.js.map +1 -0
  177. package/dist/shared/connect-backfill.js +5 -4
  178. package/dist/shared/connect-backfill.js.map +1 -1
  179. package/dist/shared/cost-guard.d.ts +3 -3
  180. package/dist/shared/cost-guard.js +3 -3
  181. package/dist/shared/execution-status-writer.d.ts +5 -5
  182. package/dist/shared/execution-status-writer.js +5 -5
  183. package/dist/shared/extract-structured-output.d.ts +8 -7
  184. package/dist/shared/extract-structured-output.js +8 -7
  185. package/dist/shared/extract-structured-output.js.map +1 -1
  186. package/dist/shared/filereview/cas-progress.d.ts +1 -18
  187. package/dist/shared/filereview/cas-progress.js +4 -0
  188. package/dist/shared/filereview/cas-progress.js.map +1 -1
  189. package/dist/shared/filereview/cas-touched.d.ts +56 -0
  190. package/dist/shared/filereview/cas-touched.js +63 -0
  191. package/dist/shared/filereview/cas-touched.js.map +1 -0
  192. package/dist/shared/filereview/index.d.ts +2 -1
  193. package/dist/shared/filereview/index.js +2 -1
  194. package/dist/shared/filereview/index.js.map +1 -1
  195. package/dist/shared/mcp-resolver.d.ts +4 -5
  196. package/dist/shared/mcp-resolver.js +4 -5
  197. package/dist/shared/mcp-resolver.js.map +1 -1
  198. package/dist/shared/persist-decision.d.ts +3 -4
  199. package/dist/shared/persist-decision.js +3 -4
  200. package/dist/shared/persist-decision.js.map +1 -1
  201. package/dist/shared/plan-mode-permissions.d.ts +2 -2
  202. package/dist/shared/plan-mode-permissions.js +2 -2
  203. package/dist/shared/plan-mode-prompt.d.ts +1 -1
  204. package/dist/shared/plan-mode-prompt.js +1 -1
  205. package/dist/shared/prompt-sections.d.ts +163 -0
  206. package/dist/shared/prompt-sections.js +164 -0
  207. package/dist/shared/prompt-sections.js.map +1 -0
  208. package/dist/shared/skill-resolver.d.ts +4 -2
  209. package/dist/shared/skill-resolver.js +4 -2
  210. package/dist/shared/skill-resolver.js.map +1 -1
  211. package/dist/shared/tool-rounds.d.ts +32 -0
  212. package/dist/shared/tool-rounds.js +43 -0
  213. package/dist/shared/tool-rounds.js.map +1 -1
  214. package/dist/shared/tool-row.d.ts +34 -0
  215. package/dist/shared/tool-row.js +52 -0
  216. package/dist/shared/tool-row.js.map +1 -1
  217. package/dist/shared/workspace/session-provision.d.ts +3 -3
  218. package/dist/shared/workspace/session-provision.js +3 -3
  219. package/dist/shared/workspace/stigmer-link.d.ts +3 -3
  220. package/dist/shared/workspace/stigmer-link.js +3 -3
  221. package/dist/shared/workspace/writeback-coordinator.d.ts +15 -22
  222. package/dist/shared/workspace/writeback-coordinator.js +16 -53
  223. package/dist/shared/workspace/writeback-coordinator.js.map +1 -1
  224. package/dist/tools/index.d.ts +1 -1
  225. package/dist/tools/index.js +1 -1
  226. package/package.json +4 -4
  227. package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +1 -0
  228. package/src/__test-utils__/execution-record-fixture.ts +18 -2
  229. package/src/__test-utils__/file-review-projection.ts +156 -0
  230. package/src/__test-utils__/git-workspace-fixture.ts +58 -0
  231. package/src/__test-utils__/harness-boot-order-child.ts +7 -2
  232. package/src/__test-utils__/harness-contract/contract.ts +33 -20
  233. package/src/__test-utils__/harness-contract/recording-sink.ts +11 -1
  234. package/src/__test-utils__/harness-contract/runtime-contract.ts +328 -10
  235. package/src/__test-utils__/harness-contract/scripted-adapter.ts +38 -6
  236. package/src/__test-utils__/harness-contract/types.ts +27 -3
  237. package/src/__test-utils__/hermetic-activity.ts +52 -14
  238. package/src/__test-utils__/model-registry-fixture.ts +32 -7
  239. package/src/__test-utils__/module-specifiers.ts +24 -0
  240. package/src/__test-utils__/turn-input-fixture.ts +2 -2
  241. package/src/__tests__/harness-boot-order.test.ts +9 -2
  242. package/src/activities/call-agent.ts +2 -2
  243. package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +47 -3
  244. package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +2 -48
  245. package/src/activities/execute-cursor/__tests__/approval-decisions-agree.test.ts +1 -1
  246. package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +6 -1
  247. package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +52 -27
  248. package/src/activities/execute-cursor/__tests__/cas-observations.test.ts +25 -0
  249. package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.everything.prompt.md +166 -0
  250. package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.plan-mode.prompt.md +186 -0
  251. package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.recovery.prompt.md +191 -0
  252. package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.reinvocation.prompt.md +13 -0
  253. package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.prefixed.prompt.md +32 -0
  254. package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.raw.prompt.md +1 -0
  255. package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +1 -2
  256. package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-error-at-create.status.json +4 -0
  257. package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +24 -4
  258. package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +6 -5
  259. package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +9 -0
  260. package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +11 -8
  261. package/src/activities/execute-cursor/__tests__/prompt-goldens.test.ts +229 -0
  262. package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +3 -3
  263. package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +2 -2
  264. package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +78 -234
  265. package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +1 -26
  266. package/src/activities/execute-cursor/adapter.ts +7 -5
  267. package/src/activities/execute-cursor/approval-policy.ts +5 -2
  268. package/src/activities/execute-cursor/approval-state.ts +16 -8
  269. package/src/activities/execute-cursor/cas-observations.ts +20 -2
  270. package/src/activities/execute-cursor/cursor-capabilities.ts +24 -5
  271. package/src/activities/execute-cursor/message-translator.ts +29 -41
  272. package/src/activities/execute-cursor/prompt-builder.ts +99 -157
  273. package/src/activities/execute-cursor/turn-boundary.ts +34 -140
  274. package/src/activities/execute-cursor/turn-settle.ts +37 -51
  275. package/src/activities/execute-cursor/turn-setup.ts +30 -70
  276. package/src/activities/execute-cursor/turn-stream.ts +8 -31
  277. package/src/activities/execute-cursor/turn.ts +5 -1
  278. package/src/activities/execute-deep-agent/__test-utils__/contract-subject.ts +391 -0
  279. package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +313 -0
  280. package/src/activities/execute-deep-agent/__test-utils__/hitl-script.ts +48 -0
  281. package/src/activities/execute-deep-agent/__test-utils__/scripted-model-module.ts +85 -0
  282. package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +383 -36
  283. package/src/activities/execute-deep-agent/__tests__/adapter-graph-is-sdk-free.test.ts +76 -0
  284. package/src/activities/execute-deep-agent/__tests__/adapter-is-temporal-free.test.ts +47 -0
  285. package/src/activities/execute-deep-agent/__tests__/adapter.test.ts +80 -0
  286. package/src/activities/execute-deep-agent/__tests__/cas-capture-backend.test.ts +1 -1
  287. package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +0 -2
  288. package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +0 -3
  289. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.build-from-plan.prompt.md +172 -0
  290. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.everything.prompt.md +167 -0
  291. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.minimal.prompt.md +36 -0
  292. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.plan-mode.prompt.md +178 -0
  293. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.skills-below-threshold.prompt.md +158 -0
  294. package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +210 -0
  295. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn1.status.json +74 -0
  296. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn2.status.json +104 -0
  297. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve.turn2.status.json +78 -0
  298. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +138 -0
  299. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/gate.turn1.status.json +68 -0
  300. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +154 -0
  301. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +116 -0
  302. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.after-tool.status.json +69 -0
  303. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.mid-tool.status.json +67 -0
  304. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/plain-turn.status.json +47 -0
  305. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/platform-stop.status.json +68 -0
  306. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +280 -0
  307. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/reject.turn2.status.json +77 -0
  308. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/resolution-error.status.json +18 -0
  309. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn2.status.json +99 -0
  310. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn3.status.json +109 -0
  311. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/skip.turn2.status.json +76 -0
  312. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.text-fallback.status.json +51 -0
  313. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tier2.status.json +51 -0
  314. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tool-strategy.status.json +56 -0
  315. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sub-agent-delegation.status.json +90 -0
  316. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/tool-call.status.json +70 -0
  317. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/worker-shutdown.status.json +71 -0
  318. package/src/activities/execute-deep-agent/__tests__/hermetic/harness-contract.test.ts +144 -0
  319. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-approve-all-lease.test.ts +184 -0
  320. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-round-trips.test.ts +203 -0
  321. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-sequential-gates.test.ts +170 -0
  322. package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +175 -0
  323. package/src/activities/execute-deep-agent/__tests__/hermetic/pause-vs-shutdown.test.ts +206 -0
  324. package/src/activities/execute-deep-agent/__tests__/hermetic/plain-turn.test.ts +142 -0
  325. package/src/activities/execute-deep-agent/__tests__/hermetic/platform-stop.test.ts +126 -0
  326. package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +139 -0
  327. package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +122 -0
  328. package/src/activities/execute-deep-agent/__tests__/hermetic/structured-output.test.ts +236 -0
  329. package/src/activities/execute-deep-agent/__tests__/hermetic/sub-agent-delegation.test.ts +161 -0
  330. package/src/activities/execute-deep-agent/__tests__/hermetic/tool-call.test.ts +157 -0
  331. package/src/activities/execute-deep-agent/__tests__/hermetic/workspace-lock-timeout.test.ts +152 -0
  332. package/src/activities/execute-deep-agent/__tests__/hitl.test.ts +50 -122
  333. package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +8 -6
  334. package/src/activities/execute-deep-agent/__tests__/plan-mode-path-normalization.test.ts +2 -2
  335. package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +35 -35
  336. package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +247 -0
  337. package/src/activities/execute-deep-agent/__tests__/scripted-model.test.ts +329 -0
  338. package/src/activities/execute-deep-agent/__tests__/status-builder-shared.test.ts +1 -20
  339. package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +78 -0
  340. package/src/activities/execute-deep-agent/__tests__/subagent-gitignored-capture.test.ts +1 -1
  341. package/src/activities/execute-deep-agent/__tests__/subagent-plan-mode-permissions.test.ts +2 -2
  342. package/src/activities/execute-deep-agent/__tests__/subagent-tracker.test.ts +57 -31
  343. package/src/activities/execute-deep-agent/__tests__/subagent-transformer.test.ts +19 -79
  344. package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +15 -15
  345. package/src/activities/execute-deep-agent/__tests__/summarization-verification.test.ts +1 -1
  346. package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +391 -0
  347. package/src/activities/execute-deep-agent/__tests__/v3-status-builder.test.ts +343 -38
  348. package/src/activities/execute-deep-agent/__tests__/vision-input.test.ts +5 -5
  349. package/src/activities/execute-deep-agent/adapter.ts +94 -0
  350. package/src/activities/execute-deep-agent/cas-capture-observer.ts +11 -0
  351. package/src/activities/execute-deep-agent/deep-agent-capabilities.ts +43 -0
  352. package/src/activities/execute-deep-agent/execution-state.ts +4 -13
  353. package/src/activities/execute-deep-agent/hitl.ts +100 -123
  354. package/src/activities/execute-deep-agent/prompt-builder.ts +141 -115
  355. package/src/activities/execute-deep-agent/status-builder-shared.ts +21 -84
  356. package/src/activities/execute-deep-agent/streaming-side-effects.ts +13 -19
  357. package/src/activities/execute-deep-agent/subagent-tracker.ts +77 -42
  358. package/src/activities/execute-deep-agent/subagent-transformer.ts +46 -105
  359. package/src/activities/execute-deep-agent/subagent-wiring.ts +5 -4
  360. package/src/activities/execute-deep-agent/turn-settle.ts +164 -0
  361. package/src/activities/execute-deep-agent/turn-setup.ts +541 -0
  362. package/src/activities/execute-deep-agent/turn-stream.ts +313 -0
  363. package/src/activities/execute-deep-agent/turn.ts +131 -0
  364. package/src/activities/execute-deep-agent/v3-event-recorder.ts +6 -5
  365. package/src/activities/execute-deep-agent/v3-events.ts +1 -1
  366. package/src/activities/execute-deep-agent/v3-status-builder.ts +84 -63
  367. package/src/harness/__tests__/approval-decisions.test.ts +116 -0
  368. package/src/harness/__tests__/capture.test.ts +268 -0
  369. package/src/harness/__tests__/mount-skills.test.ts +169 -0
  370. package/src/harness/__tests__/persist-chokepoint.test.ts +38 -2
  371. package/src/harness/__tests__/run-turn-deterministic.test.ts +94 -0
  372. package/src/harness/__tests__/run-turn.test.ts +39 -23
  373. package/src/harness/__tests__/turn-attachments-vision.test.ts +80 -0
  374. package/src/harness/__tests__/turn-context.test.ts +73 -26
  375. package/src/harness/approval-decisions.ts +104 -0
  376. package/src/harness/capabilities.ts +16 -5
  377. package/src/harness/capture.ts +301 -0
  378. package/src/harness/persist-chokepoint.ts +24 -4
  379. package/src/harness/run-turn.ts +120 -29
  380. package/src/harness/terminal-table.ts +61 -20
  381. package/src/harness/turn-context.ts +208 -111
  382. package/src/harness/types.ts +66 -12
  383. package/src/harness-adapters.ts +17 -9
  384. package/src/middleware/__tests__/approval-gate.test.ts +1 -1
  385. package/src/middleware/__tests__/cost-advisory.test.ts +113 -0
  386. package/src/middleware/approval-gate.ts +2 -2
  387. package/src/middleware/{cost-cap.ts → cost-advisory.ts} +40 -70
  388. package/src/middleware/index.ts +29 -29
  389. package/src/middleware/types.ts +3 -2
  390. package/src/runner-manager.ts +0 -8
  391. package/src/runner.ts +0 -8
  392. package/src/shared/__tests__/attachment-naming.test.ts +6 -19
  393. package/src/shared/__tests__/attachment-resolver.test.ts +158 -8
  394. package/src/shared/__tests__/attachment-zip.test.ts +236 -0
  395. package/src/shared/__tests__/bedrock-adapter.test.ts +1 -1
  396. package/src/shared/__tests__/blueprint-resolver.test.ts +43 -0
  397. package/src/shared/__tests__/cost-guard.test.ts +3 -3
  398. package/src/shared/__tests__/prompt-sections.test.ts +167 -0
  399. package/src/shared/__tests__/secret-leak-scan.test.ts +2 -2
  400. package/src/{activities/execute-deep-agent → shared}/__tests__/stamp-flowed-rows.test.ts +33 -10
  401. package/src/shared/__tests__/vertex-adapter.test.ts +1 -1
  402. package/src/shared/attachment-resolver.ts +218 -55
  403. package/src/shared/attachment-zip.ts +281 -0
  404. package/src/shared/connect-backfill.ts +9 -11
  405. package/src/shared/cost-guard.ts +3 -3
  406. package/src/shared/execution-status-writer.ts +5 -5
  407. package/src/shared/extract-structured-output.ts +8 -7
  408. package/src/shared/filereview/__tests__/capture.test.ts +86 -4
  409. package/src/shared/filereview/__tests__/cas-progress.test.ts +2 -1
  410. package/src/shared/filereview/cas-progress.ts +5 -19
  411. package/src/shared/filereview/cas-touched.ts +89 -0
  412. package/src/shared/filereview/index.ts +4 -2
  413. package/src/shared/mcp-resolver.ts +4 -5
  414. package/src/shared/persist-decision.ts +3 -4
  415. package/src/shared/plan-mode-permissions.ts +2 -2
  416. package/src/shared/plan-mode-prompt.ts +1 -1
  417. package/src/shared/prompt-sections.ts +256 -0
  418. package/src/shared/skill-resolver.ts +4 -2
  419. package/src/shared/tool-rounds.ts +48 -0
  420. package/src/shared/tool-row.ts +61 -0
  421. package/src/shared/workspace/__tests__/stigmer-link.test.ts +7 -22
  422. package/src/shared/workspace/__tests__/writeback-coordinator.test.ts +20 -61
  423. package/src/shared/workspace/session-provision.ts +3 -3
  424. package/src/shared/workspace/stigmer-link.ts +3 -3
  425. package/src/shared/workspace/writeback-coordinator.ts +16 -64
  426. package/src/tools/index.ts +1 -1
  427. package/dist/activities/execute-cursor/capture-flow.d.ts +0 -142
  428. package/dist/activities/execute-cursor/capture-flow.js +0 -285
  429. package/dist/activities/execute-cursor/capture-flow.js.map +0 -1
  430. package/dist/activities/execute-cursor/command-provenance.d.ts +0 -48
  431. package/dist/activities/execute-cursor/command-provenance.js +0 -38
  432. package/dist/activities/execute-cursor/command-provenance.js.map +0 -1
  433. package/dist/activities/execute-deep-agent/attachment-injector.d.ts +0 -134
  434. package/dist/activities/execute-deep-agent/attachment-injector.js +0 -386
  435. package/dist/activities/execute-deep-agent/attachment-injector.js.map +0 -1
  436. package/dist/activities/execute-deep-agent/command-provenance.d.ts +0 -61
  437. package/dist/activities/execute-deep-agent/command-provenance.js +0 -72
  438. package/dist/activities/execute-deep-agent/command-provenance.js.map +0 -1
  439. package/dist/activities/execute-deep-agent/environment.d.ts +0 -24
  440. package/dist/activities/execute-deep-agent/environment.js +0 -58
  441. package/dist/activities/execute-deep-agent/environment.js.map +0 -1
  442. package/dist/activities/execute-deep-agent/event-recorder.d.ts +0 -21
  443. package/dist/activities/execute-deep-agent/event-recorder.js +0 -67
  444. package/dist/activities/execute-deep-agent/event-recorder.js.map +0 -1
  445. package/dist/activities/execute-deep-agent/index.d.ts +0 -15
  446. package/dist/activities/execute-deep-agent/index.js +0 -918
  447. package/dist/activities/execute-deep-agent/index.js.map +0 -1
  448. package/dist/activities/execute-deep-agent/mcp-gate.d.ts +0 -28
  449. package/dist/activities/execute-deep-agent/mcp-gate.js +0 -22
  450. package/dist/activities/execute-deep-agent/mcp-gate.js.map +0 -1
  451. package/dist/activities/execute-deep-agent/post-stream.d.ts +0 -23
  452. package/dist/activities/execute-deep-agent/post-stream.js +0 -71
  453. package/dist/activities/execute-deep-agent/post-stream.js.map +0 -1
  454. package/dist/activities/execute-deep-agent/setup.d.ts +0 -136
  455. package/dist/activities/execute-deep-agent/setup.js +0 -767
  456. package/dist/activities/execute-deep-agent/setup.js.map +0 -1
  457. package/dist/activities/execute-deep-agent/stamp-flowed-rows.d.ts +0 -36
  458. package/dist/activities/execute-deep-agent/stamp-flowed-rows.js +0 -56
  459. package/dist/activities/execute-deep-agent/stamp-flowed-rows.js.map +0 -1
  460. package/dist/activities/execute-deep-agent/status-builder.d.ts +0 -93
  461. package/dist/activities/execute-deep-agent/status-builder.js +0 -365
  462. package/dist/activities/execute-deep-agent/status-builder.js.map +0 -1
  463. package/dist/activities/execute-deep-agent/streaming-terminal.d.ts +0 -21
  464. package/dist/activities/execute-deep-agent/streaming-terminal.js +0 -80
  465. package/dist/activities/execute-deep-agent/streaming-terminal.js.map +0 -1
  466. package/dist/activities/execute-deep-agent/streaming-v3.d.ts +0 -13
  467. package/dist/activities/execute-deep-agent/streaming-v3.js +0 -174
  468. package/dist/activities/execute-deep-agent/streaming-v3.js.map +0 -1
  469. package/dist/activities/execute-deep-agent/streaming.d.ts +0 -81
  470. package/dist/activities/execute-deep-agent/streaming.js +0 -160
  471. package/dist/activities/execute-deep-agent/streaming.js.map +0 -1
  472. package/dist/middleware/cost-cap.d.ts +0 -22
  473. package/dist/middleware/cost-cap.js.map +0 -1
  474. package/dist/middleware/graceful-stop.d.ts +0 -17
  475. package/dist/middleware/graceful-stop.js +0 -63
  476. package/dist/middleware/graceful-stop.js.map +0 -1
  477. package/dist/shared/skill-writer.d.ts +0 -75
  478. package/dist/shared/skill-writer.js +0 -207
  479. package/dist/shared/skill-writer.js.map +0 -1
  480. package/src/activities/execute-cursor/__tests__/capture-flow.test.ts +0 -1032
  481. package/src/activities/execute-cursor/__tests__/command-provenance.test.ts +0 -240
  482. package/src/activities/execute-cursor/__tests__/progress-substrate.test.ts +0 -169
  483. package/src/activities/execute-cursor/capture-flow.ts +0 -379
  484. package/src/activities/execute-cursor/command-provenance.ts +0 -73
  485. package/src/activities/execute-deep-agent/__tests__/attachment-injector.test.ts +0 -1161
  486. package/src/activities/execute-deep-agent/__tests__/command-provenance.test.ts +0 -252
  487. package/src/activities/execute-deep-agent/__tests__/environment.test.ts +0 -108
  488. package/src/activities/execute-deep-agent/__tests__/event-recorder.test.ts +0 -150
  489. package/src/activities/execute-deep-agent/__tests__/hitl-integration.test.ts +0 -226
  490. package/src/activities/execute-deep-agent/__tests__/hitl-reject.test.ts +0 -318
  491. package/src/activities/execute-deep-agent/__tests__/hitl-resume-approve-all.test.ts +0 -351
  492. package/src/activities/execute-deep-agent/__tests__/hitl-resume-history.test.ts +0 -293
  493. package/src/activities/execute-deep-agent/__tests__/index.test.ts +0 -99
  494. package/src/activities/execute-deep-agent/__tests__/mcp-gate.test.ts +0 -44
  495. package/src/activities/execute-deep-agent/__tests__/post-stream.test.ts +0 -112
  496. package/src/activities/execute-deep-agent/__tests__/sequential-gate-resume.test.ts +0 -358
  497. package/src/activities/execute-deep-agent/__tests__/status-builder.test.ts +0 -1933
  498. package/src/activities/execute-deep-agent/__tests__/streaming-terminal.test.ts +0 -40
  499. package/src/activities/execute-deep-agent/__tests__/streaming-v3.test.ts +0 -597
  500. package/src/activities/execute-deep-agent/__tests__/streaming.test.ts +0 -508
  501. package/src/activities/execute-deep-agent/attachment-injector.ts +0 -627
  502. package/src/activities/execute-deep-agent/command-provenance.ts +0 -102
  503. package/src/activities/execute-deep-agent/environment.ts +0 -76
  504. package/src/activities/execute-deep-agent/event-recorder.ts +0 -95
  505. package/src/activities/execute-deep-agent/index.ts +0 -1072
  506. package/src/activities/execute-deep-agent/mcp-gate.ts +0 -37
  507. package/src/activities/execute-deep-agent/post-stream.ts +0 -109
  508. package/src/activities/execute-deep-agent/setup.ts +0 -1081
  509. package/src/activities/execute-deep-agent/stamp-flowed-rows.ts +0 -64
  510. package/src/activities/execute-deep-agent/status-builder.ts +0 -481
  511. package/src/activities/execute-deep-agent/streaming-terminal.ts +0 -106
  512. package/src/activities/execute-deep-agent/streaming-v3.ts +0 -277
  513. package/src/activities/execute-deep-agent/streaming.ts +0 -313
  514. package/src/middleware/__tests__/cost-cap.test.ts +0 -192
  515. package/src/middleware/__tests__/graceful-stop.test.ts +0 -105
  516. package/src/middleware/graceful-stop.ts +0 -86
  517. package/src/shared/__tests__/skill-writer.test.ts +0 -372
  518. package/src/shared/skill-writer.ts +0 -266
@@ -1,44 +1,54 @@
1
1
  /**
2
- * System prompt construction for deep agent execution.
2
+ * The native harness's system prompt: what `createDeepAgent` receives as
3
+ * `systemPrompt`, rebuilt on EVERY invocation (never checkpointed with the
4
+ * message history), so every standing fact is injected on every turn by
5
+ * design — a first-turn-only injection would vanish from turn 2 onward.
3
6
  *
4
- * Pure functions: no side effects, no I/O. Accepts pre-computed data
5
- * (provision results, skill sections, file refs) and returns the
6
- * assembled system prompt string.
7
+ * Pure functions: no side effects, no I/O. `turn-setup.ts` gathers the
8
+ * inputs from the runtime's resolved record and this module renders them.
9
+ *
10
+ * What is this harness's and what is shared (S3 M5, Q-S3-10 / Q-M5-2):
11
+ * - Shared through `shared/prompt-sections.ts`: WHICH standing sections
12
+ * render and in WHAT order (`standingContextSections`), the input-files
13
+ * bullet and disclosure lines (`inputFileLines`), which skills a prompt
14
+ * highlights (`selectSkillsForPrompt`, called from `turn-setup.ts`) and
15
+ * the also-available sentence. Their WORDS come from each fact's own
16
+ * module; this builder only frames them.
17
+ * - This harness's: the framing — `## Heading` markdown sections, the house
18
+ * style for a system prompt — and every text that quotes this engine's
19
+ * tools: the `## Skills` activation protocol (`read`, `execute(...)`), the
20
+ * response rules, the sub-agent delegation rules, the plan-mode
21
+ * read-boundary sentence, and the workspace section (the deepagents
22
+ * backend's path resolution is this engine's).
23
+ *
24
+ * The rendered bytes are load-bearing for the hermetic tests: `ScriptedModel`
25
+ * tells its scripted roles apart by the system prompt's text, so this
26
+ * module's whole output is pinned by `__tests__/prompt-goldens.test.ts`.
7
27
  */
8
28
 
9
29
  import { relative } from "node:path";
10
30
  import { InteractionMode } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
11
31
  import type { ProvisionResult, GitMetadata } from "../../shared/workspace/types.js";
12
32
  import { SourceType } from "../../shared/workspace/types.js";
13
- import { formatContextBridgeText } from "../../shared/context-bridge.js";
14
33
  import { formatConversationCatchupText } from "../../shared/conversation-catchup.js";
34
+ import type { SenderIdentity } from "../../shared/sender-identity.js";
35
+ import type { DeclaredPreferencesContent } from "../../shared/declared-preferences.js";
36
+ import type { RecalledMemoriesContent } from "../../shared/recalled-memories.js";
37
+ import type { DownloadUrlKind } from "../../shared/attachment-download-urls.js";
15
38
  import {
16
- formatSenderIdentityText,
17
- type SenderIdentity,
18
- } from "../../shared/sender-identity.js";
19
- import { formatSessionContextText } from "../../shared/session-context.js";
20
- import {
21
- formatDeclaredPreferencesText,
22
- type DeclaredPreferencesContent,
23
- } from "../../shared/declared-preferences.js";
24
- import {
25
- formatRecalledMemoriesText,
26
- type RecalledMemoriesContent,
27
- } from "../../shared/recalled-memories.js";
28
- import {
29
- visionDisclosureLines,
30
- type NotViewableEntry,
31
- } from "../../shared/attachment-vision.js";
32
- import {
33
- downloadUrlDisclosureLine,
34
- type DownloadUrlKind,
35
- } from "../../shared/attachment-download-urls.js";
39
+ inputFileLines,
40
+ standingContextSections,
41
+ type StandingSectionKind,
42
+ type VisionPromptInfo,
43
+ } from "../../shared/prompt-sections.js";
36
44
  import { PLAN_MODE_DIRECTIVE } from "../../shared/plan-mode-prompt.js";
37
45
  import {
38
46
  buildImplementPlanDirective,
39
47
  findApprovedPlanPath,
40
48
  } from "../../shared/implement-plan-prompt.js";
41
- import type { InjectedFile } from "./attachment-injector.js";
49
+ import type { ResolvedAttachment } from "../../shared/attachment-resolver.js";
50
+ import type { SkillMetadata } from "../../shared/skill-resolver.js";
51
+ import { STIGMER_LOCAL_STATE_DIR } from "../../shared/workspace/stigmer-link.js";
42
52
 
43
53
  const RESPONSE_RULES = `
44
54
 
@@ -106,7 +116,11 @@ directly over delegating. Only delegate when context isolation \
106
116
  or parallelism genuinely helps the user.
107
117
  `;
108
118
 
119
+ /** The agent's instructions when the blueprint carries none; the prompt is never empty (S3 M2a, F-M2a-16: was `setup.ts`'s alone). */
120
+ export const DEFAULT_INSTRUCTIONS = "You are a helpful AI assistant.";
121
+
109
122
  export interface PromptBuilderInput {
123
+ /** The blueprint's instructions, raw; empty falls back to {@link DEFAULT_INSTRUCTIONS}. */
110
124
  instructions: string;
111
125
  provisionResults: ProvisionResult[];
112
126
  containerRoot: string;
@@ -119,7 +133,8 @@ export interface PromptBuilderInput {
119
133
  channelTemplatesPromptSection?: string;
120
134
  workspaceFileRefs: string[];
121
135
  workspaceRoot: string;
122
- injectedFiles: InjectedFile[];
136
+ /** The turn's resolved input files, as the runtime's attachment phase returns them. */
137
+ inputFiles: readonly ResolvedAttachment[];
123
138
  /**
124
139
  * Vision facts about this turn's attachments (T04): which images the model
125
140
  * sees inline in the user message and which degraded to path-only.
@@ -135,7 +150,7 @@ export interface PromptBuilderInput {
135
150
  /**
136
151
  * The execution's interaction mode. PLAN appends the shared plan-mode
137
152
  * directive so the model knows the turn's deliverable is a plan document.
138
- * Tool-level write enforcement is separate (see setup.ts permissions) —
153
+ * Tool-level write enforcement is separate (see turn-setup.ts permissions) —
139
154
  * without this directive the model is silently read-only but never told
140
155
  * to produce a plan.
141
156
  */
@@ -192,28 +207,34 @@ export interface PromptBuilderInput {
192
207
  recalledMemories?: RecalledMemoriesContent;
193
208
  }
194
209
 
195
- // The prompt renders the injector's own result type — a local structural twin
196
- // once lived here and silently dropped the size field (`size` vs `sizeBytes`),
197
- // so the "(N bytes)" annotation never rendered. One type, one truth.
198
- export type { InjectedFile } from "./attachment-injector.js";
210
+ // The prompt renders the attachment resolver's own result type — a local
211
+ // structural twin once lived here and silently dropped the size field
212
+ // (`size` vs `sizeBytes`), so the "(N bytes)" annotation never rendered. One
213
+ // type, one truth: the runtime's `ResolvedAttachment`; the vision facts are
214
+ // the shared `VisionPromptInfo` (prompt-sections.ts) for the same reason.
215
+
216
+ export type { VisionPromptInfo };
199
217
 
200
218
  /**
201
- * Which images ride the user message inline (in send order) and which
202
- * degraded to the file-pointer story the shared vision wording
203
- * (attachment-vision.ts) keeps this prompt and the Cursor harness's
204
- * input-files section telling the agent the same thing.
219
+ * This harness's heading for each shared standing section (the section's
220
+ * identity and order are `prompt-sections.ts`'s; the `##` framing is the
221
+ * house style for a system prompt). Exhaustive by the compiler: a new kind
222
+ * fails here until it is named.
205
223
  */
206
- export interface VisionPromptInfo {
207
- inlineFilenames: string[];
208
- notViewable: NotViewableEntry[];
209
- }
224
+ const STANDING_SECTION_HEADINGS: Record<StandingSectionKind, string> = {
225
+ "conversation-sender": "Conversation sender",
226
+ "declared-preferences": "Declared preferences",
227
+ "recalled-memories": "Remembered facts",
228
+ "session-context": "Session context",
229
+ "previous-conversation": "Previous conversation context",
230
+ };
210
231
 
211
232
  /**
212
233
  * Assemble the full system prompt from base instructions and contextual
213
234
  * sections. Pure function with no I/O.
214
235
  */
215
236
  export function buildEnhancedSystemPrompt(input: PromptBuilderInput): string {
216
- let prompt = input.instructions;
237
+ let prompt = input.instructions || DEFAULT_INSTRUCTIONS;
217
238
 
218
239
  const workspaceSection = buildWorkspacePromptSection(
219
240
  input.provisionResults,
@@ -241,50 +262,16 @@ export function buildEnhancedSystemPrompt(input: PromptBuilderInput): string {
241
262
  }
242
263
  }
243
264
 
244
- if (input.injectedFiles.length > 0) {
245
- prompt += buildInjectedFilesSection(
246
- input.injectedFiles, input.vision, input.downloadUrlKind,
265
+ if (input.inputFiles.length > 0) {
266
+ prompt += buildInputFilesSection(
267
+ input.inputFiles, input.vision, input.downloadUrlKind,
247
268
  );
248
269
  }
249
270
 
250
- if (input.senderIdentity) {
251
- prompt +=
252
- "\n\n## Conversation sender\n\n" +
253
- formatSenderIdentityText(input.senderIdentity);
254
- }
255
-
256
- // Platform-declared standing facts precede embedder-supplied context
257
- // (DD-002 D3): both are standing background, but the declared preferences
258
- // are platform-authored while session context is the embedder's overlay —
259
- // the more specific overlay reads later and naturally refines.
260
- if (input.declaredPreferences) {
261
- prompt +=
262
- "\n\n## Declared preferences\n\n" +
263
- formatDeclaredPreferencesText(input.declaredPreferences);
264
- }
265
-
266
- // Declared-by-humans precedes learned-and-confirmed (DD-006 D4): both
267
- // are platform-authored standing background, but a preference is the
268
- // user's exact words while a memory is an agent's confirmed inference —
269
- // the exact statement reads first.
270
- if (input.recalledMemories) {
271
- prompt +=
272
- "\n\n## Remembered facts\n\n" +
273
- formatRecalledMemoriesText(input.recalledMemories);
274
- }
275
-
276
- // Standing facts about the user (session context) come before the
277
- // carried conversation (bridge): the bridge may refer back to them.
278
- if (input.sessionContext) {
279
- prompt +=
280
- "\n\n## Session context\n\n" +
281
- formatSessionContextText(input.sessionContext);
282
- }
283
-
284
- if (input.contextBridge) {
285
- prompt +=
286
- "\n\n## Previous conversation context\n\n" +
287
- formatContextBridgeText(input.contextBridge);
271
+ // The standing context, in the shared order (the doctrine is stated once,
272
+ // on `standingContextSections`); this harness only frames each section.
273
+ for (const section of standingContextSections(input)) {
274
+ prompt += `\n\n## ${STANDING_SECTION_HEADINGS[section.kind]}\n\n${section.body}`;
288
275
  }
289
276
 
290
277
  prompt += RESPONSE_RULES;
@@ -310,7 +297,7 @@ export function buildEnhancedSystemPrompt(input: PromptBuilderInput): string {
310
297
 
311
298
  if (input.buildFromPlan) {
312
299
  const planPath = findApprovedPlanPath(
313
- input.injectedFiles.map((f) => f.path),
300
+ input.inputFiles.map((f) => f.relativePath),
314
301
  );
315
302
  prompt +=
316
303
  "\n\n## Implement the approved plan\n\n" +
@@ -339,6 +326,62 @@ export function composeUserMessage(
339
326
  : message;
340
327
  }
341
328
 
329
+ /**
330
+ * The `## Skills` section of this harness's system prompt, rendered from the
331
+ * runtime's mounted-skill metadata (`shared/skill-resolver.ts`
332
+ * `SkillMetadata`), following the Agent Skills spec's progressive
333
+ * disclosure model: only name, description and location are injected; the
334
+ * agent reads SKILL.md on demand through its filesystem tools. Byte for byte
335
+ * the text the orchestrator-era `generatePromptSection` rendered from the
336
+ * `Skill` proto (deleted with `setup.ts` at S3 M2b); the one difference is
337
+ * the input — a mounted file's metadata, not a fetched resource — so this
338
+ * renderer needs no client and serves the root and every sub-agent alike.
339
+ * Empty for no skills.
340
+ */
341
+ export function renderSkillsSection(skills: readonly SkillMetadata[]): string {
342
+ if (skills.length === 0) return "";
343
+
344
+ const lines: string[] = [
345
+ "",
346
+ "",
347
+ "## Skills",
348
+ "",
349
+ "You have access to the following skills. Each skill provides specialized " +
350
+ "knowledge or capabilities.",
351
+ "",
352
+ "**Activation protocol**: To use a skill, read its SKILL.md file " +
353
+ "using the `read` tool. The SKILL.md contains detailed instructions, " +
354
+ "available tools, and usage examples.",
355
+ "",
356
+ "**Usage pattern**:",
357
+ "",
358
+ "1. Review the skill description below to determine relevance",
359
+ "2. Read `{location}/SKILL.md` for full instructions",
360
+ "3. Follow the skill's documented operations:",
361
+ "",
362
+ "`read {location}/references/schema.md`",
363
+ '`execute("python3 {location}/scripts/run.py")`',
364
+ "",
365
+ ];
366
+
367
+ for (const skill of skills) {
368
+ const skillDir = skillDirOf(skill);
369
+ lines.push(`### ${skill.name}`);
370
+ lines.push(`**Description**: ${skill.description || "(no description)"}`);
371
+ lines.push(`**Location**: \`${skillDir}/\``);
372
+ lines.push(`**Activate**: \`read ${skillDir}/SKILL.md\``);
373
+ lines.push("");
374
+ }
375
+
376
+ return lines.join("\n");
377
+ }
378
+
379
+ /** The mount directory a skill's `SKILL.md` path names (`.stigmer/skills/<name>`). */
380
+ function skillDirOf(skill: SkillMetadata): string {
381
+ const slash = skill.path.lastIndexOf("/");
382
+ return slash > 0 ? skill.path.slice(0, slash) : `${STIGMER_LOCAL_STATE_DIR}/skills/${skill.name}`;
383
+ }
384
+
342
385
  function buildWorkspacePromptSection(
343
386
  provisionResults: ProvisionResult[],
344
387
  containerRoot: string,
@@ -452,8 +495,14 @@ function buildReferencedFilesSection(
452
495
  return section;
453
496
  }
454
497
 
455
- function buildInjectedFilesSection(
456
- files: readonly InjectedFile[],
498
+ /**
499
+ * The `## Input Files` section: this harness's intro (it names this engine's
500
+ * `read` tool) around the shared lines (`prompt-sections.ts` `inputFileLines`
501
+ * says what each bullet and disclosure carries and why). Each disclosure
502
+ * group is set off by a blank line, the markdown idiom.
503
+ */
504
+ function buildInputFilesSection(
505
+ files: readonly ResolvedAttachment[],
457
506
  vision?: VisionPromptInfo,
458
507
  downloadUrlKind?: DownloadUrlKind,
459
508
  ): string {
@@ -467,38 +516,15 @@ function buildInjectedFilesSection(
467
516
  "-- they are reference material, not output. " +
468
517
  "Do NOT modify or delete these files.\n\n";
469
518
 
470
- for (const f of files) {
471
- const sizeInfo = ` (${f.sizeBytes} bytes)`;
472
- // A duplicate-renamed file (attachment-naming.ts) discloses its original
473
- // name so the agent can connect "the two report.pdfs" in the user's
474
- // message to distinct files on disk. A file with a minted download URL
475
- // (attachment-download-urls.ts) lists it beside the path for the remote
476
- // hand-off story.
477
- const renameInfo =
478
- f.renamedFrom !== undefined
479
- ? ` (renamed from duplicate '${f.renamedFrom}')`
480
- : "";
481
- const urlInfo =
482
- f.downloadUrl !== undefined ? ` — download URL: ${f.downloadUrl}` : "";
483
- section += `- \`${f.path}\`${sizeInfo}${renameInfo}${urlInfo}\n`;
519
+ const lines = inputFileLines(files, vision, downloadUrlKind);
520
+ for (const entry of lines.entries) {
521
+ section += `${entry}\n`;
484
522
  }
485
-
486
- // The URL hand-off line (shared wording, attachment-download-urls.ts)
487
- // renders only when some listed file actually carries a URL — its wording
488
- // keys on what kind of URL the storage backend mints.
489
- if (downloadUrlKind !== undefined && files.some((f) => f.downloadUrl !== undefined)) {
490
- section += "\n" + downloadUrlDisclosureLine(downloadUrlKind) + "\n";
523
+ if (lines.urlHandoff !== undefined) {
524
+ section += "\n" + lines.urlHandoff + "\n";
491
525
  }
492
-
493
- // The vision lines (shared wording, attachment-vision.ts) tell the model
494
- // which of these files it can already SEE inline in the user message versus
495
- // which degraded to path-only — without them an agent silently ignores a
496
- // photo the user believes it can see.
497
- if (vision) {
498
- const lines = visionDisclosureLines(vision.inlineFilenames, vision.notViewable);
499
- if (lines.length > 0) {
500
- section += "\n" + lines.join("\n") + "\n";
501
- }
526
+ if (lines.vision.length > 0) {
527
+ section += "\n" + lines.vision.join("\n") + "\n";
502
528
  }
503
529
 
504
530
  return section;
@@ -1,16 +1,16 @@
1
1
  /**
2
- * Shared utilities for both v2 StatusBuilder and V3StatusBuilder.
2
+ * What the transcript builders share: the tool-result serialization and the
3
+ * approval-provenance stamp that `V3StatusBuilder` (the root transcript) and
4
+ * `SubAgentTracker` (the sub-agent transcripts) both perform at the moment
5
+ * they classify a tool call, so the two never drift on either rule.
3
6
  *
4
- * Extracted from status-builder.ts so both builders share identical
5
- * token accumulation, tool result parsing, and approval arg sanitization
6
- * without duplication.
7
+ * Until S3 M2b this module also carried the v2 `StatusBuilder`'s share — the
8
+ * `UsageAccumulator` that summed `streamingUsage` (the turn runtime's
9
+ * accountant owns the field now, `harness/usage-accumulator.ts`) and the v2
10
+ * `on_tool_end` result extractor — both retired with the v2 stream (Q-S3-1).
7
11
  */
8
12
 
9
- import { create } from "@bufbuild/protobuf";
10
- import { StreamingUsageSummarySchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/usage_pb";
11
- import type { StreamingUsageSummary } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/usage_pb";
12
13
  import type { ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
13
- import { utcTimestamp } from "../../shared/status.js";
14
14
  import {
15
15
  POLICY_ENGINE_VERSION,
16
16
  resolveApprovalProvenance,
@@ -19,62 +19,6 @@ import {
19
19
  } from "../../shared/approval-policy.js";
20
20
  import type { ToolApprovalCategory } from "../../shared/tool-kind.js";
21
21
 
22
- // ── Usage Accumulator ──────────────────────────────────────────────
23
-
24
- export interface UsageSnapshot {
25
- inputTokens: bigint;
26
- outputTokens: bigint;
27
- cacheReadTokens: bigint;
28
- cacheWriteTokens: bigint;
29
- totalTokens: bigint;
30
- turnCount: number;
31
- observedAt: string;
32
- }
33
-
34
- export class UsageAccumulator {
35
- private inputTokens = 0n;
36
- private outputTokens = 0n;
37
- private cacheReadTokens = 0n;
38
- private cacheWriteTokens = 0n;
39
- private turnCount = 0;
40
- private lastObservedAt = "";
41
-
42
- accumulate(meta: Record<string, unknown>): void {
43
- this.inputTokens += toBigInt(meta.input_tokens);
44
- this.outputTokens += toBigInt(meta.output_tokens);
45
- this.cacheReadTokens += toBigInt(meta.cache_read_input_tokens);
46
- this.cacheWriteTokens += toBigInt(meta.cache_creation_input_tokens);
47
- this.turnCount++;
48
- this.lastObservedAt = utcTimestamp();
49
- }
50
-
51
- snapshot(): UsageSnapshot {
52
- return {
53
- inputTokens: this.inputTokens,
54
- outputTokens: this.outputTokens,
55
- cacheReadTokens: this.cacheReadTokens,
56
- cacheWriteTokens: this.cacheWriteTokens,
57
- totalTokens: this.inputTokens + this.outputTokens +
58
- this.cacheReadTokens + this.cacheWriteTokens,
59
- turnCount: this.turnCount,
60
- observedAt: this.lastObservedAt,
61
- };
62
- }
63
-
64
- /** Create a protobuf StreamingUsageSummary from the current snapshot. */
65
- toProto(): StreamingUsageSummary {
66
- return create(StreamingUsageSummarySchema, this.snapshot());
67
- }
68
- }
69
-
70
- // ── BigInt Coercion ────────────────────────────────────────────────
71
-
72
- export function toBigInt(value: unknown): bigint {
73
- if (typeof value === "bigint") return value;
74
- if (typeof value === "number" && Number.isFinite(value)) return BigInt(Math.floor(value));
75
- return 0n;
76
- }
77
-
78
22
  // ── Tool Result Extraction ─────────────────────────────────────────
79
23
 
80
24
  /**
@@ -99,20 +43,6 @@ function serializeToolContent(content: unknown): string | undefined {
99
43
  return undefined;
100
44
  }
101
45
 
102
- export function extractToolResult(data: Record<string, unknown>): string {
103
- const output = data.output;
104
- if (typeof output === "string") return output;
105
- if (typeof output === "object" && output !== null) {
106
- const fromContent = serializeToolContent((output as Record<string, unknown>).content);
107
- if (fromContent !== undefined) return fromContent;
108
- }
109
- try {
110
- return JSON.stringify(output ?? data);
111
- } catch {
112
- return "[serialization error]";
113
- }
114
- }
115
-
116
46
  /**
117
47
  * Extract tool result from v3 tool-finished output.
118
48
  * v3 output wraps LangChain ToolMessage in a constructor envelope:
@@ -140,10 +70,8 @@ export function extractToolResultV3(output: unknown): string {
140
70
  // ── Authorization Provenance ───────────────────────────────────────
141
71
 
142
72
  /**
143
- * The policy inputs the StatusBuilders need to attribute a tool call's approval
144
- * provenance. The full {@link ApprovalPolicyProvider} (status-builder.ts) is
145
- * structurally this — defined here so the shared stamper has no import cycle back
146
- * into the builders.
73
+ * The policy inputs the builders need to decide whether a tool call waits for
74
+ * approval and to attribute its authorization provenance.
147
75
  */
148
76
  export interface ApprovalProvenanceInputs {
149
77
  readonly policies: ReadonlyMap<string, MergedToolPolicy>;
@@ -167,6 +95,15 @@ export interface ApprovalProvenanceInputs {
167
95
  readonly unattended?: boolean;
168
96
  }
169
97
 
98
+ /**
99
+ * The name the builder's API uses for the same shape (`setApprovalProvider`):
100
+ * the adapter hands the gate's policy state in under this name. One shape, two
101
+ * names on purpose — the provider is what a caller SUPPLIES, the inputs are
102
+ * what the stamper READS; until S3 M2b the v2 builder declared the provider as
103
+ * an empty `interface extends`, a second type for one shape.
104
+ */
105
+ export type ApprovalPolicyProvider = ApprovalProvenanceInputs;
106
+
170
107
  /** Shared empty set so a provider without leases allocates nothing per call. */
171
108
  const NO_LEASED_CATEGORIES: ReadonlySet<ToolApprovalCategory> = new Set();
172
109
 
@@ -200,6 +137,6 @@ export function stampApprovalProvenance(
200
137
  // ── Approval Args Sanitization ─────────────────────────────────────
201
138
 
202
139
  // Relocated to src/shared/args-preview.ts so both harnesses share one home for
203
- // arg sanitization. Re-exported here so the native importers (status-builder,
204
- // v3-status-builder, approval-file-change) keep their existing import path.
140
+ // arg sanitization. Re-exported here so the native importers (v3-status-builder,
141
+ // approval-file-change) keep their existing import path.
205
142
  export { sanitizeArgsPreview } from "../../shared/args-preview.js";
@@ -1,14 +1,19 @@
1
1
  /**
2
- * Side-effect triggers for v3 streaming: artifact publish and git writeback.
2
+ * The inline-publish trigger of the native stream: a v3 `tools` event carries
3
+ * the tool INPUT on `tool-started` and the OUTPUT on `tool-finished`, so the
4
+ * two are correlated by `tool_call_id` and a file-modifying tool's target
5
+ * path is published (`InlinePublisher`) once the call has finished — the
6
+ * artifact appears on the status mid-turn, not at the end.
3
7
  *
4
- * v3 `tool-finished` events do not carry input unlike v2 `on_tool_end`.
5
- * A ToolInputCache correlates `tool-started` input with `tool-finished`
6
- * by `tool_call_id` so file paths can be extracted for publish/writeback.
8
+ * Until S3 M2b (Q-M1-1) the same correlation also fed the write-back
9
+ * coordinator's per-file commit (`onFileModified`); write-back is
10
+ * finalize-only now, the turn runtime's, so publishing is this trigger's one
11
+ * effect. The loop (`turn-stream.ts`) drains {@link pendingPublishPromises}
12
+ * in the settle.
7
13
  */
8
14
 
9
15
  import type { V3ProtocolEvent } from "./v3-event-recorder.js";
10
16
  import type { InlinePublisher } from "./inline-publisher.js";
11
- import type { WriteBackCoordinator } from "../../shared/workspace/writeback-coordinator.js";
12
17
  import { extractFilePath, isFileModifyingTool } from "../../shared/file-tools.js";
13
18
 
14
19
  interface CachedToolInput {
@@ -19,21 +24,15 @@ interface CachedToolInput {
19
24
  export class StreamingSideEffects {
20
25
  private readonly inputCache = new Map<string, CachedToolInput>();
21
26
  private readonly inlinePublisher: InlinePublisher | undefined;
22
- private readonly writebackCoordinator: WriteBackCoordinator | undefined;
23
27
  readonly pendingPublishPromises: Promise<void>[] = [];
24
- readonly pendingWritebackPromises: Promise<void>[] = [];
25
28
 
26
- constructor(opts: {
27
- inlinePublisher?: InlinePublisher;
28
- writebackCoordinator?: WriteBackCoordinator;
29
- }) {
29
+ constructor(opts: { inlinePublisher?: InlinePublisher }) {
30
30
  this.inlinePublisher = opts.inlinePublisher;
31
- this.writebackCoordinator = opts.writebackCoordinator;
32
31
  }
33
32
 
34
33
  onProtocolEvent(event: V3ProtocolEvent): void {
35
34
  if (event.method !== "tools") return;
36
- if (!this.inlinePublisher && !this.writebackCoordinator) return;
35
+ if (!this.inlinePublisher) return;
37
36
 
38
37
  const data = event.params.data as Record<string, unknown> | undefined;
39
38
  if (!data) return;
@@ -64,12 +63,7 @@ export class StreamingSideEffects {
64
63
  const filePath = extractFilePath(cached.input);
65
64
  if (!filePath) return;
66
65
 
67
- if (this.inlinePublisher) {
68
- this.pendingPublishPromises.push(this.inlinePublisher.publish(filePath));
69
- }
70
- if (this.writebackCoordinator) {
71
- this.pendingWritebackPromises.push(this.writebackCoordinator.onFileModified(filePath));
72
- }
66
+ this.pendingPublishPromises.push(this.inlinePublisher.publish(filePath));
73
67
  }
74
68
  }
75
69
  }