@stigmer/runner 3.10.0 → 3.11.1-dev.20260812192248

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 (355) hide show
  1. package/README.md +14 -1
  2. package/dist/.build-fingerprint +1 -1
  3. package/dist/activities/call-llm.js +9 -10
  4. package/dist/activities/call-llm.js.map +1 -1
  5. package/dist/activities/classify-tool-approvals.d.ts +2 -1
  6. package/dist/activities/classify-tool-approvals.js +28 -2
  7. package/dist/activities/classify-tool-approvals.js.map +1 -1
  8. package/dist/activities/discover-mcp-server.d.ts +39 -0
  9. package/dist/activities/discover-mcp-server.js +165 -28
  10. package/dist/activities/discover-mcp-server.js.map +1 -1
  11. package/dist/activities/emit-event.d.ts +14 -2
  12. package/dist/activities/emit-event.js +52 -17
  13. package/dist/activities/emit-event.js.map +1 -1
  14. package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.d.ts +8 -0
  15. package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js +1 -1
  16. package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js.map +1 -1
  17. package/dist/activities/execute-cursor/approval-state.d.ts +28 -2
  18. package/dist/activities/execute-cursor/approval-state.js +7 -1
  19. package/dist/activities/execute-cursor/approval-state.js.map +1 -1
  20. package/dist/activities/execute-cursor/attachment-resolver.d.ts +14 -0
  21. package/dist/activities/execute-cursor/attachment-resolver.js +18 -4
  22. package/dist/activities/execute-cursor/attachment-resolver.js.map +1 -1
  23. package/dist/activities/execute-cursor/blueprint-resolver.d.ts +1 -9
  24. package/dist/activities/execute-cursor/blueprint-resolver.js +6 -22
  25. package/dist/activities/execute-cursor/blueprint-resolver.js.map +1 -1
  26. package/dist/activities/execute-cursor/env-resolver.js +3 -1
  27. package/dist/activities/execute-cursor/env-resolver.js.map +1 -1
  28. package/dist/activities/execute-cursor/error-classifier.d.ts +59 -3
  29. package/dist/activities/execute-cursor/error-classifier.js +115 -6
  30. package/dist/activities/execute-cursor/error-classifier.js.map +1 -1
  31. package/dist/activities/execute-cursor/extract-structured-output.d.ts +29 -0
  32. package/dist/activities/execute-cursor/extract-structured-output.js +58 -0
  33. package/dist/activities/execute-cursor/extract-structured-output.js.map +1 -0
  34. package/dist/activities/execute-cursor/hook-script.d.ts +14 -3
  35. package/dist/activities/execute-cursor/hook-script.js +72 -10
  36. package/dist/activities/execute-cursor/hook-script.js.map +1 -1
  37. package/dist/activities/execute-cursor/index.d.ts +51 -11
  38. package/dist/activities/execute-cursor/index.js +177 -93
  39. package/dist/activities/execute-cursor/index.js.map +1 -1
  40. package/dist/activities/execute-cursor/mcp-resolver.d.ts +24 -1
  41. package/dist/activities/execute-cursor/mcp-resolver.js +5 -2
  42. package/dist/activities/execute-cursor/mcp-resolver.js.map +1 -1
  43. package/dist/activities/execute-cursor/model-pricing-data.d.ts +2 -0
  44. package/dist/activities/execute-cursor/model-pricing-data.js +13 -3
  45. package/dist/activities/execute-cursor/model-pricing-data.js.map +1 -1
  46. package/dist/activities/execute-cursor/prompt-builder.d.ts +51 -4
  47. package/dist/activities/execute-cursor/prompt-builder.js +49 -7
  48. package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
  49. package/dist/activities/execute-cursor/turn-recovery.d.ts +52 -0
  50. package/dist/activities/execute-cursor/turn-recovery.js +193 -0
  51. package/dist/activities/execute-cursor/turn-recovery.js.map +1 -0
  52. package/dist/activities/execute-cursor/turn-stream.js +4 -1
  53. package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
  54. package/dist/activities/execute-deep-agent/attachment-injector.d.ts +18 -1
  55. package/dist/activities/execute-deep-agent/attachment-injector.js +68 -23
  56. package/dist/activities/execute-deep-agent/attachment-injector.js.map +1 -1
  57. package/dist/activities/execute-deep-agent/environment.js +3 -1
  58. package/dist/activities/execute-deep-agent/environment.js.map +1 -1
  59. package/dist/activities/execute-deep-agent/index.js +15 -0
  60. package/dist/activities/execute-deep-agent/index.js.map +1 -1
  61. package/dist/activities/execute-deep-agent/prompt-builder.d.ts +7 -7
  62. package/dist/activities/execute-deep-agent/prompt-builder.js +8 -2
  63. package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
  64. package/dist/activities/execute-deep-agent/setup.d.ts +10 -0
  65. package/dist/activities/execute-deep-agent/setup.js +65 -24
  66. package/dist/activities/execute-deep-agent/setup.js.map +1 -1
  67. package/dist/activities/execute-deep-agent/shell-env.d.ts +5 -1
  68. package/dist/activities/execute-deep-agent/shell-env.js +7 -9
  69. package/dist/activities/execute-deep-agent/shell-env.js.map +1 -1
  70. package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +18 -1
  71. package/dist/activities/execute-deep-agent/subagent-transformer.js +15 -2
  72. package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
  73. package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +27 -6
  74. package/dist/activities/execute-deep-agent/subagent-wiring.js +26 -5
  75. package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -1
  76. package/dist/activities/hydrate-workflow-execution.js +8 -3
  77. package/dist/activities/hydrate-workflow-execution.js.map +1 -1
  78. package/dist/activities/run-command.d.ts +5 -2
  79. package/dist/activities/run-command.js +22 -10
  80. package/dist/activities/run-command.js.map +1 -1
  81. package/dist/activities/run-env.d.ts +40 -0
  82. package/dist/activities/run-env.js +66 -0
  83. package/dist/activities/run-env.js.map +1 -0
  84. package/dist/activities/workflow-event-activities.d.ts +28 -10
  85. package/dist/activities/workflow-event-activities.js +87 -58
  86. package/dist/activities/workflow-event-activities.js.map +1 -1
  87. package/dist/bootstrap.js +5 -0
  88. package/dist/bootstrap.js.map +1 -1
  89. package/dist/claimcheck/payload-codec.js +21 -1
  90. package/dist/claimcheck/payload-codec.js.map +1 -1
  91. package/dist/client/stigmer-client.d.ts +83 -21
  92. package/dist/client/stigmer-client.js +106 -29
  93. package/dist/client/stigmer-client.js.map +1 -1
  94. package/dist/encryption/config.d.ts +64 -0
  95. package/dist/encryption/config.js +108 -0
  96. package/dist/encryption/config.js.map +1 -0
  97. package/dist/encryption/index.d.ts +3 -0
  98. package/dist/encryption/index.js +3 -0
  99. package/dist/encryption/index.js.map +1 -0
  100. package/dist/encryption/payload-codec.d.ts +41 -0
  101. package/dist/encryption/payload-codec.js +130 -0
  102. package/dist/encryption/payload-codec.js.map +1 -0
  103. package/dist/middleware/index.d.ts +3 -0
  104. package/dist/middleware/index.js +7 -0
  105. package/dist/middleware/index.js.map +1 -1
  106. package/dist/middleware/path-normalization.d.ts +57 -0
  107. package/dist/middleware/path-normalization.js +109 -0
  108. package/dist/middleware/path-normalization.js.map +1 -0
  109. package/dist/middleware/types.d.ts +8 -0
  110. package/dist/payload-codecs.d.ts +17 -0
  111. package/dist/payload-codecs.js +42 -0
  112. package/dist/payload-codecs.js.map +1 -0
  113. package/dist/preflight.d.ts +31 -0
  114. package/dist/preflight.js +43 -0
  115. package/dist/preflight.js.map +1 -1
  116. package/dist/runner-manager.js +21 -17
  117. package/dist/runner-manager.js.map +1 -1
  118. package/dist/runner.js +11 -18
  119. package/dist/runner.js.map +1 -1
  120. package/dist/shared/approval-policy.d.ts +9 -3
  121. package/dist/shared/approval-policy.js +15 -6
  122. package/dist/shared/approval-policy.js.map +1 -1
  123. package/dist/shared/artifact-storage.d.ts +23 -1
  124. package/dist/shared/artifact-storage.js +51 -10
  125. package/dist/shared/artifact-storage.js.map +1 -1
  126. package/dist/shared/attachment-naming.d.ts +53 -0
  127. package/dist/shared/attachment-naming.js +59 -0
  128. package/dist/shared/attachment-naming.js.map +1 -0
  129. package/dist/shared/caller-identity.d.ts +23 -2
  130. package/dist/shared/caller-identity.js +36 -5
  131. package/dist/shared/caller-identity.js.map +1 -1
  132. package/dist/shared/channel-attachment.js +1 -0
  133. package/dist/shared/channel-attachment.js.map +1 -1
  134. package/dist/shared/checkpointer/http-saver.d.ts +26 -1
  135. package/dist/shared/checkpointer/http-saver.js +54 -8
  136. package/dist/shared/checkpointer/http-saver.js.map +1 -1
  137. package/dist/shared/conversation-attachment.js +1 -0
  138. package/dist/shared/conversation-attachment.js.map +1 -1
  139. package/dist/shared/conversation-catchup.d.ts +9 -2
  140. package/dist/shared/conversation-catchup.js +39 -6
  141. package/dist/shared/conversation-catchup.js.map +1 -1
  142. package/dist/shared/datastore-attachment.d.ts +50 -7
  143. package/dist/shared/datastore-attachment.js +93 -11
  144. package/dist/shared/datastore-attachment.js.map +1 -1
  145. package/dist/shared/grpc-retry.d.ts +5 -1
  146. package/dist/shared/grpc-retry.js +5 -1
  147. package/dist/shared/grpc-retry.js.map +1 -1
  148. package/dist/shared/http-retry.d.ts +85 -0
  149. package/dist/shared/http-retry.js +101 -0
  150. package/dist/shared/http-retry.js.map +1 -0
  151. package/dist/shared/llm-backend.d.ts +275 -0
  152. package/dist/shared/llm-backend.js +425 -0
  153. package/dist/shared/llm-backend.js.map +1 -0
  154. package/dist/shared/llm-proxy.d.ts +8 -0
  155. package/dist/shared/llm-proxy.js +15 -0
  156. package/dist/shared/llm-proxy.js.map +1 -1
  157. package/dist/shared/mcp-enabled-tools.d.ts +57 -0
  158. package/dist/shared/mcp-enabled-tools.js +86 -0
  159. package/dist/shared/mcp-enabled-tools.js.map +1 -0
  160. package/dist/shared/mcp-manager.d.ts +11 -5
  161. package/dist/shared/mcp-manager.js +47 -8
  162. package/dist/shared/mcp-manager.js.map +1 -1
  163. package/dist/shared/mcp-resolver.d.ts +39 -2
  164. package/dist/shared/mcp-resolver.js +38 -2
  165. package/dist/shared/mcp-resolver.js.map +1 -1
  166. package/dist/shared/mcp-schema-sanitizer.d.ts +70 -0
  167. package/dist/shared/mcp-schema-sanitizer.js +197 -0
  168. package/dist/shared/mcp-schema-sanitizer.js.map +1 -0
  169. package/dist/shared/model-client.d.ts +18 -5
  170. package/dist/shared/model-client.js +149 -18
  171. package/dist/shared/model-client.js.map +1 -1
  172. package/dist/shared/model-error.js +198 -5
  173. package/dist/shared/model-error.js.map +1 -1
  174. package/dist/shared/model-pricing-data.d.ts +2 -0
  175. package/dist/shared/model-pricing-data.js +13 -3
  176. package/dist/shared/model-pricing-data.js.map +1 -1
  177. package/dist/shared/model-registry.js +3 -2
  178. package/dist/shared/model-registry.js.map +1 -1
  179. package/dist/shared/plan-mode-permissions.d.ts +33 -0
  180. package/dist/shared/plan-mode-permissions.js +35 -0
  181. package/dist/shared/plan-mode-permissions.js.map +1 -0
  182. package/dist/shared/registry-endpoint.d.ts +20 -0
  183. package/dist/shared/registry-endpoint.js +25 -0
  184. package/dist/shared/registry-endpoint.js.map +1 -1
  185. package/dist/shared/runner-credential-keys.d.ts +24 -0
  186. package/dist/shared/runner-credential-keys.js +47 -0
  187. package/dist/shared/runner-credential-keys.js.map +1 -0
  188. package/dist/worker.d.ts +2 -1
  189. package/dist/worker.js +2 -4
  190. package/dist/worker.js.map +1 -1
  191. package/dist/workflow-engine/resolve.d.ts +19 -1
  192. package/dist/workflow-engine/resolve.js +37 -2
  193. package/dist/workflow-engine/resolve.js.map +1 -1
  194. package/dist/workflow-engine/types.d.ts +18 -0
  195. package/dist/workflow-engine/types.js.map +1 -1
  196. package/dist/workflows/call-agent-orchestrator.d.ts +9 -0
  197. package/dist/workflows/call-agent-orchestrator.js +1 -0
  198. package/dist/workflows/call-agent-orchestrator.js.map +1 -1
  199. package/dist/workflows/connect-mcp-server.js +9 -0
  200. package/dist/workflows/connect-mcp-server.js.map +1 -1
  201. package/dist/workflows/engine-core.js +23 -2
  202. package/dist/workflows/engine-core.js.map +1 -1
  203. package/dist/workflows/execute-from-execution.d.ts +1 -1
  204. package/dist/workflows/execute-from-execution.js +11 -1
  205. package/dist/workflows/execute-from-execution.js.map +1 -1
  206. package/dist/workflows/types.d.ts +8 -0
  207. package/package.json +9 -4
  208. package/src/__test-utils__/__tests__/vitest-global-setup.test.ts +37 -0
  209. package/src/__test-utils__/vitest-global-setup.ts +50 -0
  210. package/src/__tests__/bootstrap.test.ts +43 -0
  211. package/src/__tests__/claimcheck-codec.test.ts +36 -0
  212. package/src/__tests__/encryption-codec.test.ts +287 -0
  213. package/src/__tests__/fixtures/encrypted-payload-fixture.json +15 -0
  214. package/src/__tests__/history-encryption-e2e.test.ts +243 -0
  215. package/src/__tests__/preflight.test.ts +65 -2
  216. package/src/activities/__tests__/call-llm.test.ts +75 -0
  217. package/src/activities/__tests__/classify-tool-approvals.test.ts +117 -1
  218. package/src/activities/__tests__/discover-mcp-server.hang.test.ts +103 -0
  219. package/src/activities/__tests__/discover-mcp-server.test.ts +242 -1
  220. package/src/activities/__tests__/error-classifier.test.ts +94 -2
  221. package/src/activities/__tests__/run-command.test.ts +221 -0
  222. package/src/activities/__tests__/workflow-event-activities.test.ts +107 -8
  223. package/src/activities/call-llm.ts +9 -16
  224. package/src/activities/classify-tool-approvals.ts +34 -4
  225. package/src/activities/discover-mcp-server.ts +203 -31
  226. package/src/activities/emit-event.ts +65 -21
  227. package/src/activities/execute-cursor/__test-utils__/cursor-hook-harness.ts +9 -0
  228. package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +14 -0
  229. package/src/activities/execute-cursor/__tests__/attachment-resolver.test.ts +53 -0
  230. package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +151 -16
  231. package/src/activities/execute-cursor/__tests__/error-classifier-extraction.test.ts +208 -0
  232. package/src/activities/execute-cursor/__tests__/extract-structured-output.test.ts +120 -0
  233. package/src/activities/execute-cursor/__tests__/hook-script.test.ts +93 -0
  234. package/src/activities/execute-cursor/__tests__/mcp-resolver.test.ts +125 -0
  235. package/src/activities/execute-cursor/__tests__/model-pricing.test.ts +62 -1
  236. package/src/activities/execute-cursor/__tests__/prompt-builder-delegation.test.ts +1 -1
  237. package/src/activities/execute-cursor/__tests__/turn-recovery.test.ts +160 -0
  238. package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +13 -0
  239. package/src/activities/execute-cursor/approval-state.ts +30 -1
  240. package/src/activities/execute-cursor/attachment-resolver.ts +31 -3
  241. package/src/activities/execute-cursor/blueprint-resolver.ts +7 -27
  242. package/src/activities/execute-cursor/env-resolver.ts +3 -1
  243. package/src/activities/execute-cursor/error-classifier.ts +131 -7
  244. package/src/activities/execute-cursor/extract-structured-output.ts +72 -0
  245. package/src/activities/execute-cursor/hook-script.ts +74 -10
  246. package/src/activities/execute-cursor/index.ts +209 -109
  247. package/src/activities/execute-cursor/mcp-resolver.ts +36 -2
  248. package/src/activities/execute-cursor/model-pricing-data.ts +22 -3
  249. package/src/activities/execute-cursor/prompt-builder.ts +85 -9
  250. package/src/activities/execute-cursor/turn-recovery.ts +208 -0
  251. package/src/activities/execute-cursor/turn-stream.ts +5 -2
  252. package/src/activities/execute-deep-agent/__tests__/attachment-injector.test.ts +110 -8
  253. package/src/activities/execute-deep-agent/__tests__/datastore-degradation.test.ts +104 -0
  254. package/src/activities/execute-deep-agent/__tests__/hitl-reject.test.ts +2 -0
  255. package/src/activities/execute-deep-agent/__tests__/hitl-resume-approve-all.test.ts +1 -0
  256. package/src/activities/execute-deep-agent/__tests__/hitl-resume-history.test.ts +1 -0
  257. package/src/activities/execute-deep-agent/__tests__/plan-mode-path-normalization.test.ts +174 -0
  258. package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +34 -5
  259. package/src/activities/execute-deep-agent/__tests__/sequential-gate-resume.test.ts +1 -0
  260. package/src/activities/execute-deep-agent/__tests__/shell-env.test.ts +24 -10
  261. package/src/activities/execute-deep-agent/__tests__/subagent-plan-mode-permissions.test.ts +178 -0
  262. package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +12 -7
  263. package/src/activities/execute-deep-agent/attachment-injector.ts +94 -30
  264. package/src/activities/execute-deep-agent/environment.ts +3 -1
  265. package/src/activities/execute-deep-agent/index.ts +20 -0
  266. package/src/activities/execute-deep-agent/prompt-builder.ts +20 -10
  267. package/src/activities/execute-deep-agent/setup.ts +85 -29
  268. package/src/activities/execute-deep-agent/shell-env.ts +8 -9
  269. package/src/activities/execute-deep-agent/subagent-transformer.ts +30 -2
  270. package/src/activities/execute-deep-agent/subagent-wiring.ts +39 -6
  271. package/src/activities/hydrate-workflow-execution.ts +8 -3
  272. package/src/activities/run-command.ts +25 -12
  273. package/src/activities/run-env.ts +79 -0
  274. package/src/activities/workflow-event-activities.ts +96 -69
  275. package/src/bootstrap.ts +5 -0
  276. package/src/claimcheck/payload-codec.ts +33 -1
  277. package/src/client/__tests__/stigmer-client.test.ts +110 -11
  278. package/src/client/stigmer-client.ts +150 -37
  279. package/src/encryption/config.ts +155 -0
  280. package/src/encryption/index.ts +3 -0
  281. package/src/encryption/payload-codec.ts +152 -0
  282. package/src/middleware/__tests__/path-normalization.test.ts +140 -0
  283. package/src/middleware/index.ts +8 -0
  284. package/src/middleware/path-normalization.ts +125 -0
  285. package/src/middleware/types.ts +11 -0
  286. package/src/payload-codecs.ts +62 -0
  287. package/src/preflight.ts +45 -0
  288. package/src/runner-manager.ts +26 -26
  289. package/src/runner.ts +12 -27
  290. package/src/shared/__tests__/approval-policy.test.ts +82 -39
  291. package/src/shared/__tests__/artifact-storage.test.ts +145 -2
  292. package/src/shared/__tests__/attachment-naming.test.ts +159 -0
  293. package/src/shared/__tests__/bedrock-adapter.test.ts +213 -0
  294. package/src/shared/__tests__/bedrock-seam.test.ts +390 -0
  295. package/src/shared/__tests__/caller-identity.test.ts +25 -0
  296. package/src/shared/__tests__/channel-attachment.test.ts +1 -1
  297. package/src/shared/__tests__/connect-backfill.test.ts +1 -0
  298. package/src/shared/__tests__/conversation-attachment.test.ts +1 -1
  299. package/src/shared/__tests__/conversation-catchup.test.ts +24 -0
  300. package/src/shared/__tests__/datastore-attachment.test.ts +129 -1
  301. package/src/shared/__tests__/foundry-adapter.test.ts +276 -0
  302. package/src/shared/__tests__/foundry-seam.test.ts +482 -0
  303. package/src/shared/__tests__/http-retry.test.ts +68 -0
  304. package/src/shared/__tests__/llm-backend.test.ts +616 -0
  305. package/src/shared/__tests__/mcp-enabled-tools.test.ts +86 -0
  306. package/src/shared/__tests__/mcp-manager.test.ts +137 -15
  307. package/src/shared/__tests__/mcp-resolver.test.ts +146 -3
  308. package/src/shared/__tests__/mcp-schema-sanitizer.test.ts +267 -0
  309. package/src/shared/__tests__/model-client.test.ts +200 -0
  310. package/src/shared/__tests__/model-error.test.ts +289 -1
  311. package/src/shared/__tests__/model-pricing.test.ts +62 -2
  312. package/src/shared/__tests__/model-registry.test.ts +22 -0
  313. package/src/shared/__tests__/synthesized-attachment.test.ts +1 -0
  314. package/src/shared/__tests__/vertex-adapter.test.ts +169 -0
  315. package/src/shared/__tests__/vertex-seam.test.ts +295 -0
  316. package/src/shared/approval-policy.ts +14 -7
  317. package/src/shared/artifact-storage.ts +75 -10
  318. package/src/shared/attachment-naming.ts +78 -0
  319. package/src/shared/caller-identity.ts +40 -5
  320. package/src/shared/channel-attachment.ts +1 -0
  321. package/src/shared/checkpointer/__tests__/http-saver.test.ts +196 -1
  322. package/src/shared/checkpointer/http-saver.ts +71 -8
  323. package/src/shared/conversation-attachment.ts +1 -0
  324. package/src/shared/conversation-catchup.ts +39 -6
  325. package/src/shared/datastore-attachment.ts +106 -11
  326. package/src/shared/grpc-retry.ts +5 -1
  327. package/src/shared/http-retry.ts +139 -0
  328. package/src/shared/llm-backend.ts +544 -0
  329. package/src/shared/llm-proxy.ts +15 -0
  330. package/src/shared/mcp-enabled-tools.ts +105 -0
  331. package/src/shared/mcp-manager.ts +56 -8
  332. package/src/shared/mcp-resolver.ts +73 -2
  333. package/src/shared/mcp-schema-sanitizer.ts +224 -0
  334. package/src/shared/model-client.ts +179 -19
  335. package/src/shared/model-error.ts +222 -4
  336. package/src/shared/model-pricing-data.ts +22 -3
  337. package/src/shared/model-registry.ts +7 -2
  338. package/src/shared/plan-mode-permissions.ts +37 -0
  339. package/src/shared/registry-endpoint.ts +27 -0
  340. package/src/shared/runner-credential-keys.ts +46 -0
  341. package/src/worker.ts +4 -5
  342. package/src/workflow-engine/__tests__/tasks/emit-event.test.ts +127 -49
  343. package/src/workflow-engine/resolve.ts +48 -2
  344. package/src/workflow-engine/types.ts +18 -0
  345. package/src/workflows/__tests__/connect-mcp-server.test.ts +25 -0
  346. package/src/workflows/__tests__/execute-serverless-workflow.test.ts +68 -2
  347. package/src/workflows/call-agent-orchestrator.ts +10 -0
  348. package/src/workflows/connect-mcp-server.ts +9 -0
  349. package/src/workflows/engine-core.ts +23 -2
  350. package/src/workflows/execute-from-execution.ts +12 -2
  351. package/src/workflows/types.ts +8 -0
  352. package/dist/activities/execute-cursor/mcp-config.d.ts +0 -30
  353. package/dist/activities/execute-cursor/mcp-config.js +0 -39
  354. package/dist/activities/execute-cursor/mcp-config.js.map +0 -1
  355. package/src/activities/execute-cursor/mcp-config.ts +0 -66
