@stigmer/runner 3.15.3-dev.20260914121148 → 3.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (592) hide show
  1. package/README.md +2 -1
  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 +2 -2
  12. package/dist/activities/execute-cursor/__test-utils__/fold.d.ts +61 -0
  13. package/dist/activities/execute-cursor/__test-utils__/fold.js +94 -0
  14. package/dist/activities/execute-cursor/__test-utils__/fold.js.map +1 -0
  15. package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js +1 -1
  16. package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js.map +1 -1
  17. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +47 -12
  18. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +41 -10
  19. package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
  20. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.d.ts +15 -6
  21. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js +17 -4
  22. package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js.map +1 -1
  23. package/dist/activities/execute-cursor/adapter.d.ts +4 -4
  24. package/dist/activities/execute-cursor/adapter.js +4 -4
  25. package/dist/activities/execute-cursor/approval-policy.d.ts +10 -10
  26. package/dist/activities/execute-cursor/approval-policy.js +12 -23
  27. package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
  28. package/dist/activities/execute-cursor/approval-state.d.ts +35 -1
  29. package/dist/activities/execute-cursor/approval-state.js +65 -0
  30. package/dist/activities/execute-cursor/approval-state.js.map +1 -1
  31. package/dist/activities/execute-cursor/{message-translator.d.ts → boundary-rows.d.ts} +45 -341
  32. package/dist/activities/execute-cursor/boundary-rows.js +1018 -0
  33. package/dist/activities/execute-cursor/boundary-rows.js.map +1 -0
  34. package/dist/activities/execute-cursor/cursor-capabilities.d.ts +1 -1
  35. package/dist/activities/execute-cursor/cursor-capabilities.js +1 -1
  36. package/dist/activities/execute-cursor/cursor-event-recorder.d.ts +33 -14
  37. package/dist/activities/execute-cursor/cursor-event-recorder.js +43 -21
  38. package/dist/activities/execute-cursor/cursor-event-recorder.js.map +1 -1
  39. package/dist/activities/execute-cursor/prompt-builder.d.ts +3 -3
  40. package/dist/activities/execute-cursor/prompt-builder.js +4 -4
  41. package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
  42. package/dist/activities/execute-cursor/service-tier.js +1 -2
  43. package/dist/activities/execute-cursor/service-tier.js.map +1 -1
  44. package/dist/activities/execute-cursor/sub-agent-steps.d.ts +79 -0
  45. package/dist/activities/execute-cursor/sub-agent-steps.js +180 -0
  46. package/dist/activities/execute-cursor/sub-agent-steps.js.map +1 -0
  47. package/dist/activities/execute-cursor/tool-result.d.ts +49 -0
  48. package/dist/activities/execute-cursor/tool-result.js +130 -0
  49. package/dist/activities/execute-cursor/tool-result.js.map +1 -0
  50. package/dist/activities/execute-cursor/translator.d.ts +178 -0
  51. package/dist/activities/execute-cursor/translator.js +485 -0
  52. package/dist/activities/execute-cursor/translator.js.map +1 -0
  53. package/dist/activities/execute-cursor/turn-boundary.d.ts +15 -5
  54. package/dist/activities/execute-cursor/turn-boundary.js +10 -14
  55. package/dist/activities/execute-cursor/turn-boundary.js.map +1 -1
  56. package/dist/activities/execute-cursor/turn-settle.d.ts +11 -7
  57. package/dist/activities/execute-cursor/turn-settle.js +47 -34
  58. package/dist/activities/execute-cursor/turn-settle.js.map +1 -1
  59. package/dist/activities/execute-cursor/turn-setup.d.ts +2 -2
  60. package/dist/activities/execute-cursor/turn-setup.js +5 -5
  61. package/dist/activities/execute-cursor/turn-setup.js.map +1 -1
  62. package/dist/activities/execute-cursor/turn-stream.d.ts +23 -14
  63. package/dist/activities/execute-cursor/turn-stream.js +41 -28
  64. package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
  65. package/dist/activities/execute-cursor/turn.d.ts +4 -4
  66. package/dist/activities/execute-cursor/turn.js +5 -5
  67. package/dist/activities/execute-cursor/usage-pricing.d.ts +2 -2
  68. package/dist/activities/execute-cursor/usage-pricing.js +2 -2
  69. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.d.ts +2 -2
  70. package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js +2 -2
  71. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +16 -11
  72. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +22 -10
  73. package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -1
  74. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js +1 -1
  75. package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js.map +1 -1
  76. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.d.ts +2 -3
  77. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js +2 -3
  78. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js.map +1 -1
  79. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +12 -3
  80. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +18 -4
  81. package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
  82. package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.d.ts +10 -1
  83. package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js +24 -11
  84. package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js.map +1 -1
  85. package/dist/activities/execute-deep-agent/adapter.d.ts +1 -1
  86. package/dist/activities/execute-deep-agent/adapter.js +1 -1
  87. package/dist/activities/execute-deep-agent/approval-file-change.d.ts +19 -19
  88. package/dist/activities/execute-deep-agent/approval-file-change.js +16 -15
  89. package/dist/activities/execute-deep-agent/approval-file-change.js.map +1 -1
  90. package/dist/activities/execute-deep-agent/deep-agent-capabilities.d.ts +2 -2
  91. package/dist/activities/execute-deep-agent/deep-agent-capabilities.js +2 -2
  92. package/dist/activities/execute-deep-agent/hitl.d.ts +2 -2
  93. package/dist/activities/execute-deep-agent/hitl.js +2 -2
  94. package/dist/activities/execute-deep-agent/inline-publisher.d.ts +13 -3
  95. package/dist/activities/execute-deep-agent/inline-publisher.js +3 -3
  96. package/dist/activities/execute-deep-agent/inline-publisher.js.map +1 -1
  97. package/dist/activities/execute-deep-agent/prompt-builder.d.ts +3 -3
  98. package/dist/activities/execute-deep-agent/prompt-builder.js +6 -7
  99. package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
  100. package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +16 -8
  101. package/dist/activities/execute-deep-agent/streaming-side-effects.js +20 -33
  102. package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
  103. package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +3 -3
  104. package/dist/activities/execute-deep-agent/subagent-transformer.js +1 -1
  105. package/dist/activities/execute-deep-agent/translator.d.ts +134 -0
  106. package/dist/activities/execute-deep-agent/translator.js +418 -0
  107. package/dist/activities/execute-deep-agent/translator.js.map +1 -0
  108. package/dist/activities/execute-deep-agent/turn-settle.d.ts +13 -7
  109. package/dist/activities/execute-deep-agent/turn-settle.js +34 -45
  110. package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -1
  111. package/dist/activities/execute-deep-agent/turn-setup.d.ts +8 -8
  112. package/dist/activities/execute-deep-agent/turn-setup.js +7 -7
  113. package/dist/activities/execute-deep-agent/turn-stream.d.ts +13 -10
  114. package/dist/activities/execute-deep-agent/turn-stream.js +44 -41
  115. package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -1
  116. package/dist/activities/execute-deep-agent/turn.d.ts +3 -3
  117. package/dist/activities/execute-deep-agent/turn.js +3 -3
  118. package/dist/activities/generate-session-subject.d.ts +25 -4
  119. package/dist/activities/generate-session-subject.js +17 -7
  120. package/dist/activities/generate-session-subject.js.map +1 -1
  121. package/dist/client/stigmer-client.d.ts +17 -6
  122. package/dist/client/stigmer-client.js +47 -14
  123. package/dist/client/stigmer-client.js.map +1 -1
  124. package/dist/config.d.ts +6 -3
  125. package/dist/config.js +4 -1
  126. package/dist/config.js.map +1 -1
  127. package/dist/harness/approval-decisions.d.ts +1 -1
  128. package/dist/harness/approval-decisions.js +1 -1
  129. package/dist/harness/capabilities.d.ts +21 -11
  130. package/dist/harness/capabilities.js +2 -2
  131. package/dist/harness/capture.d.ts +4 -4
  132. package/dist/harness/capture.js +4 -4
  133. package/dist/harness/persist-chokepoint.d.ts +3 -3
  134. package/dist/harness/persist-chokepoint.js +3 -3
  135. package/dist/harness/registry.d.ts +2 -2
  136. package/dist/harness/registry.js +2 -2
  137. package/dist/harness/run-turn.d.ts +6 -4
  138. package/dist/harness/run-turn.js +31 -9
  139. package/dist/harness/run-turn.js.map +1 -1
  140. package/dist/harness/stop-controller.d.ts +1 -1
  141. package/dist/harness/stop-controller.js +1 -1
  142. package/dist/harness/terminal-table.d.ts +7 -7
  143. package/dist/harness/terminal-table.js +7 -7
  144. package/dist/harness/transcript/builder.d.ts +182 -0
  145. package/dist/harness/transcript/builder.js +693 -0
  146. package/dist/harness/transcript/builder.js.map +1 -0
  147. package/dist/harness/transcript/events.d.ts +218 -0
  148. package/dist/harness/transcript/events.js +50 -0
  149. package/dist/harness/transcript/events.js.map +1 -0
  150. package/dist/harness/transcript/state.d.ts +110 -0
  151. package/dist/harness/transcript/state.js +148 -0
  152. package/dist/harness/transcript/state.js.map +1 -0
  153. package/dist/harness/turn-context.d.ts +54 -38
  154. package/dist/harness/turn-context.js +42 -43
  155. package/dist/harness/turn-context.js.map +1 -1
  156. package/dist/harness/types.d.ts +63 -22
  157. package/dist/harness/types.js +12 -11
  158. package/dist/harness/types.js.map +1 -1
  159. package/dist/harness/usage-accumulator.d.ts +2 -2
  160. package/dist/harness/usage-accumulator.js +2 -2
  161. package/dist/harness-adapters.d.ts +5 -4
  162. package/dist/harness-adapters.js +5 -4
  163. package/dist/harness-adapters.js.map +1 -1
  164. package/dist/interceptors/run-credential-activity.d.ts +28 -0
  165. package/dist/interceptors/run-credential-activity.js +56 -0
  166. package/dist/interceptors/run-credential-activity.js.map +1 -0
  167. package/dist/middleware/approval-gate.d.ts +6 -0
  168. package/dist/middleware/approval-gate.js +7 -57
  169. package/dist/middleware/approval-gate.js.map +1 -1
  170. package/dist/middleware/cost-advisory.d.ts +3 -3
  171. package/dist/middleware/cost-advisory.js +3 -3
  172. package/dist/middleware/index.d.ts +1 -1
  173. package/dist/middleware/index.js +1 -1
  174. package/dist/runner-manager.js +10 -4
  175. package/dist/runner-manager.js.map +1 -1
  176. package/dist/shared/activity-input.d.ts +9 -0
  177. package/dist/shared/activity-input.js +17 -0
  178. package/dist/shared/activity-input.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-zip.d.ts +2 -2
  188. package/dist/shared/attachment-zip.js +2 -2
  189. package/dist/shared/channel-attachment.d.ts +8 -5
  190. package/dist/shared/channel-attachment.js +10 -6
  191. package/dist/shared/channel-attachment.js.map +1 -1
  192. package/dist/shared/cost-guard.d.ts +2 -2
  193. package/dist/shared/cost-guard.js +2 -2
  194. package/dist/shared/exact-apply.d.ts +1 -1
  195. package/dist/shared/exact-apply.js +1 -1
  196. package/dist/shared/execution-context.d.ts +2 -2
  197. package/dist/shared/execution-context.js +2 -2
  198. package/dist/shared/extract-structured-output.d.ts +2 -2
  199. package/dist/shared/extract-structured-output.js +2 -2
  200. package/dist/shared/filereview/cas-touched.d.ts +2 -2
  201. package/dist/shared/filereview/cas-touched.js +2 -2
  202. package/dist/shared/filereview/progress.d.ts +13 -0
  203. package/dist/shared/filereview/progress.js +13 -0
  204. package/dist/shared/filereview/progress.js.map +1 -1
  205. package/dist/shared/heartbeat.d.ts +1 -1
  206. package/dist/shared/heartbeat.js +1 -1
  207. package/dist/shared/llm-backend.d.ts +0 -4
  208. package/dist/shared/llm-backend.js +0 -4
  209. package/dist/shared/llm-backend.js.map +1 -1
  210. package/dist/shared/memory-attachment.d.ts +16 -9
  211. package/dist/shared/memory-attachment.js +18 -10
  212. package/dist/shared/memory-attachment.js.map +1 -1
  213. package/dist/shared/model-error.d.ts +1 -2
  214. package/dist/shared/model-error.js +1 -2
  215. package/dist/shared/model-error.js.map +1 -1
  216. package/dist/shared/persist-decision.d.ts +18 -24
  217. package/dist/shared/persist-decision.js +19 -11
  218. package/dist/shared/persist-decision.js.map +1 -1
  219. package/dist/shared/prompt-sections.d.ts +4 -4
  220. package/dist/shared/prompt-sections.js +4 -4
  221. package/dist/shared/run-credential-store.d.ts +32 -0
  222. package/dist/shared/run-credential-store.js +39 -0
  223. package/dist/shared/run-credential-store.js.map +1 -0
  224. package/dist/shared/run-credential.d.ts +61 -0
  225. package/dist/shared/run-credential.js +68 -0
  226. package/dist/shared/run-credential.js.map +1 -0
  227. package/dist/shared/skill-resolver.d.ts +3 -3
  228. package/dist/shared/skill-resolver.js +3 -3
  229. package/dist/shared/status-offload.d.ts +1 -1
  230. package/dist/shared/status-offload.js +2 -2
  231. package/dist/shared/status-offload.js.map +1 -1
  232. package/dist/shared/streaming-scheduler.d.ts +2 -7
  233. package/dist/shared/streaming-scheduler.js +6 -14
  234. package/dist/shared/streaming-scheduler.js.map +1 -1
  235. package/dist/shared/subagent-rows.d.ts +2 -2
  236. package/dist/shared/subagent-rows.js +2 -2
  237. package/dist/shared/synthesized-attachment.d.ts +30 -3
  238. package/dist/shared/synthesized-attachment.js +26 -0
  239. package/dist/shared/synthesized-attachment.js.map +1 -1
  240. package/dist/shared/todos.d.ts +3 -3
  241. package/dist/shared/todos.js +3 -3
  242. package/dist/shared/tool-row.d.ts +19 -1
  243. package/dist/shared/tool-row.js +36 -2
  244. package/dist/shared/tool-row.js.map +1 -1
  245. package/dist/shared/worker-shutdown.d.ts +1 -1
  246. package/dist/shared/worker-shutdown.js +1 -1
  247. package/dist/shared/workspace/session-provision.d.ts +1 -1
  248. package/dist/shared/workspace/session-provision.js +1 -1
  249. package/dist/shared/workspace/sources/empty.d.ts +1 -1
  250. package/dist/shared/workspace/sources/empty.js +1 -2
  251. package/dist/shared/workspace/sources/empty.js.map +1 -1
  252. package/dist/shared/workspace/sources/git.js +4 -4
  253. package/dist/shared/workspace/sources/git.js.map +1 -1
  254. package/dist/shared/workspace/sources/local-path.js +6 -6
  255. package/dist/shared/workspace/sources/local-path.js.map +1 -1
  256. package/dist/shared/workspace/stigmer-link.d.ts +1 -1
  257. package/dist/shared/workspace/stigmer-link.js +1 -1
  258. package/dist/shared/workspace/types.d.ts +2 -5
  259. package/dist/shared/workspace/types.js +0 -6
  260. package/dist/shared/workspace/types.js.map +1 -1
  261. package/dist/shared/workspace/writeback-coordinator.d.ts +17 -4
  262. package/dist/shared/workspace/writeback-coordinator.js +7 -9
  263. package/dist/shared/workspace/writeback-coordinator.js.map +1 -1
  264. package/dist/worker.js +10 -3
  265. package/dist/worker.js.map +1 -1
  266. package/dist/workflow-source.d.ts +10 -0
  267. package/dist/workflow-source.js +12 -0
  268. package/dist/workflow-source.js.map +1 -1
  269. package/dist/workflows/execute-from-execution.d.ts +15 -0
  270. package/dist/workflows/execute-from-execution.js +11 -0
  271. package/dist/workflows/execute-from-execution.js.map +1 -1
  272. package/dist/workflows/index.d.ts +5 -3
  273. package/dist/workflows/index.js +5 -3
  274. package/dist/workflows/index.js.map +1 -1
  275. package/dist/workflows/interceptors/run-credential.d.ts +34 -0
  276. package/dist/workflows/interceptors/run-credential.js +71 -0
  277. package/dist/workflows/interceptors/run-credential.js.map +1 -0
  278. package/package.json +4 -4
  279. package/src/__test-utils__/__tests__/execution-record-barrier.test.ts +70 -0
  280. package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +35 -1
  281. package/src/__test-utils__/approval-contract/contract.ts +1 -1
  282. package/src/__test-utils__/approval-contract/types.ts +1 -1
  283. package/src/__test-utils__/harness-boot-order-child.ts +1 -1
  284. package/src/__test-utils__/harness-contract/contract.ts +8 -8
  285. package/src/__test-utils__/harness-contract/recording-sink.ts +11 -1
  286. package/src/__test-utils__/harness-contract/runtime-contract.ts +52 -16
  287. package/src/__test-utils__/harness-contract/scripted-adapter.ts +47 -43
  288. package/src/__test-utils__/hermetic-activity.ts +113 -9
  289. package/src/__test-utils__/model-registry-fixture.ts +31 -7
  290. package/src/__test-utils__/module-specifiers.ts +32 -3
  291. package/src/__tests__/harness-boot-order.test.ts +1 -1
  292. package/src/__tests__/harness-contract.test.ts +1 -1
  293. package/src/__tests__/run-credential-e2e.test.ts +233 -0
  294. package/src/__tests__/run-credential-registration.test.ts +80 -0
  295. package/src/__tests__/runner-manager.test.ts +1 -1
  296. package/src/activities/__tests__/generate-session-subject-wire.test.ts +119 -0
  297. package/src/activities/execute-cursor/__test-utils__/__tests__/scripted-double.test.ts +1 -1
  298. package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +2 -2
  299. package/src/activities/execute-cursor/__test-utils__/fold.ts +116 -0
  300. package/src/activities/execute-cursor/__test-utils__/gateway-substrate.ts +1 -1
  301. package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +67 -17
  302. package/src/activities/execute-cursor/__test-utils__/scripted-agent.ts +19 -5
  303. package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +2 -1
  304. package/src/activities/execute-cursor/__tests__/approval-state.test.ts +14 -21
  305. package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +3 -3
  306. package/src/activities/execute-cursor/__tests__/coarse-fingerprint.test.ts +2 -1
  307. package/src/activities/execute-cursor/__tests__/cursor-event-recorder.test.ts +142 -0
  308. package/src/activities/execute-cursor/__tests__/cursor-fetch-interceptor-bypass.test.ts +19 -8
  309. package/src/activities/execute-cursor/__tests__/cursor-sdk-auth-smoke.test.ts +10 -8
  310. package/src/activities/execute-cursor/__tests__/cursor-transcript-live.test.ts +298 -0
  311. package/src/activities/execute-cursor/__tests__/deny-gate-exact-apply.test.ts +4 -2
  312. package/src/activities/execute-cursor/__tests__/fetch-interceptor.test.ts +1 -1
  313. package/src/activities/execute-cursor/__tests__/hermetic/deny-and-retry.test.ts +1 -1
  314. package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +1 -1
  315. package/src/activities/execute-cursor/__tests__/hermetic/goldens/mcp-tool-call.status.json +71 -0
  316. package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-task-note.status.json +73 -0
  317. package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.error-delta.status.json +78 -0
  318. package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.output-first.status.json +72 -0
  319. package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.status.json +72 -0
  320. package/src/activities/execute-cursor/__tests__/hermetic/goldens/sub-agent-delegation.status.json +109 -0
  321. package/src/activities/execute-cursor/__tests__/hermetic/goldens/thinking-turn.status.json +78 -0
  322. package/src/activities/execute-cursor/__tests__/hermetic/goldens/todo-write.status.json +119 -0
  323. package/src/activities/execute-cursor/__tests__/hermetic/goldens/tool-error.status.json +68 -0
  324. package/src/activities/execute-cursor/__tests__/hermetic/goldens/tool-only-step.status.json +67 -0
  325. package/src/activities/execute-cursor/__tests__/hermetic/goldens/unattributed-hook-block.status.json +1 -1
  326. package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +7 -7
  327. package/src/activities/execute-cursor/__tests__/hermetic/mcp-tool-call.test.ts +146 -0
  328. package/src/activities/execute-cursor/__tests__/hermetic/pause-vs-shutdown.test.ts +5 -5
  329. package/src/activities/execute-cursor/__tests__/hermetic/plain-turn.test.ts +2 -1
  330. package/src/activities/execute-cursor/__tests__/hermetic/run-wait-arms.test.ts +2 -1
  331. package/src/activities/execute-cursor/__tests__/hermetic/sdk-task-note.test.ts +122 -0
  332. package/src/activities/execute-cursor/__tests__/hermetic/shell-output-delta.test.ts +276 -0
  333. package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +8 -8
  334. package/src/activities/execute-cursor/__tests__/hermetic/sub-agent-delegation.test.ts +196 -0
  335. package/src/activities/execute-cursor/__tests__/hermetic/thinking-turn.test.ts +145 -0
  336. package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +1 -1
  337. package/src/activities/execute-cursor/__tests__/hermetic/todo-write.test.ts +165 -0
  338. package/src/activities/execute-cursor/__tests__/hermetic/tool-call.test.ts +3 -3
  339. package/src/activities/execute-cursor/__tests__/hermetic/tool-error.test.ts +138 -0
  340. package/src/activities/execute-cursor/__tests__/hermetic/tool-only-step.test.ts +130 -0
  341. package/src/activities/execute-cursor/__tests__/hermetic/unattributed-hook-block.test.ts +13 -1
  342. package/src/activities/execute-cursor/__tests__/hermetic/workspace-lock-timeout.test.ts +2 -2
  343. package/src/activities/execute-cursor/__tests__/hitl-ledger.test.ts +43 -60
  344. package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +23 -28
  345. package/src/activities/execute-cursor/__tests__/hook-script.test.ts +2 -1
  346. package/src/activities/execute-cursor/__tests__/http2-interceptor.test.ts +1 -1
  347. package/src/activities/execute-cursor/__tests__/prompt-goldens.test.ts +5 -5
  348. package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +11 -13
  349. package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +8 -11
  350. package/src/activities/execute-cursor/__tests__/tool-result-image.test.ts +8 -22
  351. package/src/activities/execute-cursor/__tests__/translator.test.ts +594 -0
  352. package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +8 -5
  353. package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +87 -63
  354. package/src/activities/execute-cursor/adapter.ts +4 -4
  355. package/src/activities/execute-cursor/approval-policy.ts +12 -24
  356. package/src/activities/execute-cursor/approval-state.ts +66 -1
  357. package/src/activities/execute-cursor/boundary-rows.ts +1132 -0
  358. package/src/activities/execute-cursor/cursor-capabilities.ts +1 -1
  359. package/src/activities/execute-cursor/cursor-event-recorder.ts +57 -28
  360. package/src/activities/execute-cursor/fetch-interceptor.ts +1 -1
  361. package/src/activities/execute-cursor/http2-interceptor.ts +1 -1
  362. package/src/activities/execute-cursor/prompt-builder.ts +6 -6
  363. package/src/activities/execute-cursor/service-tier.ts +1 -2
  364. package/src/activities/execute-cursor/sub-agent-steps.ts +188 -0
  365. package/src/activities/execute-cursor/tool-result.ts +128 -0
  366. package/src/activities/execute-cursor/translator.ts +541 -0
  367. package/src/activities/execute-cursor/turn-boundary.ts +21 -14
  368. package/src/activities/execute-cursor/turn-settle.ts +46 -34
  369. package/src/activities/execute-cursor/turn-setup.ts +5 -5
  370. package/src/activities/execute-cursor/turn-stream.ts +49 -46
  371. package/src/activities/execute-cursor/turn.ts +5 -5
  372. package/src/activities/execute-cursor/usage-pricing.ts +2 -2
  373. package/src/activities/execute-deep-agent/__test-utils__/contract-subject.ts +2 -2
  374. package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +23 -11
  375. package/src/activities/execute-deep-agent/__test-utils__/hitl-script.ts +1 -1
  376. package/src/activities/execute-deep-agent/__test-utils__/scripted-model-module.ts +2 -3
  377. package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +25 -4
  378. package/src/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.ts +25 -11
  379. package/src/activities/execute-deep-agent/__tests__/adapter-graph-is-sdk-free.test.ts +1 -1
  380. package/src/activities/execute-deep-agent/__tests__/adapter-is-temporal-free.test.ts +1 -1
  381. package/src/activities/execute-deep-agent/__tests__/approval-file-change.test.ts +6 -17
  382. package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +25 -8
  383. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn1.status.json +2 -7
  384. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn2.status.json +4 -14
  385. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve.turn2.status.json +1 -5
  386. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +4 -7
  387. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/gate.turn1.status.json +1 -5
  388. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +2 -9
  389. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +2 -9
  390. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.after-tool.status.json +1 -4
  391. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.mid-tool.status.json +1 -4
  392. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/platform-stop.status.json +1 -4
  393. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +109 -76
  394. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/reject.turn2.status.json +1 -5
  395. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn2.status.json +2 -10
  396. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn3.status.json +2 -10
  397. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/skip.turn2.status.json +1 -5
  398. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sub-agent-delegation.status.json +3 -6
  399. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/tool-call.status.json +1 -4
  400. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/worker-shutdown.status.json +1 -4
  401. package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/write-todos.status.json +92 -0
  402. package/src/activities/execute-deep-agent/__tests__/hermetic/harness-contract.test.ts +3 -3
  403. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-approve-all-lease.test.ts +9 -5
  404. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-round-trips.test.ts +3 -3
  405. package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-sequential-gates.test.ts +3 -3
  406. package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +7 -6
  407. package/src/activities/execute-deep-agent/__tests__/hermetic/pause-vs-shutdown.test.ts +10 -11
  408. package/src/activities/execute-deep-agent/__tests__/hermetic/plain-turn.test.ts +4 -4
  409. package/src/activities/execute-deep-agent/__tests__/hermetic/platform-stop.test.ts +9 -8
  410. package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +21 -13
  411. package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +2 -2
  412. package/src/activities/execute-deep-agent/__tests__/hermetic/structured-output.test.ts +7 -7
  413. package/src/activities/execute-deep-agent/__tests__/hermetic/sub-agent-delegation.test.ts +28 -12
  414. package/src/activities/execute-deep-agent/__tests__/hermetic/tool-call.test.ts +21 -21
  415. package/src/activities/execute-deep-agent/__tests__/hermetic/workspace-lock-timeout.test.ts +5 -5
  416. package/src/activities/execute-deep-agent/__tests__/hermetic/write-todos.test.ts +160 -0
  417. package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +35 -30
  418. package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +3 -4
  419. package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +12 -10
  420. package/src/activities/execute-deep-agent/__tests__/scripted-model.test.ts +13 -3
  421. package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +26 -18
  422. package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +1 -1
  423. package/src/activities/execute-deep-agent/__tests__/{subagent-tracker.test.ts → translator-subagents.test.ts} +76 -57
  424. package/src/activities/execute-deep-agent/__tests__/{v3-status-builder.test.ts → translator-through-builder.test.ts} +213 -299
  425. package/src/activities/execute-deep-agent/__tests__/translator.test.ts +505 -0
  426. package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +11 -29
  427. package/src/activities/execute-deep-agent/adapter.ts +1 -1
  428. package/src/activities/execute-deep-agent/approval-file-change.ts +20 -22
  429. package/src/activities/execute-deep-agent/deep-agent-capabilities.ts +2 -2
  430. package/src/activities/execute-deep-agent/hitl.ts +2 -2
  431. package/src/activities/execute-deep-agent/inline-publisher.ts +16 -5
  432. package/src/activities/execute-deep-agent/prompt-builder.ts +6 -7
  433. package/src/activities/execute-deep-agent/streaming-side-effects.ts +22 -31
  434. package/src/activities/execute-deep-agent/subagent-transformer.ts +3 -3
  435. package/src/activities/execute-deep-agent/translator.ts +463 -0
  436. package/src/activities/execute-deep-agent/turn-settle.ts +35 -43
  437. package/src/activities/execute-deep-agent/turn-setup.ts +8 -8
  438. package/src/activities/execute-deep-agent/turn-stream.ts +53 -51
  439. package/src/activities/execute-deep-agent/turn.ts +3 -3
  440. package/src/activities/generate-session-subject.ts +29 -4
  441. package/src/client/__tests__/stigmer-client.test.ts +92 -0
  442. package/src/client/stigmer-client.ts +48 -14
  443. package/src/config.ts +6 -3
  444. package/src/harness/README.md +335 -0
  445. package/src/harness/__tests__/approval-decisions.test.ts +2 -2
  446. package/src/harness/__tests__/capture.test.ts +3 -3
  447. package/src/harness/__tests__/import-direction.test.ts +3 -2
  448. package/src/harness/__tests__/mount-skills.test.ts +4 -1
  449. package/src/harness/__tests__/readme-index.test.ts +339 -0
  450. package/src/harness/__tests__/run-turn.test.ts +131 -6
  451. package/src/harness/__tests__/transcript-is-engine-free.test.ts +83 -0
  452. package/src/harness/__tests__/transcript-writers.test.ts +191 -0
  453. package/src/harness/__tests__/turn-attachments-vision.test.ts +5 -2
  454. package/src/harness/__tests__/turn-context.test.ts +5 -5
  455. package/src/harness/approval-decisions.ts +1 -1
  456. package/src/harness/capabilities.ts +21 -11
  457. package/src/harness/capture.ts +4 -4
  458. package/src/harness/persist-chokepoint.ts +3 -3
  459. package/src/harness/registry.ts +2 -2
  460. package/src/harness/run-turn.ts +33 -9
  461. package/src/harness/stop-controller.ts +1 -1
  462. package/src/harness/terminal-table.ts +7 -7
  463. package/src/harness/transcript/__tests__/builder.test.ts +975 -0
  464. package/src/harness/transcript/__tests__/state.test.ts +143 -0
  465. package/src/harness/transcript/builder.ts +755 -0
  466. package/src/harness/transcript/events.ts +262 -0
  467. package/src/harness/transcript/state.ts +167 -0
  468. package/src/harness/turn-context.ts +61 -46
  469. package/src/harness/types.ts +64 -22
  470. package/src/harness/usage-accumulator.ts +2 -2
  471. package/src/harness-adapters.ts +5 -4
  472. package/src/interceptors/__tests__/run-credential-activity.test.ts +133 -0
  473. package/src/interceptors/run-credential-activity.ts +67 -0
  474. package/src/middleware/__tests__/cost-advisory.test.ts +2 -2
  475. package/src/middleware/approval-gate.ts +7 -74
  476. package/src/middleware/cost-advisory.ts +3 -3
  477. package/src/middleware/index.ts +1 -1
  478. package/src/runner-manager.ts +14 -4
  479. package/src/shared/__tests__/approval-policy.test.ts +45 -0
  480. package/src/shared/__tests__/args-preview.test.ts +40 -20
  481. package/src/shared/__tests__/attachment-naming.test.ts +1 -1
  482. package/src/shared/__tests__/attachment-resolver.test.ts +5 -5
  483. package/src/shared/__tests__/attachment-zip.test.ts +1 -1
  484. package/src/shared/__tests__/blueprint-resolver.test.ts +1 -1
  485. package/src/shared/__tests__/channel-attachment.test.ts +12 -0
  486. package/src/shared/__tests__/cost-guard.test.ts +1 -1
  487. package/src/shared/__tests__/exact-apply.test.ts +2 -1
  488. package/src/shared/__tests__/memory-attachment.test.ts +17 -0
  489. package/src/shared/__tests__/persist-decision.test.ts +19 -33
  490. package/src/shared/__tests__/prompt-sections.test.ts +1 -1
  491. package/src/shared/__tests__/run-credential.test.ts +111 -0
  492. package/src/shared/__tests__/stamp-flowed-rows.test.ts +1 -1
  493. package/src/shared/__tests__/status-offload.test.ts +1 -1
  494. package/src/shared/__tests__/streaming-scheduler.test.ts +8 -9
  495. package/src/shared/__tests__/todos.test.ts +1 -1
  496. package/src/shared/__tests__/tool-row.test.ts +1 -1
  497. package/src/shared/activity-input.ts +21 -0
  498. package/src/shared/approval-policy.ts +95 -0
  499. package/src/shared/args-preview.ts +51 -42
  500. package/src/shared/attachment-resolver.ts +4 -4
  501. package/src/shared/attachment-zip.ts +2 -2
  502. package/src/shared/channel-attachment.ts +14 -6
  503. package/src/shared/cost-guard.ts +2 -2
  504. package/src/shared/exact-apply.ts +1 -1
  505. package/src/shared/execution-context.ts +2 -2
  506. package/src/shared/extract-structured-output.ts +2 -2
  507. package/src/shared/filereview/__tests__/capture.test.ts +9 -5
  508. package/src/shared/filereview/__tests__/git-substrate.test.ts +4 -1
  509. package/src/shared/filereview/__tests__/proxy-reconcile.test.ts +3 -3
  510. package/src/shared/filereview/cas-touched.ts +2 -2
  511. package/src/shared/filereview/progress.ts +13 -0
  512. package/src/shared/heartbeat.ts +1 -1
  513. package/src/shared/llm-backend.ts +0 -4
  514. package/src/shared/memory-attachment.ts +22 -10
  515. package/src/shared/model-error.ts +1 -2
  516. package/src/shared/persist-decision.ts +19 -28
  517. package/src/shared/prompt-sections.ts +4 -4
  518. package/src/shared/run-credential-store.ts +45 -0
  519. package/src/shared/run-credential.ts +70 -0
  520. package/src/shared/skill-resolver.ts +3 -3
  521. package/src/shared/status-offload.ts +2 -2
  522. package/src/shared/streaming-scheduler.ts +8 -13
  523. package/src/shared/subagent-rows.ts +2 -2
  524. package/src/shared/synthesized-attachment.ts +38 -3
  525. package/src/shared/todos.ts +3 -3
  526. package/src/shared/tool-row.ts +38 -2
  527. package/src/shared/worker-shutdown.ts +1 -1
  528. package/src/shared/workspace/__tests__/git-source.test.ts +3 -3
  529. package/src/shared/workspace/__tests__/provisioner.test.ts +5 -5
  530. package/src/shared/workspace/__tests__/session-provision.test.ts +2 -2
  531. package/src/shared/workspace/__tests__/writeback-coordinator.integration.test.ts +8 -9
  532. package/src/shared/workspace/__tests__/writeback-coordinator.test.ts +25 -25
  533. package/src/shared/workspace/provisioner.ts +1 -1
  534. package/src/shared/workspace/session-provision.ts +1 -1
  535. package/src/shared/workspace/sources/empty.ts +2 -2
  536. package/src/shared/workspace/sources/git.ts +3 -4
  537. package/src/shared/workspace/sources/local-path.ts +5 -6
  538. package/src/shared/workspace/stigmer-link.ts +1 -1
  539. package/src/shared/workspace/types.ts +2 -5
  540. package/src/shared/workspace/writeback-coordinator.ts +23 -12
  541. package/src/worker.ts +15 -3
  542. package/src/workflow-source.ts +15 -0
  543. package/src/workflows/__tests__/run-credential-interceptor.test.ts +178 -0
  544. package/src/workflows/execute-from-execution.ts +17 -0
  545. package/src/workflows/index.ts +5 -3
  546. package/src/workflows/interceptors/run-credential.ts +101 -0
  547. package/dist/activities/execute-cursor/delta-enricher.d.ts +0 -87
  548. package/dist/activities/execute-cursor/delta-enricher.js +0 -265
  549. package/dist/activities/execute-cursor/delta-enricher.js.map +0 -1
  550. package/dist/activities/execute-cursor/message-translator.js +0 -2040
  551. package/dist/activities/execute-cursor/message-translator.js.map +0 -1
  552. package/dist/activities/execute-cursor/todo-tracker.d.ts +0 -40
  553. package/dist/activities/execute-cursor/todo-tracker.js +0 -80
  554. package/dist/activities/execute-cursor/todo-tracker.js.map +0 -1
  555. package/dist/activities/execute-deep-agent/execution-state.d.ts +0 -54
  556. package/dist/activities/execute-deep-agent/execution-state.js +0 -68
  557. package/dist/activities/execute-deep-agent/execution-state.js.map +0 -1
  558. package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +0 -65
  559. package/dist/activities/execute-deep-agent/status-builder-shared.js +0 -90
  560. package/dist/activities/execute-deep-agent/status-builder-shared.js.map +0 -1
  561. package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +0 -113
  562. package/dist/activities/execute-deep-agent/subagent-tracker.js +0 -400
  563. package/dist/activities/execute-deep-agent/subagent-tracker.js.map +0 -1
  564. package/dist/activities/execute-deep-agent/v3-events.d.ts +0 -102
  565. package/dist/activities/execute-deep-agent/v3-events.js +0 -35
  566. package/dist/activities/execute-deep-agent/v3-events.js.map +0 -1
  567. package/dist/activities/execute-deep-agent/v3-protocol-normalizer.d.ts +0 -15
  568. package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js +0 -235
  569. package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js.map +0 -1
  570. package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +0 -111
  571. package/dist/activities/execute-deep-agent/v3-status-builder.js +0 -457
  572. package/dist/activities/execute-deep-agent/v3-status-builder.js.map +0 -1
  573. package/dist/shared/execution-status-writer.d.ts +0 -31
  574. package/dist/shared/execution-status-writer.js +0 -43
  575. package/dist/shared/execution-status-writer.js.map +0 -1
  576. package/src/activities/execute-cursor/__tests__/delta-enricher.test.ts +0 -310
  577. package/src/activities/execute-cursor/__tests__/message-translator.test.ts +0 -1033
  578. package/src/activities/execute-cursor/__tests__/todo-tracker.test.ts +0 -498
  579. package/src/activities/execute-cursor/delta-enricher.ts +0 -307
  580. package/src/activities/execute-cursor/message-translator.ts +0 -2319
  581. package/src/activities/execute-cursor/todo-tracker.ts +0 -91
  582. package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +0 -148
  583. package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +0 -154
  584. package/src/activities/execute-deep-agent/__tests__/status-builder-shared.test.ts +0 -47
  585. package/src/activities/execute-deep-agent/__tests__/v3-protocol-normalizer.test.ts +0 -324
  586. package/src/activities/execute-deep-agent/execution-state.ts +0 -78
  587. package/src/activities/execute-deep-agent/status-builder-shared.ts +0 -142
  588. package/src/activities/execute-deep-agent/subagent-tracker.ts +0 -479
  589. package/src/activities/execute-deep-agent/v3-events.ts +0 -153
  590. package/src/activities/execute-deep-agent/v3-protocol-normalizer.ts +0 -264
  591. package/src/activities/execute-deep-agent/v3-status-builder.ts +0 -565
  592. package/src/shared/execution-status-writer.ts +0 -56
@@ -28,9 +28,14 @@ export interface SynthesizedAttachmentOptions {
28
28
  */
29
29
  bridgeEndpoint: string | null;
30
30
  /**
31
- * The execution's session-scoped credential (the sandbox token a
32
- * cloud runner holds, or the desktop runner's exchanged scoped
33
- * token). Null attaches no Authorization header (OSS/local).
31
+ * The credential of the RUN this attachment serves — the run's own
32
+ * credential the server minted at dispatch (the OSS shape), or the
33
+ * session-scoped sandbox token a cloud runner holds. Both connection
34
+ * shapes present it: as the Bearer on the bridge's per-request path,
35
+ * and as the stdio child's startup credential (`stdioCredentialEnv`),
36
+ * so what the child writes on the person's behalf is stamped as that
37
+ * person and not refused as nobody's on a server that signs people in.
38
+ * Null presents nothing (a run whose dispatch carried no credential).
34
39
  */
35
40
  credential: string | null;
36
41
  /**
@@ -40,6 +45,36 @@ export interface SynthesizedAttachmentOptions {
40
45
  backendEndpoint: string;
41
46
  }
42
47
 
48
+ /**
49
+ * The mcp-server's startup-credential variable — the ONE name the stdio
50
+ * child reads its bearer from (mcp-server/src/config.ts `STIGMER_API_KEY`;
51
+ * the value is any bearer the server honours, an `stk_` key for an IDE
52
+ * client, the run's credential here). Cross-repo string, pinned on both
53
+ * sides (the TOOL_CALL_LIMIT precedent).
54
+ */
55
+ export const STDIO_CREDENTIAL_ENV = "STIGMER_API_KEY";
56
+
57
+ /**
58
+ * The stdio child's startup-credential entry: `{ STIGMER_API_KEY }` when the
59
+ * attachment holds a credential, nothing when it holds none — so a
60
+ * credential-less run's child environment is byte-for-byte today's, and
61
+ * the two stdio shapes cannot disagree on the carrier.
62
+ *
63
+ * The exposure, stated once: the credential sits in a first-party child's
64
+ * process environment on the runner host, readable by the same OS user.
65
+ * That is the runner's own trust boundary (the runner process holds the
66
+ * same credential), and the child is `stigmer mcp-server`, never a
67
+ * third-party server — those receive only their declared env (oss#256,
68
+ * mcp-manager.ts). The alternative was the operator's API key.
69
+ */
70
+ export function stdioCredentialEnv(
71
+ credential: string | null,
72
+ ): Record<string, string> {
73
+ return credential !== null && credential !== ""
74
+ ? { [STDIO_CREDENTIAL_ENV]: credential }
75
+ : {};
76
+ }
77
+
43
78
  /**
44
79
  * Inject a synthesized attachment into a resolved server list — AFTER
45
80
  * resolve + backfill (see the module header). A user server shadowing
@@ -1,12 +1,12 @@
1
1
  /**
2
- * Todo-list projection shared by every harness's status writer.
2
+ * Todo-list projection the one transcript builder applies for every harness.
3
3
  *
4
4
  * All harnesses expose an agent to-do tool — the Cursor SDK emits `TodoWrite`
5
5
  * (legacy) / `updateTodos` (current), the native deepagents harness emits
6
6
  * `write_todos` — and each writes the SAME `AgentExecutionStatus.todos` proto
7
7
  * map that the clients (React `TodoCard`, CLI) render. This module is the single
8
- * place that maps a raw tool payload into that map, so the Cursor `TodoTracker`
9
- * and the native v2/v3 status builders cannot drift in how they build todos.
8
+ * place that maps a raw tool payload into that map, so the one transcript builder
9
+ * (`harness/transcript/builder.ts`, both harnesses since #1097) has one mapping.
10
10
  *
11
11
  * The mapping is a superset of what any one harness emits: the Cursor SDK sends
12
12
  * per-item `id`/`created_at` and can send a `merge` flag and camelCase statuses;
@@ -17,7 +17,7 @@
17
17
  * shape of legacy (pre-stamping) sessions whose flowed edit rows were hidden.
18
18
  */
19
19
 
20
- import { ToolCallStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
20
+ import { ApprovalAction, ToolCallStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
21
21
  import type { AgentMessage, ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
22
22
  import type { SubAgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/subagent_pb";
23
23
  import { extractFilePath } from "./file-tools.js";
@@ -80,7 +80,7 @@ export function stampFileEditRow(tc: ToolCall, changeSetId: string): void {
80
80
  * (the Cursor deny-gate's ledger tokens; a status rule). Omit to stamp
81
81
  * every write/delete row, the deep-agent posture where every such row flowed.
82
82
  *
83
- * One pass for every harness (S3 M4; until then each adapter carried a copy
83
+ * One pass for every harness (since #1096; until then each adapter carried a copy
84
84
  * differing only in the `flowed` predicate).
85
85
  */
86
86
  export function stampFlowedFileEditRows(
@@ -294,3 +294,39 @@ export function collectSettledToolCallIds(
294
294
  }
295
295
  return ids;
296
296
  }
297
+
298
+ /**
299
+ * Whether the server has already adjudicated this row — the user decided its
300
+ * gate (`approval_action`, the server's field; the runner never writes it).
301
+ *
302
+ * Such a row belongs to a gate that is CLOSED: approved and executed, or
303
+ * declined, in an earlier invocation of this execution. No reconciliation of
304
+ * the CURRENT turn may rewrite it — not the denial overlay (a new denial of the
305
+ * same identity is a NEW act and gets its own row), not the twin collapse (the
306
+ * executed row is the transcript's record). Before this rule the overlay matched
307
+ * a denial to the FIRST same-identity row in the whole transcript, flipped a
308
+ * completed, approved row back to WAITING_APPROVAL with its APPROVE still on
309
+ * it, and the next invocation read that as the decision for the new, undecided
310
+ * proposal — an approval bleeding to a later identical act (found by the
311
+ * harness contract kit's invariant 3 against this adapter, #1070).
312
+ */
313
+ export function isAdjudicatedRow(tc: ToolCall): boolean {
314
+ return tc.approvalAction !== ApprovalAction.UNSPECIFIED;
315
+ }
316
+
317
+ /** Adjudicated with a decision that does NOT execute: the user declined this gate. */
318
+ export function isDeclinedRow(tc: ToolCall): boolean {
319
+ switch (tc.approvalAction) {
320
+ case ApprovalAction.SKIP:
321
+ case ApprovalAction.REJECT:
322
+ return true;
323
+ case ApprovalAction.UNSPECIFIED:
324
+ case ApprovalAction.APPROVE:
325
+ case ApprovalAction.APPROVE_ALL:
326
+ return false;
327
+ default: {
328
+ const exhaustive: never = tc.approvalAction;
329
+ throw new Error(`isDeclinedRow: unknown approval action ${String(exhaustive)}`);
330
+ }
331
+ }
332
+ }
@@ -107,7 +107,7 @@ export type TurnInterruption = "worker-shutdown" | "pause" | "infrastructure" |
107
107
  * already aborted and nothing actually interrupted. Shutdown requires a
108
108
  * delivered cancellation alongside the signal.
109
109
  *
110
- * Until S2 M3 the evidence also carried two flags from the periodic
110
+ * Until #1070 the evidence also carried two flags from the periodic
111
111
  * heartbeat ("it threw `CancelledFailure`"), and a delivered cancellation
112
112
  * without them read as "none". `Context.heartbeat()` never throws in the
113
113
  * Temporal TypeScript SDK (it enqueues to the worker's heartbeat subject;
@@ -1,7 +1,7 @@
1
1
  import { describe, it, expect, vi, beforeEach } from "vitest";
2
2
  import { mockWorkspaceBackend } from "../../../__test-utils__/mock-workspace.js";
3
3
  import { provisionGit } from "../sources/git.js";
4
- import { SourceType, WorkspaceProvisionError } from "../types.js";
4
+ import { WorkspaceProvisionError } from "../types.js";
5
5
 
6
6
  /**
7
7
  * Command-routing mock for `backend.execute`.
@@ -55,7 +55,7 @@ describe("provisionGit", () => {
55
55
 
56
56
  it("returns GIT_REPO source type", async () => {
57
57
  const result = await provisionGit(makeOptions());
58
- expect(result.sourceType).toBe(SourceType.GIT_REPO);
58
+ expect(result.sourceType).toBe("git_repo");
59
59
  });
60
60
 
61
61
  it("clones in place (init/remote/fetch/checkout) instead of git clone", async () => {
@@ -119,7 +119,7 @@ describe("provisionGit", () => {
119
119
  });
120
120
 
121
121
  const result = await provisionGit(makeOptions({ backend }));
122
- expect(result.sourceType).toBe(SourceType.GIT_REPO);
122
+ expect(result.sourceType).toBe("git_repo");
123
123
  expect(result.workspaceDescription).toContain("existing repo detected");
124
124
 
125
125
  expect(calls(backend).some((c) => c.includes("git init"))).toBe(false);
@@ -3,7 +3,7 @@ import { mkdtempSync, mkdirSync, writeFileSync, existsSync, readlinkSync } from
3
3
  import { join } from "node:path";
4
4
  import { tmpdir } from "node:os";
5
5
  import { WorkspaceProvisioner } from "../provisioner.js";
6
- import { SourceType, WorkspaceProvisionError } from "../types.js";
6
+ import { WorkspaceProvisionError } from "../types.js";
7
7
  import { LocalWorkspaceBackend } from "../local-backend.js";
8
8
 
9
9
  function makeTempDir(): string {
@@ -22,7 +22,7 @@ describe("WorkspaceProvisioner", () => {
22
22
  const root = makeTempDir();
23
23
  const backend = new LocalWorkspaceBackend(root);
24
24
  const result = await provisioner.provision(undefined, backend, {}, true);
25
- expect(result.sourceType).toBe(SourceType.EMPTY);
25
+ expect(result.sourceType).toBe("empty");
26
26
  expect(result.rootDir).toBe(root);
27
27
  expect(result.consumedKeys).toEqual([]);
28
28
  });
@@ -34,7 +34,7 @@ describe("WorkspaceProvisioner", () => {
34
34
  { source: { case: undefined, value: undefined } },
35
35
  backend, {}, true,
36
36
  );
37
- expect(result.sourceType).toBe(SourceType.EMPTY);
37
+ expect(result.sourceType).toBe("empty");
38
38
  });
39
39
  });
40
40
 
@@ -47,7 +47,7 @@ describe("WorkspaceProvisioner", () => {
47
47
  { source: { case: "localPath", value: { path: projectDir } } },
48
48
  backend, {}, true,
49
49
  );
50
- expect(result.sourceType).toBe(SourceType.LOCAL_PATH);
50
+ expect(result.sourceType).toBe("local_path");
51
51
  expect(result.rootDir).toBe(projectDir);
52
52
  });
53
53
 
@@ -102,7 +102,7 @@ describe("WorkspaceProvisioner", () => {
102
102
  );
103
103
  expect(results).toHaveLength(1);
104
104
  expect(results[0].entryName).toBe("app");
105
- expect(results[0].sourceType).toBe(SourceType.EMPTY);
105
+ expect(results[0].sourceType).toBe("empty");
106
106
  });
107
107
  });
108
108
 
@@ -2,8 +2,8 @@
2
2
  * Pins session workspace provisioning: git-repo workspace entries are cloned
3
3
  * locally (never delegated to a cloud agent), local-path entries are
4
4
  * mounted, and a session with no entries gets its own empty per-session root.
5
- * Harness-agnostic; the Cursor activity is today's only caller and the turn
6
- * runtime takes it over in S2 M3.
5
+ * Harness-agnostic; the Cursor activity was its only caller until the turn
6
+ * runtime took it over in #1070.
7
7
  *
8
8
  * Uses a real, hermetic local git repository (no network, no harness API) so
9
9
  * the clone is deterministic.
@@ -20,9 +20,8 @@ import { WorkspaceWriteBackPhase } from "@stigmer/protos/ai/stigmer/agentic/agen
20
20
  import { GitWriteBackMode } from "@stigmer/protos/ai/stigmer/agentic/session/v1/enum_pb";
21
21
  import { WriteBackCoordinator } from "../writeback-coordinator.js";
22
22
  import { LocalWorkspaceBackend } from "../local-backend.js";
23
- import { statusProtoWriter, type ExecutionStatusWriter } from "../../execution-status-writer.js";
23
+ import { TranscriptBuilder } from "../../../harness/transcript/builder.js";
24
24
  import type { ProvisionResult } from "../types.js";
25
- import { SourceType } from "../types.js";
26
25
  import { AGENT_GIT_AUTHOR_EMAIL } from "../git-identity.js";
27
26
 
28
27
  const SESSION_ID = "ses-int-01";
@@ -52,11 +51,11 @@ function git(cwd: string, args: string[]): string {
52
51
 
53
52
  function makeCoordinator(
54
53
  executionId: string,
55
- writer: ExecutionStatusWriter,
54
+ writeBacks: TranscriptBuilder,
56
55
  ): WriteBackCoordinator {
57
56
  const provisionResult: ProvisionResult = {
58
57
  rootDir: workDir,
59
- sourceType: SourceType.GIT_REPO,
58
+ sourceType: "git_repo",
60
59
  consumedKeys: [],
61
60
  workspaceDescription: "integration",
62
61
  entryName: "repo",
@@ -68,7 +67,7 @@ function makeCoordinator(
68
67
  },
69
68
  };
70
69
  return new WriteBackCoordinator({
71
- statusWriter: writer,
70
+ writeBacks,
72
71
  executionId,
73
72
  sessionId: SESSION_ID,
74
73
  githubToken: "ghp_test",
@@ -139,7 +138,7 @@ describe("WriteBackCoordinator against real git", () => {
139
138
  // ── Turn 1: the agent created a file; the review kept it. ──
140
139
  writeFileSync(join(workDir, "notes.md"), "approved content\n");
141
140
  const status1 = create(AgentExecutionStatusSchema, {});
142
- const coord1 = makeCoordinator("exec-turn-1", statusProtoWriter(status1));
141
+ const coord1 = makeCoordinator("exec-turn-1", new TranscriptBuilder("exec-int", status1));
143
142
  await coord1.finalize();
144
143
 
145
144
  const wb1 = status1.workspaceWriteBacks[0];
@@ -163,7 +162,7 @@ describe("WriteBackCoordinator against real git", () => {
163
162
  rmSync(join(workDir, "rejected.md")); // the reconcile's snap-back
164
163
 
165
164
  const status2 = create(AgentExecutionStatusSchema, {});
166
- const coord2 = makeCoordinator("exec-turn-2", statusProtoWriter(status2));
165
+ const coord2 = makeCoordinator("exec-turn-2", new TranscriptBuilder("exec-int", status2));
167
166
  await coord2.finalize();
168
167
 
169
168
  const wb2 = status2.workspaceWriteBacks[0];
@@ -200,7 +199,7 @@ describe("WriteBackCoordinator against real git", () => {
200
199
  writeFileSync(join(workDir, "notes.md"), "turn one\n");
201
200
  const coord1 = makeCoordinator(
202
201
  "exec-a",
203
- statusProtoWriter(create(AgentExecutionStatusSchema, {})),
202
+ new TranscriptBuilder("exec-int", create(AgentExecutionStatusSchema, {})),
204
203
  );
205
204
  await coord1.finalize();
206
205
 
@@ -214,7 +213,7 @@ describe("WriteBackCoordinator against real git", () => {
214
213
  // new one from main (which would orphan turn 1's commit).
215
214
  writeFileSync(join(workDir, "more.md"), "turn two\n");
216
215
  const status2 = create(AgentExecutionStatusSchema, {});
217
- const coord2 = makeCoordinator("exec-b", statusProtoWriter(status2));
216
+ const coord2 = makeCoordinator("exec-b", new TranscriptBuilder("exec-int", status2));
218
217
  await coord2.finalize();
219
218
 
220
219
  expect(status2.workspaceWriteBacks[0].branchName).toBe(SESSION_BRANCH);
@@ -1,18 +1,14 @@
1
1
  import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
2
  import { create } from "@bufbuild/protobuf";
3
- import { AgentExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
3
+ import { type AgentExecutionStatus, AgentExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
4
4
  import { WorkspaceWriteBackPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
5
5
  import { GitWriteBackMode } from "@stigmer/protos/ai/stigmer/agentic/session/v1/enum_pb";
6
- import {
7
- statusProtoWriter,
8
- type ExecutionStatusWriter,
9
- } from "../../execution-status-writer.js";
6
+ import { TranscriptBuilder } from "../../../harness/transcript/builder.js";
10
7
  import {
11
8
  WriteBackCoordinator,
12
9
  parseGithubRepo,
13
10
  } from "../writeback-coordinator.js";
14
11
  import type { WorkspaceBackend, ProvisionResult } from "../types.js";
15
- import { SourceType } from "../types.js";
16
12
  import {
17
13
  AGENT_GIT_AUTHOR_NAME,
18
14
  AGENT_GIT_AUTHOR_EMAIL,
@@ -21,16 +17,19 @@ import {
21
17
  const SESSION_ID = "ses-01test";
22
18
  const SESSION_BRANCH = `stigmer/${SESSION_ID}`;
23
19
 
24
- // The shared proto-backed writer — the same implementation the Cursor harness
25
- // wires in, and upsert-compatible with the deep-agent V3StatusBuilder.
26
- function makeStatusBuilder(): ExecutionStatusWriter {
27
- return statusProtoWriter(create(AgentExecutionStatusSchema, {}));
20
+ // The writer production wires in: the turn's transcript builder, whose
21
+ // `addWriteBack` owns the upsert-by-entry rule these arms read the result of
22
+ // (the coordinator itself only registers records through `WriteBackSink`).
23
+ /** A builder and the status it builds into: the test writes through `sb` and reads `status`, as production reads `TurnSink.status`. */
24
+ function makeStatusBuilder(): { sb: TranscriptBuilder; status: AgentExecutionStatus } {
25
+ const status = create(AgentExecutionStatusSchema, {});
26
+ return { sb: new TranscriptBuilder("exec-test", status), status };
28
27
  }
29
28
 
30
29
  function makeProvisionResult(overrides: Partial<ProvisionResult> = {}): ProvisionResult {
31
30
  return {
32
31
  rootDir: "/workspace/my-app",
33
- sourceType: SourceType.GIT_REPO,
32
+ sourceType: "git_repo",
34
33
  consumedKeys: [],
35
34
  workspaceDescription: "test",
36
35
  entryName: "my-app",
@@ -92,7 +91,7 @@ function mockWorkspaceBackend(responses: Record<string, string> = {}): Workspace
92
91
  }
93
92
 
94
93
  function makeCoordinator(opts: {
95
- sb: ExecutionStatusWriter;
94
+ sb: TranscriptBuilder;
96
95
  backend?: WorkspaceBackend;
97
96
  executionId?: string;
98
97
  sessionId?: string;
@@ -101,7 +100,7 @@ function makeCoordinator(opts: {
101
100
  workspaceEntries?: any[];
102
101
  }): WriteBackCoordinator {
103
102
  return new WriteBackCoordinator({
104
- statusWriter: opts.sb,
103
+ writeBacks: opts.sb,
105
104
  executionId: opts.executionId ?? "exec-12345678rest",
106
105
  sessionId: opts.sessionId ?? SESSION_ID,
107
106
  githubToken: opts.githubToken ?? "ghp_plumbed_token",
@@ -139,10 +138,11 @@ function mockGithubApi(opts: {
139
138
  const originalFetch = globalThis.fetch;
140
139
 
141
140
  describe("WriteBackCoordinator", () => {
142
- let sb: ExecutionStatusWriter;
141
+ let sb: TranscriptBuilder;
142
+ let status: AgentExecutionStatus;
143
143
 
144
144
  beforeEach(() => {
145
- sb = makeStatusBuilder();
145
+ ({ sb, status } = makeStatusBuilder());
146
146
  mockGithubApi();
147
147
  });
148
148
 
@@ -155,7 +155,7 @@ describe("WriteBackCoordinator", () => {
155
155
  it("filters out non-git workspace entries", () => {
156
156
  const coord = makeCoordinator({
157
157
  sb,
158
- provisionResults: [makeProvisionResult({ sourceType: SourceType.LOCAL_PATH })],
158
+ provisionResults: [makeProvisionResult({ sourceType: "local_path" })],
159
159
  });
160
160
  expect(coord.hasEligibleEntries).toBe(false);
161
161
  });
@@ -186,7 +186,7 @@ describe("WriteBackCoordinator", () => {
186
186
  // ── Full cycle ──────────────────────────────────────────────────────
187
187
 
188
188
  // Every cycle below runs through `finalize()`, the coordinator's one entry
189
- // point since S3 M2b (Q-M1-1; the per-file `onFileModified` went with the
189
+ // point since #1096 (the per-file `onFileModified` went with the
190
190
  // native stream loop that called it). The mechanics it pins are the same.
191
191
  it("performs full cycle on the SESSION branch: branch -> commit -> push -> PR", async () => {
192
192
  const backend = mockWorkspaceBackend();
@@ -194,7 +194,7 @@ describe("WriteBackCoordinator", () => {
194
194
 
195
195
  await coord.finalize();
196
196
 
197
- const wbs = sb.currentStatus.workspaceWriteBacks;
197
+ const wbs = status.workspaceWriteBacks;
198
198
  expect(wbs).toHaveLength(1);
199
199
  expect(wbs[0].branchName).toBe(SESSION_BRANCH);
200
200
  expect(wbs[0].baseBranch).toBe("main");
@@ -238,7 +238,7 @@ describe("WriteBackCoordinator", () => {
238
238
 
239
239
  await coord.finalize();
240
240
 
241
- expect(sb.currentStatus.workspaceWriteBacks).toHaveLength(0);
241
+ expect(status.workspaceWriteBacks).toHaveLength(0);
242
242
  });
243
243
 
244
244
  // ── Session-branch idempotency ──────────────────────────────────────
@@ -317,7 +317,7 @@ describe("WriteBackCoordinator", () => {
317
317
 
318
318
  await coord.finalize();
319
319
 
320
- const wbs = sb.currentStatus.workspaceWriteBacks;
320
+ const wbs = status.workspaceWriteBacks;
321
321
  expect(wbs[0].pullRequestNumber).toBe(7);
322
322
  expect(wbs[0].pullRequestUrl).toBe("https://github.com/acme/my-app/pull/7");
323
323
  expect(wbs[0].phase).toBe(WorkspaceWriteBackPhase.WORKSPACE_WRITE_BACK_PR_CREATED);
@@ -355,7 +355,7 @@ describe("WriteBackCoordinator", () => {
355
355
 
356
356
  await coord.finalize();
357
357
 
358
- const wbs = sb.currentStatus.workspaceWriteBacks;
358
+ const wbs = status.workspaceWriteBacks;
359
359
  expect(wbs).toHaveLength(1);
360
360
  expect(wbs[0].phase).toBe(WorkspaceWriteBackPhase.WORKSPACE_WRITE_BACK_FAILED);
361
361
  expect(wbs[0].error).toContain("commit failed");
@@ -369,7 +369,7 @@ describe("WriteBackCoordinator", () => {
369
369
 
370
370
  await coord.finalize();
371
371
 
372
- const wbs = sb.currentStatus.workspaceWriteBacks;
372
+ const wbs = status.workspaceWriteBacks;
373
373
  expect(wbs).toHaveLength(1);
374
374
  expect(wbs[0].phase,
375
375
  "a pushed branch must never be reported FAILED for a PR-step error",
@@ -386,7 +386,7 @@ describe("WriteBackCoordinator", () => {
386
386
 
387
387
  await coord.finalize();
388
388
 
389
- const wbs = sb.currentStatus.workspaceWriteBacks;
389
+ const wbs = status.workspaceWriteBacks;
390
390
  expect(wbs).toHaveLength(1);
391
391
  expect(wbs[0].phase).toBe(WorkspaceWriteBackPhase.WORKSPACE_WRITE_BACK_PUSHED);
392
392
  expect(wbs[0].error).toContain("No GitHub token");
@@ -401,8 +401,8 @@ describe("WriteBackCoordinator", () => {
401
401
 
402
402
  await coord.finalize();
403
403
 
404
- expect(sb.currentStatus.workspaceWriteBacks).toHaveLength(1);
405
- expect(sb.currentStatus.workspaceWriteBacks[0].phase).toBe(
404
+ expect(status.workspaceWriteBacks).toHaveLength(1);
405
+ expect(status.workspaceWriteBacks[0].phase).toBe(
406
406
  WorkspaceWriteBackPhase.WORKSPACE_WRITE_BACK_PR_CREATED,
407
407
  );
408
408
  });
@@ -15,7 +15,7 @@
15
15
  */
16
16
 
17
17
  import type { ProvisionResult, WorkspaceBackend } from "./types.js";
18
- import { SourceType, WorkspaceProvisionError } from "./types.js";
18
+ import { WorkspaceProvisionError } from "./types.js";
19
19
  import { provisionEmpty } from "./sources/empty.js";
20
20
  import { provisionLocalPath } from "./sources/local-path.js";
21
21
  import { provisionGit } from "./sources/git.js";
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Harness-agnostic: the turn runtime's workspace phase, serving both
5
5
  * adapters (the native orchestrator's twin, `provisionWorkspace`, retired
6
- * with it at S3 M2b; Q-S3-8 carried its one difference). Agents run LOCAL
6
+ * with it in #1096, which also carried its one difference). Agents run LOCAL
7
7
  * (cloud is disabled — see execute-cursor/cursor-mode.ts), so the runner
8
8
  * must clone git-repo workspace entries itself and mount local-path entries
9
9
  * before the agent runs. Cloud agents previously cloned git repos
@@ -5,12 +5,12 @@
5
5
  * This handler simply records the fact and returns the existing root.
6
6
  */
7
7
 
8
- import { SourceType, type ProvisionResult, type WorkspaceBackend } from "../types.js";
8
+ import type { ProvisionResult, WorkspaceBackend } from "../types.js";
9
9
 
10
10
  export function provisionEmpty(backend: WorkspaceBackend): ProvisionResult {
11
11
  return {
12
12
  rootDir: backend.rootDir,
13
- sourceType: SourceType.EMPTY,
13
+ sourceType: "empty",
14
14
  consumedKeys: [],
15
15
  workspaceDescription:
16
16
  "Your workspace is empty. " +
@@ -12,7 +12,6 @@
12
12
 
13
13
  import { join } from "node:path";
14
14
  import {
15
- SourceType,
16
15
  WorkspaceProvisionError,
17
16
  type ProvisionResult,
18
17
  type GitMetadata,
@@ -63,7 +62,7 @@ export async function provisionGit(options: GitProvisionOptions): Promise<Provis
63
62
  ? message.replaceAll(githubToken, "***")
64
63
  : message;
65
64
  throw new WorkspaceProvisionError(
66
- SourceType.GIT_REPO,
65
+ "git_repo",
67
66
  `Git clone failed: ${sanitized}`,
68
67
  { cause: err instanceof Error ? err : undefined, transient: true },
69
68
  );
@@ -82,7 +81,7 @@ export async function provisionGit(options: GitProvisionOptions): Promise<Provis
82
81
 
83
82
  return {
84
83
  rootDir: cloneDir,
85
- sourceType: SourceType.GIT_REPO,
84
+ sourceType: "git_repo",
86
85
  consumedKeys,
87
86
  workspaceDescription:
88
87
  `Your workspace is a git clone of ${url}` +
@@ -113,7 +112,7 @@ async function reuseExistingRepo(
113
112
 
114
113
  return {
115
114
  rootDir: cloneDir,
116
- sourceType: SourceType.GIT_REPO,
115
+ sourceType: "git_repo",
117
116
  consumedKeys: [],
118
117
  workspaceDescription:
119
118
  `Your workspace is a git clone of ${url}` +
@@ -12,7 +12,6 @@ import { existsSync, statSync, symlinkSync, readlinkSync, unlinkSync, mkdirSync
12
12
  import { join, isAbsolute } from "node:path";
13
13
  import { realpathSync } from "node:fs";
14
14
  import {
15
- SourceType,
16
15
  WorkspaceProvisionError,
17
16
  type ProvisionResult,
18
17
  } from "../types.js";
@@ -29,7 +28,7 @@ export function provisionLocalPath(options: LocalPathProvisionOptions): Provisio
29
28
 
30
29
  if (!isLocalMode) {
31
30
  throw new WorkspaceProvisionError(
32
- SourceType.LOCAL_PATH,
31
+ "local_path",
33
32
  "LocalPathSource is only supported in local mode. " +
34
33
  "Use git_repo for cloud deployments.",
35
34
  );
@@ -37,21 +36,21 @@ export function provisionLocalPath(options: LocalPathProvisionOptions): Provisio
37
36
 
38
37
  if (!isAbsolute(path)) {
39
38
  throw new WorkspaceProvisionError(
40
- SourceType.LOCAL_PATH,
39
+ "local_path",
41
40
  `Path must be absolute, got relative path: '${path}'`,
42
41
  );
43
42
  }
44
43
 
45
44
  if (!existsSync(path)) {
46
45
  throw new WorkspaceProvisionError(
47
- SourceType.LOCAL_PATH,
46
+ "local_path",
48
47
  `Path does not exist: '${path}'`,
49
48
  );
50
49
  }
51
50
 
52
51
  if (!statSync(path).isDirectory()) {
53
52
  throw new WorkspaceProvisionError(
54
- SourceType.LOCAL_PATH,
53
+ "local_path",
55
54
  `Path is not a directory: '${path}'`,
56
55
  );
57
56
  }
@@ -62,7 +61,7 @@ export function provisionLocalPath(options: LocalPathProvisionOptions): Provisio
62
61
 
63
62
  return {
64
63
  rootDir: path,
65
- sourceType: SourceType.LOCAL_PATH,
64
+ sourceType: "local_path",
66
65
  consumedKeys: [],
67
66
  workspaceDescription:
68
67
  `Your workspace is the user's project directory: ${path}\n` +
@@ -17,7 +17,7 @@
17
17
  * working-tree mutation, and re-pointing it while another session's turn is
18
18
  * running on a shared tree would redirect that turn's reads mid-flight.
19
19
  * the turn runtime creates it in its skill and attachment phases (which
20
- * run after lock acquisition), for both harnesses; until S3 M2a the native
20
+ * run after lock acquisition), for both harnesses; until #1096 the native
21
21
  * orchestrator created it unconditionally right after the lock.
22
22
  * - Removed at turn end ({@link removeStigmerSymlink} in the activity's
23
23
  * cleanup), so a real repo is left untouched once the turn ends; a
@@ -5,11 +5,8 @@
5
5
  * harness-agnostic and used by both ExecuteCursor and ExecuteDeepAgent.
6
6
  */
7
7
 
8
- export enum SourceType {
9
- GIT_REPO = "git_repo",
10
- LOCAL_PATH = "local_path",
11
- EMPTY = "empty",
12
- }
8
+ /** Where a provisioned workspace came from; the same strings the error prefix and the prompt builder read. */
9
+ export type SourceType = "git_repo" | "local_path" | "empty";
13
10
 
14
11
  export interface GitMetadata {
15
12
  readonly repoUrl: string;