@anthropic-ai/sdk 0.95.2 → 0.97.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (582) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/api-promise.d.mts +1 -0
  3. package/api-promise.d.mts.map +1 -1
  4. package/api-promise.d.ts +1 -0
  5. package/api-promise.d.ts.map +1 -1
  6. package/api-promise.mjs +1 -0
  7. package/api-promise.mjs.map +1 -1
  8. package/bin/migration-config.json +222 -0
  9. package/client.d.mts.map +1 -1
  10. package/client.d.ts.map +1 -1
  11. package/client.mjs.map +1 -1
  12. package/core/api-promise.d.mts.map +1 -1
  13. package/core/api-promise.d.ts.map +1 -1
  14. package/core/api-promise.mjs.map +1 -1
  15. package/core/credentials.mjs.map +1 -1
  16. package/core/error.d.mts.map +1 -1
  17. package/core/error.d.ts.map +1 -1
  18. package/core/error.mjs.map +1 -1
  19. package/core/pagination.d.mts.map +1 -1
  20. package/core/pagination.d.ts.map +1 -1
  21. package/core/pagination.mjs.map +1 -1
  22. package/core/resource.d.mts.map +1 -1
  23. package/core/resource.d.ts.map +1 -1
  24. package/core/streaming.d.mts.map +1 -1
  25. package/core/streaming.d.ts.map +1 -1
  26. package/core/streaming.js +2 -0
  27. package/core/streaming.js.map +1 -1
  28. package/core/streaming.mjs +2 -0
  29. package/core/streaming.mjs.map +1 -1
  30. package/core/uploads.d.mts.map +1 -1
  31. package/core/uploads.d.ts.map +1 -1
  32. package/core/uploads.mjs.map +1 -1
  33. package/error.d.mts +1 -0
  34. package/error.d.mts.map +1 -1
  35. package/error.d.ts +1 -0
  36. package/error.d.ts.map +1 -1
  37. package/error.mjs +1 -0
  38. package/error.mjs.map +1 -1
  39. package/helpers/beta/environments.d.mts +22 -0
  40. package/helpers/beta/environments.d.mts.map +1 -0
  41. package/helpers/beta/environments.d.ts +22 -0
  42. package/helpers/beta/environments.d.ts.map +1 -0
  43. package/helpers/beta/environments.js +30 -0
  44. package/helpers/beta/environments.js.map +1 -0
  45. package/helpers/beta/environments.mjs +22 -0
  46. package/helpers/beta/environments.mjs.map +1 -0
  47. package/helpers/beta/json-schema.d.mts +6 -0
  48. package/helpers/beta/json-schema.d.mts.map +1 -1
  49. package/helpers/beta/json-schema.d.ts +6 -0
  50. package/helpers/beta/json-schema.d.ts.map +1 -1
  51. package/helpers/beta/json-schema.js +1 -0
  52. package/helpers/beta/json-schema.js.map +1 -1
  53. package/helpers/beta/json-schema.mjs +1 -0
  54. package/helpers/beta/json-schema.mjs.map +1 -1
  55. package/helpers/beta/mcp.d.mts.map +1 -1
  56. package/helpers/beta/mcp.d.ts.map +1 -1
  57. package/helpers/beta/mcp.mjs.map +1 -1
  58. package/helpers/beta/memory.d.mts.map +1 -1
  59. package/helpers/beta/memory.d.ts.map +1 -1
  60. package/helpers/beta/zod.d.mts +11 -5
  61. package/helpers/beta/zod.d.mts.map +1 -1
  62. package/helpers/beta/zod.d.ts +11 -5
  63. package/helpers/beta/zod.d.ts.map +1 -1
  64. package/helpers/beta/zod.js +1 -0
  65. package/helpers/beta/zod.js.map +1 -1
  66. package/helpers/beta/zod.mjs +1 -0
  67. package/helpers/beta/zod.mjs.map +1 -1
  68. package/helpers/index.d.mts.map +1 -1
  69. package/helpers/index.d.ts.map +1 -1
  70. package/helpers/index.mjs.map +1 -1
  71. package/helpers/json-schema.d.mts.map +1 -1
  72. package/helpers/json-schema.d.ts.map +1 -1
  73. package/helpers/json-schema.mjs.map +1 -1
  74. package/helpers/zod.d.mts +2 -2
  75. package/helpers/zod.d.mts.map +1 -1
  76. package/helpers/zod.d.ts +2 -2
  77. package/helpers/zod.d.ts.map +1 -1
  78. package/helpers/zod.js.map +1 -1
  79. package/helpers/zod.mjs.map +1 -1
  80. package/index.d.mts.map +1 -1
  81. package/index.d.ts.map +1 -1
  82. package/index.mjs.map +1 -1
  83. package/internal/decoders/jsonl.d.mts.map +1 -1
  84. package/internal/decoders/jsonl.d.ts.map +1 -1
  85. package/internal/decoders/jsonl.mjs.map +1 -1
  86. package/internal/decoders/line.mjs.map +1 -1
  87. package/internal/detect-platform.mjs.map +1 -1
  88. package/internal/headers.mjs.map +1 -1
  89. package/internal/parse.d.mts.map +1 -1
  90. package/internal/parse.d.ts.map +1 -1
  91. package/internal/parse.mjs.map +1 -1
  92. package/internal/qs/formats.d.mts.map +1 -1
  93. package/internal/qs/formats.d.ts.map +1 -1
  94. package/internal/qs/index.d.mts +2 -2
  95. package/internal/qs/index.d.mts.map +1 -1
  96. package/internal/qs/index.d.ts +2 -2
  97. package/internal/qs/index.d.ts.map +1 -1
  98. package/internal/qs/index.mjs.map +1 -1
  99. package/internal/qs/stringify.d.mts.map +1 -1
  100. package/internal/qs/stringify.d.ts.map +1 -1
  101. package/internal/qs/stringify.mjs.map +1 -1
  102. package/internal/qs/utils.d.mts.map +1 -1
  103. package/internal/qs/utils.d.ts.map +1 -1
  104. package/internal/qs/utils.mjs.map +1 -1
  105. package/internal/request-options.d.mts.map +1 -1
  106. package/internal/request-options.d.ts.map +1 -1
  107. package/internal/shims.d.mts +6 -0
  108. package/internal/shims.d.mts.map +1 -1
  109. package/internal/shims.d.ts +6 -0
  110. package/internal/shims.d.ts.map +1 -1
  111. package/internal/to-file.d.mts.map +1 -1
  112. package/internal/to-file.d.ts.map +1 -1
  113. package/internal/to-file.mjs.map +1 -1
  114. package/internal/types.d.mts +4 -4
  115. package/internal/types.d.mts.map +1 -1
  116. package/internal/types.d.ts +4 -4
  117. package/internal/types.d.ts.map +1 -1
  118. package/internal/uploads.d.mts.map +1 -1
  119. package/internal/uploads.d.ts.map +1 -1
  120. package/internal/uploads.mjs.map +1 -1
  121. package/internal/utils/abort.d.mts +13 -0
  122. package/internal/utils/abort.d.mts.map +1 -0
  123. package/internal/utils/abort.d.ts +13 -0
  124. package/internal/utils/abort.d.ts.map +1 -0
  125. package/internal/utils/abort.js +26 -0
  126. package/internal/utils/abort.js.map +1 -0
  127. package/internal/utils/abort.mjs +23 -0
  128. package/internal/utils/abort.mjs.map +1 -0
  129. package/internal/utils/async-queue.d.mts +31 -0
  130. package/internal/utils/async-queue.d.mts.map +1 -0
  131. package/internal/utils/async-queue.d.ts +31 -0
  132. package/internal/utils/async-queue.d.ts.map +1 -0
  133. package/internal/utils/async-queue.js +75 -0
  134. package/internal/utils/async-queue.js.map +1 -0
  135. package/internal/utils/async-queue.mjs +71 -0
  136. package/internal/utils/async-queue.mjs.map +1 -0
  137. package/internal/utils/backoff.d.mts +23 -0
  138. package/internal/utils/backoff.d.mts.map +1 -0
  139. package/internal/utils/backoff.d.ts +23 -0
  140. package/internal/utils/backoff.d.ts.map +1 -0
  141. package/internal/utils/backoff.js +44 -0
  142. package/internal/utils/backoff.js.map +1 -0
  143. package/internal/utils/backoff.mjs +36 -0
  144. package/internal/utils/backoff.mjs.map +1 -0
  145. package/internal/utils/base64.mjs.map +1 -1
  146. package/internal/utils/log.d.mts.map +1 -1
  147. package/internal/utils/log.d.ts.map +1 -1
  148. package/internal/utils/log.mjs.map +1 -1
  149. package/internal/utils/path.mjs.map +1 -1
  150. package/internal/utils/promise.d.mts +11 -0
  151. package/internal/utils/promise.d.mts.map +1 -0
  152. package/internal/utils/promise.d.ts +11 -0
  153. package/internal/utils/promise.d.ts.map +1 -0
  154. package/internal/utils/promise.js +18 -0
  155. package/internal/utils/promise.js.map +1 -0
  156. package/internal/utils/promise.mjs +15 -0
  157. package/internal/utils/promise.mjs.map +1 -0
  158. package/internal/utils/query.mjs.map +1 -1
  159. package/internal/utils/sleep.d.mts +9 -1
  160. package/internal/utils/sleep.d.mts.map +1 -1
  161. package/internal/utils/sleep.d.ts +9 -1
  162. package/internal/utils/sleep.d.ts.map +1 -1
  163. package/internal/utils/sleep.js +23 -2
  164. package/internal/utils/sleep.js.map +1 -1
  165. package/internal/utils/sleep.mjs +23 -2
  166. package/internal/utils/sleep.mjs.map +1 -1
  167. package/internal/utils/values.mjs.map +1 -1
  168. package/internal/utils.d.mts.map +1 -1
  169. package/internal/utils.d.ts.map +1 -1
  170. package/internal/utils.mjs.map +1 -1
  171. package/lib/BetaMessageStream.d.mts.map +1 -1
  172. package/lib/BetaMessageStream.d.ts.map +1 -1
  173. package/lib/BetaMessageStream.mjs.map +1 -1
  174. package/lib/MessageStream.d.mts.map +1 -1
  175. package/lib/MessageStream.d.ts.map +1 -1
  176. package/lib/MessageStream.mjs.map +1 -1
  177. package/lib/beta-parser.d.mts.map +1 -1
  178. package/lib/beta-parser.d.ts.map +1 -1
  179. package/lib/beta-parser.mjs.map +1 -1
  180. package/lib/credentials/credential-chain.d.mts.map +1 -1
  181. package/lib/credentials/credential-chain.d.ts.map +1 -1
  182. package/lib/credentials/credential-chain.mjs.map +1 -1
  183. package/lib/credentials/identity-token.d.mts.map +1 -1
  184. package/lib/credentials/identity-token.d.ts.map +1 -1
  185. package/lib/credentials/identity-token.mjs.map +1 -1
  186. package/lib/credentials/oidc-federation.d.mts.map +1 -1
  187. package/lib/credentials/oidc-federation.d.ts.map +1 -1
  188. package/lib/credentials/oidc-federation.mjs.map +1 -1
  189. package/lib/credentials/token-cache.d.mts.map +1 -1
  190. package/lib/credentials/token-cache.d.ts.map +1 -1
  191. package/lib/credentials/token-cache.mjs.map +1 -1
  192. package/lib/credentials/types.d.mts.map +1 -1
  193. package/lib/credentials/types.d.ts.map +1 -1
  194. package/lib/credentials/types.mjs.map +1 -1
  195. package/lib/credentials/user-oauth.d.mts.map +1 -1
  196. package/lib/credentials/user-oauth.d.ts.map +1 -1
  197. package/lib/credentials/user-oauth.mjs.map +1 -1
  198. package/lib/credentials.d.mts.map +1 -1
  199. package/lib/credentials.d.ts.map +1 -1
  200. package/lib/credentials.mjs.map +1 -1
  201. package/lib/environments/index.d.mts +4 -0
  202. package/lib/environments/index.d.mts.map +1 -0
  203. package/lib/environments/index.d.ts +4 -0
  204. package/lib/environments/index.d.ts.map +1 -0
  205. package/lib/environments/index.js +18 -0
  206. package/lib/environments/index.js.map +1 -0
  207. package/lib/environments/index.mjs +4 -0
  208. package/lib/environments/index.mjs.map +1 -0
  209. package/lib/environments/poller.d.mts +89 -0
  210. package/lib/environments/poller.d.mts.map +1 -0
  211. package/lib/environments/poller.d.ts +89 -0
  212. package/lib/environments/poller.d.ts.map +1 -0
  213. package/lib/environments/poller.js +181 -0
  214. package/lib/environments/poller.js.map +1 -0
  215. package/lib/environments/poller.mjs +172 -0
  216. package/lib/environments/poller.mjs.map +1 -0
  217. package/lib/environments/worker.d.mts +143 -0
  218. package/lib/environments/worker.d.mts.map +1 -0
  219. package/lib/environments/worker.d.ts +143 -0
  220. package/lib/environments/worker.d.ts.map +1 -0
  221. package/lib/environments/worker.js +265 -0
  222. package/lib/environments/worker.js.map +1 -0
  223. package/lib/environments/worker.mjs +261 -0
  224. package/lib/environments/worker.mjs.map +1 -0
  225. package/lib/helper-client.d.mts +49 -0
  226. package/lib/helper-client.d.mts.map +1 -0
  227. package/lib/helper-client.d.ts +49 -0
  228. package/lib/helper-client.d.ts.map +1 -0
  229. package/lib/helper-client.js +57 -0
  230. package/lib/helper-client.js.map +1 -0
  231. package/lib/helper-client.mjs +54 -0
  232. package/lib/helper-client.mjs.map +1 -0
  233. package/lib/parser.d.mts.map +1 -1
  234. package/lib/parser.d.ts.map +1 -1
  235. package/lib/parser.mjs.map +1 -1
  236. package/lib/stainless-helper-header.d.mts.map +1 -1
  237. package/lib/stainless-helper-header.d.ts.map +1 -1
  238. package/lib/tools/BetaRunnableTool.d.mts +54 -2
  239. package/lib/tools/BetaRunnableTool.d.mts.map +1 -1
  240. package/lib/tools/BetaRunnableTool.d.ts +54 -2
  241. package/lib/tools/BetaRunnableTool.d.ts.map +1 -1
  242. package/lib/tools/BetaRunnableTool.js +37 -0
  243. package/lib/tools/BetaRunnableTool.js.map +1 -1
  244. package/lib/tools/BetaRunnableTool.mjs +34 -1
  245. package/lib/tools/BetaRunnableTool.mjs.map +1 -1
  246. package/lib/tools/BetaToolRunner.d.mts.map +1 -1
  247. package/lib/tools/BetaToolRunner.d.ts.map +1 -1
  248. package/lib/tools/BetaToolRunner.js +4 -14
  249. package/lib/tools/BetaToolRunner.js.map +1 -1
  250. package/lib/tools/BetaToolRunner.mjs +2 -12
  251. package/lib/tools/BetaToolRunner.mjs.map +1 -1
  252. package/lib/tools/CompactionControl.d.mts.map +1 -1
  253. package/lib/tools/CompactionControl.d.ts.map +1 -1
  254. package/lib/tools/SessionToolRunner.d.mts +140 -0
  255. package/lib/tools/SessionToolRunner.d.mts.map +1 -0
  256. package/lib/tools/SessionToolRunner.d.ts +140 -0
  257. package/lib/tools/SessionToolRunner.d.ts.map +1 -0
  258. package/lib/tools/SessionToolRunner.js +459 -0
  259. package/lib/tools/SessionToolRunner.js.map +1 -0
  260. package/lib/tools/SessionToolRunner.mjs +455 -0
  261. package/lib/tools/SessionToolRunner.mjs.map +1 -0
  262. package/lib/tools/ToolError.d.mts.map +1 -1
  263. package/lib/tools/ToolError.d.ts.map +1 -1
  264. package/lib/tools/ToolRunner.d.mts.map +1 -1
  265. package/lib/tools/ToolRunner.d.ts.map +1 -1
  266. package/lib/tools/ToolRunner.mjs.map +1 -1
  267. package/lib/transform-json-schema.mjs.map +1 -1
  268. package/package.json +1 -1
  269. package/pagination.d.mts +1 -0
  270. package/pagination.d.mts.map +1 -1
  271. package/pagination.d.ts +1 -0
  272. package/pagination.d.ts.map +1 -1
  273. package/pagination.mjs +1 -0
  274. package/pagination.mjs.map +1 -1
  275. package/resource.d.mts +1 -0
  276. package/resource.d.mts.map +1 -1
  277. package/resource.d.ts +1 -0
  278. package/resource.d.ts.map +1 -1
  279. package/resource.mjs +1 -0
  280. package/resource.mjs.map +1 -1
  281. package/resources/beta/agents/agents.d.mts +125 -1
  282. package/resources/beta/agents/agents.d.mts.map +1 -1
  283. package/resources/beta/agents/agents.d.ts +125 -1
  284. package/resources/beta/agents/agents.d.ts.map +1 -1
  285. package/resources/beta/agents/agents.js.map +1 -1
  286. package/resources/beta/agents/agents.mjs.map +1 -1
  287. package/resources/beta/agents/index.d.mts +1 -1
  288. package/resources/beta/agents/index.d.mts.map +1 -1
  289. package/resources/beta/agents/index.d.ts +1 -1
  290. package/resources/beta/agents/index.d.ts.map +1 -1
  291. package/resources/beta/agents/index.js.map +1 -1
  292. package/resources/beta/agents/index.mjs.map +1 -1
  293. package/resources/beta/agents/versions.d.mts.map +1 -1
  294. package/resources/beta/agents/versions.d.ts.map +1 -1
  295. package/resources/beta/agents/versions.mjs.map +1 -1
  296. package/resources/beta/agents.d.mts.map +1 -1
  297. package/resources/beta/agents.d.ts.map +1 -1
  298. package/resources/beta/agents.mjs.map +1 -1
  299. package/resources/beta/beta.d.mts +10 -10
  300. package/resources/beta/beta.d.mts.map +1 -1
  301. package/resources/beta/beta.d.ts +10 -10
  302. package/resources/beta/beta.d.ts.map +1 -1
  303. package/resources/beta/beta.js +2 -2
  304. package/resources/beta/beta.js.map +1 -1
  305. package/resources/beta/beta.mjs +2 -2
  306. package/resources/beta/beta.mjs.map +1 -1
  307. package/resources/beta/environments/environments.d.mts +425 -0
  308. package/resources/beta/environments/environments.d.mts.map +1 -0
  309. package/resources/beta/environments/environments.d.ts +425 -0
  310. package/resources/beta/environments/environments.d.ts.map +1 -0
  311. package/resources/beta/environments/environments.js +150 -0
  312. package/resources/beta/environments/environments.js.map +1 -0
  313. package/resources/beta/environments/environments.mjs +145 -0
  314. package/resources/beta/environments/environments.mjs.map +1 -0
  315. package/resources/beta/environments/index.d.mts +3 -0
  316. package/resources/beta/environments/index.d.mts.map +1 -0
  317. package/resources/beta/environments/index.d.ts +3 -0
  318. package/resources/beta/environments/index.d.ts.map +1 -0
  319. package/resources/beta/environments/index.js +9 -0
  320. package/resources/beta/environments/index.js.map +1 -0
  321. package/resources/beta/environments/index.mjs +4 -0
  322. package/resources/beta/environments/index.mjs.map +1 -0
  323. package/resources/beta/environments/work.d.mts +496 -0
  324. package/resources/beta/environments/work.d.mts.map +1 -0
  325. package/resources/beta/environments/work.d.ts +496 -0
  326. package/resources/beta/environments/work.d.ts.map +1 -0
  327. package/resources/beta/environments/work.js +274 -0
  328. package/resources/beta/environments/work.js.map +1 -0
  329. package/resources/beta/environments/work.mjs +268 -0
  330. package/resources/beta/environments/work.mjs.map +1 -0
  331. package/resources/beta/environments.d.mts +1 -388
  332. package/resources/beta/environments.d.mts.map +1 -1
  333. package/resources/beta/environments.d.ts +1 -388
  334. package/resources/beta/environments.d.ts.map +1 -1
  335. package/resources/beta/environments.js +2 -138
  336. package/resources/beta/environments.js.map +1 -1
  337. package/resources/beta/environments.mjs +1 -136
  338. package/resources/beta/environments.mjs.map +1 -1
  339. package/resources/beta/files.d.mts.map +1 -1
  340. package/resources/beta/files.d.ts.map +1 -1
  341. package/resources/beta/files.mjs.map +1 -1
  342. package/resources/beta/index.d.mts +4 -4
  343. package/resources/beta/index.d.mts.map +1 -1
  344. package/resources/beta/index.d.ts +4 -4
  345. package/resources/beta/index.d.ts.map +1 -1
  346. package/resources/beta/index.js +12 -12
  347. package/resources/beta/index.js.map +1 -1
  348. package/resources/beta/index.mjs +1 -1
  349. package/resources/beta/index.mjs.map +1 -1
  350. package/resources/beta/memory-stores/index.d.mts.map +1 -1
  351. package/resources/beta/memory-stores/index.d.ts.map +1 -1
  352. package/resources/beta/memory-stores/index.mjs.map +1 -1
  353. package/resources/beta/memory-stores/memories.d.mts.map +1 -1
  354. package/resources/beta/memory-stores/memories.d.ts.map +1 -1
  355. package/resources/beta/memory-stores/memories.mjs.map +1 -1
  356. package/resources/beta/memory-stores/memory-stores.d.mts.map +1 -1
  357. package/resources/beta/memory-stores/memory-stores.d.ts.map +1 -1
  358. package/resources/beta/memory-stores/memory-stores.mjs.map +1 -1
  359. package/resources/beta/memory-stores/memory-versions.d.mts.map +1 -1
  360. package/resources/beta/memory-stores/memory-versions.d.ts.map +1 -1
  361. package/resources/beta/memory-stores/memory-versions.mjs.map +1 -1
  362. package/resources/beta/memory-stores.d.mts.map +1 -1
  363. package/resources/beta/memory-stores.d.ts.map +1 -1
  364. package/resources/beta/memory-stores.mjs.map +1 -1
  365. package/resources/beta/messages/batches.d.mts +5 -0
  366. package/resources/beta/messages/batches.d.mts.map +1 -1
  367. package/resources/beta/messages/batches.d.ts +5 -0
  368. package/resources/beta/messages/batches.d.ts.map +1 -1
  369. package/resources/beta/messages/batches.mjs.map +1 -1
  370. package/resources/beta/messages/index.d.mts +1 -1
  371. package/resources/beta/messages/index.d.mts.map +1 -1
  372. package/resources/beta/messages/index.d.ts +1 -1
  373. package/resources/beta/messages/index.d.ts.map +1 -1
  374. package/resources/beta/messages/index.js.map +1 -1
  375. package/resources/beta/messages/index.mjs.map +1 -1
  376. package/resources/beta/messages/messages.d.mts +80 -5
  377. package/resources/beta/messages/messages.d.mts.map +1 -1
  378. package/resources/beta/messages/messages.d.ts +80 -5
  379. package/resources/beta/messages/messages.d.ts.map +1 -1
  380. package/resources/beta/messages/messages.js.map +1 -1
  381. package/resources/beta/messages/messages.mjs.map +1 -1
  382. package/resources/beta/messages.d.mts.map +1 -1
  383. package/resources/beta/messages.d.ts.map +1 -1
  384. package/resources/beta/messages.mjs.map +1 -1
  385. package/resources/beta/models.d.mts.map +1 -1
  386. package/resources/beta/models.d.ts.map +1 -1
  387. package/resources/beta/models.mjs.map +1 -1
  388. package/resources/beta/sessions/events.d.mts +97 -9
  389. package/resources/beta/sessions/events.d.mts.map +1 -1
  390. package/resources/beta/sessions/events.d.ts +97 -9
  391. package/resources/beta/sessions/events.d.ts.map +1 -1
  392. package/resources/beta/sessions/events.js +27 -1
  393. package/resources/beta/sessions/events.js.map +1 -1
  394. package/resources/beta/sessions/events.mjs +25 -0
  395. package/resources/beta/sessions/events.mjs.map +1 -1
  396. package/resources/beta/sessions/index.d.mts +3 -3
  397. package/resources/beta/sessions/index.d.mts.map +1 -1
  398. package/resources/beta/sessions/index.d.ts +3 -3
  399. package/resources/beta/sessions/index.d.ts.map +1 -1
  400. package/resources/beta/sessions/index.js.map +1 -1
  401. package/resources/beta/sessions/index.mjs.map +1 -1
  402. package/resources/beta/sessions/resources.d.mts.map +1 -1
  403. package/resources/beta/sessions/resources.d.ts.map +1 -1
  404. package/resources/beta/sessions/resources.mjs.map +1 -1
  405. package/resources/beta/sessions/sessions.d.mts +101 -9
  406. package/resources/beta/sessions/sessions.d.mts.map +1 -1
  407. package/resources/beta/sessions/sessions.d.ts +101 -9
  408. package/resources/beta/sessions/sessions.d.ts.map +1 -1
  409. package/resources/beta/sessions/sessions.js.map +1 -1
  410. package/resources/beta/sessions/sessions.mjs.map +1 -1
  411. package/resources/beta/sessions/threads/events.d.mts.map +1 -1
  412. package/resources/beta/sessions/threads/events.d.ts.map +1 -1
  413. package/resources/beta/sessions/threads/events.mjs.map +1 -1
  414. package/resources/beta/sessions/threads/index.d.mts +1 -1
  415. package/resources/beta/sessions/threads/index.d.mts.map +1 -1
  416. package/resources/beta/sessions/threads/index.d.ts +1 -1
  417. package/resources/beta/sessions/threads/index.d.ts.map +1 -1
  418. package/resources/beta/sessions/threads/index.js.map +1 -1
  419. package/resources/beta/sessions/threads/index.mjs.map +1 -1
  420. package/resources/beta/sessions/threads/threads.d.mts +3 -23
  421. package/resources/beta/sessions/threads/threads.d.mts.map +1 -1
  422. package/resources/beta/sessions/threads/threads.d.ts +3 -23
  423. package/resources/beta/sessions/threads/threads.d.ts.map +1 -1
  424. package/resources/beta/sessions/threads/threads.js.map +1 -1
  425. package/resources/beta/sessions/threads/threads.mjs.map +1 -1
  426. package/resources/beta/sessions/threads.d.mts.map +1 -1
  427. package/resources/beta/sessions/threads.d.ts.map +1 -1
  428. package/resources/beta/sessions/threads.mjs.map +1 -1
  429. package/resources/beta/sessions.d.mts.map +1 -1
  430. package/resources/beta/sessions.d.ts.map +1 -1
  431. package/resources/beta/sessions.mjs.map +1 -1
  432. package/resources/beta/skills/index.d.mts +1 -1
  433. package/resources/beta/skills/index.d.mts.map +1 -1
  434. package/resources/beta/skills/index.d.ts +1 -1
  435. package/resources/beta/skills/index.d.ts.map +1 -1
  436. package/resources/beta/skills/index.js.map +1 -1
  437. package/resources/beta/skills/index.mjs.map +1 -1
  438. package/resources/beta/skills/skills.d.mts +2 -2
  439. package/resources/beta/skills/skills.d.mts.map +1 -1
  440. package/resources/beta/skills/skills.d.ts +2 -2
  441. package/resources/beta/skills/skills.d.ts.map +1 -1
  442. package/resources/beta/skills/skills.js.map +1 -1
  443. package/resources/beta/skills/skills.mjs.map +1 -1
  444. package/resources/beta/skills/versions.d.mts +28 -1
  445. package/resources/beta/skills/versions.d.mts.map +1 -1
  446. package/resources/beta/skills/versions.d.ts +28 -1
  447. package/resources/beta/skills/versions.d.ts.map +1 -1
  448. package/resources/beta/skills/versions.js +28 -0
  449. package/resources/beta/skills/versions.js.map +1 -1
  450. package/resources/beta/skills/versions.mjs +28 -0
  451. package/resources/beta/skills/versions.mjs.map +1 -1
  452. package/resources/beta/skills.d.mts.map +1 -1
  453. package/resources/beta/skills.d.ts.map +1 -1
  454. package/resources/beta/skills.mjs.map +1 -1
  455. package/resources/beta/user-profiles.d.mts.map +1 -1
  456. package/resources/beta/user-profiles.d.ts.map +1 -1
  457. package/resources/beta/user-profiles.mjs.map +1 -1
  458. package/resources/beta/vaults/credentials.d.mts.map +1 -1
  459. package/resources/beta/vaults/credentials.d.ts.map +1 -1
  460. package/resources/beta/vaults/credentials.mjs.map +1 -1
  461. package/resources/beta/vaults/index.d.mts.map +1 -1
  462. package/resources/beta/vaults/index.d.ts.map +1 -1
  463. package/resources/beta/vaults/index.mjs.map +1 -1
  464. package/resources/beta/vaults/vaults.d.mts.map +1 -1
  465. package/resources/beta/vaults/vaults.d.ts.map +1 -1
  466. package/resources/beta/vaults/vaults.mjs.map +1 -1
  467. package/resources/beta/vaults.d.mts.map +1 -1
  468. package/resources/beta/vaults.d.ts.map +1 -1
  469. package/resources/beta/vaults.mjs.map +1 -1
  470. package/resources/beta/webhooks.d.mts.map +1 -1
  471. package/resources/beta/webhooks.d.ts.map +1 -1
  472. package/resources/beta/webhooks.mjs.map +1 -1
  473. package/resources/beta.d.mts.map +1 -1
  474. package/resources/beta.d.ts.map +1 -1
  475. package/resources/beta.mjs.map +1 -1
  476. package/resources/completions.d.mts.map +1 -1
  477. package/resources/completions.d.ts.map +1 -1
  478. package/resources/completions.mjs.map +1 -1
  479. package/resources/index.d.mts.map +1 -1
  480. package/resources/index.d.ts.map +1 -1
  481. package/resources/index.mjs.map +1 -1
  482. package/resources/messages/batches.d.mts.map +1 -1
  483. package/resources/messages/batches.d.ts.map +1 -1
  484. package/resources/messages/batches.mjs.map +1 -1
  485. package/resources/messages/index.d.mts.map +1 -1
  486. package/resources/messages/index.d.ts.map +1 -1
  487. package/resources/messages/index.mjs.map +1 -1
  488. package/resources/messages/messages.d.mts.map +1 -1
  489. package/resources/messages/messages.d.ts.map +1 -1
  490. package/resources/messages/messages.mjs.map +1 -1
  491. package/resources/messages.d.mts.map +1 -1
  492. package/resources/messages.d.ts.map +1 -1
  493. package/resources/messages.mjs.map +1 -1
  494. package/resources/models.d.mts.map +1 -1
  495. package/resources/models.d.ts.map +1 -1
  496. package/resources/models.mjs.map +1 -1
  497. package/resources.d.mts.map +1 -1
  498. package/resources.d.ts.map +1 -1
  499. package/resources.mjs.map +1 -1
  500. package/src/core/streaming.ts +2 -0
  501. package/src/helpers/beta/environments.ts +33 -0
  502. package/src/helpers/beta/json-schema.ts +7 -0
  503. package/src/helpers/beta/zod.ts +13 -7
  504. package/src/helpers/zod.ts +2 -3
  505. package/src/internal/utils/abort.ts +21 -0
  506. package/src/internal/utils/async-queue.ts +66 -0
  507. package/src/internal/utils/backoff.ts +41 -0
  508. package/src/internal/utils/promise.ts +18 -0
  509. package/src/internal/utils/sleep.ts +25 -2
  510. package/src/lib/environments/index.ts +23 -0
  511. package/src/lib/environments/poller.ts +253 -0
  512. package/src/lib/environments/worker.ts +395 -0
  513. package/src/lib/helper-client.ts +89 -0
  514. package/src/lib/tools/BetaRunnableTool.ts +82 -1
  515. package/src/lib/tools/BetaToolRunner.ts +2 -17
  516. package/src/lib/tools/SessionToolRunner.ts +591 -0
  517. package/src/resources/beta/agents/agents.ts +158 -0
  518. package/src/resources/beta/agents/index.ts +7 -0
  519. package/src/resources/beta/beta.ts +62 -21
  520. package/src/resources/beta/environments/environments.ts +625 -0
  521. package/src/resources/beta/environments/index.ts +42 -0
  522. package/src/resources/beta/environments/work.ts +697 -0
  523. package/src/resources/beta/environments.ts +1 -540
  524. package/src/resources/beta/index.ts +21 -1
  525. package/src/resources/beta/messages/batches.ts +6 -0
  526. package/src/resources/beta/messages/index.ts +8 -0
  527. package/src/resources/beta/messages/messages.ts +109 -5
  528. package/src/resources/beta/sessions/events.ts +153 -7
  529. package/src/resources/beta/sessions/index.ts +7 -1
  530. package/src/resources/beta/sessions/sessions.ts +130 -6
  531. package/src/resources/beta/sessions/threads/index.ts +0 -1
  532. package/src/resources/beta/sessions/threads/threads.ts +4 -37
  533. package/src/resources/beta/skills/index.ts +1 -0
  534. package/src/resources/beta/skills/skills.ts +2 -0
  535. package/src/resources/beta/skills/versions.ts +44 -0
  536. package/src/tools/agent-toolset/fs-util.ts +154 -0
  537. package/src/tools/agent-toolset/node.ts +787 -0
  538. package/src/tools/agent-toolset/skills.ts +256 -0
  539. package/src/version.ts +1 -1
  540. package/streaming.d.mts +1 -0
  541. package/streaming.d.mts.map +1 -1
  542. package/streaming.d.ts +1 -0
  543. package/streaming.d.ts.map +1 -1
  544. package/streaming.mjs +1 -0
  545. package/streaming.mjs.map +1 -1
  546. package/tools/agent-toolset/fs-util.d.mts +49 -0
  547. package/tools/agent-toolset/fs-util.d.mts.map +1 -0
  548. package/tools/agent-toolset/fs-util.d.ts +49 -0
  549. package/tools/agent-toolset/fs-util.d.ts.map +1 -0
  550. package/tools/agent-toolset/fs-util.js +159 -0
  551. package/tools/agent-toolset/fs-util.js.map +1 -0
  552. package/tools/agent-toolset/fs-util.mjs +151 -0
  553. package/tools/agent-toolset/fs-util.mjs.map +1 -0
  554. package/tools/agent-toolset/node.d.mts +139 -0
  555. package/tools/agent-toolset/node.d.mts.map +1 -0
  556. package/tools/agent-toolset/node.d.ts +139 -0
  557. package/tools/agent-toolset/node.d.ts.map +1 -0
  558. package/tools/agent-toolset/node.js +746 -0
  559. package/tools/agent-toolset/node.js.map +1 -0
  560. package/tools/agent-toolset/node.mjs +731 -0
  561. package/tools/agent-toolset/node.mjs.map +1 -0
  562. package/tools/agent-toolset/skills.d.mts +50 -0
  563. package/tools/agent-toolset/skills.d.mts.map +1 -0
  564. package/tools/agent-toolset/skills.d.ts +50 -0
  565. package/tools/agent-toolset/skills.d.ts.map +1 -0
  566. package/tools/agent-toolset/skills.js +249 -0
  567. package/tools/agent-toolset/skills.js.map +1 -0
  568. package/tools/agent-toolset/skills.mjs +243 -0
  569. package/tools/agent-toolset/skills.mjs.map +1 -0
  570. package/tools/memory/node.d.mts.map +1 -1
  571. package/tools/memory/node.d.ts.map +1 -1
  572. package/tools/memory/node.mjs.map +1 -1
  573. package/uploads.d.mts +1 -0
  574. package/uploads.d.mts.map +1 -1
  575. package/uploads.d.ts +1 -0
  576. package/uploads.d.ts.map +1 -1
  577. package/uploads.mjs +1 -0
  578. package/uploads.mjs.map +1 -1
  579. package/version.d.mts +1 -1
  580. package/version.d.ts +1 -1
  581. package/version.js +1 -1
  582. package/version.mjs +1 -1
