mirror of
https://github.com/ComposioHQ/composio.git
synced 2026-09-22 11:46:35 +08:00
anthropic-example@0.1.2
5111 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
beeea625ab |
ci(security): harden docs-agent-eval caller (Bugbot fixes) (#4199)
## Security fixes for the docs-agent-eval caller (Cursor Bugbot findings) Follow-up to #4158 (merged). Cursor Bugbot flagged two real issues on the App-token caller; both fixed here. Two other findings were already resolved in the merged version (noted below). **Fixed:** - **App token left on disk (Medium):** check out the private engine with `persist-credentials: false`. Otherwise `actions/checkout` writes the GitHub App installation token into `engine/.git/config`, and the eval then runs untrusted agent code with filesystem access on the same runner — which could read that token (read access to the private engine repo). The token is only needed for the one-time fetch. - **Non-docs previews start evals (Medium):** the `deployment_status` trigger now requires the `environment_url` to start with `https://docs-` (matching the label path's `docs-*` rule), so a non-docs `*.preview.composio.dev` deployment can't start or cancel a docs eval. **Already resolved in #4158 (stale Bugbot findings from the pre-App design):** - "Unrelated labels cancel evals" — the route job's `startsWith(…, 'run-docs-tests')` guard skips unrelated `labeled` events before anything enters the eval concurrency group. - "Eval token cannot read deployments" — `deployments: read` is set on both jobs. Informational check, non-blocking. No behavior change beyond the two hardening fixes. 🤖 Generated with [Claude Code](https://claude.com/claude-code) |
||
|
|
55a17b992c |
ci: address Cursor Bugbot findings on the App-token caller
- App token left on disk (Medium): checkout the private engine with persist-credentials: false, so the App installation token is never written to engine/.git/config where the eval's agent steps (filesystem access on the same runner) could read it. Token is only needed for the one-time fetch. - Non-docs previews start evals (Medium): the deployment_status trigger now requires the environment_url to start with https://docs- (matching the label path's docs-* rule), so a non-docs *.preview.composio.dev deployment can't kick off or cancel a docs eval. Already-resolved findings (stale, from the pre-App design): "unrelated labels cancel evals" (route job's label guard skips unrelated labels before the concurrency group) and "token cannot read deployments" (deployments: read is set on both jobs). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
c0b71a5dc5 |
ci: label-triggered docs agent eval (V1, informational) (#4158)
## What this adds A **label-triggered, non-blocking CI check** that tests whether a docs PR's proposed content can still guide a fresh coding agent to working Composio code — before merge, against the PR's own Vercel preview. Add the **`run-docs-tests`** label to a docs PR → 1. A **route job** decides if and for which PR to run: label present + PR author is an org member/collaborator. Two entry paths so either order works — label added after the preview built (`pull_request` events), or preview built after the label (`deployment_status` events, which also cover new pushes; `synchronize` is deliberately not used). 2. A deterministic router classifies the change: **no-eval** (assets only) / **Smoke** (1 agent) / **Deep** (5 agents — auth, install, env-var, code-sample, endpoint, or navigation changes). `run-docs-tests-deep` forces Deep. 3. The PR's exact-HEAD preview URL is resolved from **GitHub's deployment records** (written by the Vercel↔GitHub integration, read with the per-run `GITHUB_TOKEN`) — **no Vercel credentials anywhere** (decision 2026-08-19). Isolated agents get it served through a rewrite proxy — they believe they're on docs.composio.dev. 4. Each agent (fresh env, ephemeral Composio project, torn down after) attempts the weather-toolkit task by following the docs. 5. An **independent judge** verdicts every run before teardown — re-executes the agent's script with the run's live key and scans for the v1 anti-patterns (hardcoded slugs, legacy packages, manual execution, /examples cheating). The agent's own success claim is recorded but never trusted; the PR comment shows L1·L2·L3 per run and any judge-overruled self-reports. 6. Result lands here as a PR comment: **PASS / FAIL / ERROR**, run counts, teardown status, and the agents' own docs-friction feedback. New pushes supersede stale runs (`cancel-in-progress`). **This file is a router + one SHA-pinned call** — all eval logic lives in [ComposioHQ/docs-agent-eval-ci](https://github.com/ComposioHQ/docs-agent-eval-ci) (reusable workflow, SHA-pinned per org policy). See its [ARCHITECTURE.md](https://github.com/ComposioHQ/docs-agent-eval-ci/blob/main/ARCHITECTURE.md) for the full component map and design-spec compliance audit. ## Evidence it works (sandbox runs) - End-to-end green Smoke, auto-routed: [run](https://github.com/ComposioHQ/docs-agent-eval-ci/actions/runs/32056739696) (PR #4125 → smoke → PASS 1/1) - End-to-end green Deep, auto-routed: [run](https://github.com/ComposioHQ/docs-agent-eval-ci/actions/runs/32057336110) (PR #4136 → deep via auth-docs signal → PASS 5/5, incl. agent feedback reproducing known docs findings) - The exact `workflow_call` mechanism this shim uses: [run](https://github.com/ComposioHQ/docs-agent-eval-ci/actions/runs/32059660256) - Receipts-based preview resolution live-verified on PR #4174 (exact-SHA → snapshot URL); fork PRs (no Vercel build) correctly produce the explained no-preview ERROR path - Builder (DeepSeek V4 Flash) calibrated 16/16 against production docs before any CI verdicts ## ⚠️ Before merge (repo admin) 1. ~~Secrets~~ **Done 2026-08-19**: `COMPOSIO_ORG_API_KEY` + `DEEPSEEK_API_KEY` exist in this repo's Actions secrets. (`VERCEL_TOKEN` is no longer needed — removed from the design.) Team-owned replacements for the individually-owned keys remain part of the rollout (current owner offboards Aug 31). 2. **Engine repo visibility**: `docs-agent-eval-ci` is currently *internal*; a public repo cannot call an internal reusable workflow, so it must be flipped public (pre-publication scrub done) **before** this merges. 3. **Pin bump**: after the engine's `no-vercel-credentials` PR merges, the `uses:` SHA here gets re-pinned to the engine's merge commit. Labels `run-docs-tests` / `run-docs-tests-deep` are already created. ## Non-goals (V1) Informational only — **do not mark this check required**. No merge blocking, no statistical thresholds, no LLM routing; scenario is the weather-toolkit eval only. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- ## Update 2026-08-21: keep the engine PRIVATE via a GitHub App Design change (Sarah): the engine repo stays **private** instead of going public. A public repo can't `uses:` a private repo's reusable workflow, so the `eval` job now runs the engine **inline**: 1. mints a short-lived **GitHub App token** (`actions/create-github-app-token`, SHA-pinned) scoped read-only to `docs-agent-eval-ci` 2. checks the private engine out with it (`path: engine/`) 3. runs the engine on the runner (`route_pr.py` → `run_full_eval.py`); result comment + check status still posted with composio's built-in `GITHUB_TOKEN` **⚠️ This supersedes the earlier public-reusable-workflow design in this PR — needs a fresh review of the `eval` job.** New repo secrets required (added): `DOCS_EVAL_APP_ID`, `DOCS_EVAL_APP_PRIVATE_KEY`, plus existing `COMPOSIO_ORG_API_KEY`, `DEEPSEEK_API_KEY`. No Vercel credentials. Before this can be tested: the GitHub App must be **installed** on ComposioHQ with **Contents: Read** on `docs-agent-eval-ci`. Since the check only fires from the default branch, testing happens after this merges (informational check, non-blocking, safe to merge to test). |
||
|
|
ceeac2ed00 |
ci: run private engine via GitHub App token (replaces public reusable-workflow call)
Keeps the engine repo private (Sarah 2026-08-21). A public repo can't `uses:` a private repo's reusable workflow, so the eval job now: 1. mints a short-lived GitHub App token (create-github-app-token, SHA-pinned) 2. checks out the private engine repo with it (path: engine/) 3. runs the engine inline (route_pr.py -> run_full_eval.py) on the runner Result comment + check status still posted with the built-in GITHUB_TOKEN (composio's own; App token is read-only on the engine repo). Needs repo secrets: DOCS_EVAL_APP_ID, DOCS_EVAL_APP_PRIVATE_KEY (added), plus existing COMPOSIO_ORG_API_KEY, DEEPSEEK_API_KEY. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
b983cc3f01 | ci: bump engine pin to prescribed-run-command release | ||
|
|
b82deeea3e |
ci: bump engine pin to b1e84be (hardcoded-tool false-positive fixes)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
d672787476 |
ci: bump engine pin to two-phase + independent-judge release (da8e10f)
Picks up the two-phase eval (vague build + surprise probe), the independent judge (PTY-driven probe, no self-reported evidence, full A-series + access DQs + build-phase anticipation log), and the trimmed CI watchdog ceilings. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
38899bdfa0 |
fix: use Tool Router schemas for custom MCP search (#4185)
## What this fixes
A custom MCP toolkit registered from the consumer dashboard could appear in the dashboard/Tool Router but not in `composio search`.
The CLI was receiving the custom toolkit from Tool Router search, then trying to fetch its schema through the legacy `/api/v3/tools/{slug}` endpoint. That endpoint does not serve dashboard-owned `CUSTOM_*` toolkits, so it returned 404 and the CLI could not complete the search result.
## How it fixes it
- For remote `CUSTOM_*` toolkit slugs with an inline `input_schema`, the CLI uses the schema already returned by Tool Router search.
- For `CUSTOM_*` results that contain only a `schemaRef`, the CLI calls Tool Router's `COMPOSIO_GET_TOOL_SCHEMAS` meta-tool in the same session and uses the returned schema.
- Both paths store the schema through the existing local tool-definition cache path, so normal execution can use it.
- Managed Composio toolkits keep the existing schema-fetch path.
- Existing cache behavior is unchanged.
## Reproduction
We reproduced this against a production dashboard-created DeepWiki custom MCP:
- Before the fix, a cold-cache CLI search reached the custom toolkit but failed on the legacy schema lookup with 404.
- With the fix, unfiltered `composio search` returned the custom MCP tools.
- Executing the returned custom tool succeeded and returned the DeepWiki response.
- Regression coverage also verifies the schema-reference path does not use the legacy endpoint.
## Scope
This fixes the `composio search` → normal execute path for dashboard-created custom MCP toolkits.
This PR does not change:
- CLI cache TTLs or refresh behavior
- Dashboard-to-CLI cache invalidation
- The separate schema paths used by `composio tools info` or `composio execute --dry-run`
## Validation
- Focused CLI tests: 21 passed
- Full CLI test suite: 1,256 passed, 1 skipped
- Source and test typechecks passed
- Focused Oxlint passed
- Production reproduction passed
@composio/cli@0.3.4-beta.360
|
||
|
|
48af98b031 |
ci: pin docs eval engine to main merge commit (judge + no-Vercel resolver)
Engine now includes the independent per-run judge (full v1 rubric, smoke+deep tested) and receipts-based preview resolution. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
a09aa44d68 | chore(cli): remove unused vitest alias | ||
|
|
9eefec573d |
docs: update toolkits, API spec, and meta tools data (#4184)
## Summary Automated sync of backend data into the docs site. Triggered by: `schedule`. ## What changed - **Toolkit catalog** (`docs/public/data/toolkits.json`, `toolkits-list.json`) — refreshed list of available toolkits, auth schemes, and tools from the backend API - **OpenAPI specs** (`docs/public/openapi.json`, `docs/public/openapi-v3.json`, `docs/public/openapi-webhooks.json`) — latest v3.1 and v3.0 API specifications plus the webhook-events spec, fetched from production - **API reference pages** (`docs/content/reference/api-reference/`, `docs/content/reference/v3/api-reference/`) — regenerated index pages for both API versions - **Meta tools reference** (`docs/public/data/meta-tools.json`, `docs/content/toolkits/meta-tools/*.mdx`) — updated meta tool schemas and reference docs Co-authored-by: Sushmithamallesh <19796925+Sushmithamallesh@users.noreply.github.com> Co-authored-by: Sushmitha Mallesh <sushdec6@gmail.com> |
||
|
|
7ed76f97fc | fix(cli): resolve custom schemas through tool router | ||
|
|
e71b6c9961 | refactor(cli): keep existing search cache behavior | ||
|
|
e19b998a9f |
Revert "fix(cli): avoid refreshing consumer cache on every search"
This reverts commit
|
||
|
|
623aee4ce9 |
Revert "refactor(cli): simplify search retry flow"
This reverts commit
|
||
|
|
88a106aacc |
Revert "test(cli): cover custom toolkit cache retry"
This reverts commit
|
||
|
|
0b742e4c0b |
Revert "fix(cli): retry after unsuccessful cache refresh"
This reverts commit
|
||
|
|
ea13890b63 | fix(cli): retry after unsuccessful cache refresh | ||
|
|
d4b96d9c83 | test(cli): cover custom toolkit cache retry | ||
|
|
c180103835 | refactor(cli): simplify search retry flow | ||
|
|
516292f9ba |
Merge remote-tracking branch 'origin/next' into codex/custom-mcp-cli-search-fix
# Conflicts: # ts/packages/cli/CHANGELOG.md |
||
|
|
9596776465 | fix(cli): avoid refreshing consumer cache on every search | ||
|
|
5e7432372a |
fix(cli): ship every codex-acp binary in release archives (#4186)
## Problem `composio upgrade` fails on every CLI currently in the field, including stable `0.3.3`: ``` 💥 services/UpgradeBinaryError • Downloaded binary package is incomplete Caused by: Missing companion module: …/extract/composio-darwin-aarch64/acp-adapters/codex/darwin-x64/codex-acp ``` `archiveCompanionRelativePaths` (added 2026-08-18 in #4134) narrows each release archive to the shared ACP assets plus only the one `codex-acp` its platform can execute. That is a sound optimisation, but it shipped writer-first: a CLI released *before* it verifies a downloaded package against `RUN_COMPANION_STATIC_ASSET_RELATIVE_PATHS` — shared assets plus **all four** codex target paths — with no parameter to relax the check, and hard-fails on any archive missing one. Stable `0.3.3` shipped 2026-08-11, a week before that change, so the entire installed stable base is affected. Recovery today means re-running `install.sh` by hand. Evidence: | Archive | codex binaries shipped | | --- | --- | | `0.3.4-beta.351` (pre-#4134) | `darwin-arm64`, `darwin-x64`, `linux-arm64`, `linux-x64` | | `0.4.0-beta.357` (post-#4134) | `darwin-arm64` only | ## Fix The reader has to become tolerant before the writer narrows, and the already-installed reader cannot be patched retroactively. Packaging ships the full companion set again. `archiveCompanionRelativePaths` stays in place with its tests, documented as deliberately uncalled. Re-wiring it into `package-binaries.ts` is a one-line change once no supported client still validates all four paths — worth roughly 651 MB per archive. ## Why CI missed it `cli.test-installation.yml` only exercises fresh `install.sh` installs, which are unaffected: each archive is internally consistent. Nothing covers an in-place upgrade from a previously released binary. Worth closing separately — it needs a real prior-stable binary in the matrix, not a unit test. ## Verification - `vitest run test/src/scripts/release-artifacts.test.ts` — 29 passed - `pnpm --filter @composio/cli typecheck` — clean - `pnpm validate:changesets` — passes (CLI is Changesets-ignored; note lands in `ts/packages/cli/CHANGELOG.md`) - Added coverage asserting every release artifact's codex-acp binary is in the packaged set - Final check is the archive itself: the beta cut from this branch must contain all four `acp-adapters/codex/*/codex-acp` entries, and `composio upgrade` must succeed from a pre-#4134 install `@composio/cli@0.4.0-beta.357` should be abandoned rather than promoted. https://claude.ai/code/session_01JkwtxPHfobZxzvAqe53x62@composio/cli@0.4.0-beta.359 @composio/cli@0.3.4-beta.358 |
||
|
|
62ed3f1d7e | Merge origin/next into custom MCP CLI fix | ||
|
|
f4c1070377 | fix: use Tool Router schemas for custom MCP search | ||
|
|
64406ff359 |
chore(cli): bump Bun to 1.4.0 and replace tar with Bun.Archive (#4183)
Bumps the mise-pinned Bun toolchain from 1.3.10 to 1.4.0 and replaces the one CLI dependency that a Bun 1.4 built-in can verifiably take over. ## Binary size: Linux shrinks a lot, macOS grows a little Measured per target, byte counts from `build:binary:all` on a darwin-arm64 host. | Target | Before (1.3.10) | After runtime (1.4.0) | After full | Δ total | Δ % | |---|---:|---:|---:|---:|---:| | `composio-darwin-aarch64` | 80,850,704 (77.1 MiB) | 83,790,962 (79.9 MiB) | 83,790,962 (79.9 MiB) | +2,940,258 (+2.8 MiB) | +3.6% | | `composio-darwin-x64` | 85,710,240 (81.7 MiB) | 90,430,880 (86.2 MiB) | 90,430,880 (86.2 MiB) | +4,720,640 (+4.5 MiB) | +5.5% | | `composio-linux-x64` | 123,666,298 (117.9 MiB) | 102,270,152 (97.5 MiB) | 102,270,152 (97.5 MiB) | -21,396,146 (-20.4 MiB) | -17.3% | | `composio-linux-aarch64` | 121,153,270 (115.5 MiB) | 102,221,816 (97.5 MiB) | 102,221,816 (97.5 MiB) | -18,931,454 (-18.1 MiB) | -15.6% | **Attribution — read this before quoting the numbers.** Every byte of movement above comes from the **Bun runtime bump**, not from dependency removal. The "after runtime" and "after full" columns are byte-identical: the only dependency dropped here is `tar`, a devDependency used by one build script that never reaches the binary. Its size contribution is exactly **0 bytes**. (The identical columns also confirm the compiled build is reproducible across runs.) Linux users — the large majority of installs — get a ~18-20 MiB smaller binary. macOS grows 2.8-4.5 MiB. This matches the direction upstream reports for the standalone Bun binary. ## What changed - `mise.toml` pins `bun = "1.4.0"`; `mise.lock` regenerated with the exact platform list `ts.audit` uses. - `scripts/_acp-adapters.ts` extracts npm tarballs with `Bun.Archive` instead of the `tar` package. - `tar` dropped from `@composio/cli` devDependencies (plus `@isaacs/fs-minipass`, `chownr`, `minizlib`, `yallist` from the lockfile). ## Verified negative results These are the two adjacent candidates a reviewer would expect to see replaced. Both were probed against a real Bun 1.4.0 binary and both fail — recorded here so nobody re-derives the dead ends: - **`extract-zip` stays.** `Bun.Archive` cannot read zip: `new Bun.Archive(zipBytes)` throws `Unrecognized archive format`, and `ArchiveOptions.compress` accepts only `"gzip"`. Still used at three call sites. - **`semver` stays.** `Object.keys(Bun.semver)` returns exactly `["satisfies", "order"]`. The CLI also needs `valid`, `prerelease`, `compare`, `gt`, and `lt`. `valid` and `prerelease` have no equivalent, so a partial migration would only add a second semver dialect. ## `json5` → `Bun.JSON5` was attempted and backed out `parse-json.ts` is covered by the CLI's Vitest suite, which runs on **Node**, where the `Bun` global does not exist — `Bun.JSON5.parse` throws `ReferenceError` under test. The suite cannot move to the Bun runtime (88 of 122 files fail there on unrelated zod resolution errors), and `bun test` for a single file would conflict with the repo's `@effect/vitest` lint rule. The swap itself is sound — `Bun.JSON5.parse` matched the `json5` package on all nine contract cases against a real 1.4.0 binary, including `SyntaxError` on malformed input. It is the test harness, not the parser, that blocks it. Deferred rather than shipped with weakened coverage. For sizing the follow-up: `--metafile-md` puts `json5` at **28,045 bytes (0.1%)** of the JS bundle, imported only by `src/utils/parse-json.ts` — roughly 0.03% of a compiled binary. Worth doing for dependency-surface reasons, not for size. ## Verification - All four release targets cross-compile on Bun 1.4.0. - `mise lock --platform linux-x64,linux-arm64,macos-arm64,macos-x64` then `git diff --exit-code mise.lock` is clean, replayed in a CI-like environment. - `pnpm typecheck` clean; CLI suite green (122 files, 1248 passed, 1 skipped). - `Bun.Archive` adapter build against the live npm registry produces codex-acp binaries **byte-identical** (SHA-256) to the `tar`-produced ones, at the same `package/bin/<name>` paths, executable after `chmod`, extracted concurrently. A truncated tarball throws `ReadError` rather than silently yielding an empty directory. - Runtime smoke on the 1.4.0 binary: `composio version`, `composio --help`, and the `composio run` companion-module spawn path (reports `process.version` v26.3.0 — no Node 26 stream regression). `extract-zip` verified working under the new runtime. ### Not run locally `pnpm test:e2e:cli` needs Docker, which was unavailable on this machine. CI covers it. Worth a look at that job: the e2e image is version-keyed and has served a stale Bun binary from a cached layer before, so confirm the container reports 1.4.0. ## Notes - `@types/bun` is deliberately not bumped: `Bun.JSON5` and `Bun.Archive` are already declared in the installed `bun-types@1.3.14`, no `@types/bun` 1.4.x exists yet, and `minimumReleaseAge` would block a fresh pin anyway. - No changeset: `@composio/cli` is in `.changeset/config.json`'s `ignore` list and no published package is touched. - `mise lock` locally adds a stray `[[tools.node]] 24.19.0` block sourced from the developer's global mise config. It was stripped; the committed lock is stable under the audit gate's exact command.@composio/cli@0.4.0-beta.357 @composio/cli@0.3.4-beta.356 |
||
|
|
a14f9d537f |
fix(py): normalize toolkit-less tool metadata (#4178)
This PR: - closes #4152 - normalizes model- and mapping-shaped tool responses at the Python SDK boundary - uses `unknown` for direct/schema modifiers and `composio` for Tool Router execution, matching TypeScript - caches the untouched fetched tool before schema modifiers so execution keeps the original toolkit version metadata - reuses the cached tool during execution instead of retrieving the same schema twice - adds behavior regressions for schema, before/after execution, single-fetch execution, raw metadata preservation, and TypeScript parity - verifies the Python regressions against both the current Stainless client and `ComposioHQ/composio-client` at `605f508e` |
||
|
|
d544006a25 |
fix(sdk): pin the validated address when fetching URLs (SSRF DNS rebinding) (#4172)
Fixes #4151. ## The problem Both SDKs validated a URL by resolving its hostname, and then handed the *hostname* to the HTTP client, which resolved it again when it opened the socket. Two lookups, two answers: a short-TTL record under an attacker's control answers publicly for the check and with `169.254.169.254`, `127.0.0.1`, or RFC 1918 space for the connect. The guard passes and the connection lands inside the network — classic TOCTOU DNS rebinding, documented in both modules until now as a known residual. ```mermaid sequenceDiagram participant SDK participant DNS as Attacker DNS participant Meta as 169.254.169.254 Note over SDK,Meta: before SDK->>DNS: resolve evil.example.com (validate) DNS-->>SDK: 93.184.216.34 — passes the guard SDK->>DNS: resolve evil.example.com (connect) DNS-->>SDK: 169.254.169.254 SDK->>Meta: GET /latest/meta-data/… Meta-->>SDK: credentials ``` ## The fix Resolve once, validate every answer, then connect to the address that was validated. There is no second lookup left to rebind. - **Python** — `safe_get` / `safe_request` mount a transport adapter that swaps the connect target for the duration of the socket connect only. The `Host` header and TLS SNI keep the hostname, so certificate verification is unchanged; rewriting `conn._dns_host` for the whole connection would have sent `Host: <ip>` and offered the IP as SNI, failing against every real origin. Every fetch call site now goes through those two helpers, so no `requests.get` sits next to a bare check any more: - `_files.py::_fetch_file_from_url`, `_files.py::FileDownloadable.download` - `tool_router_session_files.py::_fetch_url_bytes` - `safe_request`, per redirect hop - **TypeScript** — `assertSafeFetchTarget` returns the validated address and `ssrfSafeFetch` hands `fetch` a dispatcher pinned to it, re-pinned per redirect hop. The dispatcher goes to the runtime's own `fetch`, so callers that stub `globalThis.fetch` keep working. The pinned `lookup` answers both shapes Node calls it with — the address *list* it uses for Happy Eyeballs, and the single `(address, family)` it uses when `autoSelectFamily` is off — since answering in the wrong shape is rejected as an invalid address. - A fail-closed peer assertion runs on the Python side before a byte is written to the socket — redundant while pinning works, and a tripwire if a urllib3 upgrade ever breaks it. - `workerd` is unchanged: it already fails closed for user-supplied URLs. Redirect *validation* already existed in both SDKs (`safe_request` / `ssrfSafeFetch`); what was missing was re-pinning each hop. ## Tests The existing suites could not express this bug: they mock both the resolver and the HTTP client, so check and use are the same mock. The new tests use real sockets. - `python/tests/test_url_safety_pinning.py` — two loopback servers and a resolver that answers the first lookup with one endpoint and every later one with another, which is what a short-TTL rebinding record does. Asserts the rebound endpoint receives **zero** connections, and that `Host` still carries the hostname. Both tests fail on `next` and pass here. - `ts/packages/core/test/utils/pinnedDispatcher.node.test.ts` — a real server plus a hostname under `.invalid`, which RFC 2606 guarantees never resolves. A request that arrives proves the connect used the pinned address and never consulted DNS. The third case shows the contrast: unpinned, the same fetch cannot resolve at all. - `ssrfGuard.test.ts` gains assertions that each hop is pinned to that hop's own validated address. - `pinnedDispatcher.node.test.ts` also pins with `setDefaultAutoSelectFamily(false)`, which is the branch Node takes for the single-address callback. ## Notes - Supersedes #4157, which diagnosed this correctly. Its post-response peer check turned out not to hold: with an HTTP/1.0 or `Connection: close` server, urllib3 detaches the socket (`conn.sock is None`) while `r.content` still returns the full body, so the check fails open exactly where exfiltration succeeds. That is why the assertion here runs at connect time instead. - The Python package now declares `urllib3>=2` directly. `url_safety` imports it for `NameResolutionError`, which only exists from 2.0, and the pinning adapter reaches into 2.x connection internals; `requests` alone allows 1.x, where `import composio` would have failed outright. - `@composio/core` gains an `undici` dependency, pinned to `^7`: undici 8 dispatchers are rejected by the `fetch` in every Node version this package supports (22/24/25, verified). The real-socket test runs on the full CI matrix, so a future incompatibility fails loudly instead of silently un-pinning. - `undici` is imported on first pinned request rather than at module load: importing it installs a process-wide global dispatcher, which would have handed the host application's own unrelated `fetch` calls this package's undici merely because it imported `@composio/core`. - Residuals, now documented in the modules: - Requests routed through an environment proxy keep the pre-flight check only. The proxy resolves the hostname itself and the SDK cannot see or pin that resolution. - A process that does perform a pinned fetch still ends up on this package's `Agent` if nothing had claimed the global dispatcher slot yet. undici defines that slot non-configurable, so it cannot be handed back — assigning `undefined` leaves the runtime's own `fetch` asserting on a missing dispatcher. |
||
|
|
77eb7d45b9 |
docs(white-labeling): document the Connect Link theme editor (PRDE-1196) (#4175)
## What The **White Labeling** settings (Project Settings → White Labeling, at `/settings/auth-screen`) now ship a full **theme editor** for the hosted Connect Link page: seed colours, typefaces, geometry, and per-element styling, with a live preview across the Welcome/Form/Success/Error states, a JSON mode, and a server-enforced contrast floor. Both white-labeling guides only covered logo + app title, so this updates them. ## Changes - **`authentication/white-labeling-authentication.mdx`** (current, sessions) and **`auth-configuration/white-labeling.mdx`** (legacy, direct execution) — split "Customizing the Connect Link" into: - **Logo and name** (Branding tab) - **Colors, fonts, and per-element styling** (Styling tab) - Aligned terminology to the shipped UI: **White Labeling** nav item, **Branding**/**Styling** tabs, **Typefaces**, **JSON** toggle, **Save Changes**, and the enforced-contrast note. - Added `auth-screen-theme-editor.png`; removed the now-stale branding-only `connect-link-branding.mp4`. - The legacy page keeps all its direct-execution content (`initiate()`, `long_redirect_url`) untouched. ## Notes - The theme editor is gated behind the `link-auth-theming` flag, so the docs include a troubleshooting line for projects where the Styling tab hasn't rolled out yet. - The screenshot currently shows the Branding tab in its default state; it can be swapped for a Styling-tab shot with a custom theme over the same filename later. 🤖 Generated with [Claude Code](https://claude.com/claude-code) |
||
|
|
bfcd99447f |
docs(white-labeling): document the Connect Link theme editor (PRDE-1196)
The Auth Screen branding settings now ship a full theme editor (colors, typefaces, geometry, and per-element styling with a live preview and JSON mode), so both white-labeling guides need to cover it. - Split "Customizing the Connect Link" into Logo and name (Branding tab) and Colors, fonts, and per-element styling (Styling tab). - Align to the shipped UI: White Labeling nav item, Branding/Styling tabs, Typefaces, JSON toggle, Save Changes, and the enforced-contrast gate. - Add the editor screenshot; drop the stale branding-only walkthrough video. - Mirror the section into the legacy direct-execution page. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
6fa60f203e |
ci: dual-trigger docs eval, org-member gate, no Vercel secrets
- deployment_status + labeled/reopened triggers (synchronize dropped): label-then-push and push-then-label both work; either event checks for the other half before running - route job maps deployment SHA -> open PR, requires a run-docs-tests label AND an org-affiliated PR author (public-repo hardening) - secrets down to COMPOSIO_ORG_API_KEY + DEEPSEEK_API_KEY; preview resolution moved into the engine via GitHub deployment records (no Vercel credentials anywhere, decision 2026-08-19) - engine pin bumped to the no-vercel-credentials resolver Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
52a222f3bc | fix: refresh consumer toolkit cache before search | ||
|
|
bddb089390 |
docs: update toolkits, API spec, and meta tools data (#4173)
## Summary Automated sync of backend data into the docs site. Triggered by: `schedule`. ## What changed - **Toolkit catalog** (`docs/public/data/toolkits.json`, `toolkits-list.json`) — refreshed list of available toolkits, auth schemes, and tools from the backend API - **OpenAPI specs** (`docs/public/openapi.json`, `docs/public/openapi-v3.json`, `docs/public/openapi-webhooks.json`) — latest v3.1 and v3.0 API specifications plus the webhook-events spec, fetched from production - **API reference pages** (`docs/content/reference/api-reference/`, `docs/content/reference/v3/api-reference/`) — regenerated index pages for both API versions - **Meta tools reference** (`docs/public/data/meta-tools.json`, `docs/content/toolkits/meta-tools/*.mdx`) — updated meta tool schemas and reference docs Co-authored-by: Sushmithamallesh <19796925+Sushmithamallesh@users.noreply.github.com> |
||
|
|
06cdcd4633 |
docs: update toolkits, API spec, and meta tools data (#4125)
## Summary Automated sync of backend data into the docs site. Triggered by: `schedule`. ## What changed - **Toolkit catalog** (`docs/public/data/toolkits.json`, `toolkits-list.json`) — refreshed list of available toolkits, auth schemes, and tools from the backend API - **OpenAPI specs** (`docs/public/openapi.json`, `docs/public/openapi-v3.json`, `docs/public/openapi-webhooks.json`) — latest v3.1 and v3.0 API specifications plus the webhook-events spec, fetched from production - **API reference pages** (`docs/content/reference/api-reference/`, `docs/content/reference/v3/api-reference/`) — regenerated index pages for both API versions - **Meta tools reference** (`docs/public/data/meta-tools.json`, `docs/content/toolkits/meta-tools/*.mdx`) — updated meta tool schemas and reference docs |
||
|
|
ada4aff921 | docs: update toolkits and API data | ||
|
|
9bc6fb28a8 |
ci: pin to eval release with graceful no-preview ERROR handling
Fork PRs (no Vercel build) now yield an explanatory ERROR verdict instead of a jobless crash. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
9fe68b96f0 |
docs(providers): resolve session-aware helper pins to published versions (#4171)
Follow-up to #4170 / #4161, deferred until npm publish landed (per #4098's own follow-up note). - bumps `docs/package.json` pins: `@composio/core` `^0.15.0` -> `^0.17.0`, `@composio/anthropic` `^0.10.1` -> `^0.11.0`, `@composio/openai` `^0.11.0` -> `^0.12.0` — all three are now live on npm - removes the `@errors: 2345` Twoslash suppression markers (and their TODO comments) in the OpenAI and Anthropic provider docs, now that the session-aware `handleToolCalls`/`executeToolCall` overloads type-check against the resolved package versions - regenerates `docs/bun.lock` ## Verification - `bun install` resolves `@composio/core@0.17.0`, `@composio/anthropic@0.11.0`, `@composio/openai@0.12.0` - `bun run types:check` passes - `bun run build` passes, including Twoslash compilation of the updated code samples with the suppression markers removed |
||
|
|
f031c27cd1 |
Release: update version (#4161)
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to next, this PR will be updated. # Releases ## @composio/core@0.17.0 ### Minor Changes -py@0.20.0 @composio/anthropic@0.11.0 @composio/core@0.17.0 @composio/openai@0.12.0 @composio/slim@0.17.0 |
||
|
|
e3534e7ea6 |
chore(sdk): prepare Python 0.20.0 and TypeScript 0.17.0 releases (#4170)
This PR: - bumps `composio` and all 13 provider distributions from `0.19.0` to `0.20.0`, keeping `python/composio/__version__.py` and `uv.lock` aligned with package metadata - adds `docs/content/changelog/08-19-26-sdk-releases.mdx`, the combined customer-facing changelog for both SDKs, documenting the session-aware provider tool-call helpers from #4098 (Python `composio` 0.20.0, TypeScript `@composio/core`/`@composio/slim` 0.17.0, `@composio/anthropic` 0.11.0, `@composio/openai` 0.12.0) and the API-response URL validation and Python file-handling fixes shipped since the last train - documents `@composio/core` `0.17.0` in that entry so the generated Changesets release PR (#4161) passes the release-workflow guard ## Release sequence 1. Merge this PR. 2. Merge #4161 (the generated "Release: update version" PR) once it goes green. Merging publishes the TypeScript packages to npm. 3. Tag the resulting `next` commit `py@0.20.0` to publish the Python packages to PyPI. 4. Follow-up PR: bump `docs/package.json` pins to `@composio/core@^0.17.0`, `@composio/anthropic@^0.11.0`, `@composio/openai@^0.12.0` and remove the now-stale `@errors: 2345` Twoslash TODO markers in the provider docs, once the npm publish lands. ## Verification - Verified the release-workflow guard reads the new changelog rows for Python `0.20.0` and TypeScript `@composio/core` `0.17.0` - All 13 Python `pyproject.toml`/`setup.py` pairs bumped consistently; `uv.lock` regenerated |
||
|
|
9dd762c9bd |
docs: update documentation for new changelog entries (#4137)
## Summary Automated documentation updates triggered by new changelog entries merged to next. Generated by Codex via GitHub Actions. Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> |
||
|
|
760f8d0367 |
fix(sdk): route provider tool calls through sessions (#4098)
## Problem Provider tool-call helpers always used the globally injected direct `Tools.execute` function. When a model received tools from `session.tools()`, calling `handleToolCalls` or `handle_tool_calls` therefore discarded the Tool Router session context and caused session meta-tools such as `COMPOSIO_SEARCH_TOOLS` to fail. Calling `session.execute()` manually preserved the session, but bypassed provider behavior such as Anthropic input normalization and schema-alias restoration. ## Root fix - Add an explicit execution target to the non-agentic provider helpers: - TypeScript: `handleToolCalls(session, response)` and `executeToolCall(session, call)` - Python: `handle_tool_calls(response=response, session=session)` and `execute_tool_call(tool_call=call, session=session)` - Route normalized provider arguments through the supplied Tool Router session. - Map session responses back to each helper's existing result shape. - Keep provider-specific normalization before execution, including Anthropic schema-alias restoration. - Reject direct-only options and modifiers when the selected target is a session, including plain JavaScript calls that bypass the TypeScript overloads. - Update OpenAI and Anthropic examples to use the session-aware helpers. - Harden the docs policy test so setup and execution split across fences in one sample are still detected. ## Docs review follow-ups - Reword the concepts-page prohibition so it forbids user-ID-bound helper calls, not the helpers themselves, matching the provider pages in this PR. - Add minimum-version callouts to the OpenAI and Anthropic provider pages (Python `composio` newer than 0.19.0; TypeScript `@composio/core` ≥ 0.17.0 with `@composio/openai` ≥ 0.12.0 / `@composio/anthropic` ≥ 0.11.0), pointing older versions at `session.execute()`. - Bump `docs/package.json` to `@composio/core` `^0.15.0` and `@composio/openai` `^0.11.0` (the published majors at the time of the bump; `@composio/core` 0.16.0 and `composio` 0.19.0 have since released from `next` without this PR, so its changeset will publish core 0.17.0 and the next Python minor) and annotate each `@errors: 2345` Twoslash marker with a TODO naming the minor version that retires it; since this changeset releases minors, all three pins need a manual range bump to retire the markers. This version of twoslash only throws on *unlisted* errors, so a stale marker cannot break the build — it would only mask future TS2345s, which the TODOs now track. - Update `SESSION_GUARDRAILS` (the block appended to `.md` responses for agents): add a session-execution bullet (scoped to the OpenAI and Anthropic helpers, with `session.execute()` for every other provider) and qualify the direct-execution list with "with a user ID". The session-execution static test now scans the guardrail blocks like the execute-version test already did. - Tighten the docs detector: the Python branch is bounded to the helper call's argument list (tolerating one level of nested calls) instead of running past the closing paren, and the TypeScript branch catches whole user-ID identifiers (`userId`, `user_id`, `uid`) without flagging session variables like `userSession` — each edge has a regression test. - Note on the Google provider page that its `executeToolCall` is not session-aware yet. ## Compatibility and release Existing user-ID calls remain unchanged and continue to use direct tool execution. The new session call forms are additive. The changeset applies minor releases to `@composio/core`, `@composio/openai`, and `@composio/anthropic` — the new session overloads are a type-level break for provider subclasses, so patch was too small. The configured fixed group also includes `@composio/slim`. The docs site intentionally checks examples against currently published SDK declarations. The three new TypeScript calls therefore carry exact Twoslash `TS2345` release-skew annotations; remove them (per the inline TODOs) once `docs/package.json` picks up `@composio/core` ≥ 0.17.0, `@composio/openai` ≥ 0.12.0, and `@composio/anthropic` ≥ 0.11.0. ## Verification - `@composio/core`: 1,061 tests passed; typecheck passed - `@composio/openai`: 34 tests passed; typecheck passed - `@composio/anthropic`: 53 tests passed; typecheck passed - Python provider and aliasing suites: 40 passed, 4 skipped - Focused Python mypy and Ruff checks passed - Docs static suite: 208 tests passed (including the new guardrail-scan and detector cases) - Docs production build passed with the bumped `@composio/core` 0.15.0 / `@composio/openai` 0.11.0, including Twoslash, TypeScript, and all generated pages - Docs lint passed; lint reports only existing warnings - Changeset status reports the expected minor packages --------- Co-authored-by: Soumya Medapati <soumyamedapati@soumyas-air.local.meter> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: jkomyno <alberto@composio.dev> |
||
|
|
2dc58681ec |
ci: explicit minimal secrets for the eval call; pin to decisions release
Review decision 2: replace secrets:inherit (which exposed every repo secret to the called workflow) with the four the eval needs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
a5e91d3d97 |
ci: run-docs-tests-deep now triggers standalone; pin to fixed engine release
Review findings: the deep label alone previously did nothing (exact-match contains); the prior pin contained a fatal missing-module bug fixed in docs-agent-eval-ci@7d9833c. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
b1c6671b20 |
fix(py): send Content-Type on S3 PUTs and parse Content-Length (#4168)
This PR: - fixes #4153 - supersedes https://github.com/ComposioHQ/composio/pull/4154 (fork PR authored against a pre-#4146 tree; its tests patch `requests.put`, which `upload()` no longer calls after #4146, so they fail on merge) - adds `parse_content_length()` in `composio.utils.url_safety`, shared by both URL fetch helpers (`_files.py::_fetch_file_from_url` and `tool_router_session_files.py::_fetch_url_bytes`), so a malformed/negative remote `Content-Length` degrades to unknown size under the streamed byte count instead of raising a raw `ValueError` - converges the file and bytes upload paths onto `_upload_to_presigned_url()`: one PUT that sends the `Content-Type` the presign request was signed with and raises `ErrorUploadingFile` carrying the HTTP status (a 403 no longer collapses into a path-only error) - single-sources the presign wire shape via `_request_presigned_upload()`; `from_path()` forwards the exact mimetype it minted, so signed and sent content types cannot drift - mirrors the TypeScript SDK: `uploadFileToS3` funnels path/URL/File inputs through one uploader that always sends `Content-Type` and throws on non-2xx, and `readResponseBodyWithLimit` trusts `Content-Length` only as a hint - adds tests against the `safe_request` seam (`test_file_upload_robustness.py`, plus one malformed-header case for `RemoteFile.buffer()`) ## Context Both defects in #4153 were symptoms of two parallel upload paths drifting: the bytes path sent `Content-Type` and raised with the status, the file path did neither. Patching the symptom in place (as #4154 proposed) would have left three presigned PUT sites and two error contracts in the tree; this PR deletes the drift vector instead. Full suite green (1320 passed), `make chk` and `make snt` clean; Python-only change, so no changeset per `AGENTS.md`. --------- Co-authored-by: Mustaqeem66 <265153888+Mustaqeem66@users.noreply.github.com> |
||
|
|
03429c7404 | fix(python): create the cache directory on first use instead of at import time (#4162) | ||
|
|
389902f0ac |
chore(deps): bump the npm-production group across 1 directory with 25 updates (#4160)
Bumps the npm-production group with 25 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@anthropic-ai/claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-typescript) | `0.3.221` | `0.3.233` | | [@mastra/mcp](https://github.com/mastra-ai/mastra/tree/HEAD/packages/mcp) | `1.15.0` | `1.16.0` | | [ai](https://github.com/vercel/ai/tree/HEAD/packages/ai) | `6.0.241` | `6.0.256` | | [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript) | `0.115.0` | `0.117.1` | | [@google/genai](https://github.com/googleapis/js-genai) | `2.15.0` | `2.17.1` | | [@langchain/core](https://github.com/langchain-ai/langchainjs) | `1.2.4` | `1.2.8` | | [@langchain/langgraph](https://github.com/langchain-ai/langgraphjs/tree/HEAD/libs/langgraph-core) | `1.4.9` | `1.4.10` | | [@langchain/openai](https://github.com/langchain-ai/langchainjs) | `1.5.5` | `1.5.8` | | [langchain](https://github.com/langchain-ai/langchainjs) | `1.5.4` | `1.5.9` | | [@openai/agents](https://github.com/openai/openai-agents-js) | `0.14.2` | `0.16.0` | | [@langchain/anthropic](https://github.com/langchain-ai/langchainjs) | `1.5.2` | `1.5.6` | | [open](https://github.com/sindresorhus/open) | `11.0.0` | `11.0.1` | | [typebox](https://github.com/sinclairzx81/typebox) | `1.3.10` | `1.3.14` | | [@mastra/schema-compat](https://github.com/mastra-ai/mastra/tree/HEAD/packages/schema-compat) | `1.3.4` | `1.3.7` | | [@ai-sdk/mcp](https://github.com/vercel/ai/tree/HEAD/packages/mcp) | `2.0.24` | `2.0.32` | | [@ai-sdk/openai](https://github.com/vercel/ai/tree/HEAD/packages/openai) | `4.0.29` | `4.0.42` | | [@cloudflare/vitest-pool-workers](https://github.com/cloudflare/workers-sdk/tree/HEAD/packages/vitest-pool-workers) | `0.20.1` | `0.21.3` | | [@cloudflare/workers-types](https://github.com/cloudflare/workerd) | `5.20260804.1` | `5.20260815.1` | | [@effect/language-service](https://github.com/Effect-TS/language-service) | `0.87.1` | `0.87.2` | | [@mastra/core](https://github.com/mastra-ai/mastra/tree/HEAD/packages/core) | `1.52.1` | `1.59.0` | | [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk) | `1.26.0` | `1.30.0` | | [hono](https://github.com/honojs/hono) | `4.13.1` | `4.13.2` | | [pnpm](https://github.com/pnpm/pnpm/tree/HEAD/pnpm11/pnpm) | `11.20.0` | `11.21.0` | | [tsx](https://github.com/privatenumber/tsx) | `4.23.5` | `4.23.12` | | [wrangler](https://github.com/cloudflare/workers-sdk/tree/HEAD/packages/wrangler) | `4.118.0` | `4.123.0` | Updates `@anthropic-ai/claude-agent-sdk` from 0.3.221 to 0.3.233 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/anthropics/claude-agent-sdk-typescript/releases">@anthropic-ai/claude-agent-sdk's releases</a>.</em></p> <blockquote> <h2>v0.3.233</h2> <h2>What's changed</h2> <ul> <li>Notification hooks now fire for pending permission prompts on the SDK path, matching the interactive REPL behavior</li> <li>Todo/task-tracking tools (<code>TaskCreate</code>/<code>TaskGet</code>/<code>TaskUpdate</code>/<code>TaskList</code>, <code>TodoWrite</code>) are no longer in the default tool surface on Opus 4.8, Sonnet 5, Fable 5, Mythos 5, and newer models; name them in the <code>tools</code> option or reference them in <code>allowedTools</code> (or set <code>CLAUDE_CODE_ENABLE_TODO_TOOLS=1</code>) to keep them</li> </ul> <h2>Update</h2> <pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.233 # or yarn add @anthropic-ai/claude-agent-sdk@0.3.233 # or pnpm add @anthropic-ai/claude-agent-sdk@0.3.233 # or bun add @anthropic-ai/claude-agent-sdk@0.3.233 </code></pre> <h2>v0.3.232</h2> <h2>What's changed</h2> <ul> <li>Subagent MCP <code>tool_result</code> frames whose result carries <code>_meta</code> now emit <code>tool_use_result</code> as <code>{ content, _meta }</code> (matching main-loop frames) instead of a bare value</li> <li><code>/context</code> result messages now carry a structured <code>context_usage</code> payload (new <code>SDKContextUsage</code> type), so consumers can render the context-usage card without parsing the markdown table</li> <li><code>vcs_state_changed</code> events now populate the <code>branch</code> field for push operations, sourced from the pushed ref</li> </ul> <h2>Update</h2> <pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.232 # or yarn add @anthropic-ai/claude-agent-sdk@0.3.232 # or pnpm add @anthropic-ai/claude-agent-sdk@0.3.232 # or bun add @anthropic-ai/claude-agent-sdk@0.3.232 </code></pre> <h2>v0.3.231</h2> <h2>What's changed</h2> <ul> <li>Updated to parity with Claude Code v2.1.231</li> </ul> <h2>Update</h2> <pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.231 # or yarn add @anthropic-ai/claude-agent-sdk@0.3.231 # or pnpm add @anthropic-ai/claude-agent-sdk@0.3.231 </tr></table> </code></pre> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md">@anthropic-ai/claude-agent-sdk's changelog</a>.</em></p> <blockquote> <h2>0.3.233</h2> <ul> <li>Notification hooks now fire for pending permission prompts on the SDK path, matching the interactive REPL behavior</li> <li>Todo/task-tracking tools (<code>TaskCreate</code>/<code>TaskGet</code>/<code>TaskUpdate</code>/<code>TaskList</code>, <code>TodoWrite</code>) are no longer in the default tool surface on Opus 4.8, Sonnet 5, Fable 5, Mythos 5, and newer models; name them in the <code>tools</code> option or reference them in <code>allowedTools</code> (or set <code>CLAUDE_CODE_ENABLE_TODO_TOOLS=1</code>) to keep them</li> </ul> <h2>0.3.232</h2> <ul> <li>Subagent MCP <code>tool_result</code> frames whose result carries <code>_meta</code> now emit <code>tool_use_result</code> as <code>{ content, _meta }</code> (matching main-loop frames) instead of a bare value</li> <li><code>/context</code> result messages now carry a structured <code>context_usage</code> payload (new <code>SDKContextUsage</code> type), so consumers can render the context-usage card without parsing the markdown table</li> <li><code>vcs_state_changed</code> events now populate the <code>branch</code> field for push operations, sourced from the pushed ref</li> </ul> <h2>0.3.231</h2> <ul> <li>Updated to parity with Claude Code v2.1.231</li> </ul> <h2>0.3.230</h2> <ul> <li>Updated to parity with Claude Code v2.1.230</li> </ul> <h2>0.3.229</h2> <ul> <li>Added <code>terminal_slash_commands</code> to the system init message so Remote Control clients can hide terminal-oriented commands</li> <li>Changed conversations whose messages alone exceed the API's 32 MB limit to end the turn with <code>terminal_reason</code> <code>"api_error"</code> instead of <code>"image_error"</code>; <code>StopFailure</code> <code>error_details</code> is <code>"request_body_over_limit: …"</code></li> </ul> <h2>0.3.228</h2> <ul> <li>Agent tool results (<code>AgentOutput</code>): <code>usage.output_tokens_details</code> is now carried through</li> </ul> <h2>0.3.227</h2> <ul> <li>Updated to parity with Claude Code v2.1.227</li> </ul> <h2>0.3.226</h2> <ul> <li>Updated to parity with Claude Code v2.1.226</li> </ul> <h2>0.3.225</h2> <ul> <li>Fixed background subagents in headless/SDK sessions never resuming when a background shell command or Monitor they left running completed, so the subagent never saw the result</li> </ul> <h2>0.3.224</h2> <ul> <li>Added <code>crossSessionInbound</code> and <code>dialogExpiry</code> settings: cross-session messages sent to a session running with bypassed permissions are held for your approval, and messages to other sessions auto-deliver</li> <li>Added <code>subkind: 'peer-send-message'</code> to the <code>task-notification</code> member of <code>SDKMessageOrigin</code>, marking a notification raised by a cross-session <code>SendMessage</code></li> <li>Added <code>source: 'archive'</code> plugin config variant to <code>Settings</code>, with <code>url</code> and optional <code>sha256</code>, for installing plugins from a zip over HTTPS</li> <li>Added sandbox credential-masking fields to <code>Settings</code>: <code>decode: 'jwt'</code> with <code>maskClaims</code>, <code>extract</code>/<code>onExtractNoMatch</code> on <code>envVars</code>, and <code>awsPairs</code>/<code>sigv4</code> for AWS SigV4 re-signing</li> <li>Fixed long (>200 char) project paths resolving to another project's session directory under a shared sanitized prefix; session list/get/rename/tag/fork/delete and <code>/resume</code> no longer cross projects</li> </ul> <h2>0.3.223</h2> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/anthropics/claude-agent-sdk-typescript/commit/73a28abad0d5015568404ecfe0d9cad3ed479fe3"><code>73a28ab</code></a> chore: Update CHANGELOG.md</li> <li><a href="https://github.com/anthropics/claude-agent-sdk-typescript/commit/8716a39f83dd7506e6421199caface603d4941ab"><code>8716a39</code></a> chore: Update CHANGELOG.md</li> <li><a href="https://github.com/anthropics/claude-agent-sdk-typescript/commit/b5321a4b65ec1b034fea19f684e2d8db728875da"><code>b5321a4</code></a> chore: Update CHANGELOG.md</li> <li><a href="https://github.com/anthropics/claude-agent-sdk-typescript/commit/71dfabbc343457793684e21d3085bb7a5f8c3f46"><code>71dfabb</code></a> chore: Update CHANGELOG.md</li> <li><a href="https://github.com/anthropics/claude-agent-sdk-typescript/commit/0a2639d6b561af90342d4a98c93f9cc807d0e5ce"><code>0a2639d</code></a> chore: Update CHANGELOG.md</li> <li><a href="https://github.com/anthropics/claude-agent-sdk-typescript/commit/22847067d63ef74234a0542a302cc3608de5e837"><code>2284706</code></a> chore: Update CHANGELOG.md</li> <li><a href="https://github.com/anthropics/claude-agent-sdk-typescript/commit/d13c50c54d591cb2355672c8259fbb6e159687f9"><code>d13c50c</code></a> chore: Update CHANGELOG.md</li> <li><a href="https://github.com/anthropics/claude-agent-sdk-typescript/commit/4cae4b76341d9a17a2e30915cbd84a79aba1b305"><code>4cae4b7</code></a> chore: Update CHANGELOG.md</li> <li><a href="https://github.com/anthropics/claude-agent-sdk-typescript/commit/86e3e9464ea31b62b94de39412d70ff2b8b5f97b"><code>86e3e94</code></a> chore: Update CHANGELOG.md</li> <li><a href="https://github.com/anthropics/claude-agent-sdk-typescript/commit/064793e6da11fbaf00509ef1ab66f374fb379cbc"><code>064793e</code></a> chore: Update CHANGELOG.md</li> <li>Additional commits viewable in <a href="https://github.com/anthropics/claude-agent-sdk-typescript/compare/v0.3.221...v0.3.233">compare view</a></li> </ul> </details> <br /> Updates `@mastra/mcp` from 1.15.0 to 1.16.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/mastra-ai/mastra/releases">@mastra/mcp's releases</a>.</em></p> <blockquote> <h2>Mar 25, 2026</h2> <h2>Highlights</h2> <h3>Smarter Model Selection for Observational Memory</h3> <p><code>@mastra/memory</code> now lets you route observer and reflector calls to different models based on input size using <code>ModelByInputTokens</code>. Short inputs can go to a fast, cheap model while longer ones get sent to a more capable one -- all configured declaratively with token thresholds. Tracing shows which model was selected and why.</p> <h3>MongoDB Support for Datasets and Experiments</h3> <p><code>@mastra/mongodb</code> now stores versioned datasets with full item history and time-travel queries, plus experiment results and CRUD. If you're already using <code>MongoDBStore</code>, this works automatically with no extra setup.</p> <h3>Okta Auth and RBAC</h3> <p>New <code>@mastra/auth-okta</code> package brings SSO authentication and role-based access control via Okta. Map Okta groups to Mastra permissions, verify JWTs against Okta's JWKS endpoint, and manage sessions -- or pair Okta RBAC with a different auth provider like Auth0 or Clerk.</p> <h3>Breaking Changes</h3> <ul> <li>None called out in this changelog.</li> </ul> <h2>Changelog</h2> <h3><a href="https://github.com/mastra-ai/mastra/blob/@mastra/core@1.16.0//private/var/folders/d4/mn8gvlx91cz80s_9c4gjr12r0000gn/T/mastra-mastra-ai-mastra-_mastra_core_1.16.0/packages/core/CHANGELOG.md">@mastra/core@1.16.0</a></h3> <h4>Minor Changes</h4> <ul> <li> <p>Added dataset-agent association and experiment status tracking for the Evaluate workflow. (<a href="https://redirect.github.com/mastra-ai/mastra/pull/14470">#14470</a>)</p> <ul> <li><strong>Dataset targeting</strong>: Added <code>targetType</code> and <code>targetIds</code> fields to datasets, enabling association with agents, scorers, or workflows. Datasets can now be linked to multiple entities.</li> <li><strong>Experiment status</strong>: Added <code>status</code> field to experiment results (<code>'needs-review'</code>, <code>'reviewed'</code>, <code>'complete'</code>) for review queue workflow.</li> <li><strong>Dataset experiment routes</strong>: Added API endpoints for triggering experiments from a dataset with configurable target type and target ID.</li> <li><strong>LLM data generation</strong>: Added endpoint for generating dataset items using an LLM with configurable count and prompt.</li> <li><strong>Failure analysis</strong>: Added endpoint for clustering experiment failures and proposing tags using LLM analysis.</li> </ul> </li> <li> <p>Added agent version support for experiments. When triggering an experiment, you can now pass an <code>agentVersion</code> parameter to pin which agent version to use. The agent version is stored with the experiment and returned in experiment responses. (<a href="https://redirect.github.com/mastra-ai/mastra/pull/14562">#14562</a>)</p> <pre lang="ts"><code>const client = new MastraClient(); <p>await client.triggerDatasetExperiment({ datasetId: "my-dataset", targetType: "agent", targetId: "my-agent", version: 3, // pin to dataset version 3 agentVersion: "ver_abc123" // pin to a specific agent version }); </code></pre></p> </li> <li> <p>Added tool suspension handling to the Harness. (<a href="https://redirect.github.com/mastra-ai/mastra/pull/14611">#14611</a>)</p> <p>When a tool calls <code>suspend()</code> during execution, the harness now emits a <code>tool_suspended</code> event, reports <code>agent_end</code> with reason <code>'suspended'</code>, and exposes <code>respondToToolSuspension()</code> to resume execution with user-provided data.</p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/mastra-ai/mastra/blob/main/packages/mcp/CHANGELOG.md">@mastra/mcp's changelog</a>.</em></p> <blockquote> <h2>1.16.0</h2> <h3>Minor Changes</h3> <ul> <li> <p>Updated the MCP client and server to run on the MCP 2.0 packages. Request context, authentication, logging, and progress behavior are unchanged, so tools that read <code>context.mcp.extra.authInfo</code>, send progress, or use elicitation keep working as before. (<a href="https://redirect.github.com/mastra-ai/mastra/pull/18683">#18683</a>)</p> <p>Tool schemas advertised over MCP no longer declare a draft-07 <code>$schema</code> dialect. The MCP 2.0 default validator rejects that dialect, which previously made tools with output schemas fail on the client.</p> <p><strong>If you pass a custom schema validator</strong></p> <p>The optional <code>jsonSchemaValidator</code> option now takes its validator from the MCP packages. Update the import path:</p> <pre lang="ts"><code>// Before import { CfWorkerJsonSchemaValidator } from '@modelcontextprotocol/sdk/validation/cfworker'; <p>// After import { CfWorkerJsonSchemaValidator } from '<code>@modelcontextprotocol/client/</code>validators/cf-worker';</p> <p>const mcp = new MCPClient({ servers: { weather: { url: new URL('<a href="https://example.com/mcp">https://example.com/mcp</a>'), jsonSchemaValidator: new CfWorkerJsonSchemaValidator() }, }, }); </code></pre></p> <p><strong>If you import MCP protocol types directly</strong></p> <p>Types re-exported by <code>@mastra/mcp</code> (such as <code>ToolAnnotations</code>, <code>LoggingLevel</code>, and the OAuth helpers) are unchanged and need no edits. Only imports that reached past <code>@mastra/mcp</code> into <code>@modelcontextprotocol/sdk</code> need repointing to <code>@modelcontextprotocol/client</code> or <code>@modelcontextprotocol/server</code>.</p> </li> <li> <p>Add opt-in security hardening options to the MCP client. Both options are opt-in; default behavior is unchanged. (<a href="https://redirect.github.com/mastra-ai/mastra/pull/20868">#20868</a>)</p> <ul> <li><code>allowedHosts</code> on HTTP server configs restricts which hosts the client's HTTP requests may target, covering the initial connection, the SSE fallback, and OAuth discovery. On the default fetch path redirect hops are blocked before they are sent; with a custom <code>fetch</code>, the final response URL is validated after the request runs, so custom fetch implementations must enforce redirect policy themselves when preventing outbound contact is required.</li> <li><code>inheritDefaultEnv: false</code> on stdio server configs stops the subprocess from inheriting the SDK's default environment variables; only the entries you list in <code>env</code> are passed.</li> </ul> <pre lang="typescript"><code>const mcp = new MCPClient({ servers: { weather: { url: new URL('https://weather.example/mcp'), allowedHosts: ['weather.example'], }, local: { command: 'npx', args: ['tsx', 'stdio-server.ts'], inheritDefaultEnv: false, env: { WEATHER_API_KEY: process.env.WEATHER_API_KEY! }, }, }, }); </code></pre> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/mastra-ai/mastra/commit/387c6b7f5a76e34bc3e2a1ec34cd5893abf4dcf4"><code>387c6b7</code></a> chore: version - exit prerelease mode</li> <li><a href="https://github.com/mastra-ai/mastra/commit/361c421ca280e3fe6955ae91625931416bf4a731"><code>361c421</code></a> chore: version packages</li> <li><a href="https://github.com/mastra-ai/mastra/commit/1b1dd7bc0e59b7a8bfabd09a3eec1ccd95b4c2f3"><code>1b1dd7b</code></a> Cache MCP tool definitions and rebuild tools without reconnecting at startup ...</li> <li><a href="https://github.com/mastra-ai/mastra/commit/ac0a3b8bcd5777b803b6b6aba2b6b60026919adc"><code>ac0a3b8</code></a> chore: version packages (alpha) (<a href="https://github.com/mastra-ai/mastra/tree/HEAD/packages/mcp/issues/20769">#20769</a>)</li> <li><a href="https://github.com/mastra-ai/mastra/commit/9ba12470c77f1c03642d720ce67e517e878f666e"><code>9ba1247</code></a> fix(mcp): send MCP content text to the model via toModelOutput (<a href="https://github.com/mastra-ai/mastra/tree/HEAD/packages/mcp/issues/20176">#20176</a>)</li> <li><a href="https://github.com/mastra-ai/mastra/commit/289f4ce16e3293370440172132c52ee787cbc09f"><code>289f4ce</code></a> fix(core,mcp): coerce sub-agent maxSteps and prevent spurious MCP reconnects ...</li> <li><a href="https://github.com/mastra-ai/mastra/commit/8e23a0b207f34b84bd28f3bf554c6931d8025b97"><code>8e23a0b</code></a> chore: version packages</li> <li><a href="https://github.com/mastra-ai/mastra/commit/e7a5da4ef8e4dd452d2f232961b4e682a85ffe43"><code>e7a5da4</code></a> feat: MCP v2 (draft) (<a href="https://github.com/mastra-ai/mastra/tree/HEAD/packages/mcp/issues/18683">#18683</a>)</li> <li><a href="https://github.com/mastra-ai/mastra/commit/c71e3077e69eae3f25aa628e3778f153a9d6ab36"><code>c71e307</code></a> feat(mcp): opt-in allowedHosts URL policy and inheritDefaultEnv stdio isolati...</li> <li><a href="https://github.com/mastra-ai/mastra/commit/03348e6bea7d4b44edb3298e286506afdbcc04f0"><code>03348e6</code></a> chore(deps): update security updates [security] (major) (<a href="https://github.com/mastra-ai/mastra/tree/HEAD/packages/mcp/issues/19265">#19265</a>)</li> <li>Additional commits viewable in <a href="https://github.com/mastra-ai/mastra/commits/@mastra/mcp@1.16.0/packages/mcp">compare view</a></li> </ul> </details> <br /> Updates `ai` from 6.0.241 to 6.0.256 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/vercel/ai/releases">ai's releases</a>.</em></p> <blockquote> <h2>ai@6.0.256</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [31205a4] <ul> <li><code>@ai-sdk/provider-utils</code><a href="https://github.com/4"><code>@4</code></a>.0.46</li> <li><code>@ai-sdk/gateway</code><a href="https://github.com/3"><code>@3</code></a>.0.174</li> </ul> </li> </ul> <h2>ai@6.0.255</h2> <h3>Patch Changes</h3> <ul> <li>35a94b0: Keep chat status submitted until response content begins streaming.</li> <li>93d24c6: Avoid repeatedly cloning accumulated text in <code>readUIMessageStream</code> while preserving independent snapshots for mutable nested values.</li> <li>1bd1caf: Fix declaration emit for exported values that infer an <code>Output</code> type.</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/vercel/ai/blob/ai@6.0.256/packages/ai/CHANGELOG.md">ai's changelog</a>.</em></p> <blockquote> <h2>6.0.256</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [31205a4] <ul> <li><code>@ai-sdk/provider-utils</code><a href="https://github.com/4"><code>@4</code></a>.0.46</li> <li><code>@ai-sdk/gateway</code><a href="https://github.com/3"><code>@3</code></a>.0.174</li> </ul> </li> </ul> <h2>6.0.255</h2> <h3>Patch Changes</h3> <ul> <li>35a94b0: Keep chat status submitted until response content begins streaming.</li> <li>93d24c6: Avoid repeatedly cloning accumulated text in <code>readUIMessageStream</code> while preserving independent snapshots for mutable nested values.</li> <li>1bd1caf: Fix declaration emit for exported values that infer an <code>Output</code> type.</li> </ul> <h2>6.0.254</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [71e94ad] <ul> <li><code>@ai-sdk/gateway</code><a href="https://github.com/3"><code>@3</code></a>.0.173</li> </ul> </li> </ul> <h2>6.0.253</h2> <h3>Patch Changes</h3> <ul> <li>d91d30b: Preserve reasoning block IDs from UI message streams on reasoning UI parts.</li> <li>Updated dependencies [0ec239b] <ul> <li><code>@ai-sdk/gateway</code><a href="https://github.com/3"><code>@3</code></a>.0.172</li> </ul> </li> </ul> <h2>6.0.252</h2> <h3>Patch Changes</h3> <ul> <li>2f96d3f: Allow providers without reranking model support to satisfy the <code>Provider</code> type.</li> <li>afb1965: Propagate errors thrown by the Chat <code>onFinish</code> callback to the initiating request.</li> <li>Updated dependencies [18b0965]</li> <li>Updated dependencies [451d2c3] <ul> <li><code>@ai-sdk/gateway</code><a href="https://github.com/3"><code>@3</code></a>.0.171</li> </ul> </li> </ul> <h2>6.0.251</h2> <h3>Patch Changes</h3> <ul> <li>d13c2e9: Respect ToolLoopAgent timeouts configured in agent settings.</li> </ul> <h2>6.0.250</h2> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vercel/ai/commit/85464f4e2026d9fc0274424c0171a25742836411"><code>85464f4</code></a> Version Packages (<a href="https://github.com/vercel/ai/tree/HEAD/packages/ai/issues/18920">#18920</a>)</li> <li><a href="https://github.com/vercel/ai/commit/4b050c0884f1f3c8f66867e8a91e3c5d70f8ac20"><code>4b050c0</code></a> Version Packages (<a href="https://github.com/vercel/ai/tree/HEAD/packages/ai/issues/18865">#18865</a>)</li> <li><a href="https://github.com/vercel/ai/commit/1bd1caf15fd87dd74c2c2e4af70800b3107b9af0"><code>1bd1caf</code></a> [v6.0] fix: declaration emit failure for exported utilities using Prompt and ...</li> <li><a href="https://github.com/vercel/ai/commit/93d24c6d8b664f4bb218d2e725eae3a9d6115f05"><code>93d24c6</code></a> [v6.0] fix: prevent quadratic readUIMessageStream allocation without weakenin...</li> <li><a href="https://github.com/vercel/ai/commit/9190ea8c3766862cb4bf6262a0061a4c3b8e6c2a"><code>9190ea8</code></a> Version Packages (<a href="https://github.com/vercel/ai/tree/HEAD/packages/ai/issues/18855">#18855</a>)</li> <li><a href="https://github.com/vercel/ai/commit/35a94b09b323a9b30a7f2c3974e15f00092881a0"><code>35a94b0</code></a> [v6.0] fix: keep chat submitted until response content starts streaming (<a href="https://github.com/vercel/ai/tree/HEAD/packages/ai/issues/18861">#18861</a>)</li> <li><a href="https://github.com/vercel/ai/commit/f8cf14d13c66794cac9be6b024c20e1e316cbf9a"><code>f8cf14d</code></a> Version Packages (<a href="https://github.com/vercel/ai/tree/HEAD/packages/ai/issues/18786">#18786</a>)</li> <li><a href="https://github.com/vercel/ai/commit/d91d30b0151c52120a6d791a47c4bfd1da4a4065"><code>d91d30b</code></a> [v6.0] fix: reasoning UI message parts lose their SSE block IDs (<a href="https://github.com/vercel/ai/tree/HEAD/packages/ai/issues/18753">#18753</a>)</li> <li><a href="https://github.com/vercel/ai/commit/1b0361cdd052701c9b043cd2bc87ab3035d4929d"><code>1b0361c</code></a> Version Packages (<a href="https://github.com/vercel/ai/tree/HEAD/packages/ai/issues/18745">#18745</a>)</li> <li><a href="https://github.com/vercel/ai/commit/afb19653c29338697ee7e3697752ebbe96bd62b5"><code>afb1965</code></a> [v6.0] fix: propagate errors thrown by Chat onFinish callbacks (<a href="https://github.com/vercel/ai/tree/HEAD/packages/ai/issues/18736">#18736</a>)</li> <li>Additional commits viewable in <a href="https://github.com/vercel/ai/commits/ai@6.0.256/packages/ai">compare view</a></li> </ul> </details> <br /> Updates `@anthropic-ai/sdk` from 0.115.0 to 0.117.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/anthropics/anthropic-sdk-typescript/releases">@anthropic-ai/sdk's releases</a>.</em></p> <blockquote> <h2>sdk: v0.117.1</h2> <h2>0.117.1 (2026-08-13)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.117.0...sdk-v0.117.1">sdk-v0.117.0...sdk-v0.117.1</a></p> <h3>Chores</h3> <ul> <li><strong>ci:</strong> allow manually re-publishing a package to npm from the release workflow (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/af60c1f980557368fb10c3701d8dc8a1fa75d70e">af60c1f</a>)</li> <li><strong>internal:</strong> tag uploaded preview builds with the branch name (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/295">#295</a>) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/228f44ee4848e6a26be27d26093635e2dba783ea">228f44e</a>)</li> </ul> <h2>sdk: v0.117.0</h2> <h2>0.117.0 (2026-08-13)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.116.0...sdk-v0.117.0">sdk-v0.116.0...sdk-v0.117.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> add output_behavior to dream creation (create a new memory store or update the input store in place) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/6a5bd0f34d214759f97d485e46b09203fff3ea99">6a5bd0f</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>build:</strong> include dotfiles when flattening dist during git installs (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/917dbbb40070dbd1f861b16fcf297720d96f691b">917dbbb</a>)</li> <li><strong>client:</strong> add models (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/a7bfbb1b31e9d1dffe9a83b90ec1d0dabf5c36db">a7bfbb1</a>)</li> <li><strong>messages:</strong> honor per-request timeout in the non-streaming long-request check (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/272">#272</a>) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/0fdd8a8feb5d16fbb943490a2b1e8ecf915596d6">0fdd8a8</a>)</li> <li><strong>streaming:</strong> apply all message_delta fields when accumulating streamed messages (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/289">#289</a>) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/7b82659d70201ae3edab846f1693366db7e62ce3">7b82659</a>)</li> <li><strong>tool-runner:</strong> forward the response container id to the next request (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/271">#271</a>) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/5bdee4a8ddd83e2f1c71daa429345b3b0fea4602">5bdee4a</a>)</li> <li><strong>tools:</strong> align path resolution, skill-archive members, and heartbeat bounds with the other SDKs (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/264">#264</a>) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/5fbc729c82ec3967c9f76428d0f733b5fa61ddd5">5fbc729</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>ci:</strong> run breaking-change detection as a ci.yml job on every push (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/c34c1d53f3227b3978621590e67f5a33f5cad107">c34c1d5</a>)</li> <li><strong>internal:</strong> switch from yarn to pnpm (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/f4eeea09648620d35517513814ffdc3bd3080801">f4eeea0</a>)</li> <li><strong>tools:</strong> escape backslashes in skill archive exclusion patterns (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/311">#311</a>) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/67ede1c665883b7785af3240c749601d7ca19255">67ede1c</a>)</li> </ul> <h3>Documentation</h3> <ul> <li><strong>api:</strong> clarify that user profile name is optional for resold profiles (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/1b6fed5868bd16dd92120440d373da22084be237">1b6fed5</a>)</li> </ul> <h2>sdk: v0.116.0</h2> <h2>0.116.0 (2026-08-07)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.115.0...sdk-v0.116.0">sdk-v0.115.0...sdk-v0.116.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> add <code>mid-conversation-tool-changes-2026-07-01</code> beta (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/70e04f689baa233e7cb2fed6bb807562f5595928">70e04f6</a>)</li> <li><strong>api:</strong> add support for session budgets, advisor tool, pinned inference location and skills auto-loading from GitHub (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/1336a4a90387a7005f6211b6df5e2b247f4cb6b3">1336a4a</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md">@anthropic-ai/sdk's changelog</a>.</em></p> <blockquote> <h2>0.117.1 (2026-08-13)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.117.0...sdk-v0.117.1">sdk-v0.117.0...sdk-v0.117.1</a></p> <h3>Chores</h3> <ul> <li><strong>ci:</strong> allow manually re-publishing a package to npm from the release workflow (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/af60c1f980557368fb10c3701d8dc8a1fa75d70e">af60c1f</a>)</li> <li><strong>internal:</strong> tag uploaded preview builds with the branch name (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/295">#295</a>) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/228f44ee4848e6a26be27d26093635e2dba783ea">228f44e</a>)</li> </ul> <h2>0.117.0 (2026-08-13)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.116.0...sdk-v0.117.0">sdk-v0.116.0...sdk-v0.117.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> add output_behavior to dream creation (create a new memory store or update the input store in place) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/6a5bd0f34d214759f97d485e46b09203fff3ea99">6a5bd0f</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>build:</strong> include dotfiles when flattening dist during git installs (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/917dbbb40070dbd1f861b16fcf297720d96f691b">917dbbb</a>)</li> <li><strong>client:</strong> add models (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/a7bfbb1b31e9d1dffe9a83b90ec1d0dabf5c36db">a7bfbb1</a>)</li> <li><strong>messages:</strong> honor per-request timeout in the non-streaming long-request check (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/272">#272</a>) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/0fdd8a8feb5d16fbb943490a2b1e8ecf915596d6">0fdd8a8</a>)</li> <li><strong>streaming:</strong> apply all message_delta fields when accumulating streamed messages (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/289">#289</a>) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/7b82659d70201ae3edab846f1693366db7e62ce3">7b82659</a>)</li> <li><strong>tool-runner:</strong> forward the response container id to the next request (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/271">#271</a>) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/5bdee4a8ddd83e2f1c71daa429345b3b0fea4602">5bdee4a</a>)</li> <li><strong>tools:</strong> align path resolution, skill-archive members, and heartbeat bounds with the other SDKs (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/264">#264</a>) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/5fbc729c82ec3967c9f76428d0f733b5fa61ddd5">5fbc729</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>ci:</strong> run breaking-change detection as a ci.yml job on every push (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/c34c1d53f3227b3978621590e67f5a33f5cad107">c34c1d5</a>)</li> <li><strong>internal:</strong> switch from yarn to pnpm (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/f4eeea09648620d35517513814ffdc3bd3080801">f4eeea0</a>)</li> <li><strong>tools:</strong> escape backslashes in skill archive exclusion patterns (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/311">#311</a>) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/67ede1c665883b7785af3240c749601d7ca19255">67ede1c</a>)</li> </ul> <h3>Documentation</h3> <ul> <li><strong>api:</strong> clarify that user profile name is optional for resold profiles (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/1b6fed5868bd16dd92120440d373da22084be237">1b6fed5</a>)</li> </ul> <h2>0.116.0 (2026-08-07)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.115.0...sdk-v0.116.0">sdk-v0.115.0...sdk-v0.116.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> add <code>mid-conversation-tool-changes-2026-07-01</code> beta (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/70e04f689baa233e7cb2fed6bb807562f5595928">70e04f6</a>)</li> <li><strong>api:</strong> add support for session budgets, advisor tool, pinned inference location and skills auto-loading from GitHub (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/1336a4a90387a7005f6211b6df5e2b247f4cb6b3">1336a4a</a>)</li> <li><strong>tools:</strong> make bash timeout and abort errors matchable by class (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/259">#259</a>) (<a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/201b12e8acd69d7ab7068fe078f7988ab23897d2">201b12e</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/64a1e8e285bbcc4cef2b15ebcadccd8e5f6987ff"><code>64a1e8e</code></a> chore: release main</li> <li><a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/0281a291359489284c116d1adea6d13aa7a94b6d"><code>0281a29</code></a> chore(ci): allow manually re-publishing a package to npm from the release wor...</li> <li><a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/f3e060b568a09556fea9288b688e1191f28f0935"><code>f3e060b</code></a> chore(internal): tag uploaded preview builds with the branch name (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/295">#295</a>)</li> <li><a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/6fcfb2c3fce958e59750df3e4a8fda969c5ff171"><code>6fcfb2c</code></a> chore: release main</li> <li><a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/1a1af331442d9e9fc4ba172d87e4bc46a48255b1"><code>1a1af33</code></a> codegen metadata</li> <li><a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/d6b8f40ffe75a80a53b1464b8cce05b54ecac40d"><code>d6b8f40</code></a> chore: release main</li> <li><a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/5edda861559d809092bead9617a1073324a64585"><code>5edda86</code></a> chore(tools): escape backslashes in skill archive exclusion patterns (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/311">#311</a>)</li> <li><a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/07cf28ce9d07da7d7c2b96d064d7a370d261c5bc"><code>07cf28c</code></a> chore(internal): switch from yarn to pnpm</li> <li><a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/a751543f5e0ba2096cc49821c351f8b3a82216ab"><code>a751543</code></a> docs(api): clarify that user profile name is optional for resold profiles</li> <li><a href="https://github.com/anthropics/anthropic-sdk-typescript/commit/0c74ed0372883d85378e5f85526d072e12d1997b"><code>0c74ed0</code></a> fix(build): include dotfiles when flattening dist during git installs</li> <li>Additional commits viewable in <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.115.0...sdk-v0.117.1">compare view</a></li> </ul> </details> <br /> Updates `@google/genai` from 2.15.0 to 2.17.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/googleapis/js-genai/releases">@google/genai's releases</a>.</em></p> <blockquote> <h2>v2.17.1</h2> <h2><a href="https://github.com/googleapis/js-genai/compare/v2.17.0...v2.17.1">2.17.1</a> (2026-08-13)</h2> <h3>Bug Fixes</h3> <ul> <li>Add gemini-3.7-flash (<a href="https://github.com/googleapis/js-genai/commit/c495e82719486d90561eeb7dc476b9fbaa26077b">c495e82</a>)</li> </ul> <h2>v2.17.0</h2> <h2><a href="https://github.com/googleapis/js-genai/compare/v2.16.0...v2.17.0">2.17.0</a> (2026-08-12)</h2> <h3>Features</h3> <ul> <li>Add interaction_status to LiveServerContent (<a href="https://github.com/googleapis/js-genai/commit/4489991a7c40b22dff75348748048b0b14ac687e">4489991</a>)</li> <li><strong>api:</strong> make the deferred service tier publicly available on Vertex (<a href="https://github.com/googleapis/js-genai/commit/9dafee9cd0f6089221bce5269dbd53fe7fa69806">9dafee9</a>)</li> <li>Make speech_config a structured object. (<a href="https://github.com/googleapis/js-genai/commit/9c9066594a57bda7ee417d79f8ef15c8ed0b333d">9c90665</a>)</li> </ul> <h2>v2.16.0</h2> <h2><a href="https://github.com/googleapis/js-genai/compare/v2.15.0...v2.16.0">2.16.0</a> (2026-08-06)</h2> <h3>Features</h3> <ul> <li>Add the Gemini Robotics ER 2 Preview model (<a href="https://github.com/googleapis/js-genai/commit/5647cedfcf3fc5f862b01fb908d6aae267d8bb91">5647ced</a>)</li> <li>Add TOO_MANY_TOOL_CALLS to FinishReason enum. (<a href="https://github.com/googleapis/js-genai/commit/a7fa5683bc86a3edce347f6259fca8face0df3a4">a7fa568</a>)</li> <li>Add top-level errors array to Interaction resource (iAPI) (<a href="https://github.com/googleapis/js-genai/commit/b9dfd814a16ae985685ebcf5cb99a82625167142">b9dfd81</a>)</li> <li>Make HttpOptions.timeout a per-attempt deadline in the JS GenAI SDK. (<a href="https://github.com/googleapis/js-genai/commit/8268806b3090834870ca6b901bdf289415425bac">8268806</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li>Add propertyOrdering auto-population for ResponseSchema and ResponseJsonSchema for Dotnet SDK (<a href="https://github.com/googleapis/js-genai/commit/e26542fc58f832e0b88affab5c266fd0c469d01c">e26542f</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/googleapis/js-genai/blob/main/CHANGELOG.md">@google/genai's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/googleapis/js-genai/compare/v2.17.0...v2.17.1">2.17.1</a> (2026-08-13)</h2> <h3>Bug Fixes</h3> <ul> <li>Add gemini-3.7-flash (<a href="https://github.com/googleapis/js-genai/commit/c495e82719486d90561eeb7dc476b9fbaa26077b">c495e82</a>)</li> </ul> <h2><a href="https://github.com/googleapis/js-genai/compare/v2.16.0...v2.17.0">2.17.0</a> (2026-08-12)</h2> <h3>Features</h3> <ul> <li>Add interaction_status to LiveServerContent (<a href="https://github.com/googleapis/js-genai/commit/4489991a7c40b22dff75348748048b0b14ac687e">4489991</a>)</li> <li><strong>api:</strong> make the deferred service tier publicly available on Vertex (<a href="https://github.com/googleapis/js-genai/commit/9dafee9cd0f6089221bce5269dbd53fe7fa69806">9dafee9</a>)</li> <li>Make speech_config a structured object. (<a href="https://github.com/googleapis/js-genai/commit/9c9066594a57bda7ee417d79f8ef15c8ed0b333d">9c90665</a>)</li> </ul> <h2><a href="https://github.com/googleapis/js-genai/compare/v2.15.0...v2.16.0">2.16.0</a> (2026-08-06)</h2> <h3>Features</h3> <ul> <li>Add the Gemini Robotics ER 2 Preview model (<a href="https://github.com/googleapis/js-genai/commit/5647cedfcf3fc5f862b01fb908d6aae267d8bb91">5647ced</a>)</li> <li>Add TOO_MANY_TOOL_CALLS to FinishReason enum. (<a href="https://github.com/googleapis/js-genai/commit/a7fa5683bc86a3edce347f6259fca8face0df3a4">a7fa568</a>)</li> <li>Add top-level errors array to Interaction resource (iAPI) (<a href="https://github.com/googleapis/js-genai/commit/b9dfd814a16ae985685ebcf5cb99a82625167142">b9dfd81</a>)</li> <li>Make HttpOptions.timeout a per-attempt deadline in the JS GenAI SDK. (<a href="https://github.com/googleapis/js-genai/commit/8268806b3090834870ca6b901bdf289415425bac">8268806</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li>Add propertyOrdering auto-population for ResponseSchema and ResponseJsonSchema for Dotnet SDK (<a href="https://github.com/googleapis/js-genai/commit/e26542fc58f832e0b88affab5c266fd0c469d01c">e26542f</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/googleapis/js-genai/commit/7736083c6d062ef423a378aecef154aab6def8a2"><code>7736083</code></a> chore(main): release 2.17.1 (<a href="https://redirect.github.com/googleapis/js-genai/issues/1853">#1853</a>)</li> <li><a href="https://github.com/googleapis/js-genai/commit/c495e82719486d90561eeb7dc476b9fbaa26077b"><code>c495e82</code></a> fix: Add gemini 3.7</li> <li><a href="https://github.com/googleapis/js-genai/commit/dec2d3cbbc3c3928520d5c22fbbb2333b00b4ac9"><code>dec2d3c</code></a> chore: Update GCS references to Cloud Storage in descriptions</li> <li><a href="https://github.com/googleapis/js-genai/commit/0e80b4275655ed21cf1c390772da3e22b2a5a1db"><code>0e80b42</code></a> Copybara import of the project:</li> <li><a href="https://github.com/googleapis/js-genai/commit/4d15a7b78f5fceae4dca09f343c065e18f42b282"><code>4d15a7b</code></a> chore: remove deprecated Turn types</li> <li><a href="https://github.com/googleapis/js-genai/commit/49153845ff8968dff7403ce01ebd24e261403cda"><code>4915384</code></a> chore(main): release 2.17.0 (<a href="https://redirect.github.com/googleapis/js-genai/issues/1833">#1833</a>)</li> <li><a href="https://github.com/googleapis/js-genai/commit/9c9066594a57bda7ee417d79f8ef15c8ed0b333d"><code>9c90665</code></a> feat: Make speech_config a structured object.</li> <li><a href="https://github.com/googleapis/js-genai/commit/b98223e26e043c40f41369d9c5eb84a5c776f85c"><code>b98223e</code></a> No public description</li> <li><a href="https://github.com/googleapis/js-genai/commit/4489991a7c40b22dff75348748048b0b14ac687e"><code>4489991</code></a> feat: Add interaction_status to LiveServerContent</li> <li><a href="https://github.com/googleapis/js-genai/commit/9dafee9cd0f6089221bce5269dbd53fe7fa69806"><code>9dafee9</code></a> feat(api): make the deferred service tier publicly available on Vertex</li> <li>Additional commits viewable in <a href="https://github.com/googleapis/js-genai/compare/v2.15.0...v2.17.1">compare view</a></li> </ul> </details> <br /> Updates `@langchain/core` from 1.2.4 to 1.2.8 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langchainjs/releases">@langchain/core's releases</a>.</em></p> <blockquote> <h2><code>@langchain/core</code><a href="https://github.com/1"><code>@1</code></a>.2.8</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11369">#11369</a> <a href="https://github.com/langchain-ai/langchainjs/commit/d6ad9735640a6c729f81ef79361acc5e83c526f1"><code>d6ad973</code></a> Thanks <a href="https://github.com/hntrl"><code>@hntrl</code></a>! - fix(langchain): use unified endpoint for gateway</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11342">#11342</a> <a href="https://github.com/langchain-ai/langchainjs/commit/3b0e4c48a31811031a460c4d95519a7c1163dc41"><code>3b0e4c4</code></a> Thanks <a href="https://github.com/thushanth-bengre-langchain"><code>@thushanth-bengre-langchain</code></a>! - feat(core): mark errors as retryable or not, and stop retrying the ones that aren't</p> <p>Retry middleware retried every failure up to <code>maxRetries</code>, including deterministic ones like a bad API key or an unknown model. Retries also nest, so a single such failure could cost dozens of API calls.</p> <p><code>@langchain/core/errors</code> adds <code>stampRetryable(error, retryable)</code> and <code>getRetryable(error)</code>. Marking an error leaves its class and shape untouched, so a provider SDK error can be classified without breaking <code>instanceof</code>. <code>getRetryable</code> returns <code>undefined</code> for errors nobody classified, and both are exported so tool authors can mark their own failures.</p> <p><code>modelRetryMiddleware</code> and <code>toolRetryMiddleware</code> now respect the mark by default, and retries stop as soon as one is found rather than each layer spending its own budget. Aborted calls, context overflow, and oversized payloads are marked non-retryable out of the box. Models accept a per-call <code>maxRetries</code> so a surrounding retry loop can take over.</p> <p><strong>Behavior change:</strong> errors marked non-retryable now fail on the first attempt. Unclassified errors — including any from third-party integrations or custom tools — retry exactly as before. Pass <code>retryOn: () => true</code> to restore the old default. A custom <code>onFailedAttempt</code> replaces the built-in handler and opts out of marking.</p> </li> </ul> <h2><code>@langchain/core</code><a href="https://github.com/1"><code>@1</code></a>.2.7</h2> <h3>Patch Changes</h3> <ul> <li><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11366">#11366</a> <a href="https://github.com/langchain-ai/langchainjs/commit/c068bbf8c113132bf16ac7a8add44e486a147b41"><code>c068bbf</code></a> Thanks <a href="https://github.com/hntrl"><code>@hntrl</code></a>! - fix(core,langchain): patch and release core, update peer dependencies</li> </ul> <h2><code>@langchain/core</code><a href="https://github.com/1"><code>@1</code></a>.2.6</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11344">#11344</a> <a href="https://github.com/langchain-ai/langchainjs/commit/f08e0c6d50156accf95a36469a3e107a5598a3a0"><code>f08e0c6</code></a> Thanks <a href="https://github.com/hntrl"><code>@hntrl</code></a>! - fix: apply [Symbol.hasInstance] method to all comparable properties using .isInstance()</p> <p>We have some internal schemas that rely on <code>z.instanceof()</code>. This uses a strict <code>instanceof</code> check which can conflict if there are multiple versions of core installed. This overrides the <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance">Symbol.hasInstance</a> method to use the same logic as <code>.isInstance()</code> to compare objects at runtime.</p> </li> </ul> <h2><code>@langchain/core</code><a href="https://github.com/1"><code>@1</code></a>.2.5</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11305">#11305</a> <a href="https://github.com/langchain-ai/langchainjs/commit/e654022e291b8dae54504ac2d1a3232332406723"><code>e654022</code></a> Thanks <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a>! - Add LangSmith Gateway environment configuration to OpenAI, Anthropic, and Fireworks chat models.</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11295">#11295</a> <a href="https://github.com/langchain-ai/langchainjs/commit/1a1b347d18bc68e842df8badffc987493c81d70a"><code>1a1b347</code></a> Thanks <a href="https://github.com/vladislav-nechakhin"><code>@vladislav-nechakhin</code></a>! - fix(core): pass the mustache escape override per render call</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/langchain-ai/langchainjs/commit/d0c905ddcc2471d0c89a2f1520d96782253ba5c3"><code>d0c905d</code></a> chore: version packages (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11370">#11370</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/8ba1fd996ff9efe93e5cb75afa946204c00528a4"><code>8ba1fd9</code></a> fix(aws): classify Bedrock stream-idle timeouts, cover pre-response hang (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11">#11</a>...</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/3b0e4c48a31811031a460c4d95519a7c1163dc41"><code>3b0e4c4</code></a> feat(core): mark errors as retryable or not, and stop retrying the ones that ...</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/d6ad9735640a6c729f81ef79361acc5e83c526f1"><code>d6ad973</code></a> fix(langchain): use unified endpoint for gateway (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11369">#11369</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/3fedf7f1934a592b71da866bd16af886b4e0c00d"><code>3fedf7f</code></a> chore: version packages (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11367">#11367</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/c068bbf8c113132bf16ac7a8add44e486a147b41"><code>c068bbf</code></a> fix(core,langchain): patch and release core, update peer dependencies (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11366">#11366</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/242b986afd9b257ddbedd5d0dcc84f197289faef"><code>242b986</code></a> chore: version packages (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11361">#11361</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/2d1f7449c95a554d429535abae0115b4f578bbac"><code>2d1f744</code></a> chore(langchain): add missing changeset (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11363">#11363</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/f401396a21285d49804f1dc7e4e2fa2396d5317f"><code>f401396</code></a> feat(langchain): add langsmith gateway to initChatModel (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11362">#11362</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/d36ec6a6f4b1c474b0d9f9cb6037ff37f54183bf"><code>d36ec6a</code></a> fix(anthropic): preserve gateway cost on the native stream path (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11359">#11359</a>)</li> <li>Additional commits viewable in <a href="https://github.com/langchain-ai/langchainjs/compare/@langchain/core@1.2.4...@langchain/core@1.2.8">compare view</a></li> </ul> </details> <br /> Updates `@langchain/langgraph` from 1.4.9 to 1.4.10 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langgraphjs/releases">@langchain/langgraph's releases</a>.</em></p> <blockquote> <h2><code>@langchain/langgraph</code><a href="https://github.com/1"><code>@1</code></a>.4.10</h2> <h3>Patch Changes</h3> <ul> <li><a href="https://redirect.github.com/langchain-ai/langgraphjs/pull/2690">#2690</a> <a href="https://github.com/langchain-ai/langgraphjs/commit/00f68a1b002d820b95129bcdaf387d2678ead6f0"><code>00f68a1</code></a> Thanks <a href="https://github.com/saad-supports-langchain"><code>@saad-supports-langchain</code></a>! - fix(langgraph): keep <code>context</code> values out of tracer-derived metadata</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langgraphjs/blob/main/libs/langgraph-core/CHANGELOG.md">@langchain/langgraph's changelog</a>.</em></p> <blockquote> <h2>1.4.10</h2> <h3>Patch Changes</h3> <ul> <li><a href="https://redirect.github.com/langchain-ai/langgraphjs/pull/2690">#2690</a> <a href="https://github.com/langchain-ai/langgraphjs/commit/00f68a1b002d820b95129bcdaf387d2678ead6f0"><code>00f68a1</code></a> Thanks <a href="https://github.com/saad-supports-langchain"><code>@saad-supports-langchain</code></a>! - fix(langgraph): keep <code>context</code> values out of tracer-derived metadata</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/langchain-ai/langgraphjs/commit/f6b41bf4861322e380e02f746285496e84b0f96b"><code>f6b41bf</code></a> chore: version packages (<a href="https://github.com/langchain-ai/langgraphjs/tree/HEAD/libs/langgraph-core/issues/2698">#2698</a>)</li> <li><a href="https://github.com/langchain-ai/langgraphjs/commit/00f68a1b002d820b95129bcdaf387d2678ead6f0"><code>00f68a1</code></a> fix(langgraph): keep context values out of tracer-derived metadata (<a href="https://github.com/langchain-ai/langgraphjs/tree/HEAD/libs/langgraph-core/issues/2690">#2690</a>)</li> <li><a href="https://github.com/langchain-ai/langgraphjs/commit/6ac60da74f6b9e29d20b111a7947ac3060f1d2dd"><code>6ac60da</code></a> chore(deps): bump the langchain group across 1 directory with 5 updates (<a href="https://github.com/langchain-ai/langgraphjs/tree/HEAD/libs/langgraph-core/issues/2651">#2651</a>)</li> <li>See full diff in <a href="https://github.com/langchain-ai/langgraphjs/commits/@langchain/langgraph@1.4.10/libs/langgraph-core">compare view</a></li> </ul> </details> <br /> Updates `@langchain/openai` from 1.5.5 to 1.5.8 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langchainjs/releases">@langchain/openai's releases</a>.</em></p> <blockquote> <h2><code>@langchain/openai</code><a href="https://github.com/1"><code>@1</code></a>.5.8</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11342">#11342</a> <a href="https://github.com/langchain-ai/langchainjs/commit/3b0e4c48a31811031a460c4d95519a7c1163dc41"><code>3b0e4c4</code></a> Thanks <a href="https://github.com/thushanth-bengre-langchain"><code>@thushanth-bengre-langchain</code></a>! - feat(openai): mark OpenAI provider errors as retryable or not</p> <p>Builds on <code>stampRetryable</code> in <code>@langchain/core</code> so the retry middleware can tell a transient failure from a deterministic one. Timeouts and rate limits are marked retryable; aborts, context overflow, invalid tool results, bad credentials, and unknown models non-retryable. Anything else stays unmarked and retries as before.</p> <p>Also forwards a per-call <code>maxRetries</code> to the retry loop, so a surrounding retry loop such as <code>modelRetryMiddleware</code> can take over instead of the two multiplying against each other.</p> <p>Errors keep their original class, so <code>instanceof</code> against the <code>openai</code> SDK error types is unaffected.</p> </li> </ul> <h2><code>@langchain/openai</code><a href="https://github.com/1"><code>@1</code></a>.5.7</h2> <h3>Patch Changes</h3> <ul> <li><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11347">#11347</a> <a href="https://github.com/langchain-ai/langchainjs/commit/3fe4c43ce3399ebf2391ed612d78fedcd3ea5ec6"><code>3fe4c43</code></a> Thanks <a href="https://github.com/talarari"><code>@talarari</code></a>! - fix(openai): include <code>usage</code> in <code>response_metadata</code> when <code>system_fingerprint</code> is absent</li> </ul> <h2><code>@langchain/openai</code><a href="https://github.com/1"><code>@1</code></a>.5.6</h2> <h3>Patch Changes</h3> <ul> <li><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11305">#11305</a> <a href="https://github.com/langchain-ai/langchainjs/commit/e654022e291b8dae54504ac2d1a3232332406723"><code>e654022</code></a> Thanks <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a>! - Add LangSmith Gateway environment configuration to OpenAI, Anthropic, and Fireworks chat models.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/langchain-ai/langchainjs/commit/d0c905ddcc2471d0c89a2f1520d96782253ba5c3"><code>d0c905d</code></a> chore: version packages (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11370">#11370</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/8ba1fd996ff9efe93e5cb75afa946204c00528a4"><code>8ba1fd9</code></a> fix(aws): classify Bedrock stream-idle timeouts, cover pre-response hang (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11">#11</a>...</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/3b0e4c48a31811031a460c4d95519a7c1163dc41"><code>3b0e4c4</code></a> feat(core): mark errors as retryable or not, and stop retrying the ones that ...</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/d6ad9735640a6c729f81ef79361acc5e83c526f1"><code>d6ad973</code></a> fix(langchain): use unified endpoint for gateway (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11369">#11369</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/3fedf7f1934a592b71da866bd16af886b4e0c00d"><code>3fedf7f</code></a> chore: version packages (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11367">#11367</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/c068bbf8c113132bf16ac7a8add44e486a147b41"><code>c068bbf</code></a> fix(core,langchain): patch and release core, update peer dependencies (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11366">#11366</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/242b986afd9b257ddbedd5d0dcc84f197289faef"><code>242b986</code></a> chore: version packages (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11361">#11361</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/2d1f7449c95a554d429535abae0115b4f578bbac"><code>2d1f744</code></a> chore(langchain): add missing changeset (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11363">#11363</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/f401396a21285d49804f1dc7e4e2fa2396d5317f"><code>f401396</code></a> feat(langchain): add langsmith gateway to initChatModel (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11362">#11362</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/d36ec6a6f4b1c474b0d9f9cb6037ff37f54183bf"><code>d36ec6a</code></a> fix(anthropic): preserve gateway cost on the native stream path (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11359">#11359</a>)</li> <li>Additional commits viewable in <a href="https://github.com/langchain-ai/langchainjs/compare/@langchain/openai@1.5.5...@langchain/openai@1.5.8">compare view</a></li> </ul> </details> <br /> Updates `langchain` from 1.5.4 to 1.5.9 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langchainjs/releases">langchain's releases</a>.</em></p> <blockquote> <h2>langchain@1.5.9</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11369">#11369</a> <a href="https://github.com/langchain-ai/langchainjs/commit/d6ad9735640a6c729f81ef79361acc5e83c526f1"><code>d6ad973</code></a> Thanks <a href="https://github.com/hntrl"><code>@hntrl</code></a>! - fix(langchain): use unified endpoint for gateway</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11342">#11342</a> <a href="https://github.com/langchain-ai/langchainjs/commit/3b0e4c48a31811031a460c4d95519a7c1163dc41"><code>3b0e4c4</code></a> Thanks <a href="https://github.com/thushanth-bengre-langchain"><code>@thushanth-bengre-langchain</code></a>! - feat(core): mark errors as retryable or not, and stop retrying the ones that aren't</p> <p>Retry middleware retried every failure up to <code>maxRetries</code>, including deterministic ones like a bad API key or an unknown model. Retries also nest, so a single such failure could cost dozens of API calls.</p> <p><code>@langchain/core/errors</code> adds <code>stampRetryable(error, retryable)</code> and <code>getRetryable(error)</code>. Marking an error leaves its class and shape untouched, so a provider SDK error can be classified without breaking <code>instanceof</code>. <code>getRetryable</code> returns <code>undefined</code> for errors nobody classified, and both are exported so tool authors can mark their own failures.</p> <p><code>modelRetryMiddleware</code> and <code>toolRetryMiddleware</code> now respect the mark by default, and retries stop as soon as one is found rather than each layer spending its own budget. Aborted calls, context overflow, and oversized payloads are marked non-retryable out of the box. Models accept a per-call <code>maxRetries</code> so a surrounding retry loop can take over.</p> <p><strong>Behavior change:</strong> errors marked non-retryable now fail on the first attempt. Unclassified errors — including any from third-party integrations or custom tools — retry exactly as before. Pass <code>retryOn: () => true</code> to restore the old default. A custom <code>onFailedAttempt</code> replaces the built-in handler and opts out of marking.</p> </li> </ul> <h2>langchain@1.5.8</h2> <h3>Patch Changes</h3> <ul> <li><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11366">#11366</a> <a href="https://github.com/langchain-ai/langchainjs/commit/c068bbf8c113132bf16ac7a8add44e486a147b41"><code>c068bbf</code></a> Thanks <a href="https://github.com/hntrl"><code>@hntrl</code></a>! - fix(core,langchain): patch and release core, update peer dependencies</li> </ul> <h2>langchain@1.5.7</h2> <h3>Patch Changes</h3> <ul> <li><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11363">#11363</a> <a href="https://github.com/langchain-ai/langchainjs/commit/2d1f7449c95a554d429535abae0115b4f578bbac"><code>2d1f744</code></a> Thanks <a href="https://github.com/hntrl"><code>@hntrl</code></a>! - feat(langchain): add langsmith gateway to initChatModel- <a href="https://redirect.github.com/langchain-ai/langchainjs/issues/11362">#11362</a></li> </ul> <h2>langchain@1.5.6</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11331">#11331</a> <a href="https://github.com/langchain-ai/langchainjs/commit/18765b002c3819bc4dc42123a293cab27a35ce4f"><code>18765b0</code></a> Thanks <a href="https://github.com/thushanth-bengre-langchain"><code>@thushanth-bengre-langchain</code></a>! - fix(langchain): exclude middleware-internal model calls from the message projection</p> <p>Bookkeeping model calls made by <code>summarizationMiddleware</code> and <code>toolEmulatorMiddleware</code> no longer appear in <code>run.messages</code> or <code>stream({ streamMode: "messages" })</code>, and the summary <code>summarizationMiddleware</code> writes back to state is no longer projected as a new message. These calls remain observable via <code>streamEvents({ version: "v2" })</code>, identified by <code>lc_source</code>.</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/11344">#11344</a> <a href="https://github.com/langchain-ai/langchainjs/commit/f08e0c6d50156accf95a36469a3e107... _Description has been truncated_ --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: jkomyno <alberto@composio.dev>@composio/cli@0.3.4-beta.355 |
||
|
|
6ba9179b48 |
fix(files): validate URLs from API responses before fetching them (#4146)
This PR: - builds on top of https://github.com/ComposioHQ/composio/pull/4144 - routes every fetch whose URL comes from an API response through the SSRF guards that already existed — ten sinks, five per SDK: the tool-execution download, both S3 presigned uploads, `RemoteFile.buffer()`/`blob()`, and the Tool Router session file upload - adds `safe_request()` (Python), which follows redirects itself and re-validates each hop, so a validated URL cannot 302 into private space and an S3 307 region redirect still works - makes `RemoteFile.buffer()` (Python) share `_fetch_url_bytes` with the user-supplied-URL path instead of duplicating it — it previously read `response.content` with no size cap, no redirect control, and no target validation - adds `ssrfSafeFetchWhereSupported` (TypeScript): the full guard on Node, a plain `fetch` on workerd, so Tool Router session file transfers keep working in edge runtimes rather than failing closed - documents DNS rebinding as a known residual in both guards - adds tests that assert the guard *runs* — blocked URL, sink never called, nothing written — rather than that a transfer succeeds ## Context `python/AGENTS.md` states the trust boundary: every field of an API response is untrusted input, because the backend may be compromised or the connection MITM'd. Both SDKs enforced that for URLs a *user* passes in (`composio.utils.url_safety`, `ssrfGuard.node.ts`) and left the URLs an API *response* supplies unguarded — backwards relative to the stated model. A response naming an internal address turned the SDK into a request proxy for it, and the fetched bytes were written to disk or returned to the caller, typically into an LLM context. `RemoteFile.buffer()` was the weakest of the ten: four lines above it, `_fetch_from_url` validated its target, refused redirects, and streamed against a 100 MiB cap; `buffer()` did none of the three. The only difference between them was which side of the trust boundary the URL arrived from. Three decisions worth review: - **The guard is unconditional.** Presigned URLs are public, so nothing legitimate should resolve to private space. There is no escape hatch, and no new configuration surface. - **The tool-execution download stays uncapped.** It streams straight to disk, so `_MAX_RESPONSE_SIZE` — a memory-exhaustion bound — does not apply, and tool attachments legitimately exceed it. `RemoteFile.buffer()` *is* capped, because it buffers in memory. - **Uploads follow redirects with re-validation rather than refusing them**, since S3 can answer a PUT with a 307 region redirect. Downloads keep `allow_redirects=False`, matching the existing fetch paths. Python now matches the TypeScript guard's per-hop re-validation, which was the better of the two implementations. Verified locally: `make chk` and `make tst` clean on the Python side; `pnpm -C packages/core test` 1095 passed, typecheck and lint clean. |
||
|
|
f67d565743 |
refactor(python): consolidate path construction from untrusted input (#4144)
This PR: - centralizes filesystem path construction for API-provided slugs and filenames in `composio.utils.safe_path` - rejects traversal, Windows-invalid names, invalid Unicode, and overlong encoded filenames before creating directories or writing files - normalizes trusted roots consistently and routes both Python download paths through the shared helpers - adds a fail-closed AST guard for new dynamic path construction, including direct `Path(...)` calls - isolates provider initialization from the real home directory and makes the home-write guard report changes without deleting them - removes the obsolete download filename wrapper ## Verification - `pytest -q`: 1,248 passed, 47 skipped - repository-configured Ruff checks and formatting passed for every changed Python file - targeted mypy checks passed for the changed helpers and tests |
||
|
|
09f76b1c9f |
refactor(cli): eliminate raw environment access (#4134)
This PR: - routes Composio-prefixed runtime configuration through `APP_CONFIG` and normalizes unprefixed host values through `HOST_CONFIG` in `app-config.ts` - removes `loadOptionalAppConfig`-style fallback loading so optional strings, booleans, and CLI flag precedence resolve at the configuration boundary - removes every executable `process.env` reference from CLI source; child commands inherit the ambient environment through `@effect/platform` and receive explicit normalized overrides - preserves arbitrary `CODEX_*`, `CLAUDE_*`, and `OPENCLAW_*` detection through Effect config enumeration without exposing the raw environment map - propagates telemetry debug state through worker arguments instead of mutating the process environment - replaces removable filesystem, OS, subprocess, and error-handling exceptions with Effect services and typed control flow - documents supported and internal CLI environment variables, including their `user_data.json` and `config.json` mappings - reduces registered CLI lint boundaries from 45 to 4; the retained entries are the detached-spawn, Node OS, synchronous preload filesystem, and MD5 checksum implementations - verifies the result with 1,201 passing CLI tests (1 skipped), strict Oxlint, boundary validation, root typechecking across 19 packages, the CLI build, and real `composio run` child-process checks@composio/cli@0.3.4-beta.354 |
||
|
|
83f0f93a72 |
ci: treat the Vercel project id as a secret; re-pin to rebuilt eval release
Security review (Sarah): VERCEL_PROJECT_ID moves from a hardcoded value to a fourth required secret; the eval repo's history was rebuilt without it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |