@stigmer/runner 3.15.3-dev.20260914100347 → 3.15.3-dev.20260916211208

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 (549) hide show
  1. package/README.md +1 -0
  2. package/dist/.build-fingerprint +1 -1
  3. package/dist/__test-utils__/approval-contract/types.d.ts +1 -1
  4. package/dist/__test-utils__/hermetic-activity.d.ts +61 -7
  5. package/dist/__test-utils__/hermetic-activity.js +100 -9
  6. package/dist/__test-utils__/hermetic-activity.js.map +1 -1
  7. package/dist/__test-utils__/model-registry-fixture.d.ts +22 -3
  8. package/dist/__test-utils__/model-registry-fixture.js +22 -7
  9. package/dist/__test-utils__/model-registry-fixture.js.map +1 -1
  10. package/dist/activities/execute-cursor/__test-utils__/contract-subject.d.ts +2 -2
  11. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +14 -11
  12. package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -1
  13. package/dist/activities/execute-cursor/__test-utils__/fold.d.ts +61 -0
  14. package/dist/activities/execute-cursor/__test-utils__/fold.js +94 -0
  15. package/dist/activities/execute-cursor/__test-utils__/fold.js.map +1 -0
  16. package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js +1 -1
  17. package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js.map +1 -1
  18. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +52 -14
  19. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +46 -12
  20. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
  21. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.d.ts +21 -28
  22. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js +27 -11
  23. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js.map +1 -1
  24. package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.d.ts +70 -26
  25. package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js +82 -32
  26. package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js.map +1 -1
  27. package/dist/activities/execute-cursor/adapter.d.ts +8 -7
  28. package/dist/activities/execute-cursor/adapter.js +13 -9
  29. package/dist/activities/execute-cursor/adapter.js.map +1 -1
  30. package/dist/activities/execute-cursor/approval-policy.d.ts +10 -10
  31. package/dist/activities/execute-cursor/approval-policy.js +12 -23
  32. package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
  33. package/dist/activities/execute-cursor/approval-state.d.ts +35 -1
  34. package/dist/activities/execute-cursor/approval-state.js +65 -0
  35. package/dist/activities/execute-cursor/approval-state.js.map +1 -1
  36. package/dist/activities/execute-cursor/{message-translator.d.ts → boundary-rows.d.ts} +45 -341
  37. package/dist/activities/execute-cursor/boundary-rows.js +1018 -0
  38. package/dist/activities/execute-cursor/boundary-rows.js.map +1 -0
  39. package/dist/activities/execute-cursor/cursor-capabilities.d.ts +1 -1
  40. package/dist/activities/execute-cursor/cursor-capabilities.js +1 -1
  41. package/dist/activities/execute-cursor/cursor-event-recorder.d.ts +33 -14
  42. package/dist/activities/execute-cursor/cursor-event-recorder.js +43 -21
  43. package/dist/activities/execute-cursor/cursor-event-recorder.js.map +1 -1
  44. package/dist/activities/execute-cursor/prompt-builder.d.ts +3 -3
  45. package/dist/activities/execute-cursor/prompt-builder.js +4 -4
  46. package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
  47. package/dist/activities/execute-cursor/sdk-warmup.d.ts +15 -6
  48. package/dist/activities/execute-cursor/sdk-warmup.js +15 -6
  49. package/dist/activities/execute-cursor/sdk-warmup.js.map +1 -1
  50. package/dist/activities/execute-cursor/service-tier.js +1 -2
  51. package/dist/activities/execute-cursor/service-tier.js.map +1 -1
  52. package/dist/activities/execute-cursor/session-lifecycle.d.ts +38 -59
  53. package/dist/activities/execute-cursor/session-lifecycle.js +59 -96
  54. package/dist/activities/execute-cursor/session-lifecycle.js.map +1 -1
  55. package/dist/activities/execute-cursor/session-store.d.ts +100 -0
  56. package/dist/activities/execute-cursor/session-store.js +157 -0
  57. package/dist/activities/execute-cursor/session-store.js.map +1 -0
  58. package/dist/activities/execute-cursor/sub-agent-steps.d.ts +79 -0
  59. package/dist/activities/execute-cursor/sub-agent-steps.js +180 -0
  60. package/dist/activities/execute-cursor/sub-agent-steps.js.map +1 -0
  61. package/dist/activities/execute-cursor/tool-result.d.ts +49 -0
  62. package/dist/activities/execute-cursor/tool-result.js +130 -0
  63. package/dist/activities/execute-cursor/tool-result.js.map +1 -0
  64. package/dist/activities/execute-cursor/translator.d.ts +178 -0
  65. package/dist/activities/execute-cursor/translator.js +485 -0
  66. package/dist/activities/execute-cursor/translator.js.map +1 -0
  67. package/dist/activities/execute-cursor/turn-boundary.d.ts +15 -5
  68. package/dist/activities/execute-cursor/turn-boundary.js +10 -14
  69. package/dist/activities/execute-cursor/turn-boundary.js.map +1 -1
  70. package/dist/activities/execute-cursor/turn-settle.d.ts +11 -7
  71. package/dist/activities/execute-cursor/turn-settle.js +47 -34
  72. package/dist/activities/execute-cursor/turn-settle.js.map +1 -1
  73. package/dist/activities/execute-cursor/turn-setup.d.ts +2 -2
  74. package/dist/activities/execute-cursor/turn-setup.js +5 -5
  75. package/dist/activities/execute-cursor/turn-setup.js.map +1 -1
  76. package/dist/activities/execute-cursor/turn-stream.d.ts +23 -14
  77. package/dist/activities/execute-cursor/turn-stream.js +41 -28
  78. package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
  79. package/dist/activities/execute-cursor/turn.d.ts +4 -4
  80. package/dist/activities/execute-cursor/turn.js +5 -5
  81. package/dist/activities/execute-cursor/usage-pricing.d.ts +2 -2
  82. package/dist/activities/execute-cursor/usage-pricing.js +2 -2
  83. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.d.ts +2 -2
  84. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js +2 -2
  85. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +16 -11
  86. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +22 -10
  87. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -1
  88. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js +1 -1
  89. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js.map +1 -1
  90. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.d.ts +2 -3
  91. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js +2 -3
  92. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js.map +1 -1
  93. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +12 -3
  94. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +18 -4
  95. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
  96. package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.d.ts +10 -1
  97. package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js +24 -11
  98. package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js.map +1 -1
  99. package/dist/activities/execute-deep-agent/adapter.d.ts +1 -1
  100. package/dist/activities/execute-deep-agent/adapter.js +1 -1
  101. package/dist/activities/execute-deep-agent/approval-file-change.d.ts +19 -19
  102. package/dist/activities/execute-deep-agent/approval-file-change.js +16 -15
  103. package/dist/activities/execute-deep-agent/approval-file-change.js.map +1 -1
  104. package/dist/activities/execute-deep-agent/deep-agent-capabilities.d.ts +2 -2
  105. package/dist/activities/execute-deep-agent/deep-agent-capabilities.js +2 -2
  106. package/dist/activities/execute-deep-agent/hitl.d.ts +2 -2
  107. package/dist/activities/execute-deep-agent/hitl.js +2 -2
  108. package/dist/activities/execute-deep-agent/inline-publisher.d.ts +13 -3
  109. package/dist/activities/execute-deep-agent/inline-publisher.js +3 -3
  110. package/dist/activities/execute-deep-agent/inline-publisher.js.map +1 -1
  111. package/dist/activities/execute-deep-agent/prompt-builder.d.ts +3 -3
  112. package/dist/activities/execute-deep-agent/prompt-builder.js +6 -7
  113. package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
  114. package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +16 -8
  115. package/dist/activities/execute-deep-agent/streaming-side-effects.js +20 -33
  116. package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
  117. package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +3 -3
  118. package/dist/activities/execute-deep-agent/subagent-transformer.js +1 -1
  119. package/dist/activities/execute-deep-agent/translator.d.ts +134 -0
  120. package/dist/activities/execute-deep-agent/translator.js +418 -0
  121. package/dist/activities/execute-deep-agent/translator.js.map +1 -0
  122. package/dist/activities/execute-deep-agent/turn-settle.d.ts +13 -7
  123. package/dist/activities/execute-deep-agent/turn-settle.js +34 -45
  124. package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -1
  125. package/dist/activities/execute-deep-agent/turn-setup.d.ts +8 -8
  126. package/dist/activities/execute-deep-agent/turn-setup.js +7 -7
  127. package/dist/activities/execute-deep-agent/turn-stream.d.ts +13 -10
  128. package/dist/activities/execute-deep-agent/turn-stream.js +44 -41
  129. package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -1
  130. package/dist/activities/execute-deep-agent/turn.d.ts +3 -3
  131. package/dist/activities/execute-deep-agent/turn.js +3 -3
  132. package/dist/config.d.ts +2 -2
  133. package/dist/harness/approval-decisions.d.ts +1 -1
  134. package/dist/harness/approval-decisions.js +1 -1
  135. package/dist/harness/capabilities.d.ts +21 -11
  136. package/dist/harness/capabilities.js +2 -2
  137. package/dist/harness/capture.d.ts +4 -4
  138. package/dist/harness/capture.js +4 -4
  139. package/dist/harness/persist-chokepoint.d.ts +3 -3
  140. package/dist/harness/persist-chokepoint.js +3 -3
  141. package/dist/harness/registry.d.ts +2 -2
  142. package/dist/harness/registry.js +2 -2
  143. package/dist/harness/run-turn.d.ts +6 -4
  144. package/dist/harness/run-turn.js +31 -9
  145. package/dist/harness/run-turn.js.map +1 -1
  146. package/dist/harness/stop-controller.d.ts +1 -1
  147. package/dist/harness/stop-controller.js +1 -1
  148. package/dist/harness/terminal-table.d.ts +7 -7
  149. package/dist/harness/terminal-table.js +7 -7
  150. package/dist/harness/transcript/builder.d.ts +182 -0
  151. package/dist/harness/transcript/builder.js +693 -0
  152. package/dist/harness/transcript/builder.js.map +1 -0
  153. package/dist/harness/transcript/events.d.ts +218 -0
  154. package/dist/harness/transcript/events.js +50 -0
  155. package/dist/harness/transcript/events.js.map +1 -0
  156. package/dist/harness/transcript/state.d.ts +110 -0
  157. package/dist/harness/transcript/state.js +148 -0
  158. package/dist/harness/transcript/state.js.map +1 -0
  159. package/dist/harness/turn-context.d.ts +54 -38
  160. package/dist/harness/turn-context.js +42 -43
  161. package/dist/harness/turn-context.js.map +1 -1
  162. package/dist/harness/types.d.ts +63 -22
  163. package/dist/harness/types.js +12 -11
  164. package/dist/harness/types.js.map +1 -1
  165. package/dist/harness/usage-accumulator.d.ts +2 -2
  166. package/dist/harness/usage-accumulator.js +2 -2
  167. package/dist/harness-adapters.d.ts +5 -4
  168. package/dist/harness-adapters.js +5 -4
  169. package/dist/harness-adapters.js.map +1 -1
  170. package/dist/middleware/approval-gate.d.ts +6 -0
  171. package/dist/middleware/approval-gate.js +7 -57
  172. package/dist/middleware/approval-gate.js.map +1 -1
  173. package/dist/middleware/cost-advisory.d.ts +3 -3
  174. package/dist/middleware/cost-advisory.js +3 -3
  175. package/dist/middleware/index.d.ts +1 -1
  176. package/dist/middleware/index.js +1 -1
  177. package/dist/runner-manager.js +1 -1
  178. package/dist/runner-manager.js.map +1 -1
  179. package/dist/shared/approval-policy.d.ts +53 -0
  180. package/dist/shared/approval-policy.js +76 -0
  181. package/dist/shared/approval-policy.js.map +1 -1
  182. package/dist/shared/args-preview.d.ts +45 -22
  183. package/dist/shared/args-preview.js +51 -41
  184. package/dist/shared/args-preview.js.map +1 -1
  185. package/dist/shared/attachment-resolver.d.ts +4 -4
  186. package/dist/shared/attachment-resolver.js +4 -4
  187. package/dist/shared/attachment-vision.d.ts +2 -1
  188. package/dist/shared/attachment-vision.js.map +1 -1
  189. package/dist/shared/attachment-zip.d.ts +2 -2
  190. package/dist/shared/attachment-zip.js +2 -2
  191. package/dist/shared/cost-guard.d.ts +2 -2
  192. package/dist/shared/cost-guard.js +2 -2
  193. package/dist/shared/exact-apply.d.ts +1 -1
  194. package/dist/shared/exact-apply.js +1 -1
  195. package/dist/shared/execution-context.d.ts +2 -2
  196. package/dist/shared/execution-context.js +2 -2
  197. package/dist/shared/extract-structured-output.d.ts +2 -2
  198. package/dist/shared/extract-structured-output.js +2 -2
  199. package/dist/shared/filereview/cas-touched.d.ts +2 -2
  200. package/dist/shared/filereview/cas-touched.js +2 -2
  201. package/dist/shared/heartbeat.d.ts +1 -1
  202. package/dist/shared/heartbeat.js +1 -1
  203. package/dist/shared/llm-backend.d.ts +0 -4
  204. package/dist/shared/llm-backend.js +0 -4
  205. package/dist/shared/llm-backend.js.map +1 -1
  206. package/dist/shared/model-error.d.ts +1 -2
  207. package/dist/shared/model-error.js +1 -2
  208. package/dist/shared/model-error.js.map +1 -1
  209. package/dist/shared/persist-decision.d.ts +18 -24
  210. package/dist/shared/persist-decision.js +19 -11
  211. package/dist/shared/persist-decision.js.map +1 -1
  212. package/dist/shared/prompt-sections.d.ts +4 -4
  213. package/dist/shared/prompt-sections.js +4 -4
  214. package/dist/shared/skill-resolver.d.ts +3 -3
  215. package/dist/shared/skill-resolver.js +3 -3
  216. package/dist/shared/status-offload.d.ts +1 -1
  217. package/dist/shared/status-offload.js +2 -2
  218. package/dist/shared/status-offload.js.map +1 -1
  219. package/dist/shared/streaming-scheduler.d.ts +2 -7
  220. package/dist/shared/streaming-scheduler.js +6 -14
  221. package/dist/shared/streaming-scheduler.js.map +1 -1
  222. package/dist/shared/subagent-rows.d.ts +2 -2
  223. package/dist/shared/subagent-rows.js +2 -2
  224. package/dist/shared/todos.d.ts +3 -3
  225. package/dist/shared/todos.js +3 -3
  226. package/dist/shared/tool-row.d.ts +19 -1
  227. package/dist/shared/tool-row.js +36 -2
  228. package/dist/shared/tool-row.js.map +1 -1
  229. package/dist/shared/worker-shutdown.d.ts +1 -1
  230. package/dist/shared/worker-shutdown.js +1 -1
  231. package/dist/shared/workspace/session-provision.d.ts +1 -1
  232. package/dist/shared/workspace/session-provision.js +1 -1
  233. package/dist/shared/workspace/sources/empty.d.ts +1 -1
  234. package/dist/shared/workspace/sources/empty.js +1 -2
  235. package/dist/shared/workspace/sources/empty.js.map +1 -1
  236. package/dist/shared/workspace/sources/git.js +4 -4
  237. package/dist/shared/workspace/sources/git.js.map +1 -1
  238. package/dist/shared/workspace/sources/local-path.js +6 -6
  239. package/dist/shared/workspace/sources/local-path.js.map +1 -1
  240. package/dist/shared/workspace/stigmer-link.d.ts +1 -1
  241. package/dist/shared/workspace/stigmer-link.js +1 -1
  242. package/dist/shared/workspace/types.d.ts +2 -5
  243. package/dist/shared/workspace/types.js +0 -6
  244. package/dist/shared/workspace/types.js.map +1 -1
  245. package/dist/shared/workspace/writeback-coordinator.d.ts +17 -4
  246. package/dist/shared/workspace/writeback-coordinator.js +7 -9
  247. package/dist/shared/workspace/writeback-coordinator.js.map +1 -1
  248. package/package.json +5 -5
  249. package/src/__test-utils__/__tests__/execution-record-barrier.test.ts +70 -0
  250. package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +35 -1
  251. package/src/__test-utils__/approval-contract/contract.ts +1 -1
  252. package/src/__test-utils__/approval-contract/types.ts +1 -1
  253. package/src/__test-utils__/harness-boot-order-child.ts +1 -1
  254. package/src/__test-utils__/harness-contract/contract.ts +8 -8
  255. package/src/__test-utils__/harness-contract/recording-sink.ts +11 -1
  256. package/src/__test-utils__/harness-contract/runtime-contract.ts +52 -16
  257. package/src/__test-utils__/harness-contract/scripted-adapter.ts +47 -43
  258. package/src/__test-utils__/hermetic-activity.ts +113 -9
  259. package/src/__test-utils__/model-registry-fixture.ts +31 -7
  260. package/src/__test-utils__/module-specifiers.ts +32 -3
  261. package/src/__tests__/harness-boot-order.test.ts +1 -1
  262. package/src/__tests__/harness-contract.test.ts +1 -1
  263. package/src/__tests__/runner-manager.test.ts +1 -1
  264. package/src/activities/execute-cursor/__test-utils__/__tests__/scripted-double.test.ts +32 -8
  265. package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +12 -10
  266. package/src/activities/execute-cursor/__test-utils__/fold.ts +116 -0
  267. package/src/activities/execute-cursor/__test-utils__/gateway-substrate.ts +1 -1
  268. package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +72 -19
  269. package/src/activities/execute-cursor/__test-utils__/scripted-agent.ts +35 -29
  270. package/src/activities/execute-cursor/__test-utils__/scripted-sdk.ts +94 -38
  271. package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +2 -1
  272. package/src/activities/execute-cursor/__tests__/approval-state.test.ts +14 -21
  273. package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +3 -3
  274. package/src/activities/execute-cursor/__tests__/coarse-fingerprint.test.ts +2 -1
  275. package/src/activities/execute-cursor/__tests__/cursor-baseurl-routing.test.ts +10 -8
  276. package/src/activities/execute-cursor/__tests__/cursor-event-recorder.test.ts +142 -0
  277. package/src/activities/execute-cursor/__tests__/cursor-fetch-interceptor-bypass.test.ts +24 -12
  278. package/src/activities/execute-cursor/__tests__/cursor-generate-image-live.test.ts +7 -2
  279. package/src/activities/execute-cursor/__tests__/cursor-hook-protocol-live.test.ts +163 -0
  280. package/src/activities/execute-cursor/__tests__/cursor-sdk-auth-smoke.test.ts +23 -20
  281. package/src/activities/execute-cursor/__tests__/cursor-transcript-live.test.ts +298 -0
  282. package/src/activities/execute-cursor/__tests__/deny-gate-exact-apply.test.ts +4 -2
  283. package/src/activities/execute-cursor/__tests__/fetch-interceptor.test.ts +1 -1
  284. package/src/activities/execute-cursor/__tests__/hermetic/deny-and-retry.test.ts +5 -2
  285. package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +5 -2
  286. package/src/activities/execute-cursor/__tests__/hermetic/goldens/mcp-tool-call.status.json +71 -0
  287. package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-task-note.status.json +73 -0
  288. package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.error-delta.status.json +78 -0
  289. package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.output-first.status.json +72 -0
  290. package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.status.json +72 -0
  291. package/src/activities/execute-cursor/__tests__/hermetic/goldens/sub-agent-delegation.status.json +109 -0
  292. package/src/activities/execute-cursor/__tests__/hermetic/goldens/thinking-turn.status.json +78 -0
  293. package/src/activities/execute-cursor/__tests__/hermetic/goldens/todo-write.status.json +119 -0
  294. package/src/activities/execute-cursor/__tests__/hermetic/goldens/tool-error.status.json +68 -0
  295. package/src/activities/execute-cursor/__tests__/hermetic/goldens/tool-only-step.status.json +67 -0
  296. package/src/activities/execute-cursor/__tests__/hermetic/goldens/unattributed-hook-block.status.json +1 -1
  297. package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +10 -7
  298. package/src/activities/execute-cursor/__tests__/hermetic/mcp-tool-call.test.ts +146 -0
  299. package/src/activities/execute-cursor/__tests__/hermetic/pause-vs-shutdown.test.ts +8 -5
  300. package/src/activities/execute-cursor/__tests__/hermetic/plain-turn.test.ts +6 -2
  301. package/src/activities/execute-cursor/__tests__/hermetic/recovery-fresh-agent.test.ts +4 -1
  302. package/src/activities/execute-cursor/__tests__/hermetic/run-wait-arms.test.ts +6 -2
  303. package/src/activities/execute-cursor/__tests__/hermetic/sdk-task-note.test.ts +122 -0
  304. package/src/activities/execute-cursor/__tests__/hermetic/shell-output-delta.test.ts +276 -0
  305. package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +12 -9
  306. package/src/activities/execute-cursor/__tests__/hermetic/sub-agent-delegation.test.ts +196 -0
  307. package/src/activities/execute-cursor/__tests__/hermetic/thinking-turn.test.ts +145 -0
  308. package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +4 -1
  309. package/src/activities/execute-cursor/__tests__/hermetic/todo-write.test.ts +165 -0
  310. package/src/activities/execute-cursor/__tests__/hermetic/tool-call.test.ts +7 -4
  311. package/src/activities/execute-cursor/__tests__/hermetic/tool-error.test.ts +138 -0
  312. package/src/activities/execute-cursor/__tests__/hermetic/tool-only-step.test.ts +130 -0
  313. package/src/activities/execute-cursor/__tests__/hermetic/unattributed-hook-block.test.ts +17 -2
  314. package/src/activities/execute-cursor/__tests__/hermetic/workspace-lock-timeout.test.ts +5 -2
  315. package/src/activities/execute-cursor/__tests__/hitl-ledger.test.ts +43 -60
  316. package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +23 -28
  317. package/src/activities/execute-cursor/__tests__/hook-script.test.ts +2 -1
  318. package/src/activities/execute-cursor/__tests__/http2-interceptor.test.ts +1 -1
  319. package/src/activities/execute-cursor/__tests__/prompt-goldens.test.ts +5 -5
  320. package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +11 -13
  321. package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +8 -11
  322. package/src/activities/execute-cursor/__tests__/session-lifecycle.test.ts +86 -58
  323. package/src/activities/execute-cursor/__tests__/session-store.test.ts +220 -0
  324. package/src/activities/execute-cursor/__tests__/tool-result-image.test.ts +8 -22
  325. package/src/activities/execute-cursor/__tests__/translator.test.ts +594 -0
  326. package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +8 -5
  327. package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +87 -63
  328. package/src/activities/execute-cursor/adapter.ts +13 -9
  329. package/src/activities/execute-cursor/approval-policy.ts +12 -24
  330. package/src/activities/execute-cursor/approval-state.ts +66 -1
  331. package/src/activities/execute-cursor/boundary-rows.ts +1132 -0
  332. package/src/activities/execute-cursor/cursor-capabilities.ts +1 -1
  333. package/src/activities/execute-cursor/cursor-event-recorder.ts +57 -28
  334. package/src/activities/execute-cursor/fetch-interceptor.ts +1 -1
  335. package/src/activities/execute-cursor/http2-interceptor.ts +1 -1
  336. package/src/activities/execute-cursor/prompt-builder.ts +6 -6
  337. package/src/activities/execute-cursor/sdk-warmup.ts +15 -6
  338. package/src/activities/execute-cursor/service-tier.ts +1 -2
  339. package/src/activities/execute-cursor/session-lifecycle.ts +63 -109
  340. package/src/activities/execute-cursor/session-store.ts +187 -0
  341. package/src/activities/execute-cursor/sub-agent-steps.ts +188 -0
  342. package/src/activities/execute-cursor/tool-result.ts +128 -0
  343. package/src/activities/execute-cursor/translator.ts +541 -0
  344. package/src/activities/execute-cursor/turn-boundary.ts +21 -14
  345. package/src/activities/execute-cursor/turn-settle.ts +46 -34
  346. package/src/activities/execute-cursor/turn-setup.ts +5 -5
  347. package/src/activities/execute-cursor/turn-stream.ts +49 -46
  348. package/src/activities/execute-cursor/turn.ts +5 -5
  349. package/src/activities/execute-cursor/usage-pricing.ts +2 -2
  350. package/src/activities/execute-deep-agent/__test-utils__/contract-subject.ts +2 -2
  351. package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +23 -11
  352. package/src/activities/execute-deep-agent/__test-utils__/hitl-script.ts +1 -1
  353. package/src/activities/execute-deep-agent/__test-utils__/scripted-model-module.ts +2 -3
  354. package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +25 -4
  355. package/src/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.ts +25 -11
  356. package/src/activities/execute-deep-agent/__tests__/adapter-graph-is-sdk-free.test.ts +1 -1
  357. package/src/activities/execute-deep-agent/__tests__/adapter-is-temporal-free.test.ts +1 -1
  358. package/src/activities/execute-deep-agent/__tests__/approval-file-change.test.ts +6 -17
  359. package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +25 -8
  360. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn1.status.json +2 -7
  361. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn2.status.json +4 -14
  362. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve.turn2.status.json +1 -5
  363. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +4 -7
  364. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/gate.turn1.status.json +1 -5
  365. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +2 -9
  366. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +2 -9
  367. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.after-tool.status.json +1 -4
  368. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.mid-tool.status.json +1 -4
  369. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/platform-stop.status.json +1 -4
  370. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +109 -76
  371. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/reject.turn2.status.json +1 -5
  372. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn2.status.json +2 -10
  373. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn3.status.json +2 -10
  374. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/skip.turn2.status.json +1 -5
  375. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sub-agent-delegation.status.json +3 -6
  376. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/tool-call.status.json +1 -4
  377. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/worker-shutdown.status.json +1 -4
  378. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/write-todos.status.json +92 -0
  379. package/src/activities/execute-deep-agent/__tests__/hermetic/harness-contract.test.ts +3 -3
  380. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-approve-all-lease.test.ts +9 -5
  381. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-round-trips.test.ts +3 -3
  382. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-sequential-gates.test.ts +3 -3
  383. package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +7 -6
  384. package/src/activities/execute-deep-agent/__tests__/hermetic/pause-vs-shutdown.test.ts +10 -11
  385. package/src/activities/execute-deep-agent/__tests__/hermetic/plain-turn.test.ts +4 -4
  386. package/src/activities/execute-deep-agent/__tests__/hermetic/platform-stop.test.ts +9 -8
  387. package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +21 -13
  388. package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +2 -2
  389. package/src/activities/execute-deep-agent/__tests__/hermetic/structured-output.test.ts +7 -7
  390. package/src/activities/execute-deep-agent/__tests__/hermetic/sub-agent-delegation.test.ts +28 -12
  391. package/src/activities/execute-deep-agent/__tests__/hermetic/tool-call.test.ts +21 -21
  392. package/src/activities/execute-deep-agent/__tests__/hermetic/workspace-lock-timeout.test.ts +5 -5
  393. package/src/activities/execute-deep-agent/__tests__/hermetic/write-todos.test.ts +160 -0
  394. package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +35 -30
  395. package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +3 -4
  396. package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +12 -10
  397. package/src/activities/execute-deep-agent/__tests__/scripted-model.test.ts +13 -3
  398. package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +26 -18
  399. package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +1 -1
  400. package/src/activities/execute-deep-agent/__tests__/{subagent-tracker.test.ts → translator-subagents.test.ts} +76 -57
  401. package/src/activities/execute-deep-agent/__tests__/{v3-status-builder.test.ts → translator-through-builder.test.ts} +213 -299
  402. package/src/activities/execute-deep-agent/__tests__/translator.test.ts +505 -0
  403. package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +11 -29
  404. package/src/activities/execute-deep-agent/adapter.ts +1 -1
  405. package/src/activities/execute-deep-agent/approval-file-change.ts +20 -22
  406. package/src/activities/execute-deep-agent/deep-agent-capabilities.ts +2 -2
  407. package/src/activities/execute-deep-agent/hitl.ts +2 -2
  408. package/src/activities/execute-deep-agent/inline-publisher.ts +16 -5
  409. package/src/activities/execute-deep-agent/prompt-builder.ts +6 -7
  410. package/src/activities/execute-deep-agent/streaming-side-effects.ts +22 -31
  411. package/src/activities/execute-deep-agent/subagent-transformer.ts +3 -3
  412. package/src/activities/execute-deep-agent/translator.ts +463 -0
  413. package/src/activities/execute-deep-agent/turn-settle.ts +35 -43
  414. package/src/activities/execute-deep-agent/turn-setup.ts +8 -8
  415. package/src/activities/execute-deep-agent/turn-stream.ts +53 -51
  416. package/src/activities/execute-deep-agent/turn.ts +3 -3
  417. package/src/config.ts +2 -2
  418. package/src/harness/README.md +335 -0
  419. package/src/harness/__tests__/approval-decisions.test.ts +2 -2
  420. package/src/harness/__tests__/capture.test.ts +3 -3
  421. package/src/harness/__tests__/import-direction.test.ts +3 -2
  422. package/src/harness/__tests__/mount-skills.test.ts +4 -1
  423. package/src/harness/__tests__/readme-index.test.ts +339 -0
  424. package/src/harness/__tests__/run-turn.test.ts +131 -6
  425. package/src/harness/__tests__/transcript-is-engine-free.test.ts +83 -0
  426. package/src/harness/__tests__/transcript-writers.test.ts +191 -0
  427. package/src/harness/__tests__/turn-attachments-vision.test.ts +5 -2
  428. package/src/harness/__tests__/turn-context.test.ts +5 -5
  429. package/src/harness/approval-decisions.ts +1 -1
  430. package/src/harness/capabilities.ts +21 -11
  431. package/src/harness/capture.ts +4 -4
  432. package/src/harness/persist-chokepoint.ts +3 -3
  433. package/src/harness/registry.ts +2 -2
  434. package/src/harness/run-turn.ts +33 -9
  435. package/src/harness/stop-controller.ts +1 -1
  436. package/src/harness/terminal-table.ts +7 -7
  437. package/src/harness/transcript/__tests__/builder.test.ts +975 -0
  438. package/src/harness/transcript/__tests__/state.test.ts +143 -0
  439. package/src/harness/transcript/builder.ts +755 -0
  440. package/src/harness/transcript/events.ts +262 -0
  441. package/src/harness/transcript/state.ts +167 -0
  442. package/src/harness/turn-context.ts +61 -46
  443. package/src/harness/types.ts +64 -22
  444. package/src/harness/usage-accumulator.ts +2 -2
  445. package/src/harness-adapters.ts +5 -4
  446. package/src/middleware/__tests__/cost-advisory.test.ts +2 -2
  447. package/src/middleware/approval-gate.ts +7 -74
  448. package/src/middleware/cost-advisory.ts +3 -3
  449. package/src/middleware/index.ts +1 -1
  450. package/src/runner-manager.ts +1 -1
  451. package/src/shared/__tests__/approval-policy.test.ts +45 -0
  452. package/src/shared/__tests__/args-preview.test.ts +40 -20
  453. package/src/shared/__tests__/attachment-naming.test.ts +1 -1
  454. package/src/shared/__tests__/attachment-resolver.test.ts +5 -5
  455. package/src/shared/__tests__/attachment-zip.test.ts +1 -1
  456. package/src/shared/__tests__/blueprint-resolver.test.ts +1 -1
  457. package/src/shared/__tests__/cost-guard.test.ts +1 -1
  458. package/src/shared/__tests__/exact-apply.test.ts +2 -1
  459. package/src/shared/__tests__/persist-decision.test.ts +19 -33
  460. package/src/shared/__tests__/prompt-sections.test.ts +1 -1
  461. package/src/shared/__tests__/stamp-flowed-rows.test.ts +1 -1
  462. package/src/shared/__tests__/status-offload.test.ts +1 -1
  463. package/src/shared/__tests__/streaming-scheduler.test.ts +8 -9
  464. package/src/shared/__tests__/todos.test.ts +1 -1
  465. package/src/shared/__tests__/tool-row.test.ts +1 -1
  466. package/src/shared/approval-policy.ts +95 -0
  467. package/src/shared/args-preview.ts +51 -42
  468. package/src/shared/attachment-resolver.ts +4 -4
  469. package/src/shared/attachment-vision.ts +2 -1
  470. package/src/shared/attachment-zip.ts +2 -2
  471. package/src/shared/cost-guard.ts +2 -2
  472. package/src/shared/exact-apply.ts +1 -1
  473. package/src/shared/execution-context.ts +2 -2
  474. package/src/shared/extract-structured-output.ts +2 -2
  475. package/src/shared/filereview/__tests__/capture.test.ts +9 -5
  476. package/src/shared/filereview/__tests__/git-substrate.test.ts +4 -1
  477. package/src/shared/filereview/__tests__/proxy-reconcile.test.ts +3 -3
  478. package/src/shared/filereview/cas-touched.ts +2 -2
  479. package/src/shared/heartbeat.ts +1 -1
  480. package/src/shared/llm-backend.ts +0 -4
  481. package/src/shared/model-error.ts +1 -2
  482. package/src/shared/persist-decision.ts +19 -28
  483. package/src/shared/prompt-sections.ts +4 -4
  484. package/src/shared/skill-resolver.ts +3 -3
  485. package/src/shared/status-offload.ts +2 -2
  486. package/src/shared/streaming-scheduler.ts +8 -13
  487. package/src/shared/subagent-rows.ts +2 -2
  488. package/src/shared/todos.ts +3 -3
  489. package/src/shared/tool-row.ts +38 -2
  490. package/src/shared/worker-shutdown.ts +1 -1
  491. package/src/shared/workspace/__tests__/git-source.test.ts +3 -3
  492. package/src/shared/workspace/__tests__/provisioner.test.ts +5 -5
  493. package/src/shared/workspace/__tests__/session-provision.test.ts +2 -2
  494. package/src/shared/workspace/__tests__/writeback-coordinator.integration.test.ts +8 -9
  495. package/src/shared/workspace/__tests__/writeback-coordinator.test.ts +25 -25
  496. package/src/shared/workspace/provisioner.ts +1 -1
  497. package/src/shared/workspace/session-provision.ts +1 -1
  498. package/src/shared/workspace/sources/empty.ts +2 -2
  499. package/src/shared/workspace/sources/git.ts +3 -4
  500. package/src/shared/workspace/sources/local-path.ts +5 -6
  501. package/src/shared/workspace/stigmer-link.ts +1 -1
  502. package/src/shared/workspace/types.ts +2 -5
  503. package/src/shared/workspace/writeback-coordinator.ts +23 -12
  504. package/dist/activities/execute-cursor/delta-enricher.d.ts +0 -87
  505. package/dist/activities/execute-cursor/delta-enricher.js +0 -265
  506. package/dist/activities/execute-cursor/delta-enricher.js.map +0 -1
  507. package/dist/activities/execute-cursor/message-translator.js +0 -2040
  508. package/dist/activities/execute-cursor/message-translator.js.map +0 -1
  509. package/dist/activities/execute-cursor/todo-tracker.d.ts +0 -40
  510. package/dist/activities/execute-cursor/todo-tracker.js +0 -80
  511. package/dist/activities/execute-cursor/todo-tracker.js.map +0 -1
  512. package/dist/activities/execute-deep-agent/execution-state.d.ts +0 -54
  513. package/dist/activities/execute-deep-agent/execution-state.js +0 -68
  514. package/dist/activities/execute-deep-agent/execution-state.js.map +0 -1
  515. package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +0 -65
  516. package/dist/activities/execute-deep-agent/status-builder-shared.js +0 -90
  517. package/dist/activities/execute-deep-agent/status-builder-shared.js.map +0 -1
  518. package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +0 -113
  519. package/dist/activities/execute-deep-agent/subagent-tracker.js +0 -400
  520. package/dist/activities/execute-deep-agent/subagent-tracker.js.map +0 -1
  521. package/dist/activities/execute-deep-agent/v3-events.d.ts +0 -102
  522. package/dist/activities/execute-deep-agent/v3-events.js +0 -35
  523. package/dist/activities/execute-deep-agent/v3-events.js.map +0 -1
  524. package/dist/activities/execute-deep-agent/v3-protocol-normalizer.d.ts +0 -15
  525. package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js +0 -235
  526. package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js.map +0 -1
  527. package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +0 -111
  528. package/dist/activities/execute-deep-agent/v3-status-builder.js +0 -457
  529. package/dist/activities/execute-deep-agent/v3-status-builder.js.map +0 -1
  530. package/dist/shared/execution-status-writer.d.ts +0 -31
  531. package/dist/shared/execution-status-writer.js +0 -43
  532. package/dist/shared/execution-status-writer.js.map +0 -1
  533. package/src/activities/execute-cursor/__tests__/delta-enricher.test.ts +0 -310
  534. package/src/activities/execute-cursor/__tests__/message-translator.test.ts +0 -1033
  535. package/src/activities/execute-cursor/__tests__/todo-tracker.test.ts +0 -498
  536. package/src/activities/execute-cursor/delta-enricher.ts +0 -307
  537. package/src/activities/execute-cursor/message-translator.ts +0 -2319
  538. package/src/activities/execute-cursor/todo-tracker.ts +0 -91
  539. package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +0 -148
  540. package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +0 -154
  541. package/src/activities/execute-deep-agent/__tests__/status-builder-shared.test.ts +0 -47
  542. package/src/activities/execute-deep-agent/__tests__/v3-protocol-normalizer.test.ts +0 -324
  543. package/src/activities/execute-deep-agent/execution-state.ts +0 -78
  544. package/src/activities/execute-deep-agent/status-builder-shared.ts +0 -142
  545. package/src/activities/execute-deep-agent/subagent-tracker.ts +0 -479
  546. package/src/activities/execute-deep-agent/v3-events.ts +0 -153
  547. package/src/activities/execute-deep-agent/v3-protocol-normalizer.ts +0 -264
  548. package/src/activities/execute-deep-agent/v3-status-builder.ts +0 -565
  549. package/src/shared/execution-status-writer.ts +0 -56
