@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
@@ -11,13 +11,16 @@
11
11
  * model composes template sends in context without spending a tool
12
12
  * round (DD-003 D5).
13
13
  *
14
- * Two connection shapes, one roster (the records pattern):
14
+ * Two connection shapes, one roster (the records pattern), one
15
+ * credential — the run's own — presented on both:
15
16
  * - Bridge endpoint configured (cloud): Streamable HTTP against the
16
- * bridge's /channels route with the execution's own session-scoped
17
- * credential as the Bearer token.
17
+ * bridge's /channels route with the run's credential as the Bearer
18
+ * token.
18
19
  * - No bridge endpoint (OSS/local): a spawned `stigmer mcp-server`
19
- * stdio child with STIGMER_MCP_ROSTER=channels. In practice OSS
20
- * answers the discovery read with an empty list (DD-006 D3), so
20
+ * stdio child with STIGMER_MCP_ROSTER=channels and the run's
21
+ * credential as its startup credential (synthesized-attachment.ts
22
+ * `stdioCredentialEnv`, the memory attachment's twin). In practice
23
+ * OSS answers the discovery read with an empty list (DD-006 D3), so
21
24
  * this shape only serves local deployments that grow a messaging
22
25
  * runtime later — it exists for symmetry with the deployment
23
26
  * topology, not for a live OSS path today.
@@ -42,7 +45,11 @@ import type {
42
45
  } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/message_io_pb";
43
46
  import type { StigmerClient } from "../client/stigmer-client.js";
44
47
  import type { ResolvedMcpServer } from "./mcp-resolver.js";
45
- import { grpcTarget, type SynthesizedAttachmentOptions } from "./synthesized-attachment.js";
48
+ import {
49
+ grpcTarget,
50
+ stdioCredentialEnv,
51
+ type SynthesizedAttachmentOptions,
52
+ } from "./synthesized-attachment.js";
46
53
 
47
54
  /**
48
55
  * The synthesized attachment's slug. Reserved: a user McpServer with
@@ -151,6 +158,7 @@ export function synthesizeChannelAttachment(
151
158
  env: {
152
159
  STIGMER_MCP_ROSTER: "channels",
153
160
  STIGMER_SERVER_ADDRESS: grpcTarget(options.backendEndpoint),
161
+ ...stdioCredentialEnv(options.credential),
154
162
  },
155
163
  };
156
164
  }
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * ExecutionConfig.max_cost_usd enforcement as a hard stop on a harness turn.
3
3
  *
4
- * Harness-agnostic: the Cursor activity is today's only caller and the turn
5
- * runtime takes it over in S2 M3. The rationale below is Cursor's, and it is
4
+ * Harness-agnostic: the Cursor activity was its only caller until the turn
5
+ * runtime took it over in #1070. The rationale below is Cursor's, and it is
6
6
  * why the module is shaped as a hard stop rather than a middleware.
7
7
  *
8
8
  * The native harness enforces the cap in middleware (cost-cap.ts): tools are
@@ -28,7 +28,7 @@
28
28
  *
29
29
  * SOURCE OF TRUTH — the approved whole-file bytes and target path are read from
30
30
  * the gated tool call's `args` (the authoritative proposed content the deny-gate
31
- * stamped from the hook input; see execute-cursor/message-translator.ts
31
+ * stamped from the hook input; see execute-cursor/boundary-rows.ts
32
32
  * `applyGateInput`). This is the single copy — there is no separate captured
33
33
  * `file_changes` mirror — so "what was shown == what is applied" holds by
34
34
  * construction. (Phase 5 Slice 4 removed the redundant `ToolCall.file_changes`
@@ -15,8 +15,8 @@
15
15
  * `setInterceptorExecutionId`) is whichever turn set it last; this store is
16
16
  * what makes concurrent turns not overwrite each other's headers.
17
17
  *
18
- * Moved from `activities/execute-cursor/fetch-interceptor.ts` (S2 M3,
19
- * Q-M3-12) so `harness/run-turn.ts` can enter it without importing the
18
+ * Moved from `activities/execute-cursor/fetch-interceptor.ts` (#1070)
19
+ * so `harness/run-turn.ts` can enter it without importing the
20
20
  * adapter; the interceptors import it from here. No harness enters it: the
21
21
  * contract lists it among the things deliberately NOT on `TurnSink`.
22
22
  */
@@ -3,8 +3,8 @@
3
3
  *
4
4
  * Harness-agnostic, and called from one place: the turn runtime's epilogue
5
5
  * (`harness/run-turn.ts` `extractStructuredOutputFromText`), so both
6
- * harnesses have it — Cursor since S2 M3, native since S3 M2a (pinned by the
7
- * native hermetic `structured-output` tier-2 arm since M2b, Q-S3-7).
6
+ * harnesses have it — Cursor since #1070, native since #1096 (pinned by the
7
+ * native hermetic `structured-output` tier-2 arm).
8
8
  *
