diff --git a/.changeset/bump-cloudflare-agents-support.md b/.changeset/bump-cloudflare-agents-support.md new file mode 100644 index 000000000..68d2b5d88 --- /dev/null +++ b/.changeset/bump-cloudflare-agents-support.md @@ -0,0 +1,5 @@ +--- +"braintrust": minor +--- + +feat: Bump support for cloudflare agents diff --git a/e2e/config/pr-comment-scenarios.json b/e2e/config/pr-comment-scenarios.json index a99bac9db..551f9a597 100644 --- a/e2e/config/pr-comment-scenarios.json +++ b/e2e/config/pr-comment-scenarios.json @@ -69,6 +69,14 @@ { "variantKey": "cloudflare-agents-v0-32-latest", "label": "v0.32 latest" + }, + { + "variantKey": "cloudflare-agents-v0-33", + "label": "v0.33 pinned" + }, + { + "variantKey": "cloudflare-agents-v0-33-latest", + "label": "v0.33 latest" } ] }, diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-auto.span-tree.json b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-auto.span-tree.json new file mode 100644 index 000000000..606ae1c69 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-auto.span-tree.json @@ -0,0 +1,68 @@ +{ + "span_tree": [ + { + "name": "cloudflare-agents-e2e-root", + "type": "task", + "children": [ + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-a", + "delayMs": 0, + "value": "allowed-a" + }, + "output": { + "case": "concurrent-a", + "echoed": "allowed-a" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-b", + "delayMs": 0, + "value": "allowed-b" + }, + "output": { + "case": "concurrent-b", + "echoed": "allowed-b" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "error", + "delayMs": 0, + "value": "allowed-error" + }, + "error": "deterministic child failure" + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + }, + "output": { + "case": "success", + "echoed": "allowed-success" + } + } + ], + "metadata": { + "instrumentationMode": "auto", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + } + ] +} diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-auto.span-tree.txt b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-auto.span-tree.txt new file mode 100644 index 000000000..bdf5b6ed0 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-auto.span-tree.txt @@ -0,0 +1,44 @@ +span_tree: +└── cloudflare-agents-e2e-root [task] + metadata: { + "instrumentationMode": "auto", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-a", + │ "delayMs": 0, + │ "value": "allowed-a" + │ } + │ output: { + │ "case": "concurrent-a", + │ "echoed": "allowed-a" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-b", + │ "delayMs": 0, + │ "value": "allowed-b" + │ } + │ output: { + │ "case": "concurrent-b", + │ "echoed": "allowed-b" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "error", + │ "delayMs": 0, + │ "value": "allowed-error" + │ } + │ error: "deterministic child failure" + └── DeterministicToolAgent [tool] + input: { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + } + output: { + "case": "success", + "echoed": "allowed-success" + } diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-latest-auto.span-tree.json b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-latest-auto.span-tree.json new file mode 100644 index 000000000..606ae1c69 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-latest-auto.span-tree.json @@ -0,0 +1,68 @@ +{ + "span_tree": [ + { + "name": "cloudflare-agents-e2e-root", + "type": "task", + "children": [ + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-a", + "delayMs": 0, + "value": "allowed-a" + }, + "output": { + "case": "concurrent-a", + "echoed": "allowed-a" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-b", + "delayMs": 0, + "value": "allowed-b" + }, + "output": { + "case": "concurrent-b", + "echoed": "allowed-b" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "error", + "delayMs": 0, + "value": "allowed-error" + }, + "error": "deterministic child failure" + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + }, + "output": { + "case": "success", + "echoed": "allowed-success" + } + } + ], + "metadata": { + "instrumentationMode": "auto", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + } + ] +} diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-latest-auto.span-tree.txt b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-latest-auto.span-tree.txt new file mode 100644 index 000000000..bdf5b6ed0 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-latest-auto.span-tree.txt @@ -0,0 +1,44 @@ +span_tree: +└── cloudflare-agents-e2e-root [task] + metadata: { + "instrumentationMode": "auto", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-a", + │ "delayMs": 0, + │ "value": "allowed-a" + │ } + │ output: { + │ "case": "concurrent-a", + │ "echoed": "allowed-a" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-b", + │ "delayMs": 0, + │ "value": "allowed-b" + │ } + │ output: { + │ "case": "concurrent-b", + │ "echoed": "allowed-b" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "error", + │ "delayMs": 0, + │ "value": "allowed-error" + │ } + │ error: "deterministic child failure" + └── DeterministicToolAgent [tool] + input: { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + } + output: { + "case": "success", + "echoed": "allowed-success" + } diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-latest-wrapped.span-tree.json b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-latest-wrapped.span-tree.json new file mode 100644 index 000000000..d3467fca3 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-latest-wrapped.span-tree.json @@ -0,0 +1,68 @@ +{ + "span_tree": [ + { + "name": "cloudflare-agents-e2e-root", + "type": "task", + "children": [ + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-a", + "delayMs": 0, + "value": "allowed-a" + }, + "output": { + "case": "concurrent-a", + "echoed": "allowed-a" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-b", + "delayMs": 0, + "value": "allowed-b" + }, + "output": { + "case": "concurrent-b", + "echoed": "allowed-b" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "error", + "delayMs": 0, + "value": "allowed-error" + }, + "error": "deterministic child failure" + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + }, + "output": { + "case": "success", + "echoed": "allowed-success" + } + } + ], + "metadata": { + "instrumentationMode": "wrapped", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + } + ] +} diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-latest-wrapped.span-tree.txt b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-latest-wrapped.span-tree.txt new file mode 100644 index 000000000..53d7a1240 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-latest-wrapped.span-tree.txt @@ -0,0 +1,44 @@ +span_tree: +└── cloudflare-agents-e2e-root [task] + metadata: { + "instrumentationMode": "wrapped", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-a", + │ "delayMs": 0, + │ "value": "allowed-a" + │ } + │ output: { + │ "case": "concurrent-a", + │ "echoed": "allowed-a" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-b", + │ "delayMs": 0, + │ "value": "allowed-b" + │ } + │ output: { + │ "case": "concurrent-b", + │ "echoed": "allowed-b" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "error", + │ "delayMs": 0, + │ "value": "allowed-error" + │ } + │ error: "deterministic child failure" + └── DeterministicToolAgent [tool] + input: { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + } + output: { + "case": "success", + "echoed": "allowed-success" + } diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-wrapped.span-tree.json b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-wrapped.span-tree.json new file mode 100644 index 000000000..d3467fca3 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-wrapped.span-tree.json @@ -0,0 +1,68 @@ +{ + "span_tree": [ + { + "name": "cloudflare-agents-e2e-root", + "type": "task", + "children": [ + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-a", + "delayMs": 0, + "value": "allowed-a" + }, + "output": { + "case": "concurrent-a", + "echoed": "allowed-a" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "concurrent-b", + "delayMs": 0, + "value": "allowed-b" + }, + "output": { + "case": "concurrent-b", + "echoed": "allowed-b" + } + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "error", + "delayMs": 0, + "value": "allowed-error" + }, + "error": "deterministic child failure" + }, + { + "name": "DeterministicToolAgent", + "type": "tool", + "children": [], + "input": { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + }, + "output": { + "case": "success", + "echoed": "allowed-success" + } + } + ], + "metadata": { + "instrumentationMode": "wrapped", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + } + ] +} diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-wrapped.span-tree.txt b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-wrapped.span-tree.txt new file mode 100644 index 000000000..53d7a1240 --- /dev/null +++ b/e2e/scenarios/cloudflare-agents-instrumentation/__snapshots__/cloudflare-agents-v0-33-wrapped.span-tree.txt @@ -0,0 +1,44 @@ +span_tree: +└── cloudflare-agents-e2e-root [task] + metadata: { + "instrumentationMode": "wrapped", + "scenario": "cloudflare-agents-instrumentation", + "testRunId": "" + } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-a", + │ "delayMs": 0, + │ "value": "allowed-a" + │ } + │ output: { + │ "case": "concurrent-a", + │ "echoed": "allowed-a" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "concurrent-b", + │ "delayMs": 0, + │ "value": "allowed-b" + │ } + │ output: { + │ "case": "concurrent-b", + │ "echoed": "allowed-b" + │ } + ├── DeterministicToolAgent [tool] + │ input: { + │ "case": "error", + │ "delayMs": 0, + │ "value": "allowed-error" + │ } + │ error: "deterministic child failure" + └── DeterministicToolAgent [tool] + input: { + "case": "success", + "delayMs": 0, + "value": "allowed-success" + } + output: { + "case": "success", + "echoed": "allowed-success" + } diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/package.json b/e2e/scenarios/cloudflare-agents-instrumentation/package.json index d059fcb8e..953709ada 100644 --- a/e2e/scenarios/cloudflare-agents-instrumentation/package.json +++ b/e2e/scenarios/cloudflare-agents-instrumentation/package.json @@ -12,6 +12,10 @@ "agents-v0-32-latest": { "package": "agents", "range": ">=0.32.0 <0.33.0" + }, + "agents-v0-33-latest": { + "package": "agents", + "range": ">=0.33.0 <0.34.0" } } } @@ -23,6 +27,8 @@ "agents-v0-17-latest": "npm:agents@0.17.4", "agents-v0-32": "npm:agents@0.32.0", "agents-v0-32-latest": "npm:agents@0.32.0", + "agents-v0-33": "npm:agents@0.33.0", + "agents-v0-33-latest": "npm:agents@0.33.0", "ai": "6.0.82", "dc-browser": "1.0.4", "react": "19.2.3", diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/pnpm-lock.yaml b/e2e/scenarios/cloudflare-agents-instrumentation/pnpm-lock.yaml index 372664ede..af4441b4a 100644 --- a/e2e/scenarios/cloudflare-agents-instrumentation/pnpm-lock.yaml +++ b/e2e/scenarios/cloudflare-agents-instrumentation/pnpm-lock.yaml @@ -44,6 +44,12 @@ importers: agents-v0-32-latest: specifier: npm:agents@0.32.0 version: agents@0.32.0(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@modelcontextprotocol/client@2.4.0)(@modelcontextprotocol/sdk@1.31.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(ai@6.0.82(zod@4.3.6))(react@19.2.3)(rolldown@1.2.0)(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0))(zod@4.3.6) + agents-v0-33: + specifier: npm:agents@0.33.0 + version: agents@0.33.0(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@modelcontextprotocol/client@2.4.0)(@modelcontextprotocol/sdk@1.31.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(ai@6.0.82(zod@4.3.6))(react@19.2.3)(rolldown@1.2.0)(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0))(zod@4.3.6) + agents-v0-33-latest: + specifier: npm:agents@0.33.0 + version: agents@0.33.0(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@modelcontextprotocol/client@2.4.0)(@modelcontextprotocol/sdk@1.31.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(ai@6.0.82(zod@4.3.6))(react@19.2.3)(rolldown@1.2.0)(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0))(zod@4.3.6) ai: specifier: 6.0.82 version: 6.0.82(zod@4.3.6) @@ -1234,6 +1240,71 @@ packages: vite: optional: true + agents@0.33.0: + resolution: {integrity: sha512-P6z56NXpYRXHuC1qkMakZBGpZo5btD5478X2AiEplPsTb4DPkYnkMfPt6H3Pv6vRR5mVKIgbvFzpdu24x9wiAA==} + hasBin: true + peerDependencies: + '@ai-sdk/provider': ^4.0.0 + '@ai-sdk/react': ^3.0.0 || ^4.0.0 + '@cloudflare/codemode': '>=0.5.0' + '@earendil-works/chord': ~1.5.0 + '@earendil-works/pi-ai': ~1.5.0 + '@earendil-works/pi-durable': ~1.5.0 + '@earendil-works/pi-schema': ~1.5.0 + '@modelcontextprotocol/client': 2.4.0 + '@modelcontextprotocol/sdk': 1.32.2 + '@modelcontextprotocol/server': 2.4.0 + '@opencode/plugin': ^2.0.24 + '@opencode/sdk': ^2.0.24 + '@tanstack/ai': '>=0.10.2 <2.0.0' + '@x402/core': ^2.0.0 + '@x402/evm': ^2.0.0 + ai: ^6.0.0 || ^7.0.0 + chat: ^4.29.0 + just-bash: ^3.0.0 + react: ^19.0.0 + vite: '>=6.0.0 <9.0.0' + zod: ^4.0.0 + peerDependenciesMeta: + '@ai-sdk/provider': + optional: true + '@ai-sdk/react': + optional: true + '@cloudflare/codemode': + optional: true + '@earendil-works/chord': + optional: true + '@earendil-works/pi-ai': + optional: true + '@earendil-works/pi-durable': + optional: true + '@earendil-works/pi-schema': + optional: true + '@modelcontextprotocol/sdk': + optional: true + '@modelcontextprotocol/server': + optional: true + '@opencode/plugin': + optional: true + '@opencode/sdk': + optional: true + '@tanstack/ai': + optional: true + '@x402/core': + optional: true + '@x402/evm': + optional: true + ai: + optional: true + chat: + optional: true + just-bash: + optional: true + react: + optional: true + vite: + optional: true + ai@6.0.82: resolution: {integrity: sha512-WLml1ab2IXtREgkxrq2Pl6lFO6NKgC17MqTzmK5mO1UO6tMAJiVjkednw9p0j4+/LaUIZQoRiIT8wA37LswZ9Q==} engines: {node: '>=18'} @@ -2852,6 +2923,32 @@ snapshots: - '@babel/runtime' - rolldown + agents@0.33.0(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@modelcontextprotocol/client@2.4.0)(@modelcontextprotocol/sdk@1.31.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(ai@6.0.82(zod@4.3.6))(react@19.2.3)(rolldown@1.2.0)(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0))(zod@4.3.6): + dependencies: + '@babel/plugin-proposal-decorators': 8.0.2(@babel/core@8.0.1) + '@cfworker/json-schema': 4.1.1 + '@modelcontextprotocol/client': 2.4.0 + '@opentelemetry/api': 1.9.0 + '@rolldown/plugin-babel': 0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.7)(rolldown@1.2.0)(vite@6.4.3(lightningcss@1.33.0)(yaml@2.9.0)) + capnweb: 0.12.0 + cron-schedule: 6.0.0 + mimetext: 3.0.28 + nanoid: 5.1.16 + partysocket: 1.3.0(react@19.2.3) + postal-mime: 2.7.6 + yaml: 2.9.0 + zod: 4.3.6 + optionalDependencies: + '@modelcontextprotocol/sdk': 1.31.0(@cfworker/json-schema@4.1.1)(zod@4.3.6) + ai: 6.0.82(zod@4.3.6) + react: 19.2.3 + vite: 6.4.3(lightningcss@1.33.0)(yaml@2.9.0) + transitivePeerDependencies: + - '@babel/core' + - '@babel/plugin-transform-runtime' + - '@babel/runtime' + - rolldown + ai@6.0.82(zod@4.3.6): dependencies: '@ai-sdk/gateway': 3.0.42(zod@4.3.6) diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/scenario.test.ts b/e2e/scenarios/cloudflare-agents-instrumentation/scenario.test.ts index 6af491402..3b5dbd874 100644 --- a/e2e/scenarios/cloudflare-agents-instrumentation/scenario.test.ts +++ b/e2e/scenarios/cloudflare-agents-instrumentation/scenario.test.ts @@ -33,6 +33,16 @@ const scenarios = await Promise.all( label: "v0.32 latest", variantKey: "cloudflare-agents-v0-32-latest", }, + { + dependencyName: "agents-v0-33", + label: "v0.33 pinned", + variantKey: "cloudflare-agents-v0-33", + }, + { + dependencyName: "agents-v0-33-latest", + label: "v0.33 latest", + variantKey: "cloudflare-agents-v0-33-latest", + }, ].map(async (scenario) => ({ ...scenario, version: await readInstalledPackageVersion( diff --git a/e2e/scenarios/cloudflare-agents-instrumentation/vite.config.ts b/e2e/scenarios/cloudflare-agents-instrumentation/vite.config.ts index d7f91872a..c64a0c05e 100644 --- a/e2e/scenarios/cloudflare-agents-instrumentation/vite.config.ts +++ b/e2e/scenarios/cloudflare-agents-instrumentation/vite.config.ts @@ -3,7 +3,7 @@ import { defineConfig } from "vite"; import { braintrustVitePlugin } from "braintrust/vite"; const agentsPackageName = - process.env.CLOUDFLARE_AGENTS_PACKAGE_NAME ?? "agents-v0-32-latest"; + process.env.CLOUDFLARE_AGENTS_PACKAGE_NAME ?? "agents-v0-33-latest"; const instrumentationMode = process.env.CLOUDFLARE_AGENTS_INSTRUMENTATION_MODE ?? "auto"; const braintrustPlugins = diff --git a/js/src/auto-instrumentations/configs/cloudflare-agents.ts b/js/src/auto-instrumentations/configs/cloudflare-agents.ts index 10b2ec0cb..856d8927b 100644 --- a/js/src/auto-instrumentations/configs/cloudflare-agents.ts +++ b/js/src/auto-instrumentations/configs/cloudflare-agents.ts @@ -20,7 +20,7 @@ export const cloudflareAgentsConfigs: InstrumentationConfig[] = [ channelName: cloudflareAgentsChannels.runAgentTool.channelName, module: { name: "agents", - versionRange: ">=0.32.0 <0.33.0", + versionRange: ">=0.32.0 <0.34.0", // Agent moved from the entrypoint into a hashed shared chunk in 0.32. filePath: "dist/src-*.js", },