@stigmer/runner 3.15.1 → 3.15.2-dev.20260913223433

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/README.md +2 -4
  2. package/dist/.build-fingerprint +1 -1
  3. package/dist/__test-utils__/execution-record-fixture.d.ts +14 -0
  4. package/dist/__test-utils__/execution-record-fixture.js +4 -0
  5. package/dist/__test-utils__/execution-record-fixture.js.map +1 -1
  6. package/dist/__test-utils__/file-review-projection.d.ts +40 -0
  7. package/dist/__test-utils__/file-review-projection.js +136 -0
  8. package/dist/__test-utils__/file-review-projection.js.map +1 -0
  9. package/dist/__test-utils__/harness-contract/types.d.ts +23 -1
  10. package/dist/__test-utils__/harness-contract/types.js +15 -0
  11. package/dist/__test-utils__/harness-contract/types.js.map +1 -1
  12. package/dist/__test-utils__/hermetic-activity.d.ts +44 -12
  13. package/dist/__test-utils__/hermetic-activity.js +52 -14
  14. package/dist/__test-utils__/hermetic-activity.js.map +1 -1
  15. package/dist/__test-utils__/model-registry-fixture.d.ts +32 -7
  16. package/dist/__test-utils__/model-registry-fixture.js +31 -7
  17. package/dist/__test-utils__/model-registry-fixture.js.map +1 -1
  18. package/dist/__test-utils__/turn-input-fixture.d.ts +1 -1
  19. package/dist/__test-utils__/turn-input-fixture.js +1 -1
  20. package/dist/__test-utils__/turn-input-fixture.js.map +1 -1
  21. package/dist/activities/call-agent.js +2 -2
  22. package/dist/activities/call-agent.js.map +1 -1
  23. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +45 -3
  24. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -1
  25. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +0 -9
  26. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +2 -41
  27. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
  28. package/dist/activities/execute-cursor/adapter.d.ts +7 -5
  29. package/dist/activities/execute-cursor/adapter.js +7 -5
  30. package/dist/activities/execute-cursor/adapter.js.map +1 -1
  31. package/dist/activities/execute-cursor/approval-policy.d.ts +5 -2
  32. package/dist/activities/execute-cursor/approval-policy.js +5 -2
  33. package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
  34. package/dist/activities/execute-cursor/approval-state.d.ts +16 -8
  35. package/dist/activities/execute-cursor/approval-state.js +6 -3
  36. package/dist/activities/execute-cursor/approval-state.js.map +1 -1
  37. package/dist/activities/execute-cursor/cas-observations.d.ts +14 -2
  38. package/dist/activities/execute-cursor/cas-observations.js +19 -2
  39. package/dist/activities/execute-cursor/cas-observations.js.map +1 -1
  40. package/dist/activities/execute-cursor/cursor-capabilities.d.ts +8 -4
  41. package/dist/activities/execute-cursor/cursor-capabilities.js +21 -4
  42. package/dist/activities/execute-cursor/cursor-capabilities.js.map +1 -1
  43. package/dist/activities/execute-cursor/message-translator.d.ts +12 -20
  44. package/dist/activities/execute-cursor/message-translator.js +19 -32
  45. package/dist/activities/execute-cursor/message-translator.js.map +1 -1
  46. package/dist/activities/execute-cursor/prompt-builder.d.ts +48 -58
  47. package/dist/activities/execute-cursor/prompt-builder.js +76 -95
  48. package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
  49. package/dist/activities/execute-cursor/turn-boundary.d.ts +27 -55
  50. package/dist/activities/execute-cursor/turn-boundary.js +30 -90
  51. package/dist/activities/execute-cursor/turn-boundary.js.map +1 -1
  52. package/dist/activities/execute-cursor/turn-settle.d.ts +11 -7
  53. package/dist/activities/execute-cursor/turn-settle.js +37 -49
  54. package/dist/activities/execute-cursor/turn-settle.js.map +1 -1
  55. package/dist/activities/execute-cursor/turn-setup.d.ts +16 -24
  56. package/dist/activities/execute-cursor/turn-setup.js +29 -59
  57. package/dist/activities/execute-cursor/turn-setup.js.map +1 -1
  58. package/dist/activities/execute-cursor/turn-stream.d.ts +3 -8
  59. package/dist/activities/execute-cursor/turn-stream.js +9 -22
  60. package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
  61. package/dist/activities/execute-cursor/turn.js +5 -1
  62. package/dist/activities/execute-cursor/turn.js.map +1 -1
  63. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.d.ts +93 -0
  64. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js +348 -0
  65. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js.map +1 -0
  66. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +170 -0
  67. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +225 -0
  68. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -0
  69. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.d.ts +24 -0
  70. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js +41 -0
  71. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js.map +1 -0
  72. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.d.ts +54 -0
  73. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js +72 -0
  74. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js.map +1 -0
  75. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +187 -23
  76. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +238 -27
  77. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
  78. package/dist/activities/execute-deep-agent/adapter.d.ts +41 -0
  79. package/dist/activities/execute-deep-agent/adapter.js +78 -0
  80. package/dist/activities/execute-deep-agent/adapter.js.map +1 -0
  81. package/dist/activities/execute-deep-agent/cas-capture-observer.d.ts +8 -0
  82. package/dist/activities/execute-deep-agent/cas-capture-observer.js +9 -0
  83. package/dist/activities/execute-deep-agent/cas-capture-observer.js.map +1 -1
  84. package/dist/activities/execute-deep-agent/deep-agent-capabilities.d.ts +31 -0
  85. package/dist/activities/execute-deep-agent/deep-agent-capabilities.js +40 -0
  86. package/dist/activities/execute-deep-agent/deep-agent-capabilities.js.map +1 -0
  87. package/dist/activities/execute-deep-agent/execution-state.d.ts +4 -11
  88. package/dist/activities/execute-deep-agent/execution-state.js +4 -12
  89. package/dist/activities/execute-deep-agent/execution-state.js.map +1 -1
  90. package/dist/activities/execute-deep-agent/hitl.d.ts +49 -47
  91. package/dist/activities/execute-deep-agent/hitl.js +77 -103
  92. package/dist/activities/execute-deep-agent/hitl.js.map +1 -1
  93. package/dist/activities/execute-deep-agent/prompt-builder.d.ts +51 -23
  94. package/dist/activities/execute-deep-agent/prompt-builder.js +115 -76
  95. package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
  96. package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +18 -32
  97. package/dist/activities/execute-deep-agent/status-builder-shared.js +10 -65
  98. package/dist/activities/execute-deep-agent/status-builder-shared.js.map +1 -1
  99. package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +10 -8
  100. package/dist/activities/execute-deep-agent/streaming-side-effects.js +12 -14
  101. package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
  102. package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +36 -13
  103. package/dist/activities/execute-deep-agent/subagent-tracker.js +76 -39
  104. package/dist/activities/execute-deep-agent/subagent-tracker.js.map +1 -1
  105. package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +25 -28
  106. package/dist/activities/execute-deep-agent/subagent-transformer.js +29 -82
  107. package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
  108. package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +3 -2
  109. package/dist/activities/execute-deep-agent/subagent-wiring.js +2 -2
  110. package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -1
  111. package/dist/activities/execute-deep-agent/turn-settle.d.ts +42 -0
  112. package/dist/activities/execute-deep-agent/turn-settle.js +146 -0
  113. package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -0
  114. package/dist/activities/execute-deep-agent/turn-setup.d.ts +212 -0
  115. package/dist/activities/execute-deep-agent/turn-setup.js +430 -0
  116. package/dist/activities/execute-deep-agent/turn-setup.js.map +1 -0
  117. package/dist/activities/execute-deep-agent/turn-stream.d.ts +97 -0
  118. package/dist/activities/execute-deep-agent/turn-stream.js +242 -0
  119. package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -0
  120. package/dist/activities/execute-deep-agent/turn.d.ts +42 -0
  121. package/dist/activities/execute-deep-agent/turn.js +116 -0
  122. package/dist/activities/execute-deep-agent/turn.js.map +1 -0
  123. package/dist/activities/execute-deep-agent/v3-event-recorder.d.ts +6 -5
  124. package/dist/activities/execute-deep-agent/v3-event-recorder.js +6 -5
  125. package/dist/activities/execute-deep-agent/v3-event-recorder.js.map +1 -1
  126. package/dist/activities/execute-deep-agent/v3-events.d.ts +1 -1
  127. package/dist/activities/execute-deep-agent/v3-events.js +1 -1
  128. package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +60 -17
  129. package/dist/activities/execute-deep-agent/v3-status-builder.js +72 -57
  130. package/dist/activities/execute-deep-agent/v3-status-builder.js.map +1 -1
  131. package/dist/harness/approval-decisions.d.ts +61 -0
  132. package/dist/harness/approval-decisions.js +102 -0
  133. package/dist/harness/approval-decisions.js.map +1 -0
  134. package/dist/harness/capabilities.d.ts +16 -5
  135. package/dist/harness/capabilities.js +9 -0
  136. package/dist/harness/capabilities.js.map +1 -1
  137. package/dist/harness/capture.d.ts +144 -0
  138. package/dist/harness/capture.js +219 -0
  139. package/dist/harness/capture.js.map +1 -0
  140. package/dist/harness/persist-chokepoint.d.ts +19 -4
  141. package/dist/harness/persist-chokepoint.js +17 -4
  142. package/dist/harness/persist-chokepoint.js.map +1 -1
  143. package/dist/harness/run-turn.js +115 -29
  144. package/dist/harness/run-turn.js.map +1 -1
  145. package/dist/harness/terminal-table.d.ts +40 -11
  146. package/dist/harness/terminal-table.js +58 -19
  147. package/dist/harness/terminal-table.js.map +1 -1
  148. package/dist/harness/turn-context.d.ts +141 -76
  149. package/dist/harness/turn-context.js +194 -99
  150. package/dist/harness/turn-context.js.map +1 -1
  151. package/dist/harness/types.d.ts +65 -12
  152. package/dist/harness/types.js +8 -2
  153. package/dist/harness/types.js.map +1 -1
  154. package/dist/harness-adapters.d.ts +12 -8
  155. package/dist/harness-adapters.js +17 -9
  156. package/dist/harness-adapters.js.map +1 -1
  157. package/dist/middleware/approval-gate.d.ts +1 -1
  158. package/dist/middleware/approval-gate.js +1 -1
  159. package/dist/middleware/approval-gate.js.map +1 -1
  160. package/dist/middleware/cost-advisory.d.ts +39 -0
  161. package/dist/middleware/{cost-cap.js → cost-advisory.js} +37 -55
  162. package/dist/middleware/cost-advisory.js.map +1 -0
  163. package/dist/middleware/index.d.ts +23 -12
  164. package/dist/middleware/index.js +26 -18
  165. package/dist/middleware/index.js.map +1 -1
  166. package/dist/middleware/types.d.ts +3 -2
  167. package/dist/runner-manager.js +1 -5
  168. package/dist/runner-manager.js.map +1 -1
  169. package/dist/runner.js +1 -5
  170. package/dist/runner.js.map +1 -1
  171. package/dist/shared/attachment-resolver.d.ts +41 -18
  172. package/dist/shared/attachment-resolver.js +178 -46
  173. package/dist/shared/attachment-resolver.js.map +1 -1
  174. package/dist/shared/attachment-zip.d.ts +85 -0
  175. package/dist/shared/attachment-zip.js +185 -0
  176. package/dist/shared/attachment-zip.js.map +1 -0
  177. package/dist/shared/connect-backfill.js +5 -4
  178. package/dist/shared/connect-backfill.js.map +1 -1
  179. package/dist/shared/cost-guard.d.ts +3 -3
  180. package/dist/shared/cost-guard.js +3 -3
  181. package/dist/shared/execution-status-writer.d.ts +5 -5
  182. package/dist/shared/execution-status-writer.js +5 -5
  183. package/dist/shared/extract-structured-output.d.ts +8 -7
  184. package/dist/shared/extract-structured-output.js +8 -7
  185. package/dist/shared/extract-structured-output.js.map +1 -1
  186. package/dist/shared/filereview/cas-progress.d.ts +1 -18
  187. package/dist/shared/filereview/cas-progress.js +4 -0
  188. package/dist/shared/filereview/cas-progress.js.map +1 -1
  189. package/dist/shared/filereview/cas-touched.d.ts +56 -0
  190. package/dist/shared/filereview/cas-touched.js +63 -0
  191. package/dist/shared/filereview/cas-touched.js.map +1 -0
  192. package/dist/shared/filereview/index.d.ts +2 -1
  193. package/dist/shared/filereview/index.js +2 -1
  194. package/dist/shared/filereview/index.js.map +1 -1
  195. package/dist/shared/mcp-resolver.d.ts +4 -5
  196. package/dist/shared/mcp-resolver.js +4 -5
  197. package/dist/shared/mcp-resolver.js.map +1 -1
  198. package/dist/shared/persist-decision.d.ts +3 -4
  199. package/dist/shared/persist-decision.js +3 -4
  200. package/dist/shared/persist-decision.js.map +1 -1
  201. package/dist/shared/plan-mode-permissions.d.ts +2 -2
  202. package/dist/shared/plan-mode-permissions.js +2 -2
  203. package/dist/shared/plan-mode-prompt.d.ts +1 -1
  204. package/dist/shared/plan-mode-prompt.js +1 -1
  205. package/dist/shared/prompt-sections.d.ts +163 -0
  206. package/dist/shared/prompt-sections.js +164 -0
  207. package/dist/shared/prompt-sections.js.map +1 -0
  208. package/dist/shared/skill-resolver.d.ts +4 -2
  209. package/dist/shared/skill-resolver.js +4 -2
  210. package/dist/shared/skill-resolver.js.map +1 -1
  211. package/dist/shared/tool-rounds.d.ts +32 -0
  212. package/dist/shared/tool-rounds.js +43 -0
  213. package/dist/shared/tool-rounds.js.map +1 -1
  214. package/dist/shared/tool-row.d.ts +34 -0
  215. package/dist/shared/tool-row.js +52 -0
  216. package/dist/shared/tool-row.js.map +1 -1
  217. package/dist/shared/workspace/session-provision.d.ts +3 -3
  218. package/dist/shared/workspace/session-provision.js +3 -3
  219. package/dist/shared/workspace/stigmer-link.d.ts +3 -3
  220. package/dist/shared/workspace/stigmer-link.js +3 -3
  221. package/dist/shared/workspace/writeback-coordinator.d.ts +15 -22
  222. package/dist/shared/workspace/writeback-coordinator.js +16 -53
  223. package/dist/shared/workspace/writeback-coordinator.js.map +1 -1
  224. package/dist/tools/index.d.ts +1 -1
  225. package/dist/tools/index.js +1 -1
  226. package/package.json +4 -4
  227. package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +1 -0
  228. package/src/__test-utils__/execution-record-fixture.ts +18 -2
  229. package/src/__test-utils__/file-review-projection.ts +156 -0
  230. package/src/__test-utils__/git-workspace-fixture.ts +58 -0
  231. package/src/__test-utils__/harness-boot-order-child.ts +7 -2
  232. package/src/__test-utils__/harness-contract/contract.ts +33 -20
  233. package/src/__test-utils__/harness-contract/recording-sink.ts +11 -1
  234. package/src/__test-utils__/harness-contract/runtime-contract.ts +328 -10
  235. package/src/__test-utils__/harness-contract/scripted-adapter.ts +38 -6
  236. package/src/__test-utils__/harness-contract/types.ts +27 -3
  237. package/src/__test-utils__/hermetic-activity.ts +52 -14
  238. package/src/__test-utils__/model-registry-fixture.ts +32 -7
  239. package/src/__test-utils__/module-specifiers.ts +24 -0
  240. package/src/__test-utils__/turn-input-fixture.ts +2 -2
  241. package/src/__tests__/harness-boot-order.test.ts +9 -2
  242. package/src/activities/call-agent.ts +2 -2
  243. package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +47 -3
  244. package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +2 -48
  245. package/src/activities/execute-cursor/__tests__/approval-decisions-agree.test.ts +1 -1
  246. package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +6 -1
  247. package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +52 -27
  248. package/src/activities/execute-cursor/__tests__/cas-observations.test.ts +25 -0
  249. package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.everything.prompt.md +166 -0
  250. package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.plan-mode.prompt.md +186 -0
  251. package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.recovery.prompt.md +191 -0
  252. package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.reinvocation.prompt.md +13 -0
  253. package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.prefixed.prompt.md +32 -0
  254. package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.raw.prompt.md +1 -0
  255. package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +1 -2
  256. package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-error-at-create.status.json +4 -0
  257. package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +24 -4
  258. package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +6 -5
  259. package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +9 -0
  260. package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +11 -8
  261. package/src/activities/execute-cursor/__tests__/prompt-goldens.test.ts +229 -0
  262. package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +3 -3
  263. package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +2 -2
  264. package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +78 -234
  265. package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +1 -26
  266. package/src/activities/execute-cursor/adapter.ts +7 -5
  267. package/src/activities/execute-cursor/approval-policy.ts +5 -2
  268. package/src/activities/execute-cursor/approval-state.ts +16 -8
  269. package/src/activities/execute-cursor/cas-observations.ts +20 -2
  270. package/src/activities/execute-cursor/cursor-capabilities.ts +24 -5
  271. package/src/activities/execute-cursor/message-translator.ts +29 -41
  272. package/src/activities/execute-cursor/prompt-builder.ts +99 -157
  273. package/src/activities/execute-cursor/turn-boundary.ts +34 -140
  274. package/src/activities/execute-cursor/turn-settle.ts +37 -51
  275. package/src/activities/execute-cursor/turn-setup.ts +30 -70
  276. package/src/activities/execute-cursor/turn-stream.ts +8 -31
  277. package/src/activities/execute-cursor/turn.ts +5 -1
  278. package/src/activities/execute-deep-agent/__test-utils__/contract-subject.ts +391 -0
  279. package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +313 -0
  280. package/src/activities/execute-deep-agent/__test-utils__/hitl-script.ts +48 -0
  281. package/src/activities/execute-deep-agent/__test-utils__/scripted-model-module.ts +85 -0
  282. package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +383 -36
  283. package/src/activities/execute-deep-agent/__tests__/adapter-graph-is-sdk-free.test.ts +76 -0
  284. package/src/activities/execute-deep-agent/__tests__/adapter-is-temporal-free.test.ts +47 -0
  285. package/src/activities/execute-deep-agent/__tests__/adapter.test.ts +80 -0
  286. package/src/activities/execute-deep-agent/__tests__/cas-capture-backend.test.ts +1 -1
  287. package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +0 -2
  288. package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +0 -3
  289. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.build-from-plan.prompt.md +172 -0
  290. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.everything.prompt.md +167 -0
  291. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.minimal.prompt.md +36 -0
  292. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.plan-mode.prompt.md +178 -0
  293. package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.skills-below-threshold.prompt.md +158 -0
  294. package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +210 -0
  295. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn1.status.json +74 -0
  296. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn2.status.json +104 -0
  297. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve.turn2.status.json +78 -0
  298. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +138 -0
  299. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/gate.turn1.status.json +68 -0
  300. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +154 -0
  301. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +116 -0
  302. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.after-tool.status.json +69 -0
  303. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.mid-tool.status.json +67 -0
  304. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/plain-turn.status.json +47 -0
  305. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/platform-stop.status.json +68 -0
  306. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +280 -0
  307. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/reject.turn2.status.json +77 -0
  308. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/resolution-error.status.json +18 -0
  309. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn2.status.json +99 -0
  310. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn3.status.json +109 -0
  311. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/skip.turn2.status.json +76 -0
  312. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.text-fallback.status.json +51 -0
  313. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tier2.status.json +51 -0
  314. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tool-strategy.status.json +56 -0
  315. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sub-agent-delegation.status.json +90 -0
  316. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/tool-call.status.json +70 -0
  317. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/worker-shutdown.status.json +71 -0
  318. package/src/activities/execute-deep-agent/__tests__/hermetic/harness-contract.test.ts +144 -0
  319. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-approve-all-lease.test.ts +184 -0
  320. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-round-trips.test.ts +203 -0
  321. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-sequential-gates.test.ts +170 -0
  322. package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +175 -0
  323. package/src/activities/execute-deep-agent/__tests__/hermetic/pause-vs-shutdown.test.ts +206 -0
  324. package/src/activities/execute-deep-agent/__tests__/hermetic/plain-turn.test.ts +142 -0
  325. package/src/activities/execute-deep-agent/__tests__/hermetic/platform-stop.test.ts +126 -0
  326. package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +139 -0
  327. package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +122 -0
  328. package/src/activities/execute-deep-agent/__tests__/hermetic/structured-output.test.ts +236 -0
  329. package/src/activities/execute-deep-agent/__tests__/hermetic/sub-agent-delegation.test.ts +161 -0
  330. package/src/activities/execute-deep-agent/__tests__/hermetic/tool-call.test.ts +157 -0
  331. package/src/activities/execute-deep-agent/__tests__/hermetic/workspace-lock-timeout.test.ts +152 -0
  332. package/src/activities/execute-deep-agent/__tests__/hitl.test.ts +50 -122
  333. package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +8 -6
  334. package/src/activities/execute-deep-agent/__tests__/plan-mode-path-normalization.test.ts +2 -2
  335. package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +35 -35
  336. package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +247 -0
  337. package/src/activities/execute-deep-agent/__tests__/scripted-model.test.ts +329 -0
  338. package/src/activities/execute-deep-agent/__tests__/status-builder-shared.test.ts +1 -20
  339. package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +78 -0
  340. package/src/activities/execute-deep-agent/__tests__/subagent-gitignored-capture.test.ts +1 -1
  341. package/src/activities/execute-deep-agent/__tests__/subagent-plan-mode-permissions.test.ts +2 -2
  342. package/src/activities/execute-deep-agent/__tests__/subagent-tracker.test.ts +57 -31
  343. package/src/activities/execute-deep-agent/__tests__/subagent-transformer.test.ts +19 -79
  344. package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +15 -15
  345. package/src/activities/execute-deep-agent/__tests__/summarization-verification.test.ts +1 -1
  346. package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +391 -0
  347. package/src/activities/execute-deep-agent/__tests__/v3-status-builder.test.ts +343 -38
  348. package/src/activities/execute-deep-agent/__tests__/vision-input.test.ts +5 -5
  349. package/src/activities/execute-deep-agent/adapter.ts +94 -0
  350. package/src/activities/execute-deep-agent/cas-capture-observer.ts +11 -0
  351. package/src/activities/execute-deep-agent/deep-agent-capabilities.ts +43 -0
  352. package/src/activities/execute-deep-agent/execution-state.ts +4 -13
  353. package/src/activities/execute-deep-agent/hitl.ts +100 -123
  354. package/src/activities/execute-deep-agent/prompt-builder.ts +141 -115
  355. package/src/activities/execute-deep-agent/status-builder-shared.ts +21 -84
  356. package/src/activities/execute-deep-agent/streaming-side-effects.ts +13 -19
  357. package/src/activities/execute-deep-agent/subagent-tracker.ts +77 -42
  358. package/src/activities/execute-deep-agent/subagent-transformer.ts +46 -105
  359. package/src/activities/execute-deep-agent/subagent-wiring.ts +5 -4
  360. package/src/activities/execute-deep-agent/turn-settle.ts +164 -0
  361. package/src/activities/execute-deep-agent/turn-setup.ts +541 -0
  362. package/src/activities/execute-deep-agent/turn-stream.ts +313 -0
  363. package/src/activities/execute-deep-agent/turn.ts +131 -0
  364. package/src/activities/execute-deep-agent/v3-event-recorder.ts +6 -5
  365. package/src/activities/execute-deep-agent/v3-events.ts +1 -1
  366. package/src/activities/execute-deep-agent/v3-status-builder.ts +84 -63
  367. package/src/harness/__tests__/approval-decisions.test.ts +116 -0
  368. package/src/harness/__tests__/capture.test.ts +268 -0
  369. package/src/harness/__tests__/mount-skills.test.ts +169 -0
  370. package/src/harness/__tests__/persist-chokepoint.test.ts +38 -2
  371. package/src/harness/__tests__/run-turn-deterministic.test.ts +94 -0
  372. package/src/harness/__tests__/run-turn.test.ts +39 -23
  373. package/src/harness/__tests__/turn-attachments-vision.test.ts +80 -0
  374. package/src/harness/__tests__/turn-context.test.ts +73 -26
  375. package/src/harness/approval-decisions.ts +104 -0
  376. package/src/harness/capabilities.ts +16 -5
  377. package/src/harness/capture.ts +301 -0
  378. package/src/harness/persist-chokepoint.ts +24 -4
  379. package/src/harness/run-turn.ts +120 -29
  380. package/src/harness/terminal-table.ts +61 -20
  381. package/src/harness/turn-context.ts +208 -111
  382. package/src/harness/types.ts +66 -12
  383. package/src/harness-adapters.ts +17 -9
  384. package/src/middleware/__tests__/approval-gate.test.ts +1 -1
  385. package/src/middleware/__tests__/cost-advisory.test.ts +113 -0
  386. package/src/middleware/approval-gate.ts +2 -2
  387. package/src/middleware/{cost-cap.ts → cost-advisory.ts} +40 -70
  388. package/src/middleware/index.ts +29 -29
  389. package/src/middleware/types.ts +3 -2
  390. package/src/runner-manager.ts +0 -8
  391. package/src/runner.ts +0 -8
  392. package/src/shared/__tests__/attachment-naming.test.ts +6 -19
  393. package/src/shared/__tests__/attachment-resolver.test.ts +158 -8
  394. package/src/shared/__tests__/attachment-zip.test.ts +236 -0
  395. package/src/shared/__tests__/bedrock-adapter.test.ts +1 -1
  396. package/src/shared/__tests__/blueprint-resolver.test.ts +43 -0
  397. package/src/shared/__tests__/cost-guard.test.ts +3 -3
  398. package/src/shared/__tests__/prompt-sections.test.ts +167 -0
  399. package/src/shared/__tests__/secret-leak-scan.test.ts +2 -2
  400. package/src/{activities/execute-deep-agent → shared}/__tests__/stamp-flowed-rows.test.ts +33 -10
  401. package/src/shared/__tests__/vertex-adapter.test.ts +1 -1
  402. package/src/shared/attachment-resolver.ts +218 -55
  403. package/src/shared/attachment-zip.ts +281 -0
  404. package/src/shared/connect-backfill.ts +9 -11
  405. package/src/shared/cost-guard.ts +3 -3
  406. package/src/shared/execution-status-writer.ts +5 -5
  407. package/src/shared/extract-structured-output.ts +8 -7
  408. package/src/shared/filereview/__tests__/capture.test.ts +86 -4
  409. package/src/shared/filereview/__tests__/cas-progress.test.ts +2 -1
  410. package/src/shared/filereview/cas-progress.ts +5 -19
  411. package/src/shared/filereview/cas-touched.ts +89 -0
  412. package/src/shared/filereview/index.ts +4 -2
  413. package/src/shared/mcp-resolver.ts +4 -5
  414. package/src/shared/persist-decision.ts +3 -4
  415. package/src/shared/plan-mode-permissions.ts +2 -2
  416. package/src/shared/plan-mode-prompt.ts +1 -1
  417. package/src/shared/prompt-sections.ts +256 -0
  418. package/src/shared/skill-resolver.ts +4 -2
  419. package/src/shared/tool-rounds.ts +48 -0
  420. package/src/shared/tool-row.ts +61 -0
  421. package/src/shared/workspace/__tests__/stigmer-link.test.ts +7 -22
  422. package/src/shared/workspace/__tests__/writeback-coordinator.test.ts +20 -61
  423. package/src/shared/workspace/session-provision.ts +3 -3
  424. package/src/shared/workspace/stigmer-link.ts +3 -3
  425. package/src/shared/workspace/writeback-coordinator.ts +16 -64
  426. package/src/tools/index.ts +1 -1
  427. package/dist/activities/execute-cursor/capture-flow.d.ts +0 -142
  428. package/dist/activities/execute-cursor/capture-flow.js +0 -285
  429. package/dist/activities/execute-cursor/capture-flow.js.map +0 -1
  430. package/dist/activities/execute-cursor/command-provenance.d.ts +0 -48
  431. package/dist/activities/execute-cursor/command-provenance.js +0 -38
  432. package/dist/activities/execute-cursor/command-provenance.js.map +0 -1
  433. package/dist/activities/execute-deep-agent/attachment-injector.d.ts +0 -134
  434. package/dist/activities/execute-deep-agent/attachment-injector.js +0 -386
  435. package/dist/activities/execute-deep-agent/attachment-injector.js.map +0 -1
  436. package/dist/activities/execute-deep-agent/command-provenance.d.ts +0 -61
  437. package/dist/activities/execute-deep-agent/command-provenance.js +0 -72
  438. package/dist/activities/execute-deep-agent/command-provenance.js.map +0 -1
  439. package/dist/activities/execute-deep-agent/environment.d.ts +0 -24
  440. package/dist/activities/execute-deep-agent/environment.js +0 -58
  441. package/dist/activities/execute-deep-agent/environment.js.map +0 -1
  442. package/dist/activities/execute-deep-agent/event-recorder.d.ts +0 -21
  443. package/dist/activities/execute-deep-agent/event-recorder.js +0 -67
  444. package/dist/activities/execute-deep-agent/event-recorder.js.map +0 -1
  445. package/dist/activities/execute-deep-agent/index.d.ts +0 -15
  446. package/dist/activities/execute-deep-agent/index.js +0 -918
  447. package/dist/activities/execute-deep-agent/index.js.map +0 -1
  448. package/dist/activities/execute-deep-agent/mcp-gate.d.ts +0 -28
  449. package/dist/activities/execute-deep-agent/mcp-gate.js +0 -22
  450. package/dist/activities/execute-deep-agent/mcp-gate.js.map +0 -1
  451. package/dist/activities/execute-deep-agent/post-stream.d.ts +0 -23
  452. package/dist/activities/execute-deep-agent/post-stream.js +0 -71
  453. package/dist/activities/execute-deep-agent/post-stream.js.map +0 -1
  454. package/dist/activities/execute-deep-agent/setup.d.ts +0 -136
  455. package/dist/activities/execute-deep-agent/setup.js +0 -767
  456. package/dist/activities/execute-deep-agent/setup.js.map +0 -1
  457. package/dist/activities/execute-deep-agent/stamp-flowed-rows.d.ts +0 -36
  458. package/dist/activities/execute-deep-agent/stamp-flowed-rows.js +0 -56
  459. package/dist/activities/execute-deep-agent/stamp-flowed-rows.js.map +0 -1
  460. package/dist/activities/execute-deep-agent/status-builder.d.ts +0 -93
  461. package/dist/activities/execute-deep-agent/status-builder.js +0 -365
  462. package/dist/activities/execute-deep-agent/status-builder.js.map +0 -1
  463. package/dist/activities/execute-deep-agent/streaming-terminal.d.ts +0 -21
  464. package/dist/activities/execute-deep-agent/streaming-terminal.js +0 -80
  465. package/dist/activities/execute-deep-agent/streaming-terminal.js.map +0 -1
  466. package/dist/activities/execute-deep-agent/streaming-v3.d.ts +0 -13
  467. package/dist/activities/execute-deep-agent/streaming-v3.js +0 -174
  468. package/dist/activities/execute-deep-agent/streaming-v3.js.map +0 -1
  469. package/dist/activities/execute-deep-agent/streaming.d.ts +0 -81
  470. package/dist/activities/execute-deep-agent/streaming.js +0 -160
  471. package/dist/activities/execute-deep-agent/streaming.js.map +0 -1
  472. package/dist/middleware/cost-cap.d.ts +0 -22
  473. package/dist/middleware/cost-cap.js.map +0 -1
  474. package/dist/middleware/graceful-stop.d.ts +0 -17
  475. package/dist/middleware/graceful-stop.js +0 -63
  476. package/dist/middleware/graceful-stop.js.map +0 -1
  477. package/dist/shared/skill-writer.d.ts +0 -75
  478. package/dist/shared/skill-writer.js +0 -207
  479. package/dist/shared/skill-writer.js.map +0 -1
  480. package/src/activities/execute-cursor/__tests__/capture-flow.test.ts +0 -1032
  481. package/src/activities/execute-cursor/__tests__/command-provenance.test.ts +0 -240
  482. package/src/activities/execute-cursor/__tests__/progress-substrate.test.ts +0 -169
  483. package/src/activities/execute-cursor/capture-flow.ts +0 -379
  484. package/src/activities/execute-cursor/command-provenance.ts +0 -73
  485. package/src/activities/execute-deep-agent/__tests__/attachment-injector.test.ts +0 -1161
  486. package/src/activities/execute-deep-agent/__tests__/command-provenance.test.ts +0 -252
  487. package/src/activities/execute-deep-agent/__tests__/environment.test.ts +0 -108
  488. package/src/activities/execute-deep-agent/__tests__/event-recorder.test.ts +0 -150
  489. package/src/activities/execute-deep-agent/__tests__/hitl-integration.test.ts +0 -226
  490. package/src/activities/execute-deep-agent/__tests__/hitl-reject.test.ts +0 -318
  491. package/src/activities/execute-deep-agent/__tests__/hitl-resume-approve-all.test.ts +0 -351
  492. package/src/activities/execute-deep-agent/__tests__/hitl-resume-history.test.ts +0 -293
  493. package/src/activities/execute-deep-agent/__tests__/index.test.ts +0 -99
  494. package/src/activities/execute-deep-agent/__tests__/mcp-gate.test.ts +0 -44
  495. package/src/activities/execute-deep-agent/__tests__/post-stream.test.ts +0 -112
  496. package/src/activities/execute-deep-agent/__tests__/sequential-gate-resume.test.ts +0 -358
  497. package/src/activities/execute-deep-agent/__tests__/status-builder.test.ts +0 -1933
  498. package/src/activities/execute-deep-agent/__tests__/streaming-terminal.test.ts +0 -40
  499. package/src/activities/execute-deep-agent/__tests__/streaming-v3.test.ts +0 -597
  500. package/src/activities/execute-deep-agent/__tests__/streaming.test.ts +0 -508
  501. package/src/activities/execute-deep-agent/attachment-injector.ts +0 -627
  502. package/src/activities/execute-deep-agent/command-provenance.ts +0 -102
  503. package/src/activities/execute-deep-agent/environment.ts +0 -76
  504. package/src/activities/execute-deep-agent/event-recorder.ts +0 -95
  505. package/src/activities/execute-deep-agent/index.ts +0 -1072
  506. package/src/activities/execute-deep-agent/mcp-gate.ts +0 -37
  507. package/src/activities/execute-deep-agent/post-stream.ts +0 -109
  508. package/src/activities/execute-deep-agent/setup.ts +0 -1081
  509. package/src/activities/execute-deep-agent/stamp-flowed-rows.ts +0 -64
  510. package/src/activities/execute-deep-agent/status-builder.ts +0 -481
  511. package/src/activities/execute-deep-agent/streaming-terminal.ts +0 -106
  512. package/src/activities/execute-deep-agent/streaming-v3.ts +0 -277
  513. package/src/activities/execute-deep-agent/streaming.ts +0 -313
  514. package/src/middleware/__tests__/cost-cap.test.ts +0 -192
  515. package/src/middleware/__tests__/graceful-stop.test.ts +0 -105
  516. package/src/middleware/graceful-stop.ts +0 -86
  517. package/src/shared/__tests__/skill-writer.test.ts +0 -372
  518. package/src/shared/skill-writer.ts +0 -266
