@stigmer/runner 3.0.1

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 (904) hide show
  1. package/README.md +212 -0
  2. package/dist/.build-fingerprint +1 -0
  3. package/dist/activities/call-agent-status.d.ts +37 -0
  4. package/dist/activities/call-agent-status.js +91 -0
  5. package/dist/activities/call-agent-status.js.map +1 -0
  6. package/dist/activities/call-agent.d.ts +25 -0
  7. package/dist/activities/call-agent.js +233 -0
  8. package/dist/activities/call-agent.js.map +1 -0
  9. package/dist/activities/call-eval.d.ts +50 -0
  10. package/dist/activities/call-eval.js +244 -0
  11. package/dist/activities/call-eval.js.map +1 -0
  12. package/dist/activities/call-function.d.ts +21 -0
  13. package/dist/activities/call-function.js +54 -0
  14. package/dist/activities/call-function.js.map +1 -0
  15. package/dist/activities/call-grpc.d.ts +22 -0
  16. package/dist/activities/call-grpc.js +101 -0
  17. package/dist/activities/call-grpc.js.map +1 -0
  18. package/dist/activities/call-http.d.ts +32 -0
  19. package/dist/activities/call-http.js +134 -0
  20. package/dist/activities/call-http.js.map +1 -0
  21. package/dist/activities/call-llm.d.ts +39 -0
  22. package/dist/activities/call-llm.js +260 -0
  23. package/dist/activities/call-llm.js.map +1 -0
  24. package/dist/activities/call-transform.d.ts +20 -0
  25. package/dist/activities/call-transform.js +33 -0
  26. package/dist/activities/call-transform.js.map +1 -0
  27. package/dist/activities/call-validate.d.ts +41 -0
  28. package/dist/activities/call-validate.js +163 -0
  29. package/dist/activities/call-validate.js.map +1 -0
  30. package/dist/activities/classify-tool-approvals.d.ts +47 -0
  31. package/dist/activities/classify-tool-approvals.js +207 -0
  32. package/dist/activities/classify-tool-approvals.js.map +1 -0
  33. package/dist/activities/discover-mcp-server.d.ts +65 -0
  34. package/dist/activities/discover-mcp-server.js +269 -0
  35. package/dist/activities/discover-mcp-server.js.map +1 -0
  36. package/dist/activities/emit-event.d.ts +46 -0
  37. package/dist/activities/emit-event.js +125 -0
  38. package/dist/activities/emit-event.js.map +1 -0
  39. package/dist/activities/ensure-thread.d.ts +24 -0
  40. package/dist/activities/ensure-thread.js +44 -0
  41. package/dist/activities/ensure-thread.js.map +1 -0
  42. package/dist/activities/evaluate-expressions.d.ts +21 -0
  43. package/dist/activities/evaluate-expressions.js +39 -0
  44. package/dist/activities/evaluate-expressions.js.map +1 -0
  45. package/dist/activities/execute-cursor/approval-policy.d.ts +104 -0
  46. package/dist/activities/execute-cursor/approval-policy.js +193 -0
  47. package/dist/activities/execute-cursor/approval-policy.js.map +1 -0
  48. package/dist/activities/execute-cursor/approval-state.d.ts +157 -0
  49. package/dist/activities/execute-cursor/approval-state.js +223 -0
  50. package/dist/activities/execute-cursor/approval-state.js.map +1 -0
  51. package/dist/activities/execute-cursor/attachment-resolver.d.ts +19 -0
  52. package/dist/activities/execute-cursor/attachment-resolver.js +52 -0
  53. package/dist/activities/execute-cursor/attachment-resolver.js.map +1 -0
  54. package/dist/activities/execute-cursor/blueprint-resolver.d.ts +66 -0
  55. package/dist/activities/execute-cursor/blueprint-resolver.js +169 -0
  56. package/dist/activities/execute-cursor/blueprint-resolver.js.map +1 -0
  57. package/dist/activities/execute-cursor/connect-backfill.d.ts +18 -0
  58. package/dist/activities/execute-cursor/connect-backfill.js +27 -0
  59. package/dist/activities/execute-cursor/connect-backfill.js.map +1 -0
  60. package/dist/activities/execute-cursor/cursor-event-recorder.d.ts +24 -0
  61. package/dist/activities/execute-cursor/cursor-event-recorder.js +66 -0
  62. package/dist/activities/execute-cursor/cursor-event-recorder.js.map +1 -0
  63. package/dist/activities/execute-cursor/cursor-mode.d.ts +32 -0
  64. package/dist/activities/execute-cursor/cursor-mode.js +36 -0
  65. package/dist/activities/execute-cursor/cursor-mode.js.map +1 -0
  66. package/dist/activities/execute-cursor/delta-enricher.d.ts +87 -0
  67. package/dist/activities/execute-cursor/delta-enricher.js +265 -0
  68. package/dist/activities/execute-cursor/delta-enricher.js.map +1 -0
  69. package/dist/activities/execute-cursor/env-resolver.d.ts +19 -0
  70. package/dist/activities/execute-cursor/env-resolver.js +47 -0
  71. package/dist/activities/execute-cursor/env-resolver.js.map +1 -0
  72. package/dist/activities/execute-cursor/error-classifier.d.ts +73 -0
  73. package/dist/activities/execute-cursor/error-classifier.js +185 -0
  74. package/dist/activities/execute-cursor/error-classifier.js.map +1 -0
  75. package/dist/activities/execute-cursor/fetch-interceptor.d.ts +59 -0
  76. package/dist/activities/execute-cursor/fetch-interceptor.js +317 -0
  77. package/dist/activities/execute-cursor/fetch-interceptor.js.map +1 -0
  78. package/dist/activities/execute-cursor/hitl-diagnostics.d.ts +32 -0
  79. package/dist/activities/execute-cursor/hitl-diagnostics.js +73 -0
  80. package/dist/activities/execute-cursor/hitl-diagnostics.js.map +1 -0
  81. package/dist/activities/execute-cursor/hook-script.d.ts +47 -0
  82. package/dist/activities/execute-cursor/hook-script.js +156 -0
  83. package/dist/activities/execute-cursor/hook-script.js.map +1 -0
  84. package/dist/activities/execute-cursor/http2-interceptor.d.ts +94 -0
  85. package/dist/activities/execute-cursor/http2-interceptor.js +209 -0
  86. package/dist/activities/execute-cursor/http2-interceptor.js.map +1 -0
  87. package/dist/activities/execute-cursor/index.d.ts +67 -0
  88. package/dist/activities/execute-cursor/index.js +1176 -0
  89. package/dist/activities/execute-cursor/index.js.map +1 -0
  90. package/dist/activities/execute-cursor/mcp-config.d.ts +30 -0
  91. package/dist/activities/execute-cursor/mcp-config.js +39 -0
  92. package/dist/activities/execute-cursor/mcp-config.js.map +1 -0
  93. package/dist/activities/execute-cursor/mcp-resolver.d.ts +91 -0
  94. package/dist/activities/execute-cursor/mcp-resolver.js +178 -0
  95. package/dist/activities/execute-cursor/mcp-resolver.js.map +1 -0
  96. package/dist/activities/execute-cursor/message-translator.d.ts +211 -0
  97. package/dist/activities/execute-cursor/message-translator.js +786 -0
  98. package/dist/activities/execute-cursor/message-translator.js.map +1 -0
  99. package/dist/activities/execute-cursor/model-pricing-data.d.ts +40 -0
  100. package/dist/activities/execute-cursor/model-pricing-data.js +114 -0
  101. package/dist/activities/execute-cursor/model-pricing-data.js.map +1 -0
  102. package/dist/activities/execute-cursor/model-pricing.d.ts +42 -0
  103. package/dist/activities/execute-cursor/model-pricing.js +141 -0
  104. package/dist/activities/execute-cursor/model-pricing.js.map +1 -0
  105. package/dist/activities/execute-cursor/placeholder-resolver.d.ts +34 -0
  106. package/dist/activities/execute-cursor/placeholder-resolver.js +82 -0
  107. package/dist/activities/execute-cursor/placeholder-resolver.js.map +1 -0
  108. package/dist/activities/execute-cursor/prompt-builder.d.ts +80 -0
  109. package/dist/activities/execute-cursor/prompt-builder.js +280 -0
  110. package/dist/activities/execute-cursor/prompt-builder.js.map +1 -0
  111. package/dist/activities/execute-cursor/rejection-capture.d.ts +30 -0
  112. package/dist/activities/execute-cursor/rejection-capture.js +80 -0
  113. package/dist/activities/execute-cursor/rejection-capture.js.map +1 -0
  114. package/dist/activities/execute-cursor/session-lifecycle.d.ts +189 -0
  115. package/dist/activities/execute-cursor/session-lifecycle.js +285 -0
  116. package/dist/activities/execute-cursor/session-lifecycle.js.map +1 -0
  117. package/dist/activities/execute-cursor/skill-resolver.d.ts +29 -0
  118. package/dist/activities/execute-cursor/skill-resolver.js +134 -0
  119. package/dist/activities/execute-cursor/skill-resolver.js.map +1 -0
  120. package/dist/activities/execute-cursor/subagent-config.d.ts +34 -0
  121. package/dist/activities/execute-cursor/subagent-config.js +55 -0
  122. package/dist/activities/execute-cursor/subagent-config.js.map +1 -0
  123. package/dist/activities/execute-cursor/todo-tracker.d.ts +35 -0
  124. package/dist/activities/execute-cursor/todo-tracker.js +108 -0
  125. package/dist/activities/execute-cursor/todo-tracker.js.map +1 -0
  126. package/dist/activities/execute-cursor/usage-accumulator.d.ts +55 -0
  127. package/dist/activities/execute-cursor/usage-accumulator.js +89 -0
  128. package/dist/activities/execute-cursor/usage-accumulator.js.map +1 -0
  129. package/dist/activities/execute-cursor/workspace-provision.d.ts +22 -0
  130. package/dist/activities/execute-cursor/workspace-provision.js +37 -0
  131. package/dist/activities/execute-cursor/workspace-provision.js.map +1 -0
  132. package/dist/activities/execute-cursor/workspace-setup.d.ts +27 -0
  133. package/dist/activities/execute-cursor/workspace-setup.js +61 -0
  134. package/dist/activities/execute-cursor/workspace-setup.js.map +1 -0
  135. package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.d.ts +71 -0
  136. package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js +182 -0
  137. package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js.map +1 -0
  138. package/dist/activities/execute-deep-agent/attachment-injector.d.ts +67 -0
  139. package/dist/activities/execute-deep-agent/attachment-injector.js +306 -0
  140. package/dist/activities/execute-deep-agent/attachment-injector.js.map +1 -0
  141. package/dist/activities/execute-deep-agent/auto-publish.d.ts +17 -0
  142. package/dist/activities/execute-deep-agent/auto-publish.js +71 -0
  143. package/dist/activities/execute-deep-agent/auto-publish.js.map +1 -0
  144. package/dist/activities/execute-deep-agent/environment.d.ts +24 -0
  145. package/dist/activities/execute-deep-agent/environment.js +50 -0
  146. package/dist/activities/execute-deep-agent/environment.js.map +1 -0
  147. package/dist/activities/execute-deep-agent/event-recorder.d.ts +21 -0
  148. package/dist/activities/execute-deep-agent/event-recorder.js +67 -0
  149. package/dist/activities/execute-deep-agent/event-recorder.js.map +1 -0
  150. package/dist/activities/execute-deep-agent/execution-state.d.ts +61 -0
  151. package/dist/activities/execute-deep-agent/execution-state.js +76 -0
  152. package/dist/activities/execute-deep-agent/execution-state.js.map +1 -0
  153. package/dist/activities/execute-deep-agent/execution-status-writer.d.ts +17 -0
  154. package/dist/activities/execute-deep-agent/execution-status-writer.js +9 -0
  155. package/dist/activities/execute-deep-agent/execution-status-writer.js.map +1 -0
  156. package/dist/activities/execute-deep-agent/hitl.d.ts +58 -0
  157. package/dist/activities/execute-deep-agent/hitl.js +155 -0
  158. package/dist/activities/execute-deep-agent/hitl.js.map +1 -0
  159. package/dist/activities/execute-deep-agent/index.d.ts +14 -0
  160. package/dist/activities/execute-deep-agent/index.js +286 -0
  161. package/dist/activities/execute-deep-agent/index.js.map +1 -0
  162. package/dist/activities/execute-deep-agent/inline-publisher.d.ts +36 -0
  163. package/dist/activities/execute-deep-agent/inline-publisher.js +105 -0
  164. package/dist/activities/execute-deep-agent/inline-publisher.js.map +1 -0
  165. package/dist/activities/execute-deep-agent/post-stream.d.ts +23 -0
  166. package/dist/activities/execute-deep-agent/post-stream.js +71 -0
  167. package/dist/activities/execute-deep-agent/post-stream.js.map +1 -0
  168. package/dist/activities/execute-deep-agent/prompt-builder.d.ts +27 -0
  169. package/dist/activities/execute-deep-agent/prompt-builder.js +200 -0
  170. package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -0
  171. package/dist/activities/execute-deep-agent/setup.d.ts +55 -0
  172. package/dist/activities/execute-deep-agent/setup.js +411 -0
  173. package/dist/activities/execute-deep-agent/setup.js.map +1 -0
  174. package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +39 -0
  175. package/dist/activities/execute-deep-agent/status-builder-shared.js +120 -0
  176. package/dist/activities/execute-deep-agent/status-builder-shared.js.map +1 -0
  177. package/dist/activities/execute-deep-agent/status-builder.d.ts +81 -0
  178. package/dist/activities/execute-deep-agent/status-builder.js +312 -0
  179. package/dist/activities/execute-deep-agent/status-builder.js.map +1 -0
  180. package/dist/activities/execute-deep-agent/streaming-scheduler.d.ts +60 -0
  181. package/dist/activities/execute-deep-agent/streaming-scheduler.js +114 -0
  182. package/dist/activities/execute-deep-agent/streaming-scheduler.js.map +1 -0
  183. package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +22 -0
  184. package/dist/activities/execute-deep-agent/streaming-side-effects.js +83 -0
  185. package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -0
  186. package/dist/activities/execute-deep-agent/streaming-terminal.d.ts +12 -0
  187. package/dist/activities/execute-deep-agent/streaming-terminal.js +71 -0
  188. package/dist/activities/execute-deep-agent/streaming-terminal.js.map +1 -0
  189. package/dist/activities/execute-deep-agent/streaming-v3.d.ts +13 -0
  190. package/dist/activities/execute-deep-agent/streaming-v3.js +170 -0
  191. package/dist/activities/execute-deep-agent/streaming-v3.js.map +1 -0
  192. package/dist/activities/execute-deep-agent/streaming.d.ts +66 -0
  193. package/dist/activities/execute-deep-agent/streaming.js +169 -0
  194. package/dist/activities/execute-deep-agent/streaming.js.map +1 -0
  195. package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +90 -0
  196. package/dist/activities/execute-deep-agent/subagent-tracker.js +364 -0
  197. package/dist/activities/execute-deep-agent/subagent-tracker.js.map +1 -0
  198. package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +150 -0
  199. package/dist/activities/execute-deep-agent/subagent-transformer.js +450 -0
  200. package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -0
  201. package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +28 -0
  202. package/dist/activities/execute-deep-agent/subagent-wiring.js +40 -0
  203. package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -0
  204. package/dist/activities/execute-deep-agent/v3-event-recorder.d.ts +31 -0
  205. package/dist/activities/execute-deep-agent/v3-event-recorder.js +71 -0
  206. package/dist/activities/execute-deep-agent/v3-event-recorder.js.map +1 -0
  207. package/dist/activities/execute-deep-agent/v3-events.d.ts +102 -0
  208. package/dist/activities/execute-deep-agent/v3-events.js +35 -0
  209. package/dist/activities/execute-deep-agent/v3-events.js.map +1 -0
  210. package/dist/activities/execute-deep-agent/v3-protocol-normalizer.d.ts +15 -0
  211. package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js +235 -0
  212. package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js.map +1 -0
  213. package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +68 -0
  214. package/dist/activities/execute-deep-agent/v3-status-builder.js +394 -0
  215. package/dist/activities/execute-deep-agent/v3-status-builder.js.map +1 -0
  216. package/dist/activities/execute-deep-agent/writeback-coordinator.d.ts +71 -0
  217. package/dist/activities/execute-deep-agent/writeback-coordinator.js +295 -0
  218. package/dist/activities/execute-deep-agent/writeback-coordinator.js.map +1 -0
  219. package/dist/activities/hydrate-workflow-execution.d.ts +32 -0
  220. package/dist/activities/hydrate-workflow-execution.js +212 -0
  221. package/dist/activities/hydrate-workflow-execution.js.map +1 -0
  222. package/dist/activities/notification.d.ts +19 -0
  223. package/dist/activities/notification.js +47 -0
  224. package/dist/activities/notification.js.map +1 -0
  225. package/dist/activities/promote-task-output.d.ts +38 -0
  226. package/dist/activities/promote-task-output.js +90 -0
  227. package/dist/activities/promote-task-output.js.map +1 -0
  228. package/dist/activities/run-command.d.ts +15 -0
  229. package/dist/activities/run-command.js +123 -0
  230. package/dist/activities/run-command.js.map +1 -0
  231. package/dist/activities/workflow-event-activities.d.ts +48 -0
  232. package/dist/activities/workflow-event-activities.js +415 -0
  233. package/dist/activities/workflow-event-activities.js.map +1 -0
  234. package/dist/bootstrap.d.ts +80 -0
  235. package/dist/bootstrap.js +114 -0
  236. package/dist/bootstrap.js.map +1 -0
  237. package/dist/budget/index.d.ts +1 -0
  238. package/dist/budget/index.js +2 -0
  239. package/dist/budget/index.js.map +1 -0
  240. package/dist/budget/tracker.d.ts +52 -0
  241. package/dist/budget/tracker.js +123 -0
  242. package/dist/budget/tracker.js.map +1 -0
  243. package/dist/claimcheck/compressor.d.ts +2 -0
  244. package/dist/claimcheck/compressor.js +8 -0
  245. package/dist/claimcheck/compressor.js.map +1 -0
  246. package/dist/claimcheck/config.d.ts +7 -0
  247. package/dist/claimcheck/config.js +10 -0
  248. package/dist/claimcheck/config.js.map +1 -0
  249. package/dist/claimcheck/index.d.ts +3 -0
  250. package/dist/claimcheck/index.js +4 -0
  251. package/dist/claimcheck/index.js.map +1 -0
  252. package/dist/claimcheck/payload-codec.d.ts +23 -0
  253. package/dist/claimcheck/payload-codec.js +81 -0
  254. package/dist/claimcheck/payload-codec.js.map +1 -0
  255. package/dist/client/server-contracts.d.ts +52 -0
  256. package/dist/client/server-contracts.js +72 -0
  257. package/dist/client/server-contracts.js.map +1 -0
  258. package/dist/client/stigmer-client.d.ts +131 -0
  259. package/dist/client/stigmer-client.js +239 -0
  260. package/dist/client/stigmer-client.js.map +1 -0
  261. package/dist/config.d.ts +64 -0
  262. package/dist/config.js +123 -0
  263. package/dist/config.js.map +1 -0
  264. package/dist/idle-watchdog.d.ts +11 -0
  265. package/dist/idle-watchdog.js +24 -0
  266. package/dist/idle-watchdog.js.map +1 -0
  267. package/dist/index.d.ts +43 -0
  268. package/dist/index.js +42 -0
  269. package/dist/index.js.map +1 -0
  270. package/dist/interceptors/workflow-metrics-sink.d.ts +11 -0
  271. package/dist/interceptors/workflow-metrics-sink.js +51 -0
  272. package/dist/interceptors/workflow-metrics-sink.js.map +1 -0
  273. package/dist/ipc-protocol-fixtures.d.ts +32 -0
  274. package/dist/ipc-protocol-fixtures.js +69 -0
  275. package/dist/ipc-protocol-fixtures.js.map +1 -0
  276. package/dist/ipc-protocol.d.ts +60 -0
  277. package/dist/ipc-protocol.js +19 -0
  278. package/dist/ipc-protocol.js.map +1 -0
  279. package/dist/main.d.ts +19 -0
  280. package/dist/main.js +292 -0
  281. package/dist/main.js.map +1 -0
  282. package/dist/middleware/approval-gate.d.ts +30 -0
  283. package/dist/middleware/approval-gate.js +125 -0
  284. package/dist/middleware/approval-gate.js.map +1 -0
  285. package/dist/middleware/cost-cap.d.ts +22 -0
  286. package/dist/middleware/cost-cap.js +159 -0
  287. package/dist/middleware/cost-cap.js.map +1 -0
  288. package/dist/middleware/error-hints.d.ts +27 -0
  289. package/dist/middleware/error-hints.js +116 -0
  290. package/dist/middleware/error-hints.js.map +1 -0
  291. package/dist/middleware/execution-budget.d.ts +20 -0
  292. package/dist/middleware/execution-budget.js +151 -0
  293. package/dist/middleware/execution-budget.js.map +1 -0
  294. package/dist/middleware/graceful-stop.d.ts +17 -0
  295. package/dist/middleware/graceful-stop.js +63 -0
  296. package/dist/middleware/graceful-stop.js.map +1 -0
  297. package/dist/middleware/index.d.ts +27 -0
  298. package/dist/middleware/index.js +45 -0
  299. package/dist/middleware/index.js.map +1 -0
  300. package/dist/middleware/loop-detection.d.ts +14 -0
  301. package/dist/middleware/loop-detection.js +156 -0
  302. package/dist/middleware/loop-detection.js.map +1 -0
  303. package/dist/middleware/otel-spans.d.ts +11 -0
  304. package/dist/middleware/otel-spans.js +177 -0
  305. package/dist/middleware/otel-spans.js.map +1 -0
  306. package/dist/middleware/think-tool.d.ts +23 -0
  307. package/dist/middleware/think-tool.js +33 -0
  308. package/dist/middleware/think-tool.js.map +1 -0
  309. package/dist/middleware/tool-truncation.d.ts +16 -0
  310. package/dist/middleware/tool-truncation.js +67 -0
  311. package/dist/middleware/tool-truncation.js.map +1 -0
  312. package/dist/middleware/types.d.ts +100 -0
  313. package/dist/middleware/types.js +9 -0
  314. package/dist/middleware/types.js.map +1 -0
  315. package/dist/notification/index.d.ts +2 -0
  316. package/dist/notification/index.js +6 -0
  317. package/dist/notification/index.js.map +1 -0
  318. package/dist/notification/provider.d.ts +29 -0
  319. package/dist/notification/provider.js +25 -0
  320. package/dist/notification/provider.js.map +1 -0
  321. package/dist/notification/webhook.d.ts +13 -0
  322. package/dist/notification/webhook.js +55 -0
  323. package/dist/notification/webhook.js.map +1 -0
  324. package/dist/otel-metrics.d.ts +21 -0
  325. package/dist/otel-metrics.js +54 -0
  326. package/dist/otel-metrics.js.map +1 -0
  327. package/dist/otel.d.ts +57 -0
  328. package/dist/otel.js +164 -0
  329. package/dist/otel.js.map +1 -0
  330. package/dist/runner-manager.d.ts +113 -0
  331. package/dist/runner-manager.js +412 -0
  332. package/dist/runner-manager.js.map +1 -0
  333. package/dist/runner-token-coordinator.d.ts +56 -0
  334. package/dist/runner-token-coordinator.js +84 -0
  335. package/dist/runner-token-coordinator.js.map +1 -0
  336. package/dist/runner.d.ts +104 -0
  337. package/dist/runner.js +234 -0
  338. package/dist/runner.js.map +1 -0
  339. package/dist/shared/approval-policy.d.ts +45 -0
  340. package/dist/shared/approval-policy.js +122 -0
  341. package/dist/shared/approval-policy.js.map +1 -0
  342. package/dist/shared/artifact-storage.d.ts +44 -0
  343. package/dist/shared/artifact-storage.js +162 -0
  344. package/dist/shared/artifact-storage.js.map +1 -0
  345. package/dist/shared/checkpointer/factory.d.ts +28 -0
  346. package/dist/shared/checkpointer/factory.js +55 -0
  347. package/dist/shared/checkpointer/factory.js.map +1 -0
  348. package/dist/shared/checkpointer/http-saver.d.ts +34 -0
  349. package/dist/shared/checkpointer/http-saver.js +274 -0
  350. package/dist/shared/checkpointer/http-saver.js.map +1 -0
  351. package/dist/shared/checkpointer/types.d.ts +12 -0
  352. package/dist/shared/checkpointer/types.js +2 -0
  353. package/dist/shared/checkpointer/types.js.map +1 -0
  354. package/dist/shared/connect-backfill.d.ts +58 -0
  355. package/dist/shared/connect-backfill.js +119 -0
  356. package/dist/shared/connect-backfill.js.map +1 -0
  357. package/dist/shared/extract-json.d.ts +26 -0
  358. package/dist/shared/extract-json.js +140 -0
  359. package/dist/shared/extract-json.js.map +1 -0
  360. package/dist/shared/grpc-retry.d.ts +35 -0
  361. package/dist/shared/grpc-retry.js +78 -0
  362. package/dist/shared/grpc-retry.js.map +1 -0
  363. package/dist/shared/heartbeat.d.ts +22 -0
  364. package/dist/shared/heartbeat.js +55 -0
  365. package/dist/shared/heartbeat.js.map +1 -0
  366. package/dist/shared/json-schema-to-zod.d.ts +13 -0
  367. package/dist/shared/json-schema-to-zod.js +49 -0
  368. package/dist/shared/json-schema-to-zod.js.map +1 -0
  369. package/dist/shared/llm-proxy.d.ts +57 -0
  370. package/dist/shared/llm-proxy.js +116 -0
  371. package/dist/shared/llm-proxy.js.map +1 -0
  372. package/dist/shared/mcp-manager.d.ts +47 -0
  373. package/dist/shared/mcp-manager.js +118 -0
  374. package/dist/shared/mcp-manager.js.map +1 -0
  375. package/dist/shared/mcp-resolver.d.ts +41 -0
  376. package/dist/shared/mcp-resolver.js +96 -0
  377. package/dist/shared/mcp-resolver.js.map +1 -0
  378. package/dist/shared/model-pricing-data.d.ts +18 -0
  379. package/dist/shared/model-pricing-data.js +78 -0
  380. package/dist/shared/model-pricing-data.js.map +1 -0
  381. package/dist/shared/model-pricing.d.ts +24 -0
  382. package/dist/shared/model-pricing.js +58 -0
  383. package/dist/shared/model-pricing.js.map +1 -0
  384. package/dist/shared/model-registry.d.ts +55 -0
  385. package/dist/shared/model-registry.js +178 -0
  386. package/dist/shared/model-registry.js.map +1 -0
  387. package/dist/shared/placeholder-resolver.d.ts +27 -0
  388. package/dist/shared/placeholder-resolver.js +75 -0
  389. package/dist/shared/placeholder-resolver.js.map +1 -0
  390. package/dist/shared/plan-artifact.d.ts +56 -0
  391. package/dist/shared/plan-artifact.js +98 -0
  392. package/dist/shared/plan-artifact.js.map +1 -0
  393. package/dist/shared/skill-relevance.d.ts +65 -0
  394. package/dist/shared/skill-relevance.js +175 -0
  395. package/dist/shared/skill-relevance.js.map +1 -0
  396. package/dist/shared/skill-writer.d.ts +73 -0
  397. package/dist/shared/skill-writer.js +230 -0
  398. package/dist/shared/skill-writer.js.map +1 -0
  399. package/dist/shared/status.d.ts +37 -0
  400. package/dist/shared/status.js +73 -0
  401. package/dist/shared/status.js.map +1 -0
  402. package/dist/shared/subagent-gate.d.ts +41 -0
  403. package/dist/shared/subagent-gate.js +93 -0
  404. package/dist/shared/subagent-gate.js.map +1 -0
  405. package/dist/shared/tool-kind.d.ts +22 -0
  406. package/dist/shared/tool-kind.js +79 -0
  407. package/dist/shared/tool-kind.js.map +1 -0
  408. package/dist/shared/workspace/file-tree.d.ts +13 -0
  409. package/dist/shared/workspace/file-tree.js +101 -0
  410. package/dist/shared/workspace/file-tree.js.map +1 -0
  411. package/dist/shared/workspace/local-backend.d.ts +41 -0
  412. package/dist/shared/workspace/local-backend.js +113 -0
  413. package/dist/shared/workspace/local-backend.js.map +1 -0
  414. package/dist/shared/workspace/platform-dir.d.ts +25 -0
  415. package/dist/shared/workspace/platform-dir.js +36 -0
  416. package/dist/shared/workspace/platform-dir.js.map +1 -0
  417. package/dist/shared/workspace/platform-mount.d.ts +95 -0
  418. package/dist/shared/workspace/platform-mount.js +157 -0
  419. package/dist/shared/workspace/platform-mount.js.map +1 -0
  420. package/dist/shared/workspace/provisioner.d.ts +47 -0
  421. package/dist/shared/workspace/provisioner.js +84 -0
  422. package/dist/shared/workspace/provisioner.js.map +1 -0
  423. package/dist/shared/workspace/sources/empty.d.ts +8 -0
  424. package/dist/shared/workspace/sources/empty.js +18 -0
  425. package/dist/shared/workspace/sources/empty.js.map +1 -0
  426. package/dist/shared/workspace/sources/git.d.ts +22 -0
  427. package/dist/shared/workspace/sources/git.js +207 -0
  428. package/dist/shared/workspace/sources/git.js.map +1 -0
  429. package/dist/shared/workspace/sources/local-path.d.ts +17 -0
  430. package/dist/shared/workspace/sources/local-path.js +57 -0
  431. package/dist/shared/workspace/sources/local-path.js.map +1 -0
  432. package/dist/shared/workspace/types.d.ts +58 -0
  433. package/dist/shared/workspace/types.js +25 -0
  434. package/dist/shared/workspace/types.js.map +1 -0
  435. package/dist/shared/zip-extract.d.ts +30 -0
  436. package/dist/shared/zip-extract.js +150 -0
  437. package/dist/shared/zip-extract.js.map +1 -0
  438. package/dist/worker.d.ts +27 -0
  439. package/dist/worker.js +65 -0
  440. package/dist/worker.js.map +1 -0
  441. package/dist/workflow-engine/clone.d.ts +11 -0
  442. package/dist/workflow-engine/clone.js +21 -0
  443. package/dist/workflow-engine/clone.js.map +1 -0
  444. package/dist/workflow-engine/do-executor.d.ts +27 -0
  445. package/dist/workflow-engine/do-executor.js +418 -0
  446. package/dist/workflow-engine/do-executor.js.map +1 -0
  447. package/dist/workflow-engine/duration.d.ts +12 -0
  448. package/dist/workflow-engine/duration.js +25 -0
  449. package/dist/workflow-engine/duration.js.map +1 -0
  450. package/dist/workflow-engine/error-utils.d.ts +42 -0
  451. package/dist/workflow-engine/error-utils.js +77 -0
  452. package/dist/workflow-engine/error-utils.js.map +1 -0
  453. package/dist/workflow-engine/errors.d.ts +46 -0
  454. package/dist/workflow-engine/errors.js +105 -0
  455. package/dist/workflow-engine/errors.js.map +1 -0
  456. package/dist/workflow-engine/expression-utils.d.ts +60 -0
  457. package/dist/workflow-engine/expression-utils.js +108 -0
  458. package/dist/workflow-engine/expression-utils.js.map +1 -0
  459. package/dist/workflow-engine/expression.d.ts +132 -0
  460. package/dist/workflow-engine/expression.js +366 -0
  461. package/dist/workflow-engine/expression.js.map +1 -0
  462. package/dist/workflow-engine/loader.d.ts +23 -0
  463. package/dist/workflow-engine/loader.js +429 -0
  464. package/dist/workflow-engine/loader.js.map +1 -0
  465. package/dist/workflow-engine/recovery.d.ts +53 -0
  466. package/dist/workflow-engine/recovery.js +46 -0
  467. package/dist/workflow-engine/recovery.js.map +1 -0
  468. package/dist/workflow-engine/resolve.d.ts +83 -0
  469. package/dist/workflow-engine/resolve.js +257 -0
  470. package/dist/workflow-engine/resolve.js.map +1 -0
  471. package/dist/workflow-engine/retry.d.ts +30 -0
  472. package/dist/workflow-engine/retry.js +97 -0
  473. package/dist/workflow-engine/retry.js.map +1 -0
  474. package/dist/workflow-engine/state.d.ts +26 -0
  475. package/dist/workflow-engine/state.js +49 -0
  476. package/dist/workflow-engine/state.js.map +1 -0
  477. package/dist/workflow-engine/task-factory.d.ts +20 -0
  478. package/dist/workflow-engine/task-factory.js +133 -0
  479. package/dist/workflow-engine/task-factory.js.map +1 -0
  480. package/dist/workflow-engine/task-status-accumulator.d.ts +59 -0
  481. package/dist/workflow-engine/task-status-accumulator.js +164 -0
  482. package/dist/workflow-engine/task-status-accumulator.js.map +1 -0
  483. package/dist/workflow-engine/tasks/call-agent-output.d.ts +26 -0
  484. package/dist/workflow-engine/tasks/call-agent-output.js +109 -0
  485. package/dist/workflow-engine/tasks/call-agent-output.js.map +1 -0
  486. package/dist/workflow-engine/tasks/call-agent.d.ts +31 -0
  487. package/dist/workflow-engine/tasks/call-agent.js +161 -0
  488. package/dist/workflow-engine/tasks/call-agent.js.map +1 -0
  489. package/dist/workflow-engine/tasks/call-function.d.ts +19 -0
  490. package/dist/workflow-engine/tasks/call-function.js +64 -0
  491. package/dist/workflow-engine/tasks/call-function.js.map +1 -0
  492. package/dist/workflow-engine/tasks/call-grpc.d.ts +15 -0
  493. package/dist/workflow-engine/tasks/call-grpc.js +27 -0
  494. package/dist/workflow-engine/tasks/call-grpc.js.map +1 -0
  495. package/dist/workflow-engine/tasks/call-http.d.ts +19 -0
  496. package/dist/workflow-engine/tasks/call-http.js +31 -0
  497. package/dist/workflow-engine/tasks/call-http.js.map +1 -0
  498. package/dist/workflow-engine/tasks/for.d.ts +39 -0
  499. package/dist/workflow-engine/tasks/for.js +154 -0
  500. package/dist/workflow-engine/tasks/for.js.map +1 -0
  501. package/dist/workflow-engine/tasks/fork.d.ts +42 -0
  502. package/dist/workflow-engine/tasks/fork.js +142 -0
  503. package/dist/workflow-engine/tasks/fork.js.map +1 -0
  504. package/dist/workflow-engine/tasks/human-input.d.ts +33 -0
  505. package/dist/workflow-engine/tasks/human-input.js +109 -0
  506. package/dist/workflow-engine/tasks/human-input.js.map +1 -0
  507. package/dist/workflow-engine/tasks/listen.d.ts +34 -0
  508. package/dist/workflow-engine/tasks/listen.js +119 -0
  509. package/dist/workflow-engine/tasks/listen.js.map +1 -0
  510. package/dist/workflow-engine/tasks/raise.d.ts +18 -0
  511. package/dist/workflow-engine/tasks/raise.js +60 -0
  512. package/dist/workflow-engine/tasks/raise.js.map +1 -0
  513. package/dist/workflow-engine/tasks/run.d.ts +39 -0
  514. package/dist/workflow-engine/tasks/run.js +114 -0
  515. package/dist/workflow-engine/tasks/run.js.map +1 -0
  516. package/dist/workflow-engine/tasks/set.d.ts +15 -0
  517. package/dist/workflow-engine/tasks/set.js +31 -0
  518. package/dist/workflow-engine/tasks/set.js.map +1 -0
  519. package/dist/workflow-engine/tasks/switch.d.ts +25 -0
  520. package/dist/workflow-engine/tasks/switch.js +76 -0
  521. package/dist/workflow-engine/tasks/switch.js.map +1 -0
  522. package/dist/workflow-engine/tasks/try.d.ts +49 -0
  523. package/dist/workflow-engine/tasks/try.js +189 -0
  524. package/dist/workflow-engine/tasks/try.js.map +1 -0
  525. package/dist/workflow-engine/tasks/wait.d.ts +24 -0
  526. package/dist/workflow-engine/tasks/wait.js +39 -0
  527. package/dist/workflow-engine/tasks/wait.js.map +1 -0
  528. package/dist/workflow-engine/types.d.ts +682 -0
  529. package/dist/workflow-engine/types.js +47 -0
  530. package/dist/workflow-engine/types.js.map +1 -0
  531. package/dist/workflows/call-agent-orchestrator.d.ts +31 -0
  532. package/dist/workflows/call-agent-orchestrator.js +214 -0
  533. package/dist/workflows/call-agent-orchestrator.js.map +1 -0
  534. package/dist/workflows/connect-mcp-server.d.ts +20 -0
  535. package/dist/workflows/connect-mcp-server.js +113 -0
  536. package/dist/workflows/connect-mcp-server.js.map +1 -0
  537. package/dist/workflows/engine-core.d.ts +36 -0
  538. package/dist/workflows/engine-core.js +272 -0
  539. package/dist/workflows/engine-core.js.map +1 -0
  540. package/dist/workflows/execute-from-execution.d.ts +32 -0
  541. package/dist/workflows/execute-from-execution.js +71 -0
  542. package/dist/workflows/execute-from-execution.js.map +1 -0
  543. package/dist/workflows/execute-serverless-workflow.d.ts +32 -0
  544. package/dist/workflows/execute-serverless-workflow.js +36 -0
  545. package/dist/workflows/execute-serverless-workflow.js.map +1 -0
  546. package/dist/workflows/human-input-orchestrator.d.ts +19 -0
  547. package/dist/workflows/human-input-orchestrator.js +59 -0
  548. package/dist/workflows/human-input-orchestrator.js.map +1 -0
  549. package/dist/workflows/index.d.ts +22 -0
  550. package/dist/workflows/index.js +23 -0
  551. package/dist/workflows/index.js.map +1 -0
  552. package/dist/workflows/listen-orchestrator.d.ts +29 -0
  553. package/dist/workflows/listen-orchestrator.js +143 -0
  554. package/dist/workflows/listen-orchestrator.js.map +1 -0
  555. package/dist/workflows/metrics-sink.d.ts +33 -0
  556. package/dist/workflows/metrics-sink.js +21 -0
  557. package/dist/workflows/metrics-sink.js.map +1 -0
  558. package/dist/workflows/run-orchestrator.d.ts +15 -0
  559. package/dist/workflows/run-orchestrator.js +27 -0
  560. package/dist/workflows/run-orchestrator.js.map +1 -0
  561. package/dist/workflows/types.d.ts +46 -0
  562. package/dist/workflows/types.js +15 -0
  563. package/dist/workflows/types.js.map +1 -0
  564. package/dist/workflows/workflow-signals.d.ts +29 -0
  565. package/dist/workflows/workflow-signals.js +46 -0
  566. package/dist/workflows/workflow-signals.js.map +1 -0
  567. package/package.json +108 -0
  568. package/src/__test-utils__/__tests__/replay-fetch.test.ts +155 -0
  569. package/src/__test-utils__/mock-client.ts +44 -0
  570. package/src/__test-utils__/mock-workspace.ts +28 -0
  571. package/src/__test-utils__/proto-helpers.ts +41 -0
  572. package/src/__test-utils__/replay-fetch.ts +523 -0
  573. package/src/__tests__/bootstrap.test.ts +221 -0
  574. package/src/__tests__/claimcheck-codec.test.ts +257 -0
  575. package/src/__tests__/config.test.ts +150 -0
  576. package/src/__tests__/deterministic-eval-llm.test.ts +269 -0
  577. package/src/__tests__/deterministic-mcp-hitl.test.ts +405 -0
  578. package/src/__tests__/golden-e2e.test.ts +250 -0
  579. package/src/__tests__/ipc-protocol-fixtures.test.ts +66 -0
  580. package/src/__tests__/ipc-protocol.test.ts +32 -0
  581. package/src/__tests__/otel-metrics.test.ts +40 -0
  582. package/src/__tests__/runner-manager.test.ts +55 -0
  583. package/src/__tests__/runner-token-coordinator.test.ts +166 -0
  584. package/src/__tests__/runner.test.ts +182 -0
  585. package/src/__tests__/worker.test.ts +18 -0
  586. package/src/activities/__tests__/call-agent-contracts.test.ts +483 -0
  587. package/src/activities/__tests__/call-agent.test.ts +263 -0
  588. package/src/activities/__tests__/call-function.test.ts +47 -0
  589. package/src/activities/__tests__/call-grpc.test.ts +39 -0
  590. package/src/activities/__tests__/call-http.test.ts +288 -0
  591. package/src/activities/__tests__/call-llm.test.ts +301 -0
  592. package/src/activities/__tests__/classify-tool-approvals.test.ts +430 -0
  593. package/src/activities/__tests__/discover-mcp-server.test.ts +641 -0
  594. package/src/activities/__tests__/ensure-thread.test.ts +96 -0
  595. package/src/activities/__tests__/error-classifier.test.ts +372 -0
  596. package/src/activities/__tests__/evaluate-expressions.test.ts +114 -0
  597. package/src/activities/__tests__/hydrate-workflow-execution.test.ts +321 -0
  598. package/src/activities/__tests__/notification.test.ts +151 -0
  599. package/src/activities/__tests__/workflow-event-activities.test.ts +664 -0
  600. package/src/activities/call-agent-status.ts +130 -0
  601. package/src/activities/call-agent.ts +302 -0
  602. package/src/activities/call-eval.ts +333 -0
  603. package/src/activities/call-function.ts +73 -0
  604. package/src/activities/call-grpc.ts +140 -0
  605. package/src/activities/call-http.ts +185 -0
  606. package/src/activities/call-llm.ts +379 -0
  607. package/src/activities/call-transform.ts +54 -0
  608. package/src/activities/call-validate.ts +223 -0
  609. package/src/activities/classify-tool-approvals.ts +319 -0
  610. package/src/activities/discover-mcp-server.ts +411 -0
  611. package/src/activities/emit-event.ts +195 -0
  612. package/src/activities/ensure-thread.ts +45 -0
  613. package/src/activities/evaluate-expressions.ts +47 -0
  614. package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +188 -0
  615. package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +111 -0
  616. package/src/activities/execute-cursor/__tests__/cursor-baseurl-routing.test.ts +86 -0
  617. package/src/activities/execute-cursor/__tests__/cursor-fetch-interceptor-bypass.test.ts +64 -0
  618. package/src/activities/execute-cursor/__tests__/cursor-mode.test.ts +95 -0
  619. package/src/activities/execute-cursor/__tests__/cursor-sdk-auth-smoke.test.ts +90 -0
  620. package/src/activities/execute-cursor/__tests__/delta-enricher.test.ts +242 -0
  621. package/src/activities/execute-cursor/__tests__/error-classifier-introspection.test.ts +156 -0
  622. package/src/activities/execute-cursor/__tests__/fetch-interceptor.test.ts +211 -0
  623. package/src/activities/execute-cursor/__tests__/hitl-ledger.test.ts +298 -0
  624. package/src/activities/execute-cursor/__tests__/http2-interceptor.test.ts +360 -0
  625. package/src/activities/execute-cursor/__tests__/message-translator.test.ts +657 -0
  626. package/src/activities/execute-cursor/__tests__/model-pricing.test.ts +92 -0
  627. package/src/activities/execute-cursor/__tests__/prompt-builder-delegation.test.ts +101 -0
  628. package/src/activities/execute-cursor/__tests__/runner-error-regressions.test.ts +144 -0
  629. package/src/activities/execute-cursor/__tests__/session-lifecycle.test.ts +65 -0
  630. package/src/activities/execute-cursor/__tests__/skill-resolver.test.ts +265 -0
  631. package/src/activities/execute-cursor/__tests__/subagent-config.test.ts +107 -0
  632. package/src/activities/execute-cursor/__tests__/todo-tracker.test.ts +498 -0
  633. package/src/activities/execute-cursor/__tests__/workspace-provision.test.ts +283 -0
  634. package/src/activities/execute-cursor/approval-policy.ts +224 -0
  635. package/src/activities/execute-cursor/approval-state.ts +311 -0
  636. package/src/activities/execute-cursor/attachment-resolver.ts +78 -0
  637. package/src/activities/execute-cursor/blueprint-resolver.ts +234 -0
  638. package/src/activities/execute-cursor/connect-backfill.ts +49 -0
  639. package/src/activities/execute-cursor/cursor-event-recorder.ts +83 -0
  640. package/src/activities/execute-cursor/cursor-mode.ts +42 -0
  641. package/src/activities/execute-cursor/delta-enricher.ts +307 -0
  642. package/src/activities/execute-cursor/env-resolver.ts +64 -0
  643. package/src/activities/execute-cursor/error-classifier.ts +247 -0
  644. package/src/activities/execute-cursor/fetch-interceptor.ts +382 -0
  645. package/src/activities/execute-cursor/hitl-diagnostics.ts +82 -0
  646. package/src/activities/execute-cursor/hook-script.ts +159 -0
  647. package/src/activities/execute-cursor/http2-interceptor.ts +253 -0
  648. package/src/activities/execute-cursor/index.ts +1439 -0
  649. package/src/activities/execute-cursor/mcp-config.ts +66 -0
  650. package/src/activities/execute-cursor/mcp-resolver.ts +271 -0
  651. package/src/activities/execute-cursor/message-translator.ts +896 -0
  652. package/src/activities/execute-cursor/model-pricing-data.ts +167 -0
  653. package/src/activities/execute-cursor/model-pricing.ts +167 -0
  654. package/src/activities/execute-cursor/placeholder-resolver.ts +109 -0
  655. package/src/activities/execute-cursor/prompt-builder.ts +349 -0
  656. package/src/activities/execute-cursor/rejection-capture.ts +100 -0
  657. package/src/activities/execute-cursor/session-lifecycle.ts +429 -0
  658. package/src/activities/execute-cursor/skill-resolver.ts +176 -0
  659. package/src/activities/execute-cursor/subagent-config.ts +62 -0
  660. package/src/activities/execute-cursor/todo-tracker.ts +133 -0
  661. package/src/activities/execute-cursor/usage-accumulator.ts +126 -0
  662. package/src/activities/execute-cursor/workspace-provision.ts +55 -0
  663. package/src/activities/execute-cursor/workspace-setup.ts +75 -0
  664. package/src/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.ts +281 -0
  665. package/src/activities/execute-deep-agent/__tests__/attachment-injector.test.ts +720 -0
  666. package/src/activities/execute-deep-agent/__tests__/auto-publish.test.ts +146 -0
  667. package/src/activities/execute-deep-agent/__tests__/environment.test.ts +103 -0
  668. package/src/activities/execute-deep-agent/__tests__/event-recorder.test.ts +150 -0
  669. package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +150 -0
  670. package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +157 -0
  671. package/src/activities/execute-deep-agent/__tests__/hitl-integration.test.ts +223 -0
  672. package/src/activities/execute-deep-agent/__tests__/hitl.test.ts +244 -0
  673. package/src/activities/execute-deep-agent/__tests__/index.test.ts +91 -0
  674. package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +240 -0
  675. package/src/activities/execute-deep-agent/__tests__/post-stream.test.ts +112 -0
  676. package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +208 -0
  677. package/src/activities/execute-deep-agent/__tests__/status-builder.test.ts +1771 -0
  678. package/src/activities/execute-deep-agent/__tests__/streaming-scheduler.test.ts +199 -0
  679. package/src/activities/execute-deep-agent/__tests__/streaming-v3.test.ts +527 -0
  680. package/src/activities/execute-deep-agent/__tests__/streaming.test.ts +508 -0
  681. package/src/activities/execute-deep-agent/__tests__/subagent-tracker.test.ts +474 -0
  682. package/src/activities/execute-deep-agent/__tests__/subagent-transformer.test.ts +734 -0
  683. package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +71 -0
  684. package/src/activities/execute-deep-agent/__tests__/summarization-verification.test.ts +323 -0
  685. package/src/activities/execute-deep-agent/__tests__/v3-event-recorder.test.ts +186 -0
  686. package/src/activities/execute-deep-agent/__tests__/v3-protocol-normalizer.test.ts +324 -0
  687. package/src/activities/execute-deep-agent/__tests__/v3-status-builder.test.ts +504 -0
  688. package/src/activities/execute-deep-agent/__tests__/writeback-coordinator.test.ts +399 -0
  689. package/src/activities/execute-deep-agent/attachment-injector.ts +470 -0
  690. package/src/activities/execute-deep-agent/auto-publish.ts +80 -0
  691. package/src/activities/execute-deep-agent/environment.ts +67 -0
  692. package/src/activities/execute-deep-agent/event-recorder.ts +95 -0
  693. package/src/activities/execute-deep-agent/execution-state.ts +87 -0
  694. package/src/activities/execute-deep-agent/execution-status-writer.ts +19 -0
  695. package/src/activities/execute-deep-agent/hitl.ts +221 -0
  696. package/src/activities/execute-deep-agent/index.ts +342 -0
  697. package/src/activities/execute-deep-agent/inline-publisher.ts +134 -0
  698. package/src/activities/execute-deep-agent/post-stream.ts +109 -0
  699. package/src/activities/execute-deep-agent/prompt-builder.ts +264 -0
  700. package/src/activities/execute-deep-agent/setup.ts +599 -0
  701. package/src/activities/execute-deep-agent/status-builder-shared.ts +136 -0
  702. package/src/activities/execute-deep-agent/status-builder.ts +412 -0
  703. package/src/activities/execute-deep-agent/streaming-scheduler.ts +159 -0
  704. package/src/activities/execute-deep-agent/streaming-side-effects.ts +89 -0
  705. package/src/activities/execute-deep-agent/streaming-terminal.ts +96 -0
  706. package/src/activities/execute-deep-agent/streaming-v3.ts +272 -0
  707. package/src/activities/execute-deep-agent/streaming.ts +303 -0
  708. package/src/activities/execute-deep-agent/subagent-tracker.ts +445 -0
  709. package/src/activities/execute-deep-agent/subagent-transformer.ts +648 -0
  710. package/src/activities/execute-deep-agent/subagent-wiring.ts +56 -0
  711. package/src/activities/execute-deep-agent/v3-event-recorder.ts +111 -0
  712. package/src/activities/execute-deep-agent/v3-events.ts +153 -0
  713. package/src/activities/execute-deep-agent/v3-protocol-normalizer.ts +264 -0
  714. package/src/activities/execute-deep-agent/v3-status-builder.ts +490 -0
  715. package/src/activities/execute-deep-agent/writeback-coordinator.ts +420 -0
  716. package/src/activities/hydrate-workflow-execution.ts +306 -0
  717. package/src/activities/notification.ts +71 -0
  718. package/src/activities/promote-task-output.ts +126 -0
  719. package/src/activities/run-command.ts +148 -0
  720. package/src/activities/workflow-event-activities.ts +481 -0
  721. package/src/bootstrap.ts +173 -0
  722. package/src/budget/__tests__/tracker.test.ts +293 -0
  723. package/src/budget/index.ts +9 -0
  724. package/src/budget/tracker.ts +171 -0
  725. package/src/claimcheck/compressor.ts +9 -0
  726. package/src/claimcheck/config.ts +20 -0
  727. package/src/claimcheck/index.ts +3 -0
  728. package/src/claimcheck/payload-codec.ts +107 -0
  729. package/src/client/__tests__/server-contracts.test.ts +149 -0
  730. package/src/client/__tests__/stigmer-client.test.ts +142 -0
  731. package/src/client/server-contracts.ts +125 -0
  732. package/src/client/stigmer-client.ts +339 -0
  733. package/src/config.ts +185 -0
  734. package/src/idle-watchdog.ts +28 -0
  735. package/src/index.ts +48 -0
  736. package/src/interceptors/workflow-metrics-sink.ts +56 -0
  737. package/src/ipc-protocol-fixtures.ts +117 -0
  738. package/src/ipc-protocol.ts +113 -0
  739. package/src/main.ts +324 -0
  740. package/src/middleware/__tests__/approval-gate.test.ts +231 -0
  741. package/src/middleware/__tests__/cost-cap.test.ts +192 -0
  742. package/src/middleware/__tests__/error-hints.test.ts +90 -0
  743. package/src/middleware/__tests__/execution-budget.test.ts +138 -0
  744. package/src/middleware/__tests__/graceful-stop.test.ts +105 -0
  745. package/src/middleware/__tests__/loop-detection.test.ts +137 -0
  746. package/src/middleware/__tests__/otel-spans.test.ts +89 -0
  747. package/src/middleware/__tests__/think-tool.test.ts +26 -0
  748. package/src/middleware/__tests__/tool-truncation.test.ts +112 -0
  749. package/src/middleware/approval-gate.ts +179 -0
  750. package/src/middleware/cost-cap.ts +213 -0
  751. package/src/middleware/error-hints.ts +136 -0
  752. package/src/middleware/execution-budget.ts +176 -0
  753. package/src/middleware/graceful-stop.ts +86 -0
  754. package/src/middleware/index.ts +70 -0
  755. package/src/middleware/loop-detection.ts +192 -0
  756. package/src/middleware/otel-spans.ts +205 -0
  757. package/src/middleware/think-tool.ts +38 -0
  758. package/src/middleware/tool-truncation.ts +94 -0
  759. package/src/middleware/types.ts +114 -0
  760. package/src/notification/__tests__/provider.test.ts +85 -0
  761. package/src/notification/__tests__/webhook.test.ts +127 -0
  762. package/src/notification/index.ts +15 -0
  763. package/src/notification/provider.ts +52 -0
  764. package/src/notification/webhook.ts +61 -0
  765. package/src/otel-metrics.ts +73 -0
  766. package/src/otel.ts +194 -0
  767. package/src/runner-manager.ts +652 -0
  768. package/src/runner-token-coordinator.ts +135 -0
  769. package/src/runner.ts +380 -0
  770. package/src/shared/__tests__/approval-policy.test.ts +256 -0
  771. package/src/shared/__tests__/artifact-storage-extended.test.ts +208 -0
  772. package/src/shared/__tests__/artifact-storage.test.ts +365 -0
  773. package/src/shared/__tests__/connect-backfill.test.ts +346 -0
  774. package/src/shared/__tests__/extract-json.test.ts +153 -0
  775. package/src/shared/__tests__/grpc-retry-extended.test.ts +176 -0
  776. package/src/shared/__tests__/grpc-retry.test.ts +172 -0
  777. package/src/shared/__tests__/json-schema-to-zod.test.ts +227 -0
  778. package/src/shared/__tests__/llm-proxy.test.ts +179 -0
  779. package/src/shared/__tests__/mcp-manager.test.ts +154 -0
  780. package/src/shared/__tests__/model-pricing.test.ts +85 -0
  781. package/src/shared/__tests__/model-registry.test.ts +197 -0
  782. package/src/shared/__tests__/placeholder-resolver.test.ts +210 -0
  783. package/src/shared/__tests__/plan-artifact.test.ts +142 -0
  784. package/src/shared/__tests__/skill-relevance.test.ts +292 -0
  785. package/src/shared/__tests__/skill-writer.test.ts +349 -0
  786. package/src/shared/__tests__/status.test.ts +142 -0
  787. package/src/shared/__tests__/subagent-gate.test.ts +112 -0
  788. package/src/shared/__tests__/tool-kind.test.ts +58 -0
  789. package/src/shared/__tests__/zip-extract.test.ts +204 -0
  790. package/src/shared/approval-policy.ts +146 -0
  791. package/src/shared/artifact-storage.ts +207 -0
  792. package/src/shared/checkpointer/__tests__/factory.test.ts +42 -0
  793. package/src/shared/checkpointer/__tests__/http-saver.test.ts +176 -0
  794. package/src/shared/checkpointer/factory.ts +73 -0
  795. package/src/shared/checkpointer/http-saver.ts +349 -0
  796. package/src/shared/checkpointer/types.ts +12 -0
  797. package/src/shared/connect-backfill.ts +162 -0
  798. package/src/shared/extract-json.ts +153 -0
  799. package/src/shared/grpc-retry.ts +113 -0
  800. package/src/shared/heartbeat.ts +70 -0
  801. package/src/shared/json-schema-to-zod.ts +53 -0
  802. package/src/shared/llm-proxy.ts +138 -0
  803. package/src/shared/mcp-manager.ts +150 -0
  804. package/src/shared/mcp-resolver.ts +150 -0
  805. package/src/shared/model-pricing-data.ts +109 -0
  806. package/src/shared/model-pricing.ts +81 -0
  807. package/src/shared/model-registry.ts +214 -0
  808. package/src/shared/placeholder-resolver.ts +102 -0
  809. package/src/shared/plan-artifact.ts +120 -0
  810. package/src/shared/skill-relevance.ts +222 -0
  811. package/src/shared/skill-writer.ts +300 -0
  812. package/src/shared/status.ts +94 -0
  813. package/src/shared/subagent-gate.ts +117 -0
  814. package/src/shared/tool-kind.ts +91 -0
  815. package/src/shared/workspace/__tests__/file-tree.test.ts +210 -0
  816. package/src/shared/workspace/__tests__/git-source.test.ts +423 -0
  817. package/src/shared/workspace/__tests__/local-backend-platform.test.ts +259 -0
  818. package/src/shared/workspace/__tests__/local-backend.test.ts +154 -0
  819. package/src/shared/workspace/__tests__/platform-mount.test.ts +378 -0
  820. package/src/shared/workspace/__tests__/provisioner.test.ts +145 -0
  821. package/src/shared/workspace/file-tree.ts +116 -0
  822. package/src/shared/workspace/local-backend.ts +140 -0
  823. package/src/shared/workspace/platform-dir.ts +38 -0
  824. package/src/shared/workspace/platform-mount.ts +190 -0
  825. package/src/shared/workspace/provisioner.ts +150 -0
  826. package/src/shared/workspace/sources/empty.ts +20 -0
  827. package/src/shared/workspace/sources/git.ts +285 -0
  828. package/src/shared/workspace/sources/local-path.ts +89 -0
  829. package/src/shared/workspace/types.ts +69 -0
  830. package/src/shared/zip-extract.ts +193 -0
  831. package/src/worker.ts +98 -0
  832. package/src/workflow-engine/__tests__/do-executor-recovery.test.ts +382 -0
  833. package/src/workflow-engine/__tests__/do-executor.test.ts +963 -0
  834. package/src/workflow-engine/__tests__/errors.test.ts +174 -0
  835. package/src/workflow-engine/__tests__/expression.test.ts +776 -0
  836. package/src/workflow-engine/__tests__/for.test.ts +575 -0
  837. package/src/workflow-engine/__tests__/fork.test.ts +838 -0
  838. package/src/workflow-engine/__tests__/golden-execution.test.ts +1085 -0
  839. package/src/workflow-engine/__tests__/jq-wasm-spike.test.ts +90 -0
  840. package/src/workflow-engine/__tests__/loader.test.ts +1393 -0
  841. package/src/workflow-engine/__tests__/pause-resume.test.ts +267 -0
  842. package/src/workflow-engine/__tests__/recovery.test.ts +115 -0
  843. package/src/workflow-engine/__tests__/resolve.test.ts +432 -0
  844. package/src/workflow-engine/__tests__/retry.test.ts +306 -0
  845. package/src/workflow-engine/__tests__/state.test.ts +174 -0
  846. package/src/workflow-engine/__tests__/task-status-accumulator.test.ts +373 -0
  847. package/src/workflow-engine/__tests__/tasks/call-agent-output.test.ts +120 -0
  848. package/src/workflow-engine/__tests__/tasks/call-agent.test.ts +816 -0
  849. package/src/workflow-engine/__tests__/tasks/call-function.test.ts +205 -0
  850. package/src/workflow-engine/__tests__/tasks/call-grpc.test.ts +133 -0
  851. package/src/workflow-engine/__tests__/tasks/call-http.test.ts +150 -0
  852. package/src/workflow-engine/__tests__/tasks/emit-event.test.ts +322 -0
  853. package/src/workflow-engine/__tests__/tasks/human-input.test.ts +416 -0
  854. package/src/workflow-engine/__tests__/tasks/listen.test.ts +422 -0
  855. package/src/workflow-engine/__tests__/tasks/raise.test.ts +166 -0
  856. package/src/workflow-engine/__tests__/tasks/run.test.ts +272 -0
  857. package/src/workflow-engine/__tests__/tasks/set.test.ts +127 -0
  858. package/src/workflow-engine/__tests__/tasks/switch.test.ts +277 -0
  859. package/src/workflow-engine/__tests__/tasks/try.test.ts +590 -0
  860. package/src/workflow-engine/__tests__/tasks/wait.test.ts +173 -0
  861. package/src/workflow-engine/clone.ts +18 -0
  862. package/src/workflow-engine/do-executor.ts +569 -0
  863. package/src/workflow-engine/duration.ts +22 -0
  864. package/src/workflow-engine/error-utils.ts +97 -0
  865. package/src/workflow-engine/errors.ts +130 -0
  866. package/src/workflow-engine/expression-utils.ts +129 -0
  867. package/src/workflow-engine/expression.ts +430 -0
  868. package/src/workflow-engine/loader.ts +524 -0
  869. package/src/workflow-engine/recovery.ts +80 -0
  870. package/src/workflow-engine/resolve.ts +342 -0
  871. package/src/workflow-engine/retry.ts +109 -0
  872. package/src/workflow-engine/state.ts +56 -0
  873. package/src/workflow-engine/task-factory.ts +160 -0
  874. package/src/workflow-engine/task-status-accumulator.ts +204 -0
  875. package/src/workflow-engine/tasks/call-agent-output.ts +132 -0
  876. package/src/workflow-engine/tasks/call-agent.ts +221 -0
  877. package/src/workflow-engine/tasks/call-function.ts +107 -0
  878. package/src/workflow-engine/tasks/call-grpc.ts +47 -0
  879. package/src/workflow-engine/tasks/call-http.ts +51 -0
  880. package/src/workflow-engine/tasks/for.ts +244 -0
  881. package/src/workflow-engine/tasks/fork.ts +228 -0
  882. package/src/workflow-engine/tasks/human-input.ts +147 -0
  883. package/src/workflow-engine/tasks/listen.ts +166 -0
  884. package/src/workflow-engine/tasks/raise.ts +81 -0
  885. package/src/workflow-engine/tasks/run.ts +142 -0
  886. package/src/workflow-engine/tasks/set.ts +47 -0
  887. package/src/workflow-engine/tasks/switch.ts +102 -0
  888. package/src/workflow-engine/tasks/try.ts +274 -0
  889. package/src/workflow-engine/tasks/wait.ts +53 -0
  890. package/src/workflow-engine/types.ts +911 -0
  891. package/src/workflows/__tests__/connect-mcp-server.test.ts +359 -0
  892. package/src/workflows/__tests__/execute-serverless-workflow.test.ts +277 -0
  893. package/src/workflows/call-agent-orchestrator.ts +283 -0
  894. package/src/workflows/connect-mcp-server.ts +152 -0
  895. package/src/workflows/engine-core.ts +406 -0
  896. package/src/workflows/execute-from-execution.ts +101 -0
  897. package/src/workflows/execute-serverless-workflow.ts +60 -0
  898. package/src/workflows/human-input-orchestrator.ts +76 -0
  899. package/src/workflows/index.ts +32 -0
  900. package/src/workflows/listen-orchestrator.ts +200 -0
  901. package/src/workflows/metrics-sink.ts +48 -0
  902. package/src/workflows/run-orchestrator.ts +34 -0
  903. package/src/workflows/types.ts +64 -0
  904. package/src/workflows/workflow-signals.ts +55 -0
