@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,162 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+
3
+ // Capture constructor args without pulling in the real SDKs. vi.hoisted lets the
4
+ // hoisted vi.mock factories reference these spies safely.
5
+ const { mockAnthropicCtor, mockOpenAICtor } = vi.hoisted(() => ({
6
+ mockAnthropicCtor: vi.fn(),
7
+ mockOpenAICtor: vi.fn(),
8
+ }));
9
+
10
+ vi.mock("@langchain/anthropic", () => ({
11
+ ChatAnthropic: vi.fn((args: unknown) => {
12
+ mockAnthropicCtor(args);
13
+ return { provider: "anthropic", args };
14
+ }),
15
+ }));
16
+
17
+ vi.mock("@langchain/openai", () => ({
18
+ ChatOpenAI: vi.fn((args: unknown) => {
19
+ mockOpenAICtor(args);
20
+ return { provider: "openai", args };
21
+ }),
22
+ }));
23
+
24
+ import { buildChatModel } from "../model-client.js";
25
+ import { _resetRegistryCache } from "../model-registry.js";
26
+
27
+ interface MockModel {
28
+ id: string;
29
+ apiModelId?: string;
30
+ provider: string;
31
+ costTier?: string;
32
+ harness?: string;
33
+ }
34
+
35
+ function mockRegistryResponse(models: MockModel[]) {
36
+ return vi.spyOn(globalThis, "fetch").mockResolvedValueOnce(
37
+ new Response(JSON.stringify({ models }), {
38
+ status: 200,
39
+ headers: { "Content-Type": "application/json" },
40
+ }),
41
+ );
42
+ }
43
+
44
+ function lastAnthropicArgs(): Record<string, unknown> {
45
+ return mockAnthropicCtor.mock.calls.at(-1)?.[0] as Record<string, unknown>;
46
+ }
47
+
48
+ describe("buildChatModel", () => {
49
+ const savedEnv = { ...process.env };
50
+
51
+ beforeEach(() => {
52
+ _resetRegistryCache();
53
+ vi.clearAllMocks();
54
+ delete process.env.ANTHROPIC_API_KEY;
55
+ delete process.env.OPENAI_API_KEY;
56
+ });
57
+
58
+ afterEach(() => {
59
+ _resetRegistryCache();
60
+ vi.restoreAllMocks();
61
+ process.env = { ...savedEnv };
62
+ });
63
+
64
+ it("resolves a registry id to the provider apiModelId before construction", async () => {
65
+ mockRegistryResponse([
66
+ { id: "claude-haiku-4.5", apiModelId: "claude-haiku-4-5-20251001", provider: "anthropic" },
67
+ ]);
68
+
69
+ const { provider, apiModelId } = await buildChatModel({ modelName: "claude-haiku-4.5" });
70
+
71
+ expect(provider).toBe("anthropic");
72
+ expect(apiModelId).toBe("claude-haiku-4-5-20251001");
73
+ expect(lastAnthropicArgs()).toMatchObject({ model: "claude-haiku-4-5-20251001" });
74
+ });
75
+
76
+ it("infers the OpenAI provider and routes to ChatOpenAI", async () => {
77
+ mockRegistryResponse([
78
+ { id: "gpt-4.1", apiModelId: "gpt-4.1", provider: "openai" },
79
+ ]);
80
+
81
+ const { provider } = await buildChatModel({ modelName: "gpt-4.1" });
82
+
83
+ expect(provider).toBe("openai");
84
+ expect(mockOpenAICtor).toHaveBeenCalledTimes(1);
85
+ expect(mockAnthropicCtor).not.toHaveBeenCalled();
86
+ });
87
+
88
+ it("wires the Anthropic proxy base URL, headers, and token in proxy mode", async () => {
89
+ mockRegistryResponse([
90
+ { id: "claude-haiku-4.5", apiModelId: "claude-haiku-4-5-20251001", provider: "anthropic" },
91
+ ]);
92
+
93
+ await buildChatModel({
94
+ modelName: "claude-haiku-4.5",
95
+ proxyEndpoint: "https://api.stigmer.ai",
96
+ stigmerToken: "tok-123",
97
+ headerScope: { executionId: "ex-1" },
98
+ });
99
+
100
+ expect(lastAnthropicArgs()).toMatchObject({
101
+ apiKey: "tok-123",
102
+ clientOptions: {
103
+ baseURL: "https://api.stigmer.ai/v1/proxy/llm/anthropic",
104
+ defaultHeaders: {
105
+ Authorization: "Bearer tok-123",
106
+ "X-Stigmer-Execution-Id": "ex-1",
107
+ },
108
+ },
109
+ });
110
+ });
111
+
112
+ it("wires the OpenAI proxy path under `configuration` (not `clientOptions`)", async () => {
113
+ mockRegistryResponse([
114
+ { id: "gpt-4.1", apiModelId: "gpt-4.1", provider: "openai" },
115
+ ]);
116
+
117
+ await buildChatModel({
118
+ modelName: "gpt-4.1",
119
+ proxyEndpoint: "https://api.stigmer.ai",
120
+ stigmerToken: "tok",
121
+ });
122
+
123
+ const args = mockOpenAICtor.mock.calls.at(-1)?.[0] as Record<string, unknown>;
124
+ expect(args).toMatchObject({
125
+ configuration: { baseURL: "https://api.stigmer.ai/v1/proxy/llm/openai/v1" },
126
+ });
127
+ });
128
+
129
+ it("uses the provider env var key in direct mode (no proxy)", async () => {
130
+ process.env.ANTHROPIC_API_KEY = "sk-direct";
131
+ mockRegistryResponse([
132
+ { id: "claude-haiku-4.5", apiModelId: "claude-haiku-4-5-20251001", provider: "anthropic" },
133
+ ]);
134
+
135
+ await buildChatModel({ modelName: "claude-haiku-4.5" });
136
+
137
+ const args = lastAnthropicArgs();
138
+ expect(args.apiKey).toBe("sk-direct");
139
+ expect(args).not.toHaveProperty("clientOptions");
140
+ });
141
+
142
+ it("omits maxTokens unless explicitly provided", async () => {
143
+ mockRegistryResponse([
144
+ { id: "claude-haiku-4.5", apiModelId: "claude-haiku-4-5-20251001", provider: "anthropic" },
145
+ ]);
146
+
147
+ await buildChatModel({ modelName: "claude-haiku-4.5" });
148
+ expect(lastAnthropicArgs()).not.toHaveProperty("maxTokens");
149
+
150
+ await buildChatModel({ modelName: "claude-haiku-4.5", maxTokens: 4096 });
151
+ expect(lastAnthropicArgs()).toMatchObject({ maxTokens: 4096 });
152
+ });
153
+
154
+ it("passes the model id through unchanged when the registry is unavailable", async () => {
155
+ vi.spyOn(globalThis, "fetch").mockRejectedValueOnce(new Error("network down"));
156
+
157
+ const { provider, apiModelId } = await buildChatModel({ modelName: "claude-haiku-4.5" });
158
+
159
+ expect(provider).toBe("anthropic");
160
+ expect(apiModelId).toBe("claude-haiku-4.5");
161
+ });
162
+ });
@@ -7,6 +7,7 @@ import {
7
7
  MessageType,
8
8
  } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