9
9
  * When tier-1 text extraction (shared/extract-json.ts) cannot find JSON in
10
10
  * the agent's free-text response, this tier asks an economy-tier LLM to
@@ -1,8 +1,12 @@
1
1
  /**
2
- * @regression file-hitl-phase0 — pins file-edit HITL fixes #7, #8, #9 (see _projects/2026-06/20260630.01.file-change-hitl-redesign/tasks/T01_3_regression-manifest.md)
2
+ * @regression file-hitl-phase0 — pins three rules of git capture mode: a
3
+ * no-commit tree-ref snapshot and restore with one card per changed file;
4
+ * edits stay applied through the WAITING-to-resume boundary and the resume
5
+ * reconciles to the pinned refs; a reject is a DISCARD that COMPLETES, snaps
6
+ * the tree back byte for byte, and partial decisions land only approved files.
3
7
  *
4
8
  * Tests the harness-agnostic capture orchestration directly, under one
5
- * harness id (since S3 M4 the runtime is the ONE caller for every harness,
9
+ * harness id (since #1096 the runtime is the ONE caller for every harness,
6
10
  * `harness/capture.ts`; until then each adapter called this seam and the
7
11
  * Cursor side had its own test, `execute-cursor/capture-flow.test.ts`, whose
8
12
  * three reconcile arms no other file carried moved here). Confirms that the
@@ -235,8 +239,8 @@ describe("capture orchestration — deep-agent harness", () => {
235
239
  // artifact mode. `ProxyArtifactStorage.exists()` reports true for ANY key
236
240
  // (the presign endpoint mints a URL regardless of object existence), so the
237
241
  // old reconcile "found" a CAS manifest that a git-only turn never wrote,
238
- // downloaded it, and died on the R2 `NoSuchKey` 404 (see the ExecuteCursor
239
- // crash in _cursor/error.md). The reconcile must decide "is this a CAS turn?"
242
+ // downloaded it, and died on the R2 `NoSuchKey` 404 (the ExecuteCursor
243
+ // crash `proxy-reconcile.test.ts` reproduces). The reconcile must decide "is this a CAS turn?"
240
244
  // from the change set's CANDIDATE snapshot — a git-only turn carries no cas
241
245
  // ref — so a lying `exists()` can no longer turn a git reconcile into a
242
246
  // doomed download.
@@ -335,7 +339,7 @@ function candidateCompleteness(status: AgentExecutionStatus): DiffCompleteness |
335
339
  : undefined;
336
340
  }
337
341
 
338
- describe("capture reconcile — the decision rules the resume enforces (moved from execute-cursor/capture-flow.test at S3 M4)", () => {
342
+ describe("capture reconcile — the decision rules the resume enforces (moved from execute-cursor/capture-flow.test in #1096)", () => {
339
343
  async function captureTwoFileTurn(status: AgentExecutionStatus): Promise<void> {
340
344
  const baseline = await captureBaselineToLedger({ status, gitRoot: repo, executionId: EXEC_ID, changeSetId: CHANGE_SET_ID, harnessId: HARNESS });
341
345
  await write("notes.md", "planton notes\n");
@@ -1,5 +1,8 @@
1
1
  /**
2
- * @regression file-hitl-phase0 — pins file-edit HITL fixes #7, #8 (see _projects/2026-06/20260630.01.file-change-hitl-redesign/tasks/T01_3_regression-manifest.md)
2
+ * @regression file-hitl-phase0 — pins git capture mode: a no-commit tree-ref
3
+ * snapshot and restore with one card per changed file; edits stay applied
4
+ * through the WAITING-to-resume boundary and the resume reconciles to the
5
+ * pinned refs.
3
6
  *
4
7
  * Unit tests for the git snapshot/restore capture substrate (the PRIMITIVES:
5
8
  * snapshot / capture / restore / apply / recompute / drop).
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * @regression file-hitl-proxy-reconcile — the file-review reconcile crash in
3
- * cloud/desktop (proxy) artifact mode (see _cursor/error.md: an ExecuteCursor
4
- * turn died on `Artifact download failed (HTTP 404) ... NoSuchKey` for a CAS
5
- * manifest a git-only turn never wrote).
3
+ * cloud/desktop (proxy) artifact mode: an ExecuteCursor turn died on
4
+ * `Artifact download failed (HTTP 404) ... NoSuchKey` for a CAS manifest a
5
+ * git-only turn never wrote.
6
6
  *
7
7
  * This exercises the REAL {@link ProxyArtifactStorage} end to end against a mock
8
8
  * proxy + object store, so the whole stack — presign, the ranged-GET existence
@@ -14,9 +14,9 @@
14
14
  * capture ({@link buildCasTurnCaptures}), which composes it into the
15
15
  * {@link CasPathCapture}s the CAS substrate stores.
16
16
  *
17
- * Until S3 M4 each harness carried its own copy of `buildCasTurnCaptures`
17
+ * Until #1096 each harness carried its own copy of `buildCasTurnCaptures`
18
18
  * beside its observation source; the copies were byte-near-identical
19
- * (F-M4-P6) and now live here once. The AFTER bytes are always re-read from
19
+ * and now live here once. The AFTER bytes are always re-read from
20
20
  * disk at composition time (the authoritative net result of the turn), so
21
21
  * many edits to one path collapse to one before/after.
22
22
  */