@@ -0,0 +1,896 @@
1
+ /**
2
+ * Translates Cursor SDK streaming events into Stigmer AgentMessage protos.
3
+ *
4
+ * The Cursor SDK emits SDKMessage events during a Run. This module provides
5
+ * both stateless translation (translateEvent) and stateful accumulation
6
+ * (MessageAccumulator) for building coherent messages from token-level
7
+ * streaming events.
8
+ *
9
+ * The Cursor SDK emits one SDKAssistantMessage per token chunk — a single
10
+ * LLM turn produces dozens of events. MessageAccumulator merges them into
11
+ * a single AgentMessage per turn, matching the Python agent-runner's
12
+ * proven pattern (see chat_model.py handle_chat_model_stream).
13
+ *
14
+ * Tool calls are attached to the most recent MESSAGE_AI message rather
15
+ * than emitted as standalone MESSAGE_TOOL messages. This matches:
16
+ * - The proto model (AgentMessage.tool_calls repeated field)
17
+ * - The Python agent-runner's StatusBuilder pattern
18
+ * - The UI's MessageThread expectation (tool calls on AI messages)
19
+ *
20
+ * Task (sub-agent) tool calls additionally produce SubAgentExecution
21
+ * protos accessible via MessageAccumulator.subAgentExecutions.
22
+ *
23
+ * MCP tool enrichment:
24
+ * Cursor reports MCP tool calls with name="mcp" and the actual details
25
+ * (providerIdentifier, toolName, args) inside event.args. This module
26
+ * extracts those details to populate the ToolCall proto with:
27
+ * - name: the actual MCP tool name (e.g., "search_services")
28
+ * - mcpServerSlug: the MCP server identifier (e.g., "planton")
29
+ * - requiresApproval: from the merged policy chain
30
+ * - approvalMessage: from the policy, with placeholder resolution
31
+ */
32
+
33
+ import { create } from "@bufbuild/protobuf";
34
+ import { AgentMessageSchema, ToolCallSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
35
+ import type { AgentMessage, ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
36
+ import { SubAgentExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/subagent_pb";
37
+ import type { SubAgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/subagent_pb";
38
+ import { MessageType, ToolCallStatus, SubAgentStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
39
+ import type { SDKMessage } from "@cursor/sdk";
40
+ import type { MergedToolPolicy } from "./approval-policy.js";
41
+ import { lookupMcpToolPolicy, resolveApprovalMessage, builtInRequiresApproval, getBuiltInApprovalMessage, extractArgKey } from "./approval-policy.js";
42
+ import { grantToken, type DeniedLedgerEntry } from "./approval-state.js";
43
+ import { utcTimestamp } from "../../shared/status.js";
44
+ import { classifyTool } from "../../shared/tool-kind.js";
45
+
46
+ export { utcTimestamp };
47
+
48
+ const SUPPRESSED_TOOL_NAMES = new Set(["TodoWrite", "updateTodos"]);
49
+
50
+ /**
51
+ * Details extracted from an MCP tool call event's args.
52
+ *
53
+ * When Cursor invokes an MCP tool, the SDK stream reports event.name as
54
+ * "mcp" and packs the real tool identity into event.args:
55
+ * { providerIdentifier: "planton", toolName: "search_services", args: {...} }
56
+ */
57
+ export interface McpToolDetails {
58
+ providerIdentifier: string;
59
+ toolName: string;
60
+ innerArgs: Record<string, unknown>;
61
+ }
62
+
63
+ /**
64
+ * Try to extract MCP tool details from a tool_call event.
65
+ * Returns undefined if the event is not an MCP tool call.
66
+ */
67
+ export function extractMcpToolDetails(
68
+ event: Extract<SDKMessage, { type: "tool_call" }>,
69
+ ): McpToolDetails | undefined {
70
+ if (event.name !== "mcp") return undefined;
71
+
72
+ const args = event.args;
73
+ if (args == null || typeof args !== "object") return undefined;
74
+
75
+ const obj = args as Record<string, unknown>;
76
+ const providerIdentifier = typeof obj.providerIdentifier === "string" ? obj.providerIdentifier : "";
77
+ const toolName = typeof obj.toolName === "string" ? obj.toolName : "";
78
+
79
+ if (!toolName) return undefined;
80
+
81
+ const innerArgs = (typeof obj.args === "object" && obj.args !== null)
82
+ ? obj.args as Record<string, unknown>
83
+ : {};
84
+
85
+ return { providerIdentifier, toolName, innerArgs };
86
+ }
87
+
88
+ /**
89
+ * Translate a single Cursor SDKMessage into zero or more Stigmer AgentMessages.
90
+ *
91
+ * Most events produce exactly one message. Some (like system init) are
92
+ * informational and produce none.
93
+ *
94
+ * Note: for production streaming, use MessageAccumulator instead — it
95
+ * merges token-level events and attaches tool calls to their parent AI
96
+ * messages. This stateless function is retained for unit testing and
97
+ * simple single-event translation.
98
+ */
99
+ export function translateEvent(event: SDKMessage): AgentMessage[] {
100
+ switch (event.type) {
101
+ case "assistant":
102
+ return [translateAssistant(event)];
103
+ case "thinking":
104
+ return [translateThinking(event)];
105
+ case "tool_call":
106
+ return [translateToolCall(event)];
107
+ case "task":
108
+ return event.text ? [translateTask(event)] : [];
109
+ case "system":
110
+ case "status":
111
+ case "user":
112
+ case "request":
113
+ return [];
114
+ default:
115
+ return [];
116
+ }
117
+ }
118
+
119
+ function translateAssistant(event: Extract<SDKMessage, { type: "assistant" }>): AgentMessage {
120
+ const textBlocks = event.message.content
121
+ .filter((b): b is { type: "text"; text: string } => b.type === "text")
122
+ .map((b) => b.text);
123
+
124
+ return create(AgentMessageSchema, {
125
+ type: MessageType.MESSAGE_AI,
126
+ content: textBlocks.join(""),
127
+ timestamp: utcTimestamp(),
128
+ });
129
+ }
130
+
131
+ function translateThinking(event: Extract<SDKMessage, { type: "thinking" }>): AgentMessage {
132
+ return create(AgentMessageSchema, {
133
+ type: MessageType.MESSAGE_THINKING,
134
+ content: event.text,
135
+ timestamp: utcTimestamp(),
136
+ });
137
+ }
138
+
139
+ /**
140
+ * Stateless translation of a tool_call event into a standalone MESSAGE_TOOL
141
+ * message. Retained for backward compatibility with translateEvent() and
142
+ * tests that use the stateless API.
143
+ */
144
+ function translateToolCall(event: Extract<SDKMessage, { type: "tool_call" }>): AgentMessage {
145
+ const toolCall = buildToolCallProto(event);
146
+ const displayName = toolCall.mcpServerSlug
147
+ ? `${toolCall.mcpServerSlug}/${toolCall.name}`
148
+ : toolCall.name;
149
+ return create(AgentMessageSchema, {
150
+ type: MessageType.MESSAGE_TOOL,
151
+ content: `Tool: ${displayName} [${event.status}]`,
152
+ timestamp: utcTimestamp(),
153
+ toolCalls: [toolCall],
154
+ });
155
+ }
156
+
157
+ /**
158
+ * Build a ToolCall proto from a Cursor SDK tool_call event.
159
+ *
160
+ * For MCP tools (event.name === "mcp"), extracts the actual tool name
161
+ * and server slug from event.args. For built-in tools, uses the event
162
+ * name directly.
163
+ *
164
+ * Approval fields are populated when mergedPolicies are provided.
165
+ * Without policies, only basic fields are set (backward compatible).
166
+ */
167
+ export function buildToolCallProto(
168
+ event: Extract<SDKMessage, { type: "tool_call" }>,
169
+ mergedPolicies?: Map<string, MergedToolPolicy>,
170
+ ): ToolCall {
171
+ const status = mapToolCallStatus(event.status);
172
+ const mcpDetails = extractMcpToolDetails(event);
173
+
174
+ const actualName = mcpDetails?.toolName ?? event.name;
175
+ const mcpServerSlug = mcpDetails?.providerIdentifier ?? "";
176
+
177
+ const toolCall = create(ToolCallSchema, {
178
+ id: event.call_id,
179
+ name: actualName,
180
+ status,
181
+ startedAt: status === ToolCallStatus.TOOL_CALL_RUNNING ? utcTimestamp() : "",
182
+ completedAt: isTerminalToolStatus(status) ? utcTimestamp() : "",
183
+ result: typeof event.result === "string" ? event.result : JSON.stringify(event.result ?? ""),
184
+ error: status === ToolCallStatus.TOOL_CALL_FAILED
185
+ ? (typeof event.result === "string" ? event.result : "Tool call failed")
186
+ : "",
187
+ mcpServerSlug,
188
+ toolKind: classifyTool(actualName, mcpServerSlug),
189
+ });
190
+
191
+ if (event.args != null) {
192
+ toolCall.argsPreview = typeof event.args === "string"
193
+ ? event.args
194
+ : JSON.stringify(event.args);
195
+ }
196
+
197
+ const argsObj = mcpDetails?.innerArgs ?? (
198
+ typeof event.args === "object" && event.args !== null
199
+ ? event.args as Record<string, unknown>
200
+ : undefined
201
+ );
202
+ if (argsObj && typeof argsObj === "object") {
203
+ toolCall.args = argsObj as import("@bufbuild/protobuf").JsonObject;
204
+ }
205
+
206
+ // Populate approval fields from the merged policy chain
207
+ if (mergedPolicies && mcpDetails) {
208
+ const policy = lookupMcpToolPolicy(actualName, mcpServerSlug, mergedPolicies);
209
+ if (policy) {
210
+ toolCall.requiresApproval = true;
211
+ toolCall.approvalMessage = resolveApprovalMessage(
212
+ policy.approvalMessage,
213
+ actualName,
214
+ mcpDetails.innerArgs,
215
+ );
216
+ if (status === ToolCallStatus.TOOL_CALL_FAILED) {
217
+ toolCall.approvalRequestedAt = utcTimestamp();
218
+ }
219
+ }
220
+ } else if (mergedPolicies && !mcpDetails) {
221
+ const requires = builtInRequiresApproval(actualName);
222
+ toolCall.requiresApproval = requires;
223
+ if (requires) {
224
+ const template = getBuiltInApprovalMessage(actualName);
225
+ if (template) {
226
+ toolCall.approvalMessage = resolveApprovalMessage(template, actualName, argsObj ?? {});
227
+ if (status === ToolCallStatus.TOOL_CALL_FAILED) {
228
+ toolCall.approvalRequestedAt = utcTimestamp();
229
+ }
230
+ }
231
+ }
232
+ }
233
+
234
+ return toolCall;
235
+ }
236
+
237
+ function translateTask(event: Extract<SDKMessage, { type: "task" }>): AgentMessage {
238
+ return create(AgentMessageSchema, {
239
+ type: MessageType.MESSAGE_SYSTEM,
240
+ content: event.text ?? "",
241
+ timestamp: utcTimestamp(),
242
+ });
243
+ }
244
+
245
+ function mapToolCallStatus(cursorStatus: string): ToolCallStatus {
246
+ switch (cursorStatus) {
247
+ case "running":
248
+ return ToolCallStatus.TOOL_CALL_RUNNING;
249
+ case "completed":
250
+ return ToolCallStatus.TOOL_CALL_COMPLETED;
251
+ case "error":
252
+ return ToolCallStatus.TOOL_CALL_FAILED;
253
+ default:
254
+ return ToolCallStatus.TOOL_CALL_STATUS_UNSPECIFIED;
255
+ }
256
+ }
257
+
258
+ function mapSubAgentStatus(cursorStatus: string): SubAgentStatus {
259
+ switch (cursorStatus) {
260
+ case "running":
261
+ return SubAgentStatus.SUB_AGENT_IN_PROGRESS;
262
+ case "completed":
263
+ return SubAgentStatus.SUB_AGENT_COMPLETED;
264
+ case "error":
265
+ return SubAgentStatus.SUB_AGENT_FAILED;
266
+ default:
267
+ return SubAgentStatus.SUB_AGENT_PENDING;
268
+ }
269
+ }
270
+
271
+ function isTerminalToolStatus(status: ToolCallStatus): boolean {
272
+ return (
273
+ status === ToolCallStatus.TOOL_CALL_COMPLETED ||
274
+ status === ToolCallStatus.TOOL_CALL_FAILED ||
275
+ status === ToolCallStatus.TOOL_CALL_SKIPPED
276
+ );
277
+ }
278
+
279
+ /**
280
+ * Extract sub-agent name from task tool args, handling both the
281
+ * legacy string format (`"generalPurpose"`) and the current SDK
282
+ * object format (`{ kind: "generalPurpose", name?: "..." }`).
283
+ *
284
+ * Falls back to `description` (always populated by the SDK) before
285
+ * returning the generic `"task"`. The `kind` value `"unspecified"`
286
+ * is treated as absent since the Cursor SDK uses it as a default
287
+ * when the sub-agent type is not specified in the blueprint.
288
+ */
289
+ function extractSubagentName(args: unknown): string {
290
+ if (args == null || typeof args !== "object") return "task";
291
+ const obj = args as Record<string, unknown>;
292
+
293
+ const subagentType = obj.subagentType ?? obj.subagent_type;
294
+ if (typeof subagentType === "string" && subagentType) return subagentType;
295
+ if (subagentType != null && typeof subagentType === "object") {
296
+ const typed = subagentType as Record<string, unknown>;
297
+ if (typeof typed.name === "string" && typed.name) return typed.name;
298
+ if (typeof typed.kind === "string" && typed.kind && typed.kind !== "unspecified") {
299
+ return typed.kind;
300
+ }
301
+ }
302
+
303
+ if (typeof obj.description === "string" && obj.description) return obj.description;
304
+
305
+ return "task";
306
+ }
307
+
308
+ function safeString(obj: unknown, key: string): string {
309
+ if (obj != null && typeof obj === "object" && key in obj) {
310
+ const val = (obj as Record<string, unknown>)[key];
311
+ return typeof val === "string" ? val : "";
312
+ }
313
+ return "";
314
+ }
315
+
316
+ /**
317
+ * Parse the task tool's completed result into AgentMessages.
318
+ *
319
+ * The Cursor SDK returns sub-agent work as a blob in the task tool's
320
+ * completed event (not as streaming events with a distinct agent_id).
321
+ * The result shape is:
322
+ *
323
+ * { status: "success", value: { conversationSteps: ConversationStep[] } }
324
+ *
325
+ * where ConversationStep is a discriminated union:
326
+ * - { type: "thinkingMessage", message: { text, thinkingDurationMs? } }
327
+ * - { type: "assistantMessage", message: { text } }
328
+ * - { type: "toolCall", message: { type, args, result?, ... } }
329
+ *
330
+ * This function defensively parses whatever steps are present and
331
+ * appends corresponding AgentMessage protos to the output array.
332
+ * Unknown step types are silently skipped for forward compatibility.
333
+ */
334
+ export function extractConversationSteps(
335
+ result: unknown,
336
+ out: AgentMessage[],
337
+ ): void {
338
+ if (result == null || typeof result !== "object") return;
339
+ const r = result as Record<string, unknown>;
340
+
341
+ const value = r.value ?? r;
342
+ if (value == null || typeof value !== "object") return;
343
+ const v = value as Record<string, unknown>;
344
+
345
+ const steps = v.conversationSteps;
346
+ if (!Array.isArray(steps)) return;
347
+
348
+ for (const step of steps) {
349
+ if (step == null || typeof step !== "object") continue;
350
+ const s = step as Record<string, unknown>;
351
+ const type = s.type as string | undefined;
352
+
353
+ if (type === "thinkingMessage" || s.thinkingMessage != null) {
354
+ const msg = (type === "thinkingMessage" ? s.message : s.thinkingMessage) as Record<string, unknown> | undefined;
355
+ const text = typeof msg?.text === "string" ? msg.text : "";
356
+ if (text) {
357
+ out.push(create(AgentMessageSchema, {
358
+ type: MessageType.MESSAGE_THINKING,
359
+ content: text,
360
+ timestamp: utcTimestamp(),
361
+ }));
362
+ }
363
+ } else if (type === "assistantMessage" || s.assistantMessage != null) {
364
+ const msg = (type === "assistantMessage" ? s.message : s.assistantMessage) as Record<string, unknown> | undefined;
365
+ const text = typeof msg?.text === "string" ? msg.text : "";
366
+ if (text) {
367
+ out.push(create(AgentMessageSchema, {
368
+ type: MessageType.MESSAGE_AI,
369
+ content: text,
370
+ timestamp: utcTimestamp(),
371
+ }));
372
+ }
373
+ } else if (type === "toolCall") {
374
+ const msg = s.message as Record<string, unknown> | undefined;
375
+ if (msg) {
376
+ const toolName = typeof msg.type === "string" ? msg.type : "unknown";
377
+ const toolArgs = msg.args != null ? JSON.stringify(msg.args) : "";
378
+ let toolResult = "";
379
+ if (msg.result != null) {
380
+ const resultObj = msg.result as Record<string, unknown>;
381
+ if (resultObj.status === "success" && resultObj.value != null) {
382
+ toolResult = typeof resultObj.value === "string"
383
+ ? resultObj.value
384
+ : JSON.stringify(resultObj.value);
385
+ } else if (resultObj.status === "error") {
386
+ toolResult = typeof resultObj.error === "string"
387
+ ? resultObj.error
388
+ : JSON.stringify(resultObj);
389
+ } else {
390
+ toolResult = JSON.stringify(msg.result);
391
+ }
392
+ }
393
+
394
+ const aiMsg = create(AgentMessageSchema, {
395
+ type: MessageType.MESSAGE_AI,
396
+ content: "",
397
+ timestamp: utcTimestamp(),
398
+ toolCalls: [create(ToolCallSchema, {
399
+ id: `sub-${toolName}-${out.length}`,
400
+ name: toolName,
401
+ status: ToolCallStatus.TOOL_CALL_COMPLETED,
402
+ argsPreview: toolArgs,
403
+ result: toolResult,
404
+ startedAt: utcTimestamp(),
405
+ completedAt: utcTimestamp(),
406
+ toolKind: classifyTool(toolName),
407
+ })],
408
+ });
409
+ out.push(aiMsg);
410
+ }
411
+ }
412
+ }
413
+ }
414
+
415
+ /**
416
+ * Options for creating a MessageAccumulator with policy awareness.
417
+ */
418
+ export interface MessageAccumulatorOptions {
419
+ mergedPolicies?: Map<string, MergedToolPolicy>;
420
+ }
421
+
422
+ /**
423
+ * Stateful accumulator that merges per-token SDK events into coherent
424
+ * AgentMessages.
425
+ *
426
+ * The Cursor SDK emits one `assistant` event per token chunk (validated:
427
+ * a 2-sentence response produces ~41 events). Without accumulation each
428
+ * chunk becomes a separate AgentMessage, causing the UI to render each
429
+ * word on its own line.
430
+ *
431
+ * MessageAccumulator tracks the active AI and thinking messages per
432
+ * run_id. Consecutive assistant events for the same run_id append to
433
+ * the existing message's content instead of creating new ones.
434
+ *
435
+ * Tool calls are attached to the most recent MESSAGE_AI message's
436
+ * toolCalls array — matching the Python agent-runner's StatusBuilder
437
+ * pattern and the UI's MessageThread expectations.
438
+ *
439
+ * Tool call lifecycle is tracked via a `toolCallIndex` map (keyed by
440
+ * call_id), mirroring the native harness's `ExecutionState.toolCalls`.
441
+ * This ensures completion events always find the correct ToolCall proto
442
+ * regardless of which AI message it was originally attached to — the
443
+ * index stores the same object reference that lives in the message's
444
+ * `toolCalls[]` array, so mutations propagate directly to the proto.
445
+ *
446
+ * Task (sub-agent) tool calls additionally produce SubAgentExecution
447
+ * protos, accessible via the subAgentExecutions getter.
448
+ */
449
+ /**
450
+ * Transition any non-terminal sub-agent (IN_PROGRESS or PENDING) in the given
451
+ * proto array to CANCELLED with a completion timestamp, in place.
452
+ *
453
+ * Operates directly on the status array (not the accumulator) because the
454
+ * Cursor cancellation exception unwinds out of the streaming loop into the
455
+ * activity's catch block, where the MessageAccumulator is out of scope. Returns
456
+ * true if any sub-agent changed.
457
+ */
458
+ export function cancelInProgressSubAgentProtos(
459
+ subAgents: SubAgentExecution[],
460
+ ): boolean {
461
+ let changed = false;
462
+ for (const sub of subAgents) {
463
+ if (
464
+ sub.status === SubAgentStatus.SUB_AGENT_IN_PROGRESS ||
465
+ sub.status === SubAgentStatus.SUB_AGENT_PENDING
466
+ ) {
467
+ sub.status = SubAgentStatus.SUB_AGENT_CANCELLED;
468
+ sub.completedAt = utcTimestamp();
469
+ changed = true;
470
+ }
471
+ }
472
+ return changed;
473
+ }
474
+
475
+ export class MessageAccumulator {
476
+ private readonly messages: AgentMessage[];
477
+ private activeAiByRunId = new Map<string, AgentMessage>();
478
+ private activeThinkingByRunId = new Map<string, AgentMessage>();
479
+ private readonly _subAgentExecutions: SubAgentExecution[] = [];
480
+ private readonly subAgentMap = new Map<string, SubAgentExecution>();
481
+ private readonly mergedPolicies?: Map<string, MergedToolPolicy>;
482
+ private readonly toolCallIndex = new Map<string, ToolCall>();
483
+ private _subAgentDirty = false;
484
+
485
+ constructor(messages: AgentMessage[], options?: MessageAccumulatorOptions) {
486
+ this.messages = messages;
487
+ this.mergedPolicies = options?.mergedPolicies;
488
+ }
489
+
490
+ get subAgentExecutions(): SubAgentExecution[] {
491
+ return this._subAgentExecutions;
492
+ }
493
+
494
+ /**
495
+ * True when a sub-agent execution has been created or updated since the last
496
+ * markSubAgentPersisted(). The streaming loop uses this to trigger a persist
497
+ * promptly when delegation begins (the "task" running event), so the live UI
498
+ * surfaces the sub-agent's IN_PROGRESS state instead of showing no activity
499
+ * until the parent finalizes.
500
+ */
501
+ get subAgentDirty(): boolean {
502
+ return this._subAgentDirty;
503
+ }
504
+
505
+ /** Clears the sub-agent dirty flag after the latest status has been persisted. */
506
+ markSubAgentPersisted(): void {
507
+ this._subAgentDirty = false;
508
+ }
509
+
510
+ /**
511
+ * Transition any non-terminal sub-agent (IN_PROGRESS or PENDING) to CANCELLED.
512
+ *
513
+ * Called when the parent run is aborted (pause / cancel / worker shutdown):
514
+ * the Cursor SDK run stops, so a delegated sub-agent is no longer executing.
515
+ * Without this, the final snapshot would show a permanent "Running" zombie
516
+ * sub-agent. Mirrors the native harness's cancelSubAgents().
517
+ */
518
+ cancelInProgressSubAgents(): void {
519
+ if (cancelInProgressSubAgentProtos(this._subAgentExecutions)) {
520
+ this._subAgentDirty = true;
521
+ }
522
+ }
523
+
524
+ processEvent(event: SDKMessage): void {
525
+ switch (event.type) {
526
+ case "assistant":
527
+ this.accumulateAssistant(event);
528
+ break;
529
+ case "thinking":
530
+ this.accumulateThinking(event);
531
+ break;
532
+ case "tool_call":
533
+ this.finalizeStreaming(event.run_id);
534
+ this.attachToolCallToLastAi(event);
535
+ break;
536
+ case "task":
537
+ if (event.text) {
538
+ this.messages.push(translateTask(event));
539
+ }
540
+ break;
541
+ }
542
+ }
543
+
544
+ finalize(): void {
545
+ for (const msg of this.activeAiByRunId.values()) {
546
+ msg.isStreaming = false;
547
+ }
548
+ for (const msg of this.activeThinkingByRunId.values()) {
549
+ msg.isStreaming = false;
550
+ }
551
+ this.activeAiByRunId.clear();
552
+ this.activeThinkingByRunId.clear();
553
+ }
554
+
555
+ private attachToolCallToLastAi(
556
+ event: Extract<SDKMessage, { type: "tool_call" }>,
557
+ ): void {
558
+ if (SUPPRESSED_TOOL_NAMES.has(event.name)) return;
559
+
560
+ const status = mapToolCallStatus(event.status);
561
+
562
+ if (event.status === "running") {
563
+ const aiMsg = this.findOrCreateLastAiMessage();
564
+ const tc = buildToolCallProto(event, this.mergedPolicies);
565
+ aiMsg.toolCalls.push(tc);
566
+ this.toolCallIndex.set(event.call_id, tc);
567
+ } else {
568
+ const existing = this.toolCallIndex.get(event.call_id);
569
+ if (existing) {
570
+ existing.status = status;
571
+ if (isTerminalToolStatus(status)) {
572
+ existing.completedAt = utcTimestamp();
573
+ }
574
+ if (event.result != null) {
575
+ existing.result = typeof event.result === "string"
576
+ ? event.result
577
+ : JSON.stringify(event.result);
578
+ }
579
+ if (status === ToolCallStatus.TOOL_CALL_FAILED) {
580
+ existing.error = typeof event.result === "string"
581
+ ? event.result
582
+ : "Tool call failed";
583
+ if (existing.requiresApproval) {
584
+ existing.approvalRequestedAt = utcTimestamp();
585
+ }
586
+ }
587
+ if (event.args != null && !existing.argsPreview) {
588
+ existing.argsPreview = typeof event.args === "string"
589
+ ? event.args
590
+ : JSON.stringify(event.args);
591
+ }
592
+ } else {
593
+ const aiMsg = this.findOrCreateLastAiMessage();
594
+ const tc = buildToolCallProto(event, this.mergedPolicies);
595
+ aiMsg.toolCalls.push(tc);
596
+ this.toolCallIndex.set(event.call_id, tc);
597
+ }
598
+ }
599
+ }
600
+
601
+ private findOrCreateLastAiMessage(): AgentMessage {
602
+ for (let i = this.messages.length - 1; i >= 0; i--) {
603
+ if (this.messages[i].type === MessageType.MESSAGE_AI) {
604
+ return this.messages[i];
605
+ }
606
+ }
607
+ const msg = create(AgentMessageSchema, {
608
+ type: MessageType.MESSAGE_AI,
609
+ content: "",
610
+ timestamp: utcTimestamp(),
611
+ });
612
+ this.messages.push(msg);
613
+ return msg;
614
+ }
615
+
616
+ trackSubAgentExecution(
617
+ event: Extract<SDKMessage, { type: "tool_call" }>,
618
+ ): SubAgentExecution | undefined {
619
+ const existing = this.subAgentMap.get(event.call_id);
620
+
621
+ if (existing) {
622
+ existing.status = mapSubAgentStatus(event.status);
623
+ if (event.status === "completed" || event.status === "error") {
624
+ existing.completedAt = utcTimestamp();
625
+ }
626
+ if (event.status === "completed" && event.result != null) {
627
+ existing.output = typeof event.result === "string"
628
+ ? event.result
629
+ : JSON.stringify(event.result);
630
+ extractConversationSteps(event.result, existing.messages);
631
+ }
632
+ if (event.status === "error") {
633
+ existing.error = typeof event.result === "string"
634
+ ? event.result
635
+ : "Sub-agent failed";
636
+ }
637
+ this._subAgentDirty = true;
638
+ return existing;
639
+ }
640
+
641
+ const sub = create(SubAgentExecutionSchema, {
642
+ id: event.call_id,
643
+ name: extractSubagentName(event.args),
644
+ subject: safeString(event.args, "description"),
645
+ input: safeString(event.args, "prompt"),
646
+ status: mapSubAgentStatus(event.status),
647
+ startedAt: utcTimestamp(),
648
+ });
649
+ this._subAgentExecutions.push(sub);
650
+ this.subAgentMap.set(event.call_id, sub);
651
+ this._subAgentDirty = true;
652
+ return sub;
653
+ }
654
+
655
+ private accumulateAssistant(
656
+ event: Extract<SDKMessage, { type: "assistant" }>,
657
+ ): void {
658
+ const text = event.message.content
659
+ .filter((b): b is { type: "text"; text: string } => b.type === "text")
660
+ .map((b) => b.text)
661
+ .join("");
662
+
663
+ if (!text) return;
664
+
665
+ const existing = this.activeAiByRunId.get(event.run_id);
666
+ if (existing) {
667
+ existing.content += text;
668
+ return;
669
+ }
670
+
671
+ const msg = create(AgentMessageSchema, {
672
+ type: MessageType.MESSAGE_AI,
673
+ content: text,
674
+ timestamp: utcTimestamp(),
675
+ isStreaming: true,
676
+ });
677
+ this.messages.push(msg);
678
+ this.activeAiByRunId.set(event.run_id, msg);
679
+ }
680
+
681
+ private accumulateThinking(
682
+ event: Extract<SDKMessage, { type: "thinking" }>,
683
+ ): void {
684
+ if (!event.text) return;
685
+
686
+ const existing = this.activeThinkingByRunId.get(event.run_id);
687
+ if (existing) {
688
+ existing.content += event.text;
689
+ return;
690
+ }
691
+
692
+ const msg = create(AgentMessageSchema, {
693
+ type: MessageType.MESSAGE_THINKING,
694
+ content: event.text,
695
+ timestamp: utcTimestamp(),
696
+ isStreaming: true,
697
+ });
698
+ this.messages.push(msg);
699
+ this.activeThinkingByRunId.set(event.run_id, msg);
700
+ }
701
+
702
+ private finalizeStreaming(runId: string): void {
703
+ const ai = this.activeAiByRunId.get(runId);
704
+ if (ai) {
705
+ ai.isStreaming = false;
706
+ this.activeAiByRunId.delete(runId);
707
+ }
708
+ const thinking = this.activeThinkingByRunId.get(runId);
709
+ if (thinking) {
710
+ thinking.isStreaming = false;
711
+ this.activeThinkingByRunId.delete(runId);
712
+ }
713
+ }
714
+ }
715
+
716
+ /**
717
+ * Reconcile the denial ledger written by the preToolUse hook against the tool
718
+ * calls accumulated from the stream, marking each denied call as
719
+ * WAITING_APPROVAL.
720
+ *
721
+ * This is the cursor analog of the native harness synthesizing WAITING_APPROVAL
722
+ * tool calls from LangGraph interrupts (execute-deep-agent/index.ts). The hook
723
+ * ledger — not the SDK-reported tool status — is the authoritative record of
724
+ * what was gated, because the hook is the only component that makes the per-call
725
+ * allow/deny decision. The backend then projects pending_approvals from these
726
+ * WAITING_APPROVAL tool calls (PendingApprovalComputer), so the approval surface
727
+ * is driven entirely by tool-call status, exactly like the native harness.
728
+ *
729
+ * Correlation is by tool identity token (the same space as approvedGrantTokens),
730
+ * not by call id: a denied tool's identity is stable, and a single resource
731
+ * approved once should produce one approval regardless of how many times the
732
+ * agent re-attempted it within the turn.
733
+ *
734
+ * If a ledger denial has no matching streamed tool call (rare — Cursor normally
735
+ * emits a tool_call event for every attempt), a placeholder WAITING_APPROVAL
736
+ * tool call is synthesized so the gate still surfaces and never renders as a
737
+ * silent success.
738
+ *
739
+ * Returns the tool calls now marked WAITING_APPROVAL (overlaid + synthesized).
740
+ */
741
+ export function reconcileDeniedToolCalls(
742
+ messages: AgentMessage[],
743
+ ledger: DeniedLedgerEntry[],
744
+ mergedPolicies?: Map<string, MergedToolPolicy>,
745
+ ): ToolCall[] {
746
+ if (ledger.length === 0) return [];
747
+
748
+ // One approval per denied identity; a resource re-attempted within the turn
749
+ // is gated under the same token and collapses to a single approval.
750
+ const deniedTokens = new Set(ledger.map((e) => e.token));
751
+ const matched = new Set<string>();
752
+ const result: ToolCall[] = [];
753
+
754
+ // 1. Overlay WAITING_APPROVAL onto the streamed tool calls that were denied.
755
+ for (const msg of messages) {
756
+ for (const tc of msg.toolCalls) {
757
+ const token = toolCallIdentityToken(tc);
758
+ if (!deniedTokens.has(token) || matched.has(token)) continue;
759
+ markWaitingApproval(tc, mergedPolicies);
760
+ matched.add(token);
761
+ result.push(tc);
762
+ }
763
+ }
764
+
765
+ // 2. Synthesize a tool call for any denial that never produced a stream event.
766
+ for (const entry of ledger) {
767
+ if (matched.has(entry.token)) continue;
768
+ const decoded = decodeIdentityToken(entry.token);
769
+ const name = decoded?.name || entry.toolName || "tool";
770
+ const argKey = decoded?.argKey ?? "";
771
+ const tc = synthesizeWaitingApprovalToolCall(name, argKey, mergedPolicies);
772
+ appendToolCallToLastAiMessage(messages, tc);
773
+ matched.add(entry.token);
774
+ result.push(tc);
775
+ }
776
+
777
+ return result;
778
+ }
779
+
780
+ /**
781
+ * Compute a tool call's identity token in the same space the preToolUse hook
782
+ * uses (grantToken: base64 of `toolName \n salientArg`). Mirrors the hook's
783
+ * choice: MCP tools are name-only (no top-level salient arg in the hook input,
784
+ * matching the grant convention); built-in tools key on their salient arg.
785
+ */
786
+ function toolCallIdentityToken(tc: ToolCall): string {
787
+ const argKey = tc.mcpServerSlug ? "" : extractArgKey(toolCallArgs(tc));
788
+ return grantToken(tc.name, argKey);
789
+ }
790
+
791
+ /** Decode a `grantToken` back into its (name, argKey) for synthesis fallback. */
792
+ function decodeIdentityToken(token: string): { name: string; argKey: string } | undefined {
793
+ try {
794
+ const decoded = Buffer.from(token, "base64").toString("utf-8");
795
+ const nl = decoded.indexOf("\n");
796
+ if (nl < 0) return undefined;
797
+ return { name: decoded.slice(0, nl), argKey: decoded.slice(nl + 1) };
798
+ } catch {
799
+ return undefined;
800
+ }
801
+ }
802
+
803
+ /** Best-effort args record for a tool call (proto struct, else parsed preview). */
804
+ function toolCallArgs(tc: ToolCall): Record<string, unknown> {
805
+ if (tc.args && typeof tc.args === "object") {
806
+ return tc.args as Record<string, unknown>;
807
+ }
808
+ if (tc.argsPreview) {
809
+ try {
810
+ const parsed = JSON.parse(tc.argsPreview);
811
+ if (parsed && typeof parsed === "object") return parsed as Record<string, unknown>;
812
+ } catch {
813
+ // fall through
814
+ }
815
+ }
816
+ return {};
817
+ }
818
+
819
+ /**
820
+ * Mark a denied tool call as awaiting approval, clearing the result/terminal
821
+ * fields the stream may have set (the tool never actually ran — it was gated).
822
+ */
823
+ function markWaitingApproval(
824
+ tc: ToolCall,
825
+ mergedPolicies?: Map<string, MergedToolPolicy>,
826
+ ): void {
827
+ tc.status = ToolCallStatus.TOOL_CALL_WAITING_APPROVAL;
828
+ tc.requiresApproval = true;
829
+ if (!tc.approvalMessage) {
830
+ tc.approvalMessage = resolveDeniedApprovalMessage(
831
+ tc.name, tc.mcpServerSlug, toolCallArgs(tc), mergedPolicies,
832
+ );
833
+ }
834
+ if (!tc.approvalRequestedAt) tc.approvalRequestedAt = utcTimestamp();
835
+ tc.completedAt = "";
836
+ tc.error = "";
837
+ tc.result = "";
838
+ }
839
+
840
+ function synthesizeWaitingApprovalToolCall(
841
+ name: string,
842
+ argKey: string,
843
+ mergedPolicies?: Map<string, MergedToolPolicy>,
844
+ ): ToolCall {
845
+ const tc = create(ToolCallSchema, {
846
+ id: `approval:${grantToken(name, argKey)}`,
847
+ name,
848
+ status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL,
849
+ requiresApproval: true,
850
+ startedAt: utcTimestamp(),
851
+ approvalRequestedAt: utcTimestamp(),
852
+ toolKind: classifyTool(name),
853
+ });
854
+ tc.approvalMessage = argKey
855
+ ? `Tool requires approval: ${name} (${argKey})`
856
+ : resolveDeniedApprovalMessage(name, "", {}, mergedPolicies);
857
+ return tc;
858
+ }
859
+
860
+ /**
861
+ * Resolve a human-readable approval message for a denied tool, preferring the
862
+ * MCP policy template, then the built-in template, then a generic fallback.
863
+ */
864
+ function resolveDeniedApprovalMessage(
865
+ name: string,
866
+ mcpServerSlug: string,
867
+ args: Record<string, unknown>,
868
+ mergedPolicies?: Map<string, MergedToolPolicy>,
869
+ ): string {
870
+ if (mergedPolicies && mcpServerSlug) {
871
+ const policy = lookupMcpToolPolicy(name, mcpServerSlug, mergedPolicies);
872
+ if (policy) return resolveApprovalMessage(policy.approvalMessage, name, args);
873
+ }
874
+ if (!mcpServerSlug) {
875
+ const template = getBuiltInApprovalMessage(name);
876
+ if (template) return resolveApprovalMessage(template, name, args);
877
+ }
878
+ return `Tool requires approval: ${name}`;
879
+ }
880
+
881
+ /** Append a tool call to the last AI message, creating one if none exists. */
882
+ function appendToolCallToLastAiMessage(messages: AgentMessage[], tc: ToolCall): void {
883
+ for (let i = messages.length - 1; i >= 0; i--) {
884
+ if (messages[i].type === MessageType.MESSAGE_AI) {
885
+ messages[i].toolCalls.push(tc);
886
+ return;
887
+ }
888
+ }
889
+ const msg = create(AgentMessageSchema, {
890
+ type: MessageType.MESSAGE_AI,
891
+ content: "",
892
+ timestamp: utcTimestamp(),
893
+ toolCalls: [tc],
894
+ });
895
+ messages.push(msg);
896
+ }