@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
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Session-keyed Cursor SDK store — the on-disk SQLite store a session's
3
+ * agent records, runs and checkpoints live in, opened once per session and
4
+ * handed to every `Agent.create` / `Agent.resume` of that session
5
+ * (stigmer/stigmer#1053).
6
+ *
7
+ * Why this exists: `@cursor/sdk` 1.0.31 removed the `platform` option the
8
+ * runner used to key the SDK's store (`platform.workspaceRef` /
9
+ * `platform.stateRoot`) and replaced it with a caller-owned
10
+ * `local.store: LocalAgentStore`. The SDK's own instruction is "open once per
11
+ * workspace / state root and reuse across `Agent.create` / `resume`". So the
12
+ * store has a lifetime the runner owns, and this module is where it lives.
13
+ *
14
+ * Where the store lives on disk is unchanged from the `platform` era:
15
+ * `{workspaceRootDir}/.stigmer/cursor-sdk-state/{sessionId}` — the durable
16
+ * workspace volume rather than `$HOME`, so native `Agent.resume()` survives
17
+ * pod restart, reschedule and snapshot restore; keyed by sessionId so sessions
18
+ * sharing one volume (a workflow sandbox's child agent executions) never
19
+ * collide. The `workspaceRef` is the same synthetic `stigmer-session:<id>`,
20
+ * deliberately not a filesystem path, so lookups are stable regardless of
21
+ * `process.cwd()` (in a cloud sandbox that is the runner's app directory, not
22
+ * the workspace).
23
+ *
24
+ * Lifetime — the session's, on the two hooks the adapter already has:
25
+ * - `sessionStore()` opens on first use and memoizes the OPEN PROMISE per
26
+ * session, so two activities racing on one session (the agent cache's
27
+ * documented race: the loser resolves its own agent) await the same open
28
+ * instead of racing two opens on one file. A failed open is not memoized;
29
+ * the next call retries.
30
+ * - `releaseSessionStore(sessionId)` is called from the adapter's
31
+ * `releaseSession` — the runtime saying the session is done on this host.
32
+ * - `releaseAllSessionStores()` is called from the adapter's `shutdown`.
33
+ * - A re-acquire under a DIFFERENT state root (the session moved volumes)
34
+ * releases the store it held and opens the new one — the same rule the agent
35
+ * cache applies to a fingerprint mismatch: a handle for the old binding can
36
+ * never serve the new one, and holding it would only pin a file.
37
+ * Nothing else disposes a store. In particular the store does NOT ride the
38
+ * agent handle's `close()` — the handle has five close sites and a second
39
+ * resource on each would be a parallel lifecycle — and it does not enter the
40
+ * agent cache, whose exclusive-checkout model is about one handle per turn.
41
+ *
42
+ * At 1.0.13 the SDK memoized its platform (with open SQLite handles) for the
43
+ * whole process; a per-session store released when the session is released is
44
+ * a tighter lifetime, not a looser one.
45
+ *
46
+ * `SessionStores` is the mechanism with the opener injected, so its rules are
47
+ * unit-tested without a SQLite file; the module-level instance binds the SDK's
48
+ * `SqliteLocalAgentStore.open` (`@cursor/sdk/sqlite`, the subpath entry that
49
+ * keeps the sqlite driver off the main package's import path). In a hermetic
50
+ * run that subpath is doubled beside `@cursor/sdk` itself (`scripted-sdk.ts`).
51
+ *
52
+ * THIS MODULE'S STATIC GRAPH IS SDK-FREE, like `agent-session-cache.ts`: the
53
+ * adapter imports both statically, and the adapter's own static graph must
54
+ * stay SDK-free so the composition roots can import it before `boot` installs
55
+ * the interceptors (`adapter.ts` header). The SDK's sqlite entry is loaded
56
+ * with a dynamic import at the first open — the runner's
57
+ * dynamic-import-for-order convention — and only its TYPE is imported here.
58
+ */
59
+ import { mkdirSync } from "node:fs";
60
+ import { join } from "node:path";
61
+ const CURSOR_SDK_STATE_DIR = ".stigmer/cursor-sdk-state";
62
+ /**
63
+ * Compute a session's store location. Both inputs are required and must be
64
+ * non-empty: the state root is keyed by sessionId, so an empty sessionId would
65
+ * collapse every session sharing the volume onto one store and corrupt their
66
+ * conversation state; an empty root would put the store somewhere that does
67
+ * not survive a restart. The directory is created eagerly to prevent ENOENT on
68
+ * the SDK's first write.
69
+ */
70
+ export function resolveSessionStoreLocation(sessionId, workspaceRootDir) {
71
+ if (!sessionId) {
72
+ throw new Error("resolveSessionStoreLocation: sessionId is required but was empty. The Cursor SDK " +
73
+ "state store is keyed by sessionId; an empty value would collide across sessions " +
74
+ "sharing a workspace volume (e.g. a workflow sandbox's child agent executions).");
75
+ }
76
+ if (!workspaceRootDir) {
77
+ throw new Error("resolveSessionStoreLocation: workspaceRootDir is required but was empty. The Cursor " +
78
+ "SDK state store must live on the durable workspace volume to survive restarts.");
79
+ }
80
+ const stateRoot = join(workspaceRootDir, CURSOR_SDK_STATE_DIR, sessionId);
81
+ mkdirSync(stateRoot, { recursive: true });
82
+ return { workspaceRef: `stigmer-session:${sessionId}`, stateRoot };
83
+ }
84
+ /** One store per session, opened through `open`, held until released. */
85
+ export class SessionStores {
86
+ open;
87
+ held = new Map();
88
+ constructor(open) {
89
+ this.open = open;
90
+ }
91
+ /** The session's store, opened on first use; the same instance on every later call. */
92
+ acquire(sessionId, workspaceRootDir) {
93
+ const location = resolveSessionStoreLocation(sessionId, workspaceRootDir);
94
+ const existing = this.held.get(sessionId);
95
+ if (existing && existing.stateRoot === location.stateRoot)
96
+ return existing.store;
97
+ if (existing) {
98
+ console.log(`session-store: session=${sessionId} re-acquired under a different state root ` +
99
+ `(held=${existing.stateRoot}, requested=${location.stateRoot}) — releasing the held store`);
100
+ void this.release(sessionId);
101
+ }
102
+ const store = this.open(location);
103
+ this.held.set(sessionId, { stateRoot: location.stateRoot, store });
104
+ // A failed open must not be memoized: the next acquire retries. Only the
105
+ // entry THIS open created is removed (a later re-acquire may have replaced it).
106
+ store.catch(() => {
107
+ if (this.held.get(sessionId)?.store === store)
108
+ this.held.delete(sessionId);
109
+ });
110
+ return store;
111
+ }
112
+ /** Disposes and forgets the session's store, if any. A later acquire reopens. */
113
+ async release(sessionId) {
114
+ const entry = this.held.get(sessionId);
115
+ if (!entry)
116
+ return;
117
+ this.held.delete(sessionId);
118
+ await disposeQuietly(sessionId, entry.store);
119
+ }
120
+ /** Worker shutdown: dispose every held store. */
121
+ async releaseAll() {
122
+ const entries = [...this.held.entries()];
123
+ this.held.clear();
124
+ await Promise.all(entries.map(([sessionId, entry]) => disposeQuietly(sessionId, entry.store)));
125
+ }
126
+ /** How many stores are held — for assertions. */
127
+ get size() {
128
+ return this.held.size;
129
+ }
130
+ }
131
+ async function disposeQuietly(sessionId, store) {
132
+ try {
133
+ await (await store).dispose();
134
+ }
135
+ catch (err) {
136
+ // Best effort: a store whose open failed has nothing to dispose, and a
137
+ // dispose that fails on a dead handle changes nothing the session needs.
138
+ console.warn(`session-store: dispose failed for session=${sessionId}:`, err instanceof Error ? err.message : err);
139
+ }
140
+ }
141
+ const sessionStores = new SessionStores(async (location) => {
142
+ const { SqliteLocalAgentStore } = await import("@cursor/sdk/sqlite");
143
+ return SqliteLocalAgentStore.open(location);
144
+ });
145
+ /** The session's SDK store, opened on first use — pass as `local.store` on create AND resume. */
146
+ export function sessionStore(sessionId, workspaceRootDir) {
147
+ return sessionStores.acquire(sessionId, workspaceRootDir);
148
+ }
149
+ /** The session is done on this host (the adapter's `releaseSession`). */
150
+ export function releaseSessionStore(sessionId) {
151
+ return sessionStores.release(sessionId);
152
+ }
153
+ /** Worker shutdown (the adapter's `shutdown`). */
154
+ export function releaseAllSessionStores() {
155
+ return sessionStores.releaseAll();
156
+ }
157
+ //# sourceMappingURL=session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/session-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * A Cursor sub-agent's transcript, from the `task` tool's completed result to
3
+ * the canonical events that fold it (`harness/transcript/events.ts`), scoped
4
+ * to the sub-agent's own `subAgentId`.
5
+ *
6
+ * WHY THE TRANSCRIPT ARRIVES AS A BLOB. The Cursor SDK returns sub-agent work
7
+ * inside the `task` tool's completed event, not as streaming events with a
8
+ * distinct agent id. Re-verified 2026-08-23 on the pinned SDK (1.0.13) AND the
9
+ * latest (1.0.28), including the write side (stigmer/stigmer#839): an injected
10
+ * platform.eventStore/eventNotifier receives parent events only on 1.0.13 and
11
+ * is bypassed entirely on 1.0.28 (persistence moved into the executor daemon's
12
+ * own state dir); zero events reach the parent's run.stream() mid-task; the
13
+ * agentId in the task args is not a platform-store agent id at all, so it can
14
+ * never be addressable via Agent.listRuns / Agent.getRun (this is WHY the
15
+ * 2026-07-02 read-side polls all returned not-found). On 1.0.28 the child
16
+ * transcript lands at a deterministic path knowable at spawn
17
+ * (~/.cursor/projects/<slug>/agent-transcripts/<parentId>/subagents/<argsAgentId>.jsonl)
18
+ * but is flushed only at completion — verified with 200ms sampling across a
19
+ * full sub-agent run. Live nested visibility is therefore still an upstream
20
+ * SDK limitation — do not try to fake it here; the UI shows an elapsed-time
21
+ * affordance instead (SubAgentSection). This is Cursor's timing — the
22
+ * sub-agent's rows exist only at completion — and it stays Cursor's.
23
+ *
24
+ * THE SHAPE. The result is `{ status: "success", value: { conversationSteps } }`
25
+ * (or a bare `{ conversationSteps }`), where each ConversationStep is a
26
+ * protobuf-oneof object keyed DIRECTLY by its kind — there is NO
27
+ * `{ type, message }` envelope in production blobs, though the legacy `type`
28
+ * form is still read:
29
+ * - { thinkingMessage: { text, thinkingDurationMs? } }
30
+ * - { assistantMessage: { text } }
31
+ * - { toolCall: { toolCallId, <kind>ToolCall: { args, result } } }
32
+ * The tool family is the lone `<kind>ToolCall` sibling of `toolCallId`
33
+ * (`readToolCall`, `globToolCall`, `grepToolCall`, `shellToolCall`, …); the bare
34
+ * tool name is the suffix-stripped key, which feeds the shared `classifyTool`
35
+ * exactly like a top-level call. `result` is itself a oneof
36
+ * `{ success | error | permissionDenied | rejected }`. This is deliberately
37
+ * key-driven rather than an enumerated switch, so a new tool family the SDK
38
+ * adds surfaces automatically instead of being dropped. History: an earlier
39
+ * revision parsed a `{ type: "toolCall", message: { type, args, result } }`
40
+ * envelope that never appears in the real blob, so every sub-agent tool call
41
+ * was silently discarded and the UI showed a sub-agent that "did nothing".
42
+ *
43
+ * WHAT THIS MODULE EMITS, AND WHY EVENTS. Until #1097 this parser built
44
+ * `AgentMessage` protos itself (the conversation-steps extractor in the accumulator)
45
+ * — a third copy of the folding rule, whose message boundary drifted from the
46
+ * root's until then. Now each step becomes the events any harness's translator
47
+ * would emit for the same thing, and the shared `TranscriptBuilder` folds them
48
+ * with the root's own rules: an `assistantMessage` step is its own message
49
+ * (`runId` `<subAgentId>:step:<i>`, so two consecutive steps never merge); a
50
+ * `thinkingMessage` step a THINKING row under the same key; a `toolCall` step
51
+ * a `tool_started` then a `tool_finished`/`tool_error`, which the builder
52
+ * attaches to the transcript's current AI message (the assistant step that
53
+ * proposed it) or an empty one when there is none. Unknown step
54
+ * kinds and empty texts are skipped for forward compatibility. The rows carry
55
+ * no attribution or provenance (#1133).
56
+ *
57
+ * The `task` row's own `tool_finished` and the sub-agent's `sub_agent_finished`
58
+ * are the translator's (`translator.ts`); this module answers only "what
59
+ * happened inside".
60
+ */
61
+ import type { TranscriptEvent } from "../../harness/transcript/events.js";
62
+ /** The canonical events for one sub-agent's completed `conversationSteps`, all scoped to `subAgentId`. */
63
+ export declare function subAgentStepEvents(result: unknown, subAgentId: string): TranscriptEvent[];
64
+ /**
65
+ * A sub-agent tool call's `result` oneof as an outcome: `success` → completed
66
+ * with the serialized payload (a screenshot is canonicalized the same way as a
67
+ * top-level result); any failure branch → failed with the serialized detail
68
+ * (`error` alone — never a duplicate in `result`). An absent result is
69
+ * a completed call with no output — the SDK omits `result` for a call that
70
+ * reports nothing; an unknown oneof branch is surfaced as a completed result
71
+ * rather than dropped.
72
+ */
73
+ export declare function interpretSubAgentToolResult(result: unknown): {
74
+ status: "completed";
75
+ result: string;
76
+ } | {
77
+ status: "failed";
78
+ error: string;
79
+ };
@@ -0,0 +1,180 @@
1
+ /**
2
+ * A Cursor sub-agent's transcript, from the `task` tool's completed result to
3
+ * the canonical events that fold it (`harness/transcript/events.ts`), scoped
4
+ * to the sub-agent's own `subAgentId`.
5
+ *
6
+ * WHY THE TRANSCRIPT ARRIVES AS A BLOB. The Cursor SDK returns sub-agent work
7
+ * inside the `task` tool's completed event, not as streaming events with a
8
+ * distinct agent id. Re-verified 2026-08-23 on the pinned SDK (1.0.13) AND the
9
+ * latest (1.0.28), including the write side (stigmer/stigmer#839): an injected
10
+ * platform.eventStore/eventNotifier receives parent events only on 1.0.13 and
11
+ * is bypassed entirely on 1.0.28 (persistence moved into the executor daemon's
12
+ * own state dir); zero events reach the parent's run.stream() mid-task; the
13
+ * agentId in the task args is not a platform-store agent id at all, so it can
14
+ * never be addressable via Agent.listRuns / Agent.getRun (this is WHY the
15
+ * 2026-07-02 read-side polls all returned not-found). On 1.0.28 the child
16
+ * transcript lands at a deterministic path knowable at spawn
17
+ * (~/.cursor/projects/<slug>/agent-transcripts/<parentId>/subagents/<argsAgentId>.jsonl)
18
+ * but is flushed only at completion — verified with 200ms sampling across a
19
+ * full sub-agent run. Live nested visibility is therefore still an upstream
20
+ * SDK limitation — do not try to fake it here; the UI shows an elapsed-time
21
+ * affordance instead (SubAgentSection). This is Cursor's timing — the
22
+ * sub-agent's rows exist only at completion — and it stays Cursor's.
23
+ *
24
+ * THE SHAPE. The result is `{ status: "success", value: { conversationSteps } }`
25
+ * (or a bare `{ conversationSteps }`), where each ConversationStep is a
26
+ * protobuf-oneof object keyed DIRECTLY by its kind — there is NO
27
+ * `{ type, message }` envelope in production blobs, though the legacy `type`
28
+ * form is still read:
29
+ * - { thinkingMessage: { text, thinkingDurationMs? } }
30
+ * - { assistantMessage: { text } }
31
+ * - { toolCall: { toolCallId, <kind>ToolCall: { args, result } } }
32
+ * The tool family is the lone `<kind>ToolCall` sibling of `toolCallId`
33
+ * (`readToolCall`, `globToolCall`, `grepToolCall`, `shellToolCall`, …); the bare
34
+ * tool name is the suffix-stripped key, which feeds the shared `classifyTool`
35
+ * exactly like a top-level call. `result` is itself a oneof
36
+ * `{ success | error | permissionDenied | rejected }`. This is deliberately
37
+ * key-driven rather than an enumerated switch, so a new tool family the SDK
38
+ * adds surfaces automatically instead of being dropped. History: an earlier
39
+ * revision parsed a `{ type: "toolCall", message: { type, args, result } }`
40
+ * envelope that never appears in the real blob, so every sub-agent tool call
41
+ * was silently discarded and the UI showed a sub-agent that "did nothing".
42
+ *
43
+ * WHAT THIS MODULE EMITS, AND WHY EVENTS. Until #1097 this parser built
44
+ * `AgentMessage` protos itself (the conversation-steps extractor in the accumulator)
45
+ * — a third copy of the folding rule, whose message boundary drifted from the
46
+ * root's until then. Now each step becomes the events any harness's translator
47
+ * would emit for the same thing, and the shared `TranscriptBuilder` folds them
48
+ * with the root's own rules: an `assistantMessage` step is its own message
49
+ * (`runId` `<subAgentId>:step:<i>`, so two consecutive steps never merge); a
50
+ * `thinkingMessage` step a THINKING row under the same key; a `toolCall` step
51
+ * a `tool_started` then a `tool_finished`/`tool_error`, which the builder
52
+ * attaches to the transcript's current AI message (the assistant step that
53
+ * proposed it) or an empty one when there is none. Unknown step
54
+ * kinds and empty texts are skipped for forward compatibility. The rows carry
55
+ * no attribution or provenance (#1133).
56
+ *
57
+ * The `task` row's own `tool_finished` and the sub-agent's `sub_agent_finished`
58
+ * are the translator's (`translator.ts`); this module answers only "what
59
+ * happened inside".
60
+ */
61
+ import { canonicalizeImageResult } from "./tool-result.js";
62
+ /**
63
+ * The failure branches of a sub-agent tool call's `result` oneof. A completion
64
+ * is `{ success: ... }`; every other branch is a non-completion the UI must show
65
+ * as failed — an errored read/glob/grep (`error`), or a shell the approval gate
66
+ * stopped (`permissionDenied` / `rejected`).
67
+ */
68
+ const SUBAGENT_TOOL_RESULT_FAILURE_KEYS = new Set([
69
+ "error",
70
+ "permissionDenied",
71
+ "rejected",
72
+ ]);
73
+ /** The canonical events for one sub-agent's completed `conversationSteps`, all scoped to `subAgentId`. */
74
+ export function subAgentStepEvents(result, subAgentId) {
75
+ const steps = conversationStepsOf(result);
76
+ const out = [];
77
+ for (const [index, step] of steps.entries()) {
78
+ if (step == null || typeof step !== "object")
79
+ continue;
80
+ const s = step;
81
+ const type = s.type;
82
+ const runId = `${subAgentId}:step:${index}`;
83
+ if (type === "thinkingMessage" || s.thinkingMessage != null) {
84
+ const text = stepText(type === "thinkingMessage" ? s.message : s.thinkingMessage);
85
+ if (text) {
86
+ out.push({ kind: "message_start", runId, subAgentId });
87
+ out.push({ kind: "reasoning_delta", runId, text, subAgentId });
88
+ out.push({ kind: "message_finish", runId, subAgentId });
89
+ }
90
+ }
91
+ else if (type === "assistantMessage" || s.assistantMessage != null) {
92
+ const text = stepText(type === "assistantMessage" ? s.message : s.assistantMessage);
93
+ if (text) {
94
+ out.push({ kind: "message_start", runId, subAgentId });
95
+ out.push({ kind: "text_delta", runId, text, subAgentId });
96
+ out.push({ kind: "message_finish", runId, subAgentId });
97
+ }
98
+ }
99
+ else if (s.toolCall != null) {
100
+ out.push(...subAgentToolCallEvents(s.toolCall, index, subAgentId));
101
+ }
102
+ }
103
+ return out;
104
+ }
105
+ /** The `conversationSteps` array from the task result's envelope, or none. */
106
+ function conversationStepsOf(result) {
107
+ if (result == null || typeof result !== "object")
108
+ return [];
109
+ const r = result;
110
+ const value = r.value ?? r;
111
+ if (value == null || typeof value !== "object")
112
+ return [];
113
+ const steps = value.conversationSteps;
114
+ return Array.isArray(steps) ? steps : [];
115
+ }
116
+ function stepText(message) {
117
+ if (message == null || typeof message !== "object")
118
+ return "";
119
+ const text = message.text;
120
+ return typeof text === "string" ? text : "";
121
+ }
122
+ /**
123
+ * One `toolCall` step as a started row and its outcome. The SDK's real call id
124
+ * keeps the row stable across resumes and distinct from its siblings; a
125
+ * synthetic `sub-<name>-<stepIndex>` stands in only when the SDK omits one.
126
+ * A step with no `<kind>ToolCall` key (malformed or forward-incompatible) emits
127
+ * nothing rather than a blank, nameless row.
128
+ */
129
+ function subAgentToolCallEvents(toolCall, stepIndex, subAgentId) {
130
+ if (toolCall == null || typeof toolCall !== "object")
131
+ return [];
132
+ const obj = toolCall;
133
+ const kindKey = Object.keys(obj).find((k) => k !== "toolCallId" && k.endsWith("ToolCall"));
134
+ if (!kindKey)
135
+ return [];
136
+ const name = kindKey.slice(0, -"ToolCall".length);
137
+ const inner = obj[kindKey] != null && typeof obj[kindKey] === "object"
138
+ ? obj[kindKey]
139
+ : {};
140
+ const callId = typeof obj.toolCallId === "string" && obj.toolCallId
141
+ ? obj.toolCallId
142
+ : `sub-${name}-${stepIndex}`;
143
+ const input = inner.args != null && typeof inner.args === "object"
144
+ ? inner.args
145
+ : {};
146
+ const outcome = interpretSubAgentToolResult(inner.result);
147
+ return [
148
+ { kind: "tool_started", callId, name, input, mcpServerSlug: "", subAgentId },
149
+ outcome.status === "completed"
150
+ ? { kind: "tool_finished", callId, result: outcome.result, subAgentId }
151
+ : { kind: "tool_error", callId, message: outcome.error, subAgentId },
152
+ ];
153
+ }
154
+ /**
155
+ * A sub-agent tool call's `result` oneof as an outcome: `success` → completed
156
+ * with the serialized payload (a screenshot is canonicalized the same way as a
157
+ * top-level result); any failure branch → failed with the serialized detail
158
+ * (`error` alone — never a duplicate in `result`). An absent result is
159
+ * a completed call with no output — the SDK omits `result` for a call that
160
+ * reports nothing; an unknown oneof branch is surfaced as a completed result
161
+ * rather than dropped.
162
+ */
163
+ export function interpretSubAgentToolResult(result) {
164
+ if (result == null || typeof result !== "object") {
165
+ return { status: "completed", result: "" };
166
+ }
167
+ const r = result;
168
+ if ("success" in r) {
169
+ const val = r.success;
170
+ const str = canonicalizeImageResult(val) ?? (typeof val === "string" ? val : JSON.stringify(val));
171
+ return { status: "completed", result: str };
172
+ }
173
+ const failKey = Object.keys(r).find((k) => SUBAGENT_TOOL_RESULT_FAILURE_KEYS.has(k));
174
+ if (failKey) {
175
+ const val = r[failKey];
176
+ return { status: "failed", error: typeof val === "string" ? val : JSON.stringify(val) };
177
+ }
178
+ return { status: "completed", result: JSON.stringify(r) };
179
+ }
180
+ //# sourceMappingURL=sub-agent-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sub-agent-steps.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/sub-agent-steps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * The Cursor harness's rendering of a tool result into the one string a
3
+ * transcript row carries — the translator's half of `tool_finished.result`
4
+ * (`harness/transcript/events.ts`): the engine's output envelope is the
5
+ * harness's to unwrap, the builder stores what it is handed, and the persist
6
+ * chokepoint bounds it. Native's twin is
7
+ * `extractToolResult` in `execute-deep-agent/translator.ts` (the LangChain
8
+ * ToolMessage envelope and the LangGraph Command).
9
+ *
10
+ * Its own module because two readers need it — the translator for a root
11
+ * row's result, `sub-agent-steps.ts` for a sub-agent's — and the second would
12
+ * otherwise import the first, which imports the second. Moved from
13
+ * `message-translator.ts` verbatim.
14
+ */
15
+ /**
16
+ * Normalize a tool_call event result into a string for the ToolCall proto.
17
+ * Returns "" for an absent result so callers can treat "no result yet" and
18
+ * "empty result" uniformly (e.g. to avoid clobbering a captured result).
19
+ *
20
+ * The one non-passthrough case is a multimodal MCP result (e.g. a computer-use
21
+ * screenshot): see {@link canonicalizeImageResult}. Everything else is the
22
+ * string as-is, or a whole-value JSON.stringify — byte-identical to before.
23
+ */
24
+ export declare function toResultString(result: unknown): string;
25
+ /**
26
+ * Re-emit a Cursor MCP result that carries an image block as the canonical
27
+ * top-level content-block array the persist-time offload understands.
28
+ *
29
+ * The Cursor SDK wraps an MCP tool result as `{ status, value: { content: [...] } }`
30
+ * (or a bare `{ content: [...] }`), where an image block is
31
+ * `{ image: { data, mimeType } }` and `data` is a Node Buffer-JSON
32
+ * (`{ type:"Buffer", data:number[] }`). Persisting that envelope verbatim buries
33
+ * the image where `detectImagePayload`/`contentBlocks` (shared/status-offload.ts)
34
+ * cannot see it, so the screenshot lands as `text/plain` instead of a renderable
35
+ * `ToolCallOutputRef`.
36
+ *
37
+ * This mirrors `serializeToolContent` in the deep-agent path
38
+ * (harness/transcript/tool-result.ts): the harness adapter normalizes
39
+ * its own wire shape into the canonical array
40
+ * `[{ type:"text", text }, { type:"image", data:<base64>, mimeType }]`
41
+ * so the shared offload stays harness-agnostic (its envelope handling is
42
+ * documented there as insurance, not the primary path). Buffer-JSON is decoded
43
+ * to base64 here so the bloated byte-array never propagates into the status.
44
+ *
45
+ * Returns undefined when there is no content array or no image block, so the
46
+ * caller falls back to its existing serialization (no change for text/error
47
+ * results).
48
+ */
49
+ export declare function canonicalizeImageResult(result: unknown): string | undefined;
@@ -0,0 +1,130 @@
1
+ /**
2
+ * The Cursor harness's rendering of a tool result into the one string a
3
+ * transcript row carries — the translator's half of `tool_finished.result`
4
+ * (`harness/transcript/events.ts`): the engine's output envelope is the
5
+ * harness's to unwrap, the builder stores what it is handed, and the persist
6
+ * chokepoint bounds it. Native's twin is
7
+ * `extractToolResult` in `execute-deep-agent/translator.ts` (the LangChain
8
+ * ToolMessage envelope and the LangGraph Command).
9
+ *
10
+ * Its own module because two readers need it — the translator for a root
11
+ * row's result, `sub-agent-steps.ts` for a sub-agent's — and the second would
12
+ * otherwise import the first, which imports the second. Moved from
13
+ * `message-translator.ts` verbatim.
14
+ */
15
+ /**
16
+ * Normalize a tool_call event result into a string for the ToolCall proto.
17
+ * Returns "" for an absent result so callers can treat "no result yet" and
18
+ * "empty result" uniformly (e.g. to avoid clobbering a captured result).
19
+ *
20
+ * The one non-passthrough case is a multimodal MCP result (e.g. a computer-use
21
+ * screenshot): see {@link canonicalizeImageResult}. Everything else is the
22
+ * string as-is, or a whole-value JSON.stringify — byte-identical to before.
23
+ */
24
+ export function toResultString(result) {
25
+ if (result == null)
26
+ return "";
27
+ if (typeof result === "string")
28
+ return result;
29
+ const canonical = canonicalizeImageResult(result);
30
+ if (canonical !== undefined)
31
+ return canonical;
32
+ return JSON.stringify(result);
33
+ }
34
+ /**
35
+ * Re-emit a Cursor MCP result that carries an image block as the canonical
36
+ * top-level content-block array the persist-time offload understands.
37
+ *
38
+ * The Cursor SDK wraps an MCP tool result as `{ status, value: { content: [...] } }`
39
+ * (or a bare `{ content: [...] }`), where an image block is
40
+ * `{ image: { data, mimeType } }` and `data` is a Node Buffer-JSON
41
+ * (`{ type:"Buffer", data:number[] }`). Persisting that envelope verbatim buries
42
+ * the image where `detectImagePayload`/`contentBlocks` (shared/status-offload.ts)
43
+ * cannot see it, so the screenshot lands as `text/plain` instead of a renderable
44
+ * `ToolCallOutputRef`.
45
+ *
46
+ * This mirrors `serializeToolContent` in the deep-agent path
47
+ * (harness/transcript/tool-result.ts): the harness adapter normalizes
48
+ * its own wire shape into the canonical array
49
+ * `[{ type:"text", text }, { type:"image", data:<base64>, mimeType }]`
50
+ * so the shared offload stays harness-agnostic (its envelope handling is
51
+ * documented there as insurance, not the primary path). Buffer-JSON is decoded
52
+ * to base64 here so the bloated byte-array never propagates into the status.
53
+ *
54
+ * Returns undefined when there is no content array or no image block, so the
55
+ * caller falls back to its existing serialization (no change for text/error
56
+ * results).
57
+ */
58
+ export function canonicalizeImageResult(result) {
59
+ if (result == null || typeof result !== "object")
60
+ return undefined;
61
+ const blocks = resultContentBlocks(result);
62
+ if (!blocks)
63
+ return undefined;
64
+ const canonical = [];
65
+ let sawImage = false;
66
+ for (const block of blocks) {
67
+ if (!block || typeof block !== "object")
68
+ continue;
69
+ const b = block;
70
+ if (b.image && typeof b.image === "object") {
71
+ const img = b.image;
72
+ const base64 = imageDataToBase64(img.data);
73
+ if (base64) {
74
+ const mimeType = typeof img.mimeType === "string" ? img.mimeType : "image/png";
75
+ canonical.push({ type: "image", data: base64, mimeType });
76
+ sawImage = true;
77
+ continue;
78
+ }
79
+ }
80
+ const text = blockText(b);
81
+ if (text !== undefined)
82
+ canonical.push({ type: "text", text });
83
+ }
84
+ return sawImage ? JSON.stringify(canonical) : undefined;
85
+ }
86
+ /** Extract the content-block array from a Cursor result envelope or a bare one. */
87
+ function resultContentBlocks(obj) {
88
+ const value = obj.value;
89
+ if (value && typeof value === "object" && Array.isArray(value.content)) {
90
+ return value.content;
91
+ }
92
+ if (Array.isArray(obj.content))
93
+ return obj.content;
94
+ return undefined;
95
+ }
96
+ /**
97
+ * Decode an image block's `data` to plain base64. Accepts a Node Buffer-JSON
98
+ * (`{ type:"Buffer", data:number[] }`, how the Cursor SDK serializes bytes), a
99
+ * `data:` URL, or an already-base64 string. Returns undefined for anything else.
100
+ */
101
+ function imageDataToBase64(data) {
102
+ if (data && typeof data === "object") {
103
+ const d = data;
104
+ if (d.type === "Buffer" && Array.isArray(d.data)) {
105
+ try {
106
+ return Buffer.from(d.data).toString("base64");
107
+ }
108
+ catch {
109
+ return undefined;
110
+ }
111
+ }
112
+ return undefined;
113
+ }
114
+ if (typeof data === "string" && data) {
115
+ const dataUrl = data.match(/^data:image\/[a-zA-Z0-9.+-]+;base64,([\s\S]+)$/);
116
+ return (dataUrl ? dataUrl[1] : data).replace(/\s+/g, "");
117
+ }
118
+ return undefined;
119
+ }
120
+ /** Extract the text from a Cursor content block: `{ text:{text} }` or `{ text }`. */
121
+ function blockText(b) {
122
+ const t = b.text;
123
+ if (typeof t === "string")
124
+ return t;
125
+ if (t && typeof t === "object" && typeof t.text === "string") {
126
+ return t.text;
127
+ }
128
+ return undefined;
129
+ }
130
+ //# sourceMappingURL=tool-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-result.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/tool-result.ts"],"names":[],"mappings":"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"}