@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
@@ -41,14 +41,15 @@ describeWithCursorKey("SDK routing with CURSOR_BACKEND_URL unset", () => {
41
41
  mkdirSync(stateRoot, { recursive: true });
42
42
 
43
43
  const { Agent } = await import("@cursor/sdk");
44
+ const { SqliteLocalAgentStore } = await import("@cursor/sdk/sqlite");
44
45
 
45
46
  const agent = await Agent.create({
46
47
  apiKey: CURSOR_API_KEY,
47
48
  model: { id: "claude-sonnet-4" },
48
- local: { cwd: stateRoot },
49
- platform: {
50
- workspaceRef: `routing-test-${Date.now()}`,
51
- stateRoot,
49
+ local: {
50
+ cwd: stateRoot,
51
+ // 1.0.31: the store is caller-owned (`session-store.ts` in production).
52
+ store: await SqliteLocalAgentStore.open({ workspaceRef: `routing-test-${Date.now()}`, stateRoot }),
52
53
  },
53
54
  });
54
55
 
@@ -62,14 +63,15 @@ describeWithCursorKey("SDK routing with CURSOR_BACKEND_URL unset", () => {
62
63
  mkdirSync(stateRoot, { recursive: true });
63
64
 
64
65
  const { Agent } = await import("@cursor/sdk");
66
+ const { SqliteLocalAgentStore } = await import("@cursor/sdk/sqlite");
65
67
 
66
68
  const agent = await Agent.create({
67
69
  apiKey: CURSOR_API_KEY,
68
70
  model: { id: "claude-sonnet-4" },
69
- local: { cwd: stateRoot },
70
- platform: {
71
- workspaceRef: `routing-send-test-${Date.now()}`,
72
- stateRoot,
71
+ local: {
72
+ cwd: stateRoot,
73
+ // 1.0.31: the store is caller-owned (`session-store.ts` in production).
74
+ store: await SqliteLocalAgentStore.open({ workspaceRef: `routing-send-test-${Date.now()}`, stateRoot }),
73
75
  },
74
76
  });
75
77
 
@@ -0,0 +1,142 @@
1
+ /**
2
+ * The Cursor event recorder's contract (`cursor-event-recorder.ts`): off when
3
+ * no directory is named; both SDK channels in ONE file under ONE arrival
4
+ * counter, each line saying which channel it came from; the file named by the
5
+ * execution; a cyclic payload recorded as a marker rather than failing the
6
+ * flush. The native recorder's `v3-event-recorder.test.ts` is the sibling.
7
+ *
8
+ * The ordering arm is the reason the recorder exists in this shape: a delta
9
+ * that arrives between two stream events must read between them in the file,
10
+ * because "does `tool-call-completed` precede the stream's own completion" is
11
+ * a question only the arrival order can answer.
12
+ */
13
+ import { describe, it, expect, beforeEach } from "vitest";
14
+ import { mkdtemp, readFile, readdir } from "node:fs/promises";
15
+ import { join } from "node:path";
16
+ import { tmpdir } from "node:os";
17
+ import type { InteractionUpdate, SDKMessage } from "@cursor/sdk";
18
+ import { createCursorEventRecorder } from "../cursor-event-recorder.js";
19
+
20
+ /** A stream event carrying only what the recorder reads; the rest is payload. */
21
+ function streamEvent(type: string, extra: Record<string, unknown> = {}): SDKMessage {
22
+ return { type, agent_id: "agent-1", run_id: "run-1", ...extra } as unknown as SDKMessage;
23
+ }
24
+
25
+ function delta(type: string, extra: Record<string, unknown> = {}): InteractionUpdate {
26
+ return { type, ...extra } as unknown as InteractionUpdate;
27
+ }
28
+
29
+ interface RecordedLine {
30
+ readonly seq: number;
31
+ readonly capturedAt: string;
32
+ readonly channel: "stream" | "delta";
33
+ readonly type: string;
34
+ readonly agent_id?: string;
35
+ readonly run_id?: string;
36
+ readonly event?: Record<string, unknown>;
37
+ readonly update?: Record<string, unknown>;
38
+ }
39
+
40
+ async function readLines(dir: string, executionId: string): Promise<RecordedLine[]> {
41
+ const content = await readFile(join(dir, `${executionId}.cursor-events.jsonl`), "utf-8");
42
+ return content
43
+ .split("\n")
44
+ .filter((line) => line.length > 0)
45
+ .map((line) => JSON.parse(line) as RecordedLine);
46
+ }
47
+
48
+ describe("createCursorEventRecorder", () => {
49
+ it("returns undefined when no directory is named (recording off)", () => {
50
+ expect(createCursorEventRecorder("exec-1", undefined)).toBeUndefined();
51
+ expect(createCursorEventRecorder("exec-1", "")).toBeUndefined();
52
+ });
53
+
54
+ it("returns a recorder with both channels and a flush when a directory is named", () => {
55
+ const recorder = createCursorEventRecorder("exec-1", "/tmp/unused");
56
+ expect(recorder).toBeDefined();
57
+ expect(recorder!.record).toBeInstanceOf(Function);
58
+ expect(recorder!.recordDelta).toBeInstanceOf(Function);
59
+ expect(recorder!.flush).toBeInstanceOf(Function);
60
+ });
61
+ });
62
+
63
+ describe("CursorEventRecorder", () => {
64
+ let dir: string;
65
+
66
+ beforeEach(async () => {
67
+ dir = await mkdtemp(join(tmpdir(), "cursor-recorder-test-"));
68
+ });
69
+
70
+ it("flush writes nothing when nothing was recorded", async () => {
71
+ const recorder = createCursorEventRecorder("exec-empty", dir)!;
72
+ await recorder.flush();
73
+ expect(await readdir(dir)).toHaveLength(0);
74
+ });
75
+
76
+ it("sequences both channels in ONE file in arrival order, each line naming its channel", async () => {
77
+ const recorder = createCursorEventRecorder("exec-order", dir)!;
78
+
79
+ recorder.record(streamEvent("tool_call", { subtype: "started", call_id: "c1" }));
80
+ recorder.recordDelta(delta("shell-output-delta", { event: { chunk: "hook probe\n" } }));
81
+ recorder.recordDelta(delta("tool-call-completed", { toolCall: { id: "c1" } }));
82
+ recorder.record(streamEvent("tool_call", { subtype: "completed", call_id: "c1" }));
83
+ recorder.record(streamEvent("result"));
84
+
85
+ await recorder.flush();
86
+ const lines = await readLines(dir, "exec-order");
87
+
88
+ expect(lines.map((l) => l.seq)).toEqual([0, 1, 2, 3, 4]);
89
+ expect(lines.map((l) => `${l.channel}:${l.type}`)).toEqual([
90
+ "stream:tool_call",
91
+ "delta:shell-output-delta",
92
+ "delta:tool-call-completed",
93
+ "stream:tool_call",
94
+ "stream:result",
95
+ ]);
96
+ for (const line of lines) expect(line.capturedAt).toBeTruthy();
97
+ });
98
+
99
+ it("a stream line carries the event's agent and run ids and the whole event; a delta line the whole update", async () => {
100
+ const recorder = createCursorEventRecorder("exec-shape", dir)!;
101
+
102
+ recorder.record(streamEvent("assistant", { content: "hi" }));
103
+ recorder.recordDelta(delta("turn-ended", { usage: { inputTokens: 12 } }));
104
+
105
+ await recorder.flush();
106
+ const [stream, deltaLine] = await readLines(dir, "exec-shape");
107
+
108
+ expect(stream!.agent_id).toBe("agent-1");
109
+ expect(stream!.run_id).toBe("run-1");
110
+ expect(stream!.event).toMatchObject({ type: "assistant", content: "hi" });
111
+ expect(stream!.update).toBeUndefined();
112
+
113
+ expect(deltaLine!.update).toEqual({ type: "turn-ended", usage: { inputTokens: 12 } });
114
+ expect(deltaLine!.event).toBeUndefined();
115
+ expect(deltaLine!.agent_id).toBeUndefined();
116
+ });
117
+
118
+ it("names the file by execution id and creates the directory if it does not exist", async () => {
119
+ const nested = join(dir, "nested", "deep");
120
+ const recorder = createCursorEventRecorder("exec-mkdir", nested)!;
121
+
122
+ recorder.record(streamEvent("system"));
123
+ await recorder.flush();
124
+
125
+ expect(await readdir(nested)).toEqual(["exec-mkdir.cursor-events.jsonl"]);
126
+ });
127
+
128
+ it("records a cyclic payload as a serialization marker instead of failing the flush", async () => {
129
+ const recorder = createCursorEventRecorder("exec-cyclic", dir)!;
130
+
131
+ const cyclic: Record<string, unknown> = { type: "custom", a: 1 };
132
+ cyclic.self = cyclic;
133
+ recorder.record(cyclic as unknown as SDKMessage);
134
+
135
+ await recorder.flush();
136
+ const [line] = await readLines(dir, "exec-cyclic");
137
+
138
+ expect(line!.type).toBe("custom");
139
+ expect(line!.event).toMatchObject({ _serializationError: true });
140
+ expect((line!.event as { keys: string[] }).keys).toContain("a");
141
+ });
142
+ });
@@ -1,11 +1,22 @@
1
1
  /**
2
- * Test that reproduces the desktop runner's EXACT execution path.
2
+ * Live probe: which of the SDK's calls a `globalThis.fetch` interceptor can
3
+ * see. A fetch wrapper that notes any call to a cursor.sh / cursor.com URL is
4
+ * installed, then `Agent.create()` runs (local mode, no model named).
3
5
  *
4
- * Simulates proxy mode: fetch interceptor installed, apiKey="proxy-managed",
5
- * to verify whether the proxy rewriting actually intercepts @cursor/sdk calls.
6
+ * What the one arm proves: `Agent.create()` completes WITHOUT a global-fetch
7
+ * call to a Cursor URL — its transport is connect-node over Node's HTTP/2, so
8
+ * a fetch-level interceptor alone cannot rewrite it. That is why the adapter
9
+ * installs BOTH interceptors in proxy mode (`fetch-interceptor.ts` and
10
+ * `http2-interceptor.ts`). Measured true at SDK 1.0.31 on 2026-09-16 (#1097's
11
+ * live run, 1/1).
6
12
  *
7
- * Expected result: THIS TEST WILL FAIL because @cursor/sdk uses connect-node
8
- * (Node.js native HTTP), not globalThis.fetch. The fetch interceptor never fires.
13
+ * What it does NOT prove: that the fetch interceptor is useless. A reading of
14
+ * the 1.0.31 bundle the same day found the SDK's cloud-api client and its
15
+ * token exchange on global `fetch`, on paths this arm never exercises; the
16
+ * fetch interceptor exists for those.
17
+ *
18
+ * Skipped without `CURSOR_API_KEY`; the suite never runs it. Run it by hand:
19
+ * CURSOR_API_KEY=<key> npx vitest run src/activities/execute-cursor/__tests__/cursor-fetch-interceptor-bypass.test.ts
9
20
  */
10
21
 
11
22
  import { describe, it, expect, beforeAll, afterAll } from "vitest";
@@ -39,26 +50,27 @@ describeWithCursorKey("Fetch Interceptor vs Connect-Node Transport", () => {
39
50
  globalThis.fetch = originalFetch;
40
51
  });
41
52
 
42
- it("Agent.create() does NOT go through globalThis.fetch (proving interceptor is useless)", async () => {
53
+ it("Agent.create() completes without a globalThis.fetch call to a Cursor URL", async () => {
43
54
  const { Agent } = await import("@cursor/sdk");
55
+ const { SqliteLocalAgentStore } = await import("@cursor/sdk/sqlite");
44
56
 
45
57
  const stateRoot = join(tmpdir(), `cursor-intercept-test-${Date.now()}`);
46
58
  mkdirSync(stateRoot, { recursive: true });
47
59
 
48
60
  const agent = await Agent.create({
49
61
  apiKey: CURSOR_API_KEY,
50
- local: { cwd: stateRoot },
51
- platform: {
52
- workspaceRef: `intercept-test-${Date.now()}`,
53
- stateRoot,
62
+ local: {
63
+ cwd: stateRoot,
64
+ // 1.0.31: the store is caller-owned (`session-store.ts` in production).
65
+ store: await SqliteLocalAgentStore.open({ workspaceRef: `intercept-test-${Date.now()}`, stateRoot }),
54
66
  },
55
67
  });
56
68
 
57
69
  expect(agent.agentId).toBeTruthy();
58
70
  console.log(`Agent created: ${agent.agentId}, interceptCalled=${interceptCalled}`);
59
71
 
60
- // This assertion proves the fetch interceptor pattern is broken:
61
- // connect-node uses Node.js http module, NOT globalThis.fetch
72
+ // The create path is connect-node over Node's HTTP/2, not globalThis.fetch;
73
+ // see the header for what this does and does not say about proxy mode.
62
74
  expect(interceptCalled).toBe(false);
63
75
  }, 30_000);
64
76
  });
@@ -35,6 +35,7 @@
35
35
  */
36
36
 
37
37
  import { describe, it, expect } from "vitest";
38
+ import { SqliteLocalAgentStore } from "@cursor/sdk/sqlite";
38
39
  import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, existsSync, chmodSync, readdirSync } from "node:fs";
39
40
  import { tmpdir } from "node:os";
40
41
  import { join } from "node:path";
@@ -87,8 +88,12 @@ describeWithCursorKey("generateImage live ground truth (issue #965)", () => {
87
88
  const agent = await Agent.create({
88
89
  apiKey: CURSOR_API_KEY,
89
90
  model: { id: "composer-2.5" },
90
- local: { cwd: workspaceRoot, settingSources: ["project"] },
91
- platform: { workspaceRef: `genimage-spike-${Date.now()}`, stateRoot },
91
+ local: {
92
+ cwd: workspaceRoot,
93
+ settingSources: ["project"],
94
+ // 1.0.31: the store is caller-owned (`session-store.ts` in production).
95
+ store: await SqliteLocalAgentStore.open({ workspaceRef: `genimage-spike-${Date.now()}`, stateRoot }),
96
+ },
92
97
  });
93
98
 
94
99
  // The runner's exact consumption shape (index.ts / turn-stream.ts):
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Live ground truth for the hook protocol the approval gate rides on — the
3
+ * standing instrument an `@cursor/sdk` bump runs before it is trusted
4
+ * (stigmer/stigmer#1053, the first bump; every later one inherits this).
5
+ *
6
+ * WHY THIS EXISTS. The Stigmer HITL gate on the Cursor harness is a
7
+ * `.cursor/hooks.json` `preToolUse` hook (`hook-script.ts`) that reads the
8
+ * SDK's stdin payload and answers `{"permission": "allow" | "deny"}`. Three
9
+ * facts about that payload are load-bearing and none is a TypeScript type:
10
+ *
11
+ * 1. `tool_name` is the HOOK taxonomy, PascalCase (`Write`, `Shell`, `Delete`;
12
+ * the stream taxonomy is lowercase `edit`, `shell`, `delete`) — the gated
13
+ * set `BUILT_IN_GATED` (`approval-policy.ts`) is spelled in it.
14
+ * 2. `tool_input` is an OBJECT for built-in tools (a JSON STRING for MCP
15
+ * tools under `beforeMCPExecution`) — the hook's identity token and the
16
+ * denial ledger's captured args are computed from it.
17
+ * 3. `hook_event_name` discriminates `preToolUse` from `beforeMCPExecution`.
18
+ *
19
+ * The hermetic tests prove the runner's handling of the shapes CAPTURED at
20
+ * 1.0.13 (`cursor-hook-harness.ts` `hookWrite`, `hookShell`, ...). They cannot
21
+ * see the SDK move. This test runs one real turn that edits a file and runs a
22
+ * shell command under an allow-everything observation hook, then asserts the
23
+ * three facts on what the real SDK sent. A `tool_name` outside the gated set
24
+ * for a write-, shell- or delete-class action is the one outcome that must
25
+ * stop a bump: the gate would let it through.
26
+ *
27
+ * Skipped without CURSOR_API_KEY (the cursor-sdk-auth-smoke.test.ts
28
+ * convention) — it spends real credits for one short turn. Findings are
29
+ * PRINTED as well as asserted, so a bump's PR can quote the shapes seen.
30
+ *
31
+ * Run with: CURSOR_API_KEY=<key> npx vitest run cursor-hook-protocol-live
32
+ */
33
+ import { describe, it, expect } from "vitest";
34
+ import { chmodSync, existsSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs";
35
+ import { tmpdir } from "node:os";
36
+ import { join } from "node:path";
37
+ import { approvalCategory } from "../approval-policy.js";
38
+
39
+ const CURSOR_API_KEY = process.env.CURSOR_API_KEY ?? "";
40
+ const describeWithCursorKey = CURSOR_API_KEY ? describe : describe.skip;
41
+
42
+ /** One hook invocation as the SDK wrote it to the hook's stdin. */
43
+ interface HookInvocation {
44
+ readonly hook_event_name?: unknown;
45
+ readonly tool_name?: unknown;
46
+ readonly tool_input?: unknown;
47
+ }
48
+
49
+ /**
50
+ * An observation-only preToolUse/beforeMCPExecution hook: appends every
51
+ * invocation's stdin JSON to a log file and ALLOWS everything, so the turn
52
+ * runs to completion and every gated action is seen exactly as the gate would
53
+ * see it.
54
+ */
55
+ function installObservationHook(workspaceRoot: string, logPath: string): void {
56
+ const hooksDir = join(workspaceRoot, ".cursor");
57
+ mkdirSync(hooksDir, { recursive: true });
58
+ const scriptPath = join(hooksDir, "observe-hook.sh");
59
+ writeFileSync(
60
+ scriptPath,
61
+ `#!/bin/bash\nINPUT=$(cat)\nprintf '%s\\n' "$INPUT" >> "${logPath}" 2>/dev/null || true\necho '{"permission":"allow"}'\n`,
62
+ "utf-8",
63
+ );
64
+ chmodSync(scriptPath, 0o755);
65
+ writeFileSync(
66
+ join(hooksDir, "hooks.json"),
67
+ JSON.stringify({
68
+ version: 1,
69
+ hooks: {
70
+ preToolUse: [{ command: scriptPath }],
71
+ beforeMCPExecution: [{ command: scriptPath }],
72
+ },
73
+ }),
74
+ "utf-8",
75
+ );
76
+ }
77
+
78
+ function readInvocations(logPath: string): HookInvocation[] {
79
+ if (!existsSync(logPath)) return [];
80
+ const invocations: HookInvocation[] = [];
81
+ for (const line of readFileSync(logPath, "utf-8").split("\n")) {
82
+ if (!line.trim()) continue;
83
+ try {
84
+ invocations.push(JSON.parse(line) as HookInvocation);
85
+ } catch {
86
+ /* a partial line from a hook the SDK cut off; nothing to read */
87
+ }
88
+ }
89
+ return invocations;
90
+ }
91
+
92
+ describeWithCursorKey("Cursor SDK hook protocol (live ground truth)", () => {
93
+ it("delivers PascalCase tool_name, an object tool_input and hook_event_name for a file edit and a shell command", async () => {
94
+ const { Agent } = await import("@cursor/sdk");
95
+ const { SqliteLocalAgentStore } = await import("@cursor/sdk/sqlite");
96
+
97
+ const workspaceRoot = mkdtempSync(join(tmpdir(), "stigmer-hook-protocol-"));
98
+ const stateRoot = join(workspaceRoot, ".sdk-state");
99
+ mkdirSync(stateRoot, { recursive: true });
100
+ const hookLog = join(workspaceRoot, "hook-invocations.jsonl");
101
+ installObservationHook(workspaceRoot, hookLog);
102
+
103
+ // Mirror the runner's arrangement (session-lifecycle.ts): local cwd, the
104
+ // "project" setting source that loads .cursor/hooks.json, the session's
105
+ // own store, the SDK's retries off.
106
+ const agent = await Agent.create({
107
+ apiKey: CURSOR_API_KEY,
108
+ model: { id: "composer-2.5" },
109
+ local: {
110
+ cwd: workspaceRoot,
111
+ settingSources: ["project"],
112
+ store: await SqliteLocalAgentStore.open({ workspaceRef: `hook-protocol-${Date.now()}`, stateRoot }),
113
+ enableAgentRetries: false,
114
+ },
115
+ });
116
+
117
+ const run = await agent.send(
118
+ "Do exactly two things, in order, without asking questions: " +
119
+ "(1) create a file named probe.txt in the workspace containing the single line 'hook probe'; " +
120
+ "(2) run the shell command `cat probe.txt`. Then reply with the word done.",
121
+ );
122
+ for await (const _event of run.stream()) {
123
+ /* drain: the hook log is the evidence, not the stream */
124
+ }
125
+ const result = await run.wait();
126
+ agent.close();
127
+
128
+ const invocations = readInvocations(hookLog);
129
+
130
+ // ---- Findings dump (what a bump's PR quotes) ----
131
+ console.log(`[hook-protocol] run status: ${result.status}`);
132
+ for (const inv of invocations) {
133
+ console.log(
134
+ `[hook-protocol] ${String(inv.hook_event_name)}:${String(inv.tool_name)} ` +
135
+ `tool_input=${typeof inv.tool_input} ${JSON.stringify(inv.tool_input).slice(0, 200)}`,
136
+ );
137
+ }
138
+
139
+ // The SDK boundary must not hang, and the turn must have reached the hook.
140
+ expect(["finished", "error", "cancelled"]).toContain(result.status);
141
+ expect(invocations.length, "the observation hook saw no tool call — hooks.json was not loaded").toBeGreaterThan(0);
142
+
143
+ const builtIns = invocations.filter((inv) => inv.hook_event_name === "preToolUse");
144
+ expect(builtIns.length, "no preToolUse invocation: the built-in tools did not reach the hook").toBeGreaterThan(0);
145
+ for (const inv of builtIns) {
146
+ // Fact 3: the discriminator is present and spelled as the script branches on it.
147
+ expect(inv.hook_event_name).toBe("preToolUse");
148
+ // Fact 1: the hook taxonomy is PascalCase.
149
+ expect(typeof inv.tool_name).toBe("string");
150
+ expect(inv.tool_name as string).toMatch(/^[A-Z]/);
151
+ // Fact 2: built-in tool_input is an object, not a JSON string.
152
+ expect(typeof inv.tool_input).toBe("object");
153
+ expect(inv.tool_input).not.toBeNull();
154
+ }
155
+
156
+ // The gate's reach: the write and the shell the prompt forced must have
157
+ // arrived under names the gate classifies. A write- or shell-class action
158
+ // under an unclassified name is the outcome that stops a bump.
159
+ const categories = builtIns.map((inv) => approvalCategory(inv.tool_name as string));
160
+ expect(categories, "the file write reached the hook under a name the gate classifies as write").toContain("write");
161
+ expect(categories, "the shell command reached the hook under a name the gate classifies as shell").toContain("shell");
162
+ }, 300_000);
163
+ });
@@ -1,17 +1,20 @@
1
1
  /**
2
- * Minimal smoke test to verify Cursor SDK authentication works with a real API key.
2
+ * Live smoke: the Cursor SDK authenticates and completes a round trip on a
3
+ * real member key. Three arms, each isolating one fact:
4
+ * 1. `Agent.create()` with a model named succeeds — the key is valid;
5
+ * 2. `agent.send()` runs to a completed result — the agent executes and the
6
+ * transport completes the round trip;
7
+ * 3. `Agent.create()` with no model named succeeds — the catalog default
8
+ * resolves.
3
9
  *
4
- * Tests three things in isolation:
5
- * 1. Agent.create() succeeds (proves the API key is valid)
6
- * 2. agent.send() produces a response (proves the agent can execute)
7
- * 3. The connect-node transport works end-to-end
8
- *
9
- * Run with: CURSOR_API_KEY=<key> npx tsx --test this-file.ts
10
- * Or via the test script: npm run test:cursor-auth
10
+ * Skipped without `CURSOR_API_KEY`; the suite never runs it. Run it by hand:
11
+ * CURSOR_API_KEY=<key> npx vitest run src/activities/execute-cursor/__tests__/cursor-sdk-auth-smoke.test.ts
12
+ * Last run green 3/3 on 2026-09-16 at SDK 1.0.31 (#1097's live run).
11
13
  */
12
14
 
13
15
  import { describe, it, expect } from "vitest";
14
16
  import { Agent } from "@cursor/sdk";
17
+ import { SqliteLocalAgentStore } from "@cursor/sdk/sqlite";
15
18
  import { mkdirSync } from "node:fs";
16
19
  import { join } from "node:path";
17
20
  import { tmpdir } from "node:os";
@@ -31,10 +34,10 @@ describeWithCursorKey("Cursor SDK Authentication Smoke Test", () => {
31
34
  const agent = await Agent.create({
32
35
  apiKey: CURSOR_API_KEY,
33
36
  model: { id: "claude-sonnet-4" },
34
- local: { cwd: stateRoot },
35
- platform: {
36
- workspaceRef: `auth-test-${Date.now()}`,
37
- stateRoot,
37
+ local: {
38
+ cwd: stateRoot,
39
+ // 1.0.31: the store is caller-owned (`session-store.ts` in production).
40
+ store: await SqliteLocalAgentStore.open({ workspaceRef: `auth-test-${Date.now()}`, stateRoot }),
38
41
  },
39
42
  });
40
43
 
@@ -50,10 +53,10 @@ describeWithCursorKey("Cursor SDK Authentication Smoke Test", () => {
50
53
  const agent = await Agent.create({
51
54
  apiKey: CURSOR_API_KEY,
52
55
  model: { id: "claude-sonnet-4" },
53
- local: { cwd: stateRoot },
54
- platform: {
55
- workspaceRef: `send-test-${Date.now()}`,
56
- stateRoot,
56
+ local: {
57
+ cwd: stateRoot,
58
+ // 1.0.31: the store is caller-owned (`session-store.ts` in production).
59
+ store: await SqliteLocalAgentStore.open({ workspaceRef: `send-test-${Date.now()}`, stateRoot }),
57
60
  },
58
61
  });
59
62
 
@@ -76,10 +79,10 @@ describeWithCursorKey("Cursor SDK Authentication Smoke Test", () => {
76
79
 
77
80
  const agent = await Agent.create({
78
81
  apiKey: CURSOR_API_KEY,
79
- local: { cwd: stateRoot },
80
- platform: {
81
- workspaceRef: `default-model-test-${Date.now()}`,
82
- stateRoot,
82
+ local: {
83
+ cwd: stateRoot,
84
+ // 1.0.31: the store is caller-owned (`session-store.ts` in production).
85
+ store: await SqliteLocalAgentStore.open({ workspaceRef: `default-model-test-${Date.now()}`, stateRoot }),
83
86
  },
84
87
  });
85
88