@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
@@ -21,9 +21,8 @@
21
21
  * (`execute-cursor/turn-stream.ts` `CursorTurnStreamDeps`) or a fact the
22
22
  * runtime cannot read anywhere else. Nothing here is speculative: where the
23
23
  * program's original sketch and the code disagreed, the code won, and the
24
- * disagreement was ruled at the entry's gate
25
- * (stigmer-cloud `_projects/2026-09/20260911.02.sp.harness-contract-and-kit/`
26
- * for S1; `20260911.03.sp.turn-runtime-extraction/` M3 for the growth below).
24
+ * disagreement was ruled before the code landed (#1064; the growth below in
25
+ * #1070).
27
26
  *
28
27
  * What is deliberately NOT on this contract, and why:
29
28
  *
@@ -31,11 +30,13 @@
31
30
  * (`maxConcurrentActivities`), so a per-turn teardown method on the
32
31
  * adapter is a race. The adapter owns its per-turn teardown in its own
33
32
  * `finally` inside `runTurn` (the Cursor harness parks its agent there).
34
- * - No `isCancelled()`, no `heartbeat(details)`, no `ExecutionStatusWriter`
35
- * base. Each would be a second way of saying something `stopSignal`,
36
- * `recordActivity()` or `requestPersist()` already says, and two writers of
37
- * one fact drift (the native builders' `forceNextUpdate` flag is the same
38
- * fact as a `requestPersist()` call).
33
+ * - No `isCancelled()`, no `heartbeat(details)`, and the sink does not
34
+ * EXTEND a status-writer interface. Each would be a second way of saying
35
+ * something `stopSignal`, `recordActivity()` or `requestPersist()` already
36
+ * says, and two writers of one fact drift. The transcript builder rides
37
+ * the sink as a MEMBER (`transcript`), and the distinction holds: its
38
+ * `dirty` is a fact the adapter's persist decision reads, `requestPersist()`
39
+ * is the act; one fact, one act, no second writer.
39
40
  * - No `reason` on `interrupted`, no payload on `completed`, no `retryable`
40
41
  * on `failed`. Every cause of stopping is the runtime's own evidence; the
41
42
  * final text and structured output are already folded onto the status;
@@ -53,9 +54,9 @@
53
54
  * propagates it.
54
55
  * - No persist cadence. The runtime's chokepoint is single-flight and
55
56
  * unconditional at settle; WHEN a streaming turn asks for a write is the
56
- * adapter's (`shared/persist-decision.ts` over its own dirty flags, since
57
- * what counts as a discrete change is engine knowledge). Revisited with
58
- * both loops in view at S3 M4 and kept (Q-S3-13): the cadence RULE is
57
+ * adapter's (`shared/persist-decision.ts` over the builder's `dirty`
58
+ * flag, since WHEN to ask is engine cadence). Revisited with
59
+ * both loops in view in #1096 and kept: the cadence RULE is
59
60
  * shared, the timing is the engine's.
60
61
  * - No capture. The file-review capture is the runtime's whole
61
62
  * (`harness/capture.ts`): the baseline before `runTurn`, the candidate
@@ -88,6 +89,7 @@ import type { DeclaredPreferencesContent } from "../shared/declared-preferences.
88
89
  import type { RecalledMemoriesContent } from "../shared/recalled-memories.js";
89
90
  import type { CasTouchedReader } from "../shared/filereview/cas-touched.js";
90
91
  import type { HarnessCapabilities } from "./capabilities.js";
92
+ import type { TranscriptBuilder } from "./transcript/builder.js";
91
93
  /**
92
94
  * One harness, as the runtime sees it. ONE adapter object exists per worker
93
95
  * process; it serves every concurrent turn of its harness and holds no
@@ -301,14 +303,36 @@ export interface TurnInput extends NormalizedActivityInput {
301
303
  * one status it folds into. One sink per turn, owned by the runtime; the
302
304
  * adapter never constructs one.
303
305
  *
304
- * Field ownership on `status` before the canonical transcript lands (S4):
305
- * the adapter appends the engine's transcript rows (assistant messages,
306
- * tool-call rows and their approval status, sub-agent rows, todos); the
307
- * runtime writes the phase, the terminal system messages, `streamingUsage`,
308
- * artifacts, write-backs, `fileChangeProgress`, the file-review ledger
309
- * events and the change-set stamp on a flowed edit row (S3 M4,
310
- * `harness/capture.ts`). An adapter never writes a phase or a terminal copy:
311
- * those are Temporal semantics the runtime owns once.
306
+ * Field ownership on `status` (since #1097, the canonical transcript):
307
+ *
308
+ * - Transcript rows — messages, tool-call rows, sub-agent rows, todos — are
309
+ * CREATED through `transcript` and nowhere else: the adapter translates
310
+ * its engine's events and applies them; a reinvocation's prior rows are
311
+ * seeded through it by the runtime. The one exception, the runtime's own
312
+ * terminal system rows (`harness/terminal-table.ts`), is the second name
313
+ * on the writer fence's allow-list (`__tests__/transcript-writers.test.ts`).
314
+ * - Artifacts and write-backs a turn produces register through `transcript`
315
+ * too (the native inline publisher; the runtime's write-back coordinator),
316
+ * each dedupe rule owned once. The one artifact written beside it is the
317
+ * epilogue's plan artifact (`shared/plan-artifact.ts`), the runtime's,
318
+ * which supersedes by the plan's own name rule.
319
+ * - Rows may be AMENDED by identity, never created, by the modules that own
320
+ * a fact the builder cannot know, and this is the whole list: the runtime's
321
+ * `harness/approval-decisions.ts` (a SKIP or REJECT settles its row),
322
+ * `harness/capture.ts` (the change-set stamp on a flowed edit row),
323
+ * `shared/exact-apply.ts` (an approved whole-file write applied by the
324
+ * runtime completes its row), `shared/subagent-rows.ts` (a stopped turn's
325
+ * sub-agents CANCELLED); the Cursor boundary (`execute-cursor/
326
+ * boundary-rows.ts`: the identity-token collapses, #205, #965, the
327
+ * unattended stamp); the native settle (`execute-deep-agent/hitl.ts`: the
328
+ * gate's unattended skips). A harness that amends says so in its settle's
329
+ * header.
330
+ * - The runtime alone writes the phase, `startedAt`, `completedAt`,
331
+ * `error`, the terminal system rows, `streamingUsage`,
332
+ * `fileChangeProgress`, the file-review ledger events and the change-set
333
+ * stamp (`harness/capture.ts`, since #1096), and closes every streaming flag
334
+ * once `runTurn` returns. An adapter never writes a phase or a terminal
335
+ * copy: those are Temporal semantics the runtime owns once.
312
336
  */
