mirror of
https://github.com/ComposioHQ/composio.git
synced 2026-09-22 11:46:35 +08:00
vercel-example@0.1.12
5396 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
5e77e0de36 |
ci(dependabot): run the pip updater at the uv workspace root (#4395)
This PR:
- points Dependabot's `pip` ecosystem at `/`, where `pyproject.toml`
declares the uv workspace and `uv.lock` lives, instead of `/python` and
`/python/providers/*`
- fixes security bumps that never touched the lockfile: Dependabot's
langchain-openai bump in
|
||
|
|
988b9a1ff1 |
chore(deps): raise js-yaml and sharp override floors for new advisories (#4393)
This PR: - restores the `pnpm audit --prod --audit-level=high` gate in `ts.audit.yml`, which fails on `next` today - raises the two `js-yaml` override floors to `>=4.3.2` and `>=3.15.2` for GHSA-2883-xcg3-v3hh (`maxTotalMergeKeys` CPU exhaustion); the production path is `@composio/cli > openapi-typescript > @redocly/openapi-core` - adds a `sharp@>=0.35.4` override for the libheif advisories GHSA-g89c-p67h-r497 and GHSA-2jg2-4ch7-h545; `sharp` is only reached through `miniflare` in the Cloudflare e2e fixtures and nothing in the repo imports it - ignores GHSA-7pqw-9j4j-h8q3, GitHub's second advisory for the already-ignored `extract-zip` symlink bug, which has no patched release either; both consumers already extract through `extractZipSafely` After the relock `pnpm audit` reports only the three documented ignores, and `pnpm audit --prod --audit-level=high` exits 0. https://claude.ai/code/session_01P1AvRSuyBh6eRtpixaPJ6g |
||
|
|
626b6e1045 | Merge branch 'next' into codex/docs-priority-guides | ||
|
|
100d56866f |
fix(experimental): stamp eve durable callback descriptors (#4385)
This PR: - Closes https://github.com/ComposioHQ/composio/issues/4343 - stamps eve's durable callback descriptors on every tool `EveProvider` wraps, via the new internal `withDurableClosure(closure, callback)` helper — eve only stamps them on `defineTool` calls its build transform finds in the agent's own source, which never runs on this package inside `node_modules`, so eve discarded the whole resolver result and the agent silently lost every Composio tool - persists `{ slug, binding }` per callback, where `binding` is an id minted per `wrapTools` call and prefixed with a per-process token, and re-attaches it to that resolve's Composio executor through a module-level binding map. `executeTool` is bound to one Composio session, so a slug-only closure would have routed a call to whichever session resolved last; sessions for different users share one provider, and eve's callback registry is keyed by tool name only, so the map lives at module level rather than on the instance - covers `execute` and, when `needsApproval` is set, `approvalRequest`; the descriptor key is the global-registry symbol `Symbol.for('eve:durable-dynamic-callback')`, so no eve internal is imported and the stamp is inert on eve versions that predate the contract - adds 9 regression tests: descriptor presence and shape, JSON-serializability of the closure, replay of execute and approval from the closure alone, per-resolve executor isolation when sessions share a provider, hooks of the producing provider on replay, the unknown-slug and unknown-binding errors, that two fresh module instances never mint the same binding id, and one suite that loads eve 0.52.1's own `validateDurableDynamicToolCallbacks`, `replayDynamicTools`, and callback registry from the installed package to validate and replay a wrapped tool end to end. Before the change eve threw `Dynamic tool "..." callback "execute" does not have a durable descriptor` ## Context The reporter hit this on eve 0.50 as `non-serializable capture`; 0.52.1 reports the same root cause as a missing descriptor. eve exports no public durable-callback helper (tracked at vercel/eve#2967), so the provider stamps the descriptor itself rather than pinning users to an older eve. Bindings are kept for the life of the process: eve can resume a parked call at any time. A binding lives only in the process that resolved the tools, so a call parked across a restart cannot be replayed; the per-process token in the id makes the stale closure fail the lookup loudly instead of matching whichever resolve reused its counter value in the new process. Growth is one entry per `session.tools()` resolve. Docs (`/docs/providers/eve`) now state the contract, the restart limit, and the real reason the `step.started` resolver runs each step (principal re-evaluation and retry, cached per session). Also unblocks `Docs - Tests` on this branch: the catalog refresh in #4330 renamed Stripe's triggers, so the Stripe knowledge-base guide cited two dead slugs and the corpus verifier failed for any PR touching docs. The guide now cites only the renamed slug the catalog lists, and `generate-toolkits.ts` fetches trigger types with `limit=1000` so the catalog stops truncating every toolkit to its first 20 triggers. https://claude.ai/code/session_019wRk1S4Z6V6FWr4UsybGvR EOF -R ComposioHQ/composio |
||
|
|
ba85f4d183 |
fix(sdk): honor Fetch redirect semantics in both SSRF guards (#4387)
This PR: - builds on top of https://github.com/ComposioHQ/composio/pull/4271, whose commit it carries unchanged - applies the Fetch standard's redirect method/body rules in **both** SSRF guards via `_redirect_rewrite` / `redirectRewrite`: a `303` retries as a bodiless request, a `301`/`302` does the same for a `POST`, and `307`/`308` replay both - narrows `ssrfSafeFetch` to the five statuses the Fetch standard calls a redirect, so a `304` or `305` carrying a `Location` is returned to the caller instead of followed — Python already used `_REDIRECT_STATUS_CODES` - drops `params` after the first hop in `safe_request`, since `Location` carries the query for the target it names and re-appending handed a query-string credential to a target that never asked for one - purges the union of the Fetch `request-body-header` set and the two `requests` also drops, identically on both sides - blocks the IPv6 transition ranges the TypeScript CIDR list missed — 6to4 `2002::/16`, Teredo and the rest of `2001::/23`, local-use NAT64 `64:ff9b:1::/48`, `100::/64`, `2001:db8::/32`, site-local `fec0::/10` — and the IPv4/IPv6 multicast and `192.88.99.0/24` ranges Python's `is_global` missed ## Context Both guards follow redirects by hand so every hop is revalidated against the address blocklist. That also means neither inherits the method and body rewriting `fetch` and `requests` would have done, so an upload answered with a `303` was replayed — payload and all — at a result URL that expects a GET. https://github.com/ComposioHQ/composio/pull/4271 landed that rule in Python only, which left the two SDKs disagreeing on the same wire behavior. Reviewing for that divergence surfaced the redirect-status set, the `params` replay, and the address-blocklist gaps above. `2002:7f00:1::` is 6to4 for `127.0.0.1`, and it passed the TypeScript guard as a public address. Verified with `pytest python/tests/test_url_safety.py` (56 passed) and `vitest run` in `@composio/core` (54 files, 1280 passed), plus `ruff`, `tsc --noEmit`, `oxlint` and `prettier`. Fail-before confirmed: 10 of the new TypeScript cases and 5 of the new Python cases fail against the unmodified guards. Two known gaps are deliberately left out, each deserving its own change: neither guard strips `Authorization`/`Cookie` on a cross-origin redirect, and a non-seekable Python body is re-sent exhausted on a `307` where TypeScript throws a bare `TypeError` on a consumed `ReadableStream`. https://claude.ai/code/session_01SB3ZJdvoqBcRrWb2toWVrX --------- Co-authored-by: ump45nose <52391318+ump45nose@users.noreply.github.com> |
||
|
|
80867a09bc |
docs: update toolkits, API spec, and meta tools data (#4330)
## Summary Automated sync of backend data into the docs site. - Trigger: `schedule` - Dispatch action: `n/a` - Source commit: `n/a` ## 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> |
||
|
|
1959e7ef89 | Merge branch 'next' into docs/changelog-update-cfeada6 | ||
|
|
53c024a9c8 |
fix(py): keep local results when remote multi-execute transport fails (#4386)
## Summary Follow-up to #4310. The TypeScript SDK (since #3800) catches a thrown backend call for the remote half of a mixed `COMPOSIO_MULTI_EXECUTE_TOOL` batch and turns it into one failure entry per remote slug, so completed local results are not lost. The Python SDK still let the exception escape `_route_multi_execute`, discarding every local result that had already run. This ports the TypeScript behavior so both SDKs return the same shape on a remote transport failure. Fixes # ## Changes - Catch the remote future's exception in `_route_multi_execute` and keep `str(error)`, falling back to `Remote tool execution failed` when the message is empty (same fallback as TS). - Synthesize `{response: {successful: False, data: {}, error}, tool_slug, error}` for each remote index and merge them in original request order. - Recompute `total_count` / `success_count` / `error_count` on transport failure, as TS does. - Add two regression tests mirroring the TS cases in `customToolRouting.test.ts`: local results preserved with per-tool remote errors, and the empty-message fallback. ## Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor/Chore - [ ] Documentation - [ ] Breaking change ## How Has This Been Tested? - `uv run --locked --group dev pytest tests/test_custom_tools.py -q`: 87 passed. - `uv run --locked --group dev nox -s chk`: ruff and mypy clean. - Without the source change, the new `test_remote_transport_failure_keeps_local_results` raises `RuntimeError: remote unavailable` out of `_route_multi_execute`. ## Checklist - [x] I have read the Code of Conduct and this PR adheres to it - [x] I ran linters/tests locally and they passed - [ ] I updated documentation as needed - [x] I added tests or explain why not applicable - [ ] I added a changeset if this change affects published packages (Python does not use Changesets) ## Additional context TypeScript reference: `ts/packages/core/src/models/ToolRouterSession.ts`, the `remoteErrorMessage` branch, and the test "should preserve successful local results when remote transport fails". https://claude.ai/code/session_01PAXMbiZd3qPoJ8Z9uPvEAb EOF -R ComposioHQ/composio |
||
|
|
3e235f10b8 |
docs(agent-setup): fix client links and OpenClaw install guidance (#4384)
This PR: - builds on [#4362](https://github.com/ComposioHQ/composio/pull/4362) ([Glen review](https://app.tryglen.com/ComposioHQ/composio/pull/4362)) and targets its branch so only the review fixes appear in the diff - relates to [DEVREL-42](https://linear.app/composio/issue/DEVREL-42/add-agent-first-setup-flow-to-composio-docs) - links the Claude Code, Codex, and OpenClaw client sections to the plugin or personal-access instructions advertised by their cards - clarifies that OpenClaw discovers project-installed skills in its configured or selected execution workspace, and documents the default directory and global alternative - regenerates the 901-record semantic search index for the updated documentation Validation: all 28 focused docs tests passed locally. On `4a1017722`, CI passed link validation, semantic-index freshness, the full docs test job, and TypeScript/build checks. The temporary artifact-only workflow option was removed; the final diff contains only the docs correction and generated index. |
||
|
|
2c4339a859 |
fix(python): preserve mixed multi-execute result order (#4310)
## Summary `ToolRouterSession._route_multi_execute` currently concatenates remote results before local results and assigns new indexes from that concatenated list. For a request such as `[LOCAL_TOOL, REMOTE_TOOL]`, callers receive `[REMOTE_TOOL, LOCAL_TOOL]`, so code that correlates `results[index]` with the requested tools can use the wrong result. This brings the Python implementation in line with the merged TypeScript behavior in [#3800](https://github.com/ComposioHQ/composio/pull/3800): preserve each tool's original request index, restore that order after local/remote execution, and then assign contiguous result indexes. Fixes # ## Changes - Preserve the original index on locally executed result entries. - Map remote sub-batch results back to their original request indexes before merging. - Sort the merged results by original index and re-index them sequentially. - Update the mixed local/remote regression test to assert request order and indexes. ## Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor/Chore - [ ] Documentation - [ ] Breaking change ## How Has This Been Tested? - `uv run --locked --group dev pytest tests/test_custom_tools.py -q` — 69 passed. - `uv run --locked --group dev nox -s tst -- tests/test_custom_tools.py` — 69 passed. - `uv run --locked --group dev ruff --config config/ruff.toml check composio/core/models/tool_router_session.py tests/test_custom_tools.py` — passed. - Ruff format check on both changed files — passed. - Verified the regression test fails on the pre-fix implementation and passes after the fix. ## Screenshots (if applicable) Not applicable. ## Checklist - [x] I have read the Code of Conduct and this PR adheres to it - [x] I ran linters/tests locally and they passed - [ ] I updated documentation as needed - [x] I added tests or explain why not applicable - [ ] I added a changeset if this change affects published packages ## Additional context This change is limited to Python multi-execute result ordering. All-local and all-remote fast paths remain unchanged. No changeset is needed because this repository does not use Changesets for Python package changes. Signed-off-by: CoralGarden52 <2193436736@qq.com> |
||
|
|
705591451c |
chore(deps): upgrade CI actions and every outdated dependency (#4381)
This PR: - upgrades every CI action to its latest release (only `changesets/action` had one: v2.1.1 -> v2.1.2, SHA-pinned) and every outdated dependency across the pnpm workspace, the docs bun workspace, and all three `uv.lock` files - moves zod to 4.5.4 everywhere first-party — catalog, docs, `@composio/json-schema-to-zod`, `@composio/claude-agent-sdk` and the zod-v4 e2e fixtures; the `*-zod-v3` fixtures stay on 3.25.76 because that is what they exercise - moves `@mastra/core` 1.52.1 -> 1.53.0, which is the ceiling rather than a preference: bisecting `ts/examples/mastra`'s `cf:dry-run` shows 1.54.0 moved the workspace/sandbox subsystem behind `@mastra/core/agent`, which drags execa (-> `npm-run-path` -> `unicorn-magic`) into the Workers bundle where esbuild cannot link it. `@mastra/mcp` is capped at 1.17.2 for the same reason — 1.17.3 wants `@mastra/core` >=1.64. The docs bun workspace mirrors that cap as an explicit devDependency plus `overrides` entry, because bun does not apply overrides to auto-installed peers - clears every production advisory that has a published fix, so the audit gate can run without `--ignore`, which does not filter a single run: it writes the advisory into `auditConfig` and exits 0 whatever else is outstanding, so the gate was passing over nine advisories - `qs` -> >=6.16.0, `fast-uri` -> >=3.1.6, `toml` -> the 4.x line, all via overrides in the existing `# temporary: … drop when` style - `extract-zip` (GHSA-jmr9-qjv8-65gv) has no fixed version to move to — 2.0.1 is the newest release and GitHub records `first_patched_version` as null — so it moves to `auditConfig.ignoreGhsas` pointing at the `extractZipSafely` mitigation that already covers it - GHSA-866g-f22w-33x8 (`@ai-sdk/provider-utils` 3.x, low) also has nothing to move to: the advisory names 3.0.98 as patched but the 3.x line stopped at 3.0.30 and GitHub records no fixed version. It only enters the tree through `@mastra/core`, which is a peer or dev dependency of every published package, so all flagged paths are private examples and e2e fixtures. It goes in `ignoreGhsas` with that rationale so the un-levelled `pnpm audit --prod` step stops posting a warning comment on every PR - widens `@composio/anthropic`'s `@anthropic-ai/sdk` peer range to include `^0.124.0`, the line its devDependency now tests against (for a `0.x` caret, `^0.120.0` excluded it); the package is in the changeset for that reason - adapts three call sites that upstream broke: `eve` 0.52 moved `ApprovalContext` to `eve/tools/approval`, `@pierre/diffs` 1.4 gave `FileDiffProps` a second type parameter, and `fumadocs-openapi` 11.4 fixed the undeclared-tag drop that a docs guard test asserted (the guard now also asserts the page positively, so it cannot pass vacuously) - drops the stale `hono` `minimumReleaseAgeExclude` entry (its comment said to after 2026-08-06) and adds an `undici` `peerDependencyRules` allowance for openai 7.10's new optional peer ## Context Some upgrades were deliberately declined, each for a reason recorded next to the pin: - `vitest`/`@vitest/ui` stay on 4.1.11 — `@cloudflare/vitest-pool-workers@0.22.0` (latest) peers on `vitest ^4.1.0` - `undici` stays on `^7` in core — `pinnedDispatcher.node.ts` documents that Node's `fetch` rejects undici 8 dispatchers - the `pnpm` catalog entry stays on `^11` to match the mise-owned toolchain - `eve` stays on 0.27.6 in docs — 0.52 changes the `defineAgent` model definition and the `useEveAgent` helpers, so `agent/agent.ts` and `components/eve-chat.tsx` fail `types:check`; migrating the docs agent is its own PR - `@earendil-works/pi-coding-agent` stays on 0.84.4 — 0.85.x imports `@earendil-works/pi-server` without declaring it, so `test/pi.test.ts` fails to load `declareOperationTags` is kept as a safety net rather than retired, even though `fumadocs-openapi` 11.4 makes it redundant: removing it changes how specs are normalised at sync time and is worth its own PR. Verified locally: `pnpm build:packages`, `pnpm typecheck`, `pnpm test`, `pnpm typecheck:examples`, `pnpm lint:examples`, `turbo cf:dry-run --filter='./ts/examples/*'`, `pnpm peers check`, `pnpm audit --prod --audit-level=high` (exit 0), frozen-lockfile installs for pnpm and bun, docs `types:check` + 542 static tests, and Python `make chk` + `make tst` (1790 passed). https://claude.ai/code/session_018evFic47PFPXuB95uRE1aw EOF -R ComposioHQ/composio@composio/cli@0.4.2-beta.384 |
||
|
|
0fb479b8f1 |
Merge commit from fork
* fix(cli): escape generated source metadata * test(cli): execute generated Python regression * fix(cli): order Python fallback assignments --------- Co-authored-by: jkomyno <12381818+jkomyno@users.noreply.github.com>@composio/cli@0.4.2-beta.383 |
||
|
|
7d36de8c0a |
fix(python-sdk): isolate default provider per Composio instance (#4370)
Construct a fresh OpenAIProvider per SDK instance instead of sharing a module-level singleton whose execute_tool binding was overwritten by the last-constructed instance, silently routing tool execution through the wrong client/API key. Regression test in tests/test_sdk.py. Fixes #4369 Co-authored-by: Adesh Deshmukh <adeshkd123@gmail.com> Claude-Session: https://claude.ai/code/session_015YPz5SzeScR9TkgoRi2p1F EOF -R ComposioHQ/composio |
||
|
|
85d4923507 |
fix(python): dereference $ref/$defs in Google provider (#4297)
## Summary The Python Vertex AI Google provider rebuilt tool parameter schemas from `properties` and `required` without resolving internal `$ref`/`$defs` references first. As a result, referenced properties were sent as dangling references and could not be interpreted by Vertex AI. This change dereferences internal schema references before the existing Google-specific translation. It follows the provider behavior fixed in [TypeScript PR #4288](https://github.com/ComposioHQ/composio/pull/4288). ## Changes - Dereference Google provider input schemas with the existing `dereference_json_schema` helper. - Use the resolved schema when extracting properties and required fields. - Add a regression test covering a property defined through `$ref`/`$defs`. ## Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor/Chore - [ ] Documentation - [ ] Breaking change ## How Has This Been Tested? - `pytest tests/test_google_provider.py tests/test_json_schema.py tests/test_provider.py -q -k 'not TestLangchainReservedKeywords and not TestLangchainFreeFormObjectArguments'` — 59 passed, 4 skipped, 5 deselected. - `ruff check --config config/ruff.toml providers/google/composio_google/provider.py tests/test_google_provider.py` — passed. - `ruff format --check providers/google/composio_google/provider.py tests/test_google_provider.py` — passed. - `mypy --config-file config/mypy.ini providers/google/composio_google/provider.py tests/test_google_provider.py` — passed. ## Screenshots (if applicable) Not applicable. ## Checklist - [x] I have read the Code of Conduct and this PR adheres to it - [x] I ran linters/tests locally and they passed - [x] I updated documentation as needed - [x] I added tests or explain why not applicable - [x] I added a changeset if this change affects published TypeScript packages ## Additional context This is a Python-only provider fix; no TypeScript changeset is required. No existing issue was found for the Python provider, so this PR includes the minimal reproduction and regression test directly. --------- Co-authored-by: jkomyno <alberto@composio.dev> |
||
|
|
5803b4544b |
fix(docs): accept Mercury data refresh events (#4345)
## Summary - accept `mercury-production-deploy` alongside the Apollo deployment event - log the correct source commit for Apollo and Mercury dispatches - preserve compatibility with Apollo’s legacy `hermes_commit` payload - show the dispatch action and source commit in generated data PRs ## Companion PR - ComposioHQ/mercury#26701 sends the event after a successful production registry sync. ## Verification - `bun test tests/static/docs-data-workflow.test.ts` (6 passed) - `bunx oxlint tests/static/docs-data-workflow.test.ts` - `bunx prettier --check ../.github/workflows/docs-update-data.yml tests/static/docs-data-workflow.test.ts` - `actionlint .github/workflows/docs-update-data.yml` - `bun test tests/static` reached 541 passes. One unrelated analytics test failed because Bun could not bind its ephemeral local server with `EADDRINUSE`; rerunning that test reproduced the same local environment failure. |
||
|
|
230f81a737 |
refactor(cli): import @effect/platform modules by subpath (#4360)
This PR: - rebases onto `next` now that https://github.com/ComposioHQ/composio/pull/4358 and https://github.com/ComposioHQ/composio/pull/4359 are merged - rewrites every `@effect/platform` and `@effect/platform-bun` barrel import under `ts/packages/cli` (155 statements in 112 files) as a per-module namespace import, e.g. `import * as FileSystem from '@effect/platform/FileSystem'` - adds both barrels to the `no-restricted-imports` lists for `ts/packages/cli/src`, with messages pointing at the subpath form - updates the boundary guidance in `ts/packages/cli/AGENTS.md` and the `cli-command` skill to the subpath form ## Context Both barrels are pure namespace re-exports (60 and 19 modules), so this is import-only with no runtime change. Effect v4 spreads these modules across `effect` (`FileSystem`, `Path`, `PlatformError`), `effect/unstable/http`, and `effect/unstable/process`; with per-module imports the port becomes a scripted path rewrite instead of hand-splitting each barrel line. Third of three preparation PRs. ## Validation - `pnpm --filter @composio/cli typecheck` and oxlint clean; a probe barrel import in `src/` is rejected by the new rule - `pnpm --filter @composio/cli test`: 127 files, 1318 tests pass, 1 skipped@composio/cli@0.4.2-beta.382 |
||
|
|
e633a7bdf2 |
docs: update guides for SDK changes (#4365)
## Summary
Automated docs update triggered by SDK source changes on `next`.
- Claude reviewed the SDK diff and updated guides, FAQs, or examples
that reference changed APIs or features.
- The docs `@composio/*` dependencies were realigned to their latest
published releases so Twoslash snippets and example apps validate
against versions users can actually install.
## Review checklist
- [ ] Changes accurately reflect the new SDK behavior
- [ ] No unrelated docs were modified
- [ ] Code examples are correct and complete
- [ ] If a documented feature is not published yet, the Twoslash build
will fail — wait for the release instead of working around it
Generated by Claude Code via GitHub Actions.
Co-authored-by: jkomyno <12381818+jkomyno@users.noreply.github.com>
|
||
|
|
f5ff810f2e |
refactor(cli): define services with Context.Tag and thread argv explicitly (#4359)
This PR: - builds on top of https://github.com/ComposioHQ/composio/pull/4358 - replaces the eleven `Effect.Service` files (fourteen services) with `Context.Tag` classes that export a `<Name>Shape` type and an explicit `static readonly Default` layer built from a `make<Name>` constructor - removes the three `accessors: true` declarations; nothing in `src/` used a generated accessor, and the one test that did now yields the service - builds test doubles with `Service.of({ ... })` instead of `new Service({ ... })`, and types helper parameters with the `Shape` types where the class had been used as a type - passes the normalized argv from `bin.ts` into `runCli` and through `cli-main.ts` instead of mutating `process.argv` and reading it back in five places - documents the service pattern in `ts/packages/cli/AGENTS.md` ## Context Effect v4 replaces `Effect.Service` with `Context.Service`, which generates neither a `.Default` layer nor accessors; with the explicit-layer shape already on v3, the port turns each service into a one-line rename. `Command.runWith` in `effect/unstable/cli` takes user arguments explicitly, so `cli-main.ts` now receives argv rather than re-reading process state. Second of three preparation PRs. ## Validation - `pnpm --filter @composio/cli typecheck`, `validate:boundaries`, and oxlint clean - `pnpm --filter @composio/cli test`: 127 files, 1319 tests pass, 1 skipped@composio/cli@0.4.2-beta.381 |
||
|
|
20aaa95c96 |
ci(ts): verify packed provider compatibility (#4355)
This PR: - adds a clean consumer harness that packs core, its internal JSON Schema dependency, and all ten TypeScript providers - verifies tarball contents, npm installation, named public exports, consumer typechecking, provider construction, and a credential-free `wrapTool` conversion - covers the current workspace core, one verified minimum-core lane per provider, and the packed workspace core presented as `1.0.0-beta.0` - preserves existing 0.x minimum peer ranges while recording the verified floors separately for the future breaking release - additively accepts core 1.0 prereleases without claiming stable 1.x support yet - widens the Anthropic and OpenAI Agents peer ranges to include the upstream versions already used by this repository - runs the gate in TypeScript CI and immediately before Changesets publishing The release guard fails before publication and its regression test verifies build -> compatibility -> publish ordering plus failure propagation. ## Non-breaking scope No public API is removed or renamed, and the existing 0.x core peer floors remain unchanged. All peer-range changes are additive. The gate reports the nine floor corrections that should be made with the planned breaking release. ## Validation - `pnpm run check:provider-compatibility` (12 packed consumer lanes) - `pnpm run test:provider-compatibility` - `pnpm run test:release-workflow` - `pnpm run build:packages` (19 packages) - focused TypeScript compile and Oxlint checks - Prettier, Changesets validation, and `git diff --check` |
||
|
|
61c3cb6481 |
chore(cli): refresh baked toolkit slugs (#4372)
## Summary Automated refresh of the toolkit slugs the CLI knows without asking the API, generated by `ts/packages/cli/scripts/generate-toolkit-slugs.ts`. Toolkits added since the last refresh currently cost users one toolkit-list fetch (~2 s) the first time they run one of that toolkit's tools. Merging this makes them free. The generator refuses to write a list that is short, malformed, or missing staple toolkits, so a bad fetch opens no PR at all. Co-authored-by: jkomyno <12381818+jkomyno@users.noreply.github.com>@composio/cli@0.4.2-beta.380 |
||
|
|
d4077ba415 |
chore(cli): trim unused Effect packages and unify version output (#4358)
This PR: - drops the eight `@effect/*` satellite devDependencies and `@effect/platform-node-shared` from `@composio/cli`; none is imported by the CLI, its tests, or its scripts, and the `@effect/platform-node-shared` catalog entry goes with them - makes `--log-level` fall back to `COMPOSIO_LOG_LEVEL` when the flag is absent (`Option.orElse` instead of `Option.zipLeft`, which discarded the env value) and adds a precedence test - rewrites `composio --version` and `composio -v` to the `version` command before parsing, so the three spellings share one handler and print identical output (the framework built-in used to add a trailing blank line); CI and the installer keep using `composio --version` ## Context First of three preparation PRs for the Effect v4 port; https://github.com/ComposioHQ/composio/pull/3901 is the reference port. Each lands v3-compatible groundwork that the port otherwise has to redo on top of a large diff: the manifest, catalog, and lockfile were three of the conflicting files in that PR, and its review had accepted Effect v4's default `composio v<semver>` banner for `--version`. Owning the flag in argv normalization keeps `--version` output stable across the framework change instead. ## Validation - `pnpm --filter @composio/cli typecheck` and oxlint clean - `pnpm --filter @composio/cli test`: 127 files, 1318 tests pass, 1 skipped; `version`, `--version`, and `-v` are asserted byte-identical - The Docker install e2e suite was not run locally; `cli.install-e2e.yml` runs it on this PR@composio/cli@0.4.2-beta.379 |
||
|
|
a4932a6944 | test(docs): align agent prompt assertion | ||
|
|
c3c09e6e13 | Specific wording per agent | ||
|
|
86cd15b76c | docs(kb): refresh public support knowledge | ||
|
|
fe1e0e3467 | Merge branch 'next' into bdo/add-agent-setup-guide | ||
|
|
36251d1012 | docs(add): add agent-first setup for developers path | ||
|
|
2573c64d97 |
Release: update version (#4285)
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/claude-agent-sdk@0.12.0 ### Minor Changes -@e2e-tests/node-tool-router-pagination@0.0.2 @composio/claude-agent-sdk@0.12.0 @composio/langchain@0.11.0 langchain-example@0.1.11 @composio/json-schema-to-zod@0.3.2 google-example@0.1.2 llamaindex-example@0.1.2 @composio/json-schema-to-effect-schema@0.1.1 @composio/llamaindex@0.11.0 mastra-example@0.1.2 @composio/google@0.11.0 file-handling-example@0.1.2 mcp-example@0.1.2 @composio/experimental@0.2.4 @composio/openai-agents@0.11.0 modifiers-example@0.1.11 error-handling-example@0.1.11 @composio/openai@0.12.2 openai-example@0.1.11 connected-accounts-example@0.1.11 @e2e-tests/node-custom-tools@0.0.2 @composio/slim@0.18.1 session-management-example@0.1.2 json-schema-to-zod-example@0.1.2 anthropic-example@0.1.2 tool-router-example@1.0.12 @composio/vercel@0.12.0 @composio/core@0.18.1 @e2e-tests/node-claude-agent-sdk@0.0.2 @e2e-tests/node-tool-router-files@0.0.2 vercel-example@0.1.11 @e2e-tests/cf-workers-tool-router-ai@0.0.2 @e2e-tests/cf-workers-basic@0.0.2 toolkits-example@0.1.11 @e2e-tests/node-mastra-tool-router-zod-v4@0.0.2 @e2e-tests/node-mastra-tool-router-zod-v3@0.0.2 tools-example@0.1.2 versioning-example@0.1.2 @e2e-tests/node-json-schema-to-zod-v3@0.0.2 @e2e-tests/cf-workers-files@0.0.2 triggers-example@0.1.2 @e2e-tests/node-json-schema-to-zod-v4@0.0.2 |
||
|
|
684a392816 |
chore(python): prepare 0.21.1 release (#4361)
## Summary - bump the Python SDK and all provider package versions to `0.21.1` - regenerate the root `uv.lock` from the updated workspace metadata - keep the existing coordinated changelog as the release authority ## Verification - `pnpm test:release-workflow` - `make build` (26 artifacts) - `python -m twine check python/dist/*`py@0.21.1 |
||
|
|
1ab8b3c683 |
fix(toolchain): pin stable Bun 1.4.1 binaries (#4357)
This PR: - replaces the temporary Bun canary pin with the signed stable `1.4.1` platform packages - restores Linux ARM64 cross-compilation, which blocked the CLI beta workflow after https://github.com/ComposioHQ/composio/pull/4315 - preserves immutable per-platform tarballs and checksums through mise's HTTP backend - keeps the declared revision aligned with `bun --revision` ## Verification - both macOS platform binaries pass `codesign --verify --strict` - `pnpm test:toolchain` - `pnpm test:release-workflow` - `pnpm build:packages` - `pnpm --filter @composio/cli build:binary:cross --target bun-linux-arm64` - `taplo fmt --check mise.toml` - `git diff --check`@composio/cli@0.4.1 @composio/cli@0.4.1-beta.377 |
||
|
|
07165baf4b | docs: update documentation for new changelog entries | ||
|
|
cfeada600d |
docs(changelog): document September CLI and SDK releases (#4350)
This PR: - prepares the coordinated September 4 changelog for CLI `0.4.1`, Python SDK `0.21.1`, and the TypeScript SDK release - gives DevRel one customer-facing source for credential security, file transfers, JSON Schema behavior, and custom-tool routing - records the TypeScript provider and schema-converter package matrix, including the releases added after #4316 merged - adds the `@composio/core` `0.18.1` row that the refreshed release PR #4285 now requires - corrects the download-limit guidance and documents the fallback for a `$ref` without matching `$defs` The listed versions are coordinated release targets. They are not all published yet, so this changelog and the release PRs still need to be sequenced together. ## Verification - `pnpm exec prettier --check docs/content/changelog/09-04-26-cli-and-sdk-releases.mdx` - `cd docs && bun run types:check` - `cd docs && bun run lint:links` - `cd docs && bun run test` (541 passed) - `pnpm test:release-workflow` |
||
|
|
0d4383c4f7 |
fix(docs): isolate product theme from next-themes storage, switcher link fixes (#4349)
## Summary Applies the top findings from a multi-reviewer code review of #4335 (which merged before these could land on the PR branch). Four validated findings, all small and behavior-preserving outside the fixes themselves: - **Cross-tab theme fight (P1):** #4335 routed the product-derived theme through next-themes' shared `theme` localStorage key -- written by the root layout's inline head script on every hard load and by `setTheme` on every client switch. next-themes listens for cross-tab storage events on that key, so two docs tabs on different products (Platform dark / For You light) silently repaint each other with no self-heal (the provider effect's deps are `[product, setTheme]`, so the flipped tab never corrects). The product theme is derived state, not a preference: this PR applies it directly to the document element (`applyProductTheme`) and passes `forcedTheme: initialTheme` from the server-resolved product so hydration cannot flip a stale stored value. No `theme` localStorage writes remain anywhere. - **theme-color meta (P2):** the two `prefers-color-scheme`-keyed metas meant mobile browser chrome mismatched the forced page theme (white chrome over dark Platform pages for light-OS users). Now a single meta keyed to the product theme. - **Switcher current-option href (P2):** the popover option marked `aria-current="page"` resolved to the product landing route, so middle-click, hover status bar, and copy-link all pointed at the wrong URL. It now hrefs the current pathname. - **Explore-card aria-label (P3):** `aria-label` replaced the link's accessible name, so the product description inside the card was not announced. Dropped; heading + description now form the name. ## Changes - `docs/app/layout.tsx` -- inline script no longer writes localStorage (pre-paint class priming unchanged); single product-keyed `theme-color` meta; `forcedTheme: initialTheme` on `RootProvider`. - `docs/components/docs-product-context.tsx` -- `setTheme`/`useTheme` removed; new `applyProductTheme` used in the product effect and the flushSync commit. - `docs/components/product-switcher.tsx` -- `destination = isCurrent ? pathname : docsProductDestination(...)`. - `docs/components/home-surfaces.tsx` -- Explore-card `aria-label` removed. - `docs/tests/static/product-navigation.test.ts` -- pins the new invariants (`applyProductTheme`, `forcedTheme: initialTheme`, and a negative assertion that `localStorage.setItem('theme'` stays out). ## Testing - `bun test tests/static/` -- 541 pass / 0 fail - `bun run types:check` -- clean - `bun run lint` -- only pre-existing warnings (`home-surfaces.tsx:102` `no-img-element` is in `ForYouVisual`, untouched) - Worth a manual check: two tabs on different products no longer repaint each other (static tests cannot prove cross-tab storage isolation) ## Notes - Docs-only change; no changeset required. - Review context: follow-up to #4335. Remaining review findings (navigation state-machine races, theme-scope design call, decision record) are tracked separately. |
||
|
|
ab289d6224 |
fix(sdk): preserve primitive JSON Schema semantics (#4316)
## Summary - preserve boolean, empty, null, type-array, enum, const, and scalar-constraint semantics across every Python conversion entry point - intersect Zod enum and const values with declared types and constraints, including compound JSON values - default unversioned exact validation to Draft 7 and apply inclusive and numeric exclusive bounds independently - run one byte-identical corpus through Python, Zod, and Effect so accepted and rejected inputs stay aligned - keep exact JSON Schema acceptance separate from Pydantic default materialization ## Review follow-up (second push) - Python: exact Draft 7 acceptance now wraps all three entry points (`json_schema_to_pydantic_type`, `json_schema_to_model`, `pydantic_model_from_param_schema`), so they can no longer disagree - Python: draft-4 boolean `exclusiveMinimum`/`exclusiveMaximum` (OpenAPI 3.0 style) no longer crash conversion — exact validation falls back to Draft 4, and the library input is translated to the numeric spelling - Python: ECMA-only regex patterns (look-around) no longer crash pydantic model builds — Rust-incompatible patterns fall back to Python `re` - Python: type arrays with sibling constraints no longer raise `TypeError` on valid input — constraints are scoped per member before the library sees them - Python: integral floats satisfy `integer`, `const` intersects `enum`, annotation-only schemas accept anything, and an optional property with an empty `enum` tolerates absence - Zod: typeless scalar constraints apply per instance type, and string lengths count Unicode code points instead of UTF-16 code units - Effect: draft-4 boolean exclusive bounds are enforced instead of silently ignored - `multipleOf` uses decimal scaling in all three converters (declared `divergesFromJsonSchema` on the corpus case) - shared corpus grows by 13 primitive cases; new property-based tests check acceptance against real Draft 7 oracles (hypothesis + `jsonschema` in Python, fast-check + Ajv in TypeScript) ## Verification - Python `make chk` (ruff + mypy) - Python pytest: 1,572 passed (5 langchain-extra tests need an env this sandbox lacks; unchanged from base) - `@composio/json-schema-to-zod`: 187 passed incl. 300-run fast-check property test; typecheck + build - `@composio/json-schema-to-effect-schema`: 133 passed; typecheck - `@composio/core` corpus ingress tests: 61 passed - shared Python/TypeScript corpus files are byte-identical (shasum-verified) - `git diff --check` ## Contributor context This replaces four narrow proposals after independent local reproduction: - [#4301](https://github.com/ComposioHQ/composio/pull/4301) · [Glen](https://app.tryglen.com/ComposioHQ/composio/pull/4301) - [#4302](https://github.com/ComposioHQ/composio/pull/4302) · [Glen](https://app.tryglen.com/ComposioHQ/composio/pull/4302) - [#4303](https://github.com/ComposioHQ/composio/pull/4303) · [Glen](https://app.tryglen.com/ComposioHQ/composio/pull/4303) - [#4307](https://github.com/ComposioHQ/composio/pull/4307) · [Glen](https://app.tryglen.com/ComposioHQ/composio/pull/4307) --------- Co-authored-by: simpleqt <89645338+simpleqt@users.noreply.github.com> |
||
|
|
8891a66357 |
fix(cli): bare --stream, dead Slack slug in help, tools info exit code, unknown listen slug
- listen: rewrite a bare `--stream` to `--stream ''` instead of `--stream=`; @effect/cli only accepts `--flag=value` with a non-empty value, so the previous rewrite failed with "Received unknown argument: '--stream='". - help: replace SLACK_SEND_A_MESSAGE_TO_A_SLACK_CHANNEL (404 from the API) with SLACK_SEND_MESSAGE and its `markdown_text` input; use SLACK_CHANNEL_MESSAGE_RECEIVED with `channel_id` for the listen `-p` example since SLACK_RECEIVE_MESSAGE has an empty config schema. - handle-http-error: set process.exitCode = 1 and print the message plainly when stderr is not a TTY, so `tools info <bad-slug>` no longer prints nothing and exits 0. - listen: when no active connected account matches, retrieve the trigger type and report an unknown slug on 404 instead of a missing connection. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> |
||
|
|
abefd6962f |
feat(docs): add product context switcher (#4335)
## Summary Add a product context switcher that separates the docs into two paths just like the Dashboard: - Composio For You, for connecting apps to existing AI clients - Composio Platform, for building agents with the SDK The selected product controls the docs sidebar and persists across navigation. Product-specific URLs set the matching context, while shared pages remain open when readers switch products. https://github.com/user-attachments/assets/e3f6905d-7238-43a2-a51e-145a01688c04 ## Changes - Define product labels, landing pages, route ownership, sidebar groups, and equivalent destinations in one configuration. - Build separate Fumadocs page trees for For You and Platform. - Add an accessible product switcher and a separate home link to the site header. - Force dark mode for Platform and light mode for For You, with no separate theme toggle. - Update the homepage cards to select the matching product. - Add a reduced-motion-aware transition with a 1.5-second navigation timeout. - Test route classification, destination mapping, complete page-tree coverage, and switcher semantics. ## Testing - `bun test tests/static/ --reporter=dot` — 541 passed - `bun run types:check` - `bun run lint` - `bun run build` - Tested both product directions in the local docs site. - Verified that the home link works, Platform stays dark, For You stays light, and shared Security pages remain open when switching products. ## Notes This is a docs-only change and does not require a changeset. |
||
|
|
33434bbe93 | Merge branch 'next' into bdo/add-context-switcher | ||
|
|
4e08394e67 |
chore(code-owners): add brendan as a codeowner for docs (#4342)
## Summary Explain the motivation and context for this change. Link to any related issues. Fixes # ## Changes - - ## Type of change - [ ] Bug fix - [ ] New feature - [ ] Refactor/Chore - [ ] Documentation - [ ] Breaking change ## How Has This Been Tested? Describe the tests you ran and instructions so reviewers can reproduce. Include any relevant config/versions. ## Screenshots (if applicable) ## Checklist - [ ] I have read the Code of Conduct and this PR adheres to it - [ ] I ran linters/tests locally and they passed - [ ] I updated documentation as needed - [ ] I added tests or explain why not applicable - [ ] I added a changeset if this change affects published packages ## Additional context |
||
|
|
0fbed5273b |
docs(auth): clarify managed OAuth app coverage (#4322)
## Summary Clarifies that the managed auth page covers OAuth apps, not every credential type. Fixes # ## Changes - Renames the page and tabs around managed OAuth. - Explains the difference between OAuth app credentials and user authorization. - Clarifies how toolkits with multiple authentication methods appear. - Keeps the browser and agent-readable versions consistent. - Replaces the API-key-based PostHog example with Gmail. ## Type of change - [ ] Bug fix - [ ] New feature - [ ] Refactor/Chore - [x] Documentation - [ ] Breaking change ## How Has This Been Tested? Describe the tests you ran and instructions so reviewers can reproduce. Include any relevant config/versions. ## Screenshots (if applicable) ## Checklist - [ ] I have read the Code of Conduct and this PR adheres to it - [ ] I ran linters/tests locally and they passed - [ ] I updated documentation as needed - [ ] I added tests or explain why not applicable - [ ] I added a changeset if this change affects published packages ## Additional context |
||
|
|
7dd5832ded | chore(docs): rebuild KB semantic artifact | ||
|
|
985d0d0777 | docs(auth): clarify managed OAuth app coverage | ||
|
|
027b773b36 |
docs: update Python SDK reference from source (#4339)
## Summary Auto-generated Python SDK reference docs from `python/composio/`. Regenerates pages at `docs/content/reference/sdk-reference/python/` to reflect changes in the Python package's public API (new methods, updated signatures, changed types). Co-authored-by: jkomyno <12381818+jkomyno@users.noreply.github.com> |
||
|
|
eb951dff34 |
docs: update guides for SDK changes (#4274)
## Summary
Automated docs update triggered by SDK source changes on `next`.
- Claude reviewed the SDK diff and updated guides, FAQs, or examples
that reference changed APIs or features.
- The docs `@composio/*` dependencies were realigned to their latest
published releases so Twoslash snippets and example apps validate
against versions users can actually install.
## Review checklist
- [ ] Changes accurately reflect the new SDK behavior
- [ ] No unrelated docs were modified
- [ ] Code examples are correct and complete
- [ ] If a documented feature is not published yet, the Twoslash build
will fail — wait for the release instead of working around it
Generated by Claude Code via GitHub Actions.
Co-authored-by: jkomyno <12381818+jkomyno@users.noreply.github.com>
|
||
|
|
7420927183 |
fix(sdk): qualify custom toolkit child slug mapping across Python and TypeScript (#4311)
## Summary The Python SDK treated a custom tool's `original_slug` as globally unique, rejecting valid custom toolkits that reuse common child names such as `SEARCH`, `VERSION`, or `GREP` even though the backend-assigned final slugs are toolkit-qualified (`LOCAL_ALPHA_GREP`, `LOCAL_BETA_GREP`). This ports the toolkit-qualified lookup from #3360 to Python, then fixes three response-mapping bugs found in review and applies the same fixes to the TypeScript SDK so both stay in parity. ## Changes ### Python (`composio`) - Scope custom-tool collision detection and response matching by toolkit plus original slug. - Keep bare original-slug aliases only when unambiguous; `session.execute("GREP")` raises with the final slugs to use when the slug is shared. - Preserve toolkit-qualified final slugs in `custom_toolkits()`. - `build_custom_tools_map_from_response`: raise when a response tool has local handles but no exact toolkit match instead of silently dropping it or binding another toolkit's handler; only fall back to a bare match when the response carries no toolkit identity; reject duplicate qualified response entries; derive bare-slug ambiguity from local definitions so omitting a sibling in the response never makes the survivor callable by bare name. - `custom_toolkits()` only reuses a bare alias that belongs to the same toolkit. - Docstring and Python session reference page state that bare-slug execution requires a unique original slug. ### TypeScript (`@composio/core`) - Same four fixes in `buildCustomToolsMapFromResponse` and the same guard in `customToolkits()`. - JSDoc and TypeScript session reference page updated. - Changeset: patch for `@composio/core`. ### Not changed - `COMPOSIO_MULTI_EXECUTE_TOOL` still aborts the whole batch when one item uses an ambiguous bare slug, matching current TS behavior. Switching to per-item errors is a cross-SDK design change left for a follow-up. ## Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor/Chore - [ ] Documentation - [ ] Breaking change ## How Has This Been Tested? Python: - `pytest tests/test_custom_tools.py tests/test_tool_router.py`: 181 passed. - ruff (project config) clean; mypy reports no errors in the touched files. - New tests: sibling routing, multi-execute, preload rejection, listing guard, and five response-mapping cases (no exact match, cross-toolkit binding, standalone bare fallback, unknown response tools skipped, ambiguity from local definitions, duplicate qualified entries). TypeScript: - `vitest run` in `ts/packages/core`: 53 files, 1251 passed, 2 expected failures. - `tsc --noEmit` clean; prettier and oxlint via pre-commit hook. - New tests: cross-toolkit reuse in `buildCustomToolsMap` and a new `buildCustomToolsMapFromResponse` block mirroring the Python cases. Python and TypeScript CI do not run automatically on this fork PR; a maintainer needs to approve the workflow run. ## Checklist - [x] I have read the Code of Conduct and this PR adheres to it - [x] I ran linters/tests locally and they passed - [x] I updated documentation as needed - [x] I added tests or explain why not applicable - [x] I added a changeset if this change affects published packages ## Additional context Reviewed with a second opinion from Codex (gpt-5.6-sol), which flagged the wrong-handler binding and response-derived ambiguity bugs fixed in the follow-up commits. https://claude.ai/code/session_01Y7Ni3QEBDGShSrEtwQS5bA EOF -R ComposioHQ/composio --------- Signed-off-by: CoralGarden52 <2193436736@qq.com> Co-authored-by: jkomyno <alberto@composio.dev> Co-authored-by: Alberto Schiabel <jkomyno@users.noreply.github.com> |
||
|
|
fc681b87b2 |
Fix .jpg resolving to non-standard image/jpg instead of image/jpeg (#4333)
## Problem
`composio.utils.mimetypes.guess()` maps `.jpg` to `"image/jpg"`:
```python
".jpe": "image/jpeg",
".jpeg": "image/jpeg",
".jpg": "image/jpg", # <- non-standard
```
`image/jpg` is not a registered IANA media type. It is inconsistent
with:
- its own sibling extensions `.jpe`, `.jpeg`, and `.jfif-bnl`, which all
map to `image/jpeg`
- Python's standard library: `mimetypes.guess_type("x.jpg")` returns
`image/jpeg`
- IANA, which registers `image/jpeg`
`guess()` feeds the `Content-Type` used for presigned uploads
(`_upload_to_presigned_url`), so `.jpg` files are uploaded and stored
with a non-standard content type.
## Fix
Map `.jpg` to `image/jpeg`. One line.
The reverse `_MIME_TO_EXT` map keeps its `"image/jpg": "jpg"` entry on
purpose: the SDK should still accept `image/jpg` when a server sends it
in a `Content-Type` header (liberal in what it accepts, strict in what
it produces).
## Tests
Added coverage in `tests/test_mimetypes.py`: `.jpg`/`.jpeg` in the
known-extensions table plus a dedicated test documenting that `.jpg`
resolves to `image/jpeg`. Verified the new tests fail on the old value
and pass after the fix; the full `test_mimetypes.py` (35 tests) passes.
|
||
|
|
52efb5b833 |
fix(core): respect authConfigId in trigger subscriptions (#4298)
## Summary - Apply the existing authConfigId subscription filter to incoming trigger events. - Add a V3 regression test for mismatched auth configurations. - Add a patch changeset for @composio/core. Previously, a subscription filtered by authConfigId still invoked its callback for events belonging to a different auth configuration. ## Verification - Vitest targeted tests: 76 passed - Vitest core suite: 1244 passed, 2 expected failures - TypeScript typecheck and Prettier passed Fixes the missing authConfigId filtering in trigger subscriptions. --------- Co-authored-by: jkomyno <alberto@composio.dev> |
||
|
|
0d28befb14 |
fix(sdk): map streamed file transport failures (#4321)
## Summary - map Python file-fetch failures that occur after response headers into the documented upload and download errors - map TypeScript RemoteFile connection and streamed-body failures into RemoteFileDownloadError while preserving blocked-URL errors - close or cancel response bodies on every exit and apply the shared 100 MiB response limit to TypeScript RemoteFile downloads This supersedes the Python-only proposal in #4305 and carries the same failure category across both SDKs. ## Independent reproduction A response double returned one chunk and then raised a connection-reset error. On current next: - Python _fetch_file_from_url leaked ConnectionError, although it did close the response - Python Tool Router URL fetch leaked ConnectionError and left the response open - TypeScript RemoteFile leaked the native fetch/body TypeError instead of RemoteFileDownloadError ## Verification - Python make chk - Python make tst: 1,490 passed - TypeScript core typecheck - TypeScript core tests: 1,245 passed, 2 expected failures - TypeScript package build: 19 packages - focused Python regression tests: 3 passed - focused TypeScript RemoteFile tests: 17 passed |
||
|
|
95f9d3295f |
fix(cli): guard URL file uploads against SSRF (#4319)
## Summary - route attacker-controlled URL sources and API-provided presigned upload destinations through the runtime-conditional core SSRF guard - expose that guard through a Node/workerd-aware core subpath - validate and revalidate DNS on redirects, pin Node and Bun connections to validated addresses, and preserve configured proxy routes - fail closed for user-chosen URL uploads in edge runtimes - cancel ignored response bodies and cover both upload boundaries at the public CLI pipeline - avoid adding `Content-Length: 0` to bodyless Bun GET requests ## Local reproduction On `next`, the CLI pipeline used bare `fetch` for both targets. A local loopback source and an internal presigned destination reached the network path. With this branch, the real `uploadToolInputFiles` pipeline blocks a `127.0.0.1` source before presigning and a `169.254.169.254` destination before sending bytes. A direct Bun proof also confirmed the pinned transport reaches a validated address without calling native `fetch`, while retaining the original Host header. Focused tests preserve native Bun fetch when an environment proxy is configured. ## Cross-SDK parity Python already applies public-address validation, redirect checks, DNS pinning, and response limits to URL uploads. Its focused URL-safety and upload suite remains green: 62 passed. No Python behavior change was needed. ## Verification - `pnpm build:packages`: 19 packages built - root `pnpm typecheck`: 14 package checks passed - TypeScript core: 53 files, 1,246 passed and 2 expected failures - focused core SSRF and pinned-transport tests: 31 passed - Python URL-safety/upload tests: 62 passed - real Bun execution of both CLI upload boundaries: blocked before presign/send - `git diff --check` The CLI Effect test file contains source and presigned-destination regressions and typechecks. Its local runner is blocked on current `next` by the repository-wide `@effect/vitest` config failure; hosted CLI checks exercise that boundary. ## Contributor context Supersedes [#4299](https://github.com/ComposioHQ/composio/pull/4299) · [Glen](https://app.tryglen.com/ComposioHQ/composio/pull/4299) after independently reproducing the attack path. The report is valid and useful, but the proposed root export hard-coded a Node module into an edge-capable package, its happy-path test did not execute the returned Effect, and it omitted destination protection, response cleanup, and Bun address pinning. |
||
|
|
be8e978c3a |
fix(toolchain): pin Bun canary for valid macOS signatures (#4315)
This PR: - closes #4284 - makes `mise.toml` the editable source of truth for Bun and pins `1.4.1-canary.1+d9b769812`, the first Bun build whose compiled macOS binaries carry strictly valid signatures - maps that revision to the immutable per-platform `@oven/bun-*` npm tarballs via mise's `http` backend, so mise extracts the exact checksum-verified binary with no npm lifecycle, Node dependency, or postinstall script - installs Bun through mise in CI and Docker E2E images, removing the independent `bun-version` input and the `oven-sh/setup-bun` channel - updates the checksum-verified mise installer to `2026.8.15`, reuses it in the Docker E2E images, and regenerates `mise.lock` with that release - teaches the preinstall toolchain check to compare the full Bun revision (via `Bun.version_with_sha`, in-process) when the pinned version carries build metadata - verifies the exact `bun --revision`, a strictly valid Bun-compiled macOS signature, a Linux container install, the release-workflow contract, and formatting/linting EOF -R ComposioHQ/composio |
||
|
|
1d31c80eff |
fix(sdk): keep credentials private in storage and logs (#4318)
## Summary - write CLI user data, pending login sessions, and agent identities through one atomic `0600` helper - repair `0644` credential files created by older CLI versions before reading them - redact credential-shaped structured values from CLI user-context diagnostics - redact secret-shaped text at both TypeScript and Python SDK log-output boundaries, including Pusher `auth` responses and exception tracebacks - preserve Python logger compatibility: errors remain untruncated, disabled levels remain lazy, and malformed placeholders cannot expose arguments ## Local reproduction Under the normal `022` umask, `next` created a plaintext credential file with mode `0644`. The pre-fix CLI user-context and TypeScript SDK debug paths also emitted sentinel credentials. The private atomic writer changes an existing `0644` target to `0600`, and the upgrade tests now prove all three legacy credential files are tightened without changing their contents. ## Verification - CLI permission upgrade tests: 31 passed across user data, pending login, and agent identity paths - CLI source and test typechecks passed - TypeScript core logging, redaction, and Pusher tests: 17 passed - TypeScript core source and type-test typechecks passed - Python logging regression tests: 5 passed - focused Ruff, Prettier, Oxlint, and `git diff --check` passed The focused CLI runner needed a temporary local alias for the pre-existing missing `#ssrf_guard` mapping in the CLI Vitest config. The alias was removed after verification and is not part of this PR. ## Contributor context Credit to **Syed Anas Mohiuddin**, independent security researcher, for reporting the legacy CLI credential-file permission issue. Supersedes [#4300](https://github.com/ComposioHQ/composio/pull/4300) · [Glen review](https://app.tryglen.com/ComposioHQ/composio/pull/4300). The implementation also covers agent credentials, retains atomic writes, and applies redaction at the shared SDK logging boundary.@composio/cli@0.4.1-beta.374 |
||
|
|
36785a38fc |
docs: Hobby / Pro / Enterprise plans + pass-through premium tools (#4141)
## Summary Composio's new pricing went live on Aug 15, 2026: **Hobby** ($0) / **Pro** ($29/mo) / **Enterprise** (custom). This PR updates the public docs to describe only the current offering and reprices premium tools as pass-through (provider cost + 5% platform fee). ## Principle - Docs describe the **current** plans only (Hobby / Pro / Enterprise). No Starter/Growth tables, no dual documentation. - Where a legacy note is genuinely useful (rate limits), exactly one sentence pointing pre-Aug-15 customers to https://composio.dev/pricing/legacy. - **Link to https://composio.dev/pricing instead of repeating numbers**, so future price changes are a one-place edit. ## Files changed - `docs/content/toolkits/pro-tools.mdx` — replaced the "3x the cost" line and the Totally Free / Ridiculously Cheap / Serious Business tier table with pass-through pricing copy: paid third-party providers, provider price + 5% platform fee (no markup), per-call prices on the pricing page's "Premium tools" section, Hobby includes up to $2/mo of premium tool usage, prices depend on provider and can change with advance notice. Retitled the page from "Pro Tools" to "Premium Tools" (matches the pricing page and avoids confusion with the new Pro plan). URL slug `/toolkits/pro-tools` is unchanged so no links break. Rest of the page (what counts as a premium tool, rate limits) intact. - `docs/content/reference/rate-limits.mdx` + `docs/content/reference/v3/rate-limits.mdx` (manual copies, updated identically) — plan table now Hobby 2,000 req/min · Pro 10,000 req/min · Enterprise Custom (kept the doc's existing per-minute unit and "Custom" wording for Enterprise). No legacy/grandfathering note — docs describe current plans only; grandfathered customers are served by the dashboard and composio.dev/pricing/legacy. - `docs/app/llms.mdx/[[...slug]]/route.ts`, `docs/components/toolkits/toolkits-landing.tsx` — label text "Pro Tools" → "Premium Tools" (link targets unchanged). ## Not changed / notes for reviewers - `docs/content/docs/common-faq.mdx` no longer exists on `next` (removed in the sessions-first rewrite, #3637); a grep for self-host / on-prem across `docs/content` found **no** page advertising self-hosting as an Enterprise feature, so nothing to remove there. - Grep sweep (case-insensitive) over `docs/content` for: Starter, Growth plan/tier, Ridiculously, Serious Business, Totally Free, on-prem, self-host(ed), $229, $599, 20k tool calls, 200k, per seat, per-seat, 3x the cost. All customer-facing hits were in the three files above and are fixed. Left alone: - `changelog/*` — historical entries (self-hosted Supabase/PostHog instances, "self-hosted deployments need backend version X"); these refer to third-party instances or historical SDK notes, not to an Enterprise plan feature. - `docs/auth-configuration/custom-auth-configs.mdx:23`, `docs/authentication/custom-app-vs-managed-app.mdx:30` — "self-hosted" refers to the *customer's* self-hosted third-party app (e.g. Salesforce subdomain), unrelated to Composio plans. - `docs/configuring-sessions.mdx`, `docs/sandbox/remote.mdx` — "Sandboxes are not billed today" note; not part of this change, flagging in case sandbox billing status changed with the new pricing. - `pro-tools.mdx` "Rate limits" table: **fixed in `421789d90`** — dropped the "Standard Tool Calls" column (100/min · 5,000/min contradicted `reference/rate-limits.mdx`), kept only the premium-execution limiter mapped to plan names (Hobby 1,000/hr · Pro 10,000/hr · Enterprise Custom) with a note that it is separate from the org API limit. Also added Pro's premium allowance bullet. ## Validation - `bun run lint` (oxlint): passes; only pre-existing warnings in untouched files. - `bun run lint:links` (`scripts/validate-links.ts`): 0 errors. ## Related PRs - landing: https://github.com/ComposioHQ/landing/pull/289 - platform: https://github.com/ComposioHQ/platform/pull/12078 - dashboard: https://github.com/ComposioHQ/dashboard/pull/1326 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01P3JgWs8DcjeQTRKoJd8gmQ --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |