@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
@@ -9,7 +9,7 @@
9
9
  * runtime's stall watchdog measures the engine; `reportUsage()` per parent
10
10
  * `message_finish`, priced here at the registry's rates for the model the
11
11
  * turn runs on (`shared/model-pricing.ts`), so the runtime accounts and
12
- * enforces the cost cap and writes `streamingUsage` (Q-M2a-2); `requestPersist()`
12
+ * enforces the cost cap and writes `streamingUsage`; `requestPersist()`
13
13
  * where a discrete change or the streaming cadence says so
14
14
  * (`shared/persist-decision.ts` over the builder's one dirty flag), AWAITED,
15
15
  * so a platform STOP the runtime reads from that write aborts the signal
@@ -19,7 +19,7 @@
19
19
  * this loop never does). An error the aborted run throws is the abort itself
20
20
  * and settles `interrupted`, never `failed`.
21
21
  *
22
- * WHEN the run is aborted (S3 M2a, F-M2a-18): on the arrival of the next
22
+ * WHEN the run is aborted: on the arrival of the next
23
23
  * event — the graph's own step boundary — or after {@link STOP_GRACE_MS} if
24
24
  * no event arrives. A LangGraph run aborted while a step is in flight leaves
25
25
  * `@langchain/core` with an orphaned rejection (`AsyncGeneratorWithSetup`
@@ -34,7 +34,7 @@
34
34
  * here) is forced, and that one orphan is the price of unblocking it — the
35
35
  * contract's bound on settling `interrupted` is what wins.
36
36
  *
37
- * Until S3 M2a this loop (`streaming-v3.ts`) armed its own 120 s stall
37
+ * Until #1096 this loop (`streaming-v3.ts`) armed its own 120 s stall
38
38
  * check, pulsed the Temporal heartbeat every 2 s, read STOP from its own
39
39
  * persist and activated a graceful-stop middleware on it, told a pause from
40
40
  * the activity's cancellation signal, and wrote PAUSED, COMPLETED and
@@ -53,8 +53,7 @@ import { TimeoutError, withTimeout } from "../../shared/with-timeout.js";
53
53
  import { InlinePublisher } from "./inline-publisher.js";
54
54
  import { StreamingSideEffects } from "./streaming-side-effects.js";
55
55
  import { createV3EventRecorder, type V3ProtocolEvent } from "./v3-event-recorder.js";
56
- import { normalize } from "./v3-protocol-normalizer.js";
57
- import { V3StatusBuilder } from "./v3-status-builder.js";
56
+ import { DeepAgentTranslator, usageOf, type V3UsagePayload } from "./translator.js";
58
57
  import type { DeepAgentEngine, DeepAgentGraphInput, DeepAgentWorkspace } from "./turn-setup.js";
59
58
 
60
59
  /**
@@ -95,14 +94,17 @@ export interface DeepAgentStreamResult {
95
94
  }
96
95
 
97
96
  /**
98
- * The transcript writers of one turn: the builder over `sink.status` and the
99
- * publisher that writes artifacts through it (so a published artifact still
100
- * forces the next persist). Built by the adapter's turn once and shared by
101
- * the stream and the settle; the builder reports usage into the sink, priced
102
- * for the model the turn runs on.
97
+ * This harness's transcript writers for one turn: the translator that turns
98
+ * the engine's events into canonical ones (over the gate's posture, so every
99
+ * tool start carries its attribution and gate answer), and the publisher
100
+ * that registers artifacts on the runtime's builder (`sink.transcript`, so
101
+ * a published artifact still dirties the next persist). The builder itself
102
+ * is the runtime's, one per turn, and is read from the sink where it is
103
+ * needed. Built by the adapter's turn once and shared by the stream and the
104
+ * settle.
103
105
  */
104
106
  export interface DeepAgentTranscript {
105
- readonly builder: V3StatusBuilder;
107
+ readonly translator: DeepAgentTranslator;
106
108
  readonly publisher: InlinePublisher;
107
109
  }
108
110
 