313
337
  export interface TurnSink {
314
338
  /**
@@ -317,6 +341,23 @@ export interface TurnSink {
317
341
  * the adapter wrote last time, and their decisions, are already on it.
318
342
  */
319
343
  readonly status: AgentExecutionStatus;
344
+ /**
345
+ * The one transcript builder over `status`, constructed by the runtime
346
+ * per turn and already holding a reinvocation's seeded rows. The ONE way
347
+ * a transcript row is created: a harness translates its engine's events
348
+ * into `TranscriptEvent`s and `apply`s them; its post-stream facts (a
349
+ * gate parked by a boundary, a disclosure) go in as events too. Artifacts
350
+ * and write-backs a turn produces register here as well (`addArtifact`,
351
+ * `addWriteBack`, one dedupe rule each). Read `dirty` to decide a
352
+ * streaming persist and call `markPersisted()` as you request it; read
353
+ * `awaitingApproval` to learn a proposal was parked. The runtime calls
354
+ * `finalize()` once `runTurn` returns, on every path, so no streaming flag
355
+ * outlives a turn; a harness may call it earlier when it persists on the
356
+ * settled rows itself. A source-walking fence
357
+ * (`harness/__tests__/transcript-writers.test.ts`) refuses any other
358
+ * creator of a row.
359
+ */
360
+ readonly transcript: TranscriptBuilder;
320
361
  /**
321
362
  * The ONE way a turn is told to stop, whatever the cause: user pause,
322
363
  * worker shutdown, stall, cost cap, platform STOP. The runtime knows why
@@ -372,7 +413,7 @@ export interface TurnSink {
372
413
  * step only the adapter knows ("Initializing Cursor agent"). The runtime
373
414
  * reports its own resolution labels itself; the adapter reports the labels
374
415
  * of its setup steps exactly as the orchestrator did, so the UI's spinner
375
- * copy is unchanged by the extraction (Q-S2-5). Resolves once the label is
416
+ * copy is unchanged by the extraction. Resolves once the label is
376
417
  * written; the write carries no phase, so it never advances the execution.
377
418
  */
378
419
  reportProgress(label: string): Promise<void>;
@@ -384,7 +425,7 @@ export interface TurnSink {
384
425
  * cleared, the agnostic quirk of `BuildUpdateStateStep`); the adapter may
385
426
  * set its own harness-specific `SessionSpec` fields on that record before
386
427
  * binding, one writer per field (`harnessStateId` the runtime's,
387
- * `cursorMode` the adapter's; Q-S2-11). Called only by adapters whose
428
+ * `cursorMode` the adapter's). Called only by adapters whose
388
429
  * `capabilities.stateIdSource` is `"engine-minted"`, and before their first
389
430
  * `requestPersist`; a `deterministic` harness never calls it. Rejects when
390
431
  * the session write fails; the adapter then ends the turn `failed` with
@@ -415,7 +456,7 @@ export interface TurnSink {
415
456
  * Token counts for one engine turn, priced. The four counts are what the
416
457
  * Cursor loop reads from the SDK's `turn-ended` delta; `estimatedCostUsd` is
417
458
  * the adapter's price for them at its vendor's rates (the runtime cannot
418
- * price without the vendor's table and must not import it; Q-S2-12), and
459
+ * price without the vendor's table and must not import it), and
419
460
  * `model` / `requestedModelParams` name the basis it priced against, which
420
461
  * the runtime records into `streamingUsage` (`model` is the catalog-validated
421
462
  * id, `requestedModelParams` the JSON of the params sent — a string on the
@@ -21,9 +21,8 @@
21
21
  * (`execute-cursor/turn-stream.ts` `CursorTurnStreamDeps`) or a fact the
22
22
  * runtime cannot read anywhere else. Nothing here is speculative: where the
23
23
  * program's original sketch and the code disagreed, the code won, and the
24
- * disagreement was ruled at the entry's gate
25
- * (stigmer-cloud `_projects/2026-09/20260911.02.sp.harness-contract-and-kit/`
26
- * for S1; `20260911.03.sp.turn-runtime-extraction/` M3 for the growth below).
24
+ * disagreement was ruled before the code landed (#1064; the growth below in
25
+ * #1070).
27
26
  *
28
27
  * What is deliberately NOT on this contract, and why:
29
28
  *
@@ -31,11 +30,13 @@
31
30
  * (`maxConcurrentActivities`), so a per-turn teardown method on the
32
31
  * adapter is a race. The adapter owns its per-turn teardown in its own
33
32
  * `finally` inside `runTurn` (the Cursor harness parks its agent there).
34
- * - No `isCancelled()`, no `heartbeat(details)`, no `ExecutionStatusWriter`
35
- * base. Each would be a second way of saying something `stopSignal`,
36
- * `recordActivity()` or `requestPersist()` already says, and two writers of
37
- * one fact drift (the native builders' `forceNextUpdate` flag is the same
38
- * fact as a `requestPersist()` call).
33
+ * - No `isCancelled()`, no `heartbeat(details)`, and the sink does not
34
+ * EXTEND a status-writer interface. Each would be a second way of saying
35
+ * something `stopSignal`, `recordActivity()` or `requestPersist()` already
36
+ * says, and two writers of one fact drift. The transcript builder rides
37
+ * the sink as a MEMBER (`transcript`), and the distinction holds: its
38
+ * `dirty` is a fact the adapter's persist decision reads, `requestPersist()`
39
+ * is the act; one fact, one act, no second writer.
39
40
  * - No `reason` on `interrupted`, no payload on `completed`, no `retryable`
40
41
  * on `failed`. Every cause of stopping is the runtime's own evidence; the
41
42
  * final text and structured output are already folded onto the status;
@@ -53,9 +54,9 @@
53
54
  * propagates it.
54
55
  * - No persist cadence. The runtime's chokepoint is single-flight and
55
56
  * unconditional at settle; WHEN a streaming turn asks for a write is the
56
- * adapter's (`shared/persist-decision.ts` over its own dirty flags, since
57
- * what counts as a discrete change is engine knowledge). Revisited with
58
- * both loops in view at S3 M4 and kept (Q-S3-13): the cadence RULE is
57
+ * adapter's (`shared/persist-decision.ts` over the builder's `dirty`
58
+ * flag, since WHEN to ask is engine cadence). Revisited with
59
+ * both loops in view in #1096 and kept: the cadence RULE is
59
60
  * shared, the timing is the engine's.
60
61
  * - No capture. The file-review capture is the runtime's whole
61
62
  * (`harness/capture.ts`): the baseline before `runTurn`, the candidate
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEG"}
@@ -4,7 +4,7 @@
4
4
  * the persist chokepoint writes before every status write, and the running
5
5
  * cost the `max_cost_usd` cap is enforced against.
6
6
  *
7
- * Who owns what (Q-S2-12): the ADAPTER prices, because only it has its
7
+ * Who owns what: the ADAPTER prices, because only it has its
8
8
  * vendor's rate table and variant semantics (`execute-cursor/usage-pricing.ts`
9
9
  * for Cursor); the RUNTIME accounts and enforces, because the cap and the
10
10
  * summary are the platform's, the same for every engine. A delta therefore
@@ -14,7 +14,7 @@
14
14
  * preferences (`TurnInput.model`), the audit trail that the account default
15
15
  * was never left in control (#357, #772).
16
16
  *
17
- * Moved from `activities/execute-cursor/usage-accumulator.ts` at S2 M3, the
17
+ * Moved from `activities/execute-cursor/usage-accumulator.ts` in #1070, the
18
18
  * pricing call split out; the sums, the snapshot shape and the empty
19
19
  * snapshot are unchanged, so `streamingUsage` is byte-for-byte what the
20
20
  * Cursor orchestrator wrote.
@@ -4,7 +4,7 @@
4
4
  * the persist chokepoint writes before every status write, and the running
5
5
  * cost the `max_cost_usd` cap is enforced against.
6
6
  *
7
- * Who owns what (Q-S2-12): the ADAPTER prices, because only it has its
7
+ * Who owns what: the ADAPTER prices, because only it has its
8
8
  * vendor's rate table and variant semantics (`execute-cursor/usage-pricing.ts`
9
9
  * for Cursor); the RUNTIME accounts and enforces, because the cap and the
10
10
  * summary are the platform's, the same for every engine. A delta therefore
@@ -14,7 +14,7 @@
14
14
  * preferences (`TurnInput.model`), the audit trail that the account default
15
15
  * was never left in control (#357, #772).
16
16
  *
17
- * Moved from `activities/execute-cursor/usage-accumulator.ts` at S2 M3, the
17
+ * Moved from `activities/execute-cursor/usage-accumulator.ts` in #1070, the
18
18
  * pricing call split out; the sums, the snapshot shape and the empty
19
19
  * snapshot are unchanged, so `streamingUsage` is byte-for-byte what the
20
20
  * Cursor orchestrator wrote.
@@ -14,7 +14,7 @@
14
14
  * adapter's interceptors must patch `node:http2` before anything dials the
15
15
  * control plane, so it boots first. The native deep-agent adapter boots
16
16
  * second; its `boot` registers the deepagents harness profiles and loads
17
- * LangChain, both after the patch (S3 M2b, 2026-09-13; until then the roots
17
+ * LangChain, both after the patch (#1096, 2026-09-13; until then the roots
18
18
  * imported the native orchestrator directly beside this table).
19
19
  *
20
20
  * THIS MODULE'S STATIC GRAPH MUST STAY CONNECT- AND SDK-FREE. The roots
@@ -22,9 +22,10 @@
22
22
  * where `node:http2` is patched and `@cursor/sdk` first loaded; an adapter
23
23
  * factory that imported its SDK statically would defeat both. Every adapter
24
24
  * named here loads its vendor SDK inside `boot` (`execute-cursor/adapter.ts`
25
- * and `execute-deep-agent/adapter.ts` show the shape; each has a fence that
26
- * walks its static graph). `__tests__/harness-boot-order.test.ts` boots a
27
- * fresh process through this module — both rows — and fails if the graph
25
+ * and `execute-deep-agent/adapter.ts` show the shape; the native adapter's
26
+ * `__tests__/adapter-graph-is-sdk-free.test.ts` walks its static graph off
27
+ * the syntax tree). `__tests__/harness-boot-order.test.ts` boots a fresh
28
+ * process through this module — both rows — and fails if either graph
28
29
  * regresses.
29
30
  */
30
31
  import type { HarnessRow } from "./harness/registry.js";
@@ -14,7 +14,7 @@
14
14
  * adapter's interceptors must patch `node:http2` before anything dials the
15
15
  * control plane, so it boots first. The native deep-agent adapter boots
16
16
  * second; its `boot` registers the deepagents harness profiles and loads
17
- * LangChain, both after the patch (S3 M2b, 2026-09-13; until then the roots
17
+ * LangChain, both after the patch (#1096, 2026-09-13; until then the roots
18
18
  * imported the native orchestrator directly beside this table).
19
19
  *
20
20
  * THIS MODULE'S STATIC GRAPH MUST STAY CONNECT- AND SDK-FREE. The roots
@@ -22,9 +22,10 @@
22
22
  * where `node:http2` is patched and `@cursor/sdk` first loaded; an adapter
23
23
  * factory that imported its SDK statically would defeat both. Every adapter
24
24
  * named here loads its vendor SDK inside `boot` (`execute-cursor/adapter.ts`
25
- * and `execute-deep-agent/adapter.ts` show the shape; each has a fence that
26
- * walks its static graph). `__tests__/harness-boot-order.test.ts` boots a
27
- * fresh process through this module — both rows — and fails if the graph
25
+ * and `execute-deep-agent/adapter.ts` show the shape; the native adapter's
26
+ * `__tests__/adapter-graph-is-sdk-free.test.ts` walks its static graph off
27
+ * the syntax tree). `__tests__/harness-boot-order.test.ts` boots a fresh
28
+ * process through this module — both rows — and fails if either graph
28
29
  * regresses.
29
30
  */
30
31
  import { createCursorAdapter } from "./activities/execute-cursor/adapter.js";
@@ -1 +1 @@
1
- {"version":3,"file":"harness-adapters.js","sourceRoot":"","sources":["../src/harness-adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGpF,MAAM,CAAC,MAAM,gBAAgB,GAA0B;IACrD,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE;IACrD,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE;CAC7D,CAAC"}
1
+ {"version":3,"file":"harness-adapters.js","sourceRoot":"","sources":["../src/harness-adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGpF,MAAM,CAAC,MAAM,gBAAgB,GAA0B;IACrD,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE;IACrD,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE;CAC7D,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The activity boundary's ONE entry into the run-credential store.
3
+ *
4
+ * Every activity a worker runs — the server-dispatched turn activities, the
5
+ * server-dispatched GenerateSessionSubject, and every local or remote
6
+ * activity the runner's own serverless-workflow engine schedules — passes
7
+ * through this inbound interceptor. It reads the run credential from
8
+ * whichever channel the dispatch used (`shared/run-credential.ts`: the
9
+ * Temporal header the runner's workflow stamps, else the input object's
10
+ * key the server's workflow sets) and runs the activity inside
11
+ * `withRunCredential`, so that every control-plane request the activity
12
+ * makes — however deep, however detached — is made as the run's human.
13
+ *
14
+ * Header before input: a runner-dispatched activity's header is the nearer
15
+ * authority; in practice a dispatch carries exactly one of the two. An
16
+ * activity whose dispatch carried neither runs with no credential in the
17
+ * store, and the client falls back to the process credential exactly as it
18
+ * did before the store existed — an older server, and the cloud, see no
19
+ * change.
20
+ *
21
+ * Both worker roots (`worker.ts`, `runner-manager.ts`) register this
22
+ * unconditionally; it is inert without a credential. It logs nothing: a
23
+ * credential is never written to a log, and the arguments it inspects may
24
+ * carry anything.
25
+ */
26
+ import type { ActivityInterceptorsFactory } from "@temporalio/worker";
27
+ /** The inbound interceptor factory both worker roots register. */
28
+ export declare const runCredentialActivityInterceptor: ActivityInterceptorsFactory;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * The activity boundary's ONE entry into the run-credential store.
3
+ *
4
+ * Every activity a worker runs — the server-dispatched turn activities, the
5
+ * server-dispatched GenerateSessionSubject, and every local or remote
6
+ * activity the runner's own serverless-workflow engine schedules — passes
7
+ * through this inbound interceptor. It reads the run credential from
8
+ * whichever channel the dispatch used (`shared/run-credential.ts`: the
9
+ * Temporal header the runner's workflow stamps, else the input object's
10
+ * key the server's workflow sets) and runs the activity inside
11
+ * `withRunCredential`, so that every control-plane request the activity
12
+ * makes — however deep, however detached — is made as the run's human.
13
+ *
14
+ * Header before input: a runner-dispatched activity's header is the nearer
15
+ * authority; in practice a dispatch carries exactly one of the two. An
16
+ * activity whose dispatch carried neither runs with no credential in the
17
+ * store, and the client falls back to the process credential exactly as it
18
+ * did before the store existed — an older server, and the cloud, see no
19
+ * change.
20
+ *
21
+ * Both worker roots (`worker.ts`, `runner-manager.ts`) register this
22
+ * unconditionally; it is inert without a credential. It logs nothing: a
23
+ * credential is never written to a log, and the arguments it inspects may
24
+ * carry anything.
25
+ */
26
+ import { defaultPayloadConverter } from "@temporalio/common";
27
+ import { RUN_CREDENTIAL_HEADER, readRunCredentialFromInput, } from "../shared/run-credential.js";
28
+ import { withRunCredential } from "../shared/run-credential-store.js";
29
+ /** The inbound interceptor factory both worker roots register. */
30
+ export const runCredentialActivityInterceptor = () => ({
31
+ inbound: {
32
+ async execute(input, next) {
33
+ const credential = readRunCredentialFromHeader(input.headers[RUN_CREDENTIAL_HEADER]) ??
34
+ readRunCredentialFromInput(input.args[0]);
35
+ if (credential === undefined) {
36
+ return next(input);
37
+ }
38
+ return withRunCredential(credential, () => next(input));
39
+ },
40
+ },
41
+ });
42
+ /**
43
+ * The credential a header payload carries, or `undefined` when there is no
44
+ * such header or it does not decode to a non-empty string. Decoding uses the
45
+ * default converter, never the worker's data converter: headers bypass the
46
+ * payload codecs by SDK design, and the stamping side encodes with the same
47
+ * default converter.
48
+ */
49
+ function readRunCredentialFromHeader(payload) {
50
+ if (payload === undefined) {
51
+ return undefined;
52
+ }
53
+ const value = defaultPayloadConverter.fromPayload(payload);
54
+ return typeof value === "string" && value !== "" ? value : undefined;
55
+ }
56
+ //# sourceMappingURL=run-credential-activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-credential-activity.js","sourceRoot":"","sources":["../../src/interceptors/run-credential-activity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,kEAAkE;AAClE,MAAM,CAAC,MAAM,gCAAgC,GAC3C,GAAG,EAAE,CAAC,CAAC;IACL,OAAO,EAAE;QACP,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI;YACvB,MAAM,UAAU,GACd,2BAA2B,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;gBACjE,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,OAAO,iBAAiB,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,CAAC;KACF;CACF,CAAC,CAAC;AAEL;;;;;;GAMG;AACH,SAAS,2BAA2B,CAAC,OAAgB;IACnD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAY,uBAAuB,CAAC,WAAW,CACxD,OAAoE,CACrE,CAAC;IACF,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC"}
@@ -24,6 +24,12 @@
24
24
  * unrecognized mutating built-in (e.g. `bash`, `overwrite_file`) is therefore
25
25
  * gated by what it does, not by whether someone remembered to list it.
26
26
  *
27
+ * The decision itself — `resolveToolApproval` — lives in
28
+ * `shared/approval-policy.ts` beside its provenance twin since #1097:
29
+ * the native translator reports the same answer on every
30
+ * `tool_started`, so the transcript row and this gate can never disagree
31
+ * about whether a call waits. This module is where the decision is ACTED on.
32
+ *
27
33
  * Gateway invariant (Phase 2): this middleware IS the in-process execution
28
34
  * gateway for the deep-agent harness — `handler(request)` is the side effect. A
29
35
  * side effect runs only with a backing authorization: either (a) the tool was
@@ -24,6 +24,12 @@
24
24
  * unrecognized mutating built-in (e.g. `bash`, `overwrite_file`) is therefore
25
25
  * gated by what it does, not by whether someone remembered to list it.
26
26
  *
27
+ * The decision itself — `resolveToolApproval` — lives in
28
+ * `shared/approval-policy.ts` beside its provenance twin since #1097:
29
+ * the native translator reports the same answer on every
30
+ * `tool_started`, so the transcript row and this gate can never disagree
31
+ * about whether a call waits. This module is where the decision is ACTED on.
32
+ *
27
33
  * Gateway invariant (Phase 2): this middleware IS the in-process execution
28
34
  * gateway for the deep-agent harness — `handler(request)` is the side effect. A
29
35
  * side effect runs only with a backing authorization: either (a) the tool was
@@ -44,20 +50,11 @@
44
50
  */
45
51
  import { ToolMessage } from "@langchain/core/messages";
46
52
  import { interrupt } from "@langchain/langgraph";
47
- import { POLICY_ENGINE_VERSION, resolveApprovalMessage, unattendedSkipMessage, } from "../shared/approval-policy.js";
53
+ import { POLICY_ENGINE_VERSION, resolveToolApproval, unattendedSkipMessage, } from "../shared/approval-policy.js";
48
54
  import { toolApprovalCategory } from "../shared/tool-kind.js";
49
55
  import { extractFilePath } from "../shared/file-tools.js";
50
56
  import { isSecretLikePath } from "../shared/filereview/secret-paths.js";
51
57
  import { computeApprovalFingerprint, } from "../shared/approval-fingerprint.js";
52
- // Approval-message template per mutating category. Keyed by category (not raw
53
- // tool name) so every alias of a mutation renders one message; placeholders
54
- // resolve against the deep-agent stream arg shape (`path`/`command`). Mirrors
55
- // the Cursor side's CATEGORY_APPROVAL_MESSAGE.
56
- const CATEGORY_APPROVAL_MESSAGE = {
57
- write: "Write file: {{args.path}}",
58
- delete: "Delete: {{args.path}}",
59
- shell: "Execute command: {{args.command}}",
60
- };
61
58
  /**
62
59
  * The ToolMessage returned when a secret-like write is hard-blocked (DD-E /
63
60
  * DD-26 #2): the write is NEVER applied and the graph continues (this replaces
@@ -236,53 +233,6 @@ export function createApprovalGateMiddleware(config) {
236
233
  },
237
234
  };
238
235
  }
239
- function resolveToolApproval(toolName, serverSlug, args, policies, leasedCategories) {
240
- if (serverSlug) {
241
- // MCP tools stay governed by the connect-flow classifier + four-level policy
242
- // chain. The policy map carries only the tools that REQUIRE approval, so an
243
- // absent entry means the classifier already auto-approved it — fail-OPEN is
244
- // correct here (a fail-closed default would re-gate everything the classifier
245
- // cleared). This is deliberately NOT changed by the built-in fail-closed flip.
246
- //
247
- // A server-scoped lease surfaces here as an absent entry too: the leased
248
- // server's tools are dropped from `policies` upstream (mergeApprovalPolicies),
249
- // so a lease-cleared MCP tool takes this same auto-approve path. (Its shadow
250
- // receipt therefore reads classifier_default rather than approval_lease; a
251
- // faithful per-server lease provenance would need the lease set threaded here
252
- // and is deferred with the rest of the persisted-receipt work.)
253
- const key = `${serverSlug}/${toolName}`;
254
- const policy = policies.get(key);
255
- if (policy) {
256
- return {
257
- requiresApproval: policy.requiresApproval,
258
- message: resolveApprovalMessage(policy.approvalMessage, toolName, args),
259
- source: policy.source,
260
- };
261
- }
262
- // Absent = cleared by the MCP four-level chain (classifier base) or by a
263
- // server-scoped lease (dropped upstream).
264
- return { requiresApproval: false, message: "", source: "classifier_default" };
265
- }
266
- // Built-in/platform tool: gate exactly the mutating categories via the shared
267
- // classifier. Fail-CLOSED for the mutating set — any built-in classifyTool
268
- // deems write/edit/delete/shell requires approval. Read-only and unclassified
269
- // built-ins are not mutating, so they remain fail-open.
270
- const category = toolApprovalCategory(toolName);
271
- if (category) {
272
- // Run-lifetime category lease: the user chose "approve all <category>"
273
- // earlier in this run, so every built-in of that category is auto-approved
274
- // for the rest of the run (the scoped successor to auto-approve-all).
275
- if (leasedCategories.has(category)) {
276
- return { requiresApproval: false, message: "", source: "approval_lease" };
277
- }
278
- return {
279
- requiresApproval: true,
280
- message: resolveApprovalMessage(CATEGORY_APPROVAL_MESSAGE[category], toolName, args),
281
- source: "builtin_category",
282
- };
283
- }
284
- return { requiresApproval: false, message: "", source: "builtin_category" };
285
- }
286
236
  /** Shared empty set so a config without leases allocates nothing per call. */
287
237
  const EMPTY_CATEGORY_SET = new Set();
288
238
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"approval-gate.js","sourceRoot":"","sources":["../../src/middleware/approval-gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"approval-gate.js","sourceRoot":"","sources":["../../src/middleware/approval-gate.ts"],"names":[],"mappings":"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"}
@@ -11,17 +11,17 @@
11
11
  * shape `execution-budget.ts` already has beside LangGraph's `recursionLimit`:
12
12
  * the middleware warns inside the graph, the engine's own limit enforces.
13
13
  *
14
- * Until S3 M2b (Q-S3-3) this module was `cost-cap.ts` and did both: it also
14
+ * Until #1096 this module was `cost-cap.ts` and did both: it also
15
15
  * blocked every tool call once the running cost passed the cap and gave the
16
16
  * model one tool-free round to summarize. That second enforcement lived
17
17
  * inside the graph, where the runtime could not see it, and a platform STOP
18
18
  * had a sibling (`graceful-stop.ts`, deleted with it) that let the run spend
19
19
  * a summary round after the platform said stop. Both went when the runtime
20
- * became the one place a turn is stopped (harness runtime program, S3).
20
+ * became the one place a turn is stopped.
21
21
  *
22
22
  * afterModel — reads `usage_metadata` off the latest AIMessage, prices the
23
23
  * call at the parent's rates (a sub-agent on its own model is priced the
24
- * same way the enforcement prices it; per-sub-agent pricing is an S5 item),
24
+ * same way the enforcement prices it; per-sub-agent pricing is #1121),
25
25
  * accumulates the running total, and injects the warning SystemMessage once
26
26
  * at `warningPct` of the cap.
27
27
  *
@@ -11,17 +11,17 @@
11
11
  * shape `execution-budget.ts` already has beside LangGraph's `recursionLimit`:
12
12
  * the middleware warns inside the graph, the engine's own limit enforces.
13
13
  *
14
- * Until S3 M2b (Q-S3-3) this module was `cost-cap.ts` and did both: it also
14
+ * Until #1096 this module was `cost-cap.ts` and did both: it also
15
15
  * blocked every tool call once the running cost passed the cap and gave the
16
16
  * model one tool-free round to summarize. That second enforcement lived
17
17
  * inside the graph, where the runtime could not see it, and a platform STOP
18
18
  * had a sibling (`graceful-stop.ts`, deleted with it) that let the run spend
19
19
  * a summary round after the platform said stop. Both went when the runtime
20
- * became the one place a turn is stopped (harness runtime program, S3).
20
+ * became the one place a turn is stopped.
21
21
  *
22
22
  * afterModel — reads `usage_metadata` off the latest AIMessage, prices the
23
23
  * call at the parent's rates (a sub-agent on its own model is priced the
24
- * same way the enforcement prices it; per-sub-agent pricing is an S5 item),
24
+ * same way the enforcement prices it; per-sub-agent pricing is #1121),
25
25
  * accumulates the running total, and injects the warning SystemMessage once
26
26
  * at `warningPct` of the cap.
27
27
  *
@@ -21,7 +21,7 @@
21
21
  * Every middleware here either shapes the graph's tool surface or ADVISES
22
22
  * the model; none of them stops the run. A stop — the platform's, the
23
23
  * cost cap's, a stall's — is the turn runtime's, delivered to the graph
24
- * through its abort signal (harness runtime program, S3 Q-S3-3; until M2b a
24
+ * through its abort signal (since #1096; until then a
25
25
  * graceful-stop middleware and the cost cap's tool block were second stops
26
26
  * inside the graph that the runtime could not see).
27
27
  *
@@ -21,7 +21,7 @@
21
21
  * Every middleware here either shapes the graph's tool surface or ADVISES
22
22
  * the model; none of them stops the run. A stop — the platform's, the
23
23
  * cost cap's, a stall's — is the turn runtime's, delivered to the graph
24
- * through its abort signal (harness runtime program, S3 Q-S3-3; until M2b a
24
+ * through its abort signal (since #1096; until then a
25
25
  * graceful-stop middleware and the cost cap's tool block were second stops
26
26
  * inside the graph that the runtime could not see).
27
27
  *
@@ -19,7 +19,8 @@ import { DEFAULT_CURSOR_AGENT_RESOLVE_TIMEOUT_MS, DEFAULT_CURSOR_STREAM_STALL_TI
19
19
  // same. Inert unless a mode emits the boot timeline (pool mode does; the
20
20
  // desktop manager never calls emitRunnerBootTiming, so marks cost nothing).
21
21
  import { markBoot } from "./shared/cold-start-timing.js";
22
- import { resolveWorkflowSource, OTEL_WORKFLOW_INTERCEPTOR_MODULE } from "./workflow-source.js";
22
+ import { resolveWorkflowSource, runCredentialWorkflowInterceptorModule, OTEL_WORKFLOW_INTERCEPTOR_MODULE, } from "./workflow-source.js";
23
+ import { runCredentialActivityInterceptor } from "./interceptors/run-credential-activity.js";
23
24
  import { resolveRunnerBootstrap, refreshRunnerAccessToken } from "./bootstrap.js";
24
25
  import { assertLlmBackendsPreflight } from "./preflight.js";
25
26
  import { captureRunnerSecrets, getRunnerSecret, setRunnerSecret, } from "./shared/runner-credential-store.js";
@@ -451,7 +452,7 @@ export function mapManagerOptionsToConfig(options, tokenRef, runnerTokenRef) {
451
452
  // The manager's proxy credential is the minted runner token once adopted
452
453
  // (the control-plane token in lockstep before that), so it is this ref and
453
454
  // not `tokenRef`: binding `tokenRef` would keep sending the desktop's own
454
- // Auth0 token as x-stigmer-auth after the mint (Q-S2-7).
455
+ // Auth0 token as x-stigmer-auth after the mint.
455
456
  proxyTokenRef: runnerTokenRef,
456
457
  cursorApiKey: proxyActive
457
458
  ? (options.cursorApiKey ?? "proxy-managed")
@@ -522,9 +523,14 @@ async function createAllActivities(config) {
522
523
  }
523
524
  async function buildInterceptorConfig() {
524
525
  const { createWorkflowMetricsSinks } = await import("./interceptors/workflow-metrics-sink.js");
525
- const activityInterceptors = [];
526
+ // The run credential's two ends (shared/run-credential.ts), always on and
527
+ // inert without a credential — the same pair the static root registers
528
+ // (worker.ts). The workflow module reaches the bundle through
529
+ // `workflowInterceptorModules` on the runtime path and is baked in on the
530
+ // pre-built path (scripts/bundle-slim.mjs).
531
+ const activityInterceptors = [runCredentialActivityInterceptor];
526
532
  let sinks = { ...createWorkflowMetricsSinks() };
527
- const workflowInterceptorModules = [];
533
+ const workflowInterceptorModules = [runCredentialWorkflowInterceptorModule()];
528
534
  // In-flight activity counter: keeps a session/wfexec worker alive while one of
529
535
  // its activities (notably the long ExecuteCursor) is running, so a view close
530
536
  // can no longer reap the worker mid-run. Always installed; cheap and global.