@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.
- package/CHANGELOG.md +37 -0
- package/api-promise.d.mts +1 -0
- package/api-promise.d.mts.map +1 -1
- package/api-promise.d.ts +1 -0
- package/api-promise.d.ts.map +1 -1
- package/api-promise.mjs +1 -0
- package/api-promise.mjs.map +1 -1
- package/bin/migration-config.json +222 -0
- package/client.d.mts.map +1 -1
- package/client.d.ts.map +1 -1
- package/client.mjs.map +1 -1
- package/core/api-promise.d.mts.map +1 -1
- package/core/api-promise.d.ts.map +1 -1
- package/core/api-promise.mjs.map +1 -1
- package/core/credentials.mjs.map +1 -1
- package/core/error.d.mts.map +1 -1
- package/core/error.d.ts.map +1 -1
- package/core/error.mjs.map +1 -1
- package/core/pagination.d.mts.map +1 -1
- package/core/pagination.d.ts.map +1 -1
- package/core/pagination.mjs.map +1 -1
- package/core/resource.d.mts.map +1 -1
- package/core/resource.d.ts.map +1 -1
- package/core/streaming.d.mts.map +1 -1
- package/core/streaming.d.ts.map +1 -1
- package/core/streaming.js +2 -0
- package/core/streaming.js.map +1 -1
- package/core/streaming.mjs +2 -0
- package/core/streaming.mjs.map +1 -1
- package/core/uploads.d.mts.map +1 -1
- package/core/uploads.d.ts.map +1 -1
- package/core/uploads.mjs.map +1 -1
- package/error.d.mts +1 -0
- package/error.d.mts.map +1 -1
- package/error.d.ts +1 -0
- package/error.d.ts.map +1 -1
- package/error.mjs +1 -0
- package/error.mjs.map +1 -1
- package/helpers/beta/environments.d.mts +22 -0
- package/helpers/beta/environments.d.mts.map +1 -0
- package/helpers/beta/environments.d.ts +22 -0
- package/helpers/beta/environments.d.ts.map +1 -0
- package/helpers/beta/environments.js +30 -0
- package/helpers/beta/environments.js.map +1 -0
- package/helpers/beta/environments.mjs +22 -0
- package/helpers/beta/environments.mjs.map +1 -0
- package/helpers/beta/json-schema.d.mts +6 -0
- package/helpers/beta/json-schema.d.mts.map +1 -1
- package/helpers/beta/json-schema.d.ts +6 -0
- package/helpers/beta/json-schema.d.ts.map +1 -1
- package/helpers/beta/json-schema.js +1 -0
- package/helpers/beta/json-schema.js.map +1 -1
- package/helpers/beta/json-schema.mjs +1 -0
- package/helpers/beta/json-schema.mjs.map +1 -1
- package/helpers/beta/mcp.d.mts.map +1 -1
- package/helpers/beta/mcp.d.ts.map +1 -1
- package/helpers/beta/mcp.mjs.map +1 -1
- package/helpers/beta/memory.d.mts.map +1 -1
- package/helpers/beta/memory.d.ts.map +1 -1
- package/helpers/beta/zod.d.mts +11 -5
- package/helpers/beta/zod.d.mts.map +1 -1
- package/helpers/beta/zod.d.ts +11 -5
- package/helpers/beta/zod.d.ts.map +1 -1
- package/helpers/beta/zod.js +1 -0
- package/helpers/beta/zod.js.map +1 -1
- package/helpers/beta/zod.mjs +1 -0
- package/helpers/beta/zod.mjs.map +1 -1
- package/helpers/index.d.mts.map +1 -1
- package/helpers/index.d.ts.map +1 -1
- package/helpers/index.mjs.map +1 -1
- package/helpers/json-schema.d.mts.map +1 -1
- package/helpers/json-schema.d.ts.map +1 -1
- package/helpers/json-schema.mjs.map +1 -1
- package/helpers/zod.d.mts +2 -2
- package/helpers/zod.d.mts.map +1 -1
- package/helpers/zod.d.ts +2 -2
- package/helpers/zod.d.ts.map +1 -1
- package/helpers/zod.js.map +1 -1
- package/helpers/zod.mjs.map +1 -1
- package/index.d.mts.map +1 -1
- package/index.d.ts.map +1 -1
- package/index.mjs.map +1 -1
- package/internal/decoders/jsonl.d.mts.map +1 -1
- package/internal/decoders/jsonl.d.ts.map +1 -1
- package/internal/decoders/jsonl.mjs.map +1 -1
- package/internal/decoders/line.mjs.map +1 -1
- package/internal/detect-platform.mjs.map +1 -1
- package/internal/headers.mjs.map +1 -1
- package/internal/parse.d.mts.map +1 -1
- package/internal/parse.d.ts.map +1 -1
- package/internal/parse.mjs.map +1 -1
- package/internal/qs/formats.d.mts.map +1 -1
- package/internal/qs/formats.d.ts.map +1 -1
- package/internal/qs/index.d.mts +2 -2
- package/internal/qs/index.d.mts.map +1 -1
- package/internal/qs/index.d.ts +2 -2
- package/internal/qs/index.d.ts.map +1 -1
- package/internal/qs/index.mjs.map +1 -1
- package/internal/qs/stringify.d.mts.map +1 -1
- package/internal/qs/stringify.d.ts.map +1 -1
- package/internal/qs/stringify.mjs.map +1 -1
- package/internal/qs/utils.d.mts.map +1 -1
- package/internal/qs/utils.d.ts.map +1 -1
- package/internal/qs/utils.mjs.map +1 -1
- package/internal/request-options.d.mts.map +1 -1
- package/internal/request-options.d.ts.map +1 -1
- package/internal/shims.d.mts +6 -0
- package/internal/shims.d.mts.map +1 -1
- package/internal/shims.d.ts +6 -0
- package/internal/shims.d.ts.map +1 -1
- package/internal/to-file.d.mts.map +1 -1
- package/internal/to-file.d.ts.map +1 -1
- package/internal/to-file.mjs.map +1 -1
- package/internal/types.d.mts +4 -4
- package/internal/types.d.mts.map +1 -1
- package/internal/types.d.ts +4 -4
- package/internal/types.d.ts.map +1 -1
- package/internal/uploads.d.mts.map +1 -1
- package/internal/uploads.d.ts.map +1 -1
- package/internal/uploads.mjs.map +1 -1
- package/internal/utils/abort.d.mts +13 -0
- package/internal/utils/abort.d.mts.map +1 -0
- package/internal/utils/abort.d.ts +13 -0
- package/internal/utils/abort.d.ts.map +1 -0
- package/internal/utils/abort.js +26 -0
- package/internal/utils/abort.js.map +1 -0
- package/internal/utils/abort.mjs +23 -0
- package/internal/utils/abort.mjs.map +1 -0
- package/internal/utils/async-queue.d.mts +31 -0
- package/internal/utils/async-queue.d.mts.map +1 -0
- package/internal/utils/async-queue.d.ts +31 -0
- package/internal/utils/async-queue.d.ts.map +1 -0
- package/internal/utils/async-queue.js +75 -0
- package/internal/utils/async-queue.js.map +1 -0
- package/internal/utils/async-queue.mjs +71 -0
- package/internal/utils/async-queue.mjs.map +1 -0
- package/internal/utils/backoff.d.mts +23 -0
- package/internal/utils/backoff.d.mts.map +1 -0
- package/internal/utils/backoff.d.ts +23 -0
- package/internal/utils/backoff.d.ts.map +1 -0
- package/internal/utils/backoff.js +44 -0
- package/internal/utils/backoff.js.map +1 -0
- package/internal/utils/backoff.mjs +36 -0
- package/internal/utils/backoff.mjs.map +1 -0
- package/internal/utils/base64.mjs.map +1 -1
- package/internal/utils/log.d.mts.map +1 -1
- package/internal/utils/log.d.ts.map +1 -1
- package/internal/utils/log.mjs.map +1 -1
- package/internal/utils/path.mjs.map +1 -1
- package/internal/utils/promise.d.mts +11 -0
- package/internal/utils/promise.d.mts.map +1 -0
- package/internal/utils/promise.d.ts +11 -0
- package/internal/utils/promise.d.ts.map +1 -0
- package/internal/utils/promise.js +18 -0
- package/internal/utils/promise.js.map +1 -0
- package/internal/utils/promise.mjs +15 -0
- package/internal/utils/promise.mjs.map +1 -0
- package/internal/utils/query.mjs.map +1 -1
- package/internal/utils/sleep.d.mts +9 -1
- package/internal/utils/sleep.d.mts.map +1 -1
- package/internal/utils/sleep.d.ts +9 -1
- package/internal/utils/sleep.d.ts.map +1 -1
- package/internal/utils/sleep.js +23 -2
- package/internal/utils/sleep.js.map +1 -1
- package/internal/utils/sleep.mjs +23 -2
- package/internal/utils/sleep.mjs.map +1 -1
- package/internal/utils/values.mjs.map +1 -1
- package/internal/utils.d.mts.map +1 -1
- package/internal/utils.d.ts.map +1 -1
- package/internal/utils.mjs.map +1 -1
- package/lib/BetaMessageStream.d.mts.map +1 -1
- package/lib/BetaMessageStream.d.ts.map +1 -1
- package/lib/BetaMessageStream.mjs.map +1 -1
- package/lib/MessageStream.d.mts.map +1 -1
- package/lib/MessageStream.d.ts.map +1 -1
- package/lib/MessageStream.mjs.map +1 -1
- package/lib/beta-parser.d.mts.map +1 -1
- package/lib/beta-parser.d.ts.map +1 -1
- package/lib/beta-parser.mjs.map +1 -1
- package/lib/credentials/credential-chain.d.mts.map +1 -1
- package/lib/credentials/credential-chain.d.ts.map +1 -1
- package/lib/credentials/credential-chain.mjs.map +1 -1
- package/lib/credentials/identity-token.d.mts.map +1 -1
- package/lib/credentials/identity-token.d.ts.map +1 -1
- package/lib/credentials/identity-token.mjs.map +1 -1
- package/lib/credentials/oidc-federation.d.mts.map +1 -1
- package/lib/credentials/oidc-federation.d.ts.map +1 -1
- package/lib/credentials/oidc-federation.mjs.map +1 -1
- package/lib/credentials/token-cache.d.mts.map +1 -1
- package/lib/credentials/token-cache.d.ts.map +1 -1
- package/lib/credentials/token-cache.mjs.map +1 -1
- package/lib/credentials/types.d.mts.map +1 -1
- package/lib/credentials/types.d.ts.map +1 -1
- package/lib/credentials/types.mjs.map +1 -1
- package/lib/credentials/user-oauth.d.mts.map +1 -1
- package/lib/credentials/user-oauth.d.ts.map +1 -1
- package/lib/credentials/user-oauth.mjs.map +1 -1
- package/lib/credentials.d.mts.map +1 -1
- package/lib/credentials.d.ts.map +1 -1
- package/lib/credentials.mjs.map +1 -1
- package/lib/environments/index.d.mts +4 -0
- package/lib/environments/index.d.mts.map +1 -0
- package/lib/environments/index.d.ts +4 -0
- package/lib/environments/index.d.ts.map +1 -0
- package/lib/environments/index.js +18 -0
- package/lib/environments/index.js.map +1 -0
- package/lib/environments/index.mjs +4 -0
- package/lib/environments/index.mjs.map +1 -0
- package/lib/environments/poller.d.mts +89 -0
- package/lib/environments/poller.d.mts.map +1 -0
- package/lib/environments/poller.d.ts +89 -0
- package/lib/environments/poller.d.ts.map +1 -0
- package/lib/environments/poller.js +181 -0
- package/lib/environments/poller.js.map +1 -0
- package/lib/environments/poller.mjs +172 -0
- package/lib/environments/poller.mjs.map +1 -0
- package/lib/environments/worker.d.mts +143 -0
- package/lib/environments/worker.d.mts.map +1 -0
- package/lib/environments/worker.d.ts +143 -0
- package/lib/environments/worker.d.ts.map +1 -0
- package/lib/environments/worker.js +265 -0
- package/lib/environments/worker.js.map +1 -0
- package/lib/environments/worker.mjs +261 -0
- package/lib/environments/worker.mjs.map +1 -0
- package/lib/helper-client.d.mts +49 -0
- package/lib/helper-client.d.mts.map +1 -0
- package/lib/helper-client.d.ts +49 -0
- package/lib/helper-client.d.ts.map +1 -0
- package/lib/helper-client.js +57 -0
- package/lib/helper-client.js.map +1 -0
- package/lib/helper-client.mjs +54 -0
- package/lib/helper-client.mjs.map +1 -0
- package/lib/parser.d.mts.map +1 -1
- package/lib/parser.d.ts.map +1 -1
- package/lib/parser.mjs.map +1 -1
- package/lib/stainless-helper-header.d.mts.map +1 -1
- package/lib/stainless-helper-header.d.ts.map +1 -1
- package/lib/tools/BetaRunnableTool.d.mts +54 -2
- package/lib/tools/BetaRunnableTool.d.mts.map +1 -1
- package/lib/tools/BetaRunnableTool.d.ts +54 -2
- package/lib/tools/BetaRunnableTool.d.ts.map +1 -1
- package/lib/tools/BetaRunnableTool.js +37 -0
- package/lib/tools/BetaRunnableTool.js.map +1 -1
- package/lib/tools/BetaRunnableTool.mjs +34 -1
- package/lib/tools/BetaRunnableTool.mjs.map +1 -1
- package/lib/tools/BetaToolRunner.d.mts.map +1 -1
- package/lib/tools/BetaToolRunner.d.ts.map +1 -1
- package/lib/tools/BetaToolRunner.js +4 -14
- package/lib/tools/BetaToolRunner.js.map +1 -1
- package/lib/tools/BetaToolRunner.mjs +2 -12
- package/lib/tools/BetaToolRunner.mjs.map +1 -1
- package/lib/tools/CompactionControl.d.mts.map +1 -1
- package/lib/tools/CompactionControl.d.ts.map +1 -1
- package/lib/tools/SessionToolRunner.d.mts +140 -0
- package/lib/tools/SessionToolRunner.d.mts.map +1 -0
- package/lib/tools/SessionToolRunner.d.ts +140 -0
- package/lib/tools/SessionToolRunner.d.ts.map +1 -0
- package/lib/tools/SessionToolRunner.js +459 -0
- package/lib/tools/SessionToolRunner.js.map +1 -0
- package/lib/tools/SessionToolRunner.mjs +455 -0
- package/lib/tools/SessionToolRunner.mjs.map +1 -0
- package/lib/tools/ToolError.d.mts.map +1 -1
- package/lib/tools/ToolError.d.ts.map +1 -1
- package/lib/tools/ToolRunner.d.mts.map +1 -1
- package/lib/tools/ToolRunner.d.ts.map +1 -1
- package/lib/tools/ToolRunner.mjs.map +1 -1
- package/lib/transform-json-schema.mjs.map +1 -1
- package/package.json +1 -1
- package/pagination.d.mts +1 -0
- package/pagination.d.mts.map +1 -1
- package/pagination.d.ts +1 -0
- package/pagination.d.ts.map +1 -1
- package/pagination.mjs +1 -0
- package/pagination.mjs.map +1 -1
- package/resource.d.mts +1 -0
- package/resource.d.mts.map +1 -1
- package/resource.d.ts +1 -0
- package/resource.d.ts.map +1 -1
- package/resource.mjs +1 -0
- package/resource.mjs.map +1 -1
- package/resources/beta/agents/agents.d.mts +125 -1
- package/resources/beta/agents/agents.d.mts.map +1 -1
- package/resources/beta/agents/agents.d.ts +125 -1
- package/resources/beta/agents/agents.d.ts.map +1 -1
- package/resources/beta/agents/agents.js.map +1 -1
- package/resources/beta/agents/agents.mjs.map +1 -1
- package/resources/beta/agents/index.d.mts +1 -1
- package/resources/beta/agents/index.d.mts.map +1 -1
- package/resources/beta/agents/index.d.ts +1 -1
- package/resources/beta/agents/index.d.ts.map +1 -1
- package/resources/beta/agents/index.js.map +1 -1
- package/resources/beta/agents/index.mjs.map +1 -1
- package/resources/beta/agents/versions.d.mts.map +1 -1
- package/resources/beta/agents/versions.d.ts.map +1 -1
- package/resources/beta/agents/versions.mjs.map +1 -1
- package/resources/beta/agents.d.mts.map +1 -1
- package/resources/beta/agents.d.ts.map +1 -1
- package/resources/beta/agents.mjs.map +1 -1
- package/resources/beta/beta.d.mts +10 -10
- package/resources/beta/beta.d.mts.map +1 -1
- package/resources/beta/beta.d.ts +10 -10
- package/resources/beta/beta.d.ts.map +1 -1
- package/resources/beta/beta.js +2 -2
- package/resources/beta/beta.js.map +1 -1
- package/resources/beta/beta.mjs +2 -2
- package/resources/beta/beta.mjs.map +1 -1
- package/resources/beta/environments/environments.d.mts +425 -0
- package/resources/beta/environments/environments.d.mts.map +1 -0
- package/resources/beta/environments/environments.d.ts +425 -0
- package/resources/beta/environments/environments.d.ts.map +1 -0
- package/resources/beta/environments/environments.js +150 -0
- package/resources/beta/environments/environments.js.map +1 -0
- package/resources/beta/environments/environments.mjs +145 -0
- package/resources/beta/environments/environments.mjs.map +1 -0
- package/resources/beta/environments/index.d.mts +3 -0
- package/resources/beta/environments/index.d.mts.map +1 -0
- package/resources/beta/environments/index.d.ts +3 -0
- package/resources/beta/environments/index.d.ts.map +1 -0
- package/resources/beta/environments/index.js +9 -0
- package/resources/beta/environments/index.js.map +1 -0
- package/resources/beta/environments/index.mjs +4 -0
- package/resources/beta/environments/index.mjs.map +1 -0
- package/resources/beta/environments/work.d.mts +496 -0
- package/resources/beta/environments/work.d.mts.map +1 -0
- package/resources/beta/environments/work.d.ts +496 -0
- package/resources/beta/environments/work.d.ts.map +1 -0
- package/resources/beta/environments/work.js +274 -0
- package/resources/beta/environments/work.js.map +1 -0
- package/resources/beta/environments/work.mjs +268 -0
- package/resources/beta/environments/work.mjs.map +1 -0
- package/resources/beta/environments.d.mts +1 -388
- package/resources/beta/environments.d.mts.map +1 -1
- package/resources/beta/environments.d.ts +1 -388
- package/resources/beta/environments.d.ts.map +1 -1
- package/resources/beta/environments.js +2 -138
- package/resources/beta/environments.js.map +1 -1
- package/resources/beta/environments.mjs +1 -136
- package/resources/beta/environments.mjs.map +1 -1
- package/resources/beta/files.d.mts.map +1 -1
- package/resources/beta/files.d.ts.map +1 -1
- package/resources/beta/files.mjs.map +1 -1
- package/resources/beta/index.d.mts +4 -4
- package/resources/beta/index.d.mts.map +1 -1
- package/resources/beta/index.d.ts +4 -4
- package/resources/beta/index.d.ts.map +1 -1
- package/resources/beta/index.js +12 -12
- package/resources/beta/index.js.map +1 -1
- package/resources/beta/index.mjs +1 -1
- package/resources/beta/index.mjs.map +1 -1
- package/resources/beta/memory-stores/index.d.mts.map +1 -1
- package/resources/beta/memory-stores/index.d.ts.map +1 -1
- package/resources/beta/memory-stores/index.mjs.map +1 -1
- package/resources/beta/memory-stores/memories.d.mts.map +1 -1
- package/resources/beta/memory-stores/memories.d.ts.map +1 -1
- package/resources/beta/memory-stores/memories.mjs.map +1 -1
- package/resources/beta/memory-stores/memory-stores.d.mts.map +1 -1
- package/resources/beta/memory-stores/memory-stores.d.ts.map +1 -1
- package/resources/beta/memory-stores/memory-stores.mjs.map +1 -1
- package/resources/beta/memory-stores/memory-versions.d.mts.map +1 -1
- package/resources/beta/memory-stores/memory-versions.d.ts.map +1 -1
- package/resources/beta/memory-stores/memory-versions.mjs.map +1 -1
- package/resources/beta/memory-stores.d.mts.map +1 -1
- package/resources/beta/memory-stores.d.ts.map +1 -1
- package/resources/beta/memory-stores.mjs.map +1 -1
- package/resources/beta/messages/batches.d.mts +5 -0
- package/resources/beta/messages/batches.d.mts.map +1 -1
- package/resources/beta/messages/batches.d.ts +5 -0
- package/resources/beta/messages/batches.d.ts.map +1 -1
- package/resources/beta/messages/batches.mjs.map +1 -1
- package/resources/beta/messages/index.d.mts +1 -1
- package/resources/beta/messages/index.d.mts.map +1 -1
- package/resources/beta/messages/index.d.ts +1 -1
- package/resources/beta/messages/index.d.ts.map +1 -1
- package/resources/beta/messages/index.js.map +1 -1
- package/resources/beta/messages/index.mjs.map +1 -1
- package/resources/beta/messages/messages.d.mts +80 -5
- package/resources/beta/messages/messages.d.mts.map +1 -1
- package/resources/beta/messages/messages.d.ts +80 -5
- package/resources/beta/messages/messages.d.ts.map +1 -1
- package/resources/beta/messages/messages.js.map +1 -1
- package/resources/beta/messages/messages.mjs.map +1 -1
- package/resources/beta/messages.d.mts.map +1 -1
- package/resources/beta/messages.d.ts.map +1 -1
- package/resources/beta/messages.mjs.map +1 -1
- package/resources/beta/models.d.mts.map +1 -1
- package/resources/beta/models.d.ts.map +1 -1
- package/resources/beta/models.mjs.map +1 -1
- package/resources/beta/sessions/events.d.mts +97 -9
- package/resources/beta/sessions/events.d.mts.map +1 -1
- package/resources/beta/sessions/events.d.ts +97 -9
- package/resources/beta/sessions/events.d.ts.map +1 -1
- package/resources/beta/sessions/events.js +27 -1
- package/resources/beta/sessions/events.js.map +1 -1
- package/resources/beta/sessions/events.mjs +25 -0
- package/resources/beta/sessions/events.mjs.map +1 -1
- package/resources/beta/sessions/index.d.mts +3 -3
- package/resources/beta/sessions/index.d.mts.map +1 -1
- package/resources/beta/sessions/index.d.ts +3 -3
- package/resources/beta/sessions/index.d.ts.map +1 -1
- package/resources/beta/sessions/index.js.map +1 -1
- package/resources/beta/sessions/index.mjs.map +1 -1
- package/resources/beta/sessions/resources.d.mts.map +1 -1
- package/resources/beta/sessions/resources.d.ts.map +1 -1
- package/resources/beta/sessions/resources.mjs.map +1 -1
- package/resources/beta/sessions/sessions.d.mts +101 -9
- package/resources/beta/sessions/sessions.d.mts.map +1 -1
- package/resources/beta/sessions/sessions.d.ts +101 -9
- package/resources/beta/sessions/sessions.d.ts.map +1 -1
- package/resources/beta/sessions/sessions.js.map +1 -1
- package/resources/beta/sessions/sessions.mjs.map +1 -1
- package/resources/beta/sessions/threads/events.d.mts.map +1 -1
- package/resources/beta/sessions/threads/events.d.ts.map +1 -1
- package/resources/beta/sessions/threads/events.mjs.map +1 -1
- package/resources/beta/sessions/threads/index.d.mts +1 -1
- package/resources/beta/sessions/threads/index.d.mts.map +1 -1
- package/resources/beta/sessions/threads/index.d.ts +1 -1
- package/resources/beta/sessions/threads/index.d.ts.map +1 -1
- package/resources/beta/sessions/threads/index.js.map +1 -1
- package/resources/beta/sessions/threads/index.mjs.map +1 -1
- package/resources/beta/sessions/threads/threads.d.mts +3 -23
- package/resources/beta/sessions/threads/threads.d.mts.map +1 -1
- package/resources/beta/sessions/threads/threads.d.ts +3 -23
- package/resources/beta/sessions/threads/threads.d.ts.map +1 -1
- package/resources/beta/sessions/threads/threads.js.map +1 -1
- package/resources/beta/sessions/threads/threads.mjs.map +1 -1
- package/resources/beta/sessions/threads.d.mts.map +1 -1
- package/resources/beta/sessions/threads.d.ts.map +1 -1
- package/resources/beta/sessions/threads.mjs.map +1 -1
- package/resources/beta/sessions.d.mts.map +1 -1
- package/resources/beta/sessions.d.ts.map +1 -1
- package/resources/beta/sessions.mjs.map +1 -1
- package/resources/beta/skills/index.d.mts +1 -1
- package/resources/beta/skills/index.d.mts.map +1 -1
- package/resources/beta/skills/index.d.ts +1 -1
- package/resources/beta/skills/index.d.ts.map +1 -1
- package/resources/beta/skills/index.js.map +1 -1
- package/resources/beta/skills/index.mjs.map +1 -1
- package/resources/beta/skills/skills.d.mts +2 -2
- package/resources/beta/skills/skills.d.mts.map +1 -1
- package/resources/beta/skills/skills.d.ts +2 -2
- package/resources/beta/skills/skills.d.ts.map +1 -1
- package/resources/beta/skills/skills.js.map +1 -1
- package/resources/beta/skills/skills.mjs.map +1 -1
- package/resources/beta/skills/versions.d.mts +28 -1
- package/resources/beta/skills/versions.d.mts.map +1 -1
- package/resources/beta/skills/versions.d.ts +28 -1
- package/resources/beta/skills/versions.d.ts.map +1 -1
- package/resources/beta/skills/versions.js +28 -0
- package/resources/beta/skills/versions.js.map +1 -1
- package/resources/beta/skills/versions.mjs +28 -0
- package/resources/beta/skills/versions.mjs.map +1 -1
- package/resources/beta/skills.d.mts.map +1 -1
- package/resources/beta/skills.d.ts.map +1 -1
- package/resources/beta/skills.mjs.map +1 -1
- package/resources/beta/user-profiles.d.mts.map +1 -1
- package/resources/beta/user-profiles.d.ts.map +1 -1
- package/resources/beta/user-profiles.mjs.map +1 -1
- package/resources/beta/vaults/credentials.d.mts.map +1 -1
- package/resources/beta/vaults/credentials.d.ts.map +1 -1
- package/resources/beta/vaults/credentials.mjs.map +1 -1
- package/resources/beta/vaults/index.d.mts.map +1 -1
- package/resources/beta/vaults/index.d.ts.map +1 -1
- package/resources/beta/vaults/index.mjs.map +1 -1
- package/resources/beta/vaults/vaults.d.mts.map +1 -1
- package/resources/beta/vaults/vaults.d.ts.map +1 -1
- package/resources/beta/vaults/vaults.mjs.map +1 -1
- package/resources/beta/vaults.d.mts.map +1 -1
- package/resources/beta/vaults.d.ts.map +1 -1
- package/resources/beta/vaults.mjs.map +1 -1
- package/resources/beta/webhooks.d.mts.map +1 -1
- package/resources/beta/webhooks.d.ts.map +1 -1
- package/resources/beta/webhooks.mjs.map +1 -1
- package/resources/beta.d.mts.map +1 -1
- package/resources/beta.d.ts.map +1 -1
- package/resources/beta.mjs.map +1 -1
- package/resources/completions.d.mts.map +1 -1
- package/resources/completions.d.ts.map +1 -1
- package/resources/completions.mjs.map +1 -1
- package/resources/index.d.mts.map +1 -1
- package/resources/index.d.ts.map +1 -1
- package/resources/index.mjs.map +1 -1
- package/resources/messages/batches.d.mts.map +1 -1
- package/resources/messages/batches.d.ts.map +1 -1
- package/resources/messages/batches.mjs.map +1 -1
- package/resources/messages/index.d.mts.map +1 -1
- package/resources/messages/index.d.ts.map +1 -1
- package/resources/messages/index.mjs.map +1 -1
- package/resources/messages/messages.d.mts.map +1 -1
- package/resources/messages/messages.d.ts.map +1 -1
- package/resources/messages/messages.mjs.map +1 -1
- package/resources/messages.d.mts.map +1 -1
- package/resources/messages.d.ts.map +1 -1
- package/resources/messages.mjs.map +1 -1
- package/resources/models.d.mts.map +1 -1
- package/resources/models.d.ts.map +1 -1
- package/resources/models.mjs.map +1 -1
- package/resources.d.mts.map +1 -1
- package/resources.d.ts.map +1 -1
- package/resources.mjs.map +1 -1
- package/src/core/streaming.ts +2 -0
- package/src/helpers/beta/environments.ts +33 -0
- package/src/helpers/beta/json-schema.ts +7 -0
- package/src/helpers/beta/zod.ts +13 -7
- package/src/helpers/zod.ts +2 -3
- package/src/internal/utils/abort.ts +21 -0
- package/src/internal/utils/async-queue.ts +66 -0
- package/src/internal/utils/backoff.ts +41 -0
- package/src/internal/utils/promise.ts +18 -0
- package/src/internal/utils/sleep.ts +25 -2
- package/src/lib/environments/index.ts +23 -0
- package/src/lib/environments/poller.ts +253 -0
- package/src/lib/environments/worker.ts +395 -0
- package/src/lib/helper-client.ts +89 -0
- package/src/lib/tools/BetaRunnableTool.ts +82 -1
- package/src/lib/tools/BetaToolRunner.ts +2 -17
- package/src/lib/tools/SessionToolRunner.ts +591 -0
- package/src/resources/beta/agents/agents.ts +158 -0
- package/src/resources/beta/agents/index.ts +7 -0
- package/src/resources/beta/beta.ts +62 -21
- package/src/resources/beta/environments/environments.ts +625 -0
- package/src/resources/beta/environments/index.ts +42 -0
- package/src/resources/beta/environments/work.ts +697 -0
- package/src/resources/beta/environments.ts +1 -540
- package/src/resources/beta/index.ts +21 -1
- package/src/resources/beta/messages/batches.ts +6 -0
- package/src/resources/beta/messages/index.ts +8 -0
- package/src/resources/beta/messages/messages.ts +109 -5
- package/src/resources/beta/sessions/events.ts +153 -7
- package/src/resources/beta/sessions/index.ts +7 -1
- package/src/resources/beta/sessions/sessions.ts +130 -6
- package/src/resources/beta/sessions/threads/index.ts +0 -1
- package/src/resources/beta/sessions/threads/threads.ts +4 -37
- package/src/resources/beta/skills/index.ts +1 -0
- package/src/resources/beta/skills/skills.ts +2 -0
- package/src/resources/beta/skills/versions.ts +44 -0
- package/src/tools/agent-toolset/fs-util.ts +154 -0
- package/src/tools/agent-toolset/node.ts +787 -0
- package/src/tools/agent-toolset/skills.ts +256 -0
- package/src/version.ts +1 -1
- package/streaming.d.mts +1 -0
- package/streaming.d.mts.map +1 -1
- package/streaming.d.ts +1 -0
- package/streaming.d.ts.map +1 -1
- package/streaming.mjs +1 -0
- package/streaming.mjs.map +1 -1
- package/tools/agent-toolset/fs-util.d.mts +49 -0
- package/tools/agent-toolset/fs-util.d.mts.map +1 -0
- package/tools/agent-toolset/fs-util.d.ts +49 -0
- package/tools/agent-toolset/fs-util.d.ts.map +1 -0
- package/tools/agent-toolset/fs-util.js +159 -0
- package/tools/agent-toolset/fs-util.js.map +1 -0
- package/tools/agent-toolset/fs-util.mjs +151 -0
- package/tools/agent-toolset/fs-util.mjs.map +1 -0
- package/tools/agent-toolset/node.d.mts +139 -0
- package/tools/agent-toolset/node.d.mts.map +1 -0
- package/tools/agent-toolset/node.d.ts +139 -0
- package/tools/agent-toolset/node.d.ts.map +1 -0
- package/tools/agent-toolset/node.js +746 -0
- package/tools/agent-toolset/node.js.map +1 -0
- package/tools/agent-toolset/node.mjs +731 -0
- package/tools/agent-toolset/node.mjs.map +1 -0
- package/tools/agent-toolset/skills.d.mts +50 -0
- package/tools/agent-toolset/skills.d.mts.map +1 -0
- package/tools/agent-toolset/skills.d.ts +50 -0
- package/tools/agent-toolset/skills.d.ts.map +1 -0
- package/tools/agent-toolset/skills.js +249 -0
- package/tools/agent-toolset/skills.js.map +1 -0
- package/tools/agent-toolset/skills.mjs +243 -0
- package/tools/agent-toolset/skills.mjs.map +1 -0
- package/tools/memory/node.d.mts.map +1 -1
- package/tools/memory/node.d.ts.map +1 -1
- package/tools/memory/node.mjs.map +1 -1
- package/uploads.d.mts +1 -0
- package/uploads.d.mts.map +1 -1
- package/uploads.d.ts +1 -0
- package/uploads.d.ts.map +1 -1
- package/uploads.mjs +1 -0
- package/uploads.mjs.map +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
package/src/helpers/beta/zod.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { transformJSONSchema } from '../..//lib/transform-json-schema';
|
|
2
|
-
import type { infer as zodInfer, ZodType } from 'zod';
|
|
3
2
|
import * as z from 'zod/v4';
|
|
4
3
|
import { AnthropicError } from '../../core/error';
|
|
5
4
|
import { AutoParseableBetaOutputFormat } from '../../lib/beta-parser';
|
|
@@ -14,9 +13,9 @@ import { BetaToolResultContentBlockParam } from '../../resources/beta';
|
|
|
14
13
|
* This can be passed directly to the `.create()` method but will not
|
|
15
14
|
* result in any automatic parsing, you'll have to parse the response yourself.
|
|
16
15
|
*/
|
|
17
|
-
export function betaZodOutputFormat<ZodInput extends ZodType>(
|
|
16
|
+
export function betaZodOutputFormat<ZodInput extends z.ZodType>(
|
|
18
17
|
zodObject: ZodInput,
|
|
19
|
-
): AutoParseableBetaOutputFormat<
|
|
18
|
+
): AutoParseableBetaOutputFormat<z.infer<ZodInput>> {
|
|
20
19
|
let jsonSchema = z.toJSONSchema(zodObject, { reused: 'ref' });
|
|
21
20
|
|
|
22
21
|
jsonSchema = transformJSONSchema(jsonSchema);
|
|
@@ -46,15 +45,21 @@ export function betaZodOutputFormat<ZodInput extends ZodType>(
|
|
|
46
45
|
* converted into JSON Schema when passed to the API. The provided function's
|
|
47
46
|
* input arguments will also be validated against the provided schema.
|
|
48
47
|
*/
|
|
49
|
-
export function betaZodTool<InputSchema extends ZodType>(options: {
|
|
48
|
+
export function betaZodTool<InputSchema extends z.ZodType>(options: {
|
|
50
49
|
name: string;
|
|
51
50
|
inputSchema: InputSchema;
|
|
52
51
|
description: string;
|
|
53
52
|
run: (
|
|
54
|
-
args:
|
|
53
|
+
args: z.infer<InputSchema>,
|
|
55
54
|
context?: BetaToolRunContext,
|
|
56
55
|
) => Promisable<string | Array<BetaToolResultContentBlockParam>>;
|
|
57
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Optional cleanup hook for tools that hold process-level resources (e.g. a
|
|
58
|
+
* persistent shell). `client.beta.sessions.events.toolRunner` calls it once
|
|
59
|
+
* when iteration ends.
|
|
60
|
+
*/
|
|
61
|
+
close?: () => void | Promise<void>;
|
|
62
|
+
}): BetaRunnableTool<z.infer<InputSchema>> {
|
|
58
63
|
const jsonSchema = z.toJSONSchema(options.inputSchema, { reused: 'ref' });
|
|
59
64
|
|
|
60
65
|
if (jsonSchema.type !== 'object') {
|
|
@@ -70,6 +75,7 @@ export function betaZodTool<InputSchema extends ZodType>(options: {
|
|
|
70
75
|
input_schema: objectSchema,
|
|
71
76
|
description: options.description,
|
|
72
77
|
run: options.run,
|
|
73
|
-
parse: (args: unknown) => options.inputSchema.parse(args) as
|
|
78
|
+
parse: (args: unknown) => options.inputSchema.parse(args) as z.infer<InputSchema>,
|
|
79
|
+
...(options.close ? { close: options.close } : {}),
|
|
74
80
|
};
|
|
75
81
|
}
|
package/src/helpers/zod.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { transformJSONSchema } from '../lib/transform-json-schema';
|
|
2
|
-
import type { infer as zodInfer, ZodType } from 'zod';
|
|
3
2
|
import * as z from 'zod/v4';
|
|
4
3
|
import { AnthropicError } from '../core/error';
|
|
5
4
|
import { AutoParseableOutputFormat } from '../lib/parser';
|
|
@@ -13,9 +12,9 @@ import { AutoParseableOutputFormat } from '../lib/parser';
|
|
|
13
12
|
* This can be passed directly to the `.create()` method but will not
|
|
14
13
|
* result in any automatic parsing, you'll have to parse the response yourself.
|
|
15
14
|
*/
|
|
16
|
-
export function zodOutputFormat<ZodInput extends ZodType>(
|
|
15
|
+
export function zodOutputFormat<ZodInput extends z.ZodType>(
|
|
17
16
|
zodObject: ZodInput,
|
|
18
|
-
): AutoParseableOutputFormat<
|
|
17
|
+
): AutoParseableOutputFormat<z.infer<ZodInput>> {
|
|
19
18
|
let jsonSchema = z.toJSONSchema(zodObject, { reused: 'ref' });
|
|
20
19
|
|
|
21
20
|
jsonSchema = transformJSONSchema(jsonSchema);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain an external {@link AbortSignal} into a local {@link AbortController}:
|
|
3
|
+
* the controller aborts whenever `external` aborts (synchronously if it is
|
|
4
|
+
* already aborted).
|
|
5
|
+
*
|
|
6
|
+
* Returns a cleanup function that detaches the listener. Callers MUST invoke it
|
|
7
|
+
* on their normal teardown path — `{ once: true }` only removes the listener if
|
|
8
|
+
* abort actually fires, so a long-lived `external` signal (e.g. a daemon-wide
|
|
9
|
+
* signal reused across many short-lived controllers) would otherwise leak one
|
|
10
|
+
* listener per controller.
|
|
11
|
+
*/
|
|
12
|
+
export function linkAbort(external: AbortSignal | null | undefined, controller: AbortController): () => void {
|
|
13
|
+
if (!external) return () => {};
|
|
14
|
+
if (external.aborted) {
|
|
15
|
+
controller.abort();
|
|
16
|
+
return () => {};
|
|
17
|
+
}
|
|
18
|
+
const onAbort = () => controller.abort();
|
|
19
|
+
external.addEventListener('abort', onAbort);
|
|
20
|
+
return () => external.removeEventListener('abort', onAbort);
|
|
21
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export type AsyncQueueResult<T> = { done: false; value: T } | { done: true; value: undefined };
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Single-consumer async queue that bridges background producers to an
|
|
5
|
+
* `AsyncIterator`-style reader. Producers `push()` items; the consumer awaits
|
|
6
|
+
* `next()`. `close()` is idempotent and wakes any pending `next()` with
|
|
7
|
+
* `done: true`. `tryShift()` synchronously drains remaining items after
|
|
8
|
+
* iteration has been signalled to stop.
|
|
9
|
+
*/
|
|
10
|
+
export class AsyncQueue<T> {
|
|
11
|
+
#items: T[] = [];
|
|
12
|
+
#waiters: Array<(r: AsyncQueueResult<T>) => void> = [];
|
|
13
|
+
#closed = false;
|
|
14
|
+
|
|
15
|
+
/** Enqueue an item, or hand it directly to a waiting reader. Returns `false` once closed. */
|
|
16
|
+
push(item: T): boolean {
|
|
17
|
+
if (this.#closed) return false;
|
|
18
|
+
const w = this.#waiters.shift();
|
|
19
|
+
if (w) w({ done: false, value: item });
|
|
20
|
+
else this.#items.push(item);
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Mark the queue done. Idempotent; wakes every pending reader with `done: true`. */
|
|
25
|
+
close(): void {
|
|
26
|
+
if (this.#closed) return;
|
|
27
|
+
this.#closed = true;
|
|
28
|
+
while (this.#waiters.length > 0) {
|
|
29
|
+
const w = this.#waiters.shift()!;
|
|
30
|
+
w({ done: true, value: undefined });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Resolve with the next item, or `done: true` once the queue is closed and
|
|
36
|
+
* drained. When `signal` is supplied, aborting it resolves a pending read
|
|
37
|
+
* with `done: true` (cancellation is pushed down here rather than handled by
|
|
38
|
+
* an outer `Promise.race`).
|
|
39
|
+
*/
|
|
40
|
+
next(signal?: AbortSignal): Promise<AsyncQueueResult<T>> {
|
|
41
|
+
if (this.#items.length > 0) {
|
|
42
|
+
return Promise.resolve({ done: false, value: this.#items.shift()! });
|
|
43
|
+
}
|
|
44
|
+
if (this.#closed || signal?.aborted) {
|
|
45
|
+
return Promise.resolve({ done: true, value: undefined });
|
|
46
|
+
}
|
|
47
|
+
return new Promise<AsyncQueueResult<T>>((resolve) => {
|
|
48
|
+
const waiter = (r: AsyncQueueResult<T>) => {
|
|
49
|
+
signal?.removeEventListener('abort', onAbort);
|
|
50
|
+
resolve(r);
|
|
51
|
+
};
|
|
52
|
+
const onAbort = () => {
|
|
53
|
+
const idx = this.#waiters.indexOf(waiter);
|
|
54
|
+
if (idx >= 0) this.#waiters.splice(idx, 1);
|
|
55
|
+
resolve({ done: true, value: undefined });
|
|
56
|
+
};
|
|
57
|
+
this.#waiters.push(waiter);
|
|
58
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Synchronously remove and return the next buffered item, or `undefined` if empty. */
|
|
63
|
+
tryShift(): T | undefined {
|
|
64
|
+
return this.#items.shift();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { APIError } from '../../core/error';
|
|
2
|
+
|
|
3
|
+
/** True when `e` is an {@link APIError} whose HTTP status equals `code`. */
|
|
4
|
+
export function isStatus(e: unknown, code: number): boolean {
|
|
5
|
+
return e instanceof APIError && e.status === code;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/** True when `e` is an {@link APIError} with a 4xx status. */
|
|
9
|
+
export function is4xx(e: unknown): boolean {
|
|
10
|
+
return e instanceof APIError && typeof e.status === 'number' && e.status >= 400 && e.status < 500;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* True for a 4xx that the core client's retry policy would *not* retry, i.e. a
|
|
15
|
+
* permanent client error. 408 (request timeout), 409 (lock timeout) and 429
|
|
16
|
+
* (rate limit) are retryable for the base client (`Anthropic.shouldRetry`), so
|
|
17
|
+
* they are not treated as fatal here — keeping helper retry behaviour aligned
|
|
18
|
+
* with the rest of the SDK.
|
|
19
|
+
*/
|
|
20
|
+
export function isFatal4xx(e: unknown): boolean {
|
|
21
|
+
return is4xx(e) && !isStatus(e, 408) && !isStatus(e, 409) && !isStatus(e, 429);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Exponential backoff: `baseMs * 2 ** attempt`, clamped to `capMs`. */
|
|
25
|
+
export function backoff(attempt: number, baseMs: number, capMs: number): number {
|
|
26
|
+
return Math.min(baseMs * 2 ** attempt, capMs);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Uniform random delay in the half-open interval `[lowMs, highMs)`. */
|
|
30
|
+
export function jitter(lowMs: number, highMs: number): number {
|
|
31
|
+
return lowMs + Math.random() * (highMs - lowMs);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Trim up to 25% off `ms` at random so a fleet of clients backing off after a
|
|
36
|
+
* shared outage does not retry in lockstep — mirrors the jitter the core client
|
|
37
|
+
* applies to its own retry timeout.
|
|
38
|
+
*/
|
|
39
|
+
export function applyJitter(ms: number): number {
|
|
40
|
+
return ms * (1 - Math.random() * 0.25);
|
|
41
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A deferred: a `Promise` together with its `resolve` / `reject` functions.
|
|
3
|
+
* This is `Promise.withResolvers()`, which is not available in all supported
|
|
4
|
+
* runtimes.
|
|
5
|
+
*/
|
|
6
|
+
export function promiseWithResolvers<T>(): {
|
|
7
|
+
promise: Promise<T>;
|
|
8
|
+
resolve: (value: T | PromiseLike<T>) => void;
|
|
9
|
+
reject: (reason?: unknown) => void;
|
|
10
|
+
} {
|
|
11
|
+
let resolve!: (value: T | PromiseLike<T>) => void;
|
|
12
|
+
let reject!: (reason?: unknown) => void;
|
|
13
|
+
const promise = new Promise<T>((res, rej) => {
|
|
14
|
+
resolve = res;
|
|
15
|
+
reject = rej;
|
|
16
|
+
});
|
|
17
|
+
return { promise, resolve, reject };
|
|
18
|
+
}
|
|
@@ -1,3 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Resolve after `ms`, or immediately when `signal` aborts.
|
|
3
|
+
*
|
|
4
|
+
* When a `signal` is passed the abort listener is always removed so repeated
|
|
5
|
+
* calls do not accumulate listeners on a long-lived signal. Resolves (rather
|
|
6
|
+
* than rejects) on abort — callers treat abort as "wake up early," not as a
|
|
7
|
+
* failure; callers that want to unwind should check the signal themselves.
|
|
8
|
+
*/
|
|
9
|
+
export const sleep = (ms: number, signal?: AbortSignal): Promise<void> =>
|
|
10
|
+
new Promise<void>((resolve) => {
|
|
11
|
+
if (signal?.aborted) return resolve();
|
|
2
12
|
|
|
3
|
-
|
|
13
|
+
const onAbort = () => {
|
|
14
|
+
clearTimeout(timer);
|
|
15
|
+
resolve();
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const timer = setTimeout(() => {
|
|
19
|
+
signal?.removeEventListener('abort', onAbort);
|
|
20
|
+
resolve();
|
|
21
|
+
}, ms);
|
|
22
|
+
|
|
23
|
+
// `{ once: true }` auto-removes the listener if abort fires first,
|
|
24
|
+
// so we only need an explicit remove on the timer-wins path above.
|
|
25
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
26
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export {
|
|
2
|
+
WorkPoller,
|
|
3
|
+
type WorkPollerOptions,
|
|
4
|
+
POLL_BLOCK_MS,
|
|
5
|
+
backoff,
|
|
6
|
+
jitter,
|
|
7
|
+
isStatus,
|
|
8
|
+
is4xx,
|
|
9
|
+
isFatal4xx,
|
|
10
|
+
} from './poller';
|
|
11
|
+
export {
|
|
12
|
+
EnvironmentWorker,
|
|
13
|
+
type EnvironmentWorkerOptions,
|
|
14
|
+
type EnvironmentWorkerTools,
|
|
15
|
+
type HandleItemOptions,
|
|
16
|
+
} from './worker';
|
|
17
|
+
export {
|
|
18
|
+
SessionToolRunner,
|
|
19
|
+
type SessionToolRunnerOptions,
|
|
20
|
+
type DispatchedToolCall,
|
|
21
|
+
MANAGED_AGENTS_BETA,
|
|
22
|
+
DEFAULT_MAX_IDLE_MS,
|
|
23
|
+
} from '../tools/SessionToolRunner';
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { AnthropicError } from '../../core/error';
|
|
2
|
+
import type { Anthropic } from '../../client';
|
|
3
|
+
import type { BetaSelfHostedWork } from '../../resources/beta/environments/work';
|
|
4
|
+
import { loggerFor } from '../../internal/utils/log';
|
|
5
|
+
import { sleep } from '../../internal/utils/sleep';
|
|
6
|
+
import { uuid4 } from '../../internal/utils/uuid';
|
|
7
|
+
import { linkAbort } from '../../internal/utils/abort';
|
|
8
|
+
import { buildHeaders } from '../../internal/headers';
|
|
9
|
+
import type { BetaToolRunnerRequestOptions } from '../tools/BetaToolRunner';
|
|
10
|
+
import {
|
|
11
|
+
applyJitter,
|
|
12
|
+
backoff as expBackoff,
|
|
13
|
+
isFatal4xx,
|
|
14
|
+
isStatus,
|
|
15
|
+
jitter,
|
|
16
|
+
} from '../../internal/utils/backoff';
|
|
17
|
+
import { copyClientForHelper } from '../helper-client';
|
|
18
|
+
|
|
19
|
+
export { is4xx, isFatal4xx, isStatus, jitter } from '../../internal/utils/backoff';
|
|
20
|
+
|
|
21
|
+
// API caps block_ms at 999; rely on client-side jitter between empty polls.
|
|
22
|
+
export const POLL_BLOCK_MS = 999;
|
|
23
|
+
const POLL_BACKOFF_BASE_MS = 1000;
|
|
24
|
+
const POLL_BACKOFF_CAP_MS = 60_000;
|
|
25
|
+
|
|
26
|
+
export interface WorkPollerOptions {
|
|
27
|
+
client: Anthropic;
|
|
28
|
+
environmentId: string;
|
|
29
|
+
/**
|
|
30
|
+
* The environment key — the single credential for the self-hosted runner. It
|
|
31
|
+
* authenticates the work-poll calls here and every per-session call the
|
|
32
|
+
* consumer makes afterwards.
|
|
33
|
+
*/
|
|
34
|
+
environmentKey: string;
|
|
35
|
+
workerId?: string;
|
|
36
|
+
/** External abort signal. Aborting it ends the iteration. */
|
|
37
|
+
signal?: AbortSignal;
|
|
38
|
+
/**
|
|
39
|
+
* Whether the poller posts `work.stop` itself after the consumer's loop body
|
|
40
|
+
* returns. Defaults to `true`. Set `false` when the consumer already owns the
|
|
41
|
+
* stop (e.g. {@link EnvironmentWorker} force-stops every item) so the work
|
|
42
|
+
* item is not stopped twice.
|
|
43
|
+
*
|
|
44
|
+
* Orthogonal to {@link WorkPollerOptions.drain}: `autoStop` is a per-item
|
|
45
|
+
* lifecycle flag (does the poller `work.stop` each item), `drain` controls
|
|
46
|
+
* loop termination (does the poller return when the queue is empty). They are
|
|
47
|
+
* not two names for the same thing — `EnvironmentWorker.run` uses
|
|
48
|
+
* `autoStop: false` with `drain` defaulting `false`.
|
|
49
|
+
*/
|
|
50
|
+
autoStop?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* When `true`, the poller returns (ends iteration) as soon as the work queue
|
|
53
|
+
* is empty instead of long-polling forever. Defaults to `false` (long-poll
|
|
54
|
+
* until aborted). Pair with `blockMs: null` for a single non-blocking pass
|
|
55
|
+
* over whatever is already queued.
|
|
56
|
+
*/
|
|
57
|
+
drain?: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Block timeout in milliseconds passed through to `work.poll` — the server
|
|
60
|
+
* long-polls up to this long for an item before returning empty. Defaults to
|
|
61
|
+
* {@link POLL_BLOCK_MS} (the API cap, 999). Pass `null` to omit it entirely
|
|
62
|
+
* for a non-blocking single poll (useful with {@link WorkPollerOptions.drain}).
|
|
63
|
+
*/
|
|
64
|
+
blockMs?: number | null;
|
|
65
|
+
/**
|
|
66
|
+
* Reclaim unacknowledged work items older than this many milliseconds, passed
|
|
67
|
+
* through to `work.poll`'s `reclaim_older_than_ms`. Defaults to `undefined`
|
|
68
|
+
* (omitted — the server applies its own default).
|
|
69
|
+
*/
|
|
70
|
+
reclaimOlderThanMs?: number | null;
|
|
71
|
+
/**
|
|
72
|
+
* Extra per-request options merged into the poll/ack/stop calls. Custom
|
|
73
|
+
* `headers` (e.g. a proxy's auth/routing headers) are layered on top of the
|
|
74
|
+
* environment-key auth + helper telemetry headers; the poller owns the abort
|
|
75
|
+
* signal, so a `signal` here is ignored.
|
|
76
|
+
*/
|
|
77
|
+
requestOptions?: BetaToolRunnerRequestOptions;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Async-iterable that long-polls a self-hosted environment for work, ack's
|
|
82
|
+
* each item, yields the {@link BetaSelfHostedWork} item, and posts `stop` after
|
|
83
|
+
* the consumer's loop body returns (or when the consumer `break`s).
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* for await (const work of client.beta.environments.work.poller({
|
|
88
|
+
* environmentId,
|
|
89
|
+
* environmentKey,
|
|
90
|
+
* })) {
|
|
91
|
+
* // ...service the work...
|
|
92
|
+
* }
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export class WorkPoller implements AsyncIterable<BetaSelfHostedWork> {
|
|
96
|
+
readonly client: Anthropic;
|
|
97
|
+
readonly environmentId: string;
|
|
98
|
+
readonly environmentKey: string;
|
|
99
|
+
readonly workerId: string;
|
|
100
|
+
|
|
101
|
+
// Sub-client scoped to the environment key. Every poll / ack / stop call
|
|
102
|
+
// is routed through this so the parent's `X-Api-Key` never lands on the
|
|
103
|
+
// wire alongside the bearer credential. The helper-telemetry header is
|
|
104
|
+
// attached as a default on this client; per-call plumbing is unnecessary.
|
|
105
|
+
readonly #runnerClient: Anthropic;
|
|
106
|
+
#consumed = false;
|
|
107
|
+
readonly #controller: AbortController;
|
|
108
|
+
readonly #detachExternal: () => void;
|
|
109
|
+
readonly #autoStop: boolean;
|
|
110
|
+
readonly #drain: boolean;
|
|
111
|
+
readonly #blockMs: number | null;
|
|
112
|
+
readonly #reclaimOlderThanMs: number | null;
|
|
113
|
+
readonly #requestOpts: BetaToolRunnerRequestOptions | undefined;
|
|
114
|
+
|
|
115
|
+
constructor(opts: WorkPollerOptions) {
|
|
116
|
+
this.client = opts.client;
|
|
117
|
+
this.environmentId = opts.environmentId;
|
|
118
|
+
this.environmentKey = opts.environmentKey;
|
|
119
|
+
this.workerId = opts.workerId ?? defaultWorkerId();
|
|
120
|
+
this.#runnerClient = copyClientForHelper(opts.client, {
|
|
121
|
+
authToken: opts.environmentKey,
|
|
122
|
+
helper: 'environments-work-poller',
|
|
123
|
+
});
|
|
124
|
+
this.#autoStop = opts.autoStop ?? true;
|
|
125
|
+
this.#drain = opts.drain ?? false;
|
|
126
|
+
// `undefined` => default to the API cap; an explicit `null` => omit
|
|
127
|
+
// `block_ms` for a non-blocking poll.
|
|
128
|
+
this.#blockMs = opts.blockMs === undefined ? POLL_BLOCK_MS : opts.blockMs;
|
|
129
|
+
this.#reclaimOlderThanMs = opts.reclaimOlderThanMs ?? null;
|
|
130
|
+
this.#requestOpts = opts.requestOptions;
|
|
131
|
+
this.#controller = new AbortController();
|
|
132
|
+
this.#detachExternal = linkAbort(opts.signal, this.#controller);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Read-only view of this iterator's abort signal. */
|
|
136
|
+
get signal(): AbortSignal {
|
|
137
|
+
return this.#controller.signal;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Abort the iterator. The current `for await` will exit cleanly. */
|
|
141
|
+
abort(): void {
|
|
142
|
+
this.#controller.abort();
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async *[Symbol.asyncIterator](): AsyncIterator<BetaSelfHostedWork> {
|
|
146
|
+
if (this.#consumed) {
|
|
147
|
+
throw new AnthropicError('Cannot iterate over a consumed WorkPoller');
|
|
148
|
+
}
|
|
149
|
+
this.#consumed = true;
|
|
150
|
+
const log = loggerFor(this.client);
|
|
151
|
+
log.info('poller starting', {
|
|
152
|
+
component: 'work-poller',
|
|
153
|
+
environment_id: this.environmentId,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
let attempt = 0;
|
|
158
|
+
while (!this.#controller.signal.aborted) {
|
|
159
|
+
let work: BetaSelfHostedWork | null;
|
|
160
|
+
try {
|
|
161
|
+
work = await this.#runnerClient.beta.environments.work.poll(
|
|
162
|
+
this.environmentId,
|
|
163
|
+
{
|
|
164
|
+
'Anthropic-Worker-ID': this.workerId,
|
|
165
|
+
...(this.#blockMs !== null ? { block_ms: this.#blockMs } : {}),
|
|
166
|
+
...(this.#reclaimOlderThanMs !== null ?
|
|
167
|
+
{ reclaim_older_than_ms: this.#reclaimOlderThanMs }
|
|
168
|
+
: {}),
|
|
169
|
+
},
|
|
170
|
+
{ headers: buildHeaders([this.#requestOpts?.headers]), signal: this.#controller.signal },
|
|
171
|
+
);
|
|
172
|
+
} catch (e) {
|
|
173
|
+
if (this.#controller.signal.aborted) return;
|
|
174
|
+
// A bad environment key / missing environment never recovers — surface
|
|
175
|
+
// it instead of spinning forever at the backoff cap.
|
|
176
|
+
if (isFatal4xx(e)) {
|
|
177
|
+
log.error('poll failed permanently, stopping poller', { error: String(e) });
|
|
178
|
+
throw e;
|
|
179
|
+
}
|
|
180
|
+
// Jittered exponential backoff so a fleet of pollers doesn't retry in
|
|
181
|
+
// lockstep after a shared outage.
|
|
182
|
+
const wait = applyJitter(backoff(attempt));
|
|
183
|
+
log.warn('poll failed, backing off', { error: String(e), backoff_ms: wait });
|
|
184
|
+
attempt++;
|
|
185
|
+
await sleep(wait, this.#controller.signal);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
attempt = 0;
|
|
189
|
+
if (work == null) {
|
|
190
|
+
// Queue empty: either return now (drain) or wait and poll again.
|
|
191
|
+
if (this.#drain) return;
|
|
192
|
+
await sleep(jitter(1000, 3000), this.#controller.signal);
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
log.info('claimed work', {
|
|
196
|
+
component: 'work-poller',
|
|
197
|
+
environment_id: this.environmentId,
|
|
198
|
+
work_id: work.id,
|
|
199
|
+
work_type: work.data.type,
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
try {
|
|
203
|
+
await this.#runnerClient.beta.environments.work.ack(
|
|
204
|
+
work.id,
|
|
205
|
+
{ environment_id: work.environment_id },
|
|
206
|
+
{ headers: buildHeaders([this.#requestOpts?.headers]), signal: this.#controller.signal },
|
|
207
|
+
);
|
|
208
|
+
} catch (e) {
|
|
209
|
+
log.error('ack failed', { work_id: work.id, error: String(e) });
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
try {
|
|
214
|
+
yield work;
|
|
215
|
+
} finally {
|
|
216
|
+
// Post-handler stop. Runs whether the consumer body returned
|
|
217
|
+
// normally, threw, or `break`d out of the loop — unless the consumer
|
|
218
|
+
// owns the stop itself (`autoStop: false`).
|
|
219
|
+
if (this.#autoStop) {
|
|
220
|
+
try {
|
|
221
|
+
await this.#runnerClient.beta.environments.work.stop(
|
|
222
|
+
work.id,
|
|
223
|
+
{ environment_id: work.environment_id },
|
|
224
|
+
{ headers: buildHeaders([this.#requestOpts?.headers]) },
|
|
225
|
+
);
|
|
226
|
+
} catch (e) {
|
|
227
|
+
if (!isStatus(e, 409)) log.warn('stop failed', { work_id: work.id, error: String(e) });
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
} finally {
|
|
233
|
+
// Detach from the external signal so the consumer can drop their
|
|
234
|
+
// signal reference without leaking this iterator instance.
|
|
235
|
+
this.#detachExternal();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** Exponential poll backoff: 1s, 2s, 4s … clamped to a 60s cap. */
|
|
241
|
+
export function backoff(attempt: number): number {
|
|
242
|
+
return expBackoff(attempt, POLL_BACKOFF_BASE_MS, POLL_BACKOFF_CAP_MS);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function defaultWorkerId(): string {
|
|
246
|
+
// The API documents the worker id as a *unique* identifier for Redis consumer
|
|
247
|
+
// groups, so the fallback must be unique even when several pollers share a
|
|
248
|
+
// host. Prefix with the hostname when one is exposed for readability, but rely
|
|
249
|
+
// on the uuid for uniqueness.
|
|
250
|
+
const env = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env;
|
|
251
|
+
const host = env?.['HOSTNAME'];
|
|
252
|
+
return host ? `${host}-${uuid4()}` : uuid4();
|
|
253
|
+
}
|