9
9
  import type { ArtifactStorage } from "../artifact-storage.js";
10
+ import { makeInMemoryArtifactStorage } from "../../__test-utils__/fake-artifact-storage.js";
10
11
  import {
11
12
  extractFinalPlanText,
12
13
  publishPlanArtifact,
@@ -14,22 +15,16 @@ import {
14
15
  PLAN_ARTIFACT_SANDBOX_PATH,
15
16
  } from "../plan-artifact.js";
16
17
 
17
- /** Records uploads and returns deterministic download URLs. */
18
+ /** Records uploads and returns deterministic download URLs (canonical double + shim). */
18
19
  function fakeStorage(): ArtifactStorage & { uploads: { key: string; content: Buffer; contentType?: string }[] } {
20
+ const { storage, blobs } = makeInMemoryArtifactStorage({ urlBase: "https://example.test/download/" });
19
21
  const uploads: { key: string; content: Buffer; contentType?: string }[] = [];
20
- return {
21
- uploads,
22
- async upload(key, content, contentType) {
23
- uploads.push({ key, content, contentType });
24
- return key;
25
- },
26
- async getDownloadUrl(key) {
27
- return `https://example.test/download/${key}`;
28
- },
29
- async exists() {
30
- return true;
31
- },
32
- };
22
+ storage.upload.mockImplementation(async (key: string, content: Buffer, contentType?: string) => {
23
+ uploads.push({ key, content, contentType });
24
+ blobs.set(key, Buffer.from(content));
25
+ return key;
26
+ });
27
+ return Object.assign(storage, { uploads });
33
28
  }
34
29
 
35
30
  function statusWith(...messages: { type: MessageType; content: string }[]) {
@@ -86,7 +81,6 @@ describe("publishPlanArtifact", () => {
86
81
  expect(artifact.sandboxPath).toBe(PLAN_ARTIFACT_SANDBOX_PATH);
87
82
  expect(artifact.kind).toBe(ExecutionArtifactKind.FILE);
88
83
  expect(artifact.storageKey).toBe("artifacts/aex_123/plan.md");
89
- expect(artifact.downloadUrl).toBe("https://example.test/download/artifacts/aex_123/plan.md");
90
84
  expect(artifact.sizeBytes).toBeGreaterThan(0n);
91
85
  expect(artifact.contentHash).toHaveLength(64);
92
86
  });
@@ -122,17 +116,8 @@ describe("publishPlanArtifact", () => {
122
116
 
123
117
  it("never throws when the upload fails (publish is non-fatal)", async () => {
124
118
  const status = create(AgentExecutionStatusSchema, {});
125
- const failing: ArtifactStorage = {
126
- async upload() {
127
- throw new Error("network down");
128
- },
129
- async getDownloadUrl() {
130
- return "";
131
- },
132
- async exists() {
133
- return false;
134
- },
135
- };
119
+ const { storage: failing } = makeInMemoryArtifactStorage();
120
+ failing.upload.mockImplementation(async () => { throw new Error("network down"); });
136
121
 
137
122
  await expect(
138
123
  publishPlanArtifact({ status, executionId: "aex_fail", planText: "plan", artifactStorage: failing }),
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Cross-edition authorization-provenance parity.
3
+ *
4
+ * Loads the shared corpus (apis/testdata/hitl/policy-source/vectors.json) and
5
+ * asserts the runner's {@link toProtoPolicySource} maps each PolicySource onto
6
+ * the proto enum number the backends consume. The Go (policy_source_corpus_test.go)
7
+ * and Java (PolicySourceFixtureTest) editions load the same file and assert the
8
+ * generated enum resolves the same name to the same number, so a drift in the
9
+ * runner mapping or a renumbering of the enum in any edition fails one of the
10
+ * three suites — the guarantee that a persisted approval_policy_source means the
11
+ * same thing everywhere.
12
+ */
13
+
14
+ import { describe, it, expect } from "vitest";
15
+ import { readFileSync } from "node:fs";
16
+ import { fileURLToPath } from "node:url";
17
+ import { ApprovalPolicySource } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
18
+ import { toProtoPolicySource, type PolicySource } from "../approval-policy.js";
19
+
20
+ interface PolicySourceVector {
21
+ name: string;
22
+ policySource: PolicySource | null;
23
+ name_proto: string;
24
+ number: number;
25
+ }
26
+
27
+ const vectorsPath = fileURLToPath(
28
+ new URL(
29
+ "../../../../../../apis/testdata/hitl/policy-source/vectors.json",
30
+ import.meta.url,
31
+ ),
32
+ );
33
+ const corpus = JSON.parse(readFileSync(vectorsPath, "utf-8")) as {
34
+ vectors: PolicySourceVector[];
35
+ };
36
+
37
+ describe("policy-source mapping vector corpus", () => {
38
+ it("loads the full enum corpus", () => {
39
+ // One vector per ApprovalPolicySource value (incl. UNSPECIFIED).
40
+ const enumValueCount = Object.values(ApprovalPolicySource).filter(
41
+ (v) => typeof v === "number",
42
+ ).length;
43
+ expect(corpus.vectors.length).toBe(enumValueCount);
44
+ });
45
+
46
+ for (const v of corpus.vectors) {
47
+ it(`vector: ${v.name}`, () => {
48
+ // The runner maps undefined (no governing layer) -> UNSPECIFIED; the corpus
49
+ // encodes that case as policySource: null.
50
+ const source = v.policySource ?? undefined;
51
+ expect(toProtoPolicySource(source)).toBe(v.number);
52
+ // The generated enum's reverse lookup must name the same value, with the
53
+ // proto prefix the backends use stripped to the runner's short member name.
54
+ const shortName = v.name_proto.replace("APPROVAL_POLICY_SOURCE_", "");
55
+ expect(ApprovalPolicySource[v.number]).toBe(shortName);
56
+ });
57
+ }
58
+ });