@@ -112,41 +114,40 @@ export function createDeepAgentTranscript(
112
114
  engine: DeepAgentEngine,
113
115
  workspace: DeepAgentWorkspace,
114
116
  ): DeepAgentTranscript {
115
- const builder = new V3StatusBuilder(input.executionId, sink.status, {
116
- onUsage: (usage) => {
117
- // LangChain's `input_tokens` already INCLUDES the cache buckets (the
118
- // Anthropic adapter folds them in; the cost advisory reads them the
119
- // same way), so the counts are reported as delivered and the price
120
- // is computed over the disjoint buckets.
121
- const inputTokens = usage.input_tokens ?? 0;
122
- const outputTokens = usage.output_tokens ?? 0;
123
- const cacheReadTokens = usage.input_token_details?.cache_read ?? 0;
124
- const cacheWriteTokens = usage.input_token_details?.cache_creation ?? 0;
125
- const uncachedInput = Math.max(inputTokens - cacheReadTokens - cacheWriteTokens, 0);
126
- sink.reportUsage({
127
- inputTokens,
128
- outputTokens,
129
- cacheReadTokens,
130
- cacheWriteTokens,
131
- estimatedCostUsd: computeTurnCost(engine.pricing, uncachedInput, outputTokens, cacheWriteTokens, cacheReadTokens),
132
- model: engine.modelName,
133
- });
134
- },
135
- });
136
- builder.setApprovalProvider({
137
- policies: engine.gate.policies,
138
- toolServerMap: engine.gate.toolServerMap,
139
- leasedCategories: engine.gate.leasedCategories,
140
- globalBypass: engine.gate.globalBypass,
141
- unattended: engine.gate.unattended,
142
- });
117
+ const translator = new DeepAgentTranslator(engine.gate);
143
118
  const publisher = new InlinePublisher({
144
119
  workspaceBackend: workspace.backend,
145
120
  artifactStorage: input.artifactStorage,
146
- statusWriter: builder,
121
+ artifacts: sink.transcript,
147
122
  executionId: input.executionId,
148
123
  });
149
- return { builder, publisher };
124
+ return { translator, publisher };
125
+ }
126
+
127
+ /**
128
+ * Price one `message-finish`'s usage at the engine's rates and report it to
129
+ * the sink, which accounts, enforces the cost cap and writes `streamingUsage`
130
+ * (one writer of the summary). LangChain's `input_tokens` already INCLUDES the cache buckets
131
+ * (the Anthropic adapter folds them in; the cost advisory reads them the same
132
+ * way), so the counts are reported as delivered and the price is computed
133
+ * over the disjoint buckets. A sub-agent on its own model is priced at the
134
+ * parent's rate, as the in-graph cost cap always did (per-sub-agent pricing
135
+ * is #1121).
136
+ */
137
+ function reportUsage(sink: TurnSink, engine: DeepAgentEngine, usage: V3UsagePayload): void {
138
+ const inputTokens = usage.input_tokens ?? 0;
139
+ const outputTokens = usage.output_tokens ?? 0;
140
+ const cacheReadTokens = usage.input_token_details?.cache_read ?? 0;
141
+ const cacheWriteTokens = usage.input_token_details?.cache_creation ?? 0;
142
+ const uncachedInput = Math.max(inputTokens - cacheReadTokens - cacheWriteTokens, 0);
143
+ sink.reportUsage({
144
+ inputTokens,
145
+ outputTokens,
146
+ cacheReadTokens,
147
+ cacheWriteTokens,
148
+ estimatedCostUsd: computeTurnCost(engine.pricing, uncachedInput, outputTokens, cacheWriteTokens, cacheReadTokens),
149
+ model: engine.modelName,
150
+ });
150
151
  }
151
152
 
