@stigmer/runner 3.0.9-dev.20260615153829 → 3.1.0

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 (329) hide show
  1. package/dist/.build-fingerprint +1 -1
  2. package/dist/__test-utils__/approval-contract/types.d.ts +174 -0
  3. package/dist/__test-utils__/approval-contract/types.js +24 -0
  4. package/dist/__test-utils__/approval-contract/types.js.map +1 -0
  5. package/dist/activities/call-agent-status.d.ts +19 -1
  6. package/dist/activities/call-agent-status.js +64 -5
  7. package/dist/activities/call-agent-status.js.map +1 -1
  8. package/dist/activities/call-llm.js +19 -53
  9. package/dist/activities/call-llm.js.map +1 -1
  10. package/dist/activities/classify-tool-approvals.d.ts +24 -0
  11. package/dist/activities/classify-tool-approvals.js +69 -17
  12. package/dist/activities/classify-tool-approvals.js.map +1 -1
  13. package/dist/activities/discover-mcp-server.d.ts +7 -0
  14. package/dist/activities/discover-mcp-server.js +11 -1
  15. package/dist/activities/discover-mcp-server.js.map +1 -1
  16. package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.d.ts +140 -0
  17. package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js +130 -0
  18. package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js.map +1 -0
  19. package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.d.ts +18 -0
  20. package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js +123 -0
  21. package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js.map +1 -0
  22. package/dist/activities/execute-cursor/approval-policy.d.ts +17 -61
  23. package/dist/activities/execute-cursor/approval-policy.js +8 -120
  24. package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
  25. package/dist/activities/execute-cursor/approval-state.d.ts +219 -9
  26. package/dist/activities/execute-cursor/approval-state.js +233 -17
  27. package/dist/activities/execute-cursor/approval-state.js.map +1 -1
  28. package/dist/activities/execute-cursor/capture-flow.d.ts +127 -0
  29. package/dist/activities/execute-cursor/capture-flow.js +234 -0
  30. package/dist/activities/execute-cursor/capture-flow.js.map +1 -0
  31. package/dist/activities/execute-cursor/cas-observations.d.ts +96 -0
  32. package/dist/activities/execute-cursor/cas-observations.js +184 -0
  33. package/dist/activities/execute-cursor/cas-observations.js.map +1 -0
  34. package/dist/activities/execute-cursor/command-provenance.d.ts +62 -0
  35. package/dist/activities/execute-cursor/command-provenance.js +128 -0
  36. package/dist/activities/execute-cursor/command-provenance.js.map +1 -0
  37. package/dist/activities/execute-cursor/exact-apply.d.ts +110 -0
  38. package/dist/activities/execute-cursor/exact-apply.js +204 -0
  39. package/dist/activities/execute-cursor/exact-apply.js.map +1 -0
  40. package/dist/activities/execute-cursor/hook-script.d.ts +53 -24
  41. package/dist/activities/execute-cursor/hook-script.js +310 -47
  42. package/dist/activities/execute-cursor/hook-script.js.map +1 -1
  43. package/dist/activities/execute-cursor/index.d.ts +8 -1
  44. package/dist/activities/execute-cursor/index.js +500 -64
  45. package/dist/activities/execute-cursor/index.js.map +1 -1
  46. package/dist/activities/execute-cursor/message-translator.d.ts +258 -11
  47. package/dist/activities/execute-cursor/message-translator.js +836 -90
  48. package/dist/activities/execute-cursor/message-translator.js.map +1 -1
  49. package/dist/activities/execute-cursor/prompt-builder.d.ts +20 -23
  50. package/dist/activities/execute-cursor/prompt-builder.js +74 -15
  51. package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
  52. package/dist/activities/execute-cursor/workspace-setup.d.ts +17 -0
  53. package/dist/activities/execute-cursor/workspace-setup.js +212 -33
  54. package/dist/activities/execute-cursor/workspace-setup.js.map +1 -1
  55. package/dist/activities/execute-deep-agent/__test-utils__/gateway-substrate.d.ts +19 -0
  56. package/dist/activities/execute-deep-agent/__test-utils__/gateway-substrate.js +143 -0
  57. package/dist/activities/execute-deep-agent/__test-utils__/gateway-substrate.js.map +1 -0
  58. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +88 -0
  59. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +81 -0
  60. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -0
  61. package/dist/activities/execute-deep-agent/approval-file-change.d.ts +47 -0
  62. package/dist/activities/execute-deep-agent/approval-file-change.js +68 -0
  63. package/dist/activities/execute-deep-agent/approval-file-change.js.map +1 -0
  64. package/dist/activities/execute-deep-agent/attachment-injector.d.ts +8 -1
  65. package/dist/activities/execute-deep-agent/attachment-injector.js +7 -7
  66. package/dist/activities/execute-deep-agent/attachment-injector.js.map +1 -1
  67. package/dist/activities/execute-deep-agent/cas-capture-backend.d.ts +42 -0
  68. package/dist/activities/execute-deep-agent/cas-capture-backend.js +47 -0
  69. package/dist/activities/execute-deep-agent/cas-capture-backend.js.map +1 -0
  70. package/dist/activities/execute-deep-agent/cas-capture-observer.d.ts +79 -0
  71. package/dist/activities/execute-deep-agent/cas-capture-observer.js +112 -0
  72. package/dist/activities/execute-deep-agent/cas-capture-observer.js.map +1 -0
  73. package/dist/activities/execute-deep-agent/hitl.d.ts +16 -3
  74. package/dist/activities/execute-deep-agent/hitl.js +11 -3
  75. package/dist/activities/execute-deep-agent/hitl.js.map +1 -1
  76. package/dist/activities/execute-deep-agent/index.d.ts +2 -1
  77. package/dist/activities/execute-deep-agent/index.js +393 -33
  78. package/dist/activities/execute-deep-agent/index.js.map +1 -1
  79. package/dist/activities/execute-deep-agent/inline-publisher.d.ts +7 -1
  80. package/dist/activities/execute-deep-agent/inline-publisher.js +23 -2
  81. package/dist/activities/execute-deep-agent/inline-publisher.js.map +1 -1
  82. package/dist/activities/execute-deep-agent/setup.d.ts +53 -2
  83. package/dist/activities/execute-deep-agent/setup.js +149 -92
  84. package/dist/activities/execute-deep-agent/setup.js.map +1 -1
  85. package/dist/activities/execute-deep-agent/stamp-flowed-rows.d.ts +36 -0
  86. package/dist/activities/execute-deep-agent/stamp-flowed-rows.js +56 -0
  87. package/dist/activities/execute-deep-agent/stamp-flowed-rows.js.map +1 -0
  88. package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +34 -1
  89. package/dist/activities/execute-deep-agent/status-builder-shared.js +26 -25
  90. package/dist/activities/execute-deep-agent/status-builder-shared.js.map +1 -1
  91. package/dist/activities/execute-deep-agent/status-builder.d.ts +17 -5
  92. package/dist/activities/execute-deep-agent/status-builder.js +44 -3
  93. package/dist/activities/execute-deep-agent/status-builder.js.map +1 -1
  94. package/dist/activities/execute-deep-agent/streaming-side-effects.js +2 -19
  95. package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
  96. package/dist/activities/execute-deep-agent/streaming.js +3 -15
  97. package/dist/activities/execute-deep-agent/streaming.js.map +1 -1
  98. package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +25 -7
  99. package/dist/activities/execute-deep-agent/subagent-transformer.js +23 -7
  100. package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
  101. package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +30 -3
  102. package/dist/activities/execute-deep-agent/subagent-wiring.js +29 -3
  103. package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -1
  104. package/dist/activities/execute-deep-agent/v3-status-builder.js +32 -2
  105. package/dist/activities/execute-deep-agent/v3-status-builder.js.map +1 -1
  106. package/dist/claimcheck/payload-codec.js +9 -5
  107. package/dist/claimcheck/payload-codec.js.map +1 -1
  108. package/dist/client/stigmer-client.d.ts +2 -0
  109. package/dist/client/stigmer-client.js +2 -0
  110. package/dist/client/stigmer-client.js.map +1 -1
  111. package/dist/middleware/approval-gate.d.ts +85 -4
  112. package/dist/middleware/approval-gate.js +165 -38
  113. package/dist/middleware/approval-gate.js.map +1 -1
  114. package/dist/middleware/types.d.ts +2 -5
  115. package/dist/shared/activity-input.d.ts +43 -0
  116. package/dist/shared/activity-input.js +17 -0
  117. package/dist/shared/activity-input.js.map +1 -0
  118. package/dist/shared/approval-canonicalize.d.ts +19 -0
  119. package/dist/shared/approval-canonicalize.js +119 -0
  120. package/dist/shared/approval-canonicalize.js.map +1 -0
  121. package/dist/shared/approval-fingerprint.d.ts +106 -0
  122. package/dist/shared/approval-fingerprint.js +113 -0
  123. package/dist/shared/approval-fingerprint.js.map +1 -0
  124. package/dist/shared/approval-policy.d.ts +182 -12
  125. package/dist/shared/approval-policy.js +213 -27
  126. package/dist/shared/approval-policy.js.map +1 -1
  127. package/dist/shared/args-preview.d.ts +52 -0
  128. package/dist/shared/args-preview.js +93 -0
  129. package/dist/shared/args-preview.js.map +1 -0
  130. package/dist/shared/artifact-storage.d.ts +19 -1
  131. package/dist/shared/artifact-storage.js +48 -11
  132. package/dist/shared/artifact-storage.js.map +1 -1
  133. package/dist/shared/file-change.d.ts +44 -0
  134. package/dist/shared/file-change.js +57 -0
  135. package/dist/shared/file-change.js.map +1 -0
  136. package/dist/shared/file-tools.d.ts +107 -0
  137. package/dist/shared/file-tools.js +168 -0
  138. package/dist/shared/file-tools.js.map +1 -0
  139. package/dist/shared/filereview/capture.d.ts +202 -0
  140. package/dist/shared/filereview/capture.js +498 -0
  141. package/dist/shared/filereview/capture.js.map +1 -0
  142. package/dist/shared/filereview/cas-substrate.d.ts +190 -0
  143. package/dist/shared/filereview/cas-substrate.js +284 -0
  144. package/dist/shared/filereview/cas-substrate.js.map +1 -0
  145. package/dist/shared/filereview/digest.d.ts +40 -0
  146. package/dist/shared/filereview/digest.js +66 -0
  147. package/dist/shared/filereview/digest.js.map +1 -0
  148. package/dist/shared/filereview/events.d.ts +170 -0
  149. package/dist/shared/filereview/events.js +298 -0
  150. package/dist/shared/filereview/events.js.map +1 -0
  151. package/dist/shared/filereview/git-substrate.d.ts +175 -0
  152. package/dist/shared/filereview/git-substrate.js +439 -0
  153. package/dist/shared/filereview/git-substrate.js.map +1 -0
  154. package/dist/shared/filereview/index.d.ts +11 -0
  155. package/dist/shared/filereview/index.js +12 -0
  156. package/dist/shared/filereview/index.js.map +1 -0
  157. package/dist/shared/filereview/secret-paths.d.ts +63 -0
  158. package/dist/shared/filereview/secret-paths.js +105 -0
  159. package/dist/shared/filereview/secret-paths.js.map +1 -0
  160. package/dist/shared/fingerprint-secret.d.ts +26 -0
  161. package/dist/shared/fingerprint-secret.js +47 -0
  162. package/dist/shared/fingerprint-secret.js.map +1 -0
  163. package/dist/shared/model-client.d.ts +51 -0
  164. package/dist/shared/model-client.js +77 -0
  165. package/dist/shared/model-client.js.map +1 -0
  166. package/dist/shared/plan-artifact.js +0 -2
  167. package/dist/shared/plan-artifact.js.map +1 -1
  168. package/dist/shared/status-offload.d.ts +83 -9
  169. package/dist/shared/status-offload.js +399 -79
  170. package/dist/shared/status-offload.js.map +1 -1
  171. package/dist/shared/status.js +14 -1
  172. package/dist/shared/status.js.map +1 -1
  173. package/dist/shared/tool-kind.d.ts +19 -0
  174. package/dist/shared/tool-kind.js +13 -0
  175. package/dist/shared/tool-kind.js.map +1 -1
  176. package/dist/shared/tool-row.d.ts +88 -0
  177. package/dist/shared/tool-row.js +127 -0
  178. package/dist/shared/tool-row.js.map +1 -0
  179. package/dist/shared/workspace/platform-dir.d.ts +25 -0
  180. package/dist/shared/workspace/platform-dir.js +38 -2
  181. package/dist/shared/workspace/platform-dir.js.map +1 -1
  182. package/dist/workflows/call-agent-orchestrator.js +56 -7
  183. package/dist/workflows/call-agent-orchestrator.js.map +1 -1
  184. package/dist/workflows/connect-mcp-server.d.ts +50 -0
  185. package/dist/workflows/connect-mcp-server.js +136 -15
  186. package/dist/workflows/connect-mcp-server.js.map +1 -1
  187. package/dist/workflows/types.d.ts +8 -0
  188. package/package.json +2 -2
  189. package/src/__test-utils__/approval-contract/contract.ts +224 -0
  190. package/src/__test-utils__/approval-contract/types.ts +179 -0
  191. package/src/__test-utils__/fake-artifact-storage.ts +72 -0
  192. package/src/__tests__/approval-gateway-contract.test.ts +29 -0
  193. package/src/__tests__/claimcheck-codec.test.ts +16 -53
  194. package/src/__tests__/golden-e2e.test.ts +2 -0
  195. package/src/__tests__/runner-token-coordinator.test.ts +3 -3
  196. package/src/activities/__tests__/call-agent-status.test.ts +135 -0
  197. package/src/activities/__tests__/call-llm.test.ts +1 -1
  198. package/src/activities/__tests__/classify-tool-approvals.test.ts +208 -1
  199. package/src/activities/__tests__/discover-mcp-server.test.ts +30 -0
  200. package/src/activities/__tests__/workflow-event-activities.test.ts +2 -1
  201. package/src/activities/call-agent-status.ts +74 -4
  202. package/src/activities/call-llm.ts +18 -63
  203. package/src/activities/classify-tool-approvals.ts +101 -19
  204. package/src/activities/discover-mcp-server.ts +29 -1
  205. package/src/activities/execute-cursor/__test-utils__/cursor-hook-harness.ts +216 -0
  206. package/src/activities/execute-cursor/__test-utils__/gateway-substrate.ts +148 -0
  207. package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +41 -9
  208. package/src/activities/execute-cursor/__tests__/approval-state.test.ts +292 -0
  209. package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +68 -1
  210. package/src/activities/execute-cursor/__tests__/capture-flow.test.ts +1005 -0
  211. package/src/activities/execute-cursor/__tests__/cas-observations.test.ts +187 -0
  212. package/src/activities/execute-cursor/__tests__/coarse-fingerprint.test.ts +97 -0
  213. package/src/activities/execute-cursor/__tests__/command-provenance.test.ts +240 -0
  214. package/src/activities/execute-cursor/__tests__/deny-gate-exact-apply.test.ts +203 -0
  215. package/src/activities/execute-cursor/__tests__/exact-apply.test.ts +375 -0
  216. package/src/activities/execute-cursor/__tests__/hitl-ledger.test.ts +1294 -24
  217. package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +446 -0
  218. package/src/activities/execute-cursor/__tests__/hook-script.test.ts +384 -110
  219. package/src/activities/execute-cursor/__tests__/message-translator.test.ts +171 -25
  220. package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +189 -0
  221. package/src/activities/execute-cursor/__tests__/tool-result-image.test.ts +44 -23
  222. package/src/activities/execute-cursor/__tests__/workspace-setup.test.ts +190 -10
  223. package/src/activities/execute-cursor/approval-policy.ts +28 -159
  224. package/src/activities/execute-cursor/approval-state.ts +366 -18
  225. package/src/activities/execute-cursor/capture-flow.ts +323 -0
  226. package/src/activities/execute-cursor/cas-observations.ts +204 -0
  227. package/src/activities/execute-cursor/command-provenance.ts +168 -0
  228. package/src/activities/execute-cursor/exact-apply.ts +253 -0
  229. package/src/activities/execute-cursor/hook-script.ts +317 -51
  230. package/src/activities/execute-cursor/index.ts +575 -67
  231. package/src/activities/execute-cursor/message-translator.ts +963 -89
  232. package/src/activities/execute-cursor/prompt-builder.ts +80 -14
  233. package/src/activities/execute-cursor/workspace-setup.ts +257 -42
  234. package/src/activities/execute-deep-agent/__test-utils__/gateway-substrate.ts +180 -0
  235. package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +134 -0
  236. package/src/activities/execute-deep-agent/__tests__/approval-file-change.test.ts +84 -0
  237. package/src/activities/execute-deep-agent/__tests__/attachment-injector.test.ts +11 -24
  238. package/src/activities/execute-deep-agent/__tests__/cas-capture-backend.test.ts +64 -0
  239. package/src/activities/execute-deep-agent/__tests__/cas-capture-observer.test.ts +163 -0
  240. package/src/activities/execute-deep-agent/__tests__/hitl-integration.test.ts +8 -5
  241. package/src/activities/execute-deep-agent/__tests__/hitl-resume-approve-all.test.ts +342 -0
  242. package/src/activities/execute-deep-agent/__tests__/hitl-resume-history.test.ts +284 -0
  243. package/src/activities/execute-deep-agent/__tests__/hitl.test.ts +14 -36
  244. package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +31 -13
  245. package/src/activities/execute-deep-agent/__tests__/sequential-gate-resume.test.ts +349 -0
  246. package/src/activities/execute-deep-agent/__tests__/stamp-flowed-rows.test.ts +119 -0
  247. package/src/activities/execute-deep-agent/__tests__/status-builder.test.ts +91 -10
  248. package/src/activities/execute-deep-agent/__tests__/streaming-v3.test.ts +9 -9
  249. package/src/activities/execute-deep-agent/__tests__/subagent-approval-propagation.test.ts +160 -0
  250. package/src/activities/execute-deep-agent/__tests__/subagent-gitignored-capture.test.ts +213 -0
  251. package/src/activities/execute-deep-agent/__tests__/subagent-transformer.test.ts +3 -6
  252. package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +84 -1
  253. package/src/activities/execute-deep-agent/__tests__/v3-status-builder.test.ts +4 -1
  254. package/src/activities/execute-deep-agent/approval-file-change.ts +80 -0
  255. package/src/activities/execute-deep-agent/attachment-injector.ts +20 -11
  256. package/src/activities/execute-deep-agent/cas-capture-backend.ts +66 -0
  257. package/src/activities/execute-deep-agent/cas-capture-observer.ts +125 -0
  258. package/src/activities/execute-deep-agent/hitl.ts +23 -7
  259. package/src/activities/execute-deep-agent/index.ts +463 -40
  260. package/src/activities/execute-deep-agent/inline-publisher.ts +27 -4
  261. package/src/activities/execute-deep-agent/setup.ts +223 -125
  262. package/src/activities/execute-deep-agent/stamp-flowed-rows.ts +64 -0
  263. package/src/activities/execute-deep-agent/status-builder-shared.ts +62 -23
  264. package/src/activities/execute-deep-agent/status-builder.ts +63 -8
  265. package/src/activities/execute-deep-agent/streaming-side-effects.ts +2 -16
  266. package/src/activities/execute-deep-agent/streaming.ts +3 -13
  267. package/src/activities/execute-deep-agent/subagent-transformer.ts +53 -13
  268. package/src/activities/execute-deep-agent/subagent-wiring.ts +50 -3
  269. package/src/activities/execute-deep-agent/v3-status-builder.ts +36 -2
  270. package/src/claimcheck/payload-codec.ts +8 -8
  271. package/src/client/stigmer-client.ts +9 -1
  272. package/src/middleware/__tests__/approval-gate.test.ts +488 -4
  273. package/src/middleware/approval-gate.ts +247 -38
  274. package/src/middleware/types.ts +5 -5
  275. package/src/shared/__tests__/activity-input.test.ts +78 -0
  276. package/src/shared/__tests__/approval-canonicalize.test.ts +106 -0
  277. package/src/shared/__tests__/approval-fingerprint.test.ts +115 -0
  278. package/src/shared/__tests__/approval-policy.test.ts +274 -40
  279. package/src/shared/__tests__/args-preview.test.ts +78 -0
  280. package/src/shared/__tests__/artifact-storage-extended.test.ts +62 -10
  281. package/src/shared/__tests__/artifact-storage.test.ts +123 -11
  282. package/src/shared/__tests__/file-change.test.ts +85 -0
  283. package/src/shared/__tests__/file-tools.test.ts +90 -0
  284. package/src/shared/__tests__/fingerprint-secret.test.ts +51 -0
  285. package/src/shared/__tests__/lease-scope-corpus.test.ts +56 -0
  286. package/src/shared/__tests__/model-client.test.ts +162 -0
  287. package/src/shared/__tests__/plan-artifact.test.ts +11 -26
  288. package/src/shared/__tests__/policy-source-corpus.test.ts +58 -0
  289. package/src/shared/__tests__/status-offload.test.ts +573 -16
  290. package/src/shared/__tests__/status.test.ts +4 -5
  291. package/src/shared/__tests__/tool-kind.test.ts +24 -1
  292. package/src/shared/__tests__/tool-row.test.ts +221 -0
  293. package/src/shared/activity-input.ts +57 -0
  294. package/src/shared/approval-canonicalize.ts +159 -0
  295. package/src/shared/approval-fingerprint.ts +148 -0
  296. package/src/shared/approval-policy.ts +303 -27
  297. package/src/shared/args-preview.ts +98 -0
  298. package/src/shared/artifact-storage.ts +62 -11
  299. package/src/shared/checkpointer/__tests__/http-saver.test.ts +1 -2
  300. package/src/shared/file-change.ts +64 -0
  301. package/src/shared/file-tools.ts +169 -0
  302. package/src/shared/filereview/__tests__/capture.test.ts +856 -0
  303. package/src/shared/filereview/__tests__/cas-substrate.test.ts +404 -0
  304. package/src/shared/filereview/__tests__/digest.test.ts +100 -0
  305. package/src/shared/filereview/__tests__/events.test.ts +245 -0
  306. package/src/shared/filereview/__tests__/git-substrate.test.ts +362 -0
  307. package/src/shared/filereview/__tests__/proxy-reconcile.test.ts +286 -0
  308. package/src/shared/filereview/__tests__/secret-paths.test.ts +121 -0
  309. package/src/shared/filereview/capture.ts +727 -0
  310. package/src/shared/filereview/cas-substrate.ts +401 -0
  311. package/src/shared/filereview/digest.ts +83 -0
  312. package/src/shared/filereview/events.ts +449 -0
  313. package/src/shared/filereview/git-substrate.ts +555 -0
  314. package/src/shared/filereview/index.ts +60 -0
  315. package/src/shared/filereview/secret-paths.ts +121 -0
  316. package/src/shared/fingerprint-secret.ts +53 -0
  317. package/src/shared/model-client.ts +122 -0
  318. package/src/shared/plan-artifact.ts +0 -2
  319. package/src/shared/status-offload.ts +433 -77
  320. package/src/shared/status.ts +13 -0
  321. package/src/shared/tool-kind.ts +33 -0
  322. package/src/shared/tool-row.ts +135 -0
  323. package/src/shared/workspace/platform-dir.ts +41 -2
  324. package/src/workflow-engine/__tests__/golden-execution.test.ts +35 -18
  325. package/src/workflow-engine/__tests__/tasks/try.test.ts +1 -1
  326. package/src/workflows/__tests__/connect-mcp-server.test.ts +304 -29
  327. package/src/workflows/call-agent-orchestrator.ts +53 -6
  328. package/src/workflows/connect-mcp-server.ts +179 -24
  329. package/src/workflows/types.ts +8 -0
