mirror of
https://github.com/ComposioHQ/composio.git
synced 2026-09-22 11:46:35 +08:00
versioning-example@0.1.3
10 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
eb5f2b1938 |
fix(docs-agent): port Eve prompt and error handling hardening to next (#4549)
## What this is A port of #4389 from `main` to `next`. No new code. The six files are taken verbatim from `main`. #4389 merged into `main` on 2026-09-08. The docs site does not deploy from `main`, it deploys from `next`, so the fix never reached production. Verified on 2026-09-21: the repo's Production deployment is commit `4b5920bf7aa55c8a44657b060d4bd25ce7b13a9a`, which compares `identical` to `next`, and `docs/agent/lib/safety.ts` does not exist at that commit. Both findings were live in production. ## What it fixes Two AppSecure September findings against the docs assistant. **Finding 3, system prompt disclosure.** The assistant returned the upstream request payload on its error path, and that payload included the system message. An error was enough to leak the prompt. **Finding 2, scope guardrail bypass.** The scope guardrail was bypassed by wrapping an off-topic task inside a docs-looking request. The guardrail checked the shape of the request rather than the task inside it. Tracked as SEC-1064 and SEC-1061. ## Verification that this is a clean port `next` and `main` differed on these six files by exactly the #4389 patch and nothing else. Checked at blob level, not just line counts: | File | `next` vs pre-#4389 `main` (`711e609a`) | |---|---| | `docs/agent/agent.ts` | same blob `0781e59f` | | `docs/agent/instructions.md` | same blob `6fc4af3b` | | `docs/agent/channels/eve.ts` | same blob `c083c68b` | | `docs/agent/lib/safety.ts` | absent on both | | `docs/tests/static/eve-agent-fetch.test.ts` | absent on both | | `docs/tests/static/eve-safety.test.ts` | absent on both | For the three modified files the blob on `next` is identical to the blob on `main`'s pre-#4389 parent. For the three new files they are absent on both. So taking `main`'s version is exactly applying #4389, with no collateral revert of anything that landed on `next` afterwards. Confirmed a second way: `git diff next main` restricted to these six files is byte for byte the same as the #4389 patch, 13742 bytes, sha256 `6c934e56cb36614e...`. The staged diff of this branch's commit hashes to that same value. No drift had appeared since the earlier check. Nothing was rewritten or redesigned during the port. ## Tests Run locally in `docs/`, the commands behind `docs-tests.yml` and `docs-typescript-check.yml`: | Command | Result | |---|---| | `bun test tests/static/eve-safety.test.ts tests/static/eve-agent-fetch.test.ts tests/static/eve-agent-model-errors.test.ts` | 14 pass, 0 fail | | `bun run test` | 590 pass, 0 fail across 62 files | | `bun run lint` | exit 0, no findings in the changed files | | `bun run types:check` | exit 0 | Those three test files carry the regression coverage for both findings. The third is new in this branch; see below. --- ## Two review findings, addressed here Review bots raised two issues against code this PR ports. Both were pre-existing: the code is byte for byte what #4389 shipped to `main` on 2026-09-08, and both are live in production on `main` today. Neither was introduced by the port. Fixing them here gives up the property the PR originally sold, that its diff is provably exactly #4389. That is the right trade. The point of the PR is to close the two findings on the branch that deploys, and a fix that does not actually close the disclosure is worse than a messier diff. ### Codex, P1, `docs/agent/agent.ts`: right conclusion, wrong mechanism Codex said the system prompt still escapes because `@ai-sdk/provider-utils` catches custom-fetch rejections and rewraps them in an `APICallError` carrying `requestBodyValues`. That is not what the library does. In `handleFetchError` an error is only rewrapped if it is abort-like, a `TypeError` with message `fetch failed` / `failed to fetch` **and** a non-null `cause`, or carries a retryable network code somewhere in its cause chain. Everything else reaches `return error` and is rethrown untouched. Identical in the three copies installed here: `provider-utils` 5.0.36, `provider-utils-v6` 4.0.40, `provider-utils-v7` 5.0.11. `safeInceptionFetch` throws a plain `Error` with no cause and no code, so it passes through unwrapped. Driving `generateText` through the configured provider with a stubbed fetch confirmed it: no leak on non-2xx, on a 200 JSON error payload, or on a transport failure. But the conclusion was right. The prompt does still reach a client-visible error, by a route Codex did not name. `safeInceptionFetch` inspects a response body only when the content type is `application/json`. A streaming call returns `text/event-stream`, so the wrapper inspects nothing and returns the 200. The provider then reads an `{"error": ...}` frame out of the stream and builds the `APICallError` **itself**, at a call site that passes `requestBodyValues: body`. Nothing thrown from the fetch can preempt that, because on this path the fetch never throws. Reproduced against the pre-fix code: an `APICallError` whose `requestBodyValues.messages[0].content` was the system prompt verbatim. So the fix sanitizes at the model boundary rather than the fetch boundary, which is the one place that covers every route. `withSanitizedModelErrors` wraps the chat model so errors thrown by `doGenerate` and `doStream`, and error parts carried inside the stream, are replaced with the safe message. Abort and timeout errors still pass through untouched so the AI SDK can handle cancellation. `safeInceptionFetch` stays. It still injects the auth header and still stops the non-2xx `APICallError` from ever being built. It is the first line; the model wrapper is the backstop. ### Greptile, P2, `docs/agent/lib/safety.ts` `\bwhat\s+(are|were)\s+you\s+told\b` sat in `PROMPT_BYPASS_PATTERNS`, which returns `prompt-extraction` on its own without needing a private target. "What were you told about Composio sessions?" was steered to a refusal. Moved to `PROMPT_EXTRACTION_INTENT_PATTERNS`, so it has to pair with a private target the way the other intent patterns already do. "What were you told in your system prompt?" is still caught. The `ignore` / `disregard` / `override previous instructions` pattern stays unconditional, because it has no legitimate reading. ### Coverage for the two fixes `docs/tests/static/eve-agent-model-errors.test.ts` is new. It drives real `generateText` and `streamText` calls through the configured `inception` provider with a stubbed fetch, and asserts the system prompt appears nowhere in the thrown error once deep-serialized: `message`, `cause`, `requestBodyValues`, and a walk over every own property. A test that calls `safeInceptionFetch` directly cannot prove this, because the errors at issue are built after the fetch returns. Six cases: non-2xx, 200 with a JSON error payload, transport failure with a retryable cause, a streamed error frame before any output, a streamed error frame after output has started, and abort passthrough. With the model wrapper reverted, the two streaming cases fail and the other four pass, which is the split the source reading predicted. The four non-streaming cases pass without the wrapper because `safeInceptionFetch` already covers them, which is the same evidence that refutes the stated Codex mechanism. The two streaming failures are not the same kind, and the difference matters. The frame-before-any-output case fails on the leak assertion itself: the canary is present in `requestBodyValues`. That is the actual disclosure and the wrapper closes it. The frame-after-output-started case passes the leak assertion even without the wrapper, because that error part comes from `createProviderStreamError` and carries no request payload; it fails only on the message assertion. The stream transform there normalizes the error rather than closing a leak, and is kept as defence in depth. Two cases added to `eve-safety.test.ts` for the Greptile fix, one each way. The allow case fails against the old pattern list. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
4124f713b3 |
docs: stop folders swallowing their siblings in llms.txt; fix auth folder link
Four review fixes on the sidebar restore. Folder headings do not close, so every page emitted after a folder read as one of that folder's children. Making `authentication` a folder mid-list swallowed `triggers` and `skills` into `### Authentication`. Reordering meta.json would fix the output but push Authentication below Skills in the human sidebar, which is what this PR exists to prevent — so walkPageTree now buffers each separator section and flushes its plain pages ahead of its folders. Legacy-separator skipping is unchanged. This also fixes the pre-existing case where `agent-plugins`, `cli` and `composio-connect` read as children of `#### Custom providers`. Drop "index" from authentication/meta.json. Listing it clears `node.index`, so fumadocs renders the folder as a chevron BUTTON plus a duplicate child row instead of a SidebarFolderLink — the row a reader clicks to reach /docs/authentication (1,850 views/month) expanded the folder instead of navigating. Omitting it matches how `providers` and `migration-guide` already render. Verified in the built DOM: an A with href=/docs/authentication, no duplicate row, /docs/authentication.md still emitted exactly once via node.index. Rename the ---Security and data--- separator to ---Security---; it duplicated the folder title directly beneath it, in llms.txt and in the sidebar. Point the last three agent/instructions/context.md bullets at canonical paths rather than redirect-only /docs/authenticating-users/* ones, so that file is internally consistent. Extend the llms.txt section test to assert the nearest preceding heading of any level, and to cover the sibling pages that regressed. It fails against the old walk. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
5ca29e857e |
docs: restore auth pages to the sidebar as an Authentication folder
PR #4099 dropped 8 auth pages from meta.json. That was a net win for machines (Loop 5 eval: 84/100 vs 77/100, tool-routing failure mode gone) but it made the pages unreachable by clicking. PostHog, weekday-matched and control-adjusted, shows the affected pages down 14-64pp beyond the site-wide baseline drift. Restore human navigation without touching the machine-facing wins: - authentication.mdx becomes authentication/index.mdx and the 7 sibling auth pages move into the folder. /docs/authentication keeps its URL (fumadocs serves index.mdx at the folder route), so Core concepts still shows one row and the top-level sidebar row count stays 20. - shared-connections moves into extending-sessions: it is experimental and is a session capability, not a core auth concept. - "Migration and security" splits into "Migration" and "Security and data" — separator headings, not clickable rows. - Drop AUTHENTICATION_GUIDE_URLS from app/llms.txt/route.ts. The pages are back in the page tree, so they emit automatically under Core concepts -> Authentication; the hardcoded list would now duplicate. - 8 permanent redirects for the old URLs (36-42% Google entry rate on most of them), plus existing redirect destinations repointed so none of them chain. - ~90 inbound links rewritten across content, api-overviews, app, lib and agent instructions. lint:links is the gate: 0 errors. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
a4a4427c68 |
docs(auth): drop same-browser binding from the reference; keep session fixation
Same-browser binding is not enabled, so remove it from the connected-accounts reference and concept map. Keep the OAuth session fixation definition as the rationale for callback identity verification, which is now the single control the section documents. Regenerated both index pages; repointed the concept map to #callback-identity-verification. |
||
|
|
6d8a25af1d |
docs(auth): move OAuth connection security into the connected-accounts reference
Drop the standalone /docs/oauth-connection-security page and its nav entry. The content now lives as a section in the connected-accounts API overview (api-overviews/connected-accounts.mdx), next to the complete_auth endpoint it documents, in that overview's house style. - Add the section (same-browser binding + callback identity verification) to the overview and mirror it into both generated index.mdx files (v3.1 + v3). The index generator's deps don't resolve in this worktree, so the mirror is manual; it matches what generate:api-index would emit from the updated overview. - Repoint the changelog and the agent concept map at /reference/api-reference/connected-accounts#... - Fix a stale concept-map claim: identity verification is opt-in per project and covers every connection once set, not custom-auth-config-only. |
||
|
|
d9b7ec54b7 |
docs(auth): OAuth connection security page (good-docs-writing voice)
Skill-guided rewrite of the OAuth connection security page: direct second-person voice, no em-dashes, concept-first sentences, no salesy comparatives. Also corrects four accuracy issues found while verifying against the Apollo code (these exist in the sibling PR too): - the ten-minute figure is the session_uri TTL, not a connection-expiry; - verification covers API + Connect Link redirects, not marketplace-install acknowledgements (which return before the verifier fork); - save-time validation is https + SSRF (private/reserved), not a reachability test; - the rejection message has no trailing period. |
||
|
|
fbcf08136d |
revert(core): defer v1 session alias removal (#3826)
This PR: - reverts https://github.com/ComposioHQ/composio/pull/3780 - restores the TypeScript `composio.create()` and `composio.use()` session aliases, with their runtime and type-test coverage - restores the prior deprecation state for `BaseProvider.wrapMcpServerResponse` - removes the pre-v1 breaking-change changeset so the release PR no longer advertises this removal The v1 API-freeze change should be recreated later as a draft PR and kept out of the merge queue until v1 is ready. |
||
|
|
0de52639c4 |
feat(core)!: remove bare session aliases; freeze MCP SPI (#3780)
## What and why This makes the intended v1 API cleanup real rather than postponing it to v2: - Remove the TypeScript root aliases `composio.create(...)` and `composio.use(...)`. Session creation and reuse now live only at `composio.sessions.create(...)` and `composio.sessions.use(...)`. This is a deliberate breaking change, reflected by a major changeset. - Retain `BaseProvider.wrapMcpServerResponse` as the stable v1 provider SPI. Its earlier deprecation pointed to a method that was never introduced. The scope is intentionally narrow: it does **not** remove unrelated deprecated APIs, and Python keeps its supported `Composio.create/use` API. The TypeScript docs, examples, providers, runtime fixtures, generated SDK reference, and API-reference indexes now use the namespaced TypeScript API. Historical changelog examples are left as history. ## Verification - `pnpm typecheck` - `pnpm --filter @composio/core test -- --run test/core/session.test.ts` (42 files, 1,018 tests) - `pnpm exec eslint ts/packages/core/src/composio.ts` - `pnpm --filter @composio/core generate:docs` - `cd docs && bun run generate:api-index` - `cd docs && bun run types:check` - `git diff --check` and targeted scans for removed TypeScript aliases I also attempted the affected Node and Cloudflare runtime E2E suites. They cannot initialize in this checkout without `COMPOSIO_API_KEY` (and, for Cloudflare, `COMPOSIO_BASE_URL` and `OPENAI_API_KEY`); they did not report a product assertion failure. |
||
|
|
ea2e02071a |
docs: fast-search with mercury-2 (#3687)
## Summary
- Switch the docs Eve agent from the AI Gateway `openai/gpt-5.4-mini`
string to an Inception Labs Mercury 2 OpenAI-compatible chat model.
- Keep tool calling on the chat-completions path and pass Mercury's
`reasoning_effort=medium` through the AI SDK OpenAI adapter.
- Add `DOCS_AGENT_MODEL_FLOW` so the same agent can run either `mercury`
or the old AI Gateway flow for eval comparisons.
- Add docs-agent eve evals covering grounded docs answers, docs
retrieval, citations, and account-specific support refusal.
- Replace the docs-agent retriever with an in-process BM25-style lexical
ranker that returns bounded full content for the top results, so Mercury
gets rich context in one fast tool call instead of a serial
`search_docs` → `read_doc` round trip.
- Precompute BM25 term counts/document frequencies into the generated
`agent/lib/docs-index.ts` snapshot at build time, removing deployed
cold-start corpus construction while keeping retrieval in-process.
- Add opt-in search perf logging (`DOCS_AGENT_SEARCH_PERF_LOG=1`,
optional `DOCS_AGENT_SEARCH_LOG_QUERY=1`) with timings for tokenization,
corpus load/cache, ranking, hydration, total duration, corpus source,
and top URLs.
- Add `eval:agent` and `eval:agent:flows` scripts; `eval:agent:flows`
can run local model-flow comparisons or remote target comparisons via
`DOCS_AGENT_EVAL_TARGETS`.
- Add `INCEPTION_API_KEY` / optional Mercury and gateway model knobs to
`docs/.env.example`, and move `@ai-sdk/openai` to runtime dependencies
for the agent import.
## Notes
- This is intentionally an experiment to see how Mercury's diffusion
model behaves with Eve tool calling (`search_docs` and `read_doc`).
- Preview/runtime environments need `INCEPTION_API_KEY`;
`INCEPTION_MODEL` and `INCEPTION_BASE_URL` are optional overrides.
- The custom fetch prevents accidentally falling back to
`OPENAI_API_KEY` against Inception's endpoint.
- The docs search is lexical/in-memory, not vector search. The slow path
was mostly serial model/tool round trips and cold index construction,
not embedding lookup.
- The generated BM25 snapshot is process-local once loaded: warm for the
lifetime of the running Node/Vercel function instance, and reset on cold
starts, redeploys, or process restarts. The expensive term-count corpus
is now built at docs build time.
- Perf logs omit raw user queries by default; set
`DOCS_AGENT_SEARCH_LOG_QUERY=1` only when you explicitly want raw
query/term logging.
- Local A/B-style eval run:
```bash
DOCS_AGENT_EVAL_FLOWS=gateway,mercury bun run eval:agent:flows --
--strict
```
- Live target comparison:
```bash
DOCS_AGENT_EVAL_TARGETS=baseline=https://<prod>,mercury=https://<preview>
bun run eval:agent:flows -- --strict
```
## Tests
- `bunx eslint scripts/build-agent-index.ts agent/lib/docs.ts
agent/tools/search_docs.ts`
- `bun scripts/build-agent-index.ts` (wrote 133 pages + 1000 toolkits +
1139 BM25 rows)
- `DOCS_AGENT_SEARCH_PERF_LOG=1 EVE_FORCE_BUNDLE=1 bun -e "const
tool=(await import('./agent/tools/search_docs.ts?log=' +
Date.now())).default; await tool.execute({query:'create a session with
github tools'}); await tool.execute({query:'auth config connected
account'});"` (logs cold and warm timing JSON)
- `EVE_FORCE_BUNDLE=1 bun -e "const tool=(await
import('./agent/tools/search_docs.ts?bundle=' + Date.now())).default;
const started=performance.now(); const r=await
tool.execute({query:'create a session with github tools'});
console.log(r.retrieval, r.results[0].url, r.results[0].content.length,
Math.round(performance.now()-started)+'ms');"` (precomputed bundle path,
~12ms)
- `bun -e "const tool=(await import('./agent/tools/search_docs.ts?live='
+ Date.now())).default; const started=performance.now(); const r=await
tool.execute({query:'create a session with github tools'});
console.log(r.retrieval, r.results[0].url, r.results[0].content.length,
Math.round(performance.now()-started)+'ms');"` (live-content path,
~34ms)
- `EVE_FORCE_BUNDLE=1 bun -e "const tool=(await
import('./agent/tools/search_docs.ts')).default; await
tool.execute({query:'create a session with github tools'}); const
started=performance.now(); const r=await tool.execute({query:'auth
config connected account'}); console.log(r.results[0].url,
r.results[0].content.length,
Math.round(performance.now()-started)+'ms');"` (warm path ~2ms)
-
`PATH=/Users/cryogenicplanet/.vite-plus/js_runtime/node/24.15.0/bin:$PATH
./node_modules/.bin/eve info --json` (reports `status: ready`, `model:
inception/mercury-2`, `errors: 0`)
- `DOCS_AGENT_MODEL_FLOW=gateway
PATH=/Users/cryogenicplanet/.vite-plus/js_runtime/node/24.15.0/bin:$PATH
./node_modules/.bin/eve info --json` (reports `status: ready`, `model:
openai/gpt-5.4-mini`, `errors: 0`)
-
`PATH=/Users/cryogenicplanet/.vite-plus/js_runtime/node/24.15.0/bin:$PATH
./node_modules/.bin/eve eval --list`
-
`PATH=/Users/cryogenicplanet/.vite-plus/js_runtime/node/24.15.0/bin:$PATH
bun scripts/eval-agent-flows.ts --list`
- `bun test tests/static/` (16 passed)
- `bun run types:check` currently fails on existing docs type-generation
errors in `app/(home)/docs/changelog/[...slug]/page.tsx`,
`app/(home)/examples/[[...slug]]/page.tsx`,
`app/(home)/toolkits/[[...slug]]/page.tsx`,
`app/llms.mdx/[[...slug]]/route.ts`, `lib/search-index.ts`, and
`lib/source.ts`; no new eval or `docs/agent/agent.ts` errors were
reported.
## Not run
- Real live model evals, because this local environment does not have
`INCEPTION_API_KEY` or AI Gateway credentials.
## Latest update
- Added default eager docs retrieval in the Eve HTTP channel: the server
runs the same BM25 search on the user's message before the first model
step and injects the results as one-turn context.
- Kept `search_docs` and `read_doc` available so Mercury can still
search/read more when the eager context is weak, ambiguous, or missing.
- Added `DOCS_AGENT_EAGER_SEARCH=0` as an escape hatch and labeled perf
logs with `invocation: "eager_context" | "tool"`.
- Updated the loading copy from “Searching the docs…” to “Thinking with
the docs…” so UI latency is not attributed solely to the search call.
## Latest tests
- `bun run lint -- agent/channels/eve.ts agent/tools/search_docs.ts
agent/lib/docs-search.ts components/eve-chat.tsx
evals/docs-agent/grounded-answers.eval.ts`
-
`PATH=/Users/cryogenicplanet/.vite-plus/js_runtime/node/24.15.0/bin:$PATH
node_modules/eve/bin/eve.js info --json` (reports `status: ready`,
`errors: 0`)
- `DOCS_AGENT_SEARCH_PERF_LOG=1 EVE_FORCE_BUNDLE=1 bun -e "import {
searchDocs } from './agent/lib/docs-search'; const r = searchDocs('How
do I create a session in Composio? Keep it brief.', { invocation:
'eager_context' }); console.log(JSON.stringify({count:r.results.length,
top:r.results[0]?.url, content: !!r.results[0]?.content}, null, 2));"`
- `DOCS_AGENT_SEARCH_PERF_LOG=1 bun -e "import { searchDocs } from
'./agent/lib/docs-search'; searchDocs('How do I create a session in
Composio? Keep it brief.', { invocation: 'eager_context' });
searchDocs('How do I create a session in Composio? Keep it brief.', {
invocation: 'tool' });"`
- `bun run types:check` still fails only on the pre-existing docs
type-generation issues listed above.
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
d17a268d3f |
docs: sessions-first rewrite — new guides, examples & components (+ core 0.13.0 SDK changes) (#3637)
Integration branch for the next docs release: a **sessions-first
documentation rewrite** — new and rewritten guides, example pages,
interactive components, and docs tooling — plus the supporting SDK
changes that the new docs describe.
The bulk of this PR is docs (~24k lines across ~150 commits); the SDK
changes (~5k lines) back the new guides.
## Documentation (the bulk)
- **Sessions-first restructure** — reorganized navigation and section
structure (incl. the "Sandbox (prev workbench)" section), with
v3-reorganization redirects so old URLs keep resolving.
- **Rewritten core guides** — quickstart, configuring sessions, triggers
(creating + subscribing to events), proxy-execute, toolkits
enable/disable, and common FAQ, rewritten in the house voice.
- **New example pages** — local-sandbox PR reviewer, daily standup bot,
and slack bot, with runnable build-ups.
- **New interactive components & diagrams** — triggers flow animation,
manage-connections visual, connection-refresh visual, and the
terminal-kit components.
- **Docs tooling** — a docs-graph link-graph connectivity checker,
search reprioritization (deprioritize legacy pages), and SDK-reference
regeneration.
## Supporting SDK changes
**`@composio/core` → 0.13.0 (minor)**
- `composio.sessions.create()` as the first-class sessions API
(`composio.create()` kept as an alias).
- **MCP is opt-in:** default `create()` / `use()` return native-tool
sessions (`SessionWithoutMcp`); pass `{ mcp: true }` to surface
`session.mcp`. _Migration: read `session.mcp` only after creating with
`{ mcp: true }`._
- `session.sandbox` is the canonical resolved config;
`session.workbench` kept as a deprecated alias. `sandbox` is the
preferred session-config key (`workbench` still accepted).
- `connectedAccounts.updateAcl()` graduated from experimental (alias
kept).
- `triggers.parse()` (parse + optionally verify an incoming webhook) and
`triggers.setWebhookSubscription()`.
**`@composio/experimental` → minor** — local-workbench helpers moved
onto the `@composio/experimental/workbench` subpath (out of
`@composio/core/experimental`), keeping the ~14 KB embedded Python
helper out of core. Plus the experimental Pi provider.
**`@composio/slim` → minor.**
**Python → 0.17.0** — mirrors the TS surface: `composio.sessions` mount
(`tool_router` deprecated), `triggers.parse()` /
`set_webhook_subscription()`, the `sandbox` config key, and
`connected_accounts.update_acl()`.
## Review response (#3664)
Addressed the `@composio/core` review:
- **Security:** `triggers.parse()` no longer fails open — a
present-but-empty `verifySecret` (e.g. unset `COMPOSIO_WEBHOOK_SECRET`)
now throws instead of silently skipping verification; omitting it stays
an explicit opt-out (both SDKs).
- Removed snake_case leakage from `transformWebhookSubscription` (+ the
index signature that allowed it).
- **Removed** the TS-only `connectedAccounts.link()` toolkit
auto-resolve (shipped with cancellability / orphaned-auth-config bugs
and was effectively undocumented; to be reintroduced properly later).
- Unified Python error types on `ValidationError`; added `mcp=True`
Python tests; fixed runtime-portability + error-type test assertions.
- Polished deprecation messages; fixed the backwards `/experimental`
`@deprecated` note and the `SessionWithMcp` JSDoc.
## Testing
- **TS:** `@composio/core` + `@composio/experimental` typecheck pass;
vitest green for the touched suites.
- **Python:** `test_tool_router.py` + `test_triggers.py` pass (161
tests).
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Kshitij Jhunjhunwala <kj@composio.dev>
Co-authored-by: Malay Vasa <malayvasa@gmail.com>
Co-authored-by: Sarah Simionescu <sarah@composio.dev>
Co-authored-by: Kshitij Jhunjhunwala <113939507+KJ-11@users.noreply.github.com>
|