152
153
  export interface DeepAgentStreamDeps {
@@ -165,7 +166,8 @@ export interface DeepAgentStreamDeps {
165
166
  export async function consumeDeepAgentStream(deps: DeepAgentStreamDeps): Promise<DeepAgentStreamResult> {
166
167
  const { input, sink, engine, graphInput, transcript } = deps;
167
168
  const { executionId } = input;
168
- const { builder, publisher } = transcript;
169
+ const { translator, publisher } = transcript;
170
+ const builder = sink.transcript;
169
171
 
170
172
  const scheduler = new StreamingUpdateScheduler(loadStreamingConfig());
171
173
  const recorder = createV3EventRecorder(executionId, process.env.V3_EVENT_RECORD_DIR);
@@ -214,21 +216,21 @@ export async function consumeDeepAgentStream(deps: DeepAgentStreamDeps): Promise
214
216
 
215
217
  recorder?.record(event, eventsProcessed);
216
218
  let detail: string | undefined;
217
- for (const normalized of normalize(event)) {
218
- builder.processEvent(normalized);
219
+ for (const normalized of translator.translate(event)) {
220
+ builder.apply(normalized);
221
+ sideEffects.onEvent(normalized);
219
222
  if (normalized.kind === "tool_started") detail = normalized.name;
220
223
  }
221
- sideEffects.onProtocolEvent(event);
224
+ const usage = usageOf(event);
225
+ if (usage) reportUsage(sink, engine, usage);
222
226
  eventsProcessed++;
223
227
  sink.recordActivity(detail);
224
228
 
225
- const persist = shouldPersistStreamingStatus(
226
- { deltaEnricherDirty: false, todosDirty: false, contentDirty: builder.forceNextUpdate },
227
- scheduler,
228
- eventsProcessed,
229
- );
229
+ const persist = shouldPersistStreamingStatus(builder.dirty, scheduler, eventsProcessed);
230
230
  if (!persist) continue;
231
- builder.clearForceFlag();
231
+ // Cleared as the write is requested, not after it lands: a change
232
+ // that folds while the write is in flight must dirty the next one.
233
+ builder.markPersisted();
232
234
  // The runtime attaches the mid-run file-change progress on this write
233
235
  // (the chokepoint's step 2), as it does on every write. Awaited so a platform STOP the runtime reads from this write has
234
236
  // aborted the signal by the time the next event arrives — where the
@@ -24,7 +24,7 @@
24
24
  * other exception — a provider error unwrapped from LangChain's middleware
25
25
  * wrapper, an MCP connect failure, an empty stream — is `failed` on the
26
26
  * `internal` surface with `describeExecutionError`'s sentence as
27
- * `status.error` whole (Q-M2a-9). Never branches on why `stopSignal`
27
+ * `status.error` whole. Never branches on why `stopSignal`
28
28
  * aborted, never writes a phase or a terminal copy, never imports
29
29
  * `@temporalio/*` (`__tests__/adapter-is-temporal-free.test.ts`).
30
30
  *
@@ -33,9 +33,9 @@
33
33
  * are connected and closed per turn. Both are closed on EVERY exit path in
34
34
  * the `finally`, before the runtime removes the link and releases the lock.
35
35
  *
36
- * Extracted from `index.ts` `createDeepAgentActivities` at S3 M2a; the
36
+ * Extracted from `index.ts` `createDeepAgentActivities` in #1096; the
37
37
  * hermetic goldens under `__tests__/hermetic/` pin the result byte for
38
- * byte, with the ruled alignments quoted in their headers.
38
+ * byte, with that move's deliberate alignments quoted in their headers.
39
39
  */
40
40
 
41
41
  import type { BaseCheckpointSaver } from "@langchain/langgraph-checkpoint";
@@ -23,12 +23,24 @@
23
23
  * here degrades to a heuristic title (the first words of the user message):
24
24
  * a title is worth having even when no model is reachable.
25
25
  *
26
- * Activity contract (the Go stub dispatches exactly ONE argument — the cloud
27
- * Java signature carries a second, invokerIdentityAccountId, that never
28
- * crosses this wire):
26
+ * Activity contract — exactly ONE argument, in one of two shapes:
29
27
  * Name: "GenerateSessionSubject"
30
28
  * Input: (executionId: string)
29
+ * | ({ execution_id, execution_context_token? }: GenerateSessionSubjectInput)
31
30
  * Output: void
31
+ *
32
+ * The object is what a server sends when the dispatch carries the run's
33
+ * credential (shared/run-credential.ts), so that this activity reads the
34
+ * run and titles the session AS THE RUN'S HUMAN — with sign-in on, the
35
+ * operator's key the process holds cannot read a member's run. The string
36
+ * is what every server sent before, and what a server whose dispatch carries
37
+ * no credential still sends (the cloud's, whose desktop runners in the field
38
+ * must keep titling sessions). Both shapes are accepted — the dual-shape
39
+ * posture the turn activities take (shared/activity-input.ts); the
40
+ * credential itself is entered by the activity boundary
41
+ * (interceptors/run-credential-activity.ts), never read here. The cloud's
42
+ * Java signature carries a second argument, invokerIdentityAccountId, that
43
+ * never crosses this wire.
32
44
  */
33
45
 
34
46
  import { SystemMessage, HumanMessage } from "@langchain/core/messages";
@@ -344,6 +356,16 @@ function log(msg: string): void {
344
356
  // Temporal Activity Factory
345
357
  // ─────────────────────────────────────────────────────────────────────────────
346
358
 
359
+ /**
360
+ * The typed wire shape of the activity's argument (snake_case keys, the
361
+ * polyglot workflow-input convention). `execution_context_token` is the run
362
+ * credential, present exactly when the dispatch carried one.
363
+ */
364
+ export interface GenerateSessionSubjectInput {
365
+ readonly execution_id: string;
366
+ readonly execution_context_token?: string;
367
+ }
368
+
347
369
  export function createGenerateSessionSubjectActivities(config: Config) {
348
370
  const client = new StigmerClient({
349
371
  endpoint: config.stigmerBackendEndpoint,
@@ -353,7 +375,10 @@ export function createGenerateSessionSubjectActivities(config: Config) {
353
375
  });
354
376
 
355
377
  return {
356
- GenerateSessionSubject: async (executionId: string): Promise<void> => {
378
+ GenerateSessionSubject: async (
379
+ input: GenerateSessionSubjectInput | string,
380
+ ): Promise<void> => {
381
+ const executionId = typeof input === "string" ? input : input.execution_id;
357
382
  activityStarted();
358
383
  try {
359
384
  log(`started: execution=${executionId}`);
@@ -20,6 +20,8 @@ vi.mock("@connectrpc/connect", () => ({
20
20
  }));
21
21
 
22
22
  import { StigmerClient } from "../stigmer-client.js";
23
+ import { withRunCredential } from "../../shared/run-credential-store.js";
24
+ import { AgentExecutionCommandController } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/command_pb";
23
25
  import { ExecutionContextQueryController } from "@stigmer/protos/ai/stigmer/agentic/executioncontext/v1/query_pb";
24
26
  import { PlatformQueryController } from "@stigmer/protos/ai/stigmer/platform/v1/server_info_pb";
25
27
 
@@ -279,6 +281,96 @@ describe("StigmerClient", () => {
279
281
  });
280
282
  });
281
283
 
284
+ describe("run credential (the activity's own, shared/run-credential-store.ts)", () => {
285
+ // The server mints a credential for ONE execution at dispatch and, with
286
+ // sign-in on, admits its bearer as that run's human. The activity boundary
287
+ // enters it into the store; these arms pin that the client presents it on
288
+ // every RPC about a run, on no process-bound RPC, below an explicit
289
+ // per-call header and above every process credential — and that two
290
+ // concurrent activities never see each other's.
291
+
292
+ function clientWithEveryProcessCredential(): StigmerClient {
293
+ return new StigmerClient({
294
+ endpoint: "http://localhost",
295
+ token: "static-tok",
296
+ tokenRef: { current: "control-plane-tok" },
297
+ runnerTokenRef: { current: "runner-tok" },
298
+ });
299
+ }
300
+
301
+ it("presents the run credential on an ordinary control-plane RPC", async () => {
302
+ clientWithEveryProcessCredential();
303
+ const req = makeRequest();
304
+ await withRunCredential("run-cred", () => runInterceptor(req));
305
+ expect(req.header.get("authorization")).toBe("Bearer run-cred");
306
+ });
307
+
308
+ it("presents it above the runner credential on the three runner-credential RPCs", async () => {
309
+ clientWithEveryProcessCredential();
310
+ for (const req of [
311
+ makeExecutionContextRequest(),
312
+ makeScopedTokenExchangeRequest(),
313
+ makeRequest(AgentExecutionCommandController.typeName, "create"),
314
+ ]) {
315
+ await withRunCredential("run-cred", () => runInterceptor(req));
316
+ expect(req.header.get("authorization")).toBe("Bearer run-cred");
317
+ }
318
+ });
319
+
320
+ it("never presents it on the process-bound bootstrap read", async () => {
321
+ clientWithEveryProcessCredential();
322
+ const req = makeRequest(PlatformQueryController.typeName, "getRunnerBootstrapConfig");
323
+ await withRunCredential("run-cred", () => runInterceptor(req));
324
+ expect(req.header.get("authorization")).toBe("Bearer control-plane-tok");
325
+ });
326
+
327
+ it("yields to an explicit per-call credential", async () => {
328
+ clientWithEveryProcessCredential();
329
+ const req = makeRequest();
330
+ req.header.set("authorization", "Bearer explicit-tok");
331
+ await withRunCredential("run-cred", () => runInterceptor(req));
332
+ expect(req.header.get("authorization")).toBe("Bearer explicit-tok");
333
+ });
334
+
335
+ it("leaves every rule below untouched when no activity credential is current", async () => {
336
+ clientWithEveryProcessCredential();
337
+ const ordinary = makeRequest();
338
+ await runInterceptor(ordinary);
339
+ expect(ordinary.header.get("authorization")).toBe("Bearer control-plane-tok");
340
+ const ec = makeExecutionContextRequest();
341
+ await runInterceptor(ec);
342
+ expect(ec.header.get("authorization")).toBe("Bearer runner-tok");
343
+ });
344
+
345
+ it("never crosses between two concurrent activities sharing one client", async () => {
346
+ clientWithEveryProcessCredential();
347
+ const reqA = makeRequest();
348
+ const reqB = makeRequest();
349
+ await Promise.all([
350
+ withRunCredential("run-cred-A", async () => {
351
+ await new Promise((resolve) => setTimeout(resolve, 2));
352
+ await runInterceptor(reqA);
353
+ }),
354
+ withRunCredential("run-cred-B", async () => {
355
+ await new Promise((resolve) => setTimeout(resolve, 1));
356
+ await runInterceptor(reqB);
357
+ }),
358
+ ]);
359
+ expect(reqA.header.get("authorization")).toBe("Bearer run-cred-A");
360
+ expect(reqB.header.get("authorization")).toBe("Bearer run-cred-B");
361
+ });
362
+
363
+ it("acquireScopedRunnerToken answers the run credential without an exchange", async () => {
364
+ const client = clientWithEveryProcessCredential();
365
+ const exchange = vi.spyOn(client, "getRunnerScopedToken");
366
+ const token = await withRunCredential("run-cred", () =>
367
+ client.acquireScopedRunnerToken({ agentExecutionId: "aex_1" }),
368
+ );
369
+ expect(token).toBe("run-cred");
370
+ expect(exchange).not.toHaveBeenCalled();
371
+ });
372
+ });
373
+
282
374
  describe("acquireScopedRunnerToken", () => {
283
375
  function clientWithRunnerCredential(token: string | null): StigmerClient {
284
376
  return new StigmerClient({
@@ -55,6 +55,7 @@ import { ChannelMessageQueryController } from "@stigmer/protos/ai/stigmer/agenti
55
55
  import type { ChannelTemplate, MessagingChannel } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/message_io_pb";
56
56
  import { TOKEN_TYPE_EMBEDDED_RUNNER, tokenTypeOf } from "./token-claims.js";
57
57
  import { assertCreateRequirements, assertReferenceRequirements } from "./server-contracts.js";
58
+ import { currentRunCredential } from "../shared/run-credential-store.js";
58
59
 
59
60
  /**
60
61
  * Server-managed Temporal payload-encryption keys for this runner.
@@ -223,11 +224,25 @@ export class StigmerClient {
223
224
  // 1. An explicit per-call credential (an authorization header set via
224
225
  // CallOptions) always wins. The scoped-token flow (issue #156)
225
226
  // authenticates each ExecutionContext read with a token minted for
226
- // that specific execution; concurrent sessions in one runner process
227
- // make a shared mutable ref unusable for this — session A's read
228
- // must never go out with session B's token.
227
+ // that specific execution; the renewal and pool-claim exchanges
228
+ // present the token being exchanged; the connect lane hands its
229
+ // decrypt-lane token per call.
229
230
  //
230
- // 2. The runner credential (runnerTokenRef) authenticates the services
231
+ // 2. The run credential of the activity this request belongs to
232
+ // (shared/run-credential-store.ts), on every RPC that is about a
233
+ // run — which is every RPC but the process-bound bootstrap read.
234
+ // The server minted it for exactly this execution at dispatch and,
235
+ // with sign-in on, admits its bearer as the run's own human: the
236
+ // status write, the child create, the artifact, the session title
237
+ // are the member's, whoever's API key this process holds. It is
238
+ // read from the async context, never from a ref: one process serves
239
+ // many runs at once and a shared ref would be the wrong run's the
240
+ // moment two overlap — the same reason rule 1 exists. Absent
241
+ // outside an activity and when the dispatch carried none (an older
242
+ // server; the cloud, whose runner credential is provisioned), so
243
+ // the rules below are exactly what they were.
244
+ //
245
+ // 3. The runner credential (runnerTokenRef) authenticates the services
231
246
  // that require a runner-class token_type claim: ExecutionContext
232
247
  // reads carry decrypted secrets on cloud, and the server gates that
233
248
  // decrypt on runner class + scope (stigmer-cloud#152/#155); the
@@ -239,13 +254,16 @@ export class StigmerClient {
239
254
  // reserved-label guard and environment composer accept only from
240
255
  // runner-class callers — a user-token create is rejected outright.
241
256
  //
242
- // 3. Everything else uses the control-plane token. Falls through
243
- // unchanged when no runner token exists (OSS/local, where the
244
- // server enforces no auth).
257
+ // 4. Everything else uses the control-plane token: the process
258
+ // credential, an operator's API key on a self-host. Falls through
259
+ // unchanged when no runner token exists.
245
260
  (next) => async (req) => {
246
261
  if (req.header.has("authorization")) {
247
262
  return next(req);
248
263
  }
264
+ const isProcessBound =
265
+ req.service.typeName === PlatformQueryController.typeName &&
266
+ req.method.name === PlatformQueryController.method.getRunnerBootstrapConfig.name;
249
267
  const usesRunnerCredential =
250
268
  req.service.typeName === ExecutionContextQueryController.typeName ||
251
269
  (req.service.typeName === PlatformQueryController.typeName &&
@@ -253,7 +271,8 @@ export class StigmerClient {
253
271
  (req.service.typeName === AgentExecutionCommandController.typeName &&
254
272
  req.method.name === AgentExecutionCommandController.method.create.name);
255
273
  const token =
256
- (usesRunnerCredential ? this.runnerTokenRef?.current : null)
274
+ (isProcessBound ? undefined : currentRunCredential())
275
+ ?? (usesRunnerCredential ? this.runnerTokenRef?.current : null)
257
276
  ?? this.tokenRef?.current
258
277
  ?? this.currentToken;
259
278
  if (token) {
@@ -363,11 +382,16 @@ export class StigmerClient {
363
382
  * The call authenticates with the runner credential (see the interceptor).
364
383
  * Cloud verifies it is an embedded_runner token and that its identity can
365
384
  * view the named execution, then mints the same session/execution-scoped
366
- * sandbox token a cloud sandbox runner receives at provisioning. OSS mints
367
- * an execution-scoped token for any caller (oss#535 — a lane discriminator
368
- * on a single-user server, not a trust boundary). Returns undefined when
369
- * the server does not mint (pre-oss#535 OSS, or an unserved scope arm) —
370
- * presence-based, like the bootstrap token fields.
385
+ * sandbox token a cloud sandbox runner receives at provisioning. An
386
+ * open-source server with sign-in off mints an execution-scoped token for
387
+ * any caller (oss#535 — there it only unlocks the ExecutionContext decrypt
388
+ * lane); with sign-in on the same token admits its bearer as the run's
389
+ * human, so the exchange mints only for the run's own person (a missing
390
+ * run NOT_FOUND, anyone else PERMISSION_DENIED). Runs normally receive
391
+ * their credential from the dispatch itself (shared/run-credential.ts);
392
+ * this exchange is the fallback. Returns undefined when the server does
393
+ * not mint (pre-oss#535 OSS, or an unserved scope arm) — presence-based,
394
+ * like the bootstrap token fields.
371
395
  *
372
396
  * `callerToken` authenticates the exchange per-call instead of the
373
397
  * process-wide runner credential. The warm-pool attach uses it: a pool
@@ -400,7 +424,13 @@ export class StigmerClient {
400
424
  * Acquire a scoped runner token for an ExecutionContext read, if this
401
425
  * runner's credential situation calls for one.
402
426
  *
403
- * The gate is the credential itself, three ways:
427
+ * When the activity this call belongs to carries a run credential (the
428
+ * server minted it for this very execution at dispatch —
429
+ * shared/run-credential.ts), that IS the scoped token: it is answered
430
+ * without an RPC, and the exchange below serves only a dispatch that
431
+ * carried none — an older server, or the cloud's provisioned runner.
432
+ *
433
+ * Otherwise the gate is the credential itself, three ways:
404
434
  *
405
435
  * 1. An unscoped embedded_runner bootstrap token MUST be exchanged, and a
406
436
  * failed exchange is a hard error, not a fallback: since the #156
@@ -431,6 +461,10 @@ export class StigmerClient {
431
461
  async acquireScopedRunnerToken(
432
462
  scope: RunnerScopedTokenScope,
433
463
  ): Promise<string | undefined> {
464
+ const runCredential = currentRunCredential();
465
+ if (runCredential !== undefined) {
466
+ return runCredential;
467
+ }
434
468
  // Inspect the same credential chain the EC read's interceptor would use.
435
469
  const ambientTokenType = tokenTypeOf(
436
470
  this.runnerTokenRef?.current ?? this.tokenRef?.current ?? this.currentToken,
package/src/config.ts CHANGED
@@ -9,7 +9,10 @@
9
9
  *
10
10
  * 1. Direct mode (local / OSS):
11
11
  * - CURSOR_API_KEY provided directly by the user (for Cursor harness).
12
- * - STIGMER_TOKEN is optional (local stigmer-server has no auth).
12
+ * - STIGMER_TOKEN is optional against a trusted-local server (it verifies
13
+ * no credential) and is the runner's own API key against a self-hosted
14
+ * server with sign-in on; each run's credential arrives with its
15
+ * dispatch (shared/run-credential.ts).
13
16
  * - STIGMER_PROXY_ENDPOINT is NOT set.
14
17
  *
15
18
  * 2. Proxy mode (cloud / managed runners):
@@ -151,8 +154,8 @@ export interface Config {
151
154
  * provides the proxy credential and mints no other, so
152
155
  * `proxyTokenRef === stigmerTokenRef`), the manager binds the minted runner
153
156
  * token (`proxyTokenRef === stigmerRunnerTokenRef`). Reading either sibling
154
- * directly would send the wrong credential from one of the two roots
155
- * (Q-S2-7). Required whenever `proxyEndpoint` is set; the Cursor adapter's
157
+ * directly would send the wrong credential from one of the two roots.
158
+ * Required whenever `proxyEndpoint` is set; the Cursor adapter's
156
159
  * boot refuses a proxy without it.
157
160
  */
158
161
  readonly proxyTokenRef?: { current: string | null };