@@ -0,0 +1,121 @@
1
+ /**
2
+ * The secret-safety gate for CAS capture (design doc 12).
3
+ *
4
+ * The git substrate never captures gitignored paths, which was an accidental
5
+ * safety property: `.gitignore` is where projects keep secrets (`.env`, private
6
+ * keys, credentials). The CAS substrate's whole purpose is to start capturing
7
+ * ignored / non-git paths — so, done naively, it would write secret bytes into
8
+ * durable artifact storage. This module is the fail-closed gate that prevents
9
+ * that: a path classified secret-like is BLOCKED from capture (authored as
10
+ * DIFF_UNREVIEWABLE instead) and its bytes never leave the workspace.
11
+ *
12
+ * Scope discipline (design doc 12 D2): this is deliberately a small, explicit,
13
+ * deterministic matcher — NOT the Phase-4 `sensitivity` taxonomy, NOT ML. It is
14
+ * a pure function over the path, so the cross-edition corpus can lock it (a path
15
+ * either blocks or captures, identically everywhere). The matcher errs toward
16
+ * blocking: a path only needs to LOOK secret-like to be withheld, because the
17
+ * cost of withholding a non-secret (it stays on the deny-gate, as today) is far
18
+ * lower than the cost of persisting a real secret.
19
+ *
20
+ * @since File-Change HITL Redesign (Phase 3 — CAS / DD-E)
21
+ */
22
+
23
+ /**
24
+ * Basename patterns that mark a file secret-like. Matched case-insensitively
25
+ * against the final path segment. Kept as an explicit, reviewable list — adding
26
+ * a pattern is a deliberate, corpus-locked change, never a heuristic guess.
27
+ */
28
+ export const SECRET_BASENAME_PATTERNS: readonly RegExp[] = [
29
+ /^\.env(\..+)?$/, // .env, .env.local, .env.production, ...
30
+ /^\.npmrc$/,
31
+ /^\.netrc$/,
32
+ /^\.pgpass$/,
33
+ /^\.htpasswd$/,
34
+ /^credentials(\.[A-Za-z0-9]+)?$/, // credentials, credentials.json, ...
35
+ /^secrets?(\.[A-Za-z0-9]+)?$/, // secret / secrets / secrets.yaml, ...
36
+ /^id_(rsa|dsa|ecdsa|ed25519)$/, // private SSH keys (no .pub)
37
+ /.*\.(pem|key|pfx|p12|keystore|jks|asc|ppk)$/,
38
+ /.*\.tfstate(\.backup)?$/, // terraform state embeds secrets
39
+ /.*\.tfvars$/,
40
+ /.*\.(kdbx)$/, // password databases
41
+ ];
42
+
43
+ /**
44
+ * Path-fragment patterns that mark a file secret-like by WHERE it lives, matched
45
+ * against the normalized (forward-slash) full path. Covers credential stores
46
+ * whose basenames alone are ambiguous.
47
+ */
48
+ export const SECRET_PATH_PATTERNS: readonly RegExp[] = [
49
+ /(^|\/)\.ssh\//, // ~/.ssh/* and repo-local .ssh/*
50
+ /(^|\/)\.aws\/credentials$/,
51
+ /(^|\/)\.gnupg\//,
52
+ /(^|\/)\.docker\/config\.json$/,
53
+ /(^|\/)\.kube\/config$/,
54
+ ];
55
+
56
+ /** The final path segment (basename), for both `/` and `\` separators. */
57
+ function basename(path: string): string {
58
+ const normalized = path.replace(/\\/g, "/");
59
+ const idx = normalized.lastIndexOf("/");
60
+ return idx >= 0 ? normalized.slice(idx + 1) : normalized;
61
+ }
62
+
63
+ /**
64
+ * Whether a path is secret-like and must NOT be captured into the durable CAS
65
+ * store. Fail-closed: an empty/unknown path is treated as secret-like (withheld)
66
+ * rather than captured.
67
+ */
68
+ export function isSecretLikePath(path: string): boolean {
69
+ if (!path) return true;
70
+ const normalized = path.replace(/\\/g, "/");
71
+ const base = basename(normalized).toLowerCase();
72
+
73
+ for (const re of SECRET_BASENAME_PATTERNS) {
74
+ if (re.test(base)) return true;
75
+ }
76
+ const lowerPath = normalized.toLowerCase();
77
+ for (const re of SECRET_PATH_PATTERNS) {
78
+ if (re.test(lowerPath)) return true;
79
+ }
80
+ return false;
81
+ }
82
+
83
+ /** How the turn's observed gitignored paths split under the secret gate. */
84
+ export interface CasSecretPartition {
85
+ /** Paths safe to capture into durable CAS (their bytes may be persisted). */
86
+ readonly capturablePaths: readonly string[];
87
+ /**
88
+ * Paths withheld from capture — authored as content-less DIFF_UNREVIEWABLE.
89
+ * The union of the gate's up-front blocks and any observed secret-like path.
90
+ */
91
+ readonly unreviewablePaths: readonly string[];
92
+ }
93
+
94
+ /**
95
+ * Split a turn's observed gitignored paths into capturable vs withheld — the
96
+ * single source of truth for "which ignored bytes may reach durable storage".
97
+ *
98
+ * `unreviewablePaths = gateBlockedPaths ∪ { p ∈ observed : isSecretLikePath(p) }`
99
+ * and `capturablePaths = { p ∈ observed : ¬isSecretLikePath(p) }`. The
100
+ * `isSecretLikePath` re-check over `observed` is the fail-closed backstop that
101
+ * holds **even under the global bypass** (`spec.auto_approve_all`): there the
102
+ * approval gate is not installed, so `gateBlockedPaths` is empty and this
103
+ * re-check is the only thing keeping a secret's bytes out of CAS. Order is
104
+ * preserved (gate blocks first, then observed order) and duplicates are folded,
105
+ * so the result is deterministic for the cross-edition corpus.
106
+ */
107
+ export function partitionIgnoredPathsBySecret(
108
+ observedPaths: Iterable<string>,
109
+ gateBlockedPaths: ReadonlySet<string>,
110
+ ): CasSecretPartition {
111
+ const unreviewable = new Set<string>(gateBlockedPaths);
112
+ const capturablePaths: string[] = [];
113
+ for (const path of observedPaths) {
114
+ if (isSecretLikePath(path)) {
115
+ unreviewable.add(path);
116
+ continue;
117
+ }
118
+ capturablePaths.push(path);
119
+ }
120
+ return { capturablePaths, unreviewablePaths: [...unreviewable] };
121
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Runner-held master secret for HITL approval fingerprints (Phase 2).
3
+ *
4
+ * The per-execution fingerprint key is derived from this secret + `execution_id`
5
+ * (see {@link file://./approval-fingerprint.ts} `deriveExecutionFingerprintKey`).
6
+ * Source precedence:
7
+ *
8
+ * 1. `STIGMER_RUNNER_HITL_SECRET` env var (UTF-8), when set — the only way to get
9
+ * a key that is STABLE across runner processes/replicas. Required once a lease
10
+ * becomes a cross-process bearer token (Phase 7); optional today.
11
+ * 2. A per-process random secret generated once at first use — sufficient for
12
+ * Phase 2 because the fingerprint is recompute-and-compare WITHIN one runner
13
+ * process for a given execution: the deep-agent gateway runs in-process, and
14
+ * the Cursor key is written to and read from the per-session state file by the
15
+ * same process. A process restart re-keys, which can only *re-ask* a pending
16
+ * approval (fail-safe), never silently mis-authorize.
17
+ *
18
+ * The secret is never logged. The value is memoized so the per-process fallback
19
+ * stays stable for the lifetime of the process.
20
+ */
21
+
22
+ import { randomBytes, type BinaryLike } from "node:crypto";
23
+
24
+ const ENV_VAR = "STIGMER_RUNNER_HITL_SECRET";
25
+
26
+ let cached: Buffer | undefined;
27
+ let warned = false;
28
+
29
+ /**
30
+ * Return the runner's HITL master secret (env-configured, else a stable
31
+ * per-process random fallback). Memoized.
32
+ */
33
+ export function getRunnerHitlMasterSecret(): BinaryLike {
34
+ if (cached) return cached;
35
+
36
+ const fromEnv = process.env[ENV_VAR];
37
+ if (fromEnv && fromEnv.length > 0) {
38
+ cached = Buffer.from(fromEnv, "utf-8");
39
+ return cached;
40
+ }
41
+
42
+ cached = randomBytes(32);
43
+ if (!warned) {
44
+ warned = true;
45
+ console.warn(
46
+ `[hitl-gateway] ${ENV_VAR} is not set; using a per-process random ` +
47
+ "fingerprint secret. Fingerprints are stable within this process only — " +
48
+ `set ${ENV_VAR} for a key stable across runner restarts/replicas ` +
49
+ "(required in Phase 7).",
50
+ );
51
+ }
52
+ return cached;
53
+ }
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Single construction point for LangChain chat models in the runner.
3
+ *
4
+ * This is the only place that translates a Stigmer registry model ID
5
+ * (dot-notation, e.g. "claude-haiku-4.5") into the provider's API model ID
6
+ * (e.g. "claude-haiku-4-5-20251001") before a client is built — so no
7
+ * activity can bypass the translation and 404 the provider.
8
+ *
9
+ * Layering: `llm-proxy.ts` stays pure routing utilities (no LangChain
10
+ * dependency); this module is the LangChain-aware layer above it that owns
11
+ * the resolve -> infer-provider -> strip-prefix -> proxy-wire -> construct
12
+ * sequence that used to be copy-pasted across every LLM activity.
13
+ */
14
+
15
+ import { ChatAnthropic } from "@langchain/anthropic";
16
+ import { ChatOpenAI } from "@langchain/openai";
17
+ import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
18
+
19
+ import {
20
+ inferProvider,
21
+ stripProviderPrefix,
22
+ resolveProxyBaseUrl,
23
+ buildProxyHeaders,
24
+ type LlmProvider,
25
+ } from "./llm-proxy.js";
26
+ import { resolveToApiModelId } from "./model-registry.js";
27
+
28
+ export interface BuildChatModelOptions {
29
+ /** Registry id ("claude-haiku-4.5"), "provider:model", or a provider API id. */
30
+ readonly modelName: string;
31
+ /** When set, requests route through the Stigmer proxy at the provider path. */
32
+ readonly proxyEndpoint?: string;
33
+ readonly stigmerToken?: string;
34
+ /** Scope headers for proxy FGA/billing attribution. */
35
+ readonly headerScope?: {
36
+ executionId?: string;
37
+ mcpServerId?: string;
38
+ workflowExecutionId?: string;
39
+ };
40
+ /** Defaults to 0. */
41
+ readonly temperature?: number;
42
+ /**
43
+ * Pass-through only; intentionally no default. Anthropic requires a value,
44
+ * but callers differ (setup omits it, call-llm uses 4096), so the default
45
+ * stays the caller's decision to avoid silently changing behavior.
46
+ */
47
+ readonly maxTokens?: number;
48
+ readonly timeoutMs?: number;
49
+ readonly maxRetries?: number;
50
+ }
51
+
52
+ export interface BuiltChatModel {
53
+ readonly model: BaseChatModel;
54
+ readonly provider: LlmProvider;
55
+ /** The resolved id actually handed to the provider. */
56
+ readonly apiModelId: string;
57
+ }
58
+
59
+ /**
60
+ * Build a configured chat model, resolving the registry id to a provider API
61
+ * id first. The resolution MUST precede provider inference and prefix
62
+ * stripping — that ordering is the invariant each per-site copy kept dropping,
63
+ * surfacing as `404 model: claude-haiku-4.5` at the provider.
64
+ */
65
+ export async function buildChatModel(opts: BuildChatModelOptions): Promise<BuiltChatModel> {
66
+ const resolved = await resolveToApiModelId(opts.modelName);
67
+ const provider = inferProvider(resolved);
68
+ const apiModelId = stripProviderPrefix(resolved);
69
+
70
+ const baseUrl = opts.proxyEndpoint
71
+ ? resolveProxyBaseUrl(opts.proxyEndpoint, provider)
72
+ : undefined;
73
+ const headers = opts.proxyEndpoint && opts.stigmerToken
74
+ ? buildProxyHeaders(opts.stigmerToken, opts.headerScope ?? {})
75
+ : undefined;
76
+
77
+ // Proxy mode authenticates with the Stigmer token; direct mode falls back to
78
+ // the provider's own env-var key.
79
+ const apiKey = opts.proxyEndpoint
80
+ ? (opts.stigmerToken ?? "proxy-managed")
81
+ : provider === "openai"
82
+ ? (process.env.OPENAI_API_KEY ?? "")
83
+ : (process.env.ANTHROPIC_API_KEY ?? "");
84
+
85
+ const common = {
86
+ temperature: opts.temperature ?? 0,
87
+ apiKey,
88
+ ...(opts.maxTokens ? { maxTokens: opts.maxTokens } : {}),
89
+ ...(opts.timeoutMs ? { maxRetries: opts.maxRetries ?? 0, timeout: opts.timeoutMs } : {}),
90
+ };
91
+
92
+ // The two SDKs name the transport-override block differently (OpenAI:
93
+ // `configuration`, Anthropic: `clientOptions`) — encapsulating that here is
94
+ // the whole point, since the shape mismatch is where bugs used to hide.
95
+ const model: BaseChatModel = provider === "openai"
96
+ ? new ChatOpenAI({
97
+ model: apiModelId,
98
+ ...common,
99
+ ...(baseUrl || headers
100
+ ? {
101
+ configuration: {
102
+ ...(baseUrl ? { baseURL: baseUrl } : {}),
103
+ ...(headers ? { defaultHeaders: headers } : {}),
104
+ },
105
+ }
106
+ : {}),
107
+ })
108
+ : new ChatAnthropic({
109
+ model: apiModelId,
110
+ ...common,
111
+ ...(baseUrl || headers
112
+ ? {
113
+ clientOptions: {
114
+ ...(baseUrl ? { baseURL: baseUrl } : {}),
115
+ ...(headers ? { defaultHeaders: headers } : {}),
116
+ },
117
+ }
118
+ : {}),
119
+ });
120
+
121
+ return { model, provider, apiModelId };
122
+ }
@@ -87,7 +87,6 @@ export async function publishPlanArtifact(opts: {
87
87
  const storageKey = `artifacts/${executionId}/${PLAN_ARTIFACT_NAME}`;
88
88
 
89
89
  await artifactStorage.upload(storageKey, content, "text/markdown");
90
- const downloadUrl = await artifactStorage.getDownloadUrl(storageKey);
91
90
 
92
91
  const artifact = create(ExecutionArtifactSchema, {
93
92
  name: PLAN_ARTIFACT_NAME,
@@ -95,7 +94,6 @@ export async function publishPlanArtifact(opts: {
95
94
  kind: ExecutionArtifactKind.FILE,
96
95
  sizeBytes: BigInt(content.length),
97
96
  storageKey,
98
- downloadUrl,
99
97
  createdAt: utcTimestamp(),
100
98
  contentHash,
101
99
  });