@@ -18,7 +18,7 @@
18
18
  * - File review under the `cursor` harness id, with the two files the gate
19
19
  * writes into the repo excluded from the mid-run progress diff
20
20
  * ({@link CURSOR_RUNNER_OWNED_PATHS}). The capture itself is the runtime's
21
- * (`harness/capture.ts`, S3 M4); this adapter contributes only the hook
21
+ * (`harness/capture.ts`, since #1096); this adapter contributes only the hook
22
22
  * sidecar it binds as the runtime's CAS observations (`turn-setup.ts`).
23
23
  */
24
24
 
@@ -1,57 +1,91 @@
1
1
  /**
2
- * Cursor SDK event recorder for capturing raw SDKMessage events.
2
+ * The raw recording of the Cursor translator's input — both SDK channels, in
3
+ * arrival order — for checking the translator against what the real SDK sends.
3
4
  *
4
- * Activated by the CURSOR_EVENT_RECORD_DIR environment variable. When set,
5
- * the Cursor streaming loop records every SDKMessage and flushes them
6
- * atomically to a JSONL file after the stream completes.
5
+ * Off unless `CURSOR_EVENT_RECORD_DIR` is set: `turn-settle.ts` reads the env
6
+ * once per turn and hands the directory in, so this module touches no process
7
+ * state and its tests need no env. When off, {@link createCursorEventRecorder}
8
+ * returns undefined and the loop's `recorder?.record(...)` costs nothing.
7
9
  *
8
- * This is development infrastructure for validating the agent_id-based
9
- * sub-agent routing hypothesis. The captured events reveal whether
10
- * sub-agent events carry distinct agent_id values and whether they
11
- * flow through the parent's run.stream() at all.
10
+ * Two channels, one sequence. The Cursor SDK hands the runner a turn on two
11
+ * channels: the discrete `run.stream()` `SDKMessage`s (message boundaries, tool
12
+ * calls, the result) and the fine-grained `onDelta` `InteractionUpdate`s (text
13
+ * and thinking tokens, live shell output, tool-call completion instants,
14
+ * usage). The translator (`translator.ts`) reads both, and the questions a
15
+ * recording exists to answer — what shape `shell-output-delta` carries, whether
16
+ * `tool-call-completed` arrives before or after the stream's own completed
17
+ * `tool_call` — are questions about the ORDER across channels. So the recorder
18
+ * owns one monotonic `seq` and stamps every line with its `channel`; a reader
19
+ * sorts nothing, it reads the file top to bottom. Until #1097's live-run gate
20
+ * this module recorded the stream channel alone, under the loop's own
21
+ * event counter, which could not place a delta relative to a stream event.
12
22
  *
13
- * Mirrors the native harness's v3-event-recorder.ts / V3_EVENT_RECORD_DIR.
23
+ * Output: `<dir>/<executionId>.cursor-events.jsonl`, one JSON object per line,
24
+ * flushed once after the stream completes (`turn-settle.ts`). Payloads pass
25
+ * through {@link safeClone} so a cyclic event cannot fail the flush. The native
26
+ * harness's `v3-event-recorder.ts` is the same idea for its one channel.
14
27
  */
15
28
 
16
29
  import { writeFile, mkdir } from "node:fs/promises";
17
30
  import { join } from "node:path";
18
- import type { SDKMessage } from "@cursor/sdk";
31
+ import type { InteractionUpdate, SDKMessage } from "@cursor/sdk";
32
+
33
+ /** Which of the SDK's two channels a recorded line came from. */
34
+ export type CursorRecordedChannel = "stream" | "delta";
19
35
 
20
36
  export interface CursorEventRecorder {
21
- record(event: SDKMessage, seq: number): void;
37
+ /** A discrete `run.stream()` event, sequenced with the deltas around it. */
38
+ record(event: SDKMessage): void;
39
+ /** An `onDelta` update, sequenced with the stream events around it. */
40
+ recordDelta(update: InteractionUpdate): void;
41
+ /** Write every recorded line, once. A no-op when nothing was recorded. */
22
42
  flush(): Promise<void>;
23
43
  }
24
44
 
25
45
  /**
26
- * Create a recorder if CURSOR_EVENT_RECORD_DIR is set, otherwise undefined.
27
- * The caller does `recorder?.record(event, seq)` — zero overhead when off.
46
+ * Create a recorder for `recordDir`, or undefined when there is none (the
47
+ * env var unset or empty) — the caller does `recorder?.record(event)`.
28
48
  */
29
49
  export function createCursorEventRecorder(
30
50
  executionId: string,
51
+ recordDir: string | undefined,
31
52
  ): CursorEventRecorder | undefined {
32
- const recordDir = process.env.CURSOR_EVENT_RECORD_DIR;
33
53
  if (!recordDir) return undefined;
34
54
  return new FileCursorEventRecorder(executionId, recordDir);
35
55
  }
36
56
 
37
57
  class FileCursorEventRecorder implements CursorEventRecorder {
38
58
  private readonly lines: string[] = [];
59
+ /** The one arrival counter both channels share (the header's reason). */
60
+ private seq = 0;
39
61
 
40
62
  constructor(
41
63
  private readonly executionId: string,
42
64
  private readonly outputDir: string,
43
65
  ) {}
44
66
 
45
- record(event: SDKMessage, seq: number): void {
46
- const entry = {
47
- seq,
48
- capturedAt: new Date().toISOString(),
49
- type: event.type,
67
+ record(event: SDKMessage): void {
68
+ this.append("stream", event.type, {
50
69
  agent_id: event.agent_id,
51
70
  run_id: event.run_id,
52
71
  event: safeClone(event),
53
- };
54
- this.lines.push(JSON.stringify(entry));
72
+ });
73
+ }
74
+
75
+ recordDelta(update: InteractionUpdate): void {
76
+ this.append("delta", update.type, { update: safeClone(update) });
77
+ }
78
+
79
+ private append(channel: CursorRecordedChannel, type: string, payload: Record<string, unknown>): void {
80
+ this.lines.push(
81
+ JSON.stringify({
82
+ seq: this.seq++,
83
+ capturedAt: new Date().toISOString(),
84
+ channel,
85
+ type,
86
+ ...payload,
87
+ }),
88
+ );
55
89
  }
56
90
 
57
91
  async flush(): Promise<void> {
@@ -59,15 +93,10 @@ class FileCursorEventRecorder implements CursorEventRecorder {
59
93
 
60
94
  await mkdir(this.outputDir, { recursive: true });
61
95
 
62
- const filePath = join(
63
- this.outputDir,
64
- `${this.executionId}.cursor-events.jsonl`,
65
- );
96
+ const filePath = join(this.outputDir, `${this.executionId}.cursor-events.jsonl`);
66
97
 
67
98
  await writeFile(filePath, this.lines.join("\n") + "\n");
68
- console.log(
69
- `CursorEventRecorder: flushed ${this.lines.length} events to ${filePath}`,
70
- );
99
+ console.log(`CursorEventRecorder: flushed ${this.lines.length} lines to ${filePath}`);
71
100
  }
72
101
  }
73
102
 
@@ -65,7 +65,7 @@ interface ProxyConfig {
65
65
  * manager's token coordinator), so a rotation reaches the next request
66
66
  * without a call into this module. Which credential it is differs per
67
67
  * root — the static root's control-plane token, the manager's minted
68
- * runner token (Q-S2-7) — and this module never knows which.
68
+ * runner token — and this module never knows which.
69
69
  */
70
70
  proxyTokenRef: { readonly current: string | null };
71
71
  executionId?: string;
@@ -64,7 +64,7 @@ interface Http2InterceptorConfig {
64
64
  * installed this interceptor owns the ref and rotates it in place, so a
65
65
  * rotation reaches the next `request()` on an already-open session without
66
66
  * a call into this module (see fetch-interceptor.ts for the two roots'
67
- * bindings, Q-S2-7).
67
+ * bindings).
68
68
  */
69
69
  proxyTokenRef: { readonly current: string | null };
70
70
  }
@@ -6,7 +6,7 @@
6
6
  * user message and persist in the agent's own conversation store; a resumed
7
7
  * agent receives only what is per-turn).
8
8
  *
9
- * What is this harness's and what is shared (S3 M5, Q-S3-10 / Q-M5-2):
9
+ * What is this harness's and what is shared (since #1096):
10
10
  * - Shared through `shared/prompt-sections.ts`: WHICH standing sections
11
11
  * render and in WHAT order (`standingContextSections`) and the input-files
12
12
  * bullet and disclosure lines (`inputFileLines`). Their WORDS come from
@@ -70,7 +70,7 @@ const RUNNER_PATH_MARKERS = [
70
70
  ] as const;
71
71
 
72
72
  // The prompt renders the attachment resolver's own result type — a local
73
- // structural twin (`AttachmentPromptEntry`) lived here until S3 M5 and the
73
+ // structural twin (`AttachmentPromptEntry`) lived here until #1096 and the
74
74
  // projection into it was the one reason `turn-setup.ts` had a
75
75
  // `prepareAttachmentPrompt` step; the twin dropped the size, so this
76
76
  // harness's input-files line never carried it. One type, one truth: the
@@ -315,7 +315,7 @@ export function buildReinvocationPrompt(
315
315
  } else if (action === ApprovalAction.REJECT) {
316
316
  // A REJECT denies the tool and the run continues (stigmer#197); the
317
317
  // runtime settles its row SKIPPED. Told apart from a SKIP in the prose
318
- // so the model reads a refusal, not an omission (S3 M1, Q-S3-2).
318
+ // so the model reads a refusal, not an omission (since #1096).
319
319
  rejected.push(describeApproval(pa));
320
320
  }
321
321
  }
@@ -566,8 +566,8 @@ export function formatWorkspaceContext(dirs: string[]): string {
566
566
  /**
567
567
  * The `<input_files>` section: this harness's intro around the shared lines
568
568
  * (`prompt-sections.ts` `inputFileLines` says what each bullet and disclosure
569
- * carries and why). The size on each bullet is new to this harness at S3 M5
570
- * (Q-M5-3): the twin this builder rendered from had dropped it.
569
+ * carries and why). The size on each bullet is new to this harness in #1096:
570
+ * the twin this builder rendered from had dropped it.
571
571
  */
572
572
  export function formatInputFiles(
573
573
  attachments: readonly ResolvedAttachment[],
@@ -755,7 +755,7 @@ export function buildToolApprovalRuleFile(): string {
755
755
  // ---------------------------------------------------------------------------
756
756
  // Prompt selection — which of the four shapes a turn sends, from how the
757
757
  // agent resolved and whether the turn carries adjudicated approvals. Moved
758
- // from `index.ts` at S2 M3b, body unchanged; `__tests__/build-prompt.test.ts`
758
+ // from `index.ts` in #1070, body unchanged; `__tests__/build-prompt.test.ts`
759
759
  // pins every branch.
760
760
  // ---------------------------------------------------------------------------
761
761
 
@@ -3,10 +3,19 @@
3
3
  *
4
4
  * The first `Agent.create` in a pod pays the SDK's platform construction:
5
5
  * four SQLite-backed stores (run/checkpoint/event stores + notifier) whose
6
- * first use loads the sqlite native binding and compiles the schema
7
- * migrations. The 2026-07-30 instrumented baseline (issue #209) measured
8
- * this at ~1.2s of the ~2.4s `resolve_agent` segment, with a 624ms floor —
9
- * roughly half the cost is per-process warm-up, not per-session work.
6
+ * first use compiles the schema migrations. The 2026-07-30 instrumented
7
+ * baseline (issue #209, @cursor/sdk 1.0.13) measured this at ~1.2s of the
8
+ * ~2.4s `resolve_agent` segment, with a 624ms floor — roughly half the cost
9
+ * was per-process warm-up, not per-session work. Part of that floor was the
10
+ * `sqlite3` native binding's load; since 1.0.31 (stigmer/stigmer#1053) the
11
+ * SDK's stores run on `node:sqlite`, which is inside the Node binary, and the
12
+ * session's store is opened by the runner itself (`session-store.ts`,
13
+ * `SqliteLocalAgentStore.open`) rather than through the platform this
14
+ * warm-up constructs. What this warm-up still saves at 1.0.31 is therefore a
15
+ * measurement, not a known quantity: its `durationMs` and the cold-start
16
+ * timeline answer it, and the harness program carries the question of
17
+ * whether to warm through the store the runner actually opens, or through
18
+ * the SDK's own `prewarmLocalWorkspace`, or not at all.
10
19
  *
11
20
  * Pool members idle between boot and claim, so constructing one throwaway
12
21
  * platform there moves that per-process cost off the user-visible path.
@@ -32,8 +41,8 @@ export interface SdkWarmupResult {
32
41
 
33
42
  /**
34
43
  * Construct (and abandon) one SDK agent platform on a throwaway temp-dir
35
- * state root, forcing the sqlite native binding + store schema work to
36
- * happen now instead of inside the first user-facing `Agent.create`.
44
+ * state root, forcing the store schema work to happen now instead of inside
45
+ * the first user-facing `Agent.create`.
37
46
  *
38
47
  * Total by construction — warm-up is an optimization and must never affect
39
48
  * the member's ability to serve. The throwaway state root is a few KB on
@@ -53,8 +53,7 @@ const AUTO_MODEL_IDS = new Set(["default", "auto"]);
53
53
  * the served variant deterministic while leaving effort knobs on their
54
54
  * catalog defaults. `fast` changes the per-token price; `thinking` is
55
55
  * price-neutral but changes token consumption and must never follow the
56
- * account default. Sourced from the Cursor catalog survey
57
- * (stigmer-cloud _projects/2026-08/20260806.04.model-service-tier).
56
+ * account default. Sourced from a survey of the Cursor catalog (2026-08).
58
57
  */
59
58
  const FAST_PARAM_ID = "fast";
60
59
  const THINKING_PARAM_ID = "thinking";
@@ -3,59 +3,63 @@
3
3
  *
4
4
  * SessionSpec.harness_state_id stores the Cursor agentId. This module handles
5
5
  * creating new agents (first execution), resuming existing agents
6
- * (subsequent executions), graceful fallback on resume failure, and
7
- * cleaning up agents (session deletion).
6
+ * (subsequent executions) and graceful fallback on resume failure.
8
7
  *
9
8
  * Two execution modes:
10
9
  *
11
- * - Local mode: Agent.create({ local: { cwd } }) with explicit
12
- * platform.workspaceRef/stateRoot for deterministic store keying.
13
- * Produces agent- prefixed IDs.
10
+ * - Local mode: Agent.create({ local: { cwd, dirs, store, ... } }) over the
11
+ * session's own SQLite store (`session-store.ts`). Produces agent- prefixed
12
+ * IDs.
14
13
  *
15
14
  * - Cloud mode (feature-flagged): Agent.create({ cloud: { repos } })
16
- * for git-backed workspaces. Produces bc- prefixed IDs. No platform
17
- * options — cloud state lives on Cursor's servers, not local SQLite.
15
+ * for git-backed workspaces. Produces bc- prefixed IDs. No store — cloud
16
+ * state lives on Cursor's servers, not local SQLite.
18
17
  *
19
- * Key SDK limitation: mcpServers are NOT persisted across Agent.resume().
20
- * They must be passed again on every resume call.
18
+ * Nothing under `local` survives Agent.resume(): `cwd`, `dirs`,
19
+ * `settingSources`, `store` and `enableAgentRetries` are re-supplied on every
20
+ * resume, exactly like `mcpServers`, `agents` and the model params. Omitting
21
+ * `cwd` re-roots the resumed agent at process.cwd() and loads the "project"
22
+ * setting source (the .cursor/hooks.json carrying the HITL approval hook) from
23
+ * the wrong directory, silently disabling the gate on every resumed turn;
24
+ * omitting `store` would make the SDK look the agent up in a default store
25
+ * derived from `cwd`, not the one the session's records are in.
21
26
  *
22
- * Platform store keying (local only): The Cursor SDK defaults to
23
- * process.cwd() for its internal state root lookup. In cloud sandboxes,
24
- * process.cwd() is the runner's app directory, not the workspace — causing
25
- * Agent.resume() to fail with "Agent not found". We pass explicit
26
- * platform.workspaceRef and platform.stateRoot derived from the Stigmer
27
- * sessionId to ensure deterministic store lookup regardless of process.cwd().
27
+ * Durability model: the session's SQLite store (agent records, runs,
28
+ * checkpoints) is the source of truth for conversation continuation. It lives
29
+ * under the durable workspace volume (`session-store.ts`) so Agent.resume()
30
+ * survives pod restart, reschedule, and snapshot restore. When resume
31
+ * nonetheless fails (store lost, corrupted, or agent unknown), this module
32
+ * creates a fresh agent and the caller starts a new turn from the user message
33
+ * plus re-injected instructions — there is no separate continuation store.
28
34
  *
29
- * Durability model: the SDK's local SQLite store (agent records, runs,
30
- * checkpoints) is the source of truth for conversation continuation. It is
31
- * persisted under the durable workspace volume (see resolvePlatformOptions)
32
- * so Agent.resume() survives pod restart, reschedule, and snapshot restore.
33
- * When resume nonetheless fails (store lost, corrupted, or agent unknown),
34
- * this module creates a fresh agent and the caller starts a new turn from
35
- * the user message plus re-injected instructions — there is no separate
36
- * continuation store.
35
+ * Retries are the runner's, not the SDK's. `@cursor/sdk` 1.0.31 defaults
36
+ * `enableAgentRetries` to true for headless embedders (1.0.13 defaulted it to
37
+ * false); the runner already owns recovery from a dead or stalled transport —
38
+ * `withTimeout` around agent resolution, `resolveAgentWithTransportRecovery`
39
+ * (reset the transport, retry once), the two recovery spines in
40
+ * `turn-settle.ts`, and the stall detector — so the SDK's layer is pinned OFF
41
+ * to keep one retry authority and the 1.0.13 timing of every provider fault.
42
+ * Whether to adopt the SDK's retries and delete ours is an open design
43
+ * question for the harness program, recorded there; it is not decided here.
37
44
  */
38
45
 
39
- import { mkdirSync } from "node:fs";
40
- import { join } from "node:path";
41
-
42
46
  import { Agent } from "@cursor/sdk";
43
47
  import type {
44
48
  SDKAgent,
45
- CursorAgentPlatformOptions,
46
49
  AgentDefinition,
50
+ LocalAgentOptions,
47
51
  ModelParameterValue,
48
52
  } from "@cursor/sdk";
53
+ import type { SqliteLocalAgentStore } from "@cursor/sdk/sqlite";
49
54
  import { withTimeout, TimeoutError } from "../../shared/with-timeout.js";
50
55
  import type { CloudRepo } from "../../shared/blueprint-resolver.js";
51
56
  import type { CursorMcpServerConfig } from "./cursor-mcp-config.js";
57
+ import { sessionStore } from "./session-store.js";
52
58
 
53
59
  // ---------------------------------------------------------------------------
54
60
  // Constants
55
61
  // ---------------------------------------------------------------------------
56
62
 
57
- const CURSOR_SDK_STATE_DIR = ".stigmer/cursor-sdk-state";
58
-
59
63
  /**
60
64
  * Cursor SDK setting sources loaded for LOCAL agents.
61
65
  *
@@ -199,64 +203,41 @@ export interface AgentResolution {
199
203
  // ---------------------------------------------------------------------------
200
204
 
201
205
  /**
202
- * Compute deterministic platform options for a Stigmer session.
203
- *
204
- * workspaceRef is a synthetic identifier (not a filesystem path) that
205
- * ensures the SDK's platform cache key is stable across activity
206
- * invocations regardless of process.cwd().
206
+ * The `local` options a session's agent is created AND resumed with — one
207
+ * builder so the two calls cannot drift (see the module header for why every
208
+ * field is re-supplied on resume).
207
209
  *
208
- * stateRoot is a session-isolated directory under the durable workspace
209
- * volume ({workspaceRootDir}/.stigmer/cursor-sdk-state/{sessionId}) where
210
- * the SDK persists its SQLite stores (agent records, runs, checkpoints).
211
- * Placing it on the workspace volume (rather than $HOME) makes native
212
- * Agent.resume() survive pod restart/reschedule and snapshot restore, and
213
- * keys it by sessionId so sessions sharing one volume (e.g. the child agent
214
- * executions of a workflow sandbox) never collide. Created eagerly to
215
- * prevent ENOENT on first SDK write.
216
- *
217
- * Both inputs are required and must be non-empty: the stateRoot is keyed by
218
- * sessionId, so an empty sessionId would collapse every session sharing the
219
- * volume onto the same store and corrupt their conversation state.
210
+ * Workspaces: the SDK takes ONE primary `cwd` (the default shell's directory
211
+ * and the agent's store scoping) plus `dirs` for the other roots of a
212
+ * multi-root workspace, merged cwd-first with duplicates dropped, so rules,
213
+ * skills and hooks load from every root. The session's first workspace
214
+ * directory is the primary, as it was when the SDK took the whole array.
220
215
  */
221
- export function resolvePlatformOptions(
216
+ async function localAgentOptions(
222
217
  sessionId: string,
223
218
  workspaceRootDir: string,
224
- ): CursorAgentPlatformOptions {
225
- if (!sessionId) {
226
- throw new Error(
227
- "resolvePlatformOptions: sessionId is required but was empty. The Cursor SDK " +
228
- "state store is keyed by sessionId; an empty value would collide across sessions " +
229
- "sharing a workspace volume (e.g. a workflow sandbox's child agent executions).",
230
- );
231
- }
232
- if (!workspaceRootDir) {
233
- throw new Error(
234
- "resolvePlatformOptions: workspaceRootDir is required but was empty. The Cursor " +
235
- "SDK state store must live on the durable workspace volume to survive restarts.",
236
- );
237
- }
238
- const stateRoot = join(workspaceRootDir, CURSOR_SDK_STATE_DIR, sessionId);
239
- mkdirSync(stateRoot, { recursive: true });
219
+ workspaceDirs: readonly string[],
220
+ ): Promise<LocalAgentOptions & { readonly store: SqliteLocalAgentStore }> {
221
+ const [cwd, ...dirs] = workspaceDirs;
222
+ const store = await sessionStore(sessionId, workspaceRootDir);
240
223
  return {
241
- workspaceRef: `stigmer-session:${sessionId}`,
242
- stateRoot,
224
+ cwd,
225
+ ...(dirs.length > 0 ? { dirs } : {}),
226
+ settingSources: [...LOCAL_SETTING_SOURCES],
227
+ store,
228
+ // The runner is the one retry authority (module header).
229
+ enableAgentRetries: false,
243
230
  };
244
231
  }
245
232
 
246
233
  /**
247
234
  * Create a new local Cursor Agent for the first execution in a session.
248
- *
249
- * Supports multi-workspace: passes string[] when multiple dirs, string when single.
250
235
  */
251
236
  export async function createAgent(options: CreateAgentOptions): Promise<SDKAgent> {
252
- const cwd = options.workspaceDirs.length === 1
253
- ? options.workspaceDirs[0]
254
- : options.workspaceDirs;
255
-
256
- const platform = resolvePlatformOptions(options.sessionId, options.workspaceRootDir);
237
+ const local = await localAgentOptions(options.sessionId, options.workspaceRootDir, options.workspaceDirs);
257
238
  console.log(
258
- `createAgent: sessionId=${options.sessionId}, workspaceRef=${platform.workspaceRef}, ` +
259
- `stateRoot=${platform.stateRoot}, process.cwd=${process.cwd()}`,
239
+ `createAgent: sessionId=${options.sessionId}, workspaceRef=${local.store.workspaceRef}, ` +
240
+ `stateRoot=${local.store.stateRoot}, process.cwd=${process.cwd()}`,
260
241
  );
261
242
 
262
243
  return Agent.create({
@@ -264,10 +245,9 @@ export async function createAgent(options: CreateAgentOptions): Promise<SDKAgent
264
245
  // Always a full selection — id AND params. A bare { id } would let the
265
246
  // catalog's default variant (account-influenced) pick the price (#357).
266
247
  model: { id: options.model, params: options.modelParams },
267
- local: { cwd, settingSources: [...LOCAL_SETTING_SOURCES] },
248
+ local,
268
249
  mcpServers: options.mcpServers as Record<string, any>,
269
250
  agents: options.agents,
270
- platform,
271
251
  });
272
252
  }
273
253
 
@@ -278,14 +258,10 @@ export async function createAgent(options: CreateAgentOptions): Promise<SDKAgent
278
258
  * propagate or fall back to a fresh agent with continuation context.
279
259
  */
280
260
  export async function resumeAgent(options: ResumeAgentOptions): Promise<SDKAgent> {
281
- const cwd = options.workspaceDirs.length === 1
282
- ? options.workspaceDirs[0]
283
- : options.workspaceDirs;
284
-
285
- const platform = resolvePlatformOptions(options.sessionId, options.workspaceRootDir);
261
+ const local = await localAgentOptions(options.sessionId, options.workspaceRootDir, options.workspaceDirs);
286
262
  console.log(
287
263
  `resumeAgent: agentId=${options.agentId}, sessionId=${options.sessionId}, ` +
288
- `workspaceRef=${platform.workspaceRef}, stateRoot=${platform.stateRoot}, ` +
264
+ `workspaceRef=${local.store.workspaceRef}, stateRoot=${local.store.stateRoot}, ` +
289
265
  `process.cwd=${process.cwd()}`,
290
266
  );
291
267
 
@@ -296,16 +272,9 @@ export async function resumeAgent(options: ResumeAgentOptions): Promise<SDKAgent
296
272
  // ledger, #357), but an id-only resume would fall back to the catalog
297
273
  // default variant for the new turns.
298
274
  model: options.model ? { id: options.model, params: options.modelParams } : undefined,
299
- // Neither cwd nor settingSources survive Agent.resume(); both must be
300
- // re-supplied every turn. Omitting cwd makes the SDK fall back to
301
- // process.cwd(), which re-roots the agent in the runner's own working
302
- // directory and loads the "project" setting source — the .cursor/hooks.json
303
- // carrying the HITL approval hook — from that wrong directory, silently
304
- // disabling the approval gate on every resumed turn.
305
- local: { cwd, settingSources: [...LOCAL_SETTING_SOURCES] },
275
+ local,
306
276
  mcpServers: options.mcpServers as Record<string, any>,
307
277
  agents: options.agents,
308
- platform,
309
278
  });
310
279
  }
311
280
 
@@ -317,7 +286,7 @@ export async function resumeAgent(options: ResumeAgentOptions): Promise<SDKAgent
317
286
  * Create a new cloud Cursor Agent for git-backed sessions.
318
287
  *
319
288
  * Cloud agents (bc- prefix) run on Cursor's servers with cloned repos.
320
- * No platform options — cloud state lives server-side, not in local SQLite.
289
+ * No store — cloud state lives server-side, not in local SQLite.
321
290
  * Model is optional — Cursor resolves the caller's configured default
322
291
  * when omitted.
323
292
  */
@@ -341,7 +310,7 @@ export async function createCloudAgent(options: CreateCloudAgentOptions): Promis
341
310
  *
342
311
  * Throws on failure — the caller (resolveAgent) decides whether to
343
312
  * propagate or fall back to a fresh cloud agent with continuation context.
344
- * No platform options — cloud state lives server-side.
313
+ * No store — cloud state lives server-side.
345
314
  */
346
315
  export async function resumeCloudAgent(options: ResumeCloudAgentOptions): Promise<SDKAgent> {
347
316
  console.log(
@@ -365,8 +334,8 @@ export async function resumeCloudAgent(options: ResumeCloudAgentOptions): Promis
365
334
  * graceful fallback if resume fails.
366
335
  *
367
336
  * The mode parameter determines which create/resume functions are used:
368
- * - "local": createAgent / resumeAgent (with platform options)
369
- * - "cloud": createCloudAgent / resumeCloudAgent (no platform options)
337
+ * - "local": createAgent / resumeAgent (over the session's store)
338
+ * - "cloud": createCloudAgent / resumeCloudAgent (no store)
370
339
  *
371
340
  * When harnessStateId is non-empty (subsequent execution):
372
341
  * 1. Attempt Agent.resume with mode-appropriate options.
@@ -536,18 +505,3 @@ export async function resolveAgentWithTransportRecovery(
536
505
  return attempt(true);
537
506
  }
538
507
  }
539
-
540
- /**
541
- * Dispose a Cursor Agent when a session is deleted.
542
- * Best-effort: logs and swallows errors.
543
- */
544
- export async function disposeAgent(agentId: string, apiKey: string): Promise<void> {
545
- try {
546
- await Agent.archive(agentId, { apiKey });
547
- } catch (err) {
548
- console.warn(
549
- `Failed to archive Cursor agent ${agentId}:`,
550
- err instanceof Error ? err.message : err,
551
- );
552
- }
553
- }