@@ -1,386 +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 { readFile } from "node:fs/promises";
34
- import { createInflateRaw } from "node:zlib";
35
- import { posix } from "node:path";
36
- import { mintAttachmentDownloadUrl } from "../../shared/attachment-download-urls.js";
37
- import { allocateUniqueName } from "../../shared/attachment-naming.js";
38
- import { EOCD_MIN_SIZE, parseZipStructure, } from "@stigmer/zip-structure";
39
- // ── Constants ────────────────────────────────────────────────────────
40
- const MAX_ZIP_FILES = 1000;
41
- const MAX_ZIP_EXTRACTED_SIZE = 100 * 1024 * 1024; // 100 MB
42
- const DEFAULT_INPUTS_PREFIX = ".stigmer/inputs";
43
- export { MAX_ZIP_FILES, MAX_ZIP_EXTRACTED_SIZE };
44
- // ── Errors ───────────────────────────────────────────────────────────
45
- export class AttachmentInjectionError extends Error {
46
- attachmentFilename;
47
- reason;
48
- constructor(attachmentFilename, reason) {
49
- super(`Attachment '${attachmentFilename}': ${reason}`);
50
- this.name = "AttachmentInjectionError";
51
- this.attachmentFilename = attachmentFilename;
52
- this.reason = reason;
53
- }
54
- }
55
- export class AttachmentValidationError extends Error {
56
- attachmentFilename;
57
- reason;
58
- constructor(attachmentFilename, reason) {
59
- super(`Attachment '${attachmentFilename}': ${reason}`);
60
- this.name = "AttachmentValidationError";
61
- this.attachmentFilename = attachmentFilename;
62
- this.reason = reason;
63
- }
64
- }
65
- // ── ZIP Validation (pure functions) ──────────────────────────────────
66
- /**
67
- * Validate a ZIP archive for safe extraction. Returns the manifest of
68
- * file entries (directories excluded) if the archive passes all checks.
69
- *
70
- * Security checks enforced:
71
- * 1. Valid ZIP format (readable central directory; fail-hard, see module doc)
72
- * 2. No absolute paths (entries starting with / or \)
73
- * 3. No path traversal (.. components)
74
- * 4. No null bytes in filenames
75
- * 5. No duplicate entry paths (a contradictory manifest)
76
- * 6. Only supported compression methods (stored, deflate) — checked here
77
- * so an unsupported entry can never abort extraction after earlier
78
- * entries were already written
79
- * 7. Non-empty archive (at least one file entry)
80
- * 8. File count within limits (max 1000)
81
- * 9. Total declared uncompressed size within limits (max 100 MB) —
82
- * declarations are re-enforced against actual output at decompression
83
- */
84
- export function validateZipForExtraction(zipData, sourceFilename) {
85
- return parseAndValidateZip(zipData, sourceFilename).map(({ relativePath, uncompressedSize }) => ({ relativePath, uncompressedSize }));
86
- }
87
- function parseAndValidateZip(zipData, sourceFilename) {
88
- if (zipData.length < EOCD_MIN_SIZE) {
89
- throw new AttachmentValidationError(sourceFilename, "not a valid ZIP archive (file too small)");
90
- }
91
- let structural;
92
- try {
93
- structural = parseZipStructure(zipData);
94
- }
95
- catch (err) {
96
- throw new AttachmentValidationError(sourceFilename, `not a valid ZIP archive (${err instanceof Error ? err.message : String(err)})`);
97
- }
98
- const entries = [];
99
- const seenPaths = new Set();
100
- let totalUncompressed = 0;
101
- for (const entry of structural) {
102
- if (entry.name.includes("\u0000")) {
103
- throw new AttachmentValidationError(sourceFilename, "contains a filename with null bytes and cannot be safely extracted");
104
- }
105
- if (entry.isDirectory)
106
- continue;
107
- if (entry.name.startsWith("/") || entry.name.startsWith("\\")) {
108
- throw new AttachmentValidationError(sourceFilename, `contains an absolute path entry and cannot be safely extracted: ${entry.name}`);
109
- }
110
- if (hasPathTraversal(entry.name)) {
111
- throw new AttachmentValidationError(sourceFilename, `contains a path traversal entry and cannot be safely extracted: ${entry.name}`);
112
- }
113
- if (seenPaths.has(entry.name)) {
114
- throw new AttachmentValidationError(sourceFilename, `contains duplicate entry '${entry.name}' and cannot be safely extracted`);
115
- }
116
- seenPaths.add(entry.name);
117
- if (entry.compressionMethod !== 0 && entry.compressionMethod !== 8) {
118
- throw new AttachmentValidationError(sourceFilename, `entry '${entry.name}' uses unsupported compression method ${entry.compressionMethod}`);
119
- }
120
- entries.push({
121
- relativePath: entry.name,
122
- uncompressedSize: entry.uncompressedSize,
123
- compressionMethod: entry.compressionMethod,
124
- compressedData: entry.compressedData,
125
- });
126
- totalUncompressed += entry.uncompressedSize;
127
- }
128
- if (entries.length === 0) {
129
- throw new AttachmentValidationError(sourceFilename, "is an empty ZIP archive (no file entries)");
130
- }
131
- if (entries.length > MAX_ZIP_FILES) {
132
- throw new AttachmentValidationError(sourceFilename, `contains ${entries.length} files (limit: ${MAX_ZIP_FILES})`);
133
- }
134
- if (totalUncompressed > MAX_ZIP_EXTRACTED_SIZE) {
135
- const sizeMb = (totalUncompressed / (1024 * 1024)).toFixed(1);
136
- const limitMb = (MAX_ZIP_EXTRACTED_SIZE / (1024 * 1024)).toFixed(0);
137
- throw new AttachmentValidationError(sourceFilename, `would extract to ${sizeMb} MB (limit: ${limitMb} MB)`);
138
- }
139
- return entries.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
140
- }
141
- // ── Attachment Injection ─────────────────────────────────────────────
142
- /**
143
- * Download, validate, and inject all attachments into the workspace.
144
- *
145
- * Resolves all mount paths before any downloads begin: duplicate
146
- * default-derived names are renamed (never fatal — see module doc), and an
147
- * explicit-mountPath contradiction throws before any bytes move.
148
- * On any failure, throws AttachmentInjectionError with an actionable message.
149
- */
150
- export async function injectAttachments(opts) {
151
- const { backend, attachments, storage, isLocalMode, visionBudget } = opts;
152
- if (attachments.length === 0)
153
- return [];
154
- // Phase 1: Pre-compute mount paths and detect collisions
155
- const mountPaths = resolveMountPaths(attachments);
156
- // Phase 2: Download, validate, and write each attachment
157
- const injectedFiles = [];
158
- for (const attachment of attachments) {
159
- const content = await downloadAttachment(attachment, storage, isLocalMode);
160
- const { path: mountPath, renamedFrom } = mountPaths.get(attachment);
161
- if (attachment.extract) {
162
- const entries = parseAndValidateZip(content, attachment.filename);
163
- const extracted = await extractZipToWorkspace(entries, mountPath, backend, attachment.filename);
164
- // A renamed mount DIR is visible through every extracted path; the
165
- // entries themselves were not renamed, so they carry no renamedFrom
166
- // (per-file disclosure would misattribute the rename). Extracted
167
- // entries also carry no downloadUrl: the stored object is the ZIP, not
168
- // any listed file, and a URL to bytes that differ from the listing
169
- // would be a false promise.
170
- injectedFiles.push(...extracted);
171
- }
172
- else {
173
- await backend.writeFileBuffer(mountPath, content);
174
- // The final basename is the canonical filename: after a duplicate
175
- // rename the original attachment.filename no longer names the file on
176
- // disk, and the vision label must match what the prompt lists or the
177
- // agent sees two images with one indistinguishable name.
178
- const filename = posix.basename(mountPath);
179
- // The bytes are already in hand for the workspace write — offer them to
180
- // the vision budget before they go out of scope (the sniff decides
181
- // eligibility; the budget owns every size/count rule).
182
- const vision = visionBudget?.offer(filename, attachment.contentType, content);
183
- const downloadUrl = await mintAttachmentDownloadUrl(storage, attachment.storageKey, filename);
184
- injectedFiles.push({
185
- filename,
186
- path: mountPath,
187
- sizeBytes: content.length,
188
- ...(renamedFrom !== undefined ? { renamedFrom } : {}),
189
- ...(vision?.kind === "accepted" ? { vision: vision.image } : {}),
190
- ...(vision?.kind === "degraded" ? { visionDegraded: vision.reason } : {}),
191
- ...(downloadUrl !== undefined ? { downloadUrl } : {}),
192
- });
193
- }
194
- }
195
- console.log(`[attachment-injector] Injected ${injectedFiles.length} file(s) into workspace`);
196
- return injectedFiles;
197
- }
198
- function resolveMountPaths(attachments) {
199
- const result = new Map();
200
- const pathToAttachment = new Map();
201
- // Pass 1: explicit mount paths claim their exact targets first. Two
202
- // attachments explicitly pinning the SAME path is a user contradiction no
203
- // rename can honestly resolve — keep rejecting with the actionable message.
204
- for (const attachment of attachments) {
205
- if (!attachment.mountPath)
206
- continue;
207
- const mountPath = resolveExplicitMountPath(attachment);
208
- const existing = pathToAttachment.get(mountPath);
209
- if (existing) {
210
- throw new AttachmentInjectionError(attachment.filename, `mount path '${mountPath}' collides with attachment '${existing.filename}'. ` +
211
- "Set distinct mountPath values on the attachments to resolve this conflict.");
212
- }
213
- pathToAttachment.set(mountPath, attachment);
214
- result.set(attachment, { path: mountPath });
215
- }
216
- // Pass 2: default-derived names (`.stigmer/inputs/{filename}`) uniquify
217
- // around everything already taken — other defaults AND explicit paths that
218
- // landed inside the inputs prefix — instead of failing the execution
219
- // (issue #364). The taken-set is seeded with the basenames the explicit
220
- // pass claimed directly under the prefix.
221
- const takenNames = new Set();
222
- for (const path of pathToAttachment.keys()) {
223
- if (path.startsWith(`${DEFAULT_INPUTS_PREFIX}/`)) {
224
- const rest = path.slice(DEFAULT_INPUTS_PREFIX.length + 1);
225
- if (rest.length > 0 && !rest.includes("/"))
226
- takenNames.add(rest);
227
- }
228
- }
229
- for (const attachment of attachments) {
230
- if (attachment.mountPath)
231
- continue;
232
- const { name, renamedFrom } = allocateUniqueName(deriveDefaultFilename(attachment), takenNames);
233
- const path = `${DEFAULT_INPUTS_PREFIX}/${name}`;
234
- pathToAttachment.set(path, attachment);
235
- result.set(attachment, renamedFrom !== undefined ? { path, renamedFrom } : { path });
236
- }
237
- return result;
238
- }
239
- function resolveExplicitMountPath(attachment) {
240
- const cleaned = attachment.mountPath.replace(/^\/+/, "");
241
- if (cleaned.length === 0) {
242
- throw new AttachmentInjectionError(attachment.filename, "mountPath resolves to an empty path after removing leading slashes");
243
- }
244
- // A caller-supplied mount path is untrusted. Stripping leading slashes does
245
- // not stop `..` segments from climbing out of the workspace root on the
246
- // non-`.stigmer/` branch (the `.stigmer/`-routed branch is already guarded
247
- // by LocalWorkspaceBackend.resolvePath). Reject any path that normalizes to
248
- // an escape before it reaches the backend write.
249
- if (escapesRoot(cleaned)) {
250
- throw new AttachmentInjectionError(attachment.filename, `mount path '${attachment.mountPath}' escapes the workspace root`);
251
- }
252
- return cleaned;
253
- }
254
- // Derives the single-component filename an attachment without an explicit
255
- // mountPath materializes under (the name that pass 2 uniquifies).
256
- function deriveDefaultFilename(attachment) {
257
- const rawName = attachment.filename || deriveFilename(attachment.storageKey);
258
- if (!rawName) {
259
- throw new AttachmentInjectionError("(unknown)", "attachment has neither filename nor storageKey — cannot determine mount path");
260
- }
261
- // The filename is untrusted; reduce it to a single path component so it lands
262
- // directly under the inputs prefix rather than steering the write elsewhere.
263
- const filename = posix.basename(rawName);
264
- if (filename === "" || filename === "." || filename === "..") {
265
- throw new AttachmentInjectionError(rawName, `filename '${rawName}' does not yield a usable name for materialization`);
266
- }
267
- return filename;
268
- }
269
- // escapesRoot reports whether a workspace-relative mount path would climb out
270
- // of the workspace root once normalized. Mount paths are forward-slash,
271
- // workspace-relative strings, so posix normalization is the correct semantics.
272
- function escapesRoot(relPath) {
273
- const normalized = posix.normalize(relPath);
274
- return (normalized === ".." ||
275
- normalized.startsWith("../") ||
276
- posix.isAbsolute(normalized));
277
- }
278
- function deriveFilename(storageKey) {
279
- if (!storageKey)
280
- return "";
281
- const parts = storageKey.split("/");
282
- return parts[parts.length - 1] || "";
283
- }
284
- async function downloadAttachment(attachment, storage, isLocalMode) {
285
- // Local mode fast path: read directly from filesystem
286
- if (isLocalMode && attachment.localPath) {
287
- try {
288
- return await readFile(attachment.localPath);
289
- }
290
- catch (err) {
291
- throw new AttachmentInjectionError(attachment.filename, `failed to read local file '${attachment.localPath}': ${err instanceof Error ? err.message : String(err)}`);
292
- }
293
- }
294
- // Cloud mode: download via artifact storage
295
- if (!attachment.storageKey) {
296
- throw new AttachmentInjectionError(attachment.filename, "missing storageKey — cannot download attachment from storage");
297
- }
298
- // The attachment must come from storage, but the runner could not build one
299
- // (proxy misconfig). Fail with an actionable message rather than dereferencing
300
- // undefined — consistent with the degraded posture, never a silent skip.
301
- if (!storage) {
302
- throw new AttachmentInjectionError(attachment.filename, `artifact storage is unavailable, so this attachment (key: ${attachment.storageKey}) cannot be downloaded`);
303
- }
304
- try {
305
- return await storage.download(attachment.storageKey);
306
- }
307
- catch (err) {
308
- if (err instanceof AttachmentInjectionError)
309
- throw err;
310
- throw new AttachmentInjectionError(attachment.filename, `failed to download from storage (key: ${attachment.storageKey}): ${err instanceof Error ? err.message : String(err)}`);
311
- }
312
- }
313
- async function extractZipToWorkspace(entries, mountDir, backend, sourceFilename) {
314
- const cleanMountDir = mountDir.replace(/\/+$/, "");
315
- const injected = [];
316
- for (const entry of entries) {
317
- const content = await decompressEntry(entry, sourceFilename);
318
- const targetPath = `${cleanMountDir}/${entry.relativePath}`;
319
- await backend.writeFileBuffer(targetPath, content);
320
- injected.push({
321
- filename: posix.basename(entry.relativePath),
322
- path: targetPath,
323
- sizeBytes: content.length,
324
- });
325
- }
326
- return injected;
327
- }
328
- /**
329
- * Decompress a validated entry, enforcing its declared uncompressed size.
330
- *
331
- * The size cap in parseAndValidateZip budgets *declared* sizes, which the
332
- * archive author controls — a crafted archive can declare 1 KB and inflate
333
- * to gigabytes. Enforcement is therefore two-sided and fail-hard: inflation
334
- * aborts the moment output exceeds the declaration, and an undershoot (or a
335
- * stored payload whose length disagrees) fails too, because a manifest that
336
- * misdescribes its own contents is exactly the corrupt-input class this
337
- * module must never extract from.
338
- */
339
- async function decompressEntry(entry, sourceFilename) {
340
- const declared = entry.uncompressedSize;
341
- if (entry.compressionMethod === 0) {
342
- if (entry.compressedData.length !== declared) {
343
- throw new AttachmentValidationError(sourceFilename, `entry '${entry.relativePath}' payload is ${entry.compressedData.length} bytes ` +
344
- `but the archive declares ${declared} — corrupt or crafted archive`);
345
- }
346
- return Buffer.from(entry.compressedData);
347
- }
348
- // Deflate — the only other method parseAndValidateZip admits.
349
- return new Promise((resolve, reject) => {
350
- const inflate = createInflateRaw();
351
- const chunks = [];
352
- let produced = 0;
353
- inflate.on("data", (chunk) => {
354
- produced += chunk.length;
355
- if (produced > declared) {
356
- inflate.destroy();
357
- reject(new AttachmentValidationError(sourceFilename, `entry '${entry.relativePath}' decompresses past its declared size of ` +
358
- `${declared} bytes — corrupt or crafted archive`));
359
- return;
360
- }
361
- chunks.push(chunk);
362
- });
363
- inflate.on("end", () => {
364
- if (produced !== declared) {
365
- reject(new AttachmentValidationError(sourceFilename, `entry '${entry.relativePath}' decompressed to ${produced} bytes ` +
366
- `but the archive declares ${declared} — corrupt or crafted archive`));
367
- return;
368
- }
369
- resolve(Buffer.concat(chunks));
370
- });
371
- inflate.on("error", reject);
372
- inflate.end(Buffer.from(entry.compressedData));
373
- });
374
- }
375
- function hasPathTraversal(filePath) {
376
- const normalized = posix.normalize(filePath);
377
- if (normalized.startsWith("../") || normalized === "..")
378
- return true;
379
- const segments = filePath.split(/[/\\]/);
380
- for (const seg of segments) {
381
- if (seg === "..")
382
- return true;
383
- }
384
- return false;
385
- }
386
- //# sourceMappingURL=attachment-injector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"attachment-injector.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/attachment-injector.ts"],"names":[],"mappings":"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"}
@@ -1,61 +0,0 @@
1
- /**
2
- * Approved-command turn provenance (DD-28) — the DEEP-AGENT (native) harness
3
- * adapter over the shared qualification rule ({@link qualifyTurnCommandProvenance}).
4
- *
5
- * The deep-agent's consent model differs from Cursor's in exactly two ways, and
6
- * this adapter is precisely those two differences:
7
- *
8
- * 1. IDENTITY turn scoping (not positional). Cursor scopes a turn by the message
9
- * index its stream started at. The deep-agent cannot: an approved command
10
- * executes IN PLACE at its seeded transcript position (it was proposed in a
11
- * prior segment, seeded into this segment, and updated to COMPLETED by
12
- * `StatusBuilder.findResumableSeededToolCall`). So "this turn's calls" are
13
- * those whose id is absent from a pre-stream {@link collectSettledToolCallIds}
14
- * snapshot, and "executed" is a COMPLETED status.
15
- *
16
- * 2. SAME-ROW direct consent (not a grant token). A gated deep-agent tool pauses
17
- * on a LangGraph interrupt; SubmitApproval writes `approval_action` onto that
18
- * same row, and the row keeps its id + `approval_action` when it executes on
19
- * resume. So the executed command IS its own consent row — cite its own id.
20
- * (The server's PreserveApprovalFields keeps that `approval_action` on the row
21
- * across the status write regardless of its new status, so the backend's
22
- * verification finds it.)
23
- *
24
- * A turn that delegated ANY sub-agent fails closed (DD-28 D1: "delegated zero
25
- * sub-agents"). A sub-agent's writes fold into the parent turn's change set
26
- * (DD-19) but are not attributable to a consented top-level command. The
27
- * top-level `task` call (a SUBAGENT kind) already trips the shared rule's
28
- * `!== SHELL` fail-closed; the explicit sub-agent-novelty guard below also covers
29
- * the (currently-impossible under the replace-per-turn model) case of a sub-agent
30
- * that mutates across a turn boundary without a fresh top-level `task` row.
31
- *
32
- * (Trust boundary + fail-closed contract: see the shared module.)
33
- */
34
- import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
35
- import type { TurnCommandProvenance } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
36
- export interface DeepAgentCommandProvenanceInputs {
37
- /** The status at capture time — top-level messages + sub-agent executions. */
38
- readonly status: AgentExecutionStatus;
39
- /**
40
- * The top-level tool-call ids that had already SETTLED before this turn's
41
- * stream (from {@link collectSettledToolCallIds}). A top-level call whose id is
42
- * absent is this-turn's; the shared rule then keeps only the COMPLETED ones.
43
- */
44
- readonly priorSettledToolCallIds: ReadonlySet<string>;
45
- /**
46
- * The sub-agent tool-call ids that existed before this turn's stream (from
47
- * {@link collectSubAgentToolCallIds}). Any growth means a sub-agent acted this
48
- * turn → fail closed.
49
- */
50
- readonly priorSubAgentToolCallIds: ReadonlySet<string>;
51
- /** True when the pre-armed spec.auto_approve_all bypassed the gate. */
52
- readonly globalBypass: boolean;
53
- }
54
- /**
55
- * Derive the {@link TurnCommandProvenance} for a deep-agent turn, or undefined
56
- * when it does not qualify. Scopes this turn's top-level calls by id-novelty,
57
- * resolves consent from the row's own server-authored `approval_action`, fails
58
- * closed on any sub-agent activity, and delegates the DD-28 rule to
59
- * {@link qualifyTurnCommandProvenance}.
60
- */
61
- export declare function deriveTurnCommandProvenance(inputs: DeepAgentCommandProvenanceInputs): TurnCommandProvenance | undefined;
@@ -1,72 +0,0 @@
1
- /**
2
- * Approved-command turn provenance (DD-28) — the DEEP-AGENT (native) harness
3
- * adapter over the shared qualification rule ({@link qualifyTurnCommandProvenance}).
4
- *
5
- * The deep-agent's consent model differs from Cursor's in exactly two ways, and
6
- * this adapter is precisely those two differences:
7
- *
8
- * 1. IDENTITY turn scoping (not positional). Cursor scopes a turn by the message
9
- * index its stream started at. The deep-agent cannot: an approved command
10
- * executes IN PLACE at its seeded transcript position (it was proposed in a
11
- * prior segment, seeded into this segment, and updated to COMPLETED by
12
- * `StatusBuilder.findResumableSeededToolCall`). So "this turn's calls" are
13
- * those whose id is absent from a pre-stream {@link collectSettledToolCallIds}
14
- * snapshot, and "executed" is a COMPLETED status.
15
- *
16
- * 2. SAME-ROW direct consent (not a grant token). A gated deep-agent tool pauses
17
- * on a LangGraph interrupt; SubmitApproval writes `approval_action` onto that
18
- * same row, and the row keeps its id + `approval_action` when it executes on
19
- * resume. So the executed command IS its own consent row — cite its own id.
20
- * (The server's PreserveApprovalFields keeps that `approval_action` on the row
21
- * across the status write regardless of its new status, so the backend's
22
- * verification finds it.)
23
- *
24
- * A turn that delegated ANY sub-agent fails closed (DD-28 D1: "delegated zero
25
- * sub-agents"). A sub-agent's writes fold into the parent turn's change set
26
- * (DD-19) but are not attributable to a consented top-level command. The
27
- * top-level `task` call (a SUBAGENT kind) already trips the shared rule's
28
- * `!== SHELL` fail-closed; the explicit sub-agent-novelty guard below also covers
29
- * the (currently-impossible under the replace-per-turn model) case of a sub-agent
30
- * that mutates across a turn boundary without a fresh top-level `task` row.
31
- *
32
- * (Trust boundary + fail-closed contract: see the shared module.)
33
- */
34
- import { ApprovalAction, ToolCallStatus, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
35
- import { qualifyTurnCommandProvenance } from "../../shared/filereview/command-provenance.js";
36
- import { collectSubAgentToolCallIds } from "../../shared/tool-row.js";
37
- /**
38
- * Derive the {@link TurnCommandProvenance} for a deep-agent turn, or undefined
39
- * when it does not qualify. Scopes this turn's top-level calls by id-novelty,
40
- * resolves consent from the row's own server-authored `approval_action`, fails
41
- * closed on any sub-agent activity, and delegates the DD-28 rule to
42
- * {@link qualifyTurnCommandProvenance}.
43
- */
44
- export function deriveTurnCommandProvenance(inputs) {
45
- const { status, priorSettledToolCallIds, priorSubAgentToolCallIds, globalBypass } = inputs;
46
- // DD-28 D1 cond 2: any sub-agent activity this turn disqualifies. A sub-agent
47
- // that ran this turn contributes at least one tool-call id absent from the
48
- // pre-stream snapshot.
49
- for (const id of collectSubAgentToolCallIds(status.subAgentExecutions)) {
50
- if (!priorSubAgentToolCallIds.has(id))
51
- return undefined;
52
- }
53
- const messages = status.messages;
54
- // This turn's top-level calls: those not already settled before the stream.
55
- const turnToolCalls = messages
56
- .flatMap((m) => m.toolCalls)
57
- .filter((tc) => !priorSettledToolCallIds.has(tc.id));
58
- return qualifyTurnCommandProvenance({
59
- turnToolCalls,
60
- messages,
61
- // A deep-agent command executed iff its row reached COMPLETED this turn.
62
- isExecutedCommand: (tc) => tc.status === ToolCallStatus.TOOL_CALL_COMPLETED,
63
- // The gated command carries its own server-authored approval_action, written
64
- // in place by SubmitApproval and preserved when the row executes on resume.
65
- resolveDirectConsent: (tc) => tc.approvalAction === ApprovalAction.APPROVE ||
66
- tc.approvalAction === ApprovalAction.APPROVE_ALL
67
- ? tc.id
68
- : undefined,
69
- globalBypass,
70
- });
71
- }
72
- //# sourceMappingURL=command-provenance.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-provenance.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/command-provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EACL,cAAc,EACd,cAAc,GACf,MAAM,8DAA8D,CAAC;AAGtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAqBtE;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAwC;IAExC,MAAM,EAAE,MAAM,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAE3F,8EAA8E;IAC9E,2EAA2E;IAC3E,uBAAuB;IACvB,KAAK,MAAM,EAAE,IAAI,0BAA0B,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,SAAS,CAAC;IAC1D,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,4EAA4E;IAC5E,MAAM,aAAa,GAAG,QAAQ;SAC3B,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC3B,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvD,OAAO,4BAA4B,CAAC;QAClC,aAAa;QACb,QAAQ;QACR,yEAAyE;QACzE,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,cAAc,CAAC,mBAAmB;QAC3E,6EAA6E;QAC7E,4EAA4E;QAC5E,oBAAoB,EAAE,CAAC,EAAE,EAAE,EAAE,CAC3B,EAAE,CAAC,cAAc,KAAK,cAAc,CAAC,OAAO;YAC5C,EAAE,CAAC,cAAc,KAAK,cAAc,CAAC,WAAW;YAC9C,CAAC,CAAC,EAAE,CAAC,EAAE;YACP,CAAC,CAAC,SAAS;QACf,YAAY;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Environment variable resolution for deep agent execution.
3
- *
4
- * Resolves the merged environment from ExecutionContext — the single
5
- * source of truth for execution-scoped variables. The workflow injects
6
- * all resolved variables into ExecutionContext before the activity starts.
7
- *
8
- * The returned result separates plaintext keys from secret keys so that
9
- * downstream consumers (e.g., StatusBuilder in Phase 3b) can redact
10
- * secret values in user-facing displays.
11
- */
12
- import type { StigmerClient } from "../../client/stigmer-client.js";
13
- export interface EnvironmentResult {
14
- readonly mergedEnvVars: Record<string, string>;
15
- readonly secretKeys: ReadonlySet<string>;
16
- }
17
- /**
18
- * Fetch the ExecutionContext for the given execution and extract the
19
- * merged environment variables.
20
- *
21
- * If no ExecutionContext exists (e.g., the agent has no environment or
22
- * secrets configured), returns an empty result so execution can proceed.
23
- */
24
- export declare function resolveEnvironment(client: StigmerClient, executionId: string): Promise<EnvironmentResult>;
@@ -1,58 +0,0 @@
1
- /**
2
- * Environment variable resolution for deep agent execution.
3
- *
4
- * Resolves the merged environment from ExecutionContext — the single
5
- * source of truth for execution-scoped variables. The workflow injects
6
- * all resolved variables into ExecutionContext before the activity starts.
7
- *
8
- * The returned result separates plaintext keys from secret keys so that
9
- * downstream consumers (e.g., StatusBuilder in Phase 3b) can redact
10
- * secret values in user-facing displays.
11
- */
12
- /**
13
- * Fetch the ExecutionContext for the given execution and extract the
14
- * merged environment variables.
15
- *
16
- * If no ExecutionContext exists (e.g., the agent has no environment or
17
- * secrets configured), returns an empty result so execution can proceed.
18
- */
19
- export async function resolveEnvironment(client, executionId) {
20
- // A desktop runner exchanges its bootstrap credential for a token scoped to
21
- // this execution's session, so cloud's decrypt gate binds the read (#156).
22
- // No-op for cloud sandbox and OSS runners. A failed exchange throws and
23
- // fails the activity: the bootstrap credential no longer decrypts
24
- // (stigmer-cloud#218), so proceeding would resolve redacted placeholders.
25
- const scopedToken = await client.acquireScopedRunnerToken({
26
- agentExecutionId: executionId,
27
- });
28
- let execCtx;
29
- try {
30
- execCtx = await client.getExecutionContextByExecutionId(executionId, scopedToken);
31
- }
32
- catch (err) {
33
- // ConnectError uses numeric Code.NotFound (5); match the pattern
34
- // from shared/env-resolver.ts.
35
- const code = err?.code;
36
- if (code === 5 || code === "not_found" || code === "NOT_FOUND") {
37
- console.log(`[env] No ExecutionContext found for execution ${executionId} — ` +
38
- `proceeding with empty environment.`);
39
- return { mergedEnvVars: {}, secretKeys: new Set() };
40
- }
41
- throw err;
42
- }
43
- const mergedEnvVars = {};
44
- const secretKeys = new Set();
45
- const data = execCtx.spec?.data;
46
- if (data) {
47
- for (const [key, execValue] of Object.entries(data)) {
48
- mergedEnvVars[key] = execValue.value;
49
- if (execValue.isSecret) {
50
- secretKeys.add(key);
51
- }
52
- }
53
- }
54
- console.log(`[env] Resolved environment: env_count=${Object.keys(mergedEnvVars).length}, ` +
55
- `secret_count=${secretKeys.size}`);
56
- return { mergedEnvVars, secretKeys };
57
- }
58
- //# sourceMappingURL=environment.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/environment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAqB,EACrB,WAAmB;IAEnB,4EAA4E;IAC5E,2EAA2E;IAC3E,wEAAwE;IACxE,kEAAkE;IAClE,0EAA0E;IAC1E,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC;QACxD,gBAAgB,EAAE,WAAW;KAC9B,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACpF,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,iEAAiE;QACjE,+BAA+B;QAC/B,MAAM,IAAI,GAAI,GAAkC,EAAE,IAAI,CAAC;QACvD,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/D,OAAO,CAAC,GAAG,CACT,iDAAiD,WAAW,KAAK;gBACjE,oCAAoC,CACrC,CAAC;YACF,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QACtD,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,aAAa,GAA2B,EAAE,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;IAChC,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,aAAa,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC;YACrC,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACvB,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CACT,yCAAyC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,IAAI;QAC9E,gBAAgB,UAAU,CAAC,IAAI,EAAE,CAClC,CAAC;IAEF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC"}