@stigmer/runner 3.14.0 → 3.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) 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 +268 -0
  9. package/dist/__test-utils__/hermetic-activity.js +385 -0
  10. package/dist/__test-utils__/hermetic-activity.js.map +1 -0
  11. package/dist/__test-utils__/mock-client.d.ts +13 -0
  12. package/dist/__test-utils__/mock-client.js +45 -0
  13. package/dist/__test-utils__/mock-client.js.map +1 -0
  14. package/dist/__test-utils__/mock-workspace.d.ts +15 -0
  15. package/dist/__test-utils__/mock-workspace.js +21 -0
  16. package/dist/__test-utils__/mock-workspace.js.map +1 -0
  17. package/dist/__test-utils__/model-registry-fixture.d.ts +56 -0
  18. package/dist/__test-utils__/model-registry-fixture.js +66 -0
  19. package/dist/__test-utils__/model-registry-fixture.js.map +1 -0
  20. package/dist/__test-utils__/turn-input-fixture.d.ts +60 -0
  21. package/dist/__test-utils__/turn-input-fixture.js +118 -0
  22. package/dist/__test-utils__/turn-input-fixture.js.map +1 -0
  23. package/dist/activities/execute-cursor/__test-utils__/contract-subject.d.ts +107 -0
  24. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +344 -0
  25. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -0
  26. package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.d.ts +20 -0
  27. package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js +58 -0
  28. package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js.map +1 -1
  29. package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js +2 -32
  30. package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js.map +1 -1
  31. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +148 -0
  32. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +257 -0
  33. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -0
  34. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.d.ts +183 -0
  35. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js +262 -0
  36. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js.map +1 -0
  37. package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.d.ts +138 -0
  38. package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js +191 -0
  39. package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js.map +1 -0
  40. package/dist/activities/execute-cursor/adapter.d.ts +55 -0
  41. package/dist/activities/execute-cursor/adapter.js +119 -0
  42. package/dist/activities/execute-cursor/adapter.js.map +1 -0
  43. package/dist/activities/execute-cursor/approval-state.d.ts +2 -2
  44. package/dist/activities/execute-cursor/approval-state.js.map +1 -1
  45. package/dist/activities/execute-cursor/capture-flow.d.ts +15 -30
  46. package/dist/activities/execute-cursor/capture-flow.js +17 -26
  47. package/dist/activities/execute-cursor/capture-flow.js.map +1 -1
  48. package/dist/activities/execute-cursor/cursor-capabilities.d.ts +23 -0
  49. package/dist/activities/execute-cursor/cursor-capabilities.js +33 -0
  50. package/dist/activities/execute-cursor/cursor-capabilities.js.map +1 -0
  51. package/dist/activities/execute-cursor/cursor-mcp-config.d.ts +2 -2
  52. package/dist/activities/execute-cursor/cursor-mcp-config.js.map +1 -1
  53. package/dist/activities/execute-cursor/fetch-interceptor.d.ts +15 -25
  54. package/dist/activities/execute-cursor/fetch-interceptor.js +39 -33
  55. package/dist/activities/execute-cursor/fetch-interceptor.js.map +1 -1
  56. package/dist/activities/execute-cursor/http2-interceptor.d.ts +21 -17
  57. package/dist/activities/execute-cursor/http2-interceptor.js +38 -31
  58. package/dist/activities/execute-cursor/http2-interceptor.js.map +1 -1
  59. package/dist/activities/execute-cursor/message-translator.d.ts +28 -19
  60. package/dist/activities/execute-cursor/message-translator.js +76 -27
  61. package/dist/activities/execute-cursor/message-translator.js.map +1 -1
  62. package/dist/activities/execute-cursor/prompt-builder.d.ts +180 -11
  63. package/dist/activities/execute-cursor/prompt-builder.js +171 -0
  64. package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
  65. package/dist/activities/execute-cursor/rejection-capture.d.ts +3 -6
  66. package/dist/activities/execute-cursor/rejection-capture.js +5 -7
  67. package/dist/activities/execute-cursor/rejection-capture.js.map +1 -1
  68. package/dist/activities/execute-cursor/session-lifecycle.d.ts +1 -4
  69. package/dist/activities/execute-cursor/session-lifecycle.js.map +1 -1
  70. package/dist/activities/execute-cursor/turn-boundary.d.ts +1 -1
  71. package/dist/activities/execute-cursor/turn-settle.d.ts +49 -0
  72. package/dist/activities/execute-cursor/turn-settle.js +507 -0
  73. package/dist/activities/execute-cursor/turn-settle.js.map +1 -0
  74. package/dist/activities/execute-cursor/turn-setup.d.ts +173 -0
  75. package/dist/activities/execute-cursor/turn-setup.js +496 -0
  76. package/dist/activities/execute-cursor/turn-setup.js.map +1 -0
  77. package/dist/activities/execute-cursor/turn-stream.d.ts +41 -71
  78. package/dist/activities/execute-cursor/turn-stream.js +70 -135
  79. package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
  80. package/dist/activities/execute-cursor/turn.d.ts +43 -0
  81. package/dist/activities/execute-cursor/turn.js +222 -0
  82. package/dist/activities/execute-cursor/turn.js.map +1 -0
  83. package/dist/activities/execute-cursor/usage-pricing.d.ts +38 -0
  84. package/dist/activities/execute-cursor/usage-pricing.js +50 -0
  85. package/dist/activities/execute-cursor/usage-pricing.js.map +1 -0
  86. package/dist/activities/execute-deep-agent/approval-file-change.d.ts +1 -1
  87. package/dist/activities/execute-deep-agent/approval-file-change.js +1 -1
  88. package/dist/activities/execute-deep-agent/environment.js +1 -1
  89. package/dist/activities/execute-deep-agent/environment.js.map +1 -1
  90. package/dist/activities/execute-deep-agent/setup.js +3 -2
  91. package/dist/activities/execute-deep-agent/setup.js.map +1 -1
  92. package/dist/activities/hydrate-workflow-execution.js +1 -1
  93. package/dist/activities/hydrate-workflow-execution.js.map +1 -1
  94. package/dist/config.d.ts +15 -0
  95. package/dist/config.js.map +1 -1
  96. package/dist/harness/capabilities.d.ts +87 -0
  97. package/dist/harness/capabilities.js +37 -0
  98. package/dist/harness/capabilities.js.map +1 -0
  99. package/dist/harness/persist-chokepoint.d.ts +74 -0
  100. package/dist/harness/persist-chokepoint.js +88 -0
  101. package/dist/harness/persist-chokepoint.js.map +1 -0
  102. package/dist/harness/registry.d.ts +106 -0
  103. package/dist/harness/registry.js +168 -0
  104. package/dist/harness/registry.js.map +1 -0
  105. package/dist/harness/run-turn.d.ts +53 -0
  106. package/dist/harness/run-turn.js +528 -0
  107. package/dist/harness/run-turn.js.map +1 -0
  108. package/dist/harness/stop-controller.d.ts +50 -0
  109. package/dist/harness/stop-controller.js +62 -0
  110. package/dist/harness/stop-controller.js.map +1 -0
  111. package/dist/harness/terminal-table.d.ts +141 -0
  112. package/dist/harness/terminal-table.js +239 -0
  113. package/dist/harness/terminal-table.js.map +1 -0
  114. package/dist/harness/turn-context.d.ts +523 -0
  115. package/dist/harness/turn-context.js +739 -0
  116. package/dist/harness/turn-context.js.map +1 -0
  117. package/dist/harness/types.d.ts +448 -0
  118. package/dist/harness/types.js +64 -0
  119. package/dist/harness/types.js.map +1 -0
  120. package/dist/harness/usage-accumulator.d.ts +68 -0
  121. package/dist/harness/usage-accumulator.js +101 -0
  122. package/dist/harness/usage-accumulator.js.map +1 -0
  123. package/dist/harness-adapters.d.ts +27 -0
  124. package/dist/harness-adapters.js +28 -0
  125. package/dist/harness-adapters.js.map +1 -0
  126. package/dist/main.js.map +1 -1
  127. package/dist/runner-manager.js +64 -48
  128. package/dist/runner-manager.js.map +1 -1
  129. package/dist/runner.d.ts +5 -4
  130. package/dist/runner.js +65 -64
  131. package/dist/runner.js.map +1 -1
  132. package/dist/shared/approval-policy.d.ts +1 -1
  133. package/dist/shared/approval-policy.js.map +1 -1
  134. package/dist/{activities/execute-cursor → shared}/attachment-resolver.d.ts +2 -2
  135. package/dist/{activities/execute-cursor → shared}/attachment-resolver.js +5 -5
  136. package/dist/shared/attachment-resolver.js.map +1 -0
  137. package/dist/{activities/execute-cursor → shared}/blueprint-resolver.d.ts +7 -5
  138. package/dist/{activities/execute-cursor → shared}/blueprint-resolver.js +3 -63
  139. package/dist/shared/blueprint-resolver.js.map +1 -0
  140. package/dist/shared/channel-attachment.d.ts +1 -1
  141. package/dist/shared/channel-attachment.js.map +1 -1
  142. package/dist/{activities/execute-cursor → shared}/cost-guard.d.ts +5 -1
  143. package/dist/{activities/execute-cursor → shared}/cost-guard.js +5 -1
  144. package/dist/shared/cost-guard.js.map +1 -0
  145. package/dist/{activities/execute-cursor → shared}/env-resolver.d.ts +1 -1
  146. package/dist/shared/env-resolver.js.map +1 -0
  147. package/dist/{activities/execute-cursor → shared}/exact-apply.d.ts +1 -1
  148. package/dist/{activities/execute-cursor → shared}/exact-apply.js +6 -6
  149. package/dist/shared/exact-apply.js.map +1 -0
  150. package/dist/shared/execution-context.d.ts +35 -0
  151. package/dist/shared/execution-context.js +38 -0
  152. package/dist/shared/execution-context.js.map +1 -0
  153. package/dist/{activities/execute-cursor → shared}/extract-structured-output.d.ts +5 -2
  154. package/dist/{activities/execute-cursor → shared}/extract-structured-output.js +9 -6
  155. package/dist/shared/extract-structured-output.js.map +1 -0
  156. package/dist/shared/filereview/capture.d.ts +1 -1
  157. package/dist/shared/filereview/capture.js +1 -1
  158. package/dist/shared/heartbeat.d.ts +13 -11
  159. package/dist/shared/heartbeat.js +14 -29
  160. package/dist/shared/heartbeat.js.map +1 -1
  161. package/dist/{activities/execute-cursor → shared}/persist-decision.d.ts +5 -2
  162. package/dist/{activities/execute-cursor → shared}/persist-decision.js +4 -1
  163. package/dist/shared/persist-decision.js.map +1 -0
  164. package/dist/{activities/execute-cursor → shared}/skill-resolver.d.ts +16 -3
  165. package/dist/{activities/execute-cursor → shared}/skill-resolver.js +12 -4
  166. package/dist/shared/skill-resolver.js.map +1 -0
  167. package/dist/shared/subagent-rows.d.ts +21 -0
  168. package/dist/shared/subagent-rows.js +34 -0
  169. package/dist/shared/subagent-rows.js.map +1 -0
  170. package/dist/shared/worker-shutdown.d.ts +43 -16
  171. package/dist/shared/worker-shutdown.js +28 -13
  172. package/dist/shared/worker-shutdown.js.map +1 -1
  173. package/dist/shared/workspace/platform-dir.d.ts +1 -1
  174. package/dist/shared/workspace/platform-dir.js +1 -1
  175. package/dist/shared/workspace/session-provision.d.ts +54 -0
  176. package/dist/{activities/execute-cursor/workspace-provision.js → shared/workspace/session-provision.js} +15 -12
  177. package/dist/shared/workspace/session-provision.js.map +1 -0
  178. package/package.json +4 -4
  179. package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +325 -0
  180. package/src/__test-utils__/config-fixture.ts +63 -0
  181. package/src/__test-utils__/execution-record-fixture.ts +104 -0
  182. package/src/__test-utils__/harness-boot-order-child.ts +58 -0
  183. package/src/__test-utils__/harness-contract/contract.ts +581 -0
  184. package/src/__test-utils__/harness-contract/recording-sink.ts +107 -0
  185. package/src/__test-utils__/harness-contract/runtime-contract.ts +666 -0
  186. package/src/__test-utils__/harness-contract/scripted-adapter.ts +349 -0
  187. package/src/__test-utils__/harness-contract/types.ts +176 -0
  188. package/src/__test-utils__/hermetic-activity.ts +502 -0
  189. package/src/__test-utils__/model-registry-fixture.ts +72 -0
  190. package/src/__test-utils__/module-specifiers.ts +82 -0
  191. package/src/__test-utils__/proto-helpers.ts +25 -0
  192. package/src/__test-utils__/turn-input-fixture.ts +155 -0
  193. package/src/__tests__/harness-boot-order.test.ts +77 -0
  194. package/src/__tests__/harness-contract.test.ts +27 -0
  195. package/src/__tests__/runner-manager.test.ts +18 -0
  196. package/src/activities/execute-cursor/__test-utils__/__tests__/scripted-double.test.ts +102 -0
  197. package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +396 -0
  198. package/src/activities/execute-cursor/__test-utils__/cursor-hook-harness.ts +66 -0
  199. package/src/activities/execute-cursor/__test-utils__/gateway-substrate.ts +2 -43
  200. package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +342 -0
  201. package/src/activities/execute-cursor/__test-utils__/scripted-agent.ts +368 -0
  202. package/src/activities/execute-cursor/__test-utils__/scripted-sdk.ts +254 -0
  203. package/src/activities/execute-cursor/__tests__/adapter-is-temporal-free.test.ts +45 -0
  204. package/src/activities/execute-cursor/__tests__/approval-decisions-agree.test.ts +90 -0
  205. package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +7 -8
  206. package/src/activities/execute-cursor/__tests__/capture-flow.test.ts +28 -1
  207. package/src/activities/execute-cursor/__tests__/deny-gate-exact-apply.test.ts +1 -1
  208. package/src/activities/execute-cursor/__tests__/fetch-interceptor.test.ts +64 -6
  209. package/src/activities/execute-cursor/__tests__/hermetic/deny-and-retry.test.ts +228 -0
  210. package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +180 -0
  211. package/src/activities/execute-cursor/__tests__/hermetic/goldens/cost-cap.status.json +53 -0
  212. package/src/activities/execute-cursor/__tests__/hermetic/goldens/deny-and-retry.turn1.status.json +55 -0
  213. package/src/activities/execute-cursor/__tests__/hermetic/goldens/deny-and-retry.turn2.status.json +77 -0
  214. package/src/activities/execute-cursor/__tests__/hermetic/goldens/file-review-capture.status.json +126 -0
  215. package/src/activities/execute-cursor/__tests__/hermetic/goldens/pause.status.json +40 -0
  216. package/src/activities/execute-cursor/__tests__/hermetic/goldens/plain-turn.status.json +48 -0
  217. package/src/activities/execute-cursor/__tests__/hermetic/goldens/platform-stop.status.json +56 -0
  218. package/src/activities/execute-cursor/__tests__/hermetic/goldens/recovery-fresh-agent.status.json +53 -0
  219. package/src/activities/execute-cursor/__tests__/hermetic/goldens/recovery-transport-timeout.status.json +48 -0
  220. package/src/activities/execute-cursor/__tests__/hermetic/goldens/resolution-error.status.json +18 -0
  221. package/src/activities/execute-cursor/__tests__/hermetic/goldens/run-cancelled.status.json +36 -0
  222. package/src/activities/execute-cursor/__tests__/hermetic/goldens/run-error-non-retryable.status.json +37 -0
  223. package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-error-at-create.status.json +38 -0
  224. package/src/activities/execute-cursor/__tests__/hermetic/goldens/stall.status.json +59 -0
  225. package/src/activities/execute-cursor/__tests__/hermetic/goldens/tool-call.status.json +68 -0
  226. package/src/activities/execute-cursor/__tests__/hermetic/goldens/unattributed-hook-block.status.json +79 -0
  227. package/src/activities/execute-cursor/__tests__/hermetic/goldens/worker-shutdown.status.json +42 -0
  228. package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +170 -0
  229. package/src/activities/execute-cursor/__tests__/hermetic/pause-vs-shutdown.test.ts +205 -0
  230. package/src/activities/execute-cursor/__tests__/hermetic/plain-turn.test.ts +171 -0
  231. package/src/activities/execute-cursor/__tests__/hermetic/recovery-fresh-agent.test.ts +156 -0
  232. package/src/activities/execute-cursor/__tests__/hermetic/run-wait-arms.test.ts +286 -0
  233. package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +332 -0
  234. package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +193 -0
  235. package/src/activities/execute-cursor/__tests__/hermetic/tool-call.test.ts +137 -0
  236. package/src/activities/execute-cursor/__tests__/hermetic/unattributed-hook-block.test.ts +185 -0
  237. package/src/activities/execute-cursor/__tests__/hermetic/workspace-lock-timeout.test.ts +151 -0
  238. package/src/activities/execute-cursor/__tests__/http2-interceptor.test.ts +65 -35
  239. package/src/activities/execute-cursor/__tests__/message-translator.test.ts +0 -40
  240. package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +171 -0
  241. package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +118 -243
  242. package/src/activities/execute-cursor/__tests__/usage-pricing.test.ts +84 -0
  243. package/src/activities/execute-cursor/adapter.ts +138 -0
  244. package/src/activities/execute-cursor/approval-state.ts +2 -2
  245. package/src/activities/execute-cursor/capture-flow.ts +18 -41
  246. package/src/activities/execute-cursor/cursor-capabilities.ts +35 -0
  247. package/src/activities/execute-cursor/cursor-mcp-config.ts +2 -2
  248. package/src/activities/execute-cursor/fetch-interceptor.ts +48 -45
  249. package/src/activities/execute-cursor/http2-interceptor.ts +47 -34
  250. package/src/activities/execute-cursor/message-translator.ts +90 -45
  251. package/src/activities/execute-cursor/prompt-builder.ts +327 -12
  252. package/src/activities/execute-cursor/rejection-capture.ts +5 -12
  253. package/src/activities/execute-cursor/session-lifecycle.ts +1 -5
  254. package/src/activities/execute-cursor/turn-boundary.ts +1 -1
  255. package/src/activities/execute-cursor/turn-settle.ts +601 -0
  256. package/src/activities/execute-cursor/turn-setup.ts +645 -0
  257. package/src/activities/execute-cursor/turn-stream.ts +84 -210
  258. package/src/activities/execute-cursor/turn.ts +240 -0
  259. package/src/activities/execute-cursor/usage-pricing.ts +67 -0
  260. package/src/activities/execute-deep-agent/approval-file-change.ts +1 -1
  261. package/src/activities/execute-deep-agent/environment.ts +1 -1
  262. package/src/activities/execute-deep-agent/setup.ts +3 -2
  263. package/src/activities/hydrate-workflow-execution.ts +1 -1
  264. package/src/config.ts +13 -0
  265. package/src/harness/__tests__/import-direction.test.ts +168 -0
  266. package/src/harness/__tests__/persist-chokepoint.test.ts +146 -0
  267. package/src/harness/__tests__/registry.test.ts +168 -0
  268. package/src/harness/__tests__/run-turn.test.ts +165 -0
  269. package/src/harness/__tests__/stop-controller.test.ts +49 -0
  270. package/src/harness/__tests__/turn-context.test.ts +178 -0
  271. package/src/harness/__tests__/usage-accumulator.test.ts +83 -0
  272. package/src/harness/capabilities.ts +92 -0
  273. package/src/harness/persist-chokepoint.ts +112 -0
  274. package/src/harness/registry.ts +197 -0
  275. package/src/harness/run-turn.ts +618 -0
  276. package/src/harness/stop-controller.ts +83 -0
  277. package/src/harness/terminal-table.ts +276 -0
  278. package/src/harness/turn-context.ts +1028 -0
  279. package/src/harness/types.ts +473 -0
  280. package/src/harness/usage-accumulator.ts +122 -0
  281. package/src/harness-adapters.ts +30 -0
  282. package/src/main.ts +1 -1
  283. package/src/runner-manager.ts +68 -61
  284. package/src/runner.ts +67 -78
  285. package/src/shared/__tests__/attachment-naming.test.ts +1 -1
  286. package/src/{activities/execute-cursor → shared}/__tests__/attachment-resolver.test.ts +6 -4
  287. package/src/{activities/execute-cursor → shared}/__tests__/cost-guard.test.ts +2 -1
  288. package/src/{activities/execute-cursor → shared}/__tests__/exact-apply.test.ts +3 -3
  289. package/src/{activities/execute-cursor → shared}/__tests__/extract-structured-output.test.ts +8 -8
  290. package/src/{activities/execute-cursor → shared}/__tests__/persist-decision.test.ts +4 -2
  291. package/src/{activities/execute-cursor → shared}/__tests__/skill-resolver.test.ts +1 -1
  292. package/src/shared/__tests__/subagent-rows.test.ts +34 -0
  293. package/src/shared/__tests__/worker-shutdown.test.ts +44 -39
  294. package/src/shared/approval-policy.ts +1 -1
  295. package/src/{activities/execute-cursor → shared}/attachment-resolver.ts +6 -6
  296. package/src/{activities/execute-cursor → shared}/blueprint-resolver.ts +7 -78
  297. package/src/shared/channel-attachment.ts +1 -1
  298. package/src/{activities/execute-cursor → shared}/cost-guard.ts +5 -1
  299. package/src/{activities/execute-cursor → shared}/env-resolver.ts +1 -1
  300. package/src/{activities/execute-cursor → shared}/exact-apply.ts +7 -7
  301. package/src/shared/execution-context.ts +45 -0
  302. package/src/{activities/execute-cursor → shared}/extract-structured-output.ts +10 -7
  303. package/src/shared/filereview/capture.ts +1 -1
  304. package/src/shared/heartbeat.ts +13 -33
  305. package/src/{activities/execute-cursor → shared}/persist-decision.ts +5 -2
  306. package/src/{activities/execute-cursor → shared}/skill-resolver.ts +20 -6
  307. package/src/shared/subagent-rows.ts +39 -0
  308. package/src/shared/worker-shutdown.ts +55 -25
  309. package/src/{activities/execute-cursor/__tests__/workspace-provision.test.ts → shared/workspace/__tests__/session-provision.test.ts} +25 -28
  310. package/src/shared/workspace/platform-dir.ts +1 -1
  311. package/src/{activities/execute-cursor/workspace-provision.ts → shared/workspace/session-provision.ts} +29 -16
  312. package/dist/activities/execute-cursor/attachment-resolver.js.map +0 -1
  313. package/dist/activities/execute-cursor/blueprint-resolver.js.map +0 -1
  314. package/dist/activities/execute-cursor/cost-guard.js.map +0 -1
  315. package/dist/activities/execute-cursor/env-resolver.js.map +0 -1
  316. package/dist/activities/execute-cursor/exact-apply.js.map +0 -1
  317. package/dist/activities/execute-cursor/extract-structured-output.js.map +0 -1
  318. package/dist/activities/execute-cursor/index.d.ts +0 -209
  319. package/dist/activities/execute-cursor/index.js +0 -2345
  320. package/dist/activities/execute-cursor/index.js.map +0 -1
  321. package/dist/activities/execute-cursor/persist-decision.js.map +0 -1
  322. package/dist/activities/execute-cursor/skill-resolver.js.map +0 -1
  323. package/dist/activities/execute-cursor/usage-accumulator.d.ts +0 -89
  324. package/dist/activities/execute-cursor/usage-accumulator.js +0 -121
  325. package/dist/activities/execute-cursor/usage-accumulator.js.map +0 -1
  326. package/dist/activities/execute-cursor/workspace-provision.d.ts +0 -42
  327. package/dist/activities/execute-cursor/workspace-provision.js.map +0 -1
  328. package/src/activities/execute-cursor/__tests__/usage-accumulator.test.ts +0 -164
  329. package/src/activities/execute-cursor/index.ts +0 -2876
  330. package/src/activities/execute-cursor/usage-accumulator.ts +0 -169
  331. /package/dist/{activities/execute-cursor → shared}/env-resolver.js +0 -0
@@ -0,0 +1,507 @@
1
+ /**
2
+ * The Cursor harness's settle — from a consumed stream to a `TurnOutcome`.
3
+ *
4
+ * In order: the post-stream finalize (transcript, enrichments, sub-agents,
5
+ * the usage snapshot's carrier, the recorder flush, one persist so the UI
6
+ * sees settled rows); the runtime's stop, if it fired, settled as
7
+ * `interrupted` with nothing further; the turn boundary (`turn-boundary.ts`,
8
+ * whole, Q-S2-1) that authors this turn's change set and overlays the hook's
9
+ * denials as WAITING rows, ending `awaiting_approval` when it says so or
10
+ * failing on an unattributed hook block (#205); `run.wait()` and the
11
+ * classifier; the two recovery spines (a poisoned resumed handle, a
12
+ * transport timeout on a created agent), each running the IDENTICAL stream,
13
+ * finalize and boundary against a fresh agent at most once; the collapse of
14
+ * redundant same-identity tool-call twins; and the outcome.
15
+ *
16
+ * What this module never does: write a phase, a terminal copy or
17
+ * `completedAt` — those are the runtime's (`harness/run-turn.ts`,
18
+ * `terminal-table.ts`); the outcome carries what the runtime cannot read
19
+ * from the status (`failed`'s message and surface, `cancelled`). It does
20
+ * mutate `sink.status`'s transcript rows, which are this harness's to write.
21
+ *
22
+ * Moved from `index.ts` `executeCursorInner` phases 11 to 13 at S2 M3b; the
23
+ * bodies are the orchestrator's, with the runtime's arms taken out.
24
+ */
25
+ import { create } from "@bufbuild/protobuf";
26
+ import { StreamingUsageSummarySchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/usage_pb";
27
+ import { TimingRecorder, emitTimingLog } from "../../shared/cold-start-timing.js";
28
+ import { StreamingUpdateScheduler, loadStreamingConfig } from "../../shared/streaming-scheduler.js";
29
+ import { createCursorEventRecorder } from "./cursor-event-recorder.js";
30
+ import { DeltaEnricher } from "./delta-enricher.js";
31
+ import { extractRunErrorSources, formatClassifiedError, shouldRetryWithFreshAgent, synthesizeError, } from "./error-classifier.js";
32
+ import { closeProxySessions } from "./http2-interceptor.js";
33
+ import { MessageAccumulator, collapseRedundantToolCallTwins } from "./message-translator.js";
34
+ import { clearCapturedRejection, getCapturedRejection } from "./rejection-capture.js";
35
+ import { TodoTracker } from "./todo-tracker.js";
36
+ import { runTurnBoundary } from "./turn-boundary.js";
37
+ import { consumeCursorTurnStream, makeCursorTurnOnDelta, } from "./turn-stream.js";
38
+ import { createFreshAgent } from "./turn-setup.js";
39
+ /**
40
+ * Send the primary prompt, consume the stream, and settle. The one entry the
41
+ * adapter calls after setup; every collaborator the stream loop needs is
42
+ * built here, once, and shared with both recovery spines.
43
+ */
44
+ export async function streamAndSettle(frame) {
45
+ const { input, sink, config, engine, gate, prompt, rows, streamState } = frame;
46
+ const { executionId, sessionId, blueprint, workspace, mcp } = input;
47
+ const { status } = sink;
48
+ const deltaEnricher = new DeltaEnricher();
49
+ const todoTracker = new TodoTracker(status.todos);
50
+ const eventRecorder = createCursorEventRecorder(executionId);
51
+ // The two recovery retries (poisoned-handle / transport-timeout) below run at
52
+ // most once per turn; this guard is the latch.
53
+ let alreadyRetriedWithFreshAgent = false;
54
+ // The shared onDelta only needs the sink/pricer/enricher/state subset, and
55
+ // it is wired at SEND time — before the accumulator exists — so it takes the
56
+ // narrow deps. The primary send and both retry sends reuse this object.
57
+ const onDeltaDeps = {
58
+ sink,
59
+ usagePricer: engine.usagePricer,
60
+ deltaEnricher,
61
+ promptEstimatedTokens: prompt.promptEstimatedTokens,
62
+ executionId,
63
+ state: streamState,
64
+ };
65
+ // Issue #209 forensics: the SDK acquires the local executor — the piece
66
+ // that actually spawns stdio MCP servers — inside send(), AFTER the
67
+ // execution_setup timeline has already been emitted. This one-shot
68
+ // timeline makes that previously invisible window measurable:
69
+ // `send_returned` covers the send() call itself, `first_delta` the wait
70
+ // until the SDK's first delta. Primary send only — the recovery retries
71
+ // below rebuild the agent and would skew the user-perceived turn start
72
+ // this measures. No delta (immediate pause/failure) → no line.
73
+ const turnStartTiming = new TimingRecorder();
74
+ let turnFirstEventEmitted = false;
75
+ const primaryOnDelta = makeCursorTurnOnDelta(onDeltaDeps);
76
+ const run = await engine.resolution.agent.send(prompt.toSendMessage(prompt.effectivePrompt, prompt.primarySendImages), {
77
+ onDelta: (event) => {
78
+ if (!turnFirstEventEmitted) {
79
+ turnFirstEventEmitted = true;
80
+ turnStartTiming.mark("first_delta");
81
+ emitTimingLog("turn_first_event", {
82
+ execution_id: executionId,
83
+ session_id: sessionId,
84
+ harness: "cursor",
85
+ agent_resumed: engine.resolution.resumed,
86
+ mcp_server_count: blueprint.mergedMcpServerUsages.length,
87
+ }, turnStartTiming);
88
+ }
89
+ primaryOnDelta(event);
90
+ },
91
+ });
92
+ sink.recordActivity();
93
+ // Normally send() resolves before any delta arrives, making send_returned
94
+ // the first segment; if a delta beat it, the line is already emitted and
95
+ // adding a mark now would be meaningless.
96
+ if (!turnFirstEventEmitted) {
97
+ turnStartTiming.mark("send_returned");
98
+ }
99
+ // Everything at an index >= this was produced by THIS turn's stream — the
100
+ // positional turn boundary the approved-command provenance (DD-28) scopes
101
+ // its qualification to. Snapshotted before the accumulator can append.
102
+ const turnStartMessageIndex = status.messages.length;
103
+ const accumulator = new MessageAccumulator(status.messages, {
104
+ mergedPolicies: mcp.policies,
105
+ provenance: { globalBypass: mcp.leases.global, leasedCategories: mcp.leases.categories },
106
+ workspaceRoot: workspace.primaryDir,
107
+ seededSubAgents: rows.seededSubAgents,
108
+ });
109
+ // Shared cadence with the native harness: discrete state changes force a
110
+ // flush; high-frequency token deltas ride this scheduler's time cadence
111
+ // (env-tunable via STREAMING_* — see loadStreamingConfig).
112
+ const scheduler = new StreamingUpdateScheduler(loadStreamingConfig());
113
+ // Full deps for the shared stream loop, all keyed off the single stream
114
+ // state. Consumed by the primary stream here and by both recovery retries.
115
+ const streamDeps = {
116
+ ...onDeltaDeps,
117
+ accumulator,
118
+ todoTracker,
119
+ eventRecorder,
120
+ scheduler,
121
+ progressSubstrate: gate.progressSubstrate,
122
+ progressState: gate.progressState,
123
+ changeSetId: workspace.changeSetId,
124
+ hitlDir: gate.hitlDir,
125
+ };
126
+ // Post-stream finalize, shared by the primary turn and both recovery retries:
127
+ // finalize the transcript + streaming flags, mark any in-flight sub-agent
128
+ // CANCELLED on a stopped turn, keep the usage summary's carrier current,
129
+ // flush the recorder, and persist so the UI sees the settled rows.
130
+ const finalizeStreamPhase = async () => {
131
+ accumulator.finalize();
132
+ deltaEnricher.finalize(status.messages);
133
+ // A stopped turn (pause, shutdown, stall, cost cap, platform stop) aborts
134
+ // the Cursor SDK run, so any sub-agent the parent had delegated is no
135
+ // longer executing. Mark it CANCELLED rather than leaving a permanent
136
+ // IN_PROGRESS "zombie" in the final snapshot (parity with the native
137
+ // harness's cancelSubAgents()).
138
+ if (sink.stopSignal.aborted) {
139
+ accumulator.cancelInProgressSubAgents();
140
+ }
141
+ status.subAgentExecutions = accumulator.subAgentExecutions;
142
+ await eventRecorder?.flush();
143
+ console.log(`ExecuteCursor stream ended: execution=${executionId}, events=${streamState.eventCount}, messages=${status.messages.length}, subAgents=${status.subAgentExecutions.length}`);
144
+ // Persist immediately after finalize so the UI sees correct tool-call
145
+ // statuses before the boundary / run.wait() / the runtime's epilogue.
146
+ await sink.requestPersist();
147
+ sink.recordActivity();
148
+ };
149
+ // The turn boundary — author this turn's change set to the file_review
150
+ // ledger (CANDIDATE_CAPTURED) and overlay the hook's denials as
151
+ // WAITING_APPROVAL gate rows. The full pipeline and its ordering rationale
152
+ // live in turn-boundary.ts; this closure binds the turn's state so the
153
+ // recovery retries (which re-run the agent AFTER this primary call) can
154
+ // re-enter the IDENTICAL pipeline — a retry's edits must reach the ledger
155
+ // or they silently escape review.
156
+ const runBoundary = (denialSettled) => runTurnBoundary({
157
+ status,
158
+ executionId,
159
+ changeSetId: workspace.changeSetId,
160
+ hitlDir: gate.hitlDir,
161
+ captureMode: workspace.captureMode,
162
+ baselineTree: gate.baselineTree,
163
+ primaryWorkspaceDir: workspace.primaryDir,
164
+ gitWorkspace: workspace.gitWorkspace,
165
+ turnStartMessageIndex,
166
+ approvalGrants: gate.approvalGrants,
167
+ globalBypass: mcp.leases.global,
168
+ seededSubAgents: rows.seededSubAgents,
169
+ artifactStorage: input.artifactStorage,
170
+ mergedPolicies: mcp.policies,
171
+ denialCancelSettled: denialSettled,
172
+ foreignGatingHooks: gate.hitlGate.foreignGatingHooks,
173
+ });
174
+ // The boundary mutated the transcript in place and asked to pause for
175
+ // review: the runtime flips the phase, persists, and returns to the
176
+ // workflow, which waits for the approval/file-review signal and reinvokes.
177
+ const awaitingApproval = (boundary) => {
178
+ console.log(`ExecuteCursor returning WAITING_FOR_APPROVAL: ${boundary.deniedToolCallCount} gated tool(s), ` +
179
+ `${boundary.capturedChangeCount} file card(s) pending`);
180
+ return { kind: "awaiting_approval" };
181
+ };
182
+ // Issue #205: a tool was blocked by a hook Stigmer does not own (the merge
183
+ // preserves the user's own gating hooks, and Cursor runs every one), so no
184
+ // approval can unblock it — an approval grants a token only OUR hook reads,
185
+ // and the foreign hook would deny the re-attempt forever. Completing would
186
+ // be the silent-failure shape the issue describes; instead fail with a
187
+ // diagnosable reason naming the blocked tools and the likely culprit. The
188
+ // user can fix this one: the `actionable` surface.
189
+ const unattributedHookBlock = (boundary) => {
190
+ const blockedTools = [...new Set(boundary.unattributedHookBlocks.map((b) => b.toolName))].join(", ");
191
+ const foreign = gate.hitlGate.foreignGatingHooks;
192
+ const culprit = foreign.length > 0
193
+ ? ` The workspace's .cursor/hooks.json registers hook(s) outside Stigmer's control ` +
194
+ `[${foreign.join(", ")}], which most likely denied it.`
195
+ : "";
196
+ const message = `A Cursor hook outside Stigmer's approval gate blocked tool(s): ${blockedTools}.` +
197
+ culprit +
198
+ ` Stigmer cannot request approval on a foreign hook's behalf — remove or adjust ` +
199
+ `the hook in .cursor/hooks.json and retry.`;
200
+ console.error(`ExecuteCursor failed (unattributed hook block): execution=${executionId}, ` +
201
+ `tools=[${blockedTools}], foreignHooks=[${foreign.join(", ")}]`);
202
+ return { kind: "failed", surface: "actionable", message };
203
+ };
204
+ // Re-enter the turn boundary for a recovery retry: author the retry's net
205
+ // change set to the file_review ledger and overlay any denials as gates —
206
+ // without this a retry's file edits silently escape review (production case
207
+ // aex_01kws27q1e2esvkqjpvectttxf). Returns undefined for a cancelled retry —
208
+ // there is no review to open. Passes denialCancelSettled so a first denial
209
+ // that stopped the RETRY waits for run.cancel() before the ledger read,
210
+ // exactly like the primary path.
211
+ const settleRetryTurn = async (retryResultStatus) => retryResultStatus === "cancelled"
212
+ ? undefined
213
+ : runBoundary(streamState.firstDenialDetected ? streamState.denialCancelSettled : undefined);
214
+ const runRecoveryStream = async (freshAgent, retryPrompt) => {
215
+ // The fresh agent is now the live handle: point the resolution at it so
216
+ // the adapter's disposition parks or closes THIS agent rather than the
217
+ // disposed one it replaced.
218
+ engine.resolution = { ...engine.resolution, agent: freshAgent, agentId: freshAgent.agentId, isNew: true };
219
+ streamState.streamErrorMessage = undefined;
220
+ // The retry always carries the turn's full image payload — never the
221
+ // primary send's HITL-trimmed set: the fresh agent's conversation is
222
+ // empty, so skipping them here would silently lose the user's photo on
223
+ // a recovered turn (issue #366's vision corollary).
224
+ const retryRun = await freshAgent.send(prompt.toSendMessage(retryPrompt, prompt.turnImages), {
225
+ onDelta: makeCursorTurnOnDelta(onDeltaDeps),
226
+ });
227
+ sink.recordActivity();
228
+ const reason = await consumeCursorTurnStream(retryRun, streamDeps);
229
+ await finalizeStreamPhase();
230
+ if (reason === "interrupted")
231
+ return { proceeded: false, outcome: { kind: "interrupted" } };
232
+ const retryResult = await retryRun.wait();
233
+ sink.recordActivity();
234
+ console.log(`ExecuteCursor retry run.wait(): execution=${executionId}, retryResult=${JSON.stringify(retryResult)}`);
235
+ const retryBoundary = await settleRetryTurn(retryResult.status);
236
+ return { proceeded: true, retryRun, retryResult, retryBoundary };
237
+ };
238
+ // ── The primary stream ────────────────────────────────────────────────────
239
+ const reason = await consumeCursorTurnStream(run, streamDeps);
240
+ await finalizeStreamPhase();
241
+ if (reason === "interrupted")
242
+ return { kind: "interrupted" };
243
+ // The denial-settle wait applies only when a first denial stopped THIS run;
244
+ // a normal completion passes no promise.
245
+ const boundary = await runBoundary(streamState.firstDenialDetected ? streamState.denialCancelSettled : undefined);
246
+ sink.recordActivity();
247
+ if (boundary.waiting) {
248
+ // A pausing turn is never silent, so an unattributed block alongside our
249
+ // own gate only warns (logged by the boundary) — the pause wins.
250
+ return awaitingApproval(boundary);
251
+ }
252
+ if (boundary.unattributedHookBlocks.length > 0) {
253
+ return unattributedHookBlock(boundary);
254
+ }
255
+ // ── run.wait() ────────────────────────────────────────────────────────────
256
+ const result = await run.wait();
257
+ sink.recordActivity();
258
+ console.log(`ExecuteCursor run.wait() result: execution=${executionId}, result=${JSON.stringify(result)}`);
259
+ // Echo sanity check only: result.model ECHOES the requested selection —
260
+ // the SDK never reports the variant that actually served the call
261
+ // (verified against the billing ledger, #357). A mismatch here means the
262
+ // SDK rewrote our selection (contract change), not variant drift; the
263
+ // authoritative requested-vs-billed reconciliation is the cloud billing
264
+ // handler's pricing_variant mismatch metric.
265
+ const echoedSelection = result.model;
266
+ if (echoedSelection) {
267
+ const idMatches = echoedSelection.id === engine.validatedModel;
268
+ // Compare id/value pairs explicitly, never serialized objects: the SDK
269
+ // may add fields to ModelParameterValue or reorder keys, and neither
270
+ // is contract drift.
271
+ const echoedParams = [...(echoedSelection.params ?? [])].sort((a, b) => a.id.localeCompare(b.id));
272
+ const paramsMatch = echoedParams.length === engine.modelParams.length &&
273
+ echoedParams.every((p, i) => p.id === engine.modelParams[i].id && p.value === engine.modelParams[i].value);
274
+ if (!idMatches || !paramsMatch) {
275
+ console.warn(`ExecuteCursor model selection echo mismatch (SDK contract drift?): ` +
276
+ `execution=${executionId}, ` +
277
+ `requested=${JSON.stringify({ id: engine.validatedModel, params: engine.modelParams })}, ` +
278
+ `echoed=${JSON.stringify(echoedSelection)}`);
279
+ }
280
+ }
281
+ let outcome;
282
+ switch (result.status) {
283
+ case "finished":
284
+ outcome = { kind: "completed" };
285
+ break;
286
+ case "cancelled":
287
+ outcome = { kind: "cancelled" };
288
+ break;
289
+ case "error": {
290
+ // Shape-aware extraction, NOT String(): the result's error fields are
291
+ // structured at runtime often enough that a bare coercion showed users
292
+ // "[object Object]" and shadowed every fallback source below (oss#299).
293
+ const runErrorSources = extractRunErrorSources(result);
294
+ // The SDK frequently resolves run.wait() to a bare { status: "error" }
295
+ // while the real reason (e.g. the original grpc-status 12 routing
296
+ // failure) lives on the failing conversation turn. Capture it here so
297
+ // the classified error is actionable instead of "no detail from SDK".
298
+ const conversationErrorText = await introspectConversation(run, executionId);
299
+ const capturedRejection = getCapturedRejection(executionId);
300
+ if (capturedRejection)
301
+ clearCapturedRejection(executionId);
302
+ const classified = synthesizeError({
303
+ sdkError: runErrorSources.sdkError,
304
+ sdkResultFields: runErrorSources.sdkResultFields,
305
+ streamErrorMessage: streamState.streamErrorMessage,
306
+ capturedRejection,
307
+ conversationErrorText,
308
+ isResumedHandle: engine.resolution.reason === "resumed_successfully",
309
+ fallbackContext: { model: engine.validatedModel, mode: engine.agentMode, agentId: engine.resolution.agentId },
310
+ durationMs: result.durationMs,
311
+ messageCount: status.messages.length,
312
+ proxyMode: !!config.proxyEndpoint,
313
+ });
314
+ console.error(`ExecuteCursor agent error: execution=${executionId}, ` +
315
+ `classified=${JSON.stringify(classified)}, rawResult=${JSON.stringify(result)}`);
316
+ if (shouldRetryWithFreshAgent(classified) && engine.resolution.reason === "resumed_successfully" && !alreadyRetriedWithFreshAgent) {
317
+ alreadyRetriedWithFreshAgent = true;
318
+ console.warn(`ExecuteCursor poisoned-handle recovery: execution=${executionId}, ` +
319
+ `disposing agent ${engine.resolution.agentId} and creating fresh agent`);
320
+ try {
321
+ engine.resolution.agent.close();
322
+ }
323
+ catch { /* best effort */ }
324
+ const freshAgent = await createFreshAgent(engine);
325
+ const freshPrompt = await prompt.buildRecoveryPrompt({
326
+ ...engine.resolution,
327
+ agent: freshAgent,
328
+ agentId: freshAgent.agentId,
329
+ isNew: true,
330
+ resumed: false,
331
+ reason: "created_after_resume_failure",
332
+ resumeFailureDetail: `poisoned-handle recovery: ${classified.message}`,
333
+ });
334
+ console.log(`ExecuteCursor retry with fresh agent: execution=${executionId}, newAgentId=${freshAgent.agentId}`);
335
+ await sink.bindHarnessState(freshAgent.agentId);
336
+ const recovery = await runRecoveryStream(freshAgent, freshPrompt);
337
+ if (!recovery.proceeded)
338
+ return recovery.outcome;
339
+ const { retryRun, retryResult, retryBoundary } = recovery;
340
+ if (retryBoundary?.waiting) {
341
+ // The retry's edits/denials armed the gate — pause for review. On a
342
+ // retry error this supersedes the failure, exactly as on the primary
343
+ // path (a captured change pauses the turn before run.wait() is
344
+ // consulted).
345
+ console.log(`ExecuteCursor poisoned-handle recovery paused for review: execution=${executionId}`);
346
+ return awaitingApproval(retryBoundary);
347
+ }
348
+ if (retryBoundary && retryBoundary.unattributedHookBlocks.length > 0) {
349
+ return unattributedHookBlock(retryBoundary);
350
+ }
351
+ if (retryResult.status === "finished") {
352
+ console.log(`ExecuteCursor poisoned-handle recovery SUCCEEDED: execution=${executionId}`);
353
+ outcome = { kind: "completed" };
354
+ break;
355
+ }
356
+ if (retryResult.status === "cancelled") {
357
+ outcome = { kind: "cancelled" };
358
+ break;
359
+ }
360
+ const retryRejection = getCapturedRejection(executionId);
361
+ if (retryRejection)
362
+ clearCapturedRejection(executionId);
363
+ const retryConversationErrorText = await introspectConversation(retryRun, executionId);
364
+ // Same shape-aware extraction as the primary error arm — the retry
365
+ // previously String()-coerced result.result alone, so a structured
366
+ // retry failure both read "[object Object]" and ignored the
367
+ // error/message/reason fields the primary arm consults.
368
+ const retryErrorSources = extractRunErrorSources(retryResult);
369
+ const retryClassified = synthesizeError({
370
+ sdkError: retryErrorSources.sdkError,
371
+ sdkResultFields: retryErrorSources.sdkResultFields,
372
+ streamErrorMessage: streamState.streamErrorMessage,
373
+ capturedRejection: retryRejection,
374
+ conversationErrorText: retryConversationErrorText,
375
+ isResumedHandle: false,
376
+ fallbackContext: { model: engine.validatedModel, mode: engine.agentMode, agentId: freshAgent.agentId },
377
+ proxyMode: !!config.proxyEndpoint,
378
+ });
379
+ const message = formatClassifiedError(retryClassified);
380
+ console.error(`ExecuteCursor poisoned-handle recovery FAILED: execution=${executionId}, retryError=${message}`);
381
+ outcome = { kind: "failed", surface: "engine", message };
382
+ break;
383
+ }
384
+ // Transport-timeout retry: fresh agent got 0 messages (degraded h2 session).
385
+ // Reset proxy sessions and try once with a new connection.
386
+ if (classified.category === "network" && classified.retryable && engine.resolution.reason !== "resumed_successfully" && !alreadyRetriedWithFreshAgent) {
387
+ alreadyRetriedWithFreshAgent = true;
388
+ console.warn(`ExecuteCursor transport-timeout recovery: execution=${executionId}, ` +
389
+ `resetting proxy sessions and retrying with fresh agent`);
390
+ try {
391
+ engine.resolution.agent.close();
392
+ }
393
+ catch { /* best effort */ }
394
+ closeProxySessions();
395
+ const freshAgent = await createFreshAgent(engine);
396
+ await sink.bindHarnessState(freshAgent.agentId);
397
+ const recovery = await runRecoveryStream(freshAgent, prompt.effectivePrompt);
398
+ if (!recovery.proceeded)
399
+ return recovery.outcome;
400
+ const { retryResult, retryBoundary } = recovery;
401
+ if (retryBoundary?.waiting) {
402
+ // The retry's edits/denials armed the gate — pause for review (see
403
+ // the poisoned-handle branch above for the precedence rationale).
404
+ console.log(`ExecuteCursor transport-timeout recovery paused for review: execution=${executionId}`);
405
+ return awaitingApproval(retryBoundary);
406
+ }
407
+ if (retryBoundary && retryBoundary.unattributedHookBlocks.length > 0) {
408
+ return unattributedHookBlock(retryBoundary);
409
+ }
410
+ if (retryResult.status === "finished") {
411
+ outcome = { kind: "completed" };
412
+ break;
413
+ }
414
+ outcome = { kind: "failed", surface: "engine", message: `Transport recovery failed: ${formatClassifiedError(classified)}` };
415
+ break;
416
+ }
417
+ outcome = { kind: "failed", surface: "engine", message: formatClassifiedError(classified) };
418
+ break;
419
+ }
420
+ default:
421
+ outcome = { kind: "completed" };
422
+ }
423
+ // Collapse any redundant same-identity tool-call twin born this turn before
424
+ // the terminal persist. On a resume turn the gated tool is already granted, so
425
+ // there is no denial ledger and reconcileDeniedToolCalls never runs — the
426
+ // extra attempt the model emits beside the approved action (a stuck RUNNING
427
+ // zombie, a denied-reported-as-success COMPLETED, or an all-no-change double)
428
+ // would otherwise persist as a second "No preview available" card. The shared
429
+ // routine keeps the diff/output carrier and blanks the rest to hidden SKIPPED
430
+ // rows in place, preserving each committed id so the finalize stays append-only.
431
+ const collapsedTwins = collapseRedundantToolCallTwins(status.messages);
432
+ if (collapsedTwins > 0) {
433
+ console.log(`ExecuteCursor collapsed ${collapsedTwins} redundant tool-call twin(s) at ` +
434
+ `terminal finalize (kept in place as hidden SKIPPED rows): execution=${executionId}`);
435
+ }
436
+ return outcome;
437
+ }
438
+ /**
439
+ * Best-effort: read the failing run's conversation to recover the real error
440
+ * reason the SDK swallowed in run.wait(). Logs the (bounded) raw turns for deep
441
+ * diagnostics and returns a concise error string for the classifier.
442
+ *
443
+ * Strictly non-fatal — any failure (unsupported operation, transport error)
444
+ * returns undefined and never propagates into the execution's error path.
445
+ */
446
+ async function introspectConversation(run, executionId) {
447
+ try {
448
+ if (!run.supports("conversation")) {
449
+ console.log(`ExecuteCursor conversation introspection unsupported: execution=${executionId}, ` +
450
+ `reason=${run.unsupportedReason("conversation") ?? "n/a"}`);
451
+ return undefined;
452
+ }
453
+ const turns = await run.conversation();
454
+ const raw = JSON.stringify(turns);
455
+ const bounded = raw.length > 8000 ? `${raw.slice(0, 8000)}…(truncated ${raw.length} chars)` : raw;
456
+ console.error(`ExecuteCursor conversation introspection: execution=${executionId}, turns=${turns.length}, raw=${bounded}`);
457
+ return extractConversationErrorText(turns);
458
+ }
459
+ catch (introspectErr) {
460
+ console.warn(`ExecuteCursor conversation introspection failed (non-fatal): execution=${executionId}, ` +
461
+ `error=${introspectErr instanceof Error ? introspectErr.message : String(introspectErr)}`);
462
+ return undefined;
463
+ }
464
+ }
465
+ /**
466
+ * Walk the last conversation turn and collect human-meaningful error text
467
+ * (error-status payloads and `text`/`message`/`reason` strings). Schema-agnostic
468
+ * by design so it tolerates SDK conversation-shape changes. Returns undefined
469
+ * when nothing useful is found.
470
+ */
471
+ function extractConversationErrorText(turns) {
472
+ if (!turns || turns.length === 0)
473
+ return undefined;
474
+ const collected = [];
475
+ const visit = (node, depth) => {
476
+ if (node == null || depth > 6 || typeof node !== "object")
477
+ return;
478
+ if (Array.isArray(node)) {
479
+ for (const item of node)
480
+ visit(item, depth + 1);
481
+ return;
482
+ }
483
+ const obj = node;
484
+ if (obj.status === "error" && obj.error != null) {
485
+ collected.push(typeof obj.error === "string" ? obj.error : JSON.stringify(obj.error));
486
+ }
487
+ for (const [key, value] of Object.entries(obj)) {
488
+ if ((key === "text" || key === "message" || key === "reason") && typeof value === "string" && value.trim().length > 0) {
489
+ collected.push(value.trim());
490
+ }
491
+ else if (typeof value === "object" && value != null) {
492
+ visit(value, depth + 1);
493
+ }
494
+ }
495
+ };
496
+ visit(turns[turns.length - 1], 0);
497
+ if (collected.length === 0)
498
+ return undefined;
499
+ const joined = [...new Set(collected)].join(" | ");
500
+ return joined.length > 600 ? `${joined.slice(0, 600)}…` : joined;
501
+ }
502
+ /** The `streaming_usage` carrier the OTel span end reads; the runtime keeps it current on every write. */
503
+ export function usageSnapshotFor(sink) {
504
+ const summary = sink.status.streamingUsage ?? create(StreamingUsageSummarySchema, {});
505
+ return { inputTokens: summary.inputTokens, outputTokens: summary.outputTokens };
506
+ }
507
+ //# sourceMappingURL=turn-settle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-settle.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/turn-settle.ts"],"names":[],"mappings":"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"}