@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,746 @@
1
+ "use strict";
2
+ /**
3
+ * Node implementation of the `agent_toolset_20260401` tools — `bash`, `read`,
4
+ * `write`, `edit`, `glob`, `grep` — plus the workdir/skills
5
+ * {@link AgentToolContext}.
6
+ *
7
+ * This mirrors `@anthropic-ai/sdk/tools/memory/node`: it is the explicit,
8
+ * Node-only entry point for these implementations. Importing it pulls in
9
+ * `node:child_process`, `node:fs`, etc., so it is kept separate from the rest of
10
+ * the SDK — depending on it is an opt-in.
11
+ *
12
+ * **Node 22+ is required** for this module: the `glob` tool uses the native
13
+ * `fs.glob`, added in Node 22. The rest of the SDK still supports Node 18+; only
14
+ * the agent toolset has this requirement.
15
+ *
16
+ * The result of {@link betaAgentToolset20260401} is a plain `BetaRunnableTool[]`;
17
+ * hand it to any tool runner — `client.beta.messages.toolRunner({ …, tools })`
18
+ * for the Messages API, or `client.beta.sessions.events.toolRunner({ …, tools })`
19
+ * for a managed-agents session:
20
+ *
21
+ * ```ts
22
+ * import { betaAgentToolset20260401 } from '@anthropic-ai/sdk/tools/agent-toolset/node';
23
+ *
24
+ * const tools = betaAgentToolset20260401({ workdir: '/work' });
25
+ * const tools2 = betaAgentToolset20260401({ workdir: '/work' }).filter((t) => t.name !== 'bash');
26
+ * ```
27
+ *
28
+ * Trust model: the file tools confine to `workdir` (symlink-aware) and are safe
29
+ * without a sandbox; `bash` is unrestricted and should run inside one. See
30
+ * {@link AgentToolContext}.
31
+ */
32
+ var _BashSession_instances, _BashSession_proc, _BashSession_buf, _BashSession_truncated, _BashSession_closed, _BashSession_waiting, _BashSession_append;
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.BashSession = exports.extractSkillArchive = exports.resolveSkillVersion = exports.setupSkills = void 0;
35
+ exports.betaAgentToolset20260401 = betaAgentToolset20260401;
36
+ exports.resolvePath = resolvePath;
37
+ exports.betaBashTool = betaBashTool;
38
+ exports.betaReadTool = betaReadTool;
39
+ exports.betaWriteTool = betaWriteTool;
40
+ exports.betaEditTool = betaEditTool;
41
+ exports.betaGlobTool = betaGlobTool;
42
+ exports.betaGrepTool = betaGrepTool;
43
+ const tslib_1 = require("../../internal/tslib.js");
44
+ const fs = tslib_1.__importStar(require("node:fs/promises"));
45
+ const fssync = tslib_1.__importStar(require("node:fs"));
46
+ const path = tslib_1.__importStar(require("node:path"));
47
+ const cp = tslib_1.__importStar(require("node:child_process"));
48
+ const crypto = tslib_1.__importStar(require("node:crypto"));
49
+ const readline = tslib_1.__importStar(require("node:readline"));
50
+ const error_1 = require("../../core/error.js");
51
+ const ToolError_1 = require("../../lib/tools/ToolError.js");
52
+ const json_schema_1 = require("../../helpers/beta/json-schema.js");
53
+ const promise_1 = require("../../internal/utils/promise.js");
54
+ const fs_util_1 = require("./fs-util.js");
55
+ var skills_1 = require("./skills.js");
56
+ Object.defineProperty(exports, "setupSkills", { enumerable: true, get: function () { return skills_1.setupSkills; } });
57
+ Object.defineProperty(exports, "resolveSkillVersion", { enumerable: true, get: function () { return skills_1.resolveSkillVersion; } });
58
+ Object.defineProperty(exports, "extractSkillArchive", { enumerable: true, get: function () { return skills_1.extractSkillArchive; } });
59
+ const BASH_OUTPUT_LIMIT = 100 * 1024;
60
+ const BASH_DEFAULT_TIMEOUT_MS = 120000;
61
+ const READ_MAX_BYTES = 256 * 1024;
62
+ // `edit` reads the whole file before rewriting it, so it carries the same
63
+ // OOM/FIFO exposure as `read`. Kept as a symmetric alias for now; the cap value
64
+ // (and reject-vs-truncate behaviour) is intentionally a separate knob pending
65
+ // validation with the CMA team.
66
+ const EDIT_MAX_BYTES = READ_MAX_BYTES;
67
+ const GREP_OUTPUT_LIMIT = 100 * 1024;
68
+ const GREP_MAX_LINE_LENGTH = 2000;
69
+ const GLOB_RESULT_LIMIT = 200;
70
+ const ANSI_RE = /\x1b\[[0-9;?]*[ -/]*[@-~]/g;
71
+ const fsGlob = fs.glob;
72
+ /**
73
+ * Returns the `agent_toolset_20260401` implementations bound to `ctx`. The
74
+ * result is a plain array of `BetaRunnableTool`; filter or extend it before
75
+ * handing it to a tool runner:
76
+ *
77
+ * ```ts
78
+ * const tools = [...betaAgentToolset20260401(ctx), myCustomTool];
79
+ * const tools = betaAgentToolset20260401(ctx).filter((t) => t.name !== 'grep');
80
+ * ```
81
+ *
82
+ * Concurrency note: `client.beta.sessions.events.toolRunner` dispatches a
83
+ * session's tool calls serially (the sessions API delivers one `agent.tool_use`
84
+ * at a time). `client.beta.messages.toolRunner` runs a turn's `tool.run` calls
85
+ * via `Promise.all`. The toolset below is safe under either model —
86
+ * {@link betaBashTool} serializes its persistent shell internally and the FS
87
+ * tools are independent per call — but {@link betaEditTool}/{@link betaWriteTool}
88
+ * cannot synchronize concurrent writes to the *same* file across processes, so a
89
+ * multi-edit turn touching one path is still subject to inherent FS lost-update
90
+ * races. Custom tools that close over mutable state should do their own queueing.
91
+ */
92
+ function betaAgentToolset20260401(ctx) {
93
+ return [
94
+ betaBashTool(ctx),
95
+ betaReadTool(ctx),
96
+ betaWriteTool(ctx),
97
+ betaEditTool(ctx),
98
+ betaGlobTool(ctx),
99
+ betaGrepTool(ctx),
100
+ ];
101
+ }
102
+ /**
103
+ * Resolve `p` relative to `ctx.workdir`. Unless `unrestrictedPaths` is set,
104
+ * absolute inputs are rejected and the **canonical** path is returned — every
105
+ * symlink in `p` (including the leaf, even a dangling one) is resolved before
106
+ * the workdir check, and the resolved path is what the tool then operates on, so
107
+ * a symlink inside the workdir that points outside it can neither pass the check
108
+ * nor be followed afterwards. See the trust model on {@link AgentToolContext}.
109
+ *
110
+ * Residual TOCTOU: a component could still be swapped for a symlink between this
111
+ * call and the eventual `fs` operation. Closing that fully needs per-component
112
+ * `O_NOFOLLOW`/`openat`, which Node does not expose ergonomically; the same
113
+ * residual exposure exists in `tools/memory/node` and is why a sandbox is still
114
+ * recommended for the toolset as a whole.
115
+ */
116
+ function resolvePath(ctx, p) {
117
+ return (0, fs_util_1.confineToRoot)(ctx.workdir, p, { allowOutside: ctx.unrestrictedPaths ?? false });
118
+ }
119
+ // ---- bash ----------------------------------------------------------------
120
+ /**
121
+ * Build the environment for the spawned bash shell. The runner process holds
122
+ * Anthropic credentials in `ANTHROPIC_*` env vars — the API key, the auth token,
123
+ * and the per-work session token among them. `bash` runs an unrestricted shell,
124
+ * so any command the agent runs could read those straight out of `process.env`;
125
+ * strip the whole `ANTHROPIC_*` namespace from the child's environment.
126
+ * Everything else (PATH, HOME, locale, …) is passed through unchanged.
127
+ *
128
+ * Passing an explicit `env` to {@link AgentToolContext} does NOT add to this
129
+ * default — it FULLY REPLACES it. The provided mapping becomes the entire bash
130
+ * environment verbatim; nothing here is merged in, so callers who want the
131
+ * scrubbed process environment plus extras must build that mapping themselves.
132
+ */
133
+ function scrubbedShellEnv() {
134
+ const env = {};
135
+ for (const [key, value] of Object.entries(process.env)) {
136
+ if (key.startsWith('ANTHROPIC_'))
137
+ continue;
138
+ env[key] = value;
139
+ }
140
+ return env;
141
+ }
142
+ /**
143
+ * A persistent /bin/bash process. State (cwd, env, background jobs) survives
144
+ * across exec() calls. Uses pipes rather than a PTY so input is never echoed.
145
+ */
146
+ class BashSession {
147
+ constructor(dir, env = scrubbedShellEnv()) {
148
+ _BashSession_instances.add(this);
149
+ _BashSession_proc.set(this, void 0);
150
+ _BashSession_buf.set(this, '');
151
+ _BashSession_truncated.set(this, false);
152
+ _BashSession_closed.set(this, false);
153
+ // While a command is in flight, the resolver to fire once its sentinel lands
154
+ // in `#buf` (or once the shell dies). Event-driven: no polling loop.
155
+ _BashSession_waiting.set(this, null);
156
+ tslib_1.__classPrivateFieldSet(this, _BashSession_proc, cp.spawn('/bin/bash', ['--noprofile', '--norc'], {
157
+ cwd: dir,
158
+ // `env` is the full base environment (the scrubbed process env by
159
+ // default, or the verbatim replacement from `AgentToolContext.env`).
160
+ // PS1/PS2/TERM are shell-control settings BashSession always applies so
161
+ // the pipe-based sentinel exec parsing works — not part of the
162
+ // user-facing environment.
163
+ env: { ...env, PS1: '', PS2: '', TERM: 'dumb' },
164
+ stdio: ['pipe', 'pipe', 'pipe'],
165
+ detached: true,
166
+ }), "f");
167
+ tslib_1.__classPrivateFieldGet(this, _BashSession_proc, "f").stdout.setEncoding('utf8');
168
+ tslib_1.__classPrivateFieldGet(this, _BashSession_proc, "f").stderr.setEncoding('utf8');
169
+ tslib_1.__classPrivateFieldGet(this, _BashSession_proc, "f").stdout.on('data', (d) => tslib_1.__classPrivateFieldGet(this, _BashSession_instances, "m", _BashSession_append).call(this, d));
170
+ tslib_1.__classPrivateFieldGet(this, _BashSession_proc, "f").stderr.on('data', (d) => tslib_1.__classPrivateFieldGet(this, _BashSession_instances, "m", _BashSession_append).call(this, d));
171
+ tslib_1.__classPrivateFieldGet(this, _BashSession_proc, "f").once('close', () => {
172
+ tslib_1.__classPrivateFieldSet(this, _BashSession_closed, true, "f");
173
+ // Wake any in-flight exec so it fails fast instead of waiting for its deadline.
174
+ const w = tslib_1.__classPrivateFieldGet(this, _BashSession_waiting, "f");
175
+ tslib_1.__classPrivateFieldSet(this, _BashSession_waiting, null, "f");
176
+ w?.resolve();
177
+ });
178
+ }
179
+ /** Whether the underlying shell process has exited. */
180
+ get closed() {
181
+ return tslib_1.__classPrivateFieldGet(this, _BashSession_closed, "f");
182
+ }
183
+ async exec(command, opts = {}) {
184
+ if (tslib_1.__classPrivateFieldGet(this, _BashSession_closed, "f")) {
185
+ throw new error_1.AnthropicError('bash session terminated');
186
+ }
187
+ const timeoutMs = opts.timeoutMs ?? BASH_DEFAULT_TIMEOUT_MS;
188
+ const signal = opts.signal;
189
+ if (signal?.aborted) {
190
+ throw new error_1.AnthropicError('bash command aborted');
191
+ }
192
+ tslib_1.__classPrivateFieldSet(this, _BashSession_buf, '', "f");
193
+ tslib_1.__classPrivateFieldSet(this, _BashSession_truncated, false, "f");
194
+ // Per-call nonce so a command that prints a fixed marker can't spoof the
195
+ // exit-code framing. The `''` split keeps the literal out of what we write
196
+ // to stdin — only the shell's printf reassembles it.
197
+ const sentinel = `__ANT_CMD_${crypto.randomUUID()}_DONE__`;
198
+ const sentinelSplit = `${sentinel.slice(0, 8)}''${sentinel.slice(8)}`;
199
+ // </dev/null: a stdin-reading command (`cat`, `read`) gets EOF instead of
200
+ // blocking on the shared pipe until the timeout.
201
+ const wrapped = `{ ${command}\n} </dev/null 2>&1; printf '\\n${sentinelSplit}%d\\n' $?\n`;
202
+ tslib_1.__classPrivateFieldGet(this, _BashSession_proc, "f").stdin.write(wrapped);
203
+ if (tslib_1.__classPrivateFieldGet(this, _BashSession_buf, "f").indexOf(sentinel) < 0) {
204
+ // Park until the sentinel lands, the deadline passes, the caller aborts,
205
+ // or the shell dies — whichever comes first. `#append` (and the `close`
206
+ // handler) resolve `sentinelSeen`; the deadline / abort reject.
207
+ const { promise: sentinelSeen, resolve } = (0, promise_1.promiseWithResolvers)();
208
+ tslib_1.__classPrivateFieldSet(this, _BashSession_waiting, { sentinel, resolve }, "f");
209
+ let timer;
210
+ let onAbort;
211
+ try {
212
+ await Promise.race([
213
+ sentinelSeen,
214
+ new Promise((_, reject) => {
215
+ timer = setTimeout(() => reject(new error_1.AnthropicError(`bash command timed out after ${timeoutMs}ms`)), timeoutMs);
216
+ }),
217
+ new Promise((_, reject) => {
218
+ if (!signal)
219
+ return;
220
+ onAbort = () => reject(new error_1.AnthropicError('bash command aborted'));
221
+ signal.addEventListener('abort', onAbort, { once: true });
222
+ }),
223
+ ]);
224
+ }
225
+ finally {
226
+ if (timer)
227
+ clearTimeout(timer);
228
+ if (onAbort && signal)
229
+ signal.removeEventListener('abort', onAbort);
230
+ tslib_1.__classPrivateFieldSet(this, _BashSession_waiting, null, "f");
231
+ }
232
+ }
233
+ const idx = tslib_1.__classPrivateFieldGet(this, _BashSession_buf, "f").indexOf(sentinel);
234
+ if (idx < 0) {
235
+ // The shell closed (or was killed) before emitting the sentinel.
236
+ throw new error_1.AnthropicError('bash session terminated');
237
+ }
238
+ const tail = tslib_1.__classPrivateFieldGet(this, _BashSession_buf, "f").slice(idx + sentinel.length);
239
+ const m = tail.match(/^(-?\d+)/);
240
+ const exitCode = m ? parseInt(m[1], 10) : -1;
241
+ let out = tslib_1.__classPrivateFieldGet(this, _BashSession_buf, "f").slice(0, idx).replace(ANSI_RE, '').replace(/\n+$/, '');
242
+ if (tslib_1.__classPrivateFieldGet(this, _BashSession_truncated, "f")) {
243
+ out = `[output truncated]\n${out}`;
244
+ }
245
+ return { output: out, exitCode };
246
+ }
247
+ close() {
248
+ if (tslib_1.__classPrivateFieldGet(this, _BashSession_closed, "f"))
249
+ return;
250
+ tslib_1.__classPrivateFieldSet(this, _BashSession_closed, true, "f");
251
+ const w = tslib_1.__classPrivateFieldGet(this, _BashSession_waiting, "f");
252
+ tslib_1.__classPrivateFieldSet(this, _BashSession_waiting, null, "f");
253
+ w?.resolve();
254
+ tslib_1.__classPrivateFieldGet(this, _BashSession_proc, "f").stdout.destroy();
255
+ tslib_1.__classPrivateFieldGet(this, _BashSession_proc, "f").stderr.destroy();
256
+ tslib_1.__classPrivateFieldGet(this, _BashSession_proc, "f").stdin.destroy();
257
+ try {
258
+ // Negative PID targets the process group so foreground jobs (e.g. a
259
+ // hung sleep) die with the shell.
260
+ process.kill(-tslib_1.__classPrivateFieldGet(this, _BashSession_proc, "f").pid, 'SIGKILL');
261
+ }
262
+ catch {
263
+ tslib_1.__classPrivateFieldGet(this, _BashSession_proc, "f").kill('SIGKILL');
264
+ }
265
+ tslib_1.__classPrivateFieldGet(this, _BashSession_proc, "f").unref();
266
+ }
267
+ }
268
+ exports.BashSession = BashSession;
269
+ _BashSession_proc = new WeakMap(), _BashSession_buf = new WeakMap(), _BashSession_truncated = new WeakMap(), _BashSession_closed = new WeakMap(), _BashSession_waiting = new WeakMap(), _BashSession_instances = new WeakSet(), _BashSession_append = function _BashSession_append(d) {
270
+ tslib_1.__classPrivateFieldSet(this, _BashSession_buf, tslib_1.__classPrivateFieldGet(this, _BashSession_buf, "f") + d, "f");
271
+ if (tslib_1.__classPrivateFieldGet(this, _BashSession_buf, "f").length > BASH_OUTPUT_LIMIT) {
272
+ tslib_1.__classPrivateFieldSet(this, _BashSession_buf, tslib_1.__classPrivateFieldGet(this, _BashSession_buf, "f").slice(tslib_1.__classPrivateFieldGet(this, _BashSession_buf, "f").length - BASH_OUTPUT_LIMIT), "f");
273
+ tslib_1.__classPrivateFieldSet(this, _BashSession_truncated, true, "f");
274
+ }
275
+ if (tslib_1.__classPrivateFieldGet(this, _BashSession_waiting, "f") && tslib_1.__classPrivateFieldGet(this, _BashSession_buf, "f").indexOf(tslib_1.__classPrivateFieldGet(this, _BashSession_waiting, "f").sentinel) >= 0) {
276
+ const w = tslib_1.__classPrivateFieldGet(this, _BashSession_waiting, "f");
277
+ tslib_1.__classPrivateFieldSet(this, _BashSession_waiting, null, "f");
278
+ w.resolve();
279
+ }
280
+ };
281
+ function betaBashTool(ctx) {
282
+ let session;
283
+ // Concurrent run() callers chain onto this promise so writes to the shared
284
+ // shell's stdin can't interleave (which would corrupt the sentinel-match
285
+ // exit-code parsing in BashSession.exec). Each call replaces `tail` with a
286
+ // promise that resolves only after its own exec settles.
287
+ let tail = Promise.resolve();
288
+ return (0, json_schema_1.betaTool)({
289
+ name: 'bash',
290
+ description: 'Run a bash command in a persistent shell. State (cwd, env vars) persists across calls.',
291
+ inputSchema: {
292
+ type: 'object',
293
+ properties: {
294
+ command: { type: 'string', description: 'The command to run' },
295
+ restart: { type: 'boolean', description: 'Restart the persistent shell before running' },
296
+ timeout_ms: { type: 'integer', description: 'Per-call timeout in milliseconds' },
297
+ },
298
+ },
299
+ run: async ({ command, restart, timeout_ms }, context) => {
300
+ const prev = tail;
301
+ const gate = (0, promise_1.promiseWithResolvers)();
302
+ tail = gate.promise;
303
+ // Swallow prior rejections — earlier callers got their own error path;
304
+ // we just need to wait for the shell to be free.
305
+ try {
306
+ await prev;
307
+ }
308
+ catch {
309
+ // ignore
310
+ }
311
+ try {
312
+ if (restart) {
313
+ session?.close();
314
+ session = undefined;
315
+ }
316
+ if (!command) {
317
+ if (restart)
318
+ return 'bash session restarted';
319
+ throw new ToolError_1.ToolError('bash: command is required');
320
+ }
321
+ session ?? (session = new BashSession(ctx.workdir, ctx.env));
322
+ try {
323
+ const { output, exitCode } = await session.exec(command, {
324
+ timeoutMs: timeout_ms ?? BASH_DEFAULT_TIMEOUT_MS,
325
+ signal: context?.signal,
326
+ });
327
+ if (exitCode !== 0)
328
+ throw new ToolError_1.ToolError(output || `exit ${exitCode}`);
329
+ return output;
330
+ }
331
+ catch (e) {
332
+ if (e instanceof ToolError_1.ToolError)
333
+ throw e;
334
+ // Timeout, abort, or terminated: the still-running command will emit
335
+ // a stale sentinel, so discard this session and let the next call
336
+ // start fresh.
337
+ session.close();
338
+ session = undefined;
339
+ throw new ToolError_1.ToolError(`bash: ${e instanceof Error ? e.message : String(e)}`);
340
+ }
341
+ }
342
+ finally {
343
+ gate.resolve();
344
+ }
345
+ },
346
+ close: () => {
347
+ session?.close();
348
+ session = undefined;
349
+ },
350
+ });
351
+ }
352
+ // ---- fs ------------------------------------------------------------------
353
+ function betaReadTool(ctx) {
354
+ return (0, json_schema_1.betaTool)({
355
+ name: 'read',
356
+ description: 'Read a UTF-8 text file relative to the workdir.',
357
+ inputSchema: {
358
+ type: 'object',
359
+ properties: {
360
+ file_path: { type: 'string' },
361
+ view_range: {
362
+ type: 'array',
363
+ items: { type: 'integer' },
364
+ description: '[start_line, end_line] 1-indexed inclusive',
365
+ },
366
+ },
367
+ required: ['file_path'],
368
+ },
369
+ run: async ({ file_path, view_range }) => {
370
+ if (!file_path)
371
+ throw new ToolError_1.ToolError('read: file_path is required');
372
+ const abs = await resolvePath(ctx, file_path);
373
+ let data;
374
+ try {
375
+ // stat() before any open(): the size cap stops a multi-GB file from
376
+ // OOM'ing the runner, and isFile() rejects FIFOs/devices/dirs without
377
+ // opening them (open() on an unconnected FIFO blocks indefinitely).
378
+ const st = await fs.stat(abs);
379
+ if (!st.isFile()) {
380
+ throw new ToolError_1.ToolError(`read: ${file_path} is not a regular file`);
381
+ }
382
+ if (st.size > READ_MAX_BYTES) {
383
+ throw new ToolError_1.ToolError(`read: ${file_path} is ${st.size} bytes, exceeds ${READ_MAX_BYTES}-byte limit. ` +
384
+ 'Use bash (head/tail/sed) to read a slice.');
385
+ }
386
+ data = await fs.readFile(abs, 'utf8');
387
+ }
388
+ catch (e) {
389
+ if (e instanceof ToolError_1.ToolError)
390
+ throw e;
391
+ throw new ToolError_1.ToolError(`read: ${(0, fs_util_1.fsErrorMessage)(e, file_path)}`);
392
+ }
393
+ if (!view_range)
394
+ return data;
395
+ if (view_range.length !== 2)
396
+ throw new ToolError_1.ToolError('read: view_range must be [start_line, end_line]');
397
+ const [startLine, endLine] = view_range;
398
+ const lines = data.split('\n');
399
+ const start = Math.max(0, startLine - 1);
400
+ const end = endLine > 0 ? endLine : lines.length;
401
+ return lines.slice(start, end).join('\n');
402
+ },
403
+ });
404
+ }
405
+ function betaWriteTool(ctx) {
406
+ return (0, json_schema_1.betaTool)({
407
+ name: 'write',
408
+ description: 'Write a UTF-8 text file relative to the workdir, creating parent directories as needed.',
409
+ inputSchema: {
410
+ type: 'object',
411
+ properties: { file_path: { type: 'string' }, content: { type: 'string' } },
412
+ required: ['file_path', 'content'],
413
+ },
414
+ run: async ({ file_path, content }) => {
415
+ if (!file_path)
416
+ throw new ToolError_1.ToolError('write: file_path is required');
417
+ const abs = await resolvePath(ctx, file_path);
418
+ try {
419
+ await fs.mkdir(path.dirname(abs), { recursive: true, mode: fs_util_1.DIR_CREATE_MODE });
420
+ await (0, fs_util_1.atomicWriteFile)(abs, content ?? '');
421
+ }
422
+ catch (e) {
423
+ throw new ToolError_1.ToolError(`write: ${(0, fs_util_1.fsErrorMessage)(e, file_path)}`);
424
+ }
425
+ return `wrote ${Buffer.byteLength(content ?? '')} bytes to ${file_path}`;
426
+ },
427
+ });
428
+ }
429
+ function betaEditTool(ctx) {
430
+ return (0, json_schema_1.betaTool)({
431
+ name: 'edit',
432
+ description: 'Replace old_string with new_string in a file. old_string must be unique unless replace_all.',
433
+ inputSchema: {
434
+ type: 'object',
435
+ properties: {
436
+ file_path: { type: 'string' },
437
+ old_string: { type: 'string' },
438
+ new_string: { type: 'string' },
439
+ replace_all: { type: 'boolean' },
440
+ },
441
+ required: ['file_path', 'old_string', 'new_string'],
442
+ },
443
+ run: async ({ file_path, old_string, new_string, replace_all }) => {
444
+ if (!file_path)
445
+ throw new ToolError_1.ToolError('edit: file_path is required');
446
+ if (!old_string)
447
+ throw new ToolError_1.ToolError('edit: old_string is required');
448
+ const abs = await resolvePath(ctx, file_path);
449
+ let data;
450
+ try {
451
+ // stat() before any open() — same guard as `read`: the size cap stops a
452
+ // multi-GB file from OOM'ing the runner, and isFile() rejects
453
+ // FIFOs/devices/dirs without opening them (open() on an unconnected FIFO
454
+ // blocks indefinitely). The edit path is model-controlled, so it needs
455
+ // the same bound `read` already has.
456
+ const st = await fs.stat(abs);
457
+ if (!st.isFile()) {
458
+ throw new ToolError_1.ToolError(`edit: ${file_path} is not a regular file`);
459
+ }
460
+ if (st.size > EDIT_MAX_BYTES) {
461
+ throw new ToolError_1.ToolError(`edit: ${file_path} is ${st.size} bytes, exceeds ${EDIT_MAX_BYTES}-byte limit. ` +
462
+ 'Use bash (sed/awk) to edit a large file.');
463
+ }
464
+ data = await fs.readFile(abs, 'utf8');
465
+ }
466
+ catch (e) {
467
+ if (e instanceof ToolError_1.ToolError)
468
+ throw e;
469
+ throw new ToolError_1.ToolError(`edit: ${(0, fs_util_1.fsErrorMessage)(e, file_path)}`);
470
+ }
471
+ const count = data.split(old_string).length - 1;
472
+ if (count === 0)
473
+ throw new ToolError_1.ToolError(`edit: old_string not found in ${file_path}`);
474
+ let updated;
475
+ if (replace_all) {
476
+ updated = data.split(old_string).join(new_string);
477
+ }
478
+ else {
479
+ if (count > 1)
480
+ throw new ToolError_1.ToolError(`edit: old_string appears ${count} times in ${file_path} (must be unique)`);
481
+ // Callback form so `$&`/`$1`/`` $` `` in new_string are inserted
482
+ // literally instead of expanded as replacement patterns.
483
+ updated = data.replace(old_string, () => new_string);
484
+ }
485
+ try {
486
+ await (0, fs_util_1.atomicWriteFile)(abs, updated);
487
+ }
488
+ catch (e) {
489
+ throw new ToolError_1.ToolError(`edit: write: ${(0, fs_util_1.fsErrorMessage)(e, file_path)}`);
490
+ }
491
+ return `edited ${file_path} (${replace_all ? count : 1} replacement(s))`;
492
+ },
493
+ });
494
+ }
495
+ // ---- search --------------------------------------------------------------
496
+ function betaGlobTool(ctx) {
497
+ return (0, json_schema_1.betaTool)({
498
+ name: 'glob',
499
+ description: 'Match files under the workdir against a glob pattern. Results are mtime-sorted, newest first.',
500
+ inputSchema: {
501
+ type: 'object',
502
+ properties: {
503
+ pattern: { type: 'string' },
504
+ path: { type: 'string', description: 'Directory to search in. Defaults to the workdir.' },
505
+ },
506
+ required: ['pattern'],
507
+ },
508
+ run: async ({ pattern, path: searchPath }) => {
509
+ if (!pattern)
510
+ throw new ToolError_1.ToolError('glob: pattern is required');
511
+ let root = path.resolve(ctx.workdir);
512
+ let pat = pattern;
513
+ if (path.isAbsolute(pattern)) {
514
+ if (!ctx.unrestrictedPaths)
515
+ throw new ToolError_1.ToolError('glob: absolute pattern not permitted');
516
+ root = path.parse(pattern).root;
517
+ pat = path.relative(root, pattern);
518
+ }
519
+ else if (searchPath) {
520
+ root = await resolvePath(ctx, searchPath);
521
+ }
522
+ // A `..` in the *pattern itself* (e.g. `../../*`) walks `fs.glob` out of
523
+ // the search root — this is separate from the `searchPath` confinement
524
+ // above, which only covers the path argument. Reject it outright when the
525
+ // toolset is confined.
526
+ if (!ctx.unrestrictedPaths && pat.split(/[\\/]/).includes('..')) {
527
+ throw new ToolError_1.ToolError('glob: ".." is not permitted in the pattern');
528
+ }
529
+ const matches = [];
530
+ try {
531
+ // Native `fs.glob` (Node 22+). `exclude` prunes the noisy dirs the
532
+ // legacy walker skipped; only regular files are collected.
533
+ for await (const entry of fsGlob(pat, {
534
+ cwd: root,
535
+ withFileTypes: true,
536
+ exclude: (d) => d.name === '.git' || d.name === 'node_modules',
537
+ })) {
538
+ if (!entry.isFile())
539
+ continue;
540
+ const full = path.join(entry.parentPath, entry.name);
541
+ // Defense in depth: drop any match that resolved outside the search
542
+ // root (e.g. via a symlinked directory in the tree) when confined.
543
+ if (!ctx.unrestrictedPaths && !isWithin(root, full))
544
+ continue;
545
+ let mtime = 0;
546
+ try {
547
+ mtime = (await fs.stat(full)).mtimeMs;
548
+ }
549
+ catch {
550
+ // unreadable — keep it in the list with mtime 0
551
+ }
552
+ matches.push({ path: full, mtime });
553
+ }
554
+ }
555
+ catch (e) {
556
+ throw new ToolError_1.ToolError(`glob: ${e instanceof Error ? e.message : String(e)}`);
557
+ }
558
+ if (matches.length === 0)
559
+ return 'no matches';
560
+ matches.sort((a, b) => b.mtime - a.mtime);
561
+ return matches
562
+ .slice(0, GLOB_RESULT_LIMIT)
563
+ .map((m) => m.path)
564
+ .join('\n');
565
+ },
566
+ });
567
+ }
568
+ function betaGrepTool(ctx) {
569
+ return (0, json_schema_1.betaTool)({
570
+ name: 'grep',
571
+ description: 'Search file contents for a regex. Uses ripgrep if available, otherwise a built-in walker.',
572
+ inputSchema: {
573
+ type: 'object',
574
+ properties: { pattern: { type: 'string' }, path: { type: 'string' } },
575
+ required: ['pattern'],
576
+ },
577
+ run: async ({ pattern, path: p }, context) => {
578
+ if (!pattern)
579
+ throw new ToolError_1.ToolError('grep: pattern is required');
580
+ let searchPath = path.resolve(ctx.workdir);
581
+ if (p)
582
+ searchPath = await resolvePath(ctx, p);
583
+ const rg = await findRg();
584
+ return rg ?
585
+ runRipgrep(rg, pattern, searchPath, context?.signal)
586
+ : runWalkGrep(pattern, searchPath, context?.signal);
587
+ },
588
+ });
589
+ }
590
+ function runRipgrep(rg, pattern, searchPath, signal) {
591
+ return new Promise((resolve, reject) => {
592
+ const proc = cp.spawn(rg, ['-n', '--no-heading', '-e', pattern, '--', searchPath], {
593
+ ...(signal ? { signal } : {}),
594
+ });
595
+ let out = '';
596
+ let errOut = '';
597
+ let truncated = false;
598
+ proc.stdout.on('data', (d) => {
599
+ if (truncated)
600
+ return;
601
+ out += d;
602
+ if (out.length > GREP_OUTPUT_LIMIT) {
603
+ truncated = true;
604
+ out = out.slice(0, GREP_OUTPUT_LIMIT);
605
+ proc.kill('SIGKILL');
606
+ }
607
+ });
608
+ proc.stderr.on('data', (d) => (errOut += d));
609
+ proc.on('close', (code) => {
610
+ if (signal?.aborted)
611
+ return reject(new ToolError_1.ToolError('grep: aborted'));
612
+ if (truncated)
613
+ return resolve(out + `\n[output truncated at ${GREP_OUTPUT_LIMIT} bytes]`);
614
+ if (code === 0)
615
+ return resolve(out);
616
+ if (code === 1)
617
+ return resolve('no matches');
618
+ reject(new ToolError_1.ToolError(`grep: rg failed: ${errOut || `exit ${code}`}`));
619
+ });
620
+ proc.on('error', (e) => {
621
+ if (signal?.aborted)
622
+ return reject(new ToolError_1.ToolError('grep: aborted'));
623
+ reject(new ToolError_1.ToolError(`grep: rg failed: ${e.message}`));
624
+ });
625
+ });
626
+ }
627
+ async function runWalkGrep(pattern, root, signal) {
628
+ let re;
629
+ try {
630
+ re = new RegExp(pattern);
631
+ }
632
+ catch (e) {
633
+ throw new ToolError_1.ToolError(`grep: invalid regex: ${e instanceof Error ? e.message : String(e)}`);
634
+ }
635
+ const hits = [];
636
+ let budget = GREP_OUTPUT_LIMIT;
637
+ const push = (line) => {
638
+ budget -= line.length + 1;
639
+ if (budget < 0) {
640
+ hits.push(`[output truncated at ${GREP_OUTPUT_LIMIT} bytes]`);
641
+ return false;
642
+ }
643
+ hits.push(line);
644
+ return true;
645
+ };
646
+ const stat = await fs.stat(root).catch(() => null);
647
+ if (stat?.isFile()) {
648
+ await grepFile(root, re, push);
649
+ }
650
+ else {
651
+ await walk(root, '', (rel) => grepFile(path.join(root, rel), re, push), signal);
652
+ }
653
+ if (signal?.aborted)
654
+ throw new ToolError_1.ToolError('grep: aborted');
655
+ if (hits.length === 0)
656
+ return 'no matches';
657
+ return hits.join('\n');
658
+ }
659
+ async function grepFile(file, re, push) {
660
+ const stream = fssync.createReadStream(file, { encoding: 'utf8' });
661
+ const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
662
+ let i = 0;
663
+ try {
664
+ for await (const line of rl) {
665
+ i++;
666
+ // Cap line length: `pattern` is model-supplied and JS regexes backtrack,
667
+ // so a pathological pattern against a very long line is a ReDoS.
668
+ if (line.length > GREP_MAX_LINE_LENGTH)
669
+ continue;
670
+ if (re.test(line) && !push(`${file}:${i}:${line}`))
671
+ return false;
672
+ }
673
+ }
674
+ catch {
675
+ // unreadable / binary
676
+ }
677
+ finally {
678
+ stream.destroy();
679
+ }
680
+ return true;
681
+ }
682
+ // ---- utils ---------------------------------------------------------------
683
+ /** True when `p` is `root` itself or lexically contained within it. */
684
+ function isWithin(root, p) {
685
+ const rel = path.relative(root, p);
686
+ return rel === '' || (!rel.startsWith('..' + path.sep) && rel !== '..' && !path.isAbsolute(rel));
687
+ }
688
+ const WALK_MAX_DEPTH = 40;
689
+ const WALK_MAX_ENTRIES = 50000;
690
+ /**
691
+ * Bounded recursive walk. `fn` may return `false` to abort. Only real
692
+ * directories are descended into and only real files are handed to `fn` —
693
+ * symlinks (and devices/fifos/sockets) are skipped entirely so a symlink inside
694
+ * the root cannot be followed out of it.
695
+ */
696
+ async function walk(root, rel, fn, signal) {
697
+ let remaining = WALK_MAX_ENTRIES;
698
+ async function inner(rel, depth) {
699
+ if (depth > WALK_MAX_DEPTH)
700
+ return true;
701
+ if (signal?.aborted)
702
+ return false;
703
+ let entries;
704
+ try {
705
+ entries = await fs.readdir(path.join(root, rel), { withFileTypes: true });
706
+ }
707
+ catch {
708
+ return true;
709
+ }
710
+ for (const e of entries) {
711
+ if (e.name === '.git' || e.name === 'node_modules')
712
+ continue;
713
+ if (remaining-- <= 0)
714
+ return false;
715
+ if (signal?.aborted)
716
+ return false;
717
+ const childRel = rel ? path.join(rel, e.name) : e.name;
718
+ if (e.isDirectory()) {
719
+ if (!(await inner(childRel, depth + 1)))
720
+ return false;
721
+ }
722
+ else if (e.isFile()) {
723
+ if ((await fn(childRel)) === false)
724
+ return false;
725
+ }
726
+ // Symlinks, devices, fifos and sockets are intentionally skipped.
727
+ }
728
+ return true;
729
+ }
730
+ await inner(rel, 0);
731
+ }
732
+ async function findRg() {
733
+ const dirs = (process.env['PATH'] ?? '').split(path.delimiter);
734
+ for (const d of dirs) {
735
+ const candidate = path.join(d, 'rg');
736
+ try {
737
+ await fs.access(candidate, fssync.constants.X_OK);
738
+ return candidate;
739
+ }
740
+ catch {
741
+ // not here
742
+ }
743
+ }
744
+ return null;
745
+ }
746
+ //# sourceMappingURL=node.js.map