@@ -2,6 +2,12 @@
2
2
  * Sub-agent middleware composition for ExecuteDeepAgent.
3
3
  *
4
4
  * Each sub-agent gets its own middleware stack with:
5
+ * - Path normalization (issue #429), FIRST and only on permission-rule-
6
+ * bearing graphs (plan mode) — workspace-relative paths are rewritten to
7
+ * workspace-absolute before deepagents' permission validation refuses
8
+ * them, exactly as on the parent. `compileSubagents` derives it from the
9
+ * same `permissions` option it bakes into the graph, keeping the rules
10
+ * and their normalization shim coupled.
5
11
  * - Fresh loop detection (independent cycle tracking)
6
12
  * - Fresh tool truncation (same limits as parent)
7
13
  * - Periodic execution budget (interval=30, max=4 advisories)
@@ -9,11 +15,16 @@
9
15
  * bypassed) — installed only when the parent itself is gated
10
16
  * (`approvalGate` present; absent under auto-approve-all)
11
17
  * - Shared cost cap view (parent's budget, no reset on sub-agent start)
18
+ * - Error hints (issue #255): a thrown tool error becomes a recoverable
19
+ * ToolMessage exactly as on the parent. Without it, any tool throw — a
20
+ * plan-mode permission denial, an MCP hiccup — propagated out of the
21
+ * sub-agent graph and killed the whole delegated task, losing all its
22
+ * accumulated work, where the parent's identical error is one failed
23
+ * tool round the model adapts to.
12
24
  *
13
25
  * The sub-agent middleware stack does NOT include:
14
26
  * - Graceful stop (parent handles STOP signal propagation)
15
27
  * - OTel spans (parent's OTel context propagates automatically)
16
- * - Error hints (applied at tool level, not sub-agent level)
17
28
  *
18
29
  * Approval-gate note: the gate is what *creates* the LangGraph `interrupt()`.
19
30
  * A sub-agent's interrupt does surface at the parent checkpoint and resumes
@@ -21,23 +32,32 @@
21
32
  * the gate runs inside the sub-agent in the first place — omitting it here was
22
33
  * the live HITL bypass this wiring closes.
23
34
  */
35
+ import { createPathNormalizationMiddleware } from "../../middleware/path-normalization.js";
24
36
  import { createLoopDetectionMiddleware } from "../../middleware/loop-detection.js";
25
37
  import { createToolTruncationMiddleware } from "../../middleware/tool-truncation.js";
26
38
  import { createExecutionBudgetMiddleware } from "../../middleware/execution-budget.js";
27
39
  import { createApprovalGateMiddleware, } from "../../middleware/approval-gate.js";
40
+ import { createErrorHintsMiddleware } from "../../middleware/error-hints.js";
28
41
  const SUB_AGENT_ADVISORY_INTERVAL = 30;
29
42
  const SUB_AGENT_MAX_ADVISORIES = 4;
30
43
  /**
31
44
  * Build the middleware stack for a single sub-agent.
32
45
  *
33
46
  * Returns an ordered array mirroring the parent composition:
34
- * loop detection → execution budget (periodic) → tool truncation →
35
- * [approval gate] → cost cap view. The gate sits before the cost-cap view so an
36
- * approval pause happens before budget accounting, matching the parent order
37
- * (…→ truncation graceful-stop approval gate cost cap …).
47
+ * [path normalization] → loop detection → execution budget (periodic) →
48
+ * tool truncation → [approval gate] → cost cap view error hints.
49
+ * Normalization is outermost so everything downstream observes canonical
50
+ * workspace-absolute paths (matching the parent). The gate sits before the
51
+ * cost-cap view so an approval pause happens before budget accounting, and
52
+ * error hints come after the gate — both matching the parent order
53
+ * (…→ truncation → graceful-stop → approval gate → cost cap → error hints …),
54
+ * which keeps the gate's HITL interrupt outside the hints' try/catch.
38
55
  */
39
56
  export function buildSubAgentMiddleware(options = {}) {
40
57
  const stack = [];
58
+ if (options.pathNormalization) {
59
+ stack.push(createPathNormalizationMiddleware(options.pathNormalization));
60
+ }
41
61
  stack.push(createLoopDetectionMiddleware({ enabled: true }));
42
62
  stack.push(createExecutionBudgetMiddleware({
43
63
  warningInterval: SUB_AGENT_ADVISORY_INTERVAL,
@@ -61,6 +81,7 @@ export function buildSubAgentMiddleware(options = {}) {
61
81
  if (options.costCap) {
62
82
  stack.push(options.costCap.forSubAgent());
63
83
  }
84
+ stack.push(createErrorHintsMiddleware());
64
85
  return stack;
65
86
  }
66
87
  //# sourceMappingURL=subagent-wiring.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-wiring.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/subagent-wiring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AACvF,OAAO,EACL,4BAA4B,GAE7B,MAAM,mCAAmC,CAAC;AAE3C,MAAM,2BAA2B,GAAG,EAAE,CAAC;AACvC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAsBnC;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CACrC,UAAqC,EAAE;IAEvC,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE7D,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC;QACzC,eAAe,EAAE,2BAA2B;QAC5C,WAAW,EAAE,wBAAwB;KACtC,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAEnE,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,6EAA6E;QAC7E,6EAA6E;QAC7E,uEAAuE;QACvE,0EAA0E;QAC1E,6EAA6E;QAC7E,uEAAuE;QACvE,+EAA+E;QAC/E,2EAA2E;QAC3E,+EAA+E;QAC/E,KAAK,CAAC,IAAI,CAAC,4BAA4B,CACrC,OAAO,CAAC,cAAc;YACpB,CAAC,CAAC,OAAO,CAAC,YAAY;YACtB,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,CACvF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"subagent-wiring.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/subagent-wiring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAQH,OAAO,EAAE,iCAAiC,EAAE,MAAM,wCAAwC,CAAC;AAC3F,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AACvF,OAAO,EACL,4BAA4B,GAE7B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E,MAAM,2BAA2B,GAAG,EAAE,CAAC;AACvC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AA4BnC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,uBAAuB,CACrC,UAAqC,EAAE;IAEvC,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE7D,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC;QACzC,eAAe,EAAE,2BAA2B;QAC5C,WAAW,EAAE,wBAAwB;KACtC,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAEnE,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,6EAA6E;QAC7E,6EAA6E;QAC7E,uEAAuE;QACvE,0EAA0E;QAC1E,6EAA6E;QAC7E,uEAAuE;QACvE,+EAA+E;QAC/E,2EAA2E;QAC3E,+EAA+E;QAC/E,KAAK,CAAC,IAAI,CAAC,4BAA4B,CACrC,OAAO,CAAC,cAAc;YACpB,CAAC,CAAC,OAAO,CAAC,YAAY;YACtB,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,CACvF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC,CAAC;IAEzC,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -175,9 +175,14 @@ function parseWorkflowYaml(yaml, workflowId) {
175
175
  }
176
176
  }
177
177
  async function fetchAndFlattenEnv(client, executionId) {
178
- // A desktop runner exchanges its bootstrap credential for a token scoped to
179
- // this workflow execution, so cloud's decrypt gate binds the read (#156).
180
- // No-op for cloud sandbox and OSS runners.
178
+ // The runner acquires a token scoped to this workflow execution so the
179
+ // server's decrypt gate binds the read: a desktop runner exchanges its
180
+ // bootstrap credential (#156, hard error on failure — the bootstrap
181
+ // credential no longer decrypts since stigmer-cloud#218, so proceeding
182
+ // would hydrate redacted placeholders), and an OSS runner asks the
183
+ // credential-less best-effort exchange (oss#535 — the OSS server redacts
184
+ // EC reads by default and mints execution-scoped tokens). No-op for cloud
185
+ // sandbox runners, whose ambient credential is already scoped.
181
186
  const scopedToken = await client.acquireScopedRunnerToken({
182
187
  workflowExecutionId: executionId,
183
188
  });
@@ -1 +1 @@
1
- {"version":3,"file":"hydrate-workflow-execution.js","sourceRoot":"","sources":["../../src/activities/hydrate-workflow-execution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hydrate-workflow-execution.js","sourceRoot":"","sources":["../../src/activities/hydrate-workflow-execution.ts"],"names":[],"mappings":"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"}
@@ -5,8 +5,11 @@
5
5
  * - RunScript: writes inline code to a temp file, executes via node/python
6
6
  * - RunShell: executes a shell command directly
7
7
  *
8
- * Both resolve runtime placeholders (JIT secrets) before execution
9
- * and capture stdout as the activity result.
8
+ * The child environment follows the declare-to-receive contract in
9
+ * run-env.ts: a minimal base plus the task's declared `environment`,
10
+ * with runtime placeholders (JIT secrets) resolved here in the activity
11
+ * so secret values never enter Temporal history. Both activities capture
12
+ * stdout as the activity result.
10
13
  */
11
14
  import type { RunCommandConfig } from "../workflow-engine/types.js";
12
15
  export declare function createRunCommandActivities(): {
@@ -5,8 +5,11 @@
5
5
  * - RunScript: writes inline code to a temp file, executes via node/python
6
6
  * - RunShell: executes a shell command directly
7
7
  *
8
- * Both resolve runtime placeholders (JIT secrets) before execution
9
- * and capture stdout as the activity result.
8
+ * The child environment follows the declare-to-receive contract in
9
+ * run-env.ts: a minimal base plus the task's declared `environment`,
10
+ * with runtime placeholders (JIT secrets) resolved here in the activity
11
+ * so secret values never enter Temporal history. Both activities capture
12
+ * stdout as the activity result.
10
13
  */
11
14
  import { execFile, exec } from "node:child_process";
12
15
  import { writeFile, mkdtemp, rm } from "node:fs/promises";
@@ -14,7 +17,9 @@ import { tmpdir } from "node:os";
14
17
  import { join } from "node:path";
15
18
  import { promisify } from "node:util";
16
19
  import { ApplicationFailure } from "@temporalio/activity";
20
+ import { RuntimePlaceholderResolutionError } from "../workflow-engine/resolve.js";
17
21
  import { startHeartbeat } from "../shared/heartbeat.js";
22
+ import { buildRunEnv } from "./run-env.js";
18
23
  const execFileAsync = promisify(execFile);
19
24
  const execAsync = promisify(exec);
20
25
  export function createRunCommandActivities() {
@@ -45,7 +50,7 @@ async function runScriptImpl(config) {
45
50
  }
46
51
  const language = config.language;
47
52
  const code = config.code;
48
- const env = buildEnv(config.environment);
53
+ const env = buildTaskEnv(config);
49
54
  const ext = language === "js" ? ".js" : ".py";
50
55
  const interpreter = language === "js" ? "node" : "python3";
51
56
  let tempDir;
@@ -82,7 +87,7 @@ async function runShellImpl(config) {
82
87
  const fullCommand = args.length > 0
83
88
  ? `${command} ${args.join(" ")}`
84
89
  : command;
85
- const env = buildEnv(config.environment);
90
+ const env = buildTaskEnv(config);
86
91
  try {
87
92
  const { stdout } = await execAsync(fullCommand, {
88
93
  env,
@@ -98,14 +103,21 @@ async function runShellImpl(config) {
98
103
  throw err;
99
104
  }
100
105
  }
101
- function buildEnv(taskEnv) {
102
- const base = { ...process.env };
103
- if (taskEnv) {
104
- for (const [k, v] of Object.entries(taskEnv)) {
105
- base[k] = v;
106
+ /**
107
+ * Build the child env per the run-env.ts contract, translating a missing
108
+ * placeholder key into a non-retryable failure — retrying cannot conjure
109
+ * a variable the workflow's runtime env does not have.
110
+ */
111
+ function buildTaskEnv(config) {
112
+ try {
113
+ return buildRunEnv(config.environment, config.runtimeEnv);
114
+ }
115
+ catch (err) {
116
+ if (err instanceof RuntimePlaceholderResolutionError) {
117
+ throw ApplicationFailure.nonRetryable(err.message, "RUN_ENV_UNRESOLVED_PLACEHOLDER", { variable: err.variableName });
106
118
  }
119
+ throw err;
107
120
  }
108
- return base;
109
121
  }
110
122
  function buildArgsList(args) {
111
123
  if (!args)
@@ -1 +1 @@
1
- {"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/activities/run-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/activities/run-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Environment contract for the workflow `run` task (shell and script modes).
3
+ *
4
+ * Declare-to-receive, the same rule the stdio MCP contract adopted after
5
+ * #256 (PR #383): the child process sees ONLY
6
+ *
7
+ * 1. a minimal base copied from the runner process
8
+ * ({@link RUN_ENV_BASE_KEYS} — the six variables the MCP SDK pins),
9
+ * 2. the task's declared `environment` map, with `${.secrets.KEY}` /
10
+ * `${.env_vars.KEY}` placeholders resolved just-in-time from the
11
+ * workflow's runtime env. Resolution happens here in the activity,
12
+ * never in the deterministic workflow phase, so secret values stay
13
+ * out of Temporal history.
14
+ *
15
+ * Runner credentials (STIGMER_TOKEN, the HITL secret, provider keys) are
16
+ * structurally absent rather than denylisted — a workflow-authored
17
+ * `printenv` cannot read what was never passed (oss#384). A missing
18
+ * placeholder key fails loudly: running a command with a silently-empty
19
+ * credential produces cryptic downstream failures.
20
+ *
21
+ * Placeholders resolve only in declared environment VALUES, never in
22
+ * `command` / `code` strings — argv is visible to `ps` on the host, so
23
+ * the environment is the sanctioned channel for secrets.
24
+ */
25
+ /**
26
+ * Base variables copied from the runner process when present — the same
27
+ * six the MCP SDK provides to stdio servers, so "undeclared subprocess
28
+ * environment" has one platform-wide answer. `PATH` keeps interpreters
29
+ * and tools findable; the rest keep shells and language runtimes sane.
30
+ */
31
+ export declare const RUN_ENV_BASE_KEYS: readonly string[];
32
+ /**
33
+ * Build the environment for a run task's child process: minimal base +
34
+ * declared overlay with strict placeholder resolution (declared wins on
35
+ * conflict with the base).
36
+ *
37
+ * @throws RuntimePlaceholderResolutionError when a declared value
38
+ * references a runtime key that does not exist.
39
+ */
40
+ export declare function buildRunEnv(declaredEnv: Readonly<Record<string, string>> | undefined, runtimeEnv: Readonly<Record<string, unknown>>, baseEnv?: NodeJS.ProcessEnv): Record<string, string>;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Environment contract for the workflow `run` task (shell and script modes).
3
+ *
4
+ * Declare-to-receive, the same rule the stdio MCP contract adopted after
5
+ * #256 (PR #383): the child process sees ONLY
6
+ *
7
+ * 1. a minimal base copied from the runner process
8
+ * ({@link RUN_ENV_BASE_KEYS} — the six variables the MCP SDK pins),
9
+ * 2. the task's declared `environment` map, with `${.secrets.KEY}` /
10
+ * `${.env_vars.KEY}` placeholders resolved just-in-time from the
11
+ * workflow's runtime env. Resolution happens here in the activity,
12
+ * never in the deterministic workflow phase, so secret values stay
13
+ * out of Temporal history.
14
+ *
15
+ * Runner credentials (STIGMER_TOKEN, the HITL secret, provider keys) are
16
+ * structurally absent rather than denylisted — a workflow-authored
17
+ * `printenv` cannot read what was never passed (oss#384). A missing
18
+ * placeholder key fails loudly: running a command with a silently-empty
19
+ * credential produces cryptic downstream failures.
20
+ *
21
+ * Placeholders resolve only in declared environment VALUES, never in
22
+ * `command` / `code` strings — argv is visible to `ps` on the host, so
23
+ * the environment is the sanctioned channel for secrets.
24
+ */
25
+ import { resolveRuntimePlaceholdersStrict } from "../workflow-engine/resolve.js";
26
+ /**
27
+ * Base variables copied from the runner process when present — the same
28
+ * six the MCP SDK provides to stdio servers, so "undeclared subprocess
29
+ * environment" has one platform-wide answer. `PATH` keeps interpreters
30
+ * and tools findable; the rest keep shells and language runtimes sane.
31
+ */
32
+ export const RUN_ENV_BASE_KEYS = [
33
+ "HOME",
34
+ "LOGNAME",
35
+ "PATH",
36
+ "SHELL",
37
+ "TERM",
38
+ "USER",
39
+ ];
40
+ /**
41
+ * Build the environment for a run task's child process: minimal base +
42
+ * declared overlay with strict placeholder resolution (declared wins on
43
+ * conflict with the base).
44
+ *
45
+ * @throws RuntimePlaceholderResolutionError when a declared value
46
+ * references a runtime key that does not exist.
47
+ */
48
+ export function buildRunEnv(declaredEnv, runtimeEnv, baseEnv = process.env) {
49
+ const env = {};
50
+ for (const key of RUN_ENV_BASE_KEYS) {
51
+ const value = baseEnv[key];
52
+ if (value !== undefined)
53
+ env[key] = value;
54
+ }
55
+ if (!declaredEnv || Object.keys(declaredEnv).length === 0) {
56
+ // The only case whose behavior changed in oss#384 (previously the
57
+ // child inherited the full runner env) — leave a trace for operators.
58
+ console.log("run task declares no environment — child receives the minimal base env only");
59
+ return env;
60
+ }
61
+ for (const [key, value] of Object.entries(declaredEnv)) {
62
+ env[key] = resolveRuntimePlaceholdersStrict(value, runtimeEnv, `environment "${key}"`);
63
+ }
64
+ return env;
65
+ }
66
+ //# sourceMappingURL=run-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-env.js","sourceRoot":"","sources":["../../src/activities/run-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AAEjF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,MAAM;IACN,SAAS;IACT,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;CACP,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CACzB,WAAyD,EACzD,UAA6C,EAC7C,UAA6B,OAAO,CAAC,GAAG;IAExC,MAAM,GAAG,GAA2B,EAAE,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,kEAAkE;QAClE,sEAAsE;QACtE,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAC3F,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,GAAG,CAAC,GAAG,gCAAgC,CACzC,KAAK,EACL,UAAU,EACV,gBAAgB,GAAG,GAAG,CACvB,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -3,8 +3,12 @@
3
3
  *
4
4
  * Converts plain event descriptors (safe for the Temporal deterministic
5
5
  * sandbox) into WorkflowExecutionEvent proto objects and sends them
6
- * alongside a status update via gRPC. Best-effort failures are logged
7
- * but do not fail the activity.
6
+ * alongside a status update via gRPC. Failures propagate so the local
7
+ * activity's retry policy fires safe because sequence numbers are
8
+ * workflow-assigned (stable across attempts) and the store skips
9
+ * already-persisted sequences, making retries idempotent. The workflow's
10
+ * emit wrappers catch after retries are exhausted; event emission never
11
+ * fails a run.
8
12
  *
9
13
  * Registered as proxyLocalActivities in engine-core.ts so the workflow
10
14
  * sandbox can emit events at task boundaries and approval gates.
@@ -14,21 +18,35 @@ import type { WorkflowEventDescriptor } from "../workflow-engine/types.js";
14
18
  import type { TaskStatusEntry } from "../workflow-engine/task-status-accumulator.js";
15
19
  import type { RecoveryTaskData } from "../workflow-engine/recovery.js";
16
20
  /**
17
- * Initialize the event sequence counter from the persisted high-water mark.
21
+ * Return the persisted event-log high-water mark for the execution, and
22
+ * seed the legacy process-global counter from it.
18
23
  *
19
- * On first run (no prior events), the counter stays at 0 and the first
20
- * event gets sequence_number = 1 identical to the original behavior.
24
+ * The workflow seeds its own sequence counter from the returned value
25
+ * (patched path); the legacy global seed remains for pre-patch replays,
26
+ * whose emit path still assigns sequences here in the activity.
21
27
  *
22
- * On recovery (events already persisted from a failed run), the counter
23
- * is set to the highest persisted sequence_number so that new events
24
- * continue from N+1, avoiding duplicate-key collisions in storage.
28
+ * On first run (no prior events) returns 0, so the first event gets
29
+ * sequence_number = 1. On recovery (events already persisted from a
30
+ * failed run) returns the highest persisted sequence_number, so new
31
+ * events continue from N+1.
25
32
  *
26
33
  * When executionId is empty (direct executeServerlessWorkflow without a
27
- * persisted execution), the counter resets to 0 as a safe fallback.
34
+ * persisted execution), returns 0 as a safe fallback.
35
+ *
36
+ * Returns a plain number — the value crosses back into the workflow
37
+ * through Temporal's JSON payload converter, which cannot carry BigInt.
28
38
  */
29
- export declare function initSequenceFromEventLog(executionId: string): Promise<void>;
39
+ export declare function initSequenceFromEventLog(executionId: string): Promise<number>;
30
40
  /** @internal Exported for unit testing only. */
31
41
  export declare function toProtoEvent(desc: WorkflowEventDescriptor): WorkflowExecutionEvent;
42
+ /**
43
+ * Emit workflow events (with the accompanying status snapshot) to the
44
+ * server. Errors propagate so the local activity retry policy fires;
45
+ * retries are idempotent because workflow-assigned sequence numbers are
46
+ * stable across attempts and the store skips already-persisted ones. The
47
+ * workflow-side emit wrappers absorb the failure after retries are
48
+ * exhausted, so a broken timeline write never fails the run.
49
+ */
32
50
  export declare function emitWorkflowEvents(executionId: string, events: WorkflowEventDescriptor[], taskStatuses?: TaskStatusEntry[]): Promise<void>;
33
51
  /**
34
52
  * Loads recovery context data from the previous run's status snapshot.
@@ -3,8 +3,12 @@
3
3
  *
4
4
  * Converts plain event descriptors (safe for the Temporal deterministic
5
5
  * sandbox) into WorkflowExecutionEvent proto objects and sends them
6
- * alongside a status update via gRPC. Best-effort failures are logged
7
- * but do not fail the activity.
6
+ * alongside a status update via gRPC. Failures propagate so the local
7
+ * activity's retry policy fires safe because sequence numbers are
8
+ * workflow-assigned (stable across attempts) and the store skips
9
+ * already-persisted sequences, making retries idempotent. The workflow's
10
+ * emit wrappers catch after retries are exhausted; event emission never
11
+ * fails a run.
8
12
  *
9
13
  * Registered as proxyLocalActivities in engine-core.ts so the workflow
10
14
  * sandbox can emit events at task boundaries and approval gates.
@@ -110,38 +114,60 @@ function buildClient() {
110
114
  token: config.stigmerToken,
111
115
  });
112
116
  }
117
+ /**
118
+ * LEGACY sequence assignment — only for descriptors that arrive without a
119
+ * workflow-assigned `sequenceNumber`, i.e. replays of histories recorded
120
+ * before the "workflow-assigned-event-sequences" patch (see
121
+ * engine-core.ts). This counter is process-global: it is shared across
122
+ * every execution on the worker and resets on worker restart, which is
123
+ * the root cause of oss#308's silent event loss. Deliberately NOT fixed —
124
+ * pre-patch executions keep their old (flawed) behavior for the
125
+ * migration window. Delete together with the patch gate once pre-patch
126
+ * executions have drained.
127
+ */
113
128
  let sequenceCounter = 0;
114
129
  function nextSequence() {
115
130
  sequenceCounter += 1;
116
131
  return BigInt(sequenceCounter);
117
132
  }
118
133
  /**
119
- * Initialize the event sequence counter from the persisted high-water mark.
134
+ * Return the persisted event-log high-water mark for the execution, and
135
+ * seed the legacy process-global counter from it.
120
136
  *
121
- * On first run (no prior events), the counter stays at 0 and the first
122
- * event gets sequence_number = 1 identical to the original behavior.
137
+ * The workflow seeds its own sequence counter from the returned value
138
+ * (patched path); the legacy global seed remains for pre-patch replays,
139
+ * whose emit path still assigns sequences here in the activity.
123
140
  *
124
- * On recovery (events already persisted from a failed run), the counter
125
- * is set to the highest persisted sequence_number so that new events
126
- * continue from N+1, avoiding duplicate-key collisions in storage.
141
+ * On first run (no prior events) returns 0, so the first event gets
142
+ * sequence_number = 1. On recovery (events already persisted from a
143
+ * failed run) returns the highest persisted sequence_number, so new
144
+ * events continue from N+1.
127
145
  *
128
146
  * When executionId is empty (direct executeServerlessWorkflow without a
129
- * persisted execution), the counter resets to 0 as a safe fallback.
147
+ * persisted execution), returns 0 as a safe fallback.
148
+ *
149
+ * Returns a plain number — the value crosses back into the workflow
150
+ * through Temporal's JSON payload converter, which cannot carry BigInt.
130
151
  */
131
152
  export async function initSequenceFromEventLog(executionId) {
132
153
  if (!executionId) {
133
154
  sequenceCounter = 0;
134
- return;
155
+ return 0;
135
156
  }
136
157
  const client = buildClient();
137
158
  const highWaterMark = await client.getEventLogHighWaterMark(executionId);
138
159
  sequenceCounter = Number(highWaterMark);
160
+ return sequenceCounter;
139
161
  }
140
162
  /** @internal Exported for unit testing only. */
141
163
  export function toProtoEvent(desc) {
142
164
  const base = create(WorkflowExecutionEventSchema, {
143
165
  eventId: crypto.randomUUID(),
144
- sequenceNumber: nextSequence(),
166
+ // Workflow-assigned sequence when present (stable across activity
167
+ // retries); legacy activity-side assignment only for pre-patch replays.
168
+ sequenceNumber: desc.sequenceNumber !== undefined
169
+ ? BigInt(desc.sequenceNumber)
170
+ : nextSequence(),
145
171
  occurredAt: desc.occurredAt,
146
172
  taskName: desc.taskName ?? "",
147
173
  });
@@ -331,58 +357,61 @@ export function toProtoEvent(desc) {
331
357
  }
332
358
  return base;
333
359
  }
360
+ /**
361
+ * Emit workflow events (with the accompanying status snapshot) to the
362
+ * server. Errors propagate so the local activity retry policy fires;
363
+ * retries are idempotent because workflow-assigned sequence numbers are
364
+ * stable across attempts and the store skips already-persisted ones. The
365
+ * workflow-side emit wrappers absorb the failure after retries are
366
+ * exhausted, so a broken timeline write never fails the run.
367
+ */
334
368
  export async function emitWorkflowEvents(executionId, events, taskStatuses) {
335
369
  if (!executionId || events.length === 0)
336
370
  return;
337
- try {
338
- const client = buildClient();
339
- const protoEvents = events.map(toProtoEvent);
340
- const protoTasks = (taskStatuses ?? []).map(ts => create(WorkflowTaskSchema, {
341
- taskId: ts.taskId ?? "",
342
- taskName: ts.taskName,
343
- taskType: TASK_KIND_TO_TYPE_MAP[ts.taskKind] ?? WorkflowTaskType.WORKFLOW_TASK_TYPE_UNSPECIFIED,
344
- status: TASK_STATUS_MAP[ts.status],
345
- startedAt: ts.startedAt ?? "",
346
- completedAt: ts.completedAt ?? "",
347
- error: ts.error ?? "",
348
- input: toJsonObject(ts.input),
349
- output: toJsonObject(ts.output),
350
- metadata: toJsonObject(ts.metadata),
351
- costMicros: BigInt(ts.costMicros ?? 0),
352
- inputTokens: BigInt(ts.inputTokens ?? 0),
353
- outputTokens: BigInt(ts.outputTokens ?? 0),
354
- uiHint: ts.uiHint ?? "",
355
- }));
356
- const startedEvent = events.find(e => e.type === "execution_started");
357
- const completedEvent = events.find(e => e.type === "execution_completed");
358
- const failedEvent = events.find(e => e.type === "execution_failed");
359
- const statusFields = { tasks: protoTasks };
360
- if (startedEvent) {
361
- statusFields.phase = ExecutionPhase.EXECUTION_IN_PROGRESS;
362
- statusFields.startedAt = startedEvent.occurredAt;
363
- }
364
- if (completedEvent && completedEvent.type === "execution_completed") {
365
- statusFields.phase = ExecutionPhase.EXECUTION_COMPLETED;
366
- statusFields.completedAt = completedEvent.occurredAt;
367
- statusFields.totalCostMicros = BigInt(completedEvent.totalCostMicros);
368
- statusFields.totalInputTokens = BigInt(completedEvent.totalInputTokens ?? 0);
369
- statusFields.totalOutputTokens = BigInt(completedEvent.totalOutputTokens ?? 0);
370
- }
371
- if (failedEvent && failedEvent.type === "execution_failed") {
372
- statusFields.phase = ExecutionPhase.EXECUTION_FAILED;
373
- statusFields.completedAt = failedEvent.occurredAt;
374
- statusFields.error = failedEvent.error;
375
- }
376
- const input = create(WorkflowExecutionUpdateStatusInputSchema, {
377
- executionId,
378
- status: create(WorkflowExecutionStatusSchema, statusFields),
379
- events: protoEvents,
380
- });
381
- await client.workflowExecutionCommand.updateStatus(input);
371
+ const client = buildClient();
372
+ const protoEvents = events.map(toProtoEvent);
373
+ const protoTasks = (taskStatuses ?? []).map(ts => create(WorkflowTaskSchema, {
374
+ taskId: ts.taskId ?? "",
375
+ taskName: ts.taskName,
376
+ taskType: TASK_KIND_TO_TYPE_MAP[ts.taskKind] ?? WorkflowTaskType.WORKFLOW_TASK_TYPE_UNSPECIFIED,
377
+ status: TASK_STATUS_MAP[ts.status],
378
+ startedAt: ts.startedAt ?? "",
379
+ completedAt: ts.completedAt ?? "",
380
+ error: ts.error ?? "",
381
+ input: toJsonObject(ts.input),
382
+ output: toJsonObject(ts.output),
383
+ metadata: toJsonObject(ts.metadata),
384
+ costMicros: BigInt(ts.costMicros ?? 0),
385
+ inputTokens: BigInt(ts.inputTokens ?? 0),
386
+ outputTokens: BigInt(ts.outputTokens ?? 0),
387
+ uiHint: ts.uiHint ?? "",
388
+ }));
389
+ const startedEvent = events.find(e => e.type === "execution_started");
390
+ const completedEvent = events.find(e => e.type === "execution_completed");
391
+ const failedEvent = events.find(e => e.type === "execution_failed");
392
+ const statusFields = { tasks: protoTasks };
393
+ if (startedEvent) {
394
+ statusFields.phase = ExecutionPhase.EXECUTION_IN_PROGRESS;
395
+ statusFields.startedAt = startedEvent.occurredAt;
382
396
  }
383
- catch (err) {
384
- console.error(`Failed to emit ${events.length} workflow event(s) for ${executionId}:`, err);
397
+ if (completedEvent && completedEvent.type === "execution_completed") {
398
+ statusFields.phase = ExecutionPhase.EXECUTION_COMPLETED;
399
+ statusFields.completedAt = completedEvent.occurredAt;
400
+ statusFields.totalCostMicros = BigInt(completedEvent.totalCostMicros);
401
+ statusFields.totalInputTokens = BigInt(completedEvent.totalInputTokens ?? 0);
402
+ statusFields.totalOutputTokens = BigInt(completedEvent.totalOutputTokens ?? 0);
385
403
  }
404
+ if (failedEvent && failedEvent.type === "execution_failed") {
405
+ statusFields.phase = ExecutionPhase.EXECUTION_FAILED;
406
+ statusFields.completedAt = failedEvent.occurredAt;
407
+ statusFields.error = failedEvent.error;
408
+ }
409
+ const input = create(WorkflowExecutionUpdateStatusInputSchema, {
410
+ executionId,
411
+ status: create(WorkflowExecutionStatusSchema, statusFields),
412
+ events: protoEvents,
413
+ });
414
+ await client.workflowExecutionCommand.updateStatus(input);
386
415
  }
387
416
  const PROTO_STATUS_TO_STRING = {
388
417
  [WorkflowTaskStatus.WORKFLOW_TASK_IN_PROGRESS]: "started",