@puku-ai/sdk 4.0.1 → 4.0.2

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 (582) hide show
  1. package/dist/index.d.ts +26 -0
  2. package/dist/index.js +32 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/vendor/_vendor/partial-json-parser/parser.d.ts +2 -0
  5. package/dist/vendor/_vendor/partial-json-parser/parser.js +223 -0
  6. package/dist/vendor/_vendor/partial-json-parser/parser.js.map +1 -0
  7. package/dist/vendor/api-promise.d.ts +2 -0
  8. package/dist/vendor/api-promise.js +3 -0
  9. package/dist/vendor/api-promise.js.map +1 -0
  10. package/dist/vendor/client.d.ts +399 -0
  11. package/dist/vendor/client.js +976 -0
  12. package/dist/vendor/client.js.map +1 -0
  13. package/dist/vendor/core/api-promise.d.ts +49 -0
  14. package/dist/vendor/core/api-promise.js +77 -0
  15. package/dist/vendor/core/api-promise.js.map +1 -0
  16. package/dist/vendor/core/api.d.ts +10 -0
  17. package/dist/vendor/core/api.js +2 -0
  18. package/dist/vendor/core/api.js.map +1 -0
  19. package/dist/vendor/core/credentials.d.ts +130 -0
  20. package/dist/vendor/core/credentials.js +274 -0
  21. package/dist/vendor/core/credentials.js.map +1 -0
  22. package/dist/vendor/core/error.d.ts +82 -0
  23. package/dist/vendor/core/error.js +140 -0
  24. package/dist/vendor/core/error.js.map +1 -0
  25. package/dist/vendor/core/middleware.d.ts +153 -0
  26. package/dist/vendor/core/middleware.js +168 -0
  27. package/dist/vendor/core/middleware.js.map +1 -0
  28. package/dist/vendor/core/pagination.d.ts +121 -0
  29. package/dist/vendor/core/pagination.js +207 -0
  30. package/dist/vendor/core/pagination.js.map +1 -0
  31. package/dist/vendor/core/resource.d.ts +5 -0
  32. package/dist/vendor/core/resource.js +8 -0
  33. package/dist/vendor/core/resource.js.map +1 -0
  34. package/dist/vendor/core/streaming.d.ts +41 -0
  35. package/dist/vendor/core/streaming.js +342 -0
  36. package/dist/vendor/core/streaming.js.map +1 -0
  37. package/dist/vendor/core/uploads.d.ts +2 -0
  38. package/dist/vendor/core/uploads.js +2 -0
  39. package/dist/vendor/core/uploads.js.map +1 -0
  40. package/dist/vendor/error.d.ts +2 -0
  41. package/dist/vendor/error.js +3 -0
  42. package/dist/vendor/error.js.map +1 -0
  43. package/dist/vendor/helpers/beta/environments.d.ts +22 -0
  44. package/dist/vendor/helpers/beta/environments.js +23 -0
  45. package/dist/vendor/helpers/beta/environments.js.map +1 -0
  46. package/dist/vendor/helpers/beta/json-schema.d.ts +36 -0
  47. package/dist/vendor/helpers/beta/json-schema.js +53 -0
  48. package/dist/vendor/helpers/beta/json-schema.js.map +1 -0
  49. package/dist/vendor/helpers/beta/mcp.d.ts +302 -0
  50. package/dist/vendor/helpers/beta/mcp.js +406 -0
  51. package/dist/vendor/helpers/beta/mcp.js.map +1 -0
  52. package/dist/vendor/helpers/beta/memory.d.ts +10 -0
  53. package/dist/vendor/helpers/beta/memory.js +15 -0
  54. package/dist/vendor/helpers/beta/memory.js.map +1 -0
  55. package/dist/vendor/helpers/beta/standard-schema.d.ts +44 -0
  56. package/dist/vendor/helpers/beta/standard-schema.js +54 -0
  57. package/dist/vendor/helpers/beta/standard-schema.js.map +1 -0
  58. package/dist/vendor/helpers/beta/zod.d.ts +32 -0
  59. package/dist/vendor/helpers/beta/zod.js +52 -0
  60. package/dist/vendor/helpers/beta/zod.js.map +1 -0
  61. package/dist/vendor/helpers/index.d.ts +2 -0
  62. package/dist/vendor/helpers/index.js +3 -0
  63. package/dist/vendor/helpers/index.js.map +1 -0
  64. package/dist/vendor/helpers/json-schema.d.ts +17 -0
  65. package/dist/vendor/helpers/json-schema.js +34 -0
  66. package/dist/vendor/helpers/json-schema.js.map +1 -0
  67. package/dist/vendor/helpers/zod.d.ts +12 -0
  68. package/dist/vendor/helpers/zod.js +42 -0
  69. package/dist/vendor/helpers/zod.js.map +1 -0
  70. package/dist/vendor/index.d.ts +16 -0
  71. package/dist/vendor/index.js +23 -0
  72. package/dist/vendor/index.js.map +1 -0
  73. package/dist/vendor/internal/builtin-types.d.ts +72 -0
  74. package/dist/vendor/internal/builtin-types.js +3 -0
  75. package/dist/vendor/internal/builtin-types.js.map +1 -0
  76. package/dist/vendor/internal/constants.d.ts +4 -0
  77. package/dist/vendor/internal/constants.js +10 -0
  78. package/dist/vendor/internal/constants.js.map +1 -0
  79. package/dist/vendor/internal/decoders/jsonl.d.ts +9 -0
  80. package/dist/vendor/internal/decoders/jsonl.js +37 -0
  81. package/dist/vendor/internal/decoders/jsonl.js.map +1 -0
  82. package/dist/vendor/internal/decoders/line.d.ts +16 -0
  83. package/dist/vendor/internal/decoders/line.js +105 -0
  84. package/dist/vendor/internal/decoders/line.js.map +1 -0
  85. package/dist/vendor/internal/detect-platform.d.ts +14 -0
  86. package/dist/vendor/internal/detect-platform.js +155 -0
  87. package/dist/vendor/internal/detect-platform.js.map +1 -0
  88. package/dist/vendor/internal/errors.d.ts +2 -0
  89. package/dist/vendor/internal/errors.js +38 -0
  90. package/dist/vendor/internal/errors.js.map +1 -0
  91. package/dist/vendor/internal/file-store.d.ts +135 -0
  92. package/dist/vendor/internal/file-store.js +529 -0
  93. package/dist/vendor/internal/file-store.js.map +1 -0
  94. package/dist/vendor/internal/headers.d.ts +28 -0
  95. package/dist/vendor/internal/headers.js +114 -0
  96. package/dist/vendor/internal/headers.js.map +1 -0
  97. package/dist/vendor/internal/message-stream-utils.d.ts +9 -0
  98. package/dist/vendor/internal/message-stream-utils.js +30 -0
  99. package/dist/vendor/internal/message-stream-utils.js.map +1 -0
  100. package/dist/vendor/internal/node.browser.d.ts +8 -0
  101. package/dist/vendor/internal/node.browser.js +19 -0
  102. package/dist/vendor/internal/node.browser.js.map +1 -0
  103. package/dist/vendor/internal/node.d.ts +13 -0
  104. package/dist/vendor/internal/node.js +14 -0
  105. package/dist/vendor/internal/node.js.map +1 -0
  106. package/dist/vendor/internal/parse.d.ts +17 -0
  107. package/dist/vendor/internal/parse.js +62 -0
  108. package/dist/vendor/internal/parse.js.map +1 -0
  109. package/dist/vendor/internal/qs/formats.d.ts +6 -0
  110. package/dist/vendor/internal/qs/formats.js +9 -0
  111. package/dist/vendor/internal/qs/formats.js.map +1 -0
  112. package/dist/vendor/internal/qs/index.d.ts +9 -0
  113. package/dist/vendor/internal/qs/index.js +10 -0
  114. package/dist/vendor/internal/qs/index.js.map +1 -0
  115. package/dist/vendor/internal/qs/stringify.d.ts +2 -0
  116. package/dist/vendor/internal/qs/stringify.js +274 -0
  117. package/dist/vendor/internal/qs/stringify.js.map +1 -0
  118. package/dist/vendor/internal/qs/types.d.ts +56 -0
  119. package/dist/vendor/internal/qs/types.js +2 -0
  120. package/dist/vendor/internal/qs/types.js.map +1 -0
  121. package/dist/vendor/internal/qs/utils.d.ts +14 -0
  122. package/dist/vendor/internal/qs/utils.js +217 -0
  123. package/dist/vendor/internal/qs/utils.js.map +1 -0
  124. package/dist/vendor/internal/request-options.d.ts +126 -0
  125. package/dist/vendor/internal/request-options.js +27 -0
  126. package/dist/vendor/internal/request-options.js.map +1 -0
  127. package/dist/vendor/internal/request-signal.d.ts +3 -0
  128. package/dist/vendor/internal/request-signal.js +45 -0
  129. package/dist/vendor/internal/request-signal.js.map +1 -0
  130. package/dist/vendor/internal/shim-types.d.ts +16 -0
  131. package/dist/vendor/internal/shim-types.js +3 -0
  132. package/dist/vendor/internal/shim-types.js.map +1 -0
  133. package/dist/vendor/internal/shims.d.ts +25 -0
  134. package/dist/vendor/internal/shims.js +85 -0
  135. package/dist/vendor/internal/shims.js.map +1 -0
  136. package/dist/vendor/internal/stainless-helper-header.d.ts +59 -0
  137. package/dist/vendor/internal/stainless-helper-header.js +83 -0
  138. package/dist/vendor/internal/stainless-helper-header.js.map +1 -0
  139. package/dist/vendor/internal/stream-utils.d.ts +7 -0
  140. package/dist/vendor/internal/stream-utils.js +35 -0
  141. package/dist/vendor/internal/stream-utils.js.map +1 -0
  142. package/dist/vendor/internal/to-file.d.ts +44 -0
  143. package/dist/vendor/internal/to-file.js +93 -0
  144. package/dist/vendor/internal/to-file.js.map +1 -0
  145. package/dist/vendor/internal/types.d.ts +62 -0
  146. package/dist/vendor/internal/types.js +3 -0
  147. package/dist/vendor/internal/types.js.map +1 -0
  148. package/dist/vendor/internal/uploads.d.ts +41 -0
  149. package/dist/vendor/internal/uploads.js +139 -0
  150. package/dist/vendor/internal/uploads.js.map +1 -0
  151. package/dist/vendor/internal/utils/abort.d.ts +11 -0
  152. package/dist/vendor/internal/utils/abort.js +22 -0
  153. package/dist/vendor/internal/utils/abort.js.map +1 -0
  154. package/dist/vendor/internal/utils/async-queue.d.ts +30 -0
  155. package/dist/vendor/internal/utils/async-queue.js +66 -0
  156. package/dist/vendor/internal/utils/async-queue.js.map +1 -0
  157. package/dist/vendor/internal/utils/backoff.d.ts +22 -0
  158. package/dist/vendor/internal/utils/backoff.js +36 -0
  159. package/dist/vendor/internal/utils/backoff.js.map +1 -0
  160. package/dist/vendor/internal/utils/base64.d.ts +2 -0
  161. package/dist/vendor/internal/utils/base64.js +33 -0
  162. package/dist/vendor/internal/utils/base64.js.map +1 -0
  163. package/dist/vendor/internal/utils/bytes.d.ts +3 -0
  164. package/dist/vendor/internal/utils/bytes.js +26 -0
  165. package/dist/vendor/internal/utils/bytes.js.map +1 -0
  166. package/dist/vendor/internal/utils/env.d.ts +8 -0
  167. package/dist/vendor/internal/utils/env.js +18 -0
  168. package/dist/vendor/internal/utils/env.js.map +1 -0
  169. package/dist/vendor/internal/utils/log.d.ts +46 -0
  170. package/dist/vendor/internal/utils/log.js +105 -0
  171. package/dist/vendor/internal/utils/log.js.map +1 -0
  172. package/dist/vendor/internal/utils/path.d.ts +14 -0
  173. package/dist/vendor/internal/utils/path.js +74 -0
  174. package/dist/vendor/internal/utils/path.js.map +1 -0
  175. package/dist/vendor/internal/utils/promise.d.ts +10 -0
  176. package/dist/vendor/internal/utils/promise.js +15 -0
  177. package/dist/vendor/internal/utils/promise.js.map +1 -0
  178. package/dist/vendor/internal/utils/query.d.ts +1 -0
  179. package/dist/vendor/internal/utils/query.js +6 -0
  180. package/dist/vendor/internal/utils/query.js.map +1 -0
  181. package/dist/vendor/internal/utils/sleep.d.ts +9 -0
  182. package/dist/vendor/internal/utils/sleep.js +24 -0
  183. package/dist/vendor/internal/utils/sleep.js.map +1 -0
  184. package/dist/vendor/internal/utils/time.d.ts +2 -0
  185. package/dist/vendor/internal/utils/time.js +5 -0
  186. package/dist/vendor/internal/utils/time.js.map +1 -0
  187. package/dist/vendor/internal/utils/uuid.d.ts +4 -0
  188. package/dist/vendor/internal/utils/uuid.js +15 -0
  189. package/dist/vendor/internal/utils/uuid.js.map +1 -0
  190. package/dist/vendor/internal/utils/values.d.ts +24 -0
  191. package/dist/vendor/internal/utils/values.js +106 -0
  192. package/dist/vendor/internal/utils/values.js.map +1 -0
  193. package/dist/vendor/internal/utils.d.ts +7 -0
  194. package/dist/vendor/internal/utils.js +9 -0
  195. package/dist/vendor/internal/utils.js.map +1 -0
  196. package/dist/vendor/lib/BetaMessageStream.d.ts +123 -0
  197. package/dist/vendor/lib/BetaMessageStream.js +662 -0
  198. package/dist/vendor/lib/BetaMessageStream.js.map +1 -0
  199. package/dist/vendor/lib/MessageStream.d.ts +122 -0
  200. package/dist/vendor/lib/MessageStream.js +609 -0
  201. package/dist/vendor/lib/MessageStream.js.map +1 -0
  202. package/dist/vendor/lib/beta-parser.d.ts +36 -0
  203. package/dist/vendor/lib/beta-parser.js +75 -0
  204. package/dist/vendor/lib/beta-parser.js.map +1 -0
  205. package/dist/vendor/lib/credentials/credential-chain.d.ts +38 -0
  206. package/dist/vendor/lib/credentials/credential-chain.js +208 -0
  207. package/dist/vendor/lib/credentials/credential-chain.js.map +1 -0
  208. package/dist/vendor/lib/credentials/identity-token.d.ts +10 -0
  209. package/dist/vendor/lib/credentials/identity-token.js +35 -0
  210. package/dist/vendor/lib/credentials/identity-token.js.map +1 -0
  211. package/dist/vendor/lib/credentials/oidc-federation.d.ts +39 -0
  212. package/dist/vendor/lib/credentials/oidc-federation.js +79 -0
  213. package/dist/vendor/lib/credentials/oidc-federation.js.map +1 -0
  214. package/dist/vendor/lib/credentials/token-cache.d.ts +53 -0
  215. package/dist/vendor/lib/credentials/token-cache.js +110 -0
  216. package/dist/vendor/lib/credentials/token-cache.js.map +1 -0
  217. package/dist/vendor/lib/credentials/types.d.ts +95 -0
  218. package/dist/vendor/lib/credentials/types.js +226 -0
  219. package/dist/vendor/lib/credentials/types.js.map +1 -0
  220. package/dist/vendor/lib/credentials/user-oauth.d.ts +20 -0
  221. package/dist/vendor/lib/credentials/user-oauth.js +94 -0
  222. package/dist/vendor/lib/credentials/user-oauth.js.map +1 -0
  223. package/dist/vendor/lib/credentials.d.ts +3 -0
  224. package/dist/vendor/lib/credentials.js +3 -0
  225. package/dist/vendor/lib/credentials.js.map +1 -0
  226. package/dist/vendor/lib/environments/index.d.ts +3 -0
  227. package/dist/vendor/lib/environments/index.js +4 -0
  228. package/dist/vendor/lib/environments/index.js.map +1 -0
  229. package/dist/vendor/lib/environments/poller.d.ts +94 -0
  230. package/dist/vendor/lib/environments/poller.js +218 -0
  231. package/dist/vendor/lib/environments/poller.js.map +1 -0
  232. package/dist/vendor/lib/environments/worker.d.ts +226 -0
  233. package/dist/vendor/lib/environments/worker.js +572 -0
  234. package/dist/vendor/lib/environments/worker.js.map +1 -0
  235. package/dist/vendor/lib/helper-client.d.ts +30 -0
  236. package/dist/vendor/lib/helper-client.js +55 -0
  237. package/dist/vendor/lib/helper-client.js.map +1 -0
  238. package/dist/vendor/lib/middleware.d.ts +97 -0
  239. package/dist/vendor/lib/middleware.js +775 -0
  240. package/dist/vendor/lib/middleware.js.map +1 -0
  241. package/dist/vendor/lib/parser.d.ts +31 -0
  242. package/dist/vendor/lib/parser.js +62 -0
  243. package/dist/vendor/lib/parser.js.map +1 -0
  244. package/dist/vendor/lib/sessions/accumulate.d.ts +22 -0
  245. package/dist/vendor/lib/sessions/accumulate.js +42 -0
  246. package/dist/vendor/lib/sessions/accumulate.js.map +1 -0
  247. package/dist/vendor/lib/standard-schema.d.ts +130 -0
  248. package/dist/vendor/lib/standard-schema.js +41 -0
  249. package/dist/vendor/lib/standard-schema.js.map +1 -0
  250. package/dist/vendor/lib/tools/BetaRunnableTool.d.ts +48 -0
  251. package/dist/vendor/lib/tools/BetaRunnableTool.js +26 -0
  252. package/dist/vendor/lib/tools/BetaRunnableTool.js.map +1 -0
  253. package/dist/vendor/lib/tools/BetaToolRunner.d.ts +160 -0
  254. package/dist/vendor/lib/tools/BetaToolRunner.js +497 -0
  255. package/dist/vendor/lib/tools/BetaToolRunner.js.map +1 -0
  256. package/dist/vendor/lib/tools/CompactionControl.d.ts +29 -0
  257. package/dist/vendor/lib/tools/CompactionControl.js +25 -0
  258. package/dist/vendor/lib/tools/CompactionControl.js.map +1 -0
  259. package/dist/vendor/lib/tools/SessionToolRunner.d.ts +178 -0
  260. package/dist/vendor/lib/tools/SessionToolRunner.js +737 -0
  261. package/dist/vendor/lib/tools/SessionToolRunner.js.map +1 -0
  262. package/dist/vendor/lib/tools/ToolError.d.ts +32 -0
  263. package/dist/vendor/lib/tools/ToolError.js +43 -0
  264. package/dist/vendor/lib/tools/ToolError.js.map +1 -0
  265. package/dist/vendor/lib/transform-json-schema.d.ts +2 -0
  266. package/dist/vendor/lib/transform-json-schema.js +111 -0
  267. package/dist/vendor/lib/transform-json-schema.js.map +1 -0
  268. package/dist/vendor/pagination.d.ts +2 -0
  269. package/dist/vendor/pagination.js +3 -0
  270. package/dist/vendor/pagination.js.map +1 -0
  271. package/dist/vendor/resource.d.ts +2 -0
  272. package/dist/vendor/resource.js +3 -0
  273. package/dist/vendor/resource.js.map +1 -0
  274. package/dist/vendor/resources/beta/agents/agents.d.ts +1128 -0
  275. package/dist/vendor/resources/beta/agents/agents.js +123 -0
  276. package/dist/vendor/resources/beta/agents/agents.js.map +1 -0
  277. package/dist/vendor/resources/beta/agents/index.d.ts +2 -0
  278. package/dist/vendor/resources/beta/agents/index.js +4 -0
  279. package/dist/vendor/resources/beta/agents/index.js.map +1 -0
  280. package/dist/vendor/resources/beta/agents/versions.d.ts +32 -0
  281. package/dist/vendor/resources/beta/agents/versions.js +32 -0
  282. package/dist/vendor/resources/beta/agents/versions.js.map +1 -0
  283. package/dist/vendor/resources/beta/agents.d.ts +1 -0
  284. package/dist/vendor/resources/beta/agents.js +3 -0
  285. package/dist/vendor/resources/beta/agents.js.map +1 -0
  286. package/dist/vendor/resources/beta/beta.d.ts +131 -0
  287. package/dist/vendor/resources/beta/beta.js +69 -0
  288. package/dist/vendor/resources/beta/beta.js.map +1 -0
  289. package/dist/vendor/resources/beta/deployment-runs.d.ts +305 -0
  290. package/dist/vendor/resources/beta/deployment-runs.js +51 -0
  291. package/dist/vendor/resources/beta/deployment-runs.js.map +1 -0
  292. package/dist/vendor/resources/beta/deployments.d.ts +698 -0
  293. package/dist/vendor/resources/beta/deployments.js +192 -0
  294. package/dist/vendor/resources/beta/deployments.js.map +1 -0
  295. package/dist/vendor/resources/beta/dreams.d.ts +335 -0
  296. package/dist/vendor/resources/beta/dreams.js +112 -0
  297. package/dist/vendor/resources/beta/dreams.js.map +1 -0
  298. package/dist/vendor/resources/beta/environments/environments.d.ts +432 -0
  299. package/dist/vendor/resources/beta/environments/environments.js +142 -0
  300. package/dist/vendor/resources/beta/environments/environments.js.map +1 -0
  301. package/dist/vendor/resources/beta/environments/index.d.ts +2 -0
  302. package/dist/vendor/resources/beta/environments/index.js +4 -0
  303. package/dist/vendor/resources/beta/environments/index.js.map +1 -0
  304. package/dist/vendor/resources/beta/environments/work.d.ts +500 -0
  305. package/dist/vendor/resources/beta/environments/work.js +251 -0
  306. package/dist/vendor/resources/beta/environments/work.js.map +1 -0
  307. package/dist/vendor/resources/beta/environments.d.ts +1 -0
  308. package/dist/vendor/resources/beta/environments.js +3 -0
  309. package/dist/vendor/resources/beta/environments.js.map +1 -0
  310. package/dist/vendor/resources/beta/files.d.ts +190 -0
  311. package/dist/vendor/resources/beta/files.js +120 -0
  312. package/dist/vendor/resources/beta/files.js.map +1 -0
  313. package/dist/vendor/resources/beta/index.d.ts +17 -0
  314. package/dist/vendor/resources/beta/index.js +19 -0
  315. package/dist/vendor/resources/beta/index.js.map +1 -0
  316. package/dist/vendor/resources/beta/memory-stores/index.d.ts +3 -0
  317. package/dist/vendor/resources/beta/memory-stores/index.js +5 -0
  318. package/dist/vendor/resources/beta/memory-stores/index.js.map +1 -0
  319. package/dist/vendor/resources/beta/memory-stores/memories.d.ts +346 -0
  320. package/dist/vendor/resources/beta/memory-stores/memories.js +126 -0
  321. package/dist/vendor/resources/beta/memory-stores/memories.js.map +1 -0
  322. package/dist/vendor/resources/beta/memory-stores/memory-stores.d.ts +230 -0
  323. package/dist/vendor/resources/beta/memory-stores/memory-stores.js +137 -0
  324. package/dist/vendor/resources/beta/memory-stores/memory-stores.js.map +1 -0
  325. package/dist/vendor/resources/beta/memory-stores/memory-versions.d.ts +252 -0
  326. package/dist/vendor/resources/beta/memory-stores/memory-versions.js +77 -0
  327. package/dist/vendor/resources/beta/memory-stores/memory-versions.js.map +1 -0
  328. package/dist/vendor/resources/beta/memory-stores.d.ts +1 -0
  329. package/dist/vendor/resources/beta/memory-stores.js +3 -0
  330. package/dist/vendor/resources/beta/memory-stores.js.map +1 -0
  331. package/dist/vendor/resources/beta/messages/batches.d.ts +685 -0
  332. package/dist/vendor/resources/beta/messages/batches.js +203 -0
  333. package/dist/vendor/resources/beta/messages/batches.js.map +1 -0
  334. package/dist/vendor/resources/beta/messages/index.d.ts +3 -0
  335. package/dist/vendor/resources/beta/messages/index.js +5 -0
  336. package/dist/vendor/resources/beta/messages/index.js.map +1 -0
  337. package/dist/vendor/resources/beta/messages/messages.d.ts +5376 -0
  338. package/dist/vendor/resources/beta/messages/messages.js +158 -0
  339. package/dist/vendor/resources/beta/messages/messages.js.map +1 -0
  340. package/dist/vendor/resources/beta/messages.d.ts +1 -0
  341. package/dist/vendor/resources/beta/messages.js +3 -0
  342. package/dist/vendor/resources/beta/messages.js.map +1 -0
  343. package/dist/vendor/resources/beta/models.d.ts +217 -0
  344. package/dist/vendor/resources/beta/models.js +56 -0
  345. package/dist/vendor/resources/beta/models.js.map +1 -0
  346. package/dist/vendor/resources/beta/organization/api-keys.d.ts +176 -0
  347. package/dist/vendor/resources/beta/organization/api-keys.js +52 -0
  348. package/dist/vendor/resources/beta/organization/api-keys.js.map +1 -0
  349. package/dist/vendor/resources/beta/organization/compliance-settings.d.ts +73 -0
  350. package/dist/vendor/resources/beta/organization/compliance-settings.js +48 -0
  351. package/dist/vendor/resources/beta/organization/compliance-settings.js.map +1 -0
  352. package/dist/vendor/resources/beta/organization/external-keys.d.ts +271 -0
  353. package/dist/vendor/resources/beta/organization/external-keys.js +115 -0
  354. package/dist/vendor/resources/beta/organization/external-keys.js.map +1 -0
  355. package/dist/vendor/resources/beta/organization/federation/federation.d.ts +13 -0
  356. package/dist/vendor/resources/beta/organization/federation/federation.js +13 -0
  357. package/dist/vendor/resources/beta/organization/federation/federation.js.map +1 -0
  358. package/dist/vendor/resources/beta/organization/federation/index.d.ts +3 -0
  359. package/dist/vendor/resources/beta/organization/federation/index.js +5 -0
  360. package/dist/vendor/resources/beta/organization/federation/index.js.map +1 -0
  361. package/dist/vendor/resources/beta/organization/federation/issuers.d.ts +352 -0
  362. package/dist/vendor/resources/beta/organization/federation/issuers.js +165 -0
  363. package/dist/vendor/resources/beta/organization/federation/issuers.js.map +1 -0
  364. package/dist/vendor/resources/beta/organization/federation/rules/index.d.ts +2 -0
  365. package/dist/vendor/resources/beta/organization/federation/rules/index.js +4 -0
  366. package/dist/vendor/resources/beta/organization/federation/rules/index.js.map +1 -0
  367. package/dist/vendor/resources/beta/organization/federation/rules/rules.d.ts +467 -0
  368. package/dist/vendor/resources/beta/organization/federation/rules/rules.js +190 -0
  369. package/dist/vendor/resources/beta/organization/federation/rules/rules.js.map +1 -0
  370. package/dist/vendor/resources/beta/organization/federation/rules/workspaces.d.ts +123 -0
  371. package/dist/vendor/resources/beta/organization/federation/rules/workspaces.js +110 -0
  372. package/dist/vendor/resources/beta/organization/federation/rules/workspaces.js.map +1 -0
  373. package/dist/vendor/resources/beta/organization/federation/rules.d.ts +1 -0
  374. package/dist/vendor/resources/beta/organization/federation/rules.js +3 -0
  375. package/dist/vendor/resources/beta/organization/federation/rules.js.map +1 -0
  376. package/dist/vendor/resources/beta/organization/federation.d.ts +1 -0
  377. package/dist/vendor/resources/beta/organization/federation.js +3 -0
  378. package/dist/vendor/resources/beta/organization/federation.js.map +1 -0
  379. package/dist/vendor/resources/beta/organization/index.d.ts +10 -0
  380. package/dist/vendor/resources/beta/organization/index.js +12 -0
  381. package/dist/vendor/resources/beta/organization/index.js.map +1 -0
  382. package/dist/vendor/resources/beta/organization/invites.d.ts +161 -0
  383. package/dist/vendor/resources/beta/organization/invites.js +72 -0
  384. package/dist/vendor/resources/beta/organization/invites.js.map +1 -0
  385. package/dist/vendor/resources/beta/organization/organization.d.ts +72 -0
  386. package/dist/vendor/resources/beta/organization/organization.js +54 -0
  387. package/dist/vendor/resources/beta/organization/organization.js.map +1 -0
  388. package/dist/vendor/resources/beta/organization/rate-limits.d.ts +76 -0
  389. package/dist/vendor/resources/beta/organization/rate-limits.js +27 -0
  390. package/dist/vendor/resources/beta/organization/rate-limits.js.map +1 -0
  391. package/dist/vendor/resources/beta/organization/service-accounts/index.d.ts +2 -0
  392. package/dist/vendor/resources/beta/organization/service-accounts/index.js +4 -0
  393. package/dist/vendor/resources/beta/organization/service-accounts/index.js.map +1 -0
  394. package/dist/vendor/resources/beta/organization/service-accounts/service-accounts.d.ts +257 -0
  395. package/dist/vendor/resources/beta/organization/service-accounts/service-accounts.js +166 -0
  396. package/dist/vendor/resources/beta/organization/service-accounts/service-accounts.js.map +1 -0
  397. package/dist/vendor/resources/beta/organization/service-accounts/workspaces.d.ts +140 -0
  398. package/dist/vendor/resources/beta/organization/service-accounts/workspaces.js +121 -0
  399. package/dist/vendor/resources/beta/organization/service-accounts/workspaces.js.map +1 -0
  400. package/dist/vendor/resources/beta/organization/service-accounts.d.ts +1 -0
  401. package/dist/vendor/resources/beta/organization/service-accounts.js +3 -0
  402. package/dist/vendor/resources/beta/organization/service-accounts.js.map +1 -0
  403. package/dist/vendor/resources/beta/organization/users.d.ts +123 -0
  404. package/dist/vendor/resources/beta/organization/users.js +63 -0
  405. package/dist/vendor/resources/beta/organization/users.js.map +1 -0
  406. package/dist/vendor/resources/beta/organization/workspaces/index.d.ts +4 -0
  407. package/dist/vendor/resources/beta/organization/workspaces/index.js +6 -0
  408. package/dist/vendor/resources/beta/organization/workspaces/index.js.map +1 -0
  409. package/dist/vendor/resources/beta/organization/workspaces/members.d.ts +134 -0
  410. package/dist/vendor/resources/beta/organization/workspaces/members.js +98 -0
  411. package/dist/vendor/resources/beta/organization/workspaces/members.js.map +1 -0
  412. package/dist/vendor/resources/beta/organization/workspaces/rate-limits.d.ts +82 -0
  413. package/dist/vendor/resources/beta/organization/workspaces/rate-limits.js +30 -0
  414. package/dist/vendor/resources/beta/organization/workspaces/rate-limits.js.map +1 -0
  415. package/dist/vendor/resources/beta/organization/workspaces/service-accounts.d.ts +209 -0
  416. package/dist/vendor/resources/beta/organization/workspaces/service-accounts.js +185 -0
  417. package/dist/vendor/resources/beta/organization/workspaces/service-accounts.js.map +1 -0
  418. package/dist/vendor/resources/beta/organization/workspaces/workspaces.d.ts +302 -0
  419. package/dist/vendor/resources/beta/organization/workspaces/workspaces.js +104 -0
  420. package/dist/vendor/resources/beta/organization/workspaces/workspaces.js.map +1 -0
  421. package/dist/vendor/resources/beta/organization/workspaces.d.ts +1 -0
  422. package/dist/vendor/resources/beta/organization/workspaces.js +3 -0
  423. package/dist/vendor/resources/beta/organization/workspaces.js.map +1 -0
  424. package/dist/vendor/resources/beta/organization.d.ts +1 -0
  425. package/dist/vendor/resources/beta/organization.js +3 -0
  426. package/dist/vendor/resources/beta/organization.js.map +1 -0
  427. package/dist/vendor/resources/beta/sessions/events.d.ts +1513 -0
  428. package/dist/vendor/resources/beta/sessions/events.js +115 -0
  429. package/dist/vendor/resources/beta/sessions/events.js.map +1 -0
  430. package/dist/vendor/resources/beta/sessions/index.d.ts +4 -0
  431. package/dist/vendor/resources/beta/sessions/index.js +6 -0
  432. package/dist/vendor/resources/beta/sessions/index.js.map +1 -0
  433. package/dist/vendor/resources/beta/sessions/resources.d.ts +227 -0
  434. package/dist/vendor/resources/beta/sessions/resources.js +128 -0
  435. package/dist/vendor/resources/beta/sessions/resources.js.map +1 -0
  436. package/dist/vendor/resources/beta/sessions/sessions.d.ts +866 -0
  437. package/dist/vendor/resources/beta/sessions/sessions.js +150 -0
  438. package/dist/vendor/resources/beta/sessions/sessions.js.map +1 -0
  439. package/dist/vendor/resources/beta/sessions/threads/events.d.ts +77 -0
  440. package/dist/vendor/resources/beta/sessions/threads/events.js +57 -0
  441. package/dist/vendor/resources/beta/sessions/threads/events.js.map +1 -0
  442. package/dist/vendor/resources/beta/sessions/threads/index.d.ts +2 -0
  443. package/dist/vendor/resources/beta/sessions/threads/index.js +4 -0
  444. package/dist/vendor/resources/beta/sessions/threads/index.js.map +1 -0
  445. package/dist/vendor/resources/beta/sessions/threads/threads.d.ts +195 -0
  446. package/dist/vendor/resources/beta/sessions/threads/threads.js +80 -0
  447. package/dist/vendor/resources/beta/sessions/threads/threads.js.map +1 -0
  448. package/dist/vendor/resources/beta/sessions/threads.d.ts +1 -0
  449. package/dist/vendor/resources/beta/sessions/threads.js +3 -0
  450. package/dist/vendor/resources/beta/sessions/threads.js.map +1 -0
  451. package/dist/vendor/resources/beta/sessions.d.ts +1 -0
  452. package/dist/vendor/resources/beta/sessions.js +3 -0
  453. package/dist/vendor/resources/beta/sessions.js.map +1 -0
  454. package/dist/vendor/resources/beta/skills/index.d.ts +2 -0
  455. package/dist/vendor/resources/beta/skills/index.js +4 -0
  456. package/dist/vendor/resources/beta/skills/index.js.map +1 -0
  457. package/dist/vendor/resources/beta/skills/skills.d.ts +178 -0
  458. package/dist/vendor/resources/beta/skills/skills.js +96 -0
  459. package/dist/vendor/resources/beta/skills/skills.js.map +1 -0
  460. package/dist/vendor/resources/beta/skills/versions.d.ts +181 -0
  461. package/dist/vendor/resources/beta/skills/versions.js +125 -0
  462. package/dist/vendor/resources/beta/skills/versions.js.map +1 -0
  463. package/dist/vendor/resources/beta/skills.d.ts +1 -0
  464. package/dist/vendor/resources/beta/skills.js +3 -0
  465. package/dist/vendor/resources/beta/skills.js.map +1 -0
  466. package/dist/vendor/resources/beta/tunnels/certificates.d.ts +162 -0
  467. package/dist/vendor/resources/beta/tunnels/certificates.js +125 -0
  468. package/dist/vendor/resources/beta/tunnels/certificates.js.map +1 -0
  469. package/dist/vendor/resources/beta/tunnels/index.d.ts +2 -0
  470. package/dist/vendor/resources/beta/tunnels/index.js +4 -0
  471. package/dist/vendor/resources/beta/tunnels/index.js.map +1 -0
  472. package/dist/vendor/resources/beta/tunnels/tunnels.d.ts +211 -0
  473. package/dist/vendor/resources/beta/tunnels/tunnels.js +173 -0
  474. package/dist/vendor/resources/beta/tunnels/tunnels.js.map +1 -0
  475. package/dist/vendor/resources/beta/tunnels.d.ts +1 -0
  476. package/dist/vendor/resources/beta/tunnels.js +3 -0
  477. package/dist/vendor/resources/beta/tunnels.js.map +1 -0
  478. package/dist/vendor/resources/beta/user-profiles.d.ts +244 -0
  479. package/dist/vendor/resources/beta/user-profiles.js +114 -0
  480. package/dist/vendor/resources/beta/user-profiles.js.map +1 -0
  481. package/dist/vendor/resources/beta/vaults/credentials.d.ts +715 -0
  482. package/dist/vendor/resources/beta/vaults/credentials.js +173 -0
  483. package/dist/vendor/resources/beta/vaults/credentials.js.map +1 -0
  484. package/dist/vendor/resources/beta/vaults/index.d.ts +2 -0
  485. package/dist/vendor/resources/beta/vaults/index.js +4 -0
  486. package/dist/vendor/resources/beta/vaults/index.js.map +1 -0
  487. package/dist/vendor/resources/beta/vaults/vaults.d.ts +191 -0
  488. package/dist/vendor/resources/beta/vaults/vaults.js +141 -0
  489. package/dist/vendor/resources/beta/vaults/vaults.js.map +1 -0
  490. package/dist/vendor/resources/beta/vaults.d.ts +1 -0
  491. package/dist/vendor/resources/beta/vaults.js +3 -0
  492. package/dist/vendor/resources/beta/vaults.js.map +1 -0
  493. package/dist/vendor/resources/beta/webhooks.d.ts +464 -0
  494. package/dist/vendor/resources/beta/webhooks.js +29 -0
  495. package/dist/vendor/resources/beta/webhooks.js.map +1 -0
  496. package/dist/vendor/resources/beta.d.ts +1 -0
  497. package/dist/vendor/resources/beta.js +3 -0
  498. package/dist/vendor/resources/beta.js.map +1 -0
  499. package/dist/vendor/resources/completions.d.ts +172 -0
  500. package/dist/vendor/resources/completions.js +19 -0
  501. package/dist/vendor/resources/completions.js.map +1 -0
  502. package/dist/vendor/resources/files.d.ts +104 -0
  503. package/dist/vendor/resources/files.js +48 -0
  504. package/dist/vendor/resources/files.js.map +1 -0
  505. package/dist/vendor/resources/index.d.ts +7 -0
  506. package/dist/vendor/resources/index.js +9 -0
  507. package/dist/vendor/resources/index.js.map +1 -0
  508. package/dist/vendor/resources/messages/batches.d.ts +312 -0
  509. package/dist/vendor/resources/messages/batches.js +157 -0
  510. package/dist/vendor/resources/messages/batches.js.map +1 -0
  511. package/dist/vendor/resources/messages/index.d.ts +2 -0
  512. package/dist/vendor/resources/messages/index.js +4 -0
  513. package/dist/vendor/resources/messages/index.js.map +1 -0
  514. package/dist/vendor/resources/messages/messages.d.ts +3886 -0
  515. package/dist/vendor/resources/messages/messages.js +130 -0
  516. package/dist/vendor/resources/messages/messages.js.map +1 -0
  517. package/dist/vendor/resources/messages.d.ts +1 -0
  518. package/dist/vendor/resources/messages.js +3 -0
  519. package/dist/vendor/resources/messages.js.map +1 -0
  520. package/dist/vendor/resources/models.d.ts +196 -0
  521. package/dist/vendor/resources/models.js +41 -0
  522. package/dist/vendor/resources/models.js.map +1 -0
  523. package/dist/vendor/resources/shared.d.ts +43 -0
  524. package/dist/vendor/resources/shared.js +3 -0
  525. package/dist/vendor/resources/shared.js.map +1 -0
  526. package/dist/vendor/resources/skills/index.d.ts +2 -0
  527. package/dist/vendor/resources/skills/index.js +4 -0
  528. package/dist/vendor/resources/skills/index.js.map +1 -0
  529. package/dist/vendor/resources/skills/skills.d.ts +128 -0
  530. package/dist/vendor/resources/skills/skills.js +36 -0
  531. package/dist/vendor/resources/skills/skills.js.map +1 -0
  532. package/dist/vendor/resources/skills/versions.d.ts +103 -0
  533. package/dist/vendor/resources/skills/versions.js +37 -0
  534. package/dist/vendor/resources/skills/versions.js.map +1 -0
  535. package/dist/vendor/resources/skills.d.ts +1 -0
  536. package/dist/vendor/resources/skills.js +3 -0
  537. package/dist/vendor/resources/skills.js.map +1 -0
  538. package/dist/vendor/resources/top-level.d.ts +1 -0
  539. package/dist/vendor/resources/top-level.js +3 -0
  540. package/dist/vendor/resources/top-level.js.map +1 -0
  541. package/dist/vendor/resources.d.ts +1 -0
  542. package/dist/vendor/resources.js +2 -0
  543. package/dist/vendor/resources.js.map +1 -0
  544. package/dist/vendor/streaming.d.ts +2 -0
  545. package/dist/vendor/streaming.js +3 -0
  546. package/dist/vendor/streaming.js.map +1 -0
  547. package/dist/vendor/tools/agent-toolset/fs-util.d.ts +74 -0
  548. package/dist/vendor/tools/agent-toolset/fs-util.js +184 -0
  549. package/dist/vendor/tools/agent-toolset/fs-util.js.map +1 -0
  550. package/dist/vendor/tools/agent-toolset/memories.d.ts +172 -0
  551. package/dist/vendor/tools/agent-toolset/memories.js +910 -0
  552. package/dist/vendor/tools/agent-toolset/memories.js.map +1 -0
  553. package/dist/vendor/tools/agent-toolset/node.browser.d.ts +80 -0
  554. package/dist/vendor/tools/agent-toolset/node.browser.js +129 -0
  555. package/dist/vendor/tools/agent-toolset/node.browser.js.map +1 -0
  556. package/dist/vendor/tools/agent-toolset/node.d.ts +191 -0
  557. package/dist/vendor/tools/agent-toolset/node.js +886 -0
  558. package/dist/vendor/tools/agent-toolset/node.js.map +1 -0
  559. package/dist/vendor/tools/agent-toolset/skills.d.ts +73 -0
  560. package/dist/vendor/tools/agent-toolset/skills.js +320 -0
  561. package/dist/vendor/tools/agent-toolset/skills.js.map +1 -0
  562. package/dist/vendor/tools/agent-toolset/sync-interval.d.ts +18 -0
  563. package/dist/vendor/tools/agent-toolset/sync-interval.js +25 -0
  564. package/dist/vendor/tools/agent-toolset/sync-interval.js.map +1 -0
  565. package/dist/vendor/tools/memory/node.browser.d.ts +26 -0
  566. package/dist/vendor/tools/memory/node.browser.js +44 -0
  567. package/dist/vendor/tools/memory/node.browser.js.map +1 -0
  568. package/dist/vendor/tools/memory/node.d.ts +17 -0
  569. package/dist/vendor/tools/memory/node.js +327 -0
  570. package/dist/vendor/tools/memory/node.js.map +1 -0
  571. package/dist/vendor/uploads.d.ts +2 -0
  572. package/dist/vendor/uploads.js +3 -0
  573. package/dist/vendor/uploads.js.map +1 -0
  574. package/dist/vendor/version.d.ts +1 -0
  575. package/dist/vendor/version.js +2 -0
  576. package/dist/vendor/version.js.map +1 -0
  577. package/package.json +7 -14
  578. package/sdk.cjs +2 -2
  579. package/sdk.cjs.map +2 -2
  580. package/sdk.d.ts +1 -1
  581. package/sdk.mjs +2 -2
  582. package/sdk.mjs.map +3 -3
@@ -0,0 +1,737 @@
1
+ import { PukuError } from '../../core/error.js';
2
+ import { loggerFor } from '../../internal/utils/log.js';
3
+ import { sleep } from '../../internal/utils/sleep.js';
4
+ import { applyJitter, backoff, isFatal4xx } from '../../internal/utils/backoff.js';
5
+ import { linkAbort } from '../../internal/utils/abort.js';
6
+ import { AsyncQueue } from '../../internal/utils/async-queue.js';
7
+ import { buildHeaders } from '../../internal/headers.js';
8
+ import { helperHeader } from '../../internal/stainless-helper-header.js';
9
+ import { runRunnableTool, toolName } from './BetaRunnableTool.js';
10
+ /** Beta header for the managed-agents API. */
11
+ export const MANAGED_AGENTS_BETA = 'managed-agents-2026-04-01';
12
+ const STREAM_BACKOFF_START_MS = 500;
13
+ const STREAM_BACKOFF_CAP_MS = 10_000;
14
+ const TOOL_TIMEOUT_MS = 120_000;
15
+ const DRAIN_TIMEOUT_MS = 30_000;
16
+ const SEND_BACKOFF_START_MS = 1_000;
17
+ const SEND_BACKOFF_CAP_MS = 30_000;
18
+ /**
19
+ * How long a transiently failing tool-result send keeps retrying when the
20
+ * runner is used on its own: the server's default work-item lease TTL.
21
+ * `EnvironmentWorker` overrides it with the live TTL from each lease heartbeat
22
+ * (`_setSendRetryWindow`), so a send is only abandoned once the lease can no
23
+ * longer be ours.
24
+ */
25
+ const SEND_RETRY_WINDOW_MS = 5 * 60_000;
26
+ /** Default {@link SessionToolRunnerOptions.maxIdleMs}: 60 seconds. */
27
+ export const DEFAULT_MAX_IDLE_MS = 60_000;
28
+ /** Returns true if `ev` is a `session.status_idle` with `stop_reason` `end_turn`. */
29
+ function isEndTurnIdle(ev) {
30
+ return ev.type === 'session.status_idle' && ev.stop_reason?.type === 'end_turn';
31
+ }
32
+ /**
33
+ * The `maxIdleMs` stop-countdown, including its deferral. {@link noteEvent}
34
+ * arms on `session.status_idle` with `stop_reason: end_turn` and disarms on
35
+ * anything else. Gated tool work registered via {@link block} — a call held for
36
+ * user confirmation, or a user-approved call still dispatching — keeps
37
+ * {@link arm} pending until {@link unblock} retires the last blocker, at which
38
+ * point the countdown starts. Event-driven — there is no polling watchdog.
39
+ */
40
+ class IdleClock {
41
+ #maxIdleMs;
42
+ #onExpire;
43
+ #blockers = new Set();
44
+ // Set when arm() found blockers outstanding; the unblock that retires the
45
+ // last blocker applies it. Cleared by any disarm.
46
+ #armPending = false;
47
+ #timer;
48
+ constructor(maxIdleMs, onExpire) {
49
+ this.#maxIdleMs = maxIdleMs;
50
+ this.#onExpire = onExpire;
51
+ }
52
+ /**
53
+ * Arm on `status_idle{end_turn}`; disarm otherwise. `user.tool_confirmation`
54
+ * is neutral: it signals neither agent activity nor an idle, and its effect
55
+ * on the clock flows through {@link block} / {@link unblock} instead —
56
+ * disarming here would discard the pending arm the verdict is about to
57
+ * settle.
58
+ */
59
+ noteEvent(ev) {
60
+ if (ev.type === 'user.tool_confirmation')
61
+ return;
62
+ if (isEndTurnIdle(ev))
63
+ this.arm();
64
+ else
65
+ this.disarm();
66
+ }
67
+ /** Register gated work that must resolve before an idle countdown starts. */
68
+ block(toolUseId) {
69
+ this.#blockers.add(toolUseId);
70
+ if (this.#timer !== undefined) {
71
+ // Defensive: every caller disarms first (any event that routes a tool
72
+ // call is itself a disarming event), but a countdown running when gated
73
+ // work appears is stale evidence — the session is not idly waiting to
74
+ // stop. Convert it into a pending arm rather than let it fire over the
75
+ // gated call.
76
+ this.#armPending = true;
77
+ clearTimeout(this.#timer);
78
+ this.#timer = undefined;
79
+ }
80
+ }
81
+ /**
82
+ * Retire gated work (a no-op for ids never blocked); applies a pending arm —
83
+ * with a fresh full `maxIdleMs` window — once the last blocker retires.
84
+ */
85
+ unblock(toolUseId) {
86
+ this.#blockers.delete(toolUseId);
87
+ if (this.#blockers.size === 0 && this.#armPending)
88
+ this.arm();
89
+ }
90
+ /**
91
+ * (Re)start the idle countdown — or, while blockers are outstanding, hold
92
+ * the arm pending instead. Stopping then would drop a held call when its
93
+ * verdict later arrives, or cut the runner off before a released call's
94
+ * result can drive the next turn.
95
+ */
96
+ arm() {
97
+ if (this.#maxIdleMs <= 0)
98
+ return;
99
+ if (this.#blockers.size > 0) {
100
+ this.#armPending = true;
101
+ return;
102
+ }
103
+ this.#armPending = false;
104
+ if (this.#timer !== undefined)
105
+ clearTimeout(this.#timer);
106
+ this.#timer = setTimeout(this.#onExpire, this.#maxIdleMs);
107
+ }
108
+ /**
109
+ * Cancel the idle countdown and any pending arm. Blockers persist — they
110
+ * track real outstanding work, retired only by {@link unblock}.
111
+ */
112
+ disarm() {
113
+ this.#armPending = false;
114
+ if (this.#timer !== undefined) {
115
+ clearTimeout(this.#timer);
116
+ this.#timer = undefined;
117
+ }
118
+ }
119
+ }
120
+ /**
121
+ * The sessions-side counterpart to `client.beta.messages.toolRunner`: an
122
+ * async-iterable that attaches to a managed-agents session, executes every
123
+ * incoming `agent.tool_use` and `agent.custom_tool_use` event against a local
124
+ * tool registry, posts the matching result back (`user.tool_result` for the
125
+ * former, `user.custom_tool_result` for the latter), and yields one
126
+ * {@link DispatchedToolCall} per completed call. Server-side `agent.mcp_tool_use`
127
+ * calls are not dispatched. Internally drives event-stream reconnect and result
128
+ * posting.
129
+ *
130
+ * A call the server gated with `evaluated_permission: "ask"` (the `always_ask`
131
+ * policy — or any value this SDK doesn't recognize, which fails closed) is held
132
+ * until its `user.tool_confirmation` arrives: only an explicit `allow` runs it;
133
+ * `deny` — or any verdict this SDK doesn't recognize, failing closed — is never
134
+ * executed and posts nothing (the denial resolves the call server-side), but is
135
+ * still yielded (`confirmation="deny"`, `posted=false`, `result=undefined`) so
136
+ * the consumer can observe it. A held call — and a user-approved one still
137
+ * dispatching — defers the `maxIdleMs` countdown, so an `end_turn` idle
138
+ * observed in the meantime cannot stop the runner: it waits until the verdict
139
+ * arrives, the session terminates, or the abort signal fires — pass
140
+ * `AbortSignal.timeout(...)` for a wall-clock bound.
141
+ *
142
+ * Iteration ends when the session terminates (`session.status_terminated` /
143
+ * `session.deleted`), when the consumer `break`s out of the loop or aborts the
144
+ * supplied signal, or — once the session has gone idle with
145
+ * `stop_reason.type === "end_turn"` — when `maxIdleMs` elapses with no new
146
+ * event (any new event resets that countdown; it re-arms on the next `end_turn`
147
+ * idle; `maxIdleMs <= 0` disables it). The `finally` branch drains any in-flight
148
+ * tool calls and runs each tool's `close()` cleanup hook. It does *not* touch
149
+ * the work-item lease — wrap it in an `EnvironmentWorker` if you need
150
+ * heartbeating / force-stop.
151
+ *
152
+ * @example
153
+ * ```ts
154
+ * import { betaAgentToolset20260401 } from '@puku-ai/sdk/tools/agent-toolset/node';
155
+ *
156
+ * for await (const call of client.beta.sessions.events.toolRunner(work.data.id, {
157
+ * tools: [...betaAgentToolset20260401({ workdir }), myTool],
158
+ * })) {
159
+ * console.log(`${call.name} -> ${call.isError ? 'error' : 'ok'}`);
160
+ * }
161
+ * ```
162
+ */
163
+ export class SessionToolRunner {
164
+ client;
165
+ sessionId;
166
+ tools;
167
+ maxIdleMs;
168
+ #consumed = false;
169
+ #controller;
170
+ #detachExternal;
171
+ #requestOpts;
172
+ #toolByName;
173
+ #logger;
174
+ #seen = new Set();
175
+ #answered = new Set();
176
+ // Confirmation gating (`always_ask` tools): `#confirmationVerdicts` records
177
+ // every `user.tool_confirmation` verdict by `tool_use_id`;
178
+ // `#awaitingConfirmation` holds the tool-call events whose
179
+ // `evaluated_permission` is `ask` and whose verdict has not arrived —
180
+ // released (or resolved as denied) by `#noteConfirmation` / the next
181
+ // reconcile pass. Like `#seen` and `#answered`, `#confirmationVerdicts` is
182
+ // per-session O(tool calls): recorded verdicts persist for the life of the run.
183
+ #confirmationVerdicts = new Map();
184
+ #awaitingConfirmation = new Map();
185
+ #results = new AsyncQueue();
186
+ #inFlightCount = 0;
187
+ #sendRetryWindowMs = SEND_RETRY_WINDOW_MS;
188
+ #onIdle = null;
189
+ #idleClock;
190
+ constructor(sessionId, opts) {
191
+ this.client = opts.client;
192
+ this.sessionId = sessionId;
193
+ this.tools = opts.tools;
194
+ this.maxIdleMs = opts.maxIdleMs ?? DEFAULT_MAX_IDLE_MS;
195
+ this.#logger = loggerFor(opts.client);
196
+ this.#toolByName = new Map(opts.tools.map((t) => [toolName(t), t]));
197
+ this.#controller = new AbortController();
198
+ this.#detachExternal = linkAbort(opts.signal, this.#controller);
199
+ this.#requestOpts = opts.requestOptions;
200
+ this.#idleClock = new IdleClock(this.maxIdleMs, () => {
201
+ this.#logger.info('session idle after end_turn; stopping', {
202
+ component: 'session-tool-runner',
203
+ session_id: this.sessionId,
204
+ max_idle_ms: this.maxIdleMs,
205
+ });
206
+ this.#controller.abort();
207
+ });
208
+ }
209
+ /** Read-only view of this runner's abort signal. */
210
+ get signal() {
211
+ return this.#controller.signal;
212
+ }
213
+ /** Abort the runner. Background tasks will wind down and `for await` will exit cleanly. */
214
+ abort() {
215
+ this.#controller.abort();
216
+ }
217
+ /**
218
+ * @internal
219
+ * `EnvironmentWorker` keeps this equal to the lease TTL each heartbeat
220
+ * reports; applies to a send already retrying.
221
+ */
222
+ _setSendRetryWindow(ms) {
223
+ this.#sendRetryWindowMs = ms;
224
+ }
225
+ async *[Symbol.asyncIterator]() {
226
+ if (this.#consumed) {
227
+ throw new PukuError('Cannot iterate over a consumed SessionToolRunner');
228
+ }
229
+ this.#consumed = true;
230
+ this.#logger.info('session tool runner starting', {
231
+ component: 'session-tool-runner',
232
+ session_id: this.sessionId,
233
+ });
234
+ // The one background promise: drives the event stream and dispatches tools.
235
+ // Its `.catch` aborts the controller so the main loop unwinds.
236
+ const streamPromise = this.#streamLoop().catch((e) => {
237
+ if (!this.#controller.signal.aborted) {
238
+ this.#logger.error('stream loop failed', { error: String(e) });
239
+ }
240
+ this.#controller.abort();
241
+ });
242
+ try {
243
+ // Phase 1: yield results as they arrive. `next(signal)` resolves
244
+ // `done: true` when the controller aborts — cancellation is handled in
245
+ // the queue read, no outer `Promise.race` needed.
246
+ while (true) {
247
+ const next = await this.#results.next(this.#controller.signal);
248
+ if (next.done)
249
+ break;
250
+ yield next.value;
251
+ }
252
+ // Phase 2: let the stream loop settle (and push any final results), then
253
+ // drain whatever is still queued before closing.
254
+ await streamPromise;
255
+ let pending;
256
+ while ((pending = this.#results.tryShift()) !== undefined) {
257
+ yield pending;
258
+ }
259
+ }
260
+ finally {
261
+ this.#controller.abort();
262
+ this.#idleClock.disarm();
263
+ // Re-await defensively in case the consumer broke out of phase 1 before
264
+ // phase 2 ran — a no-op if it already settled.
265
+ await streamPromise;
266
+ try {
267
+ await this.#drain();
268
+ }
269
+ catch (e) {
270
+ this.#logger.warn('drain failed', { error: String(e) });
271
+ }
272
+ this.#results.close();
273
+ for (const t of this.tools) {
274
+ try {
275
+ // `close` is typed `() => Promisable<void>`, so a single `await`
276
+ // covers both the sync and async return.
277
+ await t.close?.();
278
+ }
279
+ catch (e) {
280
+ this.#logger.warn('tool.close failed', { tool: toolName(t), error: String(e) });
281
+ }
282
+ }
283
+ // Detach from the external signal so the consumer can drop their signal
284
+ // reference without leaking this iterator instance.
285
+ this.#detachExternal();
286
+ }
287
+ }
288
+ // ===== request options =====
289
+ /**
290
+ * Request options for every helper-issued call: the caller's `requestOptions`
291
+ * (custom proxy headers etc.) with the helper telemetry header stamped on and
292
+ * the runner's own abort signal forced last so it always owns cancellation.
293
+ */
294
+ #requestOptions() {
295
+ return {
296
+ ...this.#requestOpts,
297
+ headers: buildHeaders([helperHeader('session-tool-runner'), this.#requestOpts?.headers]),
298
+ signal: this.#controller.signal,
299
+ };
300
+ }
301
+ // ===== event stream =====
302
+ async #streamLoop() {
303
+ const ctrl = this.#controller;
304
+ let backoff = STREAM_BACKOFF_START_MS;
305
+ while (!ctrl.signal.aborted) {
306
+ try {
307
+ // Establish the event stream *before* reconciling history, so an event
308
+ // emitted in the gap between listing and attaching is buffered on the
309
+ // stream rather than lost. `seen`/`answered` dedup any event that shows
310
+ // up both in the reconcile pass and on the live stream.
311
+ const stream = await this.client.beta.sessions.events.stream(this.sessionId, {}, this.#requestOptions());
312
+ await this.#reconcile();
313
+ for await (const ev of stream) {
314
+ backoff = STREAM_BACKOFF_START_MS;
315
+ if (await this.#handleStreamEvent(ev))
316
+ return;
317
+ }
318
+ }
319
+ catch (e) {
320
+ // An abort throws to unwind the caller (the iterator's `streamPromise`
321
+ // `.catch`) rather than returning early and letting it carry on.
322
+ ctrl.signal.throwIfAborted();
323
+ if (isFatal4xx(e)) {
324
+ this.#logger.error('permanent stream failure, shutting down', { error: String(e) });
325
+ ctrl.abort();
326
+ throw e;
327
+ }
328
+ this.#logger.warn('stream disconnected, reconnecting', {
329
+ error: String(e),
330
+ backoff_ms: backoff,
331
+ });
332
+ }
333
+ ctrl.signal.throwIfAborted();
334
+ await sleep(backoff, ctrl.signal);
335
+ backoff = Math.min(backoff * 2, STREAM_BACKOFF_CAP_MS);
336
+ }
337
+ }
338
+ /**
339
+ * Read full history before dispatching so a `tool_use` whose result appears
340
+ * later in the same history is not re-executed. Runs after the live stream is
341
+ * already attached (see {@link SessionToolRunner.#streamLoop}).
342
+ */
343
+ async #reconcile() {
344
+ const ctrl = this.#controller;
345
+ const pending = [];
346
+ let lastWasEndTurn = false;
347
+ try {
348
+ for await (const ev of this.client.beta.sessions.events.list(this.sessionId, { limit: 1000 }, this.#requestOptions())) {
349
+ this.#ingestHistory(ev, pending);
350
+ lastWasEndTurn = isEndTurnIdle(ev);
351
+ }
352
+ }
353
+ catch (e) {
354
+ // An abort throws to unwind the caller; a real list failure is
355
+ // non-fatal — undo the speculative `seen` entries and let `#streamLoop`
356
+ // carry on with the live stream.
357
+ ctrl.signal.throwIfAborted();
358
+ this.#logger.warn('reconcile list failed', { error: String(e) });
359
+ // If list itself failed, undo the speculative `seen` entries so the next
360
+ // reconcile pass (or the live stream) can pick them up. Leave the idle
361
+ // timer untouched — the history we read may be incomplete.
362
+ for (const ev of pending)
363
+ this.#seen.delete(ev.id);
364
+ return;
365
+ }
366
+ const unanswered = pending.filter((ev) => !this.#answered.has(ev.id));
367
+ // Disarm before routing: `#execute` runs inline here, so a timer left armed
368
+ // from before the reconnect could fire over an in-flight tool.
369
+ this.#idleClock.disarm();
370
+ for (const ev of unanswered)
371
+ await this.#routeToolEvent(ev);
372
+ // A held call's verdict is normally applied by the routing pass above; if
373
+ // its tool_use fell outside the listed window the pass never saw it, so
374
+ // apply the verdict to the held copy here.
375
+ for (const held of [...this.#awaitingConfirmation.values()]) {
376
+ const verdict = this.#confirmationVerdicts.get(held.id);
377
+ if (verdict !== undefined)
378
+ await this.#applyVerdict(held, verdict);
379
+ }
380
+ // Routing resolves denied calls in place (marking them answered) and holds
381
+ // ask-gated calls for their `user.tool_confirmation`. If the most recent
382
+ // event in history is an `end_turn` idle and no tool work is outstanding,
383
+ // the session is done — arm the idle clock so the runner stops even if that
384
+ // `end_turn` arrived during a disconnect. A held call is not outstanding
385
+ // here: it blocks the clock, so this arm stays pending until the verdict
386
+ // (and, for an allow, the dispatch it releases) resolves it.
387
+ const outstanding = unanswered.filter((ev) => !this.#answered.has(ev.id) && !this.#awaitingConfirmation.has(ev.id));
388
+ if (lastWasEndTurn && outstanding.length === 0)
389
+ this.#idleClock.arm();
390
+ else
391
+ this.#idleClock.disarm();
392
+ }
393
+ #ingestHistory(ev, pending) {
394
+ if (ev.type === 'agent.tool_use' || ev.type === 'agent.custom_tool_use') {
395
+ // Mark the event seen so a replay on the live stream is not dispatched
396
+ // twice, but decide whether it still needs executing from `answered`, not
397
+ // `seen`: a call whose result post failed is seen-but-unanswered, and must
398
+ // be retried on the next reconcile pass rather than silently dropped.
399
+ this.#seen.add(ev.id);
400
+ if (!this.#answered.has(ev.id))
401
+ pending.push(ev);
402
+ }
403
+ else if (ev.type === 'user.tool_result') {
404
+ this.#answered.add(ev.tool_use_id);
405
+ }
406
+ else if (ev.type === 'user.custom_tool_result') {
407
+ this.#answered.add(ev.custom_tool_use_id);
408
+ }
409
+ else if (ev.type === 'user.tool_confirmation') {
410
+ // Record the verdict only, before the pending pass, so a call whose
411
+ // confirmation appears later in the same history routes with its verdict
412
+ // already known. Releasing a held call here as well would dispatch it a
413
+ // second time when the routing pass reaches its tool_use event.
414
+ if (!this.#answered.has(ev.tool_use_id))
415
+ this.#confirmationVerdicts.set(ev.tool_use_id, ev.result);
416
+ }
417
+ }
418
+ /** Returns true when the runner should exit. */
419
+ async #handleStreamEvent(ev) {
420
+ this.#idleClock.noteEvent(ev);
421
+ switch (ev.type) {
422
+ case 'agent.tool_use':
423
+ case 'agent.custom_tool_use':
424
+ if (!this.#seen.has(ev.id)) {
425
+ this.#seen.add(ev.id);
426
+ await this.#routeToolEvent(ev);
427
+ }
428
+ return false;
429
+ case 'user.tool_confirmation':
430
+ await this.#noteConfirmation(ev);
431
+ return false;
432
+ case 'user.tool_result':
433
+ this.#answered.add(ev.tool_use_id);
434
+ return false;
435
+ case 'user.custom_tool_result':
436
+ this.#answered.add(ev.custom_tool_use_id);
437
+ return false;
438
+ case 'session.status_terminated':
439
+ case 'session.deleted':
440
+ this.#logger.info('session terminated', {
441
+ component: 'session-tool-runner',
442
+ session_id: this.sessionId,
443
+ });
444
+ this.#controller.abort();
445
+ return true;
446
+ default:
447
+ return false;
448
+ }
449
+ }
450
+ // ===== confirmation gating (always_ask tools) =====
451
+ /**
452
+ * Dispatch `ev`, honoring its evaluated permission. A call the server gated
453
+ * (`evaluated_permission == "ask"`) is held until its `user.tool_confirmation`
454
+ * arrives. Fails closed: only an explicit `allow` verdict releases a gated
455
+ * call; a server-side `deny` overrides any recorded verdict; an unrecognized
456
+ * permission is held like `ask` and an unrecognized verdict is denied.
457
+ */
458
+ async #routeToolEvent(ev) {
459
+ // `getattr`-style read: today only `agent.tool_use` carries
460
+ // `evaluated_permission`, but if it ever lands on `agent.custom_tool_use`
461
+ // the gate must keep failing closed rather than dispatch by event type.
462
+ const permission = ev.evaluated_permission;
463
+ // A server-side `deny` overrides any (stray) recorded verdict.
464
+ const verdict = permission === 'deny' ? 'deny' : this.#confirmationVerdicts.get(ev.id);
465
+ if (verdict === undefined) {
466
+ if (permission === undefined || permission === 'allow') {
467
+ await this.#execute(ev, undefined);
468
+ }
469
+ else if (!this.#awaitingConfirmation.has(ev.id)) {
470
+ // "ask" — or a permission this SDK does not recognize, which must not
471
+ // dispatch unconfirmed — waits for the user's verdict. (Already-held: a
472
+ // reconcile after reconnect re-routes the call; keep the existing hold.)
473
+ this.#logger.info('tool call awaiting confirmation; holding', {
474
+ component: 'session-tool-runner',
475
+ session_id: this.sessionId,
476
+ tool: ev.name,
477
+ tool_use_id: ev.id,
478
+ });
479
+ this.#awaitingConfirmation.set(ev.id, ev);
480
+ this.#idleClock.block(ev.id);
481
+ }
482
+ return;
483
+ }
484
+ await this.#applyVerdict(ev, verdict);
485
+ }
486
+ /** Record an allow/deny verdict and release the held call it gates, if any. */
487
+ async #noteConfirmation(ev) {
488
+ this.#confirmationVerdicts.set(ev.tool_use_id, ev.result);
489
+ const held = this.#awaitingConfirmation.get(ev.tool_use_id);
490
+ // Nothing held: the verdict gates a call this runner has not seen yet (or
491
+ // one it never gates, e.g. an `agent.mcp_tool_use`). Keeping it in
492
+ // `#confirmationVerdicts` lets a later route of that call resolve instantly.
493
+ if (held === undefined)
494
+ return;
495
+ await this.#applyVerdict(held, ev.result);
496
+ }
497
+ /**
498
+ * Dispatch or resolve a gated call according to its verdict.
499
+ *
500
+ * The idle-clock blocker accounting lives here: a denial retires the held
501
+ * call's blocker, while an allow keeps one on the call — taking it now if the
502
+ * verdict was already known when the call was routed, so it was never held —
503
+ * until `#execute` has finished with it. The countdown must not run over
504
+ * gated work that is still in flight.
505
+ */
506
+ async #applyVerdict(ev, verdict) {
507
+ const wasHeld = this.#awaitingConfirmation.delete(ev.id);
508
+ if (verdict === 'allow') {
509
+ this.#logger.info('tool call confirmed', {
510
+ component: 'session-tool-runner',
511
+ session_id: this.sessionId,
512
+ tool: ev.name,
513
+ tool_use_id: ev.id,
514
+ });
515
+ if (!wasHeld)
516
+ this.#idleClock.block(ev.id);
517
+ try {
518
+ await this.#execute(ev, 'allow');
519
+ }
520
+ finally {
521
+ // The approved call is fully disposed of (executed, or moot because it
522
+ // was answered elsewhere) — the sole place an allow's blocker retires.
523
+ this.#idleClock.unblock(ev.id);
524
+ }
525
+ return;
526
+ }
527
+ // "deny" — or any value other than an explicit "allow" (fail closed). The
528
+ // denial resolves the call server-side, so mark it answered and yield it
529
+ // (nothing ran, nothing posted).
530
+ if (wasHeld)
531
+ this.#idleClock.unblock(ev.id);
532
+ this.#answered.add(ev.id);
533
+ this.#logger.info('tool call denied; not executing', {
534
+ component: 'session-tool-runner',
535
+ session_id: this.sessionId,
536
+ tool: ev.name,
537
+ tool_use_id: ev.id,
538
+ });
539
+ this.#surfaceCall({
540
+ event: ev,
541
+ toolUseId: ev.id,
542
+ name: ev.name,
543
+ isError: false,
544
+ posted: false,
545
+ confirmation: 'deny',
546
+ });
547
+ }
548
+ /**
549
+ * Yield `call` to the consumer. A closed queue — the consumer broke out of
550
+ * the iterator — makes `push` a no-op returning false; the underlying work
551
+ * already happened, so only the observability event is lost.
552
+ */
553
+ #surfaceCall(call) {
554
+ this.#results.push(call);
555
+ }
556
+ // ===== tool execution =====
557
+ async #execute(ev, confirmation) {
558
+ if (this.#answered.has(ev.id))
559
+ return;
560
+ this.#logger.info('executing tool', {
561
+ component: 'session-tool-runner',
562
+ session_id: this.sessionId,
563
+ tool: ev.name,
564
+ tool_use_id: ev.id,
565
+ });
566
+ this.#inFlightCount++;
567
+ try {
568
+ const tool = this.#toolByName.get(ev.name);
569
+ if (!tool) {
570
+ // Skip (split-client partial fulfilment): a name this runner
571
+ // is not registered for belongs to the other client servicing this
572
+ // session (typically the customer's app backend handling custom tools).
573
+ // Post NO result, do not mark it answered, and leave the tool_use_id
574
+ // pending for its owner — claiming it would corrupt the conversation.
575
+ // Still yield the call so the consumer can observe the unowned
576
+ // dispatch; nothing was sent, so `posted`/`isError` stay false and no
577
+ // `result` event is populated. The id stays unanswered, so reconcile
578
+ // keeps it out of the idle/end-turn accounting and re-surfaces it after
579
+ // a reconnect until its owner answers it.
580
+ this.#logger.info('tool not owned by this runner; leaving the tool_use_id pending for its owner', {
581
+ component: 'session-tool-runner',
582
+ session_id: this.sessionId,
583
+ tool: ev.name,
584
+ tool_use_id: ev.id,
585
+ });
586
+ this.#surfaceCall({
587
+ event: ev,
588
+ toolUseId: ev.id,
589
+ name: ev.name,
590
+ isError: false,
591
+ posted: false,
592
+ confirmation,
593
+ });
594
+ return;
595
+ }
596
+ let content;
597
+ let isError;
598
+ // Per-tool controller: aborts on the runner's own signal *or* the
599
+ // per-tool timeout, so an in-flight tool stops promptly when the runner
600
+ // is aborted instead of running until the timeout.
601
+ const toolCtrl = new AbortController();
602
+ const detachTool = linkAbort(this.#controller.signal, toolCtrl);
603
+ const timer = setTimeout(() => toolCtrl.abort(), TOOL_TIMEOUT_MS);
604
+ try {
605
+ // Pass the source `agent.tool_use` / `agent.custom_tool_use` event
606
+ // straight through as the run context's `toolUse` — it is a union
607
+ // member of `BetaToolUse`, no Messages-block adapter needed.
608
+ const outcome = await runRunnableTool(tool, ev.input, {
609
+ toolUse: ev,
610
+ toolUseBlock: ev,
611
+ signal: toolCtrl.signal,
612
+ });
613
+ content = outcome.content;
614
+ isError = outcome.isError;
615
+ }
616
+ finally {
617
+ clearTimeout(timer);
618
+ detachTool();
619
+ }
620
+ // Answer with the result event that matches the call kind: a
621
+ // `user.tool_result` for an `agent.tool_use`, a `user.custom_tool_result`
622
+ // for an `agent.custom_tool_use`. Posting the wrong one leaves the call
623
+ // unanswered and the session stuck.
624
+ const result = buildResultEvent(ev, isError, toSessionContent(content));
625
+ const posted = await this.#sendResult(result, ev.id);
626
+ this.#surfaceCall({
627
+ event: ev,
628
+ result,
629
+ toolUseId: ev.id,
630
+ name: ev.name,
631
+ isError,
632
+ posted,
633
+ confirmation,
634
+ });
635
+ }
636
+ finally {
637
+ this.#inFlightCount--;
638
+ if (this.#inFlightCount === 0)
639
+ this.#onIdle?.();
640
+ }
641
+ }
642
+ async #sendResult(result, toolUseId) {
643
+ const ctrl = this.#controller;
644
+ const start = Date.now();
645
+ let lastErr;
646
+ let attempt = 0;
647
+ while (true) {
648
+ attempt++;
649
+ // An abort throws to unwind the caller rather than returning a
650
+ // `posted: false` result the iterator would carry on past.
651
+ ctrl.signal.throwIfAborted();
652
+ try {
653
+ await this.client.beta.sessions.events.send(this.sessionId, { events: [result] }, this.#requestOptions());
654
+ this.#answered.add(toolUseId);
655
+ return true;
656
+ }
657
+ catch (e) {
658
+ lastErr = e;
659
+ // Only short-circuit on a permanent 4xx; 408/409/429 deserve the
660
+ // remaining retries (aligned with the core client's retry policy).
661
+ if (isFatal4xx(e))
662
+ break;
663
+ const remainingMs = this.#sendRetryWindowMs - (Date.now() - start);
664
+ if (remainingMs <= 0)
665
+ break;
666
+ const waitMs = Math.min(applyJitter(backoff(attempt - 1, SEND_BACKOFF_START_MS, SEND_BACKOFF_CAP_MS)), remainingMs);
667
+ this.#logger.warn('tool result send failed; retrying', {
668
+ tool_use_id: toolUseId,
669
+ attempt,
670
+ backoff_ms: waitMs,
671
+ error: String(e),
672
+ });
673
+ await sleep(waitMs, ctrl.signal);
674
+ }
675
+ }
676
+ this.#logger.error('failed to send tool result', {
677
+ tool_use_id: toolUseId,
678
+ attempts: attempt,
679
+ error: String(lastErr),
680
+ });
681
+ return false;
682
+ }
683
+ /** Wait (bounded) for in-flight tool executions to finish during teardown. */
684
+ async #drain() {
685
+ if (this.#inFlightCount === 0)
686
+ return;
687
+ await Promise.race([new Promise((r) => (this.#onIdle = r)), sleep(DRAIN_TIMEOUT_MS)]);
688
+ this.#onIdle = null;
689
+ if (this.#inFlightCount > 0) {
690
+ this.#logger.warn('drain timeout exceeded');
691
+ }
692
+ }
693
+ }
694
+ /**
695
+ * Build the result event that answers `ev`: a `user.tool_result` for a builtin
696
+ * `agent.tool_use`, a `user.custom_tool_result` for a custom
697
+ * `agent.custom_tool_use`. The two `(use, result)` pairs are distinct API event
698
+ * types and must be matched exactly — a `user.tool_result` does not answer a
699
+ * custom tool call.
700
+ */
701
+ function buildResultEvent(ev, isError, content) {
702
+ if (ev.type === 'agent.custom_tool_use') {
703
+ return { type: 'user.custom_tool_result', custom_tool_use_id: ev.id, is_error: isError, content };
704
+ }
705
+ return { type: 'user.tool_result', tool_use_id: ev.id, is_error: isError, content };
706
+ }
707
+ // The Messages-API tool-result block union is wider than the Sessions-API
708
+ // tool_result content union; pass through text/image/document and stringify
709
+ // anything else so a BetaRunnableTool authored for toolRunner still works here.
710
+ function toSessionContent(content) {
711
+ if (typeof content === 'string')
712
+ return [{ type: 'text', text: content || '(no output)' }];
713
+ const out = content.map((b) => {
714
+ if (b.type === 'text')
715
+ return { type: 'text', text: b.text || '(no output)' };
716
+ if (b.type === 'image' || b.type === 'document')
717
+ return b;
718
+ if (b.type === 'search_result') {
719
+ // The Messages `search_result` block param maps field-for-field onto the
720
+ // Sessions `BetaManagedAgentsSearchResultBlock`; map it explicitly rather
721
+ // than letting it fall through to the JSON.stringify branch (which would
722
+ // bury a structured result inside a text block). `citations` is required
723
+ // on the Sessions side and optional on the Messages side — default the
724
+ // flag to `false` when the producer left it unset.
725
+ return {
726
+ type: 'search_result',
727
+ source: b.source,
728
+ title: b.title,
729
+ content: b.content.map((c) => ({ type: 'text', text: c.text })),
730
+ citations: { enabled: b.citations?.enabled ?? false },
731
+ };
732
+ }
733
+ return { type: 'text', text: JSON.stringify(b) };
734
+ });
735
+ return out.length > 0 ? out : [{ type: 'text', text: '(no output)' }];
736
+ }
737
+ //# sourceMappingURL=SessionToolRunner.js.map