@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
@@ -0,0 +1,395 @@
1
+ import { AnthropicError } from '../../core/error';
2
+ import type { Anthropic } from '../../client';
3
+ import type { BetaSelfHostedWork } from '../../resources/beta/environments/work';
4
+ import { loggerFor, type Logger } from '../../internal/utils/log';
5
+ import { readEnv } from '../../internal/utils/env';
6
+ import { sleep } from '../../internal/utils/sleep';
7
+ import { isFatal4xx, isStatus } from '../../internal/utils/backoff';
8
+ import { linkAbort } from '../../internal/utils/abort';
9
+ import { buildHeaders } from '../../internal/headers';
10
+ import type { BetaRunnableTool } from '../tools/BetaRunnableTool';
11
+ import type { BetaToolRunnerRequestOptions } from '../tools/BetaToolRunner';
12
+ import { SessionToolRunner } from '../tools/SessionToolRunner';
13
+ import { WorkPoller } from './poller';
14
+ import { copyClientForHelper } from '../helper-client';
15
+ // `tools/agent-toolset/node` is Node-only (node:child_process, node:fs, …).
16
+ // Only the type is imported statically (erased at build); the module's values
17
+ // (`setupSkills`, `betaAgentToolset20260401`) are loaded lazily inside the
18
+ // per-item handler. That keeps this file free of Node-only deps in the static
19
+ // import graph, which is what lets `client.beta.environments.work.worker()`
20
+ // exist as a resource method without pulling Node built-ins into the SDK core.
21
+ import type { AgentToolContext } from '../../tools/agent-toolset/node';
22
+
23
+ const HEARTBEAT_DEFAULT_MS = 30_000;
24
+ const NO_HEARTBEAT_SENTINEL = 'NO_HEARTBEAT';
25
+
26
+ /**
27
+ * Either a fixed tool array or a factory invoked once per claimed session with
28
+ * that session's {@link AgentToolContext} — use the factory form to bind
29
+ * `betaAgentToolset20260401` (or any tool that needs the workdir / session
30
+ * id) to the right session.
31
+ */
32
+ export type EnvironmentWorkerTools =
33
+ | Array<BetaRunnableTool>
34
+ | ((ctx: AgentToolContext) => Array<BetaRunnableTool>);
35
+
36
+ export interface EnvironmentWorkerOptions {
37
+ client: Anthropic;
38
+ /**
39
+ * The self-hosted environment to poll for work. Required by
40
+ * {@link EnvironmentWorker.run}; not used by {@link EnvironmentWorker.handleItem}.
41
+ */
42
+ environmentId?: string;
43
+ /**
44
+ * The environment key — the single credential for the runner. It authenticates
45
+ * the work-poll calls and every per-session call (event stream, lease
46
+ * heartbeat, force-stop). Required by {@link EnvironmentWorker.run}; falls back
47
+ * to `ANTHROPIC_ENVIRONMENT_KEY` in {@link EnvironmentWorker.handleItem}.
48
+ */
49
+ environmentKey?: string;
50
+ /**
51
+ * Tools to expose to each claimed session. Defaults to
52
+ * `betaAgentToolset20260401(ctx)` (the standard `agent_toolset_20260401` set
53
+ * bound to the per-session {@link AgentToolContext}).
54
+ */
55
+ tools?: EnvironmentWorkerTools;
56
+ /** Base directory for the per-session {@link AgentToolContext}. Defaults to `process.cwd()`. */
57
+ workdir?: string;
58
+ /** Forwarded to the per-session {@link AgentToolContext}. */
59
+ unrestrictedPaths?: boolean;
60
+ /** Forwarded to {@link SessionToolRunner} (`maxIdleMs`). */
61
+ maxIdleMs?: number;
62
+ /** Forwarded to the {@link WorkPoller}. */
63
+ workerId?: string;
64
+ /** External abort signal; aborting it ends the run. */
65
+ signal?: AbortSignal;
66
+ /**
67
+ * Extra per-request options merged into every call this worker issues — the
68
+ * work poll/ack/heartbeat/stop control-plane calls and the per-session
69
+ * SessionToolRunner's stream/list/send. Mirrors what
70
+ * `client.beta.messages.toolRunner` accepts: custom `headers` (e.g. a proxy's
71
+ * auth/routing headers) reach all of them. The worker owns the abort signals,
72
+ * so a `signal` here is ignored — use {@link EnvironmentWorkerOptions.signal}.
73
+ */
74
+ requestOptions?: BetaToolRunnerRequestOptions;
75
+ }
76
+
77
+ /**
78
+ * Options for {@link EnvironmentWorker.handleItem}. Every field falls back to the
79
+ * matching `ANTHROPIC_*` environment variable — the ones the
80
+ * `ant worker poll --on-work` command sets for the process it spawns — when not
81
+ * passed explicitly.
82
+ */
83
+ export interface HandleItemOptions {
84
+ /** Work item id. Falls back to `ANTHROPIC_WORK_ID`. */
85
+ workId?: string;
86
+ /** Self-hosted environment id. Falls back to `ANTHROPIC_ENVIRONMENT_ID`. */
87
+ environmentId?: string;
88
+ /** Session id. Falls back to `ANTHROPIC_SESSION_ID`. */
89
+ sessionId?: string;
90
+ /**
91
+ * The environment key used to authenticate every per-session call. Resolution
92
+ * order: this option, then the worker's own `environmentKey`, then
93
+ * `ANTHROPIC_ENVIRONMENT_KEY`.
94
+ */
95
+ environmentKey?: string;
96
+ /** External abort signal; aborting it ends the run. Defaults to the constructor's signal. */
97
+ signal?: AbortSignal;
98
+ }
99
+
100
+ /** The fields of {@link BetaSelfHostedWork} the per-item flow reads. */
101
+ type ClaimedWork = Pick<BetaSelfHostedWork, 'id' | 'environment_id' | 'data'>;
102
+
103
+ /**
104
+ * The self-hosted environment runner, composed from the control-plane
105
+ * {@link WorkPoller} and the per-session {@link SessionToolRunner}.
106
+ *
107
+ * For each claimed `session` work item it: builds the per-session
108
+ * {@link AgentToolContext}, downloads the session agent's skills
109
+ * (`setupSkills`), then runs a {@link SessionToolRunner} for the session
110
+ * *while* heartbeating the work-item lease in parallel; on exit it force-stops
111
+ * the work item, cleans up the downloaded skills, and loops to the next one. The
112
+ * lease heartbeat reports `state === "stopping"` / a lost lease back into the run
113
+ * by aborting the session runner.
114
+ *
115
+ * Use {@link EnvironmentWorker.handleItem} if you already hold a claimed work
116
+ * item (e.g. a `worker poll --on-work` script handed one to a fresh process) and
117
+ * just want the per-item flow without the poll loop — with no arguments it reads
118
+ * the `ANTHROPIC_*` env vars that command sets.
119
+ *
120
+ * Construct it via `client.beta.environments.work.worker({ ... })` (or
121
+ * `new EnvironmentWorker({ client, ... })` directly).
122
+ *
123
+ * @example
124
+ * ```ts
125
+ * // Long-running daemon: poll for work, serve each session, loop.
126
+ * await client.beta.environments.work
127
+ * .worker({ environmentId, environmentKey, workdir: '/workspace' })
128
+ * .run(AbortSignal.timeout(60 * 60_000));
129
+ *
130
+ * // Already-claimed item (e.g. inside `ant worker poll --on-work ...`):
131
+ * await client.beta.environments.work.worker({ workdir: '/workspace' }).handleItem();
132
+ * ```
133
+ */
134
+ export class EnvironmentWorker {
135
+ readonly client: Anthropic;
136
+ readonly environmentId: string | undefined;
137
+ readonly environmentKey: string | undefined;
138
+ readonly tools: EnvironmentWorkerTools | undefined;
139
+ readonly workdir: string;
140
+ readonly unrestrictedPaths: boolean | undefined;
141
+ readonly maxIdleMs: number | undefined;
142
+ readonly workerId: string | undefined;
143
+ readonly requestOptions: BetaToolRunnerRequestOptions | undefined;
144
+ readonly #signal: AbortSignal | undefined;
145
+
146
+ constructor(opts: EnvironmentWorkerOptions) {
147
+ this.client = opts.client;
148
+ this.environmentId = opts.environmentId;
149
+ this.environmentKey = opts.environmentKey;
150
+ this.tools = opts.tools;
151
+ this.workdir = opts.workdir ?? process.cwd();
152
+ this.unrestrictedPaths = opts.unrestrictedPaths;
153
+ this.maxIdleMs = opts.maxIdleMs;
154
+ this.workerId = opts.workerId;
155
+ this.requestOptions = opts.requestOptions;
156
+ this.#signal = opts.signal;
157
+ }
158
+
159
+ /**
160
+ * Poll the environment and service each claimed session until the supplied
161
+ * signal (or the one passed to the constructor) aborts. Throws if
162
+ * `environmentId` / `environmentKey` were not provided to the constructor.
163
+ */
164
+ async run(signal?: AbortSignal): Promise<void> {
165
+ const { environmentId, environmentKey } = this;
166
+ if (environmentId === undefined || environmentKey === undefined) {
167
+ throw new AnthropicError(
168
+ 'EnvironmentWorker.run: environmentId and environmentKey are required to poll for work',
169
+ );
170
+ }
171
+ const externalSignal = signal ?? this.#signal;
172
+ const poller = new WorkPoller({
173
+ client: this.client,
174
+ environmentId,
175
+ environmentKey,
176
+ ...(this.workerId !== undefined ? { workerId: this.workerId } : {}),
177
+ ...(externalSignal ? { signal: externalSignal } : {}),
178
+ ...(this.requestOptions !== undefined ? { requestOptions: this.requestOptions } : {}),
179
+ // The per-item handler force-stops every work item on exit; let it be the
180
+ // single owner of `work.stop` rather than double-posting from the poller.
181
+ autoStop: false,
182
+ });
183
+
184
+ for await (const work of poller) {
185
+ await this.#handleItem(work, environmentKey, poller.signal);
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Service a single, already-claimed work item without the poll loop: build the
191
+ * per-session {@link AgentToolContext} (workdir from this worker's options),
192
+ * download the session agent's skills (`setupSkills`), run a
193
+ * {@link SessionToolRunner} for the session while heartbeating the work-item
194
+ * lease in parallel, and force-stop the work item on exit (whether the runner
195
+ * finishes normally, throws, or the heartbeat loop signals shutdown).
196
+ *
197
+ * Use this when something else does the claiming — e.g. a `worker poll
198
+ * --on-work` script that hands an already-claimed item to a fresh process. The
199
+ * work id / environment id / session id each fall back to `ANTHROPIC_WORK_ID` /
200
+ * `ANTHROPIC_ENVIRONMENT_ID` / `ANTHROPIC_SESSION_ID` (the env vars that
201
+ * command sets) when not passed; the environment key resolves from this
202
+ * option, then the worker's own `environmentKey`, then
203
+ * `ANTHROPIC_ENVIRONMENT_KEY`. With no arguments inside that command it just
204
+ * works. Throws a clear error naming the first of the four required values
205
+ * still missing after resolution.
206
+ */
207
+ async handleItem(opts?: HandleItemOptions): Promise<void> {
208
+ const workId = opts?.workId ?? readEnv('ANTHROPIC_WORK_ID');
209
+ const environmentId = opts?.environmentId ?? readEnv('ANTHROPIC_ENVIRONMENT_ID');
210
+ const sessionId = opts?.sessionId ?? readEnv('ANTHROPIC_SESSION_ID');
211
+ const environmentKey =
212
+ opts?.environmentKey ?? this.environmentKey ?? readEnv('ANTHROPIC_ENVIRONMENT_KEY');
213
+
214
+ if (!workId) {
215
+ throw new AnthropicError('handleItem: workId is required — pass it or set ANTHROPIC_WORK_ID');
216
+ }
217
+ if (!environmentId) {
218
+ throw new AnthropicError(
219
+ 'handleItem: environmentId is required — pass it or set ANTHROPIC_ENVIRONMENT_ID',
220
+ );
221
+ }
222
+ if (!sessionId) {
223
+ throw new AnthropicError('handleItem: sessionId is required — pass it or set ANTHROPIC_SESSION_ID');
224
+ }
225
+ if (!environmentKey) {
226
+ throw new AnthropicError(
227
+ 'handleItem: environmentKey is required — pass it, construct the worker with it, or set ANTHROPIC_ENVIRONMENT_KEY',
228
+ );
229
+ }
230
+
231
+ const work: ClaimedWork = {
232
+ id: workId,
233
+ environment_id: environmentId,
234
+ data: { type: 'session', id: sessionId },
235
+ };
236
+ await this.#handleItem(work, environmentKey, opts?.signal ?? this.#signal);
237
+ }
238
+
239
+ /**
240
+ * The per-item body shared by {@link EnvironmentWorker.run}'s poll loop and
241
+ * {@link EnvironmentWorker.handleItem}: run a {@link SessionToolRunner} for the
242
+ * work item's session while heartbeating its lease, force-stopping on exit.
243
+ * Non-session work items are ignored.
244
+ */
245
+ async #handleItem(
246
+ work: ClaimedWork,
247
+ environmentKey: string,
248
+ externalSignal: AbortSignal | undefined,
249
+ ): Promise<void> {
250
+ const log = loggerFor(this.client);
251
+ // Every per-session call — the SessionToolRunner event stream/list/send, the
252
+ // lease heartbeat, and the work force-stop — authenticates with the
253
+ // environment key. Scope a client to it once and thread that through.
254
+ // `copyClientForHelper` also clears the parent's `apiKey`, so the sub-client
255
+ // emits *only* the bearer credential on the wire (a plain
256
+ // `withOptions({authToken})` would leave `X-Api-Key` set as well).
257
+ const sessionClient = copyClientForHelper(this.client, {
258
+ authToken: environmentKey,
259
+ helper: 'environments-worker',
260
+ });
261
+
262
+ // The poller runs with `autoStop: false`, so the per-item handler is the
263
+ // single owner of `work.stop` for every claimed item.
264
+ const sessionId = work.data.id;
265
+
266
+ const ctx: AgentToolContext = {
267
+ workdir: this.workdir,
268
+ client: this.client,
269
+ sessionId,
270
+ ...(this.unrestrictedPaths !== undefined ? { unrestrictedPaths: this.unrestrictedPaths } : {}),
271
+ };
272
+ // Lazily load the Node-only toolset module — see the import note at the top.
273
+ const agentToolset = await import('../../tools/agent-toolset/node');
274
+ let cleanupSkills: () => Promise<void> = async () => {};
275
+ try {
276
+ cleanupSkills = await agentToolset.setupSkills(ctx);
277
+ } catch (e) {
278
+ log.warn('skill setup failed', { session_id: sessionId, work_id: work.id, error: String(e) });
279
+ }
280
+ const tools =
281
+ typeof this.tools === 'function' ?
282
+ this.tools(ctx)
283
+ : this.tools ?? agentToolset.betaAgentToolset20260401(ctx);
284
+
285
+ // A per-session controller: aborts when the supplied signal aborts, when the
286
+ // session runner finishes, or when the lease heartbeat says to stop.
287
+ const ctrl = new AbortController();
288
+ const detachExternal = linkAbort(externalSignal, ctrl);
289
+
290
+ const heartbeatPromise = heartbeatLoop(sessionClient, work, ctrl, log, this.requestOptions).catch((e) => {
291
+ if (!ctrl.signal.aborted) log.error('heartbeat loop failed', { work_id: work.id, error: String(e) });
292
+ ctrl.abort();
293
+ });
294
+
295
+ try {
296
+ const runner = new SessionToolRunner(sessionId, {
297
+ client: sessionClient,
298
+ tools,
299
+ ...(this.maxIdleMs !== undefined ? { maxIdleMs: this.maxIdleMs } : {}),
300
+ ...(this.requestOptions !== undefined ? { requestOptions: this.requestOptions } : {}),
301
+ signal: ctrl.signal,
302
+ });
303
+ for await (const _ of runner) {
304
+ // Drive the runner to completion; per-call observability is not part
305
+ // of this composition's surface — use `SessionToolRunner` directly
306
+ // (via `client.beta.sessions.events.toolRunner`) if you want it.
307
+ }
308
+ } finally {
309
+ ctrl.abort();
310
+ detachExternal();
311
+ await heartbeatPromise;
312
+ await cleanupSkills().catch((e) => {
313
+ log.warn('skill cleanup failed', { session_id: sessionId, work_id: work.id, error: String(e) });
314
+ });
315
+ await forceStop(sessionClient, work, log, this.requestOptions);
316
+ }
317
+ }
318
+ }
319
+
320
+ /** Force-stop a claimed work item, swallowing the 409 that means it's already stopped. */
321
+ async function forceStop(
322
+ client: Anthropic,
323
+ work: Pick<BetaSelfHostedWork, 'id' | 'environment_id'>,
324
+ log: Logger,
325
+ requestOptions?: BetaToolRunnerRequestOptions,
326
+ ): Promise<void> {
327
+ try {
328
+ await client.beta.environments.work.stop(
329
+ work.id,
330
+ { environment_id: work.environment_id, force: true },
331
+ // Caller's headers pass through; the helper-tag header is on the scoped
332
+ // sub-client's default_headers via copyClientForHelper, so no per-call
333
+ // re-stamping needed.
334
+ { ...requestOptions, headers: buildHeaders([requestOptions?.headers]) },
335
+ );
336
+ } catch (e) {
337
+ if (!isStatus(e, 409)) {
338
+ log.error('force-stop on exit failed', { work_id: work.id, error: String(e) });
339
+ }
340
+ }
341
+ }
342
+
343
+ /**
344
+ * Keep the work-item lease alive while a session is being served. Aborts `ctrl`
345
+ * when the control plane reports the work is `stopping`/`stopped`, when the
346
+ * lease is no longer extended, or on a permanent heartbeat failure.
347
+ */
348
+ async function heartbeatLoop(
349
+ client: Anthropic,
350
+ work: Pick<BetaSelfHostedWork, 'id' | 'environment_id'>,
351
+ ctrl: AbortController,
352
+ logger: Logger,
353
+ requestOptions?: BetaToolRunnerRequestOptions,
354
+ ): Promise<void> {
355
+ let intervalMs = HEARTBEAT_DEFAULT_MS;
356
+ let last = NO_HEARTBEAT_SENTINEL;
357
+ const beat = async (): Promise<void> => {
358
+ try {
359
+ const resp = await client.beta.environments.work.heartbeat(
360
+ work.id,
361
+ { environment_id: work.environment_id, expected_last_heartbeat: last },
362
+ { ...requestOptions, headers: buildHeaders([requestOptions?.headers]), signal: ctrl.signal },
363
+ );
364
+ last = resp.last_heartbeat;
365
+ if (resp.ttl_seconds > 0) {
366
+ intervalMs = Math.max(1_000, Math.min((resp.ttl_seconds * 1000) / 2, HEARTBEAT_DEFAULT_MS));
367
+ }
368
+ if (resp.state === 'stopping' || resp.state === 'stopped') {
369
+ logger.info('heartbeat signals shutdown', { work_id: work.id, state: resp.state });
370
+ ctrl.abort();
371
+ }
372
+ if (!resp.lease_extended) {
373
+ logger.warn('lease not extended, shutting down', { work_id: work.id });
374
+ ctrl.abort();
375
+ }
376
+ } catch (e) {
377
+ // An abort throws to unwind the caller (the `heartbeatLoop(...).catch`
378
+ // in `#handleItem`) rather than returning early.
379
+ ctrl.signal.throwIfAborted();
380
+ if (isFatal4xx(e)) {
381
+ logger.error('permanent heartbeat failure', { work_id: work.id, error: String(e) });
382
+ ctrl.abort();
383
+ throw e;
384
+ }
385
+ logger.warn('transient heartbeat failure', { work_id: work.id, error: String(e) });
386
+ }
387
+ };
388
+
389
+ await beat();
390
+ while (!ctrl.signal.aborted) {
391
+ await sleep(intervalMs, ctrl.signal);
392
+ ctrl.signal.throwIfAborted();
393
+ await beat();
394
+ }
395
+ }
@@ -0,0 +1,89 @@
1
+ import { AnthropicError } from '../core/error';
2
+ import type { Anthropic } from '../client';
3
+ import { buildHeaders, type HeadersLike, type NullableHeaders } from '../internal/headers';
4
+
5
+ /**
6
+ * Shared util for building a runner-helper-bound sub-client.
7
+ *
8
+ * The work poller, the environment worker, and the session tool runner each
9
+ * need to issue requests authenticated by a per-helper credential (a
10
+ * self-hosted environment key, today) rather than the parent client's own
11
+ * `X-Api-Key`, *and* tagged with their own `x-stainless-helper` telemetry
12
+ * value. Each wants to inherit the parent's full configuration — `timeout`,
13
+ * `maxRetries`, `fetch`, `fetchOptions`, custom `defaultHeaders`,
14
+ * `defaultQuery` — and override only the auth + telemetry bits.
15
+ *
16
+ * {@link copyClientForHelper} is the one shared construction.
17
+ */
18
+
19
+ /**
20
+ * The closed set of `x-stainless-helper` telemetry tags the runner helpers
21
+ * stamp on outgoing requests. Constrained as a string union so a typo at any
22
+ * call site is a type error rather than silently mistagged telemetry.
23
+ */
24
+ export type HelperTag = 'environments-work-poller' | 'environments-worker' | 'session-tool-runner';
25
+
26
+ interface ClientInternalAccess {
27
+ _options: { defaultHeaders?: HeadersLike };
28
+ _authState?: { extraHeaders?: Record<string, string> };
29
+ }
30
+
31
+ /**
32
+ * Return a `withOptions()` clone of `client` set up for use *by* one of the
33
+ * runner helpers: authenticated with `authToken` as Bearer credentials, with
34
+ * the parent's `X-Api-Key` cleared, and tagged with the helper's
35
+ * `x-stainless-helper` value on every outgoing request.
36
+ *
37
+ * The returned sub-client inherits the parent's full configuration
38
+ * (`baseURL`, `timeout`, `maxRetries`, `fetch`, `fetchOptions`, custom
39
+ * `defaultHeaders`, `defaultQuery`). Overrides applied:
40
+ *
41
+ * - `authToken: authToken` — the new credential.
42
+ * - `apiKey: null` — the parent's `X-Api-Key` is cleared. `withOptions`
43
+ * inherits the parent's `apiKey` by default; without this, both
44
+ * `X-Api-Key` *and* `Authorization: Bearer …` would land on the wire.
45
+ * `client.ts` only triggers the env-var fallback when `apiKey === undefined`,
46
+ * so explicit `null` is honored.
47
+ * - `credentials: undefined` — opts the clone out of any inherited
48
+ * credentials/config/profile so the explicit bearer is the unambiguous auth.
49
+ * - `baseURL: client.baseURL` — pins the parent's resolved host (auth override otherwise resets it).
50
+ * - `defaultHeaders` is rebuilt as `parent._authState.extraHeaders ⊕ parent.defaultHeaders ⊕
51
+ * {'x-stainless-helper': helper}`. `withOptions` *replaces* (does not
52
+ * merge) `defaultHeaders`, so we merge here so any custom headers the
53
+ * caller set on the parent client survive on the sub-client.
54
+ */
55
+ export function copyClientForHelper<T extends Anthropic>(
56
+ client: T,
57
+ { authToken, helper }: { authToken: string; helper: HelperTag },
58
+ ): T {
59
+ if (!authToken) {
60
+ throw new AnthropicError(
61
+ `copyClientForHelper: expected a non-empty authToken but received ${JSON.stringify(authToken)}`,
62
+ );
63
+ }
64
+ const internal = client as unknown as ClientInternalAccess;
65
+ const parentDefaults = internal._options.defaultHeaders;
66
+ // Carry the parent's credential/profile headers; strip the auth ones (we re-auth below).
67
+ const parentAuthExtraHeaders = internal._authState?.extraHeaders;
68
+ const inheritedAuthExtraHeaders: Record<string, string> | undefined =
69
+ parentAuthExtraHeaders ?
70
+ Object.fromEntries(
71
+ Object.entries(parentAuthExtraHeaders).filter(([name]) => {
72
+ const lower = name.toLowerCase();
73
+ return lower !== 'authorization' && lower !== 'x-api-key';
74
+ }),
75
+ )
76
+ : undefined;
77
+ const defaultHeaders: NullableHeaders = buildHeaders([
78
+ inheritedAuthExtraHeaders,
79
+ parentDefaults,
80
+ { 'x-stainless-helper': helper },
81
+ ]);
82
+ return client.withOptions({
83
+ apiKey: null,
84
+ authToken,
85
+ baseURL: client.baseURL,
86
+ credentials: undefined,
87
+ defaultHeaders,
88
+ }) as T;
89
+ }
@@ -11,8 +11,14 @@ import {
11
11
  BetaToolTextEditor20250124,
12
12
  BetaToolTextEditor20250429,
13
13
  BetaToolTextEditor20250728,
14
+ BetaToolUnion,
14
15
  BetaToolUseBlock,
15
16
  } from '../../resources/beta';
17
+ import type {
18
+ BetaManagedAgentsAgentCustomToolUseEvent,
19
+ BetaManagedAgentsAgentToolUseEvent,
20
+ } from '../../resources/beta/sessions/events';
21
+ import { ToolError } from './ToolError';
16
22
 
17
23
  export type Promisable<T> = T | Promise<T>;
18
24
 
@@ -33,8 +39,32 @@ export type BetaClientRunnableToolType =
33
39
  | BetaToolTextEditor20250429
34
40
  | BetaToolTextEditor20250728;
35
41
 
42
+ /**
43
+ * The tool-use that triggered a {@link BetaRunnableTool.run}:
44
+ *
45
+ * - from `client.beta.messages.toolRunner`, a Messages `tool_use` content block;
46
+ * - from `client.beta.sessions.events.toolRunner`, the `agent.tool_use` /
47
+ * `agent.custom_tool_use` session event.
48
+ *
49
+ * The shapes overlap on the common fields (`id`, `name`, `input`), so code that
50
+ * only reads those works without narrowing; narrow on the shape (e.g. `'type' in
51
+ * x`) when you need surface-specific properties.
52
+ */
53
+ export type BetaToolUse =
54
+ | BetaToolUseBlock
55
+ | BetaManagedAgentsAgentToolUseEvent
56
+ | BetaManagedAgentsAgentCustomToolUseEvent;
57
+
36
58
  export type BetaToolRunContext = {
37
- toolUseBlock: BetaToolUseBlock;
59
+ /** The tool-use that triggered this run. See {@link BetaToolUse}. */
60
+ toolUse: BetaToolUse;
61
+ /**
62
+ * @deprecated Renamed to `toolUse`. Also note that for
63
+ * `client.beta.sessions.events.toolRunner` this is the `agent.tool_use` /
64
+ * `agent.custom_tool_use` *event*, not a Messages content block, despite the
65
+ * name — which is why it was renamed.
66
+ */
67
+ toolUseBlock: BetaToolUse;
38
68
  signal?: AbortSignal | null | undefined;
39
69
  };
40
70
 
@@ -46,4 +76,55 @@ export type BetaRunnableTool<Input = any> = BetaClientRunnableToolType & {
46
76
  context?: BetaToolRunContext,
47
77
  ) => Promisable<string | Array<BetaToolResultContentBlockParam>>;
48
78
  parse: (content: unknown) => Input;
79
+ /**
80
+ * Optional cleanup hook for tools that hold process-level resources (e.g. a
81
+ * persistent shell). `SessionToolRunner` (`client.beta.sessions.events.toolRunner`)
82
+ * calls it once when iteration ends.
83
+ */
84
+ close?: () => Promisable<void>;
49
85
  };
86
+
87
+ /**
88
+ * Resolve the registry key for a tool — the name the model addresses it by.
89
+ * MCP toolsets are keyed on `mcp_server_name`; every other tool on `name`.
90
+ * Shared so the tool-name lookup is identical across `toolRunner()` surfaces.
91
+ */
92
+ export function toolName(tool: BetaToolUnion | BetaRunnableTool): string {
93
+ return 'name' in tool ? tool.name : tool.mcp_server_name;
94
+ }
95
+
96
+ /**
97
+ * Format a thrown value into tool-result content: a {@link ToolError} carries
98
+ * its own structured content, anything else becomes an `Error: <message>`
99
+ * string. Shared so every `toolRunner()` surface reports tool failures the
100
+ * same way to the model.
101
+ */
102
+ export function toolErrorContent(e: unknown): string | Array<BetaToolResultContentBlockParam> {
103
+ return e instanceof ToolError ? e.content : `Error: ${e instanceof Error ? e.message : String(e)}`;
104
+ }
105
+
106
+ /** Outcome of {@link runRunnableTool}: the content to post back and whether it is an error. */
107
+ export interface RunnableToolOutcome {
108
+ content: string | Array<BetaToolResultContentBlockParam>;
109
+ isError: boolean;
110
+ }
111
+
112
+ /**
113
+ * Run a {@link BetaRunnableTool} end-to-end: parse the raw input, invoke `run`,
114
+ * and format any thrown value via {@link toolErrorContent}. Shared so the
115
+ * parse → run → catch → format pipeline is identical across `toolRunner()`
116
+ * surfaces.
117
+ */
118
+ export async function runRunnableTool(
119
+ tool: BetaRunnableTool,
120
+ rawInput: unknown,
121
+ context: BetaToolRunContext,
122
+ ): Promise<RunnableToolOutcome> {
123
+ try {
124
+ const input = tool.parse ? tool.parse(rawInput) : rawInput;
125
+ const content = await tool.run(input, context);
126
+ return { content, isError: false };
127
+ } catch (e) {
128
+ return { content: toolErrorContent(e), isError: true };
129
+ }
130
+ }
@@ -6,26 +6,10 @@ import { BetaMessage, BetaMessageParam, BetaToolUnion, MessageCreateParams } fro
6
6
  import { BetaMessageStream } from '../BetaMessageStream';
7
7
  import { RequestOptions } from '../../internal/request-options';
8
8
  import { buildHeaders } from '../../internal/headers';
9
+ import { promiseWithResolvers } from '../../internal/utils/promise';
9
10
  import { CompactionControl, DEFAULT_SUMMARY_PROMPT, DEFAULT_TOKEN_THRESHOLD } from './CompactionControl';
10
11
  import { collectStainlessHelpers } from '../stainless-helper-header';
11
12
 
12
- /**
13
- * Just Promise.withResolvers(), which is not available in all environments.
14
- */
15
- function promiseWithResolvers<T>(): {
16
- promise: Promise<T>;
17
- resolve: (value: T) => void;
18
- reject: (reason?: any) => void;
19
- } {
20
- let resolve: (value: T) => void;
21
- let reject: (reason?: any) => void;
22
- const promise = new Promise<T>((res, rej) => {
23
- resolve = res;
24
- reject = rej;
25
- });
26
- return { promise, resolve: resolve!, reject: reject! };
27
- }
28
-
29
13
  /**
30
14
  * A ToolRunner handles the automatic conversation loop between the assistant and tools.
31
15
  *
@@ -484,6 +468,7 @@ async function generateToolResponse(
484
468
  }
485
469
 
486
470
  const result = await tool.run(input, {
471
+ toolUse: toolUse,
487
472
  toolUseBlock: toolUse,
488
473
  signal: requestOptions?.signal,
489
474
  });