- Export the sensitive-file-upload denylist guard from the package root: `assertSafeFileUploadPath`, `isBlockedSensitiveFileUploadPath`, and `BUILTIN_FILE_UPLOAD_PATH_DENY_SEGMENTS`
- Add an eve provider: `EveProvider` makes `session.tools()` return eve-native `defineTool`s and `defineComposioTools` is the replay-safe `step.started` resolver
- Eve provider hooks can rewrite, deny, or transform Tool Router meta-tool calls
- The sensitive-file-upload guard now routes filesystem access through the internal `#platform` abstraction and is edge/workerd-safe with no static `node:*` imports
- The `#platform` abstraction now includes a `realpathSync` platform method
- `triggers.create` now resolves the connection from `user_id` on the backend instead of client-side
- The SDK no longer makes an extra `connectedAccounts.list()` call when creating triggers; the backend resolves the first active connection for the user and toolkit
- `triggers.create` no longer throws `ComposioConnectedAccountNotFoundError` for a missing or invalid connection; this now surfaces as a backend error from the upsert call
- Normalize duplicate JSON Schema `required` entries before provider tool schemas are emitted
- Disable client retries on `tools.execute` and `tools.proxyExecute` to prevent duplicate side effects on non-idempotent writes
- Preserve successful local-tool results when the remote half of a mixed `COMPOSIO_MULTI_EXECUTE_TOOL` batch fails at the transport layer
- Fix the `homepage` links in package.json files to point at `tree/next/...` instead of the non-existent `tree/main/...` branch
- Treat local file paths that begin with `http` as paths instead of URLs, ensuring upload allowlist and sensitive-file denylist checks still run
- Execute every parallel tool call in `OpenAIProvider.handleToolCalls`; it previously only ran the first tool call and dropped the rest
- Resolve toolkit version pins case-insensitively by normalizing slugs symmetrically on both write and read paths
- Add SSRF guard on URL file inputs to refuse private, loopback, link-local, CGNAT, and reserved addresses, reject non-`http(s)` schemes, and manually follow redirects with re-validation
- Redact error telemetry by stripping URL query strings, `Authorization` credentials, and secret-like `key=value` pairs before transport
Minor Changes
-
fc17c37: Export the sensitive-file-upload denylist guard from the package root so downstream packages share one implementation:
assertSafeFileUploadPath,isBlockedSensitiveFileUploadPath, andBUILTIN_FILE_UPLOAD_PATH_DENY_SEGMENTS. The guard now routes its filesystem access through the internal#platformabstraction (adding arealpathSyncplatform method), so it is edge/workerd-safe and the module carries no staticnode:*imports. Behavior on Node/Bun is unchanged. -
20a4711:
triggers.createnow resolves the connection fromuser_idon the backend instead of client-side.- The SDK no longer makes an extra
connectedAccounts.list()call. WhenconnectedAccountIdis omitted, the backend resolves the first active connection for the user and the trigger's toolkit (ordered by most recently created), matching tool execution. - Behavior change:
createno longer throwsComposioConnectedAccountNotFoundErrorfor a missing or invalid connection. That case now surfaces as the backend error from the upsert call.ComposioTriggerTypeNotFoundError(invalid slug) andValidationError(including emptyuserId) are still thrown client-side. - Requires a backend that resolves the trigger connection from
user_idon upsert (ComposioHQ/platform#10932). Self-hosted deployments must be on a version that includes it.
- The SDK no longer makes an extra
Patch Changes
-
7125576: Normalize duplicate JSON Schema
requiredentries before provider tool schemas are emitted. -
58bc93b: Refresh dependency ranges and lockfiles across the workspace.
-
4c3a321: Disable client retries on
tools.executeandtools.proxyExecute. These are non-idempotent writes, so a silent retry after a read timeout could duplicate the side effect (e.g. send the same email more than once). Both now route through a sibling client built withmaxRetries: 0; reads keep the default retry behaviour. -
b07fcad: Add an eve provider:
EveProvidermakessession.tools()return eve-nativedefineTools,defineComposioToolsis the replay-safestep.startedresolver, and(ctx, next)hooks can rewrite, deny, or transform Tool Router meta-tool calls.Preserve successful local-tool results when the remote half of a mixed
COMPOSIO_MULTI_EXECUTE_TOOLbatch fails at the transport layer, so callers can see which side effects already completed before retrying. -
fa933a6: Fix the
homepagelinks in these packages'package.json. They pointed atgithub.com/ComposioHQ/composio/tree/main/..., but the default branch isnextand nomainbranch exists, so every link 404'd on npm and in editor tooltips. They now point attree/next/.... -
2ef40ce: Treat local file paths that begin with
httpas paths instead of URLs, ensuring that upload allowlist and sensitive-file denylist checks still run. -
e78ed31: Execute every parallel tool call in
OpenAIProvider.handleToolCalls. It previously only ran the first tool call in each assistant message, so parallel tool calls (on by default) dropped the rest and left theirtool_call_ids unanswered, failing the next request.The calls are run sequentially, in the order the model returned them — here "parallel" means the model issued several calls in one turn, not that they execute concurrently — so each
tool_call_idis answered exactly once and the tool messages come back in a deterministic order.Only the first choice is handled. Tool results are fed back into a single assistant turn, so with
n > 1iterating over every choice would run each tool call once per choice and orphan thetool_call_ids from the alternative completions. -
a0f37a7: Close two secret/SSRF exposure surfaces in the TypeScript SDK:
- SSRF guard on URL file inputs.
composio.files.upload(url)and automatic file upload during tool execution previously did a rawfetch()on user-supplied URLs with no guard. They now resolve the host and refuse private, loopback, link-local (incl. the169.254.169.254cloud-metadata endpoint), CGNAT, and reserved addresses, reject non-http(s)schemes, and follow redirects manually so each hop is re-validated (blocking a public URL that redirects into internal space). Blocked requests throwComposioBlockedInternalUrlError. Node-only; behaviour for public URLs is unchanged. - Telemetry redaction. Error telemetry previously shipped
error.message/error.stackverbatim. They are now passed through a redactor that strips URL query strings,Authorizationbearer/basic credentials, and secret-likekey=valuepairs (API keys, tokens, client secrets, passwords) before transport.
- SSRF guard on URL file inputs.
-
820abb9: Resolve toolkit version pins case-insensitively. Version maps are keyed by normalized (lowercase) slugs, but
getToolkitVersionpreviously looked them up with the raw slug, so a pin configured under a different casing (e.g.{ GitHub: '20250101_00' }orCOMPOSIO_TOOLKIT_VERSION_GITHUB) could silently fall back to'latest'. Normalization is now centralized in a singlenormalizeToolkitSlughelper used symmetrically on both the write (map-building) and read (lookup) paths, so the two sides can no longer drift. This mirrors the equivalent fix in the Python SDK. -
Updated dependencies [58bc93b]
-
Updated dependencies [fa933a6]
- @composio/json-schema-to-zod@0.2.1