@@ -24,6 +24,19 @@
24
24
  * plus a `changed` flag, so the hybrid can merge both slices even when only one
25
25
  * moved (a `ProgressDelta | undefined` would drop the unchanged slice).
26
26
  *
27
+ * WHAT A CAPTURE MAY SEE
28
+ * ----------------------
29
+ * A capture rides a persist, and the persist that a tool's start dirtied runs
30
+ * while that tool may still be writing: the engine does not wait for the
31
+ * runtime's write to land before it runs the tool. So one snapshot can precede
32
+ * a tool's write (a turn behind), straddle it (the path present, the counts of
33
+ * a half-written file), or follow it (the next tool's file already there).
34
+ * That is accepted, not fixed: the strip is a latest-wins display field and the
35
+ * next capture converges it, while capturing only between tools would take the
36
+ * strip's liveness away during exactly the long-running tools it exists for.
37
+ * A consumer — a console, a test — reads the strip for what it converges to
38
+ * while the set is CAPTURING, never for what one capture happened to show.
39
+ *
27
40
  * SECRET SAFETY
28
41
  * -------------
29
42
  * No file bodies are ever carried. A secret-like path ({@link isSecretLikePath})
@@ -13,7 +13,7 @@
13
13
  * heartbeat subject — `@temporalio/activity/lib/index.js`
14
14
  * `Context.heartbeat`, `@temporalio/worker/lib/worker.js` the heartbeat
15
15
  * callback; the SDK's own doc: "Cancellation is not propagated from this
16
- * function"). Until S2 M3 this handle carried two flags for a throw that
16
+ * function"). Until #1070 this handle carried two flags for a throw that
17
17
  * cannot happen; a turn reads its interruption from the signal's reason
18
18
  * instead (`worker-shutdown.ts` `classifyTurnInterruption`).
19
19
  */
@@ -8,10 +8,6 @@
8
8
  * factories run `preflightLlmBackends` at startup, and `model-client.ts`
9
9
  * resolves the backend and translates model ids at construction time; see
10
10
  * `__tests__/vertex-seam.test.ts` for the pinned seam behavior.
11
- *
12
- * Design decision record: stigmer-cloud
13
- * `_projects/2026-08/20260809.01.multi-cloud-llm-provider-endpoints/`
14
- * `design-decisions/001-provider-backends.md`.
15
11
  */
16
12
 
17
13
  import type { LlmProvider } from "./llm-proxy.js";
@@ -12,22 +12,29 @@
12
12
  * ZERO facts is a meaningful state: memory is on, nothing stored yet —
13
13
  * the tool is offered so the first fact can be proposed.
14
14
  *
15
- * Two connection shapes, one roster (the channels pattern):
15
+ * Two connection shapes, one roster (the channels pattern), one
16
+ * credential — the run's own — presented on both:
16
17
  * - Bridge endpoint configured (cloud): Streamable HTTP against the
17
- * bridge's /memory route with the execution's own session-scoped
18
- * credential as the Bearer token, plus the capture context as
19
- * per-request headers.
18
+ * bridge's /memory route with the run's credential as the Bearer
19
+ * token, plus the capture context as per-request headers.
20
20
  * - No bridge endpoint (OSS/local): a spawned `stigmer mcp-server`
21
- * stdio child with STIGMER_MCP_ROSTER=memory, plus the capture
22
- * context as STIGMER_MEMORY_* env.
21
+ * stdio child with STIGMER_MCP_ROSTER=memory, the run's credential
22
+ * as its startup credential (synthesized-attachment.ts
23
+ * `stdioCredentialEnv`), plus the capture context as
24
+ * STIGMER_MEMORY_* env. Without the credential a server that signs
25
+ * people in refuses every `remember` as nobody's (stigmer#1147);
26
+ * with it the memory is the run's person's, which the server derives
27
+ * from the credential and nothing the child says.
23
28
  *
24
29
  * The capture context (org + agent/session/execution ids) is
25
30
  * attribution, never authorization (the Stage 3 provenance decision,
26
31
  * owner-ratified 2026-08-22): the cloud create handler accepts it only
27
32
  * from a session-sandbox credential and overrides session/org with the
28
- * token's own claims; the OSS server stores it under the local
29
- * single-user trust model. The subject is never threaded — the server
30
- * derives it from the credential (DD-005 D2).
33
+ * token's own claims; the OSS server under sign-in admits it from the
34
+ * run's credential and proves the session off the run's row, and stores
35
+ * it as given under the local single-user trust model. The subject is
36
+ * never threaded — the server derives it from the credential (DD-005
37
+ * D2).
31
38
  *
32
39
  * Approval-free by construction (the synthesized-attachment contract):
33
40
  * the tool only ever creates a PROPOSAL the user must confirm through
@@ -44,7 +51,11 @@
44
51
 
45
52
  import type { RecalledMemories } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/spec_pb";
46
53
  import type { ResolvedMcpServer } from "./mcp-resolver.js";
47
- import { grpcTarget, type SynthesizedAttachmentOptions } from "./synthesized-attachment.js";
54
+ import {
55
+ grpcTarget,
56
+ stdioCredentialEnv,
57
+ type SynthesizedAttachmentOptions,
58
+ } from "./synthesized-attachment.js";
48
59
 
49
60
  /**
50
61
  * The synthesized attachment's slug. Reserved: a user McpServer with
@@ -149,6 +160,7 @@ export function synthesizeMemoryAttachment(
149
160
  env: {
150
161
  STIGMER_MCP_ROSTER: "memory",
151
162
  STIGMER_SERVER_ADDRESS: grpcTarget(options.backendEndpoint),
163
+ ...stdioCredentialEnv(options.credential),
152
164
  ...nonEmptyEntries([
153
165
  [MEMORY_ORG_ENV, context.org],
154
166
  [MEMORY_AGENT_ID_ENV, context.agentId],
@@ -14,8 +14,7 @@
14
14
  * errors from the PLATFORM's provider account told customers to top up
15
15
  * consoles they don't own. The cloud proxy rewrites those to a 503
16
16
  * carrying PLATFORM_CAPACITY_SENTINEL (the contract lives in
17
- * stigmer-cloud's PlatformProviderErrorClassifier and the DD at
18
- * _projects/2026-08/20260801.02.provider-error-attribution/); this module
17
+ * stigmer-cloud's PlatformProviderErrorClassifier); this module
19
18
  * is the runner-side half that recognizes the sentinel and, in direct
20
19
  * (BYO-key) mode, attributes billing errors to the user's own account
21
20
  * with actionable wording.
@@ -3,10 +3,17 @@
3
3
  *
4
4
  * Harness-agnostic, and both adapters' stream loops read it
5
5
  * (`execute-cursor/turn-stream.ts`, `execute-deep-agent/turn-stream.ts`; the
6
- * native orchestrator's own copy of the rule retired with it at S3 M2b):
7
- * `shouldPersist = forceFlush || scheduler.shouldSendUpdate(eventCount)`.
8
- * Both harnesses thus share one cadence model — discrete state changes flush
9
- * immediately, high-frequency token deltas ride a bounded time cadence.
6
+ * native orchestrator's own copy of the rule retired with it in #1096):
7
+ * `shouldPersist = transcriptDirty || scheduler.shouldSendUpdate(eventCount)`.
8
+ * Both harnesses thus share one cadence model — a discrete state change
9
+ * flushes immediately, high-frequency token deltas ride a bounded time
10
+ * cadence.
11
+ *
12
+ * One flag, the transcript builder's `dirty` (since #1097). Until then the
13
+ * decision took three Cursor-named flags — the delta enricher's, the todo
14
+ * tracker's and the accumulator's — of which two were constant `false` on
15
+ * both loops once the one builder folded every discrete change; a shape
16
+ * that named writers which no longer existed.
10
17
  *
11
18
  * Extracted as a single pure function so the stream loop and its unit tests
12
19
  * exercise the same implementation and cannot drift.
@@ -14,43 +21,27 @@
14
21
 
15
22
  import type { StreamingUpdateScheduler } from "./streaming-scheduler.js";
16
23
 
17
- /**
18
- * Force-flush signals — discrete, user-visible state changes that must reach the
19
- * live stream immediately, independent of the scheduler's time cadence.
20
- */
21
- export interface ForceFlushSignals {
22
- /** Shell/tool output text accumulated past the delta-enricher debounce. */
23
- readonly deltaEnricherDirty: boolean;
24
- /** The agent's todo list changed. */
25
- readonly todosDirty: boolean;
26
- /**
27
- * A tool call started or reached a terminal status, or a sub-agent was
28
- * delegated/updated (MessageAccumulator.isDirty).
29
- */
30
- readonly contentDirty: boolean;
31
- }
32
-
33
24
  /**
34
25
  * Decide whether to persist the streaming status after a stream event.
35
26
  *
36
- * - forceFlush: any discrete signal flushes now so the live trace (tool calls,
37
- * sub-agents, todos, shell output) is never starved on short turns.
27
+ * - `transcriptDirty`: a discrete, user-visible change landed on the
28
+ * transcript since the last persist (a row started or settled, a sub-agent
29
+ * delegated, a todo written, an artifact registered) and must reach the
30
+ * live stream now, so short turns are never starved.
38
31
  * - scheduler: the shared StreamingUpdateScheduler carries assistant text and
39
32
  * model thinking on a bounded time cadence (500ms floor / 5s keepalive),
40
33
  * avoiding a per-token persist storm.
41
34
  *
42
- * After a persist, the caller must call scheduler.markUpdateSent(eventCount) so
43
- * the cadence resets — matching the native harness.
35
+ * After a persist, the caller calls `scheduler.markUpdateSent(eventCount)` so
36
+ * the cadence resets, and clears the builder's flag as it requests the write.
44
37
  *
45
38
  * @param nowMs Injectable clock forwarded to the scheduler, for tests.
46
39
  */
47
40
  export function shouldPersistStreamingStatus(
48
- signals: ForceFlushSignals,
41
+ transcriptDirty: boolean,
49
42
  scheduler: StreamingUpdateScheduler,
50
43
  eventCount: number,
51
44
  nowMs?: number,
52
45
  ): boolean {
53
- const forceFlush =
54
- signals.deltaEnricherDirty || signals.todosDirty || signals.contentDirty;
55
- return forceFlush || scheduler.shouldSendUpdate(eventCount, nowMs);
46
+ return transcriptDirty || scheduler.shouldSendUpdate(eventCount, nowMs);
56
47
  }
@@ -7,7 +7,7 @@
7
7
  * (`sender-identity.ts`, `declared-preferences.ts`, `recalled-memories.ts`,
8
8
  * `session-context.ts`, `context-bridge.ts`, `attachment-vision.ts`,
9
9
  * `attachment-download-urls.ts`). What the two prompt builders duplicated
10
- * until S3 M5 (Q-S3-10, Q-M2b-8) was the glue around those bodies: the order
10
+ * until #1096 was the glue around those bodies: the order
11
11
  * the five standing sections read in, with the same doctrine comments written
12
12
  * twice; the input-files bullet and disclosure lines; which skills a prompt
13
13
  * highlights when there are many. This module is that glue, written once.
@@ -169,10 +169,10 @@ export interface InputFileLines {
169
169
  /**
170
170
  * The input-files lines over the runtime's own `ResolvedAttachment` — one
171
171
  * type, one truth (a structural twin once lived in each builder; native's
172
- * silently dropped the size, Cursor's was deleted at S3 M5, Q-M5-5).
172
+ * silently dropped the size, Cursor's was deleted in #1096).
173
173
  *
174
174
  * Each bullet discloses the size (so the agent can weigh a read — the field's
175
- * own stated purpose; Cursor's line gained it at S3 M5, Q-M5-3), the original
175
+ * own stated purpose; Cursor's line gained it in #1096), the original
176
176
  * name of a duplicate-renamed file (`attachment-naming.ts`; so the agent can
177
177
  * connect "the two report.pdfs" in the user's message to distinct files on
178
178
  * disk), and the download URL when one was minted
@@ -224,7 +224,7 @@ export interface SkillSelection {
224
224
  * named, so the agent can still activate one on its own judgement (the Agent
225
225
  * Skills spec's progressive disclosure: metadata up front, instructions on
226
226
  * demand). The native harness calls this on every turn; the Cursor harness
227
- * lists every skill today and its adoption is S4's (Q-M5-4).
227
+ * lists every skill today; adopting the selection there is an open item.
228
228
  */
229
229
  export function selectSkillsForPrompt(userMessage: string, skills: readonly SkillMetadata[]): SkillSelection {
230
230
  const filter = filterSkills(
@@ -0,0 +1,45 @@
1
+ /**
2
+ * The run credential of the activity that is running — an `AsyncLocalStorage`
3
+ * the activity boundary enters once and the control-plane transport reads
4
+ * per request.
5
+ *
6
+ * Why a store and not a parameter: the runner serves many executions in one
7
+ * process, and the `StigmerClient` a request goes out on is shared — one per
8
+ * worker for the turn activities (`harness/registry.ts`), one per call or a
9
+ * module singleton for the engine's activities. A credential baked into a
10
+ * client would be the wrong run's the moment two runs share it; a credential
11
+ * read from the async context of the request is always the run whose
12
+ * activity made the request, and a client cached across runs stays correct.
13
+ * `shared/execution-context.ts` is the same shape for the execution id, with
14
+ * a different owner (the turn runtime enters it INSIDE the turn) and a
15
+ * different reader (the Cursor proxy interceptors) — two facts, two stores.
16
+ *
17
+ * Exactly one writer — `interceptors/run-credential-activity.ts`, the
18
+ * activity inbound interceptor both worker roots register — and exactly one
19
+ * reader — the auth interceptor in `client/stigmer-client.ts`. Nothing else
20
+ * may read this: a user task's outbound HTTP (`activities/call-http.ts`) must
21
+ * never carry the run's credential, and the way that stays true is that no
22
+ * code path but the control-plane client asks for it.
23
+ */
24
+
25
+ import { AsyncLocalStorage } from "node:async_hooks";
26
+
27
+ const runCredential = new AsyncLocalStorage<string>();
28
+
29
+ /** Run `fn` with `credential` as the run credential of everything it awaits. */
30
+ export function withRunCredential<T>(
31
+ credential: string,
32
+ fn: () => Promise<T>,
33
+ ): Promise<T> {
34
+ return runCredential.run(credential, fn);
35
+ }
36
+
37
+ /**
38
+ * The run credential of the activity this request belongs to; `undefined`
39
+ * outside any activity (boot, renewal loops) and inside an activity whose
40
+ * dispatch carried none (an older server; the cloud, whose runner credential
41
+ * is provisioned, not dispatched).
42
+ */
43
+ export function currentRunCredential(): string | undefined {
44
+ return runCredential.getStore();
45
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * The run credential's wire vocabulary — the two places a dispatch can carry
3
+ * it, and the one reader of both.
4
+ *
5
+ * A run credential is the token the control plane mints for ONE execution at
6
+ * dispatch (`execution_context_token` on the workflow input, 2026-09-16) so
7
+ * that the runner — one long-lived process keyed with one operator's API key,
8
+ * serving every member's runs — can act as the run's own human on that run's
9
+ * RPCs. Under a server with sign-in on, the credential's bearer IS the run's
10
+ * person for as long as the run lives; on an older server no credential
11
+ * arrives and the runner behaves exactly as before. The runner never decodes
12
+ * or judges the credential: it presents, the server judges
13
+ * (`client/token-claims.ts`).
14
+ *
15
+ * Two hops carry it, one channel each:
16
+ *
17
+ * - The SERVER's dispatches — the Execute* turn activities and
18
+ * GenerateSessionSubject — carry it on the activity INPUT under
19
+ * {@link RUN_CREDENTIAL_INPUT_KEY}, the same key the workflow inputs use
20
+ * (a cross-component wire contract; the server's
21
+ * temporal/agentexecution/workflows/invoke-agent-execution.ts builds it).
22
+ * - The RUNNER's own dispatches — every activity the serverless-workflow
23
+ * engine schedules from `workflows/execute-from-execution.ts` — carry it
24
+ * as a Temporal activity HEADER, {@link RUN_CREDENTIAL_HEADER}, stamped by
25
+ * the workflow interceptor in `workflows/interceptors/run-credential.ts`.
26
+ * Headers, not arguments: the engine hands `execution_id` to ten local
27
+ * activities positionally, and a credential threaded the same way is a
28
+ * field every future activity has to remember. A header reaches all of
29
+ * them, and the next one, with no signature learning the word.
30
+ *
31
+ * One reader for both: `interceptors/run-credential-activity.ts` enters the
32
+ * store (`run-credential-store.ts`) at the activity boundary, and
33
+ * `client/stigmer-client.ts` reads it per request. No activity body touches
34
+ * a credential.
35
+ *
36
+ * ISOLATE-SAFE BY CONTRACT: this module is imported by workflow code that
37
+ * runs inside Temporal's deterministic V8 sandbox. It must import nothing
38
+ * from Node and hold no mutable state; the store lives in its own module for
39
+ * exactly that reason.
40
+ */
41
+
42
+ /**
43
+ * The snake_case key under which a dispatch's input object carries the run
44
+ * credential. Byte-pinned: the same name on both invoke workflow inputs, on
45
+ * `ExecuteActivityInput`, on `GenerateSessionSubjectInput` and on the connect
46
+ * lane's input (where it names a DIFFERENT, clocked token that this reader
47
+ * never sees — that lane hands its token per call).
48
+ */
49
+ export const RUN_CREDENTIAL_INPUT_KEY = "execution_context_token" as const;
50
+
51
+ /**
52
+ * The Temporal activity header the runner's own workflow stamps on every
53
+ * activity it schedules for a run. Byte-pinned wire vocabulary: a rename
54
+ * strands every in-flight run's activities on the process credential.
55
+ */
56
+ export const RUN_CREDENTIAL_HEADER = "stigmer-run-credential" as const;
57
+
58
+ /**
59
+ * The run credential an activity input carries, or `undefined` when the
60
+ * argument is not an object carrying a non-empty string under the key —
61
+ * positional string arguments, the connect lane's camelCase input, and an
62
+ * older server's credential-less object all answer `undefined`.
63
+ */
64
+ export function readRunCredentialFromInput(arg: unknown): string | undefined {
65
+ if (arg === null || typeof arg !== "object") {
66
+ return undefined;
67
+ }
68
+ const value = (arg as Record<string, unknown>)[RUN_CREDENTIAL_INPUT_KEY];
69
+ return typeof value === "string" && value !== "" ? value : undefined;
70
+ }
@@ -12,9 +12,9 @@
12
12
  * the control plane, which only the runtime holds, and writes under the
13
13
  * platform dir the runtime owns; the harness renders the returned metadata
14
14
  * into its prompt in its own placement. Moved from
15
- * `activities/execute-cursor/` at S2 M3b; the native harness's twin
16
- * (`skill-writer.ts` `fetchSkillsByRefs` + `mountSkills`) retired at S3 M2b,
17
- * and the module itself at S3 M5 — the one renderer it kept is
15
+ * `activities/execute-cursor/` in #1070; the native harness's twin
16
+ * (`skill-writer.ts` `fetchSkillsByRefs` + `mountSkills`) retired in #1096,
17
+ * and the module itself with it — the one renderer it kept is
18
18
  * `shared/prompt-sections.ts` `alsoAvailableSkillsNote`. This is the one
19
19
  * skills path for every harness.
20
20
  *
@@ -20,7 +20,7 @@
20
20
  * Images are uploaded as their decoded bytes (so the UI can render an
21
21
  * <img>); other large output is uploaded as text with a preview head.
22
22
  * Idempotent and content-hash-deduped so the throttled, repeated persists
23
- * (and result re-inflation by mergeToolCallEvent) upload each blob once.
23
+ * (and result re-inflation by the builder's `tool_finished` upsert) upload each blob once.
24
24
  *
25
25
  * 2. offloadCandidateChangesToFit — an aggregate, storage-backed step for the
26
26
  * file-review ledger: if the status still exceeds the soft cap after (1),
@@ -344,7 +344,7 @@ async function maybeOffloadToolCall(
344
344
  const hash = sha256(result);
345
345
 
346
346
  // Idempotent: the same content was already offloaded on a prior persist (or
347
- // mergeToolCallEvent re-inflated `result` with identical bytes). Re-collapse
347
+ // the builder's finish upsert re-inflated `result` with identical bytes). Re-collapse
348
348
  // the inline copy without re-uploading.
349
349
  if (tc.outputRef && tc.outputRef.contentHash === hash) {
350
350
  tc.result = collapsedResultFor(tc.outputRef);
@@ -19,13 +19,8 @@
19
19
  * the live stream cadence is identical across harnesses.
20
20
  */
21
21
 
22
- export enum UpdateReason {
23
- TIME_THRESHOLD = "time_threshold",
24
- BURST_PROTECTION = "burst_protection",
25
- KEEPALIVE = "keepalive",
26
- FIRST_UPDATE = "first_update",
27
- NONE = "none",
28
- }
22
+ /** Why the scheduler last said "send": the cadence rule that fired, or `none`. */
23
+ export type UpdateReason = "time_threshold" | "burst_protection" | "keepalive" | "first_update" | "none";
29
24
 
30
25
  export interface StreamingConfig {
31
26
  /** Minimum time between updates (ms). Rate limit: max ~2 updates/second. */
@@ -95,7 +90,7 @@ export class StreamingUpdateScheduler {
95
90
 
96
91
  private lastUpdateTime: number;
97
92
  private lastUpdateEvents = 0;
98
- private lastReason: UpdateReason = UpdateReason.NONE;
93
+ private lastReason: UpdateReason = "none";
99
94
  private firstCheck = true;
100
95
 
101
96
  /**
@@ -119,26 +114,26 @@ export class StreamingUpdateScheduler {
119
114
  const eventsSinceLast = eventsProcessed - this.lastUpdateEvents;
120
115
 
121
116
  if (this.firstCheck && eventsSinceLast >= 1) {
122
- this.lastReason = UpdateReason.FIRST_UPDATE;
117
+ this.lastReason = "first_update";
123
118
  return true;
124
119
  }
125
120
 
126
121
  if (timeSinceLastMs >= this.config.minIntervalMs && eventsSinceLast >= 1) {
127
- this.lastReason = UpdateReason.TIME_THRESHOLD;
122
+ this.lastReason = "time_threshold";
128
123
  return true;
129
124
  }
130
125
 
131
126
  if (eventsSinceLast >= this.config.burstThreshold) {
132
- this.lastReason = UpdateReason.BURST_PROTECTION;
127
+ this.lastReason = "burst_protection";
133
128
  return true;
134
129
  }
135
130
 
136
131
  if (timeSinceLastMs >= this.config.maxIntervalMs) {
137
- this.lastReason = UpdateReason.KEEPALIVE;
132
+ this.lastReason = "keepalive";
138
133
  return true;
139
134
  }
140
135
 
141
- this.lastReason = UpdateReason.NONE;
136
+ this.lastReason = "none";
142
137
  return false;
143
138
  }
144
139
 
@@ -7,9 +7,9 @@
7
7
  * infrastructure cancel), so the final snapshot has no permanent IN_PROGRESS
8
8
  * "zombie" delegation. Harness-agnostic (a `SubAgentExecution` is the
9
9
  * platform's row, not an engine's), read by the turn runtime's terminal
10
- * table and the Cursor accumulator's own finalize alike.
10
+ * table and the Cursor settle alike.
11
11
  *
12
- * Moved from `activities/execute-cursor/message-translator.ts` at S2 M3 so
12
+ * Moved from `activities/execute-cursor/message-translator.ts` in #1070 so
13
13
  * the runtime's catch can reach it; the body is unchanged.
14
14
  */
15
15