@@ -1,5 +1,4 @@
1
1
  import { transformJSONSchema } from '../..//lib/transform-json-schema';
2
- import type { infer as zodInfer, ZodType } from 'zod';
3
2
  import * as z from 'zod/v4';
4
3
  import { AnthropicError } from '../../core/error';
5
4
  import { AutoParseableBetaOutputFormat } from '../../lib/beta-parser';
@@ -14,9 +13,9 @@ import { BetaToolResultContentBlockParam } from '../../resources/beta';
14
13
  * This can be passed directly to the `.create()` method but will not
15
14
  * result in any automatic parsing, you'll have to parse the response yourself.
16
15
  */
17
- export function betaZodOutputFormat<ZodInput extends ZodType>(
16
+ export function betaZodOutputFormat<ZodInput extends z.ZodType>(
18
17
  zodObject: ZodInput,
19
- ): AutoParseableBetaOutputFormat<zodInfer<ZodInput>> {
18
+ ): AutoParseableBetaOutputFormat<z.infer<ZodInput>> {
20
19
  let jsonSchema = z.toJSONSchema(zodObject, { reused: 'ref' });
21
20
 
22
21
  jsonSchema = transformJSONSchema(jsonSchema);
@@ -46,15 +45,21 @@ export function betaZodOutputFormat<ZodInput extends ZodType>(
46
45
  * converted into JSON Schema when passed to the API. The provided function's
47
46
  * input arguments will also be validated against the provided schema.
48
47
  */
49
- export function betaZodTool<InputSchema extends ZodType>(options: {
48
+ export function betaZodTool<InputSchema extends z.ZodType>(options: {
50
49
  name: string;
51
50
  inputSchema: InputSchema;
52
51
  description: string;
53
52
  run: (
54
- args: zodInfer<InputSchema>,
53
+ args: z.infer<InputSchema>,
55
54
  context?: BetaToolRunContext,
56
55
  ) => Promisable<string | Array<BetaToolResultContentBlockParam>>;
57
- }): BetaRunnableTool<zodInfer<InputSchema>> {
56
+ /**
57
+ * Optional cleanup hook for tools that hold process-level resources (e.g. a
58
+ * persistent shell). `client.beta.sessions.events.toolRunner` calls it once
59
+ * when iteration ends.
60
+ */
61
+ close?: () => void | Promise<void>;
62
+ }): BetaRunnableTool<z.infer<InputSchema>> {
58
63
  const jsonSchema = z.toJSONSchema(options.inputSchema, { reused: 'ref' });
59
64
 
60
65
  if (jsonSchema.type !== 'object') {
@@ -70,6 +75,7 @@ export function betaZodTool<InputSchema extends ZodType>(options: {
70
75
  input_schema: objectSchema,
71
76
  description: options.description,
72
77
  run: options.run,
73
- parse: (args: unknown) => options.inputSchema.parse(args) as zodInfer<InputSchema>,
78
+ parse: (args: unknown) => options.inputSchema.parse(args) as z.infer<InputSchema>,
79
+ ...(options.close ? { close: options.close } : {}),
74
80
  };
75
81
  }
@@ -1,5 +1,4 @@
1
1
  import { transformJSONSchema } from '../lib/transform-json-schema';
2
- import type { infer as zodInfer, ZodType } from 'zod';
3
2
  import * as z from 'zod/v4';
4
3
  import { AnthropicError } from '../core/error';
5
4
  import { AutoParseableOutputFormat } from '../lib/parser';
@@ -13,9 +12,9 @@ import { AutoParseableOutputFormat } from '../lib/parser';
13
12
  * This can be passed directly to the `.create()` method but will not
14
13
  * result in any automatic parsing, you'll have to parse the response yourself.
15
14
  */
16
- export function zodOutputFormat<ZodInput extends ZodType>(
15
+ export function zodOutputFormat<ZodInput extends z.ZodType>(
17
16
  zodObject: ZodInput,
18
- ): AutoParseableOutputFormat<zodInfer<ZodInput>> {
17
+ ): AutoParseableOutputFormat<z.infer<ZodInput>> {
19
18
  let jsonSchema = z.toJSONSchema(zodObject, { reused: 'ref' });
20
19
 
21
20
  jsonSchema = transformJSONSchema(jsonSchema);
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Chain an external {@link AbortSignal} into a local {@link AbortController}:
3
+ * the controller aborts whenever `external` aborts (synchronously if it is
4
+ * already aborted).
5
+ *
6
+ * Returns a cleanup function that detaches the listener. Callers MUST invoke it
7
+ * on their normal teardown path — `{ once: true }` only removes the listener if
8
+ * abort actually fires, so a long-lived `external` signal (e.g. a daemon-wide
9
+ * signal reused across many short-lived controllers) would otherwise leak one
10
+ * listener per controller.
11
+ */
12
+ export function linkAbort(external: AbortSignal | null | undefined, controller: AbortController): () => void {
13
+ if (!external) return () => {};
14
+ if (external.aborted) {
15
+ controller.abort();
16
+ return () => {};
17
+ }
18
+ const onAbort = () => controller.abort();
19
+ external.addEventListener('abort', onAbort);
20
+ return () => external.removeEventListener('abort', onAbort);
21
+ }
@@ -0,0 +1,66 @@
1
+ export type AsyncQueueResult<T> = { done: false; value: T } | { done: true; value: undefined };
2
+
3
+ /**
4
+ * Single-consumer async queue that bridges background producers to an
5
+ * `AsyncIterator`-style reader. Producers `push()` items; the consumer awaits
6
+ * `next()`. `close()` is idempotent and wakes any pending `next()` with
7
+ * `done: true`. `tryShift()` synchronously drains remaining items after
8
+ * iteration has been signalled to stop.
9
+ */
10
+ export class AsyncQueue<T> {
11
+ #items: T[] = [];
12
+ #waiters: Array<(r: AsyncQueueResult<T>) => void> = [];
13
+ #closed = false;
14
+
15
+ /** Enqueue an item, or hand it directly to a waiting reader. Returns `false` once closed. */
16
+ push(item: T): boolean {
17
+ if (this.#closed) return false;
18
+ const w = this.#waiters.shift();
19
+ if (w) w({ done: false, value: item });
20
+ else this.#items.push(item);
21
+ return true;
22
+ }
23
+
24
+ /** Mark the queue done. Idempotent; wakes every pending reader with `done: true`. */
25
+ close(): void {
26
+ if (this.#closed) return;
27
+ this.#closed = true;
28
+ while (this.#waiters.length > 0) {
29
+ const w = this.#waiters.shift()!;
30
+ w({ done: true, value: undefined });
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Resolve with the next item, or `done: true` once the queue is closed and
36
+ * drained. When `signal` is supplied, aborting it resolves a pending read
37
+ * with `done: true` (cancellation is pushed down here rather than handled by
38
+ * an outer `Promise.race`).
39
+ */
40
+ next(signal?: AbortSignal): Promise<AsyncQueueResult<T>> {
41
+ if (this.#items.length > 0) {
42
+ return Promise.resolve({ done: false, value: this.#items.shift()! });
43
+ }
44
+ if (this.#closed || signal?.aborted) {
45
+ return Promise.resolve({ done: true, value: undefined });
46
+ }
47
+ return new Promise<AsyncQueueResult<T>>((resolve) => {
48
+ const waiter = (r: AsyncQueueResult<T>) => {
49
+ signal?.removeEventListener('abort', onAbort);
50
+ resolve(r);
51
+ };
52
+ const onAbort = () => {
53
+ const idx = this.#waiters.indexOf(waiter);
54
+ if (idx >= 0) this.#waiters.splice(idx, 1);
55
+ resolve({ done: true, value: undefined });
56
+ };
57
+ this.#waiters.push(waiter);
58
+ signal?.addEventListener('abort', onAbort, { once: true });
59
+ });
60
+ }
61
+
62
+ /** Synchronously remove and return the next buffered item, or `undefined` if empty. */
63
+ tryShift(): T | undefined {
64
+ return this.#items.shift();
65
+ }
66
+ }
@@ -0,0 +1,41 @@
1
+ import { APIError } from '../../core/error';
2
+
3
+ /** True when `e` is an {@link APIError} whose HTTP status equals `code`. */
4
+ export function isStatus(e: unknown, code: number): boolean {
5
+ return e instanceof APIError && e.status === code;
6
+ }
7
+
8
+ /** True when `e` is an {@link APIError} with a 4xx status. */
9
+ export function is4xx(e: unknown): boolean {
10
+ return e instanceof APIError && typeof e.status === 'number' && e.status >= 400 && e.status < 500;
11
+ }
12
+
13
+ /**
14
+ * True for a 4xx that the core client's retry policy would *not* retry, i.e. a
15
+ * permanent client error. 408 (request timeout), 409 (lock timeout) and 429
16
+ * (rate limit) are retryable for the base client (`Anthropic.shouldRetry`), so
17
+ * they are not treated as fatal here — keeping helper retry behaviour aligned
18
+ * with the rest of the SDK.
19
+ */
20
+ export function isFatal4xx(e: unknown): boolean {
21
+ return is4xx(e) && !isStatus(e, 408) && !isStatus(e, 409) && !isStatus(e, 429);
22
+ }
23
+
24
+ /** Exponential backoff: `baseMs * 2 ** attempt`, clamped to `capMs`. */
25
+ export function backoff(attempt: number, baseMs: number, capMs: number): number {
26
+ return Math.min(baseMs * 2 ** attempt, capMs);
27
+ }
28
+
29
+ /** Uniform random delay in the half-open interval `[lowMs, highMs)`. */
30
+ export function jitter(lowMs: number, highMs: number): number {
31
+ return lowMs + Math.random() * (highMs - lowMs);
32
+ }
33
+
34
+ /**
35
+ * Trim up to 25% off `ms` at random so a fleet of clients backing off after a
36
+ * shared outage does not retry in lockstep — mirrors the jitter the core client
37
+ * applies to its own retry timeout.
38
+ */
39
+ export function applyJitter(ms: number): number {
40
+ return ms * (1 - Math.random() * 0.25);
41
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * A deferred: a `Promise` together with its `resolve` / `reject` functions.
3
+ * This is `Promise.withResolvers()`, which is not available in all supported
4
+ * runtimes.
5
+ */
6
+ export function promiseWithResolvers<T>(): {
7
+ promise: Promise<T>;
8
+ resolve: (value: T | PromiseLike<T>) => void;
9
+ reject: (reason?: unknown) => void;
10
+ } {
11
+ let resolve!: (value: T | PromiseLike<T>) => void;
12
+ let reject!: (reason?: unknown) => void;
13
+ const promise = new Promise<T>((res, rej) => {
14
+ resolve = res;
15
+ reject = rej;
16
+ });
17
+ return { promise, resolve, reject };
18
+ }
@@ -1,3 +1,26 @@
1
- // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
1
+ /**
2
+ * Resolve after `ms`, or immediately when `signal` aborts.
3
+ *
4
+ * When a `signal` is passed the abort listener is always removed so repeated
5
+ * calls do not accumulate listeners on a long-lived signal. Resolves (rather
6
+ * than rejects) on abort — callers treat abort as "wake up early," not as a
7
+ * failure; callers that want to unwind should check the signal themselves.
8
+ */
9
+ export const sleep = (ms: number, signal?: AbortSignal): Promise<void> =>
10
+ new Promise<void>((resolve) => {
11
+ if (signal?.aborted) return resolve();
2
12
 
3
- export const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));
13
+ const onAbort = () => {
14
+ clearTimeout(timer);
15
+ resolve();
16
+ };
17
+
18
+ const timer = setTimeout(() => {
19
+ signal?.removeEventListener('abort', onAbort);
20
+ resolve();
21
+ }, ms);
22
+
23
+ // `{ once: true }` auto-removes the listener if abort fires first,
24
+ // so we only need an explicit remove on the timer-wins path above.
25
+ signal?.addEventListener('abort', onAbort, { once: true });
26
+ });
@@ -0,0 +1,23 @@
1
+ export {
2
+ WorkPoller,
3
+ type WorkPollerOptions,
4
+ POLL_BLOCK_MS,
5
+ backoff,
6
+ jitter,
7
+ isStatus,
8
+ is4xx,
9
+ isFatal4xx,
10
+ } from './poller';
11
+ export {
12
+ EnvironmentWorker,
13
+ type EnvironmentWorkerOptions,
14
+ type EnvironmentWorkerTools,
15
+ type HandleItemOptions,
16
+ } from './worker';
17
+ export {
18
+ SessionToolRunner,
19
+ type SessionToolRunnerOptions,
20
+ type DispatchedToolCall,
21
+ MANAGED_AGENTS_BETA,
22
+ DEFAULT_MAX_IDLE_MS,
23
+ } from '../tools/SessionToolRunner';
@@ -0,0 +1,253 @@
1
+ import { AnthropicError } from '../../core/error';
2
+ import type { Anthropic } from '../../client';
3
+ import type { BetaSelfHostedWork } from '../../resources/beta/environments/work';
4
+ import { loggerFor } from '../../internal/utils/log';
5
+ import { sleep } from '../../internal/utils/sleep';
6
+ import { uuid4 } from '../../internal/utils/uuid';
7
+ import { linkAbort } from '../../internal/utils/abort';
8
+ import { buildHeaders } from '../../internal/headers';
9
+ import type { BetaToolRunnerRequestOptions } from '../tools/BetaToolRunner';
10
+ import {
11
+ applyJitter,
12
+ backoff as expBackoff,
13
+ isFatal4xx,
14
+ isStatus,
15
+ jitter,
16
+ } from '../../internal/utils/backoff';
17
+ import { copyClientForHelper } from '../helper-client';
18
+
19
+ export { is4xx, isFatal4xx, isStatus, jitter } from '../../internal/utils/backoff';
20
+
21
+ // API caps block_ms at 999; rely on client-side jitter between empty polls.
22
+ export const POLL_BLOCK_MS = 999;
23
+ const POLL_BACKOFF_BASE_MS = 1000;
24
+ const POLL_BACKOFF_CAP_MS = 60_000;
25
+
26
+ export interface WorkPollerOptions {
27
+ client: Anthropic;
28
+ environmentId: string;
29
+ /**
30
+ * The environment key — the single credential for the self-hosted runner. It
31
+ * authenticates the work-poll calls here and every per-session call the
32
+ * consumer makes afterwards.
33
+ */
34
+ environmentKey: string;
35
+ workerId?: string;
36
+ /** External abort signal. Aborting it ends the iteration. */
37
+ signal?: AbortSignal;
38
+ /**
39
+ * Whether the poller posts `work.stop` itself after the consumer's loop body
40
+ * returns. Defaults to `true`. Set `false` when the consumer already owns the
41
+ * stop (e.g. {@link EnvironmentWorker} force-stops every item) so the work
42
+ * item is not stopped twice.
43
+ *
44
+ * Orthogonal to {@link WorkPollerOptions.drain}: `autoStop` is a per-item
45
+ * lifecycle flag (does the poller `work.stop` each item), `drain` controls
46
+ * loop termination (does the poller return when the queue is empty). They are
47
+ * not two names for the same thing — `EnvironmentWorker.run` uses
48
+ * `autoStop: false` with `drain` defaulting `false`.
49
+ */
50
+ autoStop?: boolean;
51
+ /**
52
+ * When `true`, the poller returns (ends iteration) as soon as the work queue
53
+ * is empty instead of long-polling forever. Defaults to `false` (long-poll
54
+ * until aborted). Pair with `blockMs: null` for a single non-blocking pass
55
+ * over whatever is already queued.
56
+ */
57
+ drain?: boolean;
58
+ /**
59
+ * Block timeout in milliseconds passed through to `work.poll` — the server
60
+ * long-polls up to this long for an item before returning empty. Defaults to
61
+ * {@link POLL_BLOCK_MS} (the API cap, 999). Pass `null` to omit it entirely
62
+ * for a non-blocking single poll (useful with {@link WorkPollerOptions.drain}).
63
+ */
64
+ blockMs?: number | null;
65
+ /**
66
+ * Reclaim unacknowledged work items older than this many milliseconds, passed
67
+ * through to `work.poll`'s `reclaim_older_than_ms`. Defaults to `undefined`
68
+ * (omitted — the server applies its own default).
69
+ */
70
+ reclaimOlderThanMs?: number | null;
71
+ /**
72
+ * Extra per-request options merged into the poll/ack/stop calls. Custom
73
+ * `headers` (e.g. a proxy's auth/routing headers) are layered on top of the
74
+ * environment-key auth + helper telemetry headers; the poller owns the abort
75
+ * signal, so a `signal` here is ignored.
76
+ */
77
+ requestOptions?: BetaToolRunnerRequestOptions;
78
+ }
79
+
80
+ /**
81
+ * Async-iterable that long-polls a self-hosted environment for work, ack's
82
+ * each item, yields the {@link BetaSelfHostedWork} item, and posts `stop` after
83
+ * the consumer's loop body returns (or when the consumer `break`s).
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * for await (const work of client.beta.environments.work.poller({
88
+ * environmentId,
89
+ * environmentKey,
90
+ * })) {
91
+ * // ...service the work...
92
+ * }
93
+ * ```
94
+ */
95
+ export class WorkPoller implements AsyncIterable<BetaSelfHostedWork> {
96
+ readonly client: Anthropic;
97
+ readonly environmentId: string;
98
+ readonly environmentKey: string;
99
+ readonly workerId: string;
100
+
101
+ // Sub-client scoped to the environment key. Every poll / ack / stop call
102
+ // is routed through this so the parent's `X-Api-Key` never lands on the
103
+ // wire alongside the bearer credential. The helper-telemetry header is
104
+ // attached as a default on this client; per-call plumbing is unnecessary.
105
+ readonly #runnerClient: Anthropic;
106
+ #consumed = false;
107
+ readonly #controller: AbortController;
108
+ readonly #detachExternal: () => void;
109
+ readonly #autoStop: boolean;
110
+ readonly #drain: boolean;
111
+ readonly #blockMs: number | null;
112
+ readonly #reclaimOlderThanMs: number | null;
113
+ readonly #requestOpts: BetaToolRunnerRequestOptions | undefined;
114
+
115
+ constructor(opts: WorkPollerOptions) {
116
+ this.client = opts.client;
117
+ this.environmentId = opts.environmentId;
118
+ this.environmentKey = opts.environmentKey;
119
+ this.workerId = opts.workerId ?? defaultWorkerId();
120
+ this.#runnerClient = copyClientForHelper(opts.client, {
121
+ authToken: opts.environmentKey,
122
+ helper: 'environments-work-poller',
123
+ });
124
+ this.#autoStop = opts.autoStop ?? true;
125
+ this.#drain = opts.drain ?? false;
126
+ // `undefined` => default to the API cap; an explicit `null` => omit
127
+ // `block_ms` for a non-blocking poll.
128
+ this.#blockMs = opts.blockMs === undefined ? POLL_BLOCK_MS : opts.blockMs;
129
+ this.#reclaimOlderThanMs = opts.reclaimOlderThanMs ?? null;
130
+ this.#requestOpts = opts.requestOptions;
131
+ this.#controller = new AbortController();
132
+ this.#detachExternal = linkAbort(opts.signal, this.#controller);
133
+ }
134
+
135
+ /** Read-only view of this iterator's abort signal. */
136
+ get signal(): AbortSignal {
137
+ return this.#controller.signal;
138
+ }
139
+
140
+ /** Abort the iterator. The current `for await` will exit cleanly. */
141
+ abort(): void {
142
+ this.#controller.abort();
143
+ }
144
+
145
+ async *[Symbol.asyncIterator](): AsyncIterator<BetaSelfHostedWork> {
146
+ if (this.#consumed) {
147
+ throw new AnthropicError('Cannot iterate over a consumed WorkPoller');
148
+ }
149
+ this.#consumed = true;
150
+ const log = loggerFor(this.client);
151
+ log.info('poller starting', {
152
+ component: 'work-poller',
153
+ environment_id: this.environmentId,
154
+ });
155
+
156
+ try {
157
+ let attempt = 0;
158
+ while (!this.#controller.signal.aborted) {
159
+ let work: BetaSelfHostedWork | null;
160
+ try {
161
+ work = await this.#runnerClient.beta.environments.work.poll(
162
+ this.environmentId,
163
+ {
164
+ 'Anthropic-Worker-ID': this.workerId,
165
+ ...(this.#blockMs !== null ? { block_ms: this.#blockMs } : {}),
166
+ ...(this.#reclaimOlderThanMs !== null ?
167
+ { reclaim_older_than_ms: this.#reclaimOlderThanMs }
168
+ : {}),
169
+ },
170
+ { headers: buildHeaders([this.#requestOpts?.headers]), signal: this.#controller.signal },
171
+ );
172
+ } catch (e) {
173
+ if (this.#controller.signal.aborted) return;
174
+ // A bad environment key / missing environment never recovers — surface
175
+ // it instead of spinning forever at the backoff cap.
176
+ if (isFatal4xx(e)) {
177
+ log.error('poll failed permanently, stopping poller', { error: String(e) });
178
+ throw e;
179
+ }
180
+ // Jittered exponential backoff so a fleet of pollers doesn't retry in
181
+ // lockstep after a shared outage.
182
+ const wait = applyJitter(backoff(attempt));
183
+ log.warn('poll failed, backing off', { error: String(e), backoff_ms: wait });
184
+ attempt++;
185
+ await sleep(wait, this.#controller.signal);
186
+ continue;
187
+ }
188
+ attempt = 0;
189
+ if (work == null) {
190
+ // Queue empty: either return now (drain) or wait and poll again.
191
+ if (this.#drain) return;
192
+ await sleep(jitter(1000, 3000), this.#controller.signal);
193
+ continue;
194
+ }
195
+ log.info('claimed work', {
196
+ component: 'work-poller',
197
+ environment_id: this.environmentId,
198
+ work_id: work.id,
199
+ work_type: work.data.type,
200
+ });
201
+
202
+ try {
203
+ await this.#runnerClient.beta.environments.work.ack(
204
+ work.id,
205
+ { environment_id: work.environment_id },
206
+ { headers: buildHeaders([this.#requestOpts?.headers]), signal: this.#controller.signal },
207
+ );
208
+ } catch (e) {
209
+ log.error('ack failed', { work_id: work.id, error: String(e) });
210
+ continue;
211
+ }
212
+
213
+ try {
214
+ yield work;
215
+ } finally {
216
+ // Post-handler stop. Runs whether the consumer body returned
217
+ // normally, threw, or `break`d out of the loop — unless the consumer
218
+ // owns the stop itself (`autoStop: false`).
219
+ if (this.#autoStop) {
220
+ try {
221
+ await this.#runnerClient.beta.environments.work.stop(
222
+ work.id,
223
+ { environment_id: work.environment_id },
224
+ { headers: buildHeaders([this.#requestOpts?.headers]) },
225
+ );
226
+ } catch (e) {
227
+ if (!isStatus(e, 409)) log.warn('stop failed', { work_id: work.id, error: String(e) });
228
+ }
229
+ }
230
+ }
231
+ }
232
+ } finally {
233
+ // Detach from the external signal so the consumer can drop their
234
+ // signal reference without leaking this iterator instance.
235
+ this.#detachExternal();
236
+ }
237
+ }
238
+ }
239
+
240
+ /** Exponential poll backoff: 1s, 2s, 4s … clamped to a 60s cap. */
241
+ export function backoff(attempt: number): number {
242
+ return expBackoff(attempt, POLL_BACKOFF_BASE_MS, POLL_BACKOFF_CAP_MS);
243
+ }
244
+
245
+ function defaultWorkerId(): string {
246
+ // The API documents the worker id as a *unique* identifier for Redis consumer
247
+ // groups, so the fallback must be unique even when several pollers share a
248
+ // host. Prefix with the hostname when one is exposed for readability, but rely
249
+ // on the uuid for uniqueness.
250
+ const env = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env;
251
+ const host = env?.['HOSTNAME'];
252
+ return host ? `${host}-${uuid4()}` : uuid4();
253
+ }