@stigmer/runner 3.14.1 → 3.15.1

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 (320) hide show
  1. package/dist/.build-fingerprint +1 -1
  2. package/dist/__test-utils__/execution-record-fixture.d.ts +47 -0
  3. package/dist/__test-utils__/execution-record-fixture.js +68 -0
  4. package/dist/__test-utils__/execution-record-fixture.js.map +1 -0
  5. package/dist/__test-utils__/harness-contract/types.d.ts +166 -0
  6. package/dist/__test-utils__/harness-contract/types.js +49 -0
  7. package/dist/__test-utils__/harness-contract/types.js.map +1 -0
  8. package/dist/__test-utils__/hermetic-activity.d.ts +28 -5
  9. package/dist/__test-utils__/hermetic-activity.js +23 -7
  10. package/dist/__test-utils__/hermetic-activity.js.map +1 -1
  11. package/dist/__test-utils__/mock-workspace.d.ts +15 -0
  12. package/dist/__test-utils__/mock-workspace.js +21 -0
  13. package/dist/__test-utils__/mock-workspace.js.map +1 -0
  14. package/dist/__test-utils__/model-registry-fixture.d.ts +56 -0
  15. package/dist/__test-utils__/model-registry-fixture.js +66 -0
  16. package/dist/__test-utils__/model-registry-fixture.js.map +1 -0
  17. package/dist/__test-utils__/turn-input-fixture.d.ts +60 -0
  18. package/dist/__test-utils__/turn-input-fixture.js +118 -0
  19. package/dist/__test-utils__/turn-input-fixture.js.map +1 -0
  20. package/dist/activities/execute-cursor/__test-utils__/contract-subject.d.ts +107 -0
  21. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +344 -0
  22. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -0
  23. package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.d.ts +20 -0
  24. package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js +58 -0
  25. package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js.map +1 -1
  26. package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js +2 -32
  27. package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js.map +1 -1
  28. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +38 -62
  29. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +47 -121
  30. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
  31. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.d.ts +17 -1
  32. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js +27 -4
  33. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js.map +1 -1
  34. package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.d.ts +52 -11
  35. package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js +66 -7
  36. package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js.map +1 -1
  37. package/dist/activities/execute-cursor/adapter.d.ts +55 -0
  38. package/dist/activities/execute-cursor/adapter.js +119 -0
  39. package/dist/activities/execute-cursor/adapter.js.map +1 -0
  40. package/dist/activities/execute-cursor/approval-state.d.ts +2 -2
  41. package/dist/activities/execute-cursor/approval-state.js.map +1 -1
  42. package/dist/activities/execute-cursor/capture-flow.d.ts +15 -30
  43. package/dist/activities/execute-cursor/capture-flow.js +17 -26
  44. package/dist/activities/execute-cursor/capture-flow.js.map +1 -1
  45. package/dist/activities/execute-cursor/cursor-capabilities.d.ts +23 -0
  46. package/dist/activities/execute-cursor/cursor-capabilities.js +33 -0
  47. package/dist/activities/execute-cursor/cursor-capabilities.js.map +1 -0
  48. package/dist/activities/execute-cursor/cursor-mcp-config.d.ts +2 -2
  49. package/dist/activities/execute-cursor/cursor-mcp-config.js.map +1 -1
  50. package/dist/activities/execute-cursor/fetch-interceptor.d.ts +15 -25
  51. package/dist/activities/execute-cursor/fetch-interceptor.js +39 -33
  52. package/dist/activities/execute-cursor/fetch-interceptor.js.map +1 -1
  53. package/dist/activities/execute-cursor/http2-interceptor.d.ts +21 -17
  54. package/dist/activities/execute-cursor/http2-interceptor.js +38 -31
  55. package/dist/activities/execute-cursor/http2-interceptor.js.map +1 -1
  56. package/dist/activities/execute-cursor/message-translator.d.ts +28 -19
  57. package/dist/activities/execute-cursor/message-translator.js +76 -27
  58. package/dist/activities/execute-cursor/message-translator.js.map +1 -1
  59. package/dist/activities/execute-cursor/prompt-builder.d.ts +180 -11
  60. package/dist/activities/execute-cursor/prompt-builder.js +171 -0
  61. package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
  62. package/dist/activities/execute-cursor/rejection-capture.d.ts +3 -6
  63. package/dist/activities/execute-cursor/rejection-capture.js +5 -7
  64. package/dist/activities/execute-cursor/rejection-capture.js.map +1 -1
  65. package/dist/activities/execute-cursor/session-lifecycle.d.ts +1 -4
  66. package/dist/activities/execute-cursor/session-lifecycle.js.map +1 -1
  67. package/dist/activities/execute-cursor/turn-boundary.d.ts +1 -1
  68. package/dist/activities/execute-cursor/turn-settle.d.ts +49 -0
  69. package/dist/activities/execute-cursor/turn-settle.js +507 -0
  70. package/dist/activities/execute-cursor/turn-settle.js.map +1 -0
  71. package/dist/activities/execute-cursor/turn-setup.d.ts +173 -0
  72. package/dist/activities/execute-cursor/turn-setup.js +496 -0
  73. package/dist/activities/execute-cursor/turn-setup.js.map +1 -0
  74. package/dist/activities/execute-cursor/turn-stream.d.ts +41 -71
  75. package/dist/activities/execute-cursor/turn-stream.js +70 -135
  76. package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
  77. package/dist/activities/execute-cursor/turn.d.ts +43 -0
  78. package/dist/activities/execute-cursor/turn.js +222 -0
  79. package/dist/activities/execute-cursor/turn.js.map +1 -0
  80. package/dist/activities/execute-cursor/usage-pricing.d.ts +38 -0
  81. package/dist/activities/execute-cursor/usage-pricing.js +50 -0
  82. package/dist/activities/execute-cursor/usage-pricing.js.map +1 -0
  83. package/dist/activities/execute-deep-agent/approval-file-change.d.ts +1 -1
  84. package/dist/activities/execute-deep-agent/approval-file-change.js +1 -1
  85. package/dist/activities/execute-deep-agent/environment.js +1 -1
  86. package/dist/activities/execute-deep-agent/environment.js.map +1 -1
  87. package/dist/activities/execute-deep-agent/setup.js +3 -2
  88. package/dist/activities/execute-deep-agent/setup.js.map +1 -1
  89. package/dist/activities/hydrate-workflow-execution.js +1 -1
  90. package/dist/activities/hydrate-workflow-execution.js.map +1 -1
  91. package/dist/config.d.ts +15 -0
  92. package/dist/config.js.map +1 -1
  93. package/dist/harness/capabilities.d.ts +16 -0
  94. package/dist/harness/capabilities.js +1 -0
  95. package/dist/harness/capabilities.js.map +1 -1
  96. package/dist/harness/persist-chokepoint.d.ts +74 -0
  97. package/dist/harness/persist-chokepoint.js +88 -0
  98. package/dist/harness/persist-chokepoint.js.map +1 -0
  99. package/dist/harness/registry.d.ts +44 -5
  100. package/dist/harness/registry.js +61 -5
  101. package/dist/harness/registry.js.map +1 -1
  102. package/dist/harness/run-turn.d.ts +53 -0
  103. package/dist/harness/run-turn.js +528 -0
  104. package/dist/harness/run-turn.js.map +1 -0
  105. package/dist/harness/stop-controller.d.ts +50 -0
  106. package/dist/harness/stop-controller.js +62 -0
  107. package/dist/harness/stop-controller.js.map +1 -0
  108. package/dist/harness/terminal-table.d.ts +141 -0
  109. package/dist/harness/terminal-table.js +239 -0
  110. package/dist/harness/terminal-table.js.map +1 -0
  111. package/dist/harness/turn-context.d.ts +523 -0
  112. package/dist/harness/turn-context.js +739 -0
  113. package/dist/harness/turn-context.js.map +1 -0
  114. package/dist/harness/types.d.ts +232 -52
  115. package/dist/harness/types.js +17 -8
  116. package/dist/harness/types.js.map +1 -1
  117. package/dist/harness/usage-accumulator.d.ts +68 -0
  118. package/dist/harness/usage-accumulator.js +101 -0
  119. package/dist/harness/usage-accumulator.js.map +1 -0
  120. package/dist/harness-adapters.d.ts +27 -0
  121. package/dist/harness-adapters.js +28 -0
  122. package/dist/harness-adapters.js.map +1 -0
  123. package/dist/main.js.map +1 -1
  124. package/dist/runner-manager.js +64 -48
  125. package/dist/runner-manager.js.map +1 -1
  126. package/dist/runner.d.ts +5 -4
  127. package/dist/runner.js +65 -64
  128. package/dist/runner.js.map +1 -1
  129. package/dist/shared/approval-policy.d.ts +1 -1
  130. package/dist/shared/approval-policy.js.map +1 -1
  131. package/dist/{activities/execute-cursor → shared}/attachment-resolver.d.ts +2 -2
  132. package/dist/{activities/execute-cursor → shared}/attachment-resolver.js +5 -5
  133. package/dist/shared/attachment-resolver.js.map +1 -0
  134. package/dist/{activities/execute-cursor → shared}/blueprint-resolver.d.ts +7 -5
  135. package/dist/{activities/execute-cursor → shared}/blueprint-resolver.js +3 -63
  136. package/dist/shared/blueprint-resolver.js.map +1 -0
  137. package/dist/shared/channel-attachment.d.ts +1 -1
  138. package/dist/shared/channel-attachment.js.map +1 -1
  139. package/dist/{activities/execute-cursor → shared}/cost-guard.d.ts +5 -1
  140. package/dist/{activities/execute-cursor → shared}/cost-guard.js +5 -1
  141. package/dist/shared/cost-guard.js.map +1 -0
  142. package/dist/{activities/execute-cursor → shared}/env-resolver.d.ts +1 -1
  143. package/dist/shared/env-resolver.js.map +1 -0
  144. package/dist/{activities/execute-cursor → shared}/exact-apply.d.ts +1 -1
  145. package/dist/{activities/execute-cursor → shared}/exact-apply.js +6 -6
  146. package/dist/shared/exact-apply.js.map +1 -0
  147. package/dist/shared/execution-context.d.ts +35 -0
  148. package/dist/shared/execution-context.js +38 -0
  149. package/dist/shared/execution-context.js.map +1 -0
  150. package/dist/{activities/execute-cursor → shared}/extract-structured-output.d.ts +5 -2
  151. package/dist/{activities/execute-cursor → shared}/extract-structured-output.js +9 -6
  152. package/dist/shared/extract-structured-output.js.map +1 -0
  153. package/dist/shared/filereview/capture.d.ts +1 -1
  154. package/dist/shared/filereview/capture.js +1 -1
  155. package/dist/shared/heartbeat.d.ts +13 -11
  156. package/dist/shared/heartbeat.js +14 -29
  157. package/dist/shared/heartbeat.js.map +1 -1
  158. package/dist/{activities/execute-cursor → shared}/persist-decision.d.ts +5 -2
  159. package/dist/{activities/execute-cursor → shared}/persist-decision.js +4 -1
  160. package/dist/shared/persist-decision.js.map +1 -0
  161. package/dist/{activities/execute-cursor → shared}/skill-resolver.d.ts +16 -3
  162. package/dist/{activities/execute-cursor → shared}/skill-resolver.js +12 -4
  163. package/dist/shared/skill-resolver.js.map +1 -0
  164. package/dist/shared/subagent-rows.d.ts +21 -0
  165. package/dist/shared/subagent-rows.js +34 -0
  166. package/dist/shared/subagent-rows.js.map +1 -0
  167. package/dist/shared/worker-shutdown.d.ts +43 -16
  168. package/dist/shared/worker-shutdown.js +28 -13
  169. package/dist/shared/worker-shutdown.js.map +1 -1
  170. package/dist/shared/workspace/platform-dir.d.ts +1 -1
  171. package/dist/shared/workspace/platform-dir.js +1 -1
  172. package/dist/shared/workspace/session-provision.d.ts +54 -0
  173. package/dist/{activities/execute-cursor/workspace-provision.js → shared/workspace/session-provision.js} +15 -12
  174. package/dist/shared/workspace/session-provision.js.map +1 -0
  175. package/package.json +4 -4
  176. package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +110 -14
  177. package/src/__test-utils__/execution-record-fixture.ts +104 -0
  178. package/src/__test-utils__/harness-boot-order-child.ts +58 -0
  179. package/src/__test-utils__/harness-contract/contract.ts +128 -83
  180. package/src/__test-utils__/harness-contract/recording-sink.ts +15 -4
  181. package/src/__test-utils__/harness-contract/runtime-contract.ts +666 -0
  182. package/src/__test-utils__/harness-contract/scripted-adapter.ts +92 -32
  183. package/src/__test-utils__/harness-contract/types.ts +85 -9
  184. package/src/__test-utils__/hermetic-activity.ts +33 -8
  185. package/src/__test-utils__/model-registry-fixture.ts +72 -0
  186. package/src/__test-utils__/module-specifiers.ts +82 -0
  187. package/src/__test-utils__/turn-input-fixture.ts +155 -0
  188. package/src/__tests__/harness-boot-order.test.ts +77 -0
  189. package/src/__tests__/harness-contract.test.ts +7 -5
  190. package/src/__tests__/runner-manager.test.ts +18 -0
  191. package/src/activities/execute-cursor/__test-utils__/__tests__/scripted-double.test.ts +102 -0
  192. package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +396 -0
  193. package/src/activities/execute-cursor/__test-utils__/cursor-hook-harness.ts +66 -0
  194. package/src/activities/execute-cursor/__test-utils__/gateway-substrate.ts +2 -43
  195. package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +65 -145
  196. package/src/activities/execute-cursor/__test-utils__/scripted-agent.ts +30 -4
  197. package/src/activities/execute-cursor/__test-utils__/scripted-sdk.ts +96 -8
  198. package/src/activities/execute-cursor/__tests__/adapter-is-temporal-free.test.ts +45 -0
  199. package/src/activities/execute-cursor/__tests__/approval-decisions-agree.test.ts +90 -0
  200. package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +7 -8
  201. package/src/activities/execute-cursor/__tests__/capture-flow.test.ts +28 -1
  202. package/src/activities/execute-cursor/__tests__/deny-gate-exact-apply.test.ts +1 -1
  203. package/src/activities/execute-cursor/__tests__/fetch-interceptor.test.ts +64 -6
  204. package/src/activities/execute-cursor/__tests__/hermetic/deny-and-retry.test.ts +1 -1
  205. package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +1 -1
  206. package/src/activities/execute-cursor/__tests__/hermetic/goldens/cost-cap.status.json +53 -0
  207. package/src/activities/execute-cursor/__tests__/hermetic/goldens/pause.status.json +1 -6
  208. package/src/activities/execute-cursor/__tests__/hermetic/goldens/platform-stop.status.json +56 -0
  209. package/src/activities/execute-cursor/__tests__/hermetic/goldens/recovery-transport-timeout.status.json +48 -0
  210. package/src/activities/execute-cursor/__tests__/hermetic/goldens/resolution-error.status.json +18 -0
  211. package/src/activities/execute-cursor/__tests__/hermetic/goldens/run-cancelled.status.json +36 -0
  212. package/src/activities/execute-cursor/__tests__/hermetic/goldens/run-error-non-retryable.status.json +37 -0
  213. package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-error-at-create.status.json +38 -0
  214. package/src/activities/execute-cursor/__tests__/hermetic/goldens/stall.status.json +59 -0
  215. package/src/activities/execute-cursor/__tests__/hermetic/goldens/unattributed-hook-block.status.json +79 -0
  216. package/src/activities/execute-cursor/__tests__/hermetic/goldens/worker-shutdown.status.json +2 -7
  217. package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +170 -0
  218. package/src/activities/execute-cursor/__tests__/hermetic/pause-vs-shutdown.test.ts +22 -18
  219. package/src/activities/execute-cursor/__tests__/hermetic/plain-turn.test.ts +1 -1
  220. package/src/activities/execute-cursor/__tests__/hermetic/recovery-fresh-agent.test.ts +1 -1
  221. package/src/activities/execute-cursor/__tests__/hermetic/run-wait-arms.test.ts +286 -0
  222. package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +332 -0
  223. package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +193 -0
  224. package/src/activities/execute-cursor/__tests__/hermetic/tool-call.test.ts +1 -1
  225. package/src/activities/execute-cursor/__tests__/hermetic/unattributed-hook-block.test.ts +185 -0
  226. package/src/activities/execute-cursor/__tests__/hermetic/workspace-lock-timeout.test.ts +151 -0
  227. package/src/activities/execute-cursor/__tests__/http2-interceptor.test.ts +65 -35
  228. package/src/activities/execute-cursor/__tests__/message-translator.test.ts +0 -40
  229. package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +171 -0
  230. package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +118 -243
  231. package/src/activities/execute-cursor/__tests__/usage-pricing.test.ts +84 -0
  232. package/src/activities/execute-cursor/adapter.ts +138 -0
  233. package/src/activities/execute-cursor/approval-state.ts +2 -2
  234. package/src/activities/execute-cursor/capture-flow.ts +18 -41
  235. package/src/activities/execute-cursor/cursor-capabilities.ts +35 -0
  236. package/src/activities/execute-cursor/cursor-mcp-config.ts +2 -2
  237. package/src/activities/execute-cursor/fetch-interceptor.ts +48 -45
  238. package/src/activities/execute-cursor/http2-interceptor.ts +47 -34
  239. package/src/activities/execute-cursor/message-translator.ts +90 -45
  240. package/src/activities/execute-cursor/prompt-builder.ts +327 -12
  241. package/src/activities/execute-cursor/rejection-capture.ts +5 -12
  242. package/src/activities/execute-cursor/session-lifecycle.ts +1 -5
  243. package/src/activities/execute-cursor/turn-boundary.ts +1 -1
  244. package/src/activities/execute-cursor/turn-settle.ts +601 -0
  245. package/src/activities/execute-cursor/turn-setup.ts +645 -0
  246. package/src/activities/execute-cursor/turn-stream.ts +84 -210
  247. package/src/activities/execute-cursor/turn.ts +240 -0
  248. package/src/activities/execute-cursor/usage-pricing.ts +67 -0
  249. package/src/activities/execute-deep-agent/approval-file-change.ts +1 -1
  250. package/src/activities/execute-deep-agent/environment.ts +1 -1
  251. package/src/activities/execute-deep-agent/setup.ts +3 -2
  252. package/src/activities/hydrate-workflow-execution.ts +1 -1
  253. package/src/config.ts +13 -0
  254. package/src/harness/__tests__/import-direction.test.ts +168 -0
  255. package/src/harness/__tests__/persist-chokepoint.test.ts +146 -0
  256. package/src/harness/__tests__/registry.test.ts +1 -0
  257. package/src/harness/__tests__/run-turn.test.ts +165 -0
  258. package/src/harness/__tests__/stop-controller.test.ts +49 -0
  259. package/src/harness/__tests__/turn-context.test.ts +178 -0
  260. package/src/harness/__tests__/usage-accumulator.test.ts +83 -0
  261. package/src/harness/capabilities.ts +17 -0
  262. package/src/harness/persist-chokepoint.ts +112 -0
  263. package/src/harness/registry.ts +79 -5
  264. package/src/harness/run-turn.ts +618 -0
  265. package/src/harness/stop-controller.ts +83 -0
  266. package/src/harness/terminal-table.ts +276 -0
  267. package/src/harness/turn-context.ts +1028 -0
  268. package/src/harness/types.ts +248 -53
  269. package/src/harness/usage-accumulator.ts +122 -0
  270. package/src/harness-adapters.ts +30 -0
  271. package/src/main.ts +1 -1
  272. package/src/runner-manager.ts +68 -61
  273. package/src/runner.ts +67 -78
  274. package/src/shared/__tests__/attachment-naming.test.ts +1 -1
  275. package/src/{activities/execute-cursor → shared}/__tests__/attachment-resolver.test.ts +6 -4
  276. package/src/{activities/execute-cursor → shared}/__tests__/cost-guard.test.ts +2 -1
  277. package/src/{activities/execute-cursor → shared}/__tests__/exact-apply.test.ts +3 -3
  278. package/src/{activities/execute-cursor → shared}/__tests__/extract-structured-output.test.ts +8 -8
  279. package/src/{activities/execute-cursor → shared}/__tests__/persist-decision.test.ts +4 -2
  280. package/src/{activities/execute-cursor → shared}/__tests__/skill-resolver.test.ts +1 -1
  281. package/src/shared/__tests__/subagent-rows.test.ts +34 -0
  282. package/src/shared/__tests__/worker-shutdown.test.ts +44 -39
  283. package/src/shared/approval-policy.ts +1 -1
  284. package/src/{activities/execute-cursor → shared}/attachment-resolver.ts +6 -6
  285. package/src/{activities/execute-cursor → shared}/blueprint-resolver.ts +7 -78
  286. package/src/shared/channel-attachment.ts +1 -1
  287. package/src/{activities/execute-cursor → shared}/cost-guard.ts +5 -1
  288. package/src/{activities/execute-cursor → shared}/env-resolver.ts +1 -1
  289. package/src/{activities/execute-cursor → shared}/exact-apply.ts +7 -7
  290. package/src/shared/execution-context.ts +45 -0
  291. package/src/{activities/execute-cursor → shared}/extract-structured-output.ts +10 -7
  292. package/src/shared/filereview/capture.ts +1 -1
  293. package/src/shared/heartbeat.ts +13 -33
  294. package/src/{activities/execute-cursor → shared}/persist-decision.ts +5 -2
  295. package/src/{activities/execute-cursor → shared}/skill-resolver.ts +20 -6
  296. package/src/shared/subagent-rows.ts +39 -0
  297. package/src/shared/worker-shutdown.ts +55 -25
  298. package/src/{activities/execute-cursor/__tests__/workspace-provision.test.ts → shared/workspace/__tests__/session-provision.test.ts} +25 -28
  299. package/src/shared/workspace/platform-dir.ts +1 -1
  300. package/src/{activities/execute-cursor/workspace-provision.ts → shared/workspace/session-provision.ts} +29 -16
  301. package/dist/activities/execute-cursor/attachment-resolver.js.map +0 -1
  302. package/dist/activities/execute-cursor/blueprint-resolver.js.map +0 -1
  303. package/dist/activities/execute-cursor/cost-guard.js.map +0 -1
  304. package/dist/activities/execute-cursor/env-resolver.js.map +0 -1
  305. package/dist/activities/execute-cursor/exact-apply.js.map +0 -1
  306. package/dist/activities/execute-cursor/extract-structured-output.js.map +0 -1
  307. package/dist/activities/execute-cursor/index.d.ts +0 -209
  308. package/dist/activities/execute-cursor/index.js +0 -2345
  309. package/dist/activities/execute-cursor/index.js.map +0 -1
  310. package/dist/activities/execute-cursor/persist-decision.js.map +0 -1
  311. package/dist/activities/execute-cursor/skill-resolver.js.map +0 -1
  312. package/dist/activities/execute-cursor/usage-accumulator.d.ts +0 -89
  313. package/dist/activities/execute-cursor/usage-accumulator.js +0 -121
  314. package/dist/activities/execute-cursor/usage-accumulator.js.map +0 -1
  315. package/dist/activities/execute-cursor/workspace-provision.d.ts +0 -42
  316. package/dist/activities/execute-cursor/workspace-provision.js.map +0 -1
  317. package/src/activities/execute-cursor/__tests__/usage-accumulator.test.ts +0 -164
  318. package/src/activities/execute-cursor/index.ts +0 -2876
  319. package/src/activities/execute-cursor/usage-accumulator.ts +0 -169
  320. /package/dist/{activities/execute-cursor → shared}/env-resolver.js +0 -0
@@ -0,0 +1,528 @@
1
+ /**
2
+ * The turn runtime — one agent turn as a Temporal activity, written once for
3
+ * every harness, with the engine behind the adapter contract (`types.ts`).
4
+ *
5
+ * What runs here and nowhere else: the activity's identity and its
6
+ * execution-scoped context; the status and the single persist chokepoint;
7
+ * the periodic heartbeat; the stop controller and its four producers (the
8
+ * stall watchdog, the cost cap, the platform STOP, Temporal's cancellation);
9
+ * the resolution phases (`turn-context.ts`) composed into the `TurnInput`;
10
+ * the sink the adapter is handed; the terminal table (`terminal-table.ts`)
11
+ * with its throw-vs-return rule, applied by `settleWith`, the one writer of
12
+ * a terminal; the completion epilogue (final text,
13
+ * structured output, plan artifact, write-back); the finally that releases
14
+ * the workspace lock last. The adapter owns its SDK slice inside `runTurn`
15
+ * and its own teardown inside its own `finally`, which runs BEFORE this
16
+ * module's (the gate is torn down before the lock is released, as it always
17
+ * was).
18
+ *
19
+ * Shape: one activity per registry row (`createHarnessActivities`), each a
20
+ * closure over the adapter, the activity's byte-pinned name and one shared
21
+ * `StigmerClient`; `runTurnActivity` is the body. Every `console` line here
22
+ * names the activity (`ExecuteCursor started: …`) so the log reads as it did
23
+ * before the extraction, and never a harness literal — the harness is a
24
+ * registry row, not a branch.
25
+ *
26
+ * Extracted from `activities/execute-cursor/index.ts` `executeCursorInner`
27
+ * (S2 M3; the milestone log in stigmer-cloud
28
+ * `_projects/2026-09/20260911.03.sp.turn-runtime-extraction/` has every
29
+ * ruling). Its twelve resolution phases came out at M2; what came out here is
30
+ * everything between them and after the engine: the seventeen hermetic
31
+ * goldens under `execute-cursor/__tests__/hermetic/` pin the result byte
32
+ * for byte, and `__tests__/run-turn.test.ts` proves the table against the
33
+ * scripted fake without any engine at all.
34
+ */
35
+ import { setMaxListeners } from "node:events";
36
+ import { heartbeat, CancelledFailure, Context } from "@temporalio/activity";
37
+ import { create } from "@bufbuild/protobuf";
38
+ import { AgentExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
39
+ import { ExecutionPhase, InteractionMode, MessageType } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
40
+ import { loadArtifactStorageConfig, resolveUsableArtifactStorage } from "../shared/artifact-storage.js";
41
+ import { TimingRecorder } from "../shared/cold-start-timing.js";
42
+ import { costCapExceeded } from "../shared/cost-guard.js";
43
+ import { runWithExecutionContext } from "../shared/execution-context.js";
44
+ import { startHeartbeat } from "../shared/heartbeat.js";
45
+ import { describeExecutionError } from "../shared/model-error.js";
46
+ import { publishPlanArtifact } from "../shared/plan-artifact.js";
47
+ import { StallTimeoutError, startStallWatchdog } from "../shared/stall-watchdog.js";
48
+ import { reportSetupProgress, slimStatus, utcTimestamp } from "../shared/status.js";
49
+ import { cancelInProgressSubAgentProtos } from "../shared/subagent-rows.js";
50
+ import { removeStigmerSymlink } from "../shared/workspace/stigmer-link.js";
51
+ import { cancellationReasonOf, classifyTurnInterruption, getShutdownSignalForQueue, } from "../shared/worker-shutdown.js";
52
+ import { PersistChokepoint } from "./persist-chokepoint.js";
53
+ import { StopController } from "./stop-controller.js";
54
+ import { applyTerminalArm, costCapArm, failedArm, fileReviewResolvedArm, infrastructureCancelArm, pauseArm, platformStopArm, rejectedByUserArm, stallArm, TERMINAL_COPY, unexpectedErrorArm, workerShutdownArm, workspaceLockTimeoutArm, } from "./terminal-table.js";
55
+ import { resolveTurnContext } from "./turn-context.js";
56
+ import { UsageAccumulator } from "./usage-accumulator.js";
57
+ /**
58
+ * Interval of the activity-wide periodic heartbeat. Started before any phase
59
+ * runs: setup phases make network calls (blueprint resolution, workspace
60
+ * clone, MCP backfill, engine create) that can stall, and a pulse only
61
+ * between them leaves every individual call uncovered — the production
62
+ * stale-proxy incident hung inside `Agent.create` with zero heartbeats and
63
+ * surfaced as an opaque five-minute Temporal timeout. The details name the
64
+ * current step so a stall is attributed. Safe ONLY because every call below
65
+ * is itself bounded (the resolve timeout, the stall watchdog): an unbounded
66
+ * hang under a live heartbeat would keep a dead activity alive forever.
67
+ */
68
+ const PERIODIC_HEARTBEAT_MS = 30_000;
69
+ /**
70
+ * Vendor SDKs register abort listeners on the cancellation signal for each
71
+ * concurrent tool call (fetch, MCP, shell). With 10+ parallel tools, Node's
72
+ * default limit of 10 triggers `MaxListenersExceededWarning` — a diagnostic
73
+ * warning, not a functional error, but it pollutes logs and creates false
74
+ * alarm fatigue. 25 covers observed peaks (~12 concurrent tools + the
75
+ * heartbeat + the shutdown signal + SDK internals) with headroom.
76
+ */
77
+ const CANCELLATION_SIGNAL_MAX_LISTENERS = 25;
78
+ /**
79
+ * Run one turn: the activity body behind every harness's registry row. Sets
80
+ * the execution-scoped context for the WHOLE activity (the interceptors stamp
81
+ * every proxy-bound request from it, and much of that traffic is the
82
+ * runtime's own: offload, attachments, the epilogue's extraction) and runs
83
+ * the turn inside it.
84
+ */
85
+ export async function runTurnActivity(deps, input) {
86
+ const { executionId, threadId, turnSeq } = input;
87
+ console.log(`${deps.activityName} started: execution=${executionId}, threadId=${threadId || "(new)"}, turnSeq=${turnSeq}`);
88
+ return runWithExecutionContext(executionId, () => runTurn(deps, input));
89
+ }
90
+ async function runTurn(deps, input) {
91
+ const { adapter, activityName, client, config } = deps;
92
+ const { executionId } = input;
93
+ const status = create(AgentExecutionStatusSchema, {
94
+ phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
95
+ startedAt: utcTimestamp(),
96
+ });
97
+ // Cold-start timeline of this turn's setup: one mark after each phase, the
98
+ // adapter's own segments marked through the sink, emitted by the adapter
99
+ // once its engine is resolved (an early return skips it — partial setups
100
+ // are not comparable cold-start samples).
101
+ const setupTiming = new TimingRecorder();
102
+ // Artifact storage for offloading oversized tool outputs out of the
103
+ // persisted status and for publishing the plan artifact. Resolved once so
104
+ // every persist sees it. Best-effort: `undefined`, never a throw, when no
105
+ // substrate works; an absent store disables offload (the aggregate size cap
106
+ // still applies) and flips capture mode off (deny-gate fallback).
107
+ const artifactStorage = await resolveUsableArtifactStorage(loadArtifactStorageConfig(config), { executionId });
108
+ setupTiming.mark("resolve_artifact_storage");
109
+ const frame = { primaryDir: undefined, releaseWorkspaceLock: undefined, writeback: null };
110
+ const stop = new StopController();
111
+ let usage;
112
+ let heartbeatPhase = "setup";
113
+ let lastActivityDetail;
114
+ let watchdog;
115
+ const cancellationSignal = Context.current().cancellationSignal;
116
+ const shutdownSignal = getShutdownSignalForQueue(Context.current().info.taskQueue);
117
+ const periodicHeartbeat = startHeartbeat(PERIODIC_HEARTBEAT_MS, () => ({ phase: heartbeatPhase, execution: executionId }));
118
+ const chokepoint = new PersistChokepoint({
119
+ client,
120
+ executionId,
121
+ status,
122
+ offload: artifactStorage ? { artifactStorage, executionId } : undefined,
123
+ usage: () => usage,
124
+ heartbeat,
125
+ onPlatformStop: () => stop.stop({ kind: "platform-stop" }),
126
+ });
127
+ try {
128
+ setMaxListeners(CANCELLATION_SIGNAL_MAX_LISTENERS, cancellationSignal);
129
+ }
130
+ catch {
131
+ // An AbortSignal that does not support setMaxListeners (an older SDK):
132
+ // the warning is harmless, so this is not.
133
+ }
134
+ const onCancellation = () => stop.stop({ kind: "cancellation" });
135
+ if (cancellationSignal.aborted)
136
+ onCancellation();
137
+ else
138
+ cancellationSignal.addEventListener("abort", onCancellation, { once: true });
139
+ /** The interruption Temporal delivered, read when the table needs it. */
140
+ const interruption = () => classifyTurnInterruption({
141
+ cancellationReason: cancellationReasonOf(cancellationSignal),
142
+ shutdownSignalAborted: shutdownSignal?.aborted ?? false,
143
+ });
144
+ /**
145
+ * The one writer of a terminal: apply the arm, persist it ONCE, and end
146
+ * the activity the way the arm's disposition says. A thrown arm also marks
147
+ * the in-progress sub-agent rows cancelled before that persist, so the
148
+ * status the workflow reads back is the whole terminal state in one write.
149
+ * (The file-review resume in `settleResolution` is the one place that
150
+ * applies an arm itself: its write-back must land between the arm and the
151
+ * persist.)
152
+ *
153
+ * The table decides what is written and whether the activity throws; the
154
+ * caller may supply the `CancelledFailure` to throw. The catch does, to
155
+ * rethrow the failure it caught (the caught failure IS the evidence, #776)
156
+ * or to throw the after-error variant of the copy; every other caller lets
157
+ * the arm's own message stand.
158
+ */
159
+ const settleWith = async (arm, failure) => {
160
+ applyTerminalArm(status, arm);
161
+ if (arm.disposition.kind === "return") {
162
+ await chokepoint.write();
163
+ return { kind: "return", value: slimStatus(status) };
164
+ }
165
+ cancelInProgressSubAgentProtos(status.subAgentExecutions);
166
+ await chokepoint.write();
167
+ return { kind: "throw", error: failure ?? new CancelledFailure(arm.disposition.message) };
168
+ };
169
+ // ── The turn ended during resolution ──────────────────────────────────────
170
+ async function settleResolution(settlement) {
171
+ switch (settlement.kind) {
172
+ case "workspace-lock-timeout": {
173
+ const outcome = await settleWith(workspaceLockTimeoutArm(settlement.error));
174
+ console.warn(`${activityName} workspace lock timeout: execution=${executionId}`);
175
+ return outcome;
176
+ }
177
+ case "rejected-by-user":
178
+ // A reject of an irreversible action (shell/MCP) fails the execution.
179
+ return settleWith(rejectedByUserArm());
180
+ case "file-review-resolved": {
181
+ // Push the APPROVED tree — reconcile snapped rejected files back to
182
+ // baseline, so what finalize commits is exactly what the user kept.
183
+ // After reconcile, before persist, never on a failed reconcile
184
+ // (diverged bytes must not reach the remote).
185
+ applyTerminalArm(status, fileReviewResolvedArm(settlement));
186
+ if (!settlement.failed && frame.writeback) {
187
+ await frame.writeback.finalize();
188
+ }
189
+ await chokepoint.write();
190
+ console.log(`${activityName} file-review resume short-circuit: execution=${executionId}, ` +
191
+ `failed=${settlement.failed}, discarded=${settlement.discardedPaths.length}`);
192
+ return { kind: "return", value: slimStatus(status) };
193
+ }
194
+ default: {
195
+ const exhaustive = settlement;
196
+ throw new Error(`${activityName}: unknown resolution settlement ${String(exhaustive)}`);
197
+ }
198
+ }
199
+ }
200
+ // ── The engine's turn and its outcome ─────────────────────────────────────
201
+ async function runEngineTurn(turn) {
202
+ const maxCostUsd = turn.execution.spec?.executionConfig?.maxCostUsd ?? 0;
203
+ const accumulator = new UsageAccumulator(turn.model.serviceTier, turn.model.thinkingMode);
204
+ usage = accumulator;
205
+ // The stall watchdog: the periodic heartbeat proves the process is alive,
206
+ // not that the engine is progressing; if the engine wedges, nothing
207
+ // arrives and the turn would hang forever. Armed for the adapter's whole
208
+ // stretch (Q-M3-13) and reset by every `recordActivity`; on stall the
209
+ // signal aborts, the adapter cancels its run, and the table reports the
210
+ // stall with the last detail the adapter named.
211
+ watchdog = startStallWatchdog(config.cursorStreamStallTimeoutMs, (idleMs) => {
212
+ const error = new StallTimeoutError(idleMs, lastActivityDetail ? `last tool: ${lastActivityDetail}` : undefined);
213
+ console.warn(`${activityName} stall detected: execution=${executionId}, idleMs=${idleMs}, lastTool=${lastActivityDetail ?? "none"}`);
214
+ stop.stop({ kind: "stall", error });
215
+ });
216
+ const armedWatchdog = watchdog;
217
+ const sink = {
218
+ status,
219
+ stopSignal: stop.signal,
220
+ setupTiming,
221
+ requestPersist: () => chokepoint.request(),
222
+ recordActivity: (detail) => {
223
+ if (detail !== undefined)
224
+ lastActivityDetail = detail;
225
+ armedWatchdog.recordActivity();
226
+ },
227
+ reportUsage: (delta) => {
228
+ accumulator.addTurn(delta);
229
+ // max_cost_usd enforcement (cost-guard.ts): the running estimate only
230
+ // advances here, so this is the single check point; the abort is how
231
+ // the adapter learns to end its run.
232
+ const estimated = accumulator.snapshot().estimatedCostUsd;
233
+ if (!stop.evidence.costCapExceeded && costCapExceeded(maxCostUsd, estimated)) {
234
+ console.warn(`${activityName} cost cap exceeded: execution=${executionId}, ` +
235
+ `estimatedCostUsd=${estimated.toFixed(4)}, maxCostUsd=${maxCostUsd.toFixed(2)}`);
236
+ stop.stop({ kind: "cost-cap" });
237
+ }
238
+ },
239
+ reportProgress: (label) => reportSetupProgress(client, executionId, label),
240
+ bindHarnessState: async (harnessStateId) => {
241
+ turn.session.spec.harnessStateId = harnessStateId;
242
+ // Clear slug to avoid re-validation of potentially invalid
243
+ // server-generated slugs. BuildUpdateStateStep preserves the existing
244
+ // slug from the database record.
245
+ if (turn.session.metadata)
246
+ turn.session.metadata.slug = "";
247
+ await client.updateSession(turn.session);
248
+ console.log(`Stored ${harnessStateId} as harness_state_id on session ${turn.sessionId}`);
249
+ },
250
+ };
251
+ heartbeatPhase = "harness";
252
+ const outcome = await adapter.runTurn(turn, sink);
253
+ armedWatchdog.stop();
254
+ heartbeatPhase = "epilogue";
255
+ switch (outcome.kind) {
256
+ case "completed":
257
+ return completeTurn(turn, ExecutionPhase.EXECUTION_COMPLETED);
258
+ case "cancelled":
259
+ return completeTurn(turn, ExecutionPhase.EXECUTION_CANCELLED);
260
+ case "awaiting_approval": {
261
+ // Pause for review exactly like the native harness: the adapter put
262
+ // the WAITING rows on the transcript; flip the phase, persist, and
263
+ // RETURN to the workflow, which waits for the approval signal and
264
+ // reinvokes.
265
+ status.phase = ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL;
266
+ await chokepoint.write();
267
+ return { kind: "return", value: slimStatus(status) };
268
+ }
269
+ case "failed": {
270
+ const settledFailure = await settleWith(failedArm(outcome.message, outcome.surface));
271
+ console.error(`${activityName} failed (${outcome.surface}): execution=${executionId}, error=${outcome.message}` +
272
+ (outcome.cause instanceof Error ? `, cause=${outcome.cause.message}` : ""));
273
+ return settledFailure;
274
+ }
275
+ case "interrupted":
276
+ return settleInterrupted(maxCostUsd, accumulator);
277
+ default: {
278
+ const exhaustive = outcome;
279
+ throw new Error(`${activityName}: unknown turn outcome ${JSON.stringify(exhaustive)}`);
280
+ }
281
+ }
282
+ }
283
+ /**
284
+ * The table for an `interrupted` outcome, in the orchestrator's precedence:
285
+ * a stall (FAILED, return) outranks everything; a cost cap (TERMINATED,
286
+ * return); then Temporal's cancellation as the signal's reason reads it —
287
+ * the runner's drain, the orchestrator's pause, an infrastructure cancel
288
+ * (all thrown); last a platform stop (COMPLETED, return).
289
+ */
290
+ async function settleInterrupted(maxCostUsd, accumulator) {
291
+ const evidence = stop.evidence;
292
+ if (evidence.stall) {
293
+ const outcome = await settleWith(stallArm(evidence.stall));
294
+ console.warn(`${activityName} stalled: execution=${executionId}, error=${status.error}`);
295
+ return outcome;
296
+ }
297
+ if (evidence.costCapExceeded) {
298
+ const estimated = accumulator.snapshot().estimatedCostUsd;
299
+ const outcome = await settleWith(costCapArm(maxCostUsd, estimated));
300
+ console.warn(`${activityName} terminated (cost cap): execution=${executionId}, ` +
301
+ `estimatedCostUsd=${estimated.toFixed(4)}, maxCostUsd=${maxCostUsd.toFixed(2)}`);
302
+ return outcome;
303
+ }
304
+ const delivered = interruption();
305
+ switch (delivered) {
306
+ case "worker-shutdown":
307
+ console.log(`${activityName} interrupted (worker shutdown): execution=${executionId}`);
308
+ return settleWith(workerShutdownArm());
309
+ case "pause":
310
+ console.log(`${activityName} paused: execution=${executionId}`);
311
+ return settleWith(pauseArm());
312
+ case "infrastructure":
313
+ console.log(`${activityName} interrupted (infrastructure cancel): execution=${executionId}`);
314
+ return settleWith(infrastructureCancelArm());
315
+ case "none":
316
+ break;
317
+ default: {
318
+ const exhaustive = delivered;
319
+ throw new Error(`${activityName}: unknown interruption ${String(exhaustive)}`);
320
+ }
321
+ }
322
+ if (evidence.platformStop) {
323
+ console.log(`${activityName} completed (platform stop): execution=${executionId}`);
324
+ return settleWith(platformStopArm());
325
+ }
326
+ // The adapter settled `interrupted` with the signal live: a contract
327
+ // violation, reported as the runner's own failure rather than guessed at.
328
+ return settleWith(unexpectedErrorArm("HarnessContractError", `${adapter.name} settled interrupted with no stop`));
329
+ }
330
+ /**
331
+ * A turn the engine finished (COMPLETED) or ended cancelled on its own
332
+ * (CANCELLED): the final text from the last AI row; the structured output
333
+ * the execution asked for, extracted from that text unless the adapter
334
+ * already folded it onto the status; the plan artifact in plan mode; the
335
+ * write-back safety net; the one persist that makes COMPLETED and the
336
+ * structured output visible atomically; the slim return with `final_text`
337
+ * and `structured` beside it.
338
+ */
339
+ async function completeTurn(turn, phase) {
340
+ status.completedAt = utcTimestamp();
341
+ status.phase = phase;
342
+ let structuredOutput = status.structuredOutput;
343
+ let finalText;
344
+ if (phase === ExecutionPhase.EXECUTION_COMPLETED) {
345
+ finalText = [...status.messages].reverse().find((m) => m.type === MessageType.MESSAGE_AI)?.content;
346
+ if (structuredOutput === undefined && turn.structuredOutputSchema && finalText) {
347
+ structuredOutput = await extractStructuredOutputFromText(turn, finalText);
348
+ if (structuredOutput !== undefined) {
349
+ status.structuredOutput = structuredOutput;
350
+ }
351
+ }
352
+ // Plan mode: publish the final plan message as a plan artifact (named
353
+ // from the plan's title); the only artifact path a harness without an
354
+ // auto-publish pipeline has.
355
+ const interactionMode = turn.execution.spec?.executionConfig?.interactionMode ?? InteractionMode.UNSPECIFIED;
356
+ if (interactionMode === InteractionMode.PLAN && finalText && turn.artifactStorage) {
357
+ try {
358
+ await publishPlanArtifact({ status, executionId, planText: finalText, artifactStorage: turn.artifactStorage });
359
+ }
360
+ catch (err) {
361
+ console.warn(`${activityName} plan artifact publish skipped (non-fatal): execution=${executionId}, error=${err}`);
362
+ }
363
+ }
364
+ // Write-back safety net on terminal completion. A capture-mode turn
365
+ // with captured changes paused for review instead, so reaching here
366
+ // means no reviewable delta this turn and this is normally a no-op —
367
+ // it exists for stragglers outside the capture, and never runs
368
+ // mid-turn.
369
+ if (frame.writeback) {
370
+ await frame.writeback.finalize();
371
+ }
372
+ }
373
+ // NOW persist — the subscriber sees the phase and structured_output atomically.
374
+ await chokepoint.write();
375
+ console.log(`${activityName} completed: execution=${executionId}, phase=${ExecutionPhase[status.phase]}, ` +
376
+ `hasStructuredOutput=${structuredOutput !== undefined}` +
377
+ (status.error ? `, error=${status.error}` : ""));
378
+ const slim = slimStatus(status);
379
+ if (finalText !== undefined)
380
+ slim.final_text = finalText;
381
+ if (structuredOutput !== undefined)
382
+ slim.structured = structuredOutput;
383
+ return { kind: "return", value: slim };
384
+ }
385
+ /**
386
+ * Tier 1 + 1.5: JSON.parse, code-fence extraction, heuristic brace match.
387
+ * Tier 2: LLM extraction with withStructuredOutput — deterministic,
388
+ * function-calling guarantees schema-conformant output. Each tier logs
389
+ * its verdict; a failed LLM extraction is logged and yields nothing.
390
+ */
391
+ async function extractStructuredOutputFromText(turn, finalText) {
392
+ const { extractJsonFromText } = await import("../shared/extract-json.js");
393
+ const fromText = extractJsonFromText(finalText);
394
+ if (fromText !== undefined) {
395
+ console.log(`${activityName} structured output extracted (text): execution=${executionId}, finalTextLength=${finalText.length}`);
396
+ return fromText;
397
+ }
398
+ console.log(`${activityName} text extraction failed, trying LLM extraction: execution=${executionId}, ` +
399
+ `finalTextLength=${finalText.length}`);
400
+ try {
401
+ const { extractStructuredOutput } = await import("../shared/extract-structured-output.js");
402
+ const extracted = await extractStructuredOutput(finalText, turn.structuredOutputSchema, config, turn.model.requested);
403
+ if (extracted !== undefined) {
404
+ console.log(`${activityName} structured output extracted (LLM): execution=${executionId}`);
405
+ }
406
+ return extracted;
407
+ }
408
+ catch (extractErr) {
409
+ const errMsg = extractErr instanceof Error ? extractErr.message : String(extractErr);
410
+ console.error(`${activityName} structured output extraction FAILED: execution=${executionId}, ` +
411
+ `requestedModel=${turn.model.requested}, finalTextLength=${finalText.length}, error=${errMsg}`);
412
+ return undefined;
413
+ }
414
+ }
415
+ // ── Something threw ───────────────────────────────────────────────────────
416
+ /**
417
+ * The catch. An adapter never throws (its contract), so what lands here is
418
+ * the runtime's own: a `CancelledFailure` from a resolution phase (the
419
+ * lock wait), an unexpected error during resolution or the epilogue, or a
420
+ * contract violation. The cancellation arms are the table's throw arms
421
+ * through `settleWith`, with the failure this catch chooses to throw; the
422
+ * generic arm is the `internal` failure surface, returned.
423
+ */
424
+ async function settleThrown(err) {
425
+ const cancelledArm = () => {
426
+ const delivered = interruption();
427
+ switch (delivered) {
428
+ case "worker-shutdown":
429
+ console.log(`${activityName} cancelled (worker shutdown) for execution ${executionId}`);
430
+ return workerShutdownArm();
431
+ case "pause":
432
+ console.log(`${activityName} cancelled (pause) for execution ${executionId}`);
433
+ return pauseArm();
434
+ case "infrastructure":
435
+ console.log(`${activityName} cancelled (infrastructure) for execution ${executionId}`);
436
+ return infrastructureCancelArm();
437
+ case "none":
438
+ return undefined;
439
+ default: {
440
+ const exhaustive = delivered;
441
+ throw new Error(`${activityName}: unknown interruption ${String(exhaustive)}`);
442
+ }
443
+ }
444
+ };
445
+ if (err instanceof CancelledFailure) {
446
+ // The cancellation arrived as a throw (the lock wait observes the
447
+ // signal); the caught failure IS the evidence (#776). A thrown
448
+ // cancellation with no delivered cancellation on the signal can only be
449
+ // the runtime's own `checkCancellation`-style throw: infrastructure.
450
+ return settleWith(cancelledArm() ?? infrastructureCancelArm(), err);
451
+ }
452
+ const errDetail = err instanceof Error ? err.message : String(err);
453
+ const arm = cancelledArm();
454
+ if (arm !== undefined) {
455
+ // A non-cancellation error while cancelled was most likely caused by the
456
+ // cancellation itself (a teardown mid-flight) and must not overwrite the
457
+ // state the workflow already expects: a pause stays PAUSED; anything
458
+ // else reads as the interruption it was.
459
+ if (arm.phase === ExecutionPhase.EXECUTION_PAUSED) {
460
+ console.log(`${activityName} error during pause (treating as pause): execution=${executionId}, error=${errDetail}`);
461
+ return settleWith(arm, new CancelledFailure(TERMINAL_COPY.pause.throwMessageAfterError));
462
+ }
463
+ console.log(`${activityName} error during infrastructure cancel: execution=${executionId}, error=${errDetail}`);
464
+ return settleWith({ ...infrastructureCancelArm(), error: `Execution interrupted: ${errDetail}` }, new CancelledFailure(TERMINAL_COPY.infrastructureCancel.throwMessageAfterError));
465
+ }
466
+ // Unwrap + classify before formatting: a model error arrives
467
+ // MiddlewareError-wrapped with raw provider prose; non-model errors keep
468
+ // the root error's own identity.
469
+ const { errorType, errorMessage } = describeExecutionError(err, { proxyMode: !!config.proxyEndpoint });
470
+ console.error(`${activityName} failed: execution=${executionId}, [${errorType}] ${errorMessage}`);
471
+ return settleWith(unexpectedErrorArm(errorType, errorMessage));
472
+ }
473
+ // ── Drive ─────────────────────────────────────────────────────────────────
474
+ let settled;
475
+ try {
476
+ const resolutionDeps = {
477
+ input,
478
+ client,
479
+ config,
480
+ status,
481
+ artifactStorage,
482
+ timing: setupTiming,
483
+ signal: cancellationSignal,
484
+ heartbeat,
485
+ enterPhase: (step) => {
486
+ heartbeatPhase = step;
487
+ heartbeat();
488
+ },
489
+ reportProgress: (label) => reportSetupProgress(client, executionId, label),
490
+ };
491
+ const resolution = await resolveTurnContext(resolutionDeps, adapter.capabilities, frame, () => chokepoint.write());
492
+ if (resolution.kind === "settled") {
493
+ settled = await settleResolution(resolution.settlement);
494
+ }
495
+ else {
496
+ settled = await runEngineTurn(resolution.input);
497
+ }
498
+ }
499
+ catch (err) {
500
+ settled = await settleThrown(err);
501
+ }
502
+ finally {
503
+ periodicHeartbeat.stop();
504
+ watchdog?.stop();
505
+ cancellationSignal.removeEventListener("abort", onCancellation);
506
+ // Remove the workspace's `.stigmer` link the skill and attachment phases
507
+ // created, so attaching a real repo leaves it untouched between turns
508
+ // (issue #173). After the adapter's own teardown (its gate), before the
509
+ // lock. Idempotent and non-throwing.
510
+ if (frame.primaryDir)
511
+ await removeStigmerSymlink(frame.primaryDir);
512
+ // Release the workspace turn lock LAST — every mutation of this turn has
513
+ // landed, and the next queued turn must not baseline before that.
514
+ // Idempotent and non-throwing, so it can never mask the turn's outcome.
515
+ await frame.releaseWorkspaceLock?.();
516
+ }
517
+ switch (settled.kind) {
518
+ case "return":
519
+ return settled.value;
520
+ case "throw":
521
+ throw settled.error;
522
+ default: {
523
+ const exhaustive = settled;
524
+ throw new Error(`${activityName}: unknown settlement ${JSON.stringify(exhaustive)}`);
525
+ }
526
+ }
527
+ }
528
+ //# sourceMappingURL=run-turn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-turn.js","sourceRoot":"","sources":["../../src/harness/run-turn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The one way a turn is told to stop, and the runtime's record of why.
3
+ *
4
+ * The adapter contract gives an engine ONE signal (`TurnSink.stopSignal`) for
5
+ * every cause of stopping and forbids it to branch on the cause; the runtime
6
+ * keeps the cause here, as evidence its terminal table reads after the
7
+ * adapter settles `interrupted`. Four producers abort the signal: the stall
8
+ * watchdog, the usage accumulator's cost cap, the persist chokepoint's
9
+ * platform STOP, and Temporal's own cancellation (a pause, a worker
10
+ * shutdown, a heartbeat timeout — told apart later from the signal's reason,
11
+ * `shared/worker-shutdown.ts`). The first cause wins the abort; every cause
12
+ * is recorded, because the table's precedence (stall over cost cap over
13
+ * cancellation over platform stop) is decided at settlement, not at abort.
14
+ *
15
+ * Nothing here is engine-specific and nothing here persists; the Cursor
16
+ * orchestrator kept the same facts as flags on its stream state
17
+ * (`turn-stream.ts` `TurnStreamState`, before S2 M3 moved them out).
18
+ */
19
+ import type { StallTimeoutError } from "../shared/stall-watchdog.js";
20
+ /** Why the runtime stopped the turn. */
21
+ export type StopCause = {
22
+ readonly kind: "stall";
23
+ readonly error: StallTimeoutError;
24
+ } | {
25
+ readonly kind: "cost-cap";
26
+ } | {
27
+ readonly kind: "platform-stop";
28
+ } | {
29
+ readonly kind: "cancellation";
30
+ };
31
+ /** What the terminal table reads. Each field is set by the first cause of its kind and never cleared. */
32
+ export interface StopEvidence {
33
+ readonly stall: StallTimeoutError | undefined;
34
+ readonly costCapExceeded: boolean;
35
+ readonly platformStop: boolean;
36
+ /** Temporal delivered a cancellation; its reason is on the cancellation signal itself. */
37
+ readonly cancellation: boolean;
38
+ }
39
+ export declare class StopController {
40
+ private readonly controller;
41
+ private stall;
42
+ private costCapExceeded;
43
+ private platformStop;
44
+ private cancellation;
45
+ /** The adapter's `stopSignal`. Its `reason` is the first cause's kind, a diagnostic only. */
46
+ get signal(): AbortSignal;
47
+ get evidence(): StopEvidence;
48
+ /** Record a cause and abort the signal (idempotent per cause; the signal aborts once). */
49
+ stop(cause: StopCause): void;
50
+ }