mirror of
https://github.com/ComposioHQ/composio.git
synced 2026-09-22 11:46:35 +08:00
2573c64d97
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 -9447932: Dereference internal $ref/$defs in tool input schemas before provider translation, so properties reachable only through a reference keep their types and validation instead of degrading to untyped (z.any) or being emitted as a dangling reference. This changes the JSON Schema these providers emit for $ref-using tools. Downstream snapshot tests on tool definitions will see diffs. Schemas the Composio API ships with a $ref but no $defs block (e.g. GMAIL_FETCH_EMAILS) degrade to a permissive object schema rather than throwing. The strict-structured-outputs path of @composio/openai-agents is unchanged — OpenAI supports $defs/$ref natively, including recursion. ## @composio/google@0.11.0 ### Minor Changes -9447932: Dereference internal $ref/$defs in tool input schemas before provider translation, so properties reachable only through a reference keep their types and validation instead of degrading to untyped (z.any) or being emitted as a dangling reference. This changes the JSON Schema these providers emit for $ref-using tools. Downstream snapshot tests on tool definitions will see diffs. Schemas the Composio API ships with a $ref but no $defs block (e.g. GMAIL_FETCH_EMAILS) degrade to a permissive object schema rather than throwing. The strict-structured-outputs path of @composio/openai-agents is unchanged — OpenAI supports $defs/$ref natively, including recursion. ## @composio/langchain@0.11.0 ### Minor Changes -9447932: Dereference internal $ref/$defs in tool input schemas before provider translation, so properties reachable only through a reference keep their types and validation instead of degrading to untyped (z.any) or being emitted as a dangling reference. This changes the JSON Schema these providers emit for $ref-using tools. Downstream snapshot tests on tool definitions will see diffs. Schemas the Composio API ships with a $ref but no $defs block (e.g. GMAIL_FETCH_EMAILS) degrade to a permissive object schema rather than throwing. The strict-structured-outputs path of @composio/openai-agents is unchanged — OpenAI supports $defs/$ref natively, including recursion. ## @composio/llamaindex@0.11.0 ### Minor Changes -9447932: Dereference internal $ref/$defs in tool input schemas before provider translation, so properties reachable only through a reference keep their types and validation instead of degrading to untyped (z.any) or being emitted as a dangling reference. This changes the JSON Schema these providers emit for $ref-using tools. Downstream snapshot tests on tool definitions will see diffs. Schemas the Composio API ships with a $ref but no $defs block (e.g. GMAIL_FETCH_EMAILS) degrade to a permissive object schema rather than throwing. The strict-structured-outputs path of @composio/openai-agents is unchanged — OpenAI supports $defs/$ref natively, including recursion. ## @composio/openai-agents@0.11.0 ### Minor Changes -9447932: Dereference internal $ref/$defs in tool input schemas before provider translation, so properties reachable only through a reference keep their types and validation instead of degrading to untyped (z.any) or being emitted as a dangling reference. This changes the JSON Schema these providers emit for $ref-using tools. Downstream snapshot tests on tool definitions will see diffs. Schemas the Composio API ships with a $ref but no $defs block (e.g. GMAIL_FETCH_EMAILS) degrade to a permissive object schema rather than throwing. The strict-structured-outputs path of @composio/openai-agents is unchanged — OpenAI supports $defs/$ref natively, including recursion. ## @composio/vercel@0.12.0 ### Minor Changes -9447932: Dereference internal $ref/$defs in tool input schemas before provider translation, so properties reachable only through a reference keep their types and validation instead of degrading to untyped (z.any) or being emitted as a dangling reference. This changes the JSON Schema these providers emit for $ref-using tools. Downstream snapshot tests on tool definitions will see diffs. Schemas the Composio API ships with a $ref but no $defs block (e.g. GMAIL_FETCH_EMAILS) degrade to a permissive object schema rather than throwing. The strict-structured-outputs path of @composio/openai-agents is unchanged — OpenAI supports $defs/$ref natively, including recursion. ## @composio/core@0.18.1 ### Patch Changes -8a56383: Fix: automatic S3 file downloads are now capped at 100 MiB (configurable per call) to prevent memory exhaustion from oversized or streaming responses. -7420927: Fix custom toolkit child slug mapping: reject response tools that have local handles but no exact toolkit match instead of silently dropping them or binding another toolkit's handler, derive bare-slug ambiguity from local definitions, and only reuse a same-toolkit bare alias in customToolkits(). -1d31c80: Redact credential-shaped values at the SDK log boundary. -95f9d32: Expose the runtime-conditional SSRF-safe fetch helper for protected URL upload consumers. -0d28bef: Map file-download transport failures to the SDK error contract and bound streamed response bodies. -52efb5b: Fix trigger subscriptions ignoring the `authConfigId` filter. - Updated dependencies [ab289d6] - @composio/json-schema-to-zod@0.3.2 ## @composio/experimental@0.2.4 ### Patch Changes -4e633d1: Update TypeBox to 1.3.18. ## @composio/json-schema-to-zod@0.3.2 ### Patch Changes -ab289d6: Preserve Draft 7 acceptance across primitive, composed, referenced, conditional, and typeless schemas. Enforce sibling and object/array assertions, retain positional tuple and `additionalItems` behavior, and prevent native Zod materialization from rejecting values already accepted by the source schema. ## @composio/openai@0.12.2 ### Patch Changes -620075a: Fix: stop printing MCP server URLs (credential-bearing) to stdout via console.log in the OpenAI Responses provider; log server names via logger.debug instead. ## @composio/slim@0.18.1 ### Patch Changes - Updated dependencies [ab289d6] - @composio/json-schema-to-zod@0.3.2 ## @e2e-tests/cf-workers-basic@0.0.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 ## @e2e-tests/cf-workers-files@0.0.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 ## @e2e-tests/cf-workers-tool-router-ai@0.0.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/vercel@0.12.0 ## @e2e-tests/node-claude-agent-sdk@0.0.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/claude-agent-sdk@0.12.0 ## @e2e-tests/node-custom-tools@0.0.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 ## @e2e-tests/node-json-schema-to-zod-v3@0.0.2 ### Patch Changes - Updated dependencies [ab289d6] - @composio/json-schema-to-zod@0.3.2 ## @e2e-tests/node-json-schema-to-zod-v4@0.0.2 ### Patch Changes - Updated dependencies [ab289d6] - @composio/json-schema-to-zod@0.3.2 ## @e2e-tests/node-mastra-tool-router-zod-v3@0.0.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/mastra@0.10.4 ## @e2e-tests/node-mastra-tool-router-zod-v4@0.0.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/mastra@0.10.4 ## @e2e-tests/node-tool-router-files@0.0.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 ## @e2e-tests/node-tool-router-pagination@0.0.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 ## anthropic-example@0.1.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/claude-agent-sdk@0.12.0 - @composio/anthropic@0.11.1 ## connected-accounts-example@0.1.11 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 ## error-handling-example@0.1.11 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 ## file-handling-example@0.1.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 ## google-example@0.1.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/google@0.11.0 ## json-schema-to-zod-example@0.1.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/vercel@0.12.0 ## langchain-example@0.1.11 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/langchain@0.11.0 ## llamaindex-example@0.1.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/llamaindex@0.11.0 ## mastra-example@0.1.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/mastra@0.10.4 ## mcp-example@0.1.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/vercel@0.12.0 ## modifiers-example@0.1.11 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/vercel@0.12.0 ## openai-example@0.1.11 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [620075a] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/openai-agents@0.11.0 - @composio/openai@0.12.2 ## session-management-example@0.1.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 ## tool-router-example@1.0.12 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/claude-agent-sdk@0.12.0 - @composio/vercel@0.12.0 - @composio/openai-agents@0.11.0 ## toolkits-example@0.1.11 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/vercel@0.12.0 ## tools-example@0.1.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/vercel@0.12.0 ## triggers-example@0.1.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 ## vercel-example@0.1.11 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [9447932] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 - @composio/vercel@0.12.0 ## versioning-example@0.1.2 ### Patch Changes - Updated dependencies [8a56383] - Updated dependencies [7420927] - Updated dependencies [1d31c80] - Updated dependencies [95f9d32] - Updated dependencies [0d28bef] - Updated dependencies [52efb5b] - @composio/core@0.18.1 ## @composio/json-schema-to-effect-schema@0.1.1 ### Patch Changes -ab289d6: Translate draft-4 boolean `exclusiveMinimum`/`exclusiveMaximum` flags (as emitted by OpenAPI 3.0 exporters) into their Draft 7 numeric spelling so exclusive bounds are enforced instead of silently ignored. Co-authored-by: sdkrelease[bot] <294075132+sdkrelease[bot]@users.noreply.github.com>
E2E Tests
End-to-end tests for @composio/core and the CLI across different runtimes.
Directory Structure
ts/e2e-tests/
├── _utils/ # Shared test infrastructure
│ ├── Dockerfile.node # Docker image for Node.js tests
│ ├── Dockerfile.deno # Docker image for Deno tests
│ ├── Dockerfile.cli # Docker image for CLI tests (scratch)
│ ├── scripts/ # Docker build and cleanup scripts
│ │ ├── docker-build.ts # Pre-build images for all Node/Deno/CLI versions
│ │ └── docker-clean.ts # Remove all e2e Docker images
│ ├── src/ # TypeScript runner utilities
│ │ ├── config.ts # Configuration utilities
│ │ ├── const.ts # Well-known Node.js/Deno versions and timeouts
│ │ ├── e2e.ts # Main e2e test entry point
│ │ ├── image-lifecycle.ts # Docker image build/run utilities
│ │ ├── index.ts # Public exports
│ │ ├── runner.ts # Docker test runner
│ │ ├── sanitize.ts # Output sanitization utilities
│ │ ├── types.ts # TypeScript type definitions
│ │ └── volume.ts # Docker volume management
│ └── README.md # Utils documentation
├── runtimes/
├── node/ # Node.js runtime tests
│ ├── cjs-basic/ # Node.js 22 require(esm) interop tests
│ ├── claude-agent-sdk/ # @composio/claude-agent-sdk + Claude Agent SDK MCP tests
│ ├── custom-tools/ # Custom local tools execution (session.execute, proxyExecute, Zod validation)
│ ├── esm-basic/ # ESM compatibility tests
│ ├── json-schema-to-zod-v3/ # @composio/json-schema-to-zod + Zod v3 tests
│ ├── json-schema-to-zod-v4/ # @composio/json-schema-to-zod + Zod v4 tests
│ ├── mastra-tool-router-zod-v3/ # @composio/mastra Tool Router + Zod v3 tests
│ ├── mastra-tool-router-zod-v4/ # @composio/mastra Tool Router + Zod v4 tests
│ ├── openai-zod4-compat/ # OpenAI + Zod v4 compatibility tests
│ ├── tool-router-files/ # Tool Router session files (list, upload, download, delete)
│ ├── tool-router-pagination/ # Tool Router session.toolkits() cursor pagination
│ └── typescript-mjs-import-nodenext/ # TypeScript moduleResolution: nodenext tests
├── deno/ # Deno runtime tests
│ └── esm-basic/ # ESM compatibility tests via npm: specifier
└── cloudflare/ # Cloudflare runtime tests
├── cf-workers-basic/ # Basic Cloudflare Workers tests
├── cf-workers-files/ # Cloudflare Workers file handling tests
└── cf-workers-tool-router-ai/ # Cloudflare Workers AI SDK tool router tests
└── cli/ # CLI runtime tests (scratch)
├── version/ # composio version command tests
├── whoami/ # composio whoami command tests
└── toolkits/ # composio toolkits command tests
├── list/ # composio toolkits list tests
├── info/ # composio toolkits info tests
└── search/ # composio toolkits search tests
Running Tests
All E2E Tests
pnpm test:e2e
Node.js Tests Only
pnpm test:e2e:node
Runs Node.js tests in Docker using bun test. The default Node.js version is determined by mise.toml.
To run with a specific Node.js version:
COMPOSIO_E2E_NODE_VERSION=22.22.3 pnpm test:e2e:node
Deno Tests Only
pnpm test:e2e:deno
Runs Deno tests in Docker using bun test. The default Deno version is determined by mise.toml.
To run with a specific Deno version:
COMPOSIO_E2E_DENO_VERSION=2.6.7 pnpm test:e2e:deno
Cloudflare Workers Tests Only
pnpm test:e2e:cloudflare
CLI Tests Only
pnpm test:e2e:cli
To run with a specific CLI version:
COMPOSIO_E2E_CLI_VERSION=0.1.24 pnpm test:e2e:cli
Adding New Tests
Node.js Runtime Tests
- Create a new directory under
runtimes/node/(e.g.,runtimes/node/my-test) - Add a
package.jsonwith name@e2e-tests/node-my-test - Add
test:e2eandtest:e2e:nodescripts - Create an
e2e.test.tsfile with inline configuration:
import { e2e, type E2ETestResult } from '@e2e-tests/utils';
import { TIMEOUTS } from '@e2e-tests/utils/const';
import { describe, it, expect, beforeAll } from 'bun:test';
e2e(import.meta.url, {
versions: {
node: ['22.22.3', '24.17.0', '25.9.0'], // Optional: defaults to the current version in mise.toml
},
env: { MY_VAR: process.env.MY_VAR }, // Optional: env vars (validated at startup)
defineTests: ({ runtime, runFixture }) => {
let result: E2ETestResult;
beforeAll(async () => {
result = await runFixture({ filename: 'fixtures/test.mjs' });
}, TIMEOUTS.FIXTURE);
describe('output', () => {
it('exits successfully', () => {
expect(result.exitCode).toBe(0);
});
it('contains expected output', () => {
expect(result.stdout).toContain('expected text');
});
});
},
});
- Add fixture files in a
fixtures/directory
Deno Runtime Tests
- Create a new directory under
runtimes/deno/(e.g.,runtimes/deno/my-test) - Add a
package.jsonwith name@e2e-tests/deno-my-test - Add
test:e2eandtest:e2e:denoscripts - Create an
e2e.test.tsfile with inline configuration:
import { e2e, type E2ETestResult } from '@e2e-tests/utils';
import { TIMEOUTS } from '@e2e-tests/utils/const';
import { describe, it, expect, beforeAll } from 'bun:test';
e2e(import.meta.url, {
versions: {
deno: ['2.6.7'], // Optional: defaults to the current version in mise.toml
},
usesFixtures: true,
defineTests: ({ runtime, runFixture }) => {
let result: E2ETestResult;
beforeAll(async () => {
result = await runFixture({ filename: 'test.ts' });
}, TIMEOUTS.FIXTURE);
describe('output', () => {
it('exits successfully', () => {
expect(result.exitCode).toBe(0);
});
it('contains expected output', () => {
expect(result.stdout).toContain('expected text');
});
});
},
});
- Add fixture files in a
fixtures/directory. Fixtures use Deno'snpm:specifier to import packages.
Tests with External Dependencies (npm install)
For tests that need to install npm packages at runtime, use usesFixtures: true and the setup option:
import { e2e, type E2ETestResultWithSetup } from '@e2e-tests/utils';
import { TIMEOUTS } from '@e2e-tests/utils/const';
import { describe, it, expect, beforeAll } from 'bun:test';
e2e(import.meta.url, {
versions: {
node: ['22.22.3', '24.17.0', '25.9.0'],
},
usesFixtures: true, // Sets cwd to fixtures/ directory
env: { MY_API_KEY: process.env.MY_API_KEY },
defineTests: ({ runFixture }) => {
let result: E2ETestResultWithSetup;
beforeAll(async () => {
result = await runFixture({
filename: 'index.mjs',
setup: 'npm install --legacy-peer-deps', // Runs before fixture
});
}, TIMEOUTS.FIXTURE);
describe('setup', () => {
it('npm install completes successfully', () => {
expect(result.setup.exitCode).toBe(0);
});
});
describe('fixture', () => {
it('exits successfully', () => {
expect(result.exitCode).toBe(0);
});
});
},
});
Cloudflare Runtime Tests
- Create a new directory under
runtimes/cloudflare/(e.g.,runtimes/cloudflare/my-test) - Add a
package.jsonwith name@e2e-tests/cf-my-test - Add
test:e2eandtest:e2e:cloudflarescripts - Configure vitest with
@cloudflare/vitest-pool-workers
CLI Runtime Tests
- Create a new directory under
cli/(e.g.,cli/my-test) - Add a
package.jsonwith name@e2e-tests/cli-my-test - Add
test:e2eandtest:e2e:cliscripts - Create an
e2e.test.tsfile with inline configuration:
import { e2e, sanitizeOutput, type E2ETestResult } from '@e2e-tests/utils';
import { TIMEOUTS } from '@e2e-tests/utils/const';
import { describe, it, expect, beforeAll } from 'bun:test';
e2e(import.meta.url, {
versions: {
cli: ['current'],
},
defineTests: ({ runCmd }) => {
let result: E2ETestResult;
beforeAll(async () => {
result = await runCmd('composio version');
}, TIMEOUTS.FIXTURE);
describe('output', () => {
it('exits successfully', () => {
expect(result.exitCode).toBe(0);
});
it('stdout matches snapshot', () => {
expect(sanitizeOutput(result.stdout)).toMatchSnapshot();
});
});
},
});
Debugging
Each test suite generates an ephemereal DEBUG.log file in its directory with structured output:
================================================================================
E2E Test: my-test
Started: 2026-01-30T12:18:42.000Z
Test file: ts/e2e-tests/runtimes/node/my-test/e2e.test.ts
Runtime versions: Node.js 22.22.3, Node.js 24.17.0, Node.js 25.9.0
================================================================================
################################################################################
### Node.js 22.22.3
################################################################################
Image: composio-e2e-node:22.22.3
--- Phase 1/2: setup ---
Container: e2e-my-test-22-22-3-1769775520382-setup
Command: npm install
Duration: 2.55s
Exit Code: 0 (success)
[stdout]
added 3 packages in 2s
[stderr]
(empty)
--- Phase 2/2: fixture ---
Container: e2e-my-test-22-22-3-1769775520382-fixture
Command: node index.mjs
Duration: 0.56s
Exit Code: 0 (success)
[stdout]
Test passed!
[stderr]
(empty)
================================================================================
Summary
================================================================================
Node.js 22.22.3: PASS (2 phases, 3.11s total)
Node.js 24.17.0: PASS (2 phases, 3.09s total)
Node.js 25.9.0: PASS (2 phases, 3.08s total)
Finished: 2026-01-30T12:18:46.500Z
Total duration: 4.50s
================================================================================