@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,285 +0,0 @@
1
- /**
2
- * Cursor adapter over the harness-agnostic capture-mode orchestration
3
- * ({@link ../../shared/filereview/capture.js}).
4
- *
5
- * The substrate (git snapshot/restore) and the orchestration (baseline/candidate/
6
- * reconcile authoring) live in `shared/filereview/` so the Cursor and deep-agent
7
- * harnesses author IDENTICAL ledger entries. This adapter binds the Cursor
8
- * specifics:
9
- * - `harnessId = "cursor"` (stamped on the BASELINE payload the projection reads);
10
- * - the Cursor gate files written into the workspace, excluded from the captured
11
- * diff (`CURSOR_RUNNER_OWNED_PATHS`);
12
- * - stamping the streamed file-edit transcript rows that flowed this turn with
13
- * the change set id (`stampFlowedFileEditRows`) — the rows stay visible as
14
- * observational/audit records at their transcript positions, while
15
- * `file_change_sets` remains the single DECISION surface.
16
- *
17
- * The resume-time reconcile is NOT here since S2 M2: the turn runtime's
18
- * `reconcileReinvocation` (`harness/turn-context.ts`) calls the shared
19
- * reconcile directly under {@link CURSOR_FILE_REVIEW_IDENTITY}, the one
20
- * export that carries the two Cursor facts it needs. The two capture
21
- * functions keep their original signatures so the activity wiring (index.ts)
22
- * and the cutover tests are unchanged.
23
- */
24
- import { readFile } from "node:fs/promises";
25
- import { join } from "node:path";
26
- import { FileCaptureClass } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
27
- import { approvalCategory } from "./approval-policy.js";
28
- import { toolIdentity, primaryToken } from "./approval-state.js";
29
- import { readCasObservations } from "./cas-observations.js";
30
- import { contentDigest } from "../../shared/file-tools.js";
31
- import { isToolCallRowHidden, stampFileEditRow } from "../../shared/tool-row.js";
32
- import { captureBaselineToLedger as sharedCaptureBaselineToLedger, captureCandidateToLedger as sharedCaptureCandidateToLedger, } from "../../shared/filereview/capture.js";
33
- import { createGitProgressSubstrate, createHybridProgressSubstrate, } from "../../shared/filereview/progress.js";
34
- import { createCasProgressSubstrate, } from "../../shared/filereview/cas-progress.js";
35
- import { hasCandidateCaptured } from "../../shared/filereview/events.js";
36
- import { partitionIgnoredPathsBySecret } from "../../shared/filereview/secret-paths.js";
37
- /** The harness id the projection reads from the BASELINE payload (load-bearing). */
38
- const HARNESS_ID = "cursor";
39
- /**
40
- * Workspace-relative paths the Cursor gate writes into the repo. They are excluded
41
- * from capture so a turn's diff never shows the gate's own machinery. (The
42
- * workspace-scoped gate dir and SDK state live under `~/.stigmer` / the
43
- * git-excluded `.stigmer`, so they need no exclusion here.)
44
- */
45
- const CURSOR_RUNNER_OWNED_PATHS = [
46
- ".cursor/hooks.json",
47
- ".cursor/rules/stigmer-tool-approval.mdc",
48
- ];
49
- /**
50
- * The two facts the runtime's resume-time reconcile needs from this harness
51
- * (`harness/turn-context.ts` `reconcileReinvocation`): the same id and
52
- * exclude list the capture functions below stamp and apply, so the baseline a
53
- * turn authors and the reconcile a resume runs agree by construction.
54
- */
55
- export const CURSOR_FILE_REVIEW_IDENTITY = {
56
- harnessId: HARNESS_ID,
57
- excludePaths: CURSOR_RUNNER_OWNED_PATHS,
58
- };
59
- // `deriveCaptureMode` is the single capture-vs-deny-gate decision, now shared by
60
- // BOTH harnesses from `shared/filereview/capture.ts`. Re-exported here so existing
61
- // Cursor imports (index.ts, the deny-gate-exact-apply seam test) keep resolving
62
- // from this adapter.
63
- export { deriveCaptureMode } from "../../shared/filereview/capture.js";
64
- /**
65
- * Turn start: pin the pre-turn working tree behind the baseline ref and author
66
- * BASELINE_CAPTURED (harnessId "cursor"). Returns the baseline tree sha for the
67
- * turn-end diff.
68
- */
69
- export function captureBaselineToLedger(opts) {
70
- return sharedCaptureBaselineToLedger({
71
- ...opts,
72
- harnessId: HARNESS_ID,
73
- excludePaths: CURSOR_RUNNER_OWNED_PATHS,
74
- });
75
- }
76
- /**
77
- * Turn end: capture the change set + author CANDIDATE_CAPTURED, then stamp the
78
- * streamed file-edit rows that flowed this turn with the change set id — the
79
- * rows stay visible in place as observational records while `file_change_sets`
80
- * remains the single decision surface. The working tree is LEFT applied
81
- * (Cursor parity).
82
- *
83
- * The change set is HYBRID (git tree) or CAS-only (non-git): the hook-staged
84
- * writes from the cas-observations sidecar this turn ({@link readCasObservations})
85
- * — the Cursor analog of deep-agent's `buildCasTurnCaptures` — composed with the
86
- * git-tracked diff when `gitWorkspace`. Non-secret staged paths become
87
- * `GIT_IGNORED_CAPTURED` (git tree) or `NON_GIT_CAS` (non-git) CAS captures
88
- * (before-bytes from the sidecar, after-bytes re-read from disk);
89
- * secret-blocked paths become content-less `DIFF_UNREVIEWABLE` entries. The
90
- * boundary re-runs {@link partitionIgnoredPathsBySecret} as a fail-closed
91
- * backstop, so a secret that ever slipped into the captured set still has its
92
- * bytes withheld from durable storage.
93
- *
94
- * `deniedTokens` are the identities the hook gated this turn (shell/MCP, or a
95
- * secret-like delete — non-secret CAS deletes flow since issue #303). A streamed
96
- * file-edit row whose identity is in that set is left for the deny-gate
97
- * reconcile path — it did NOT flow. A flowed gitignored write or delete is NOT
98
- * in that set (the hook allowed it), so it is stamped like any other flowed
99
- * edit and its captured delta surfaces as a CAS entry in the set.
100
- *
101
- * `hitlDir`/`storage` are omitted only by callers with no artifact storage
102
- * (captureIgnored off); the CAS half is then skipped and this is a git-only
103
- * capture exactly as before.
104
- *
105
- * Mutates `messages` and `status` in place. Returns the captured git changes.
106
- */
107
- export async function captureTurnToLedger(opts) {
108
- const { status, gitRoot, executionId, changeSetId, baselineTree, messages, deniedTokens, hitlDir, storage, priorSubAgentToolCallIds, commandProvenance } = opts;
109
- const gitWorkspace = opts.gitWorkspace ?? true;
110
- // The CAS substrate class for this turn's staged writes: gitignored paths in a
111
- // git tree, all touched paths in a non-git workspace.
112
- const casCaptureClass = gitWorkspace
113
- ? FileCaptureClass.GIT_IGNORED_CAPTURED
114
- : FileCaptureClass.NON_GIT_CAS;
115
- const { casCaptures, unreviewablePaths } = await buildCasTurnCaptures(gitRoot, hitlDir, storage, casCaptureClass);
116
- const changes = await sharedCaptureCandidateToLedger({
117
- status,
118
- gitRoot,
119
- executionId,
120
- changeSetId,
121
- baselineTree,
122
- harnessId: HARNESS_ID,
123
- excludePaths: CURSOR_RUNNER_OWNED_PATHS,
124
- casCaptures,
125
- storage,
126
- unreviewablePaths,
127
- unreviewableCaptureClass: casCaptureClass,
128
- gitWorkspace,
129
- commandProvenance,
130
- });
131
- // Observational rows: the reviewable diff lives on the file_review ledger
132
- // (projected to file_change_sets); the streamed file-edit rows that flowed
133
- // this turn stay visible in place, stamped with the change set id so clients
134
- // badge them and anchor the decision surface. Denied (gitignored-delete/
135
- // shell) rows stay on the deny-gate path. Gated on an authored CANDIDATE —
136
- // a no-op turn (every edit reverted before the boundary) authors no event,
137
- // and a row must never reference a change set that does not exist.
138
- if (hasCandidateCaptured(status, changeSetId)) {
139
- stampFlowedFileEditRows(messages, deniedTokens, changeSetId);
140
- // Sub-agent edit rows fold their files into the SAME parent turn set, so they
141
- // carry the same change set id. Walked separately (they live under
142
- // subAgentExecutions, not the top-level transcript) and scoped to this turn
143
- // via the pre-turn snapshot of seeded sub-agent tool-call ids.
144
- for (const sa of status.subAgentExecutions) {
145
- stampFlowedFileEditRows(sa.messages, deniedTokens, changeSetId, priorSubAgentToolCallIds);
146
- }
147
- }
148
- return changes;
149
- }
150
- /**
151
- * Choose the mid-run progress substrate for this turn's workspace shape (DD-32 /
152
- * DD-33), returning `undefined` when there is nothing to observe (not capture
153
- * mode, or no workspace). Built ONCE per turn — the substrate owns its own
154
- * short-circuit cache across the loop's persists; the floor lives in the caller's
155
- * `ProgressCaptureState`. The live count and the turn-boundary reviewed set agree
156
- * by construction: the git slice binds the SAME `CURSOR_RUNNER_OWNED_PATHS`
157
- * exclusion {@link captureTurnToLedger} uses, and the CAS slice reads the SAME
158
- * hook sidecar ({@link readCasObservations}) the boundary reads.
159
- *
160
- * - git tree, no storage -> git substrate only (tracked-file `--numstat`);
161
- * - git tree, storage (HYBRID) -> git + CAS (the gitignored writes the hook staged);
162
- * - non-git workspace -> CAS only (every tool-mediated write is CAS-staged).
163
- *
164
- * The CAS slice needs the hook sidecar, which exists only when `captureIgnored`
165
- * is on (storage configured). A non-git capture already required storage
166
- * (`deriveCaptureMode`), so its sidecar is always present; a git tree with no
167
- * storage simply gets the git-only substrate (parity with the pre-DD-33 behavior).
168
- */
169
- export function buildCursorProgressSubstrate(opts) {
170
- const { captureMode, gitWorkspace, workspaceRoot, baselineTree, executionId, hitlDir, storage } = opts;
171
- if (!captureMode || !workspaceRoot)
172
- return undefined;
173
- const casReader = hitlDir && storage ? createSidecarTouchedReader(hitlDir) : undefined;
174
- if (gitWorkspace) {
175
- if (!baselineTree)
176
- return undefined;
177
- const git = createGitProgressSubstrate({
178
- workspaceRoot,
179
- executionId,
180
- baselineTree,
181
- excludePaths: CURSOR_RUNNER_OWNED_PATHS,
182
- });
183
- return casReader
184
- ? createHybridProgressSubstrate(git, createCasProgressSubstrate({ workspaceRoot, read: casReader }))
185
- : git;
186
- }
187
- // Non-git: every tool-mediated write is CAS-staged; there is no git slice.
188
- return casReader ? createCasProgressSubstrate({ workspaceRoot, read: casReader }) : undefined;
189
- }
190
- /**
191
- * A {@link CasTouchedReader} over the Cursor hook's on-disk sidecar. Each capture
192
- * reads the current observations ({@link readCasObservations}) and maps them to
193
- * the substrate's snapshot shape. Reads are bounded by the caller's capture floor
194
- * (default 2s), and the sidecar is small (one small marker + before-blob per
195
- * touched gitignored path), so re-reading per capture is cheap and always
196
- * reflects sub-agent writes staged since the last one.
197
- */
198
- function createSidecarTouchedReader(hitlDir) {
199
- return async () => {
200
- const { captured, secretPaths } = await readCasObservations(hitlDir);
201
- const before = new Map();
202
- for (const c of captured)
203
- before.set(c.path, c.before);
204
- return { before, blockedSecretPaths: new Set(secretPaths) };
205
- };
206
- }
207
- /**
208
- * Compose this turn's CAS captures from the sidecar the hook staged, mirroring
209
- * deep-agent's `buildCasTurnCaptures`: for each non-secret observed path, the
210
- * before-bytes come from the sidecar and the after-bytes are re-read from disk now
211
- * (`null` = the file was removed after the write). Secret-blocked paths are
212
- * returned as `unreviewablePaths`. The secret partition is re-run as a
213
- * fail-closed backstop over the observed set. `captureClass` labels each captured
214
- * path's provenance (GIT_IGNORED_CAPTURED for a git tree's ignored paths,
215
- * NON_GIT_CAS for a non-git workspace).
216
- *
217
- * Returns empty when the harness has no storage (captureIgnored off) or the
218
- * sidecar is empty — leaving the shared capture unchanged.
219
- */
220
- async function buildCasTurnCaptures(gitRoot, hitlDir, storage, captureClass) {
221
- if (!hitlDir || !storage)
222
- return { casCaptures: [], unreviewablePaths: [] };
223
- const { captured, secretPaths } = await readCasObservations(hitlDir);
224
- const beforeByPath = new Map(captured.map((c) => [c.path, c.before]));
225
- const { capturablePaths, unreviewablePaths } = partitionIgnoredPathsBySecret(beforeByPath.keys(), new Set(secretPaths));
226
- const casCaptures = [];
227
- for (const relPath of capturablePaths) {
228
- const after = await readFileOrNull(join(gitRoot, relPath));
229
- casCaptures.push({
230
- path: relPath,
231
- before: beforeByPath.get(relPath) ?? null,
232
- after,
233
- captureClass,
234
- });
235
- }
236
- return { casCaptures, unreviewablePaths: [...unreviewablePaths] };
237
- }
238
- /** Raw bytes of a file, or `null` when it does not exist (an ADD-then-removed). */
239
- async function readFileOrNull(absolutePath) {
240
- try {
241
- return await readFile(absolutePath);
242
- }
243
- catch {
244
- return null;
245
- }
246
- }
247
- // ---------------------------------------------------------------------------
248
- // Cursor-specific presentation
249
- // ---------------------------------------------------------------------------
250
- /**
251
- * Stamp every streamed file-edit row (category write/delete) that flowed this
252
- * turn with the change set id, so the row stays visible as an observational
253
- * record and clients can badge it / anchor the decision surface. Skips:
254
- * - already-stamped rows — the stamp is the idempotency AND cross-turn guard:
255
- * a resume seeds prior turns' rows into this transcript, and re-stamping
256
- * them with this turn's id would mis-attribute them ({@link stampFileEditRow});
257
- * - legacy hidden rows (sessions persisted before stamping existed) — they
258
- * belong to an earlier turn's change set, not this one;
259
- * - denied identities (the deny-gate reconcile path owns those rows);
260
- * - tool-call ids in `skipToolCallIds` — used for sub-agent rows, which lack
261
- * the already-stamped/hidden shields the top-level transcript has, to scope
262
- * the stamp to rows created this turn (the seeded prior sub-agents' ids).
263
- */
264
- function stampFlowedFileEditRows(messages, deniedTokens, changeSetId, skipToolCallIds) {
265
- for (const msg of messages) {
266
- for (const tc of msg.toolCalls) {
267
- if (tc.fileChangeSetId)
268
- continue;
269
- if (skipToolCallIds?.has(tc.id))
270
- continue;
271
- if (isToolCallRowHidden(tc))
272
- continue;
273
- const category = approvalCategory(tc.name);
274
- if (category !== "write" && category !== "delete")
275
- continue;
276
- const args = (tc.args ?? {});
277
- const id = toolIdentity(tc.name, tc.mcpServerSlug, args);
278
- const token = primaryToken(id.key, id.salient, contentDigest(args));
279
- if (deniedTokens.has(token))
280
- continue; // denied -> reconcile path owns it
281
- stampFileEditRow(tc, changeSetId);
282
- }
283
- }
284
- }
285
- //# sourceMappingURL=capture-flow.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"capture-flow.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/capture-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EACL,uBAAuB,IAAI,6BAA6B,EACxD,wBAAwB,IAAI,8BAA8B,GAC3D,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,GAE9B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,0BAA0B,GAG3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAC;AAMxF,oFAAoF;AACpF,MAAM,UAAU,GAAG,QAAQ,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,yBAAyB,GAAsB;IACnD,oBAAoB;IACpB,yCAAyC;CAC1C,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAuB;IAC7D,SAAS,EAAE,UAAU;IACrB,YAAY,EAAE,yBAAyB;CACxC,CAAC;AAEF,iFAAiF;AACjF,mFAAmF;AACnF,gFAAgF;AAChF,qBAAqB;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAOvC;IACC,OAAO,6BAA6B,CAAC;QACnC,GAAG,IAAI;QACP,SAAS,EAAE,UAAU;QACrB,YAAY,EAAE,yBAAyB;KACxC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IA+BzC;IACC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC;IAChK,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC;IAE/C,+EAA+E;IAC/E,sDAAsD;IACtD,MAAM,eAAe,GAAG,YAAY;QAClC,CAAC,CAAC,gBAAgB,CAAC,oBAAoB;QACvC,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAC;IACjC,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,MAAM,oBAAoB,CACnE,OAAO,EACP,OAAO,EACP,OAAO,EACP,eAAe,CAChB,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,8BAA8B,CAAC;QACnD,MAAM;QACN,OAAO;QACP,WAAW;QACX,WAAW;QACX,YAAY;QACZ,SAAS,EAAE,UAAU;QACrB,YAAY,EAAE,yBAAyB;QACvC,WAAW;QACX,OAAO;QACP,iBAAiB;QACjB,wBAAwB,EAAE,eAAe;QACzC,YAAY;QACZ,iBAAiB;KAClB,CAAC,CAAC;IAEH,0EAA0E;IAC1E,2EAA2E;IAC3E,6EAA6E;IAC7E,yEAAyE;IACzE,2EAA2E;IAC3E,2EAA2E;IAC3E,mEAAmE;IACnE,IAAI,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;QAC9C,uBAAuB,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QAC7D,8EAA8E;QAC9E,mEAAmE;QACnE,4EAA4E;QAC5E,+DAA+D;QAC/D,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC3C,uBAAuB,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,wBAAwB,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAQ5C;IACC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACvG,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IAErD,MAAM,SAAS,GACb,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvE,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC,YAAY;YAAE,OAAO,SAAS,CAAC;QACpC,MAAM,GAAG,GAAG,0BAA0B,CAAC;YACrC,aAAa;YACb,WAAW;YACX,YAAY;YACZ,YAAY,EAAE,yBAAyB;SACxC,CAAC,CAAC;QACH,OAAO,SAAS;YACd,CAAC,CAAC,6BAA6B,CAAC,GAAG,EAAE,0BAA0B,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACpG,CAAC,CAAC,GAAG,CAAC;IACV,CAAC;IAED,2EAA2E;IAC3E,OAAO,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAChG,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,0BAA0B,CAAC,OAAe;IACjD,OAAO,KAAK,IAAiC,EAAE;QAC7C,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;IAC9D,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,oBAAoB,CACjC,OAAe,EACf,OAA2B,EAC3B,OAAoC,EACpC,YAA8B;IAE9B,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;IAE5E,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAU,CAAC,CAAC,CAAC;IAC/E,MAAM,EAAE,eAAe,EAAE,iBAAiB,EAAE,GAAG,6BAA6B,CAC1E,YAAY,CAAC,IAAI,EAAE,EACnB,IAAI,GAAG,CAAC,WAAW,CAAC,CACrB,CAAC;IAEF,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3D,WAAW,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;YACzC,KAAK;YACL,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,mFAAmF;AACnF,KAAK,UAAU,cAAc,CAAC,YAAoB;IAChD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E;;;;;;;;;;;;;GAaG;AACH,SAAS,uBAAuB,CAC9B,QAAiC,EACjC,YAAiC,EACjC,WAAmB,EACnB,eAAqC;IAErC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAC/B,IAAI,EAAE,CAAC,eAAe;gBAAE,SAAS;YACjC,IAAI,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAAE,SAAS;YAC1C,IAAI,mBAAmB,CAAC,EAAE,CAAC;gBAAE,SAAS;YACtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ;gBAAE,SAAS;YAC5D,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;YACxD,MAAM,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YACpE,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,SAAS,CAAC,mCAAmC;YAC1E,gBAAgB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,48 +0,0 @@
1
- /**
2
- * Approved-command turn provenance (DD-28) — the CURSOR harness adapter over the
3
- * shared qualification rule ({@link qualifyTurnCommandProvenance}).
4
- *
5
- * The Cursor harness scopes a turn POSITIONALLY (messages from the turn's first
6
- * streamed index onward) and maps an executed command to its consent row through
7
- * the reinvocation grant tokens the deny-gate minted. Both mappings are Cursor's
8
- * own; the DD-28 rule they feed lives in `shared/filereview/command-provenance.ts`
9
- * so the Cursor and deep-agent qualifications cannot drift.
10
- *
11
- * (Trust boundary + fail-closed contract: see the shared module.)
12
- */
13
- import type { AgentMessage } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
14
- import type { TurnCommandProvenance } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
15
- export interface CommandProvenanceInputs {
16
- /**
17
- * The full transcript at capture time. Turn scoping is positional: messages
18
- * from index {@link turnStartIndex} onward were produced by THIS turn's
19
- * stream; everything before was seeded from prior turns. Lease consent rows
20
- * (APPROVE_ALL) are looked up across the WHOLE transcript — a lease is
21
- * run-lifetime, its granting row usually lives in a prior turn.
22
- */
23
- readonly messages: readonly AgentMessage[];
24
- /** Index of the first message created by this turn's stream. */
25
- readonly turnStartIndex: number;
26
- /**
27
- * Identity tokens the hook denied THIS turn (the denial ledger). A denied
28
- * shell row never executed — it is this turn's pending gate, not a mutation
29
- * source — so it neither needs consent nor disqualifies.
30
- */
31
- readonly deniedTokens: ReadonlySet<string>;
32
- /**
33
- * Grant token → the tool-call id of the approval row that minted the grant
34
- * (the row carrying the server-authored approval_action). An executed shell
35
- * command whose identity token is a key here was authorized by that
36
- * per-command approval.
37
- */
38
- readonly grantTokenToConsentId: ReadonlyMap<string, string>;
39
- /** True when the pre-armed spec.auto_approve_all bypassed the gate. */
40
- readonly globalBypass: boolean;
41
- }
42
- /**
43
- * Derive the {@link TurnCommandProvenance} for the turn, or undefined when the
44
- * turn does not qualify. Scopes this turn's tool calls positionally, resolves
45
- * consent through the deny-gate grant tokens, and delegates the DD-28 rule to
46
- * {@link qualifyTurnCommandProvenance}.
47
- */
48
- export declare function deriveTurnCommandProvenance(inputs: CommandProvenanceInputs): TurnCommandProvenance | undefined;
@@ -1,38 +0,0 @@
1
- /**
2
- * Approved-command turn provenance (DD-28) — the CURSOR harness adapter over the
3
- * shared qualification rule ({@link qualifyTurnCommandProvenance}).
4
- *
5
- * The Cursor harness scopes a turn POSITIONALLY (messages from the turn's first
6
- * streamed index onward) and maps an executed command to its consent row through
7
- * the reinvocation grant tokens the deny-gate minted. Both mappings are Cursor's
8
- * own; the DD-28 rule they feed lives in `shared/filereview/command-provenance.ts`
9
- * so the Cursor and deep-agent qualifications cannot drift.
10
- *
11
- * (Trust boundary + fail-closed contract: see the shared module.)
12
- */
13
- import { qualifyTurnCommandProvenance } from "../../shared/filereview/command-provenance.js";
14
- import { toolCallIdentityToken } from "./message-translator.js";
15
- /**
16
- * Derive the {@link TurnCommandProvenance} for the turn, or undefined when the
17
- * turn does not qualify. Scopes this turn's tool calls positionally, resolves
18
- * consent through the deny-gate grant tokens, and delegates the DD-28 rule to
19
- * {@link qualifyTurnCommandProvenance}.
20
- */
21
- export function deriveTurnCommandProvenance(inputs) {
22
- const { messages, turnStartIndex, deniedTokens, grantTokenToConsentId, globalBypass } = inputs;
23
- // This turn's tool calls are the positional tail from the first message this
24
- // turn's stream produced; everything before was seeded from prior turns.
25
- const turnToolCalls = messages.slice(turnStartIndex).flatMap((m) => m.toolCalls);
26
- return qualifyTurnCommandProvenance({
27
- turnToolCalls,
28
- messages,
29
- // A shell whose identity token is in the denial ledger was denied by the
30
- // hook — this turn's pending gate, never executed.
31
- isExecutedCommand: (tc) => !deniedTokens.has(toolCallIdentityToken(tc)),
32
- // A grant token maps back to the consent row (the row carrying the
33
- // server-authored approval_action) that authorized this reinvocation.
34
- resolveDirectConsent: (tc) => grantTokenToConsentId.get(toolCallIdentityToken(tc)),
35
- globalBypass,
36
- });
37
- }
38
- //# sourceMappingURL=command-provenance.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-provenance.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/command-provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AA8BhE;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAA+B;IAE/B,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAE/F,6EAA6E;IAC7E,yEAAyE;IACzE,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEjF,OAAO,4BAA4B,CAAC;QAClC,aAAa;QACb,QAAQ;QACR,yEAAyE;QACzE,mDAAmD;QACnD,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACvE,mEAAmE;QACnE,sEAAsE;QACtE,oBAAoB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAClF,YAAY;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -1,134 +0,0 @@
1
- /**
2
- * Attachment injection for deep agent execution.
3
- *
4
- * Downloads attachments from artifact storage (cloud) or local filesystem,
5
- * validates ZIP archives with security guards, and writes files into the
6
- * workspace via the platform mount namespace (.stigmer/inputs/).
7
- *
8
- * Security model: attachments are untrusted user uploads. ZIP archives are
9
- * parsed from the central directory — the format's authoritative index —
10
- * via the shared structural layer (@stigmer/zip-structure; issue #567,
11
- * which killed this module's local-header walk: it silently truncated
12
- * stored streaming entries and rejected Go-default archives outright).
13
- * Every entry is validated for path traversal, zip bombs, and format
14
- * integrity BEFORE any extraction occurs, and because the central
15
- * directory's sizes are declarations an attacker controls, decompression
16
- * re-enforces them: an entry whose actual output disagrees with its
17
- * declared size aborts the injection.
18
- *
19
- * Error model: fail-hard. Any attachment failure aborts the entire injection
20
- * and propagates a descriptive error. Attachments are explicit user inputs —
21
- * running with partial inputs produces silently incorrect results. This is
22
- * deliberately the OPPOSITE policy from the skill-artifact reader
23
- * (shared/zip-extract.ts, non-fatal empty return): skill artifacts were
24
- * structurally vouched for by the push gates, attachments never are.
25
- *
26
- * Duplicate names are NOT a failure (issue #364): a default-derived mount
27
- * path that collides is renamed with the platform's `stem-2.ext` semantics
28
- * (shared/attachment-naming.ts) and the rename is disclosed in the prompt's
29
- * Input Files section. Only two attachments EXPLICITLY pinning the same
30
- * `mountPath` still abort — that is a user contradiction no rename can
31
- * honestly resolve.
32
- */
33
- import type { Attachment } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/spec_pb";
34
- import type { WorkspaceBackend } from "../../shared/workspace/types.js";
35
- import type { ArtifactStorage } from "../../shared/artifact-storage.js";
36
- import type { VisionBudget, VisionDegradedReason, VisionImage } from "../../shared/attachment-vision.js";
37
- declare const MAX_ZIP_FILES = 1000;
38
- declare const MAX_ZIP_EXTRACTED_SIZE: number;
39
- export { MAX_ZIP_FILES, MAX_ZIP_EXTRACTED_SIZE };
40
- export interface InjectedFile {
41
- /** The final on-disk basename — after any duplicate rename, so it always
42
- * agrees with {@link path} and with the vision payload's image label. */
43
- readonly filename: string;
44
- readonly path: string;
45
- readonly sizeBytes: number;
46
- /**
47
- * The attachment's original filename, present only when a duplicate name
48
- * was renamed (shared/attachment-naming.ts) — rendered as disclosure in
49
- * the prompt's Input Files section.
50
- */
51
- readonly renamedFrom?: string;
52
- /** Present when the attachment was accepted into the turn's vision payload. */
53
- readonly vision?: VisionImage;
54
- /**
55
- * Present when the attachment was plausibly an image but could not ride
56
- * inline (see {@link VisionDegradedReason}) — disclosed in the system prompt
57
- * so the agent never silently ignores a photo the user believes it can see.
58
- * Attachments that were never image-shaped carry neither field.
59
- */
60
- readonly visionDegraded?: VisionDegradedReason;
61
- /**
62
- * A download URL for the attachment's stored object, listed in the system
63
- * prompt's Input Files section so the agent can hand the file to a tool
64
- * whose backend cannot read the sandbox filesystem (issue #532). Minted
65
- * whenever the attachment has a `storageKey` and a usable storage; never
66
- * present on extracted ZIP entries (no attachment-level object). Absent
67
- * when there is nothing to mint or the mint failed (non-fatal — policy,
68
- * degrade log, and prompt wording live in
69
- * shared/attachment-download-urls.ts).
70
- */
71
- readonly downloadUrl?: string;
72
- }
73
- export interface InjectAttachmentsOptions {
74
- readonly backend: WorkspaceBackend;
75
- readonly attachments: readonly Attachment[];
76
- /**
77
- * Artifact storage for cloud-mode attachment download. `undefined` when the
78
- * runner could not build a store (proxy misconfig). With no attachments this is
79
- * never touched (the function early-returns); a cloud-mode attachment that
80
- * genuinely needs storage surfaces a clear {@link AttachmentInjectionError}
81
- * rather than dereferencing undefined.
82
- */
83
- readonly storage: ArtifactStorage | undefined;
84
- readonly isLocalMode: boolean;
85
- /**
86
- * The turn's vision selector (attachment-vision.ts owns all policy).
87
- * `undefined` disables inline image delivery; file materialization is
88
- * identical either way — vision is strictly additive. Archives (`extract`)
89
- * are never offered: an image inside a ZIP has no attachment-level bytes.
90
- */
91
- readonly visionBudget?: VisionBudget;
92
- }
93
- export interface ZipEntryInfo {
94
- readonly relativePath: string;
95
- readonly uncompressedSize: number;
96
- }
97
- export declare class AttachmentInjectionError extends Error {
98
- readonly attachmentFilename: string;
99
- readonly reason: string;
100
- constructor(attachmentFilename: string, reason: string);
101
- }
102
- export declare class AttachmentValidationError extends Error {
103
- readonly attachmentFilename: string;
104
- readonly reason: string;
105
- constructor(attachmentFilename: string, reason: string);
106
- }
107
- /**
108
- * Validate a ZIP archive for safe extraction. Returns the manifest of
109
- * file entries (directories excluded) if the archive passes all checks.
110
- *
111
- * Security checks enforced:
112
- * 1. Valid ZIP format (readable central directory; fail-hard, see module doc)
113
- * 2. No absolute paths (entries starting with / or \)
114
- * 3. No path traversal (.. components)
115
- * 4. No null bytes in filenames
116
- * 5. No duplicate entry paths (a contradictory manifest)
117
- * 6. Only supported compression methods (stored, deflate) — checked here
118
- * so an unsupported entry can never abort extraction after earlier
119
- * entries were already written
120
- * 7. Non-empty archive (at least one file entry)
121
- * 8. File count within limits (max 1000)
122
- * 9. Total declared uncompressed size within limits (max 100 MB) —
123
- * declarations are re-enforced against actual output at decompression
124
- */
125
- export declare function validateZipForExtraction(zipData: Buffer, sourceFilename: string): ZipEntryInfo[];
126
- /**
127
- * Download, validate, and inject all attachments into the workspace.
128
- *
129
- * Resolves all mount paths before any downloads begin: duplicate
130
- * default-derived names are renamed (never fatal — see module doc), and an
131
- * explicit-mountPath contradiction throws before any bytes move.
132
- * On any failure, throws AttachmentInjectionError with an actionable message.
133
- */
134
- export declare function injectAttachments(opts: InjectAttachmentsOptions): Promise<InjectedFile[]>;