From 2145eeda9df9545e899b1ab9a692935479232a34 Mon Sep 17 00:00:00 2001 From: chrarnoldus <12196001+chrarnoldus@users.noreply.github.com> Date: Tue, 21 Jul 2026 13:47:16 +0000 Subject: [PATCH 1/2] chore(web): upgrade Vercel AI SDK to v7 Upgrade ai and affiliated @ai-sdk/* packages to the latest major v7 line. Versions are pinned to the newest releases that satisfy the workspace minimumReleaseAge policy. - ai 6.0.224 -> 7.0.29 - @ai-sdk/anthropic 3.0.96 -> 4.0.15 - @ai-sdk/gateway 3.0.148 -> 4.0.21 - @ai-sdk/mistral 3.0.48 -> 4.0.12 - @ai-sdk/openai 3.0.84 -> 4.0.15 - @ai-sdk/openai-compatible 2.0.59 -> 3.0.11 Apply v7 breaking renames in the bot agent runner: - stepCountIs -> isStepCount - onStepFinish -> onStepEnd --- apps/web/package.json | 12 +-- apps/web/src/lib/bot/agent-runner.ts | 6 +- pnpm-lock.yaml | 141 ++++++++++++++------------- 3 files changed, 82 insertions(+), 77 deletions(-) diff --git a/apps/web/package.json b/apps/web/package.json index 6468e487c3..3d91180c77 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -29,11 +29,11 @@ "promo": "pnpm -s script src/scripts/encrypt-promo-codes.ts" }, "dependencies": { - "@ai-sdk/anthropic": "3.0.96", - "@ai-sdk/gateway": "3.0.148", - "@ai-sdk/mistral": "3.0.48", - "@ai-sdk/openai": "3.0.84", - "@ai-sdk/openai-compatible": "2.0.59", + "@ai-sdk/anthropic": "4.0.15", + "@ai-sdk/gateway": "4.0.21", + "@ai-sdk/mistral": "4.0.12", + "@ai-sdk/openai": "4.0.15", + "@ai-sdk/openai-compatible": "3.0.11", "@anthropic-ai/sdk": "0.104.1", "@apple/app-store-server-library": "3.1.0", "@aws-sdk/client-s3": "3.1009.0", @@ -116,7 +116,7 @@ "@xterm/addon-fit": "0.11.0", "@xterm/addon-web-links": "0.12.0", "@xterm/xterm": "6.0.0", - "ai": "6.0.224", + "ai": "7.0.29", "archiver": "7.0.1", "chat": "4.27.0", "class-variance-authority": "0.7.1", diff --git a/apps/web/src/lib/bot/agent-runner.ts b/apps/web/src/lib/bot/agent-runner.ts index c51b6c0703..30a6f3ecd8 100644 --- a/apps/web/src/lib/bot/agent-runner.ts +++ b/apps/web/src/lib/bot/agent-runner.ts @@ -30,7 +30,7 @@ import { captureException } from '@sentry/nextjs'; import { createOpenAICompatible } from '@ai-sdk/openai-compatible'; import type { PlatformIntegration, User } from '@kilocode/db'; import type { BotRequestStep } from '@kilocode/db/schema'; -import { ToolLoopAgent, generateText, stepCountIs, tool } from 'ai'; +import { ToolLoopAgent, generateText, isStepCount, tool } from 'ai'; import type { StepResult, ToolSet } from 'ai'; import { Actions, Card, CardText, LinkButton, Section } from 'chat'; import type { Author, Message, Thread } from 'chat'; @@ -258,7 +258,7 @@ export async function runBotAgent(params: RunBotAgentParams): Promise { + onStepEnd: step => { collectedSteps.push(serializeStep(step, completedStepCount)); updateBotRequest(params.botRequestId, { steps: [...initialSteps, ...collectedSteps] }); }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b07a84b32..1b6dbb8ae3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -608,20 +608,20 @@ importers: apps/web: dependencies: '@ai-sdk/anthropic': - specifier: 3.0.96 - version: 3.0.96(zod@4.4.3) + specifier: 4.0.15 + version: 4.0.15(zod@4.4.3) '@ai-sdk/gateway': - specifier: 3.0.148 - version: 3.0.148(zod@4.4.3) + specifier: 4.0.21 + version: 4.0.21(zod@4.4.3) '@ai-sdk/mistral': - specifier: 3.0.48 - version: 3.0.48(zod@4.4.3) + specifier: 4.0.12 + version: 4.0.12(zod@4.4.3) '@ai-sdk/openai': - specifier: 3.0.84 - version: 3.0.84(zod@4.4.3) + specifier: 4.0.15 + version: 4.0.15(zod@4.4.3) '@ai-sdk/openai-compatible': - specifier: 2.0.59 - version: 2.0.59(zod@4.4.3) + specifier: 3.0.11 + version: 3.0.11(zod@4.4.3) '@anthropic-ai/sdk': specifier: 0.104.1 version: 0.104.1(zod@4.4.3) @@ -869,8 +869,8 @@ importers: specifier: 6.0.0 version: 6.0.0 ai: - specifier: 6.0.224 - version: 6.0.224(zod@4.4.3) + specifier: 7.0.29 + version: 7.0.29(zod@4.4.3) archiver: specifier: 7.0.1 version: 7.0.1 @@ -927,7 +927,7 @@ importers: version: 10.6.2 headroom-ai: specifier: ^0.22.4 - version: 0.22.4(@ai-sdk/provider@3.0.14)(@anthropic-ai/sdk@0.104.1(zod@4.4.3))(ai@6.0.224(zod@4.4.3))(openai@6.29.0(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.4.3)) + version: 0.22.4(@ai-sdk/provider@4.0.3)(@anthropic-ai/sdk@0.104.1(zod@4.4.3))(ai@7.0.29(zod@4.4.3))(openai@6.29.0(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.4.3)) jotai: specifier: 2.18.1 version: 2.18.1(@babel/core@7.29.0)(@babel/template@7.29.7)(@types/react@19.2.14)(react@19.2.6) @@ -3016,45 +3016,45 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 - '@ai-sdk/anthropic@3.0.96': - resolution: {integrity: sha512-6VQzaXQdm5FkX6NWOyKzV5GB11C8IqkgsKZE91lg/bdwyvnQJLDwal2qkE0+fC8CCGeW5d+VV8Mw/+H+OcDC1A==} - engines: {node: '>=18'} + '@ai-sdk/anthropic@4.0.15': + resolution: {integrity: sha512-6iVlzqZjqqoHTmgO1WU9id/33pYykIRasWJFAMf1+d+nhju6d7566VRFsOGZ2W2GzgNtzKs8DGsYN7X5/wOGuw==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.148': - resolution: {integrity: sha512-C/mTeSdmhu8dAnH3vZaRXffD8Oewo1r4QEGxvCdR8eC9b4PKPs2CLsbg3DVJH/X3Bea5fAu87Ob7P3fSS+oq/g==} - engines: {node: '>=18'} + '@ai-sdk/gateway@4.0.21': + resolution: {integrity: sha512-GafyeyHFDKJjdtbyhCQ0aC2FORdyE56IxK45EZ1JLO1iVdg8XqEU3bwnRzI0+5S1XHV7W2qQsxkZnGYPbsFiXA==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/mistral@3.0.48': - resolution: {integrity: sha512-SOZMjV48dyAn1rsiZSN7emeO0KYKnr9/SqMFPpJYUddPcnLSjac9GGWVKn+LnSzD7Woh3lYbYbJWdbJOQ2U2sQ==} - engines: {node: '>=18'} + '@ai-sdk/mistral@4.0.12': + resolution: {integrity: sha512-5g74RyDnhakURB9SjaEoRG6KDVzvTnxY/eDW3vjXmZm2OzOK24uFwM3Lw1eZb0AyY2LKO+e+HNiT8D89PHLfLA==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai-compatible@2.0.59': - resolution: {integrity: sha512-CFsUizO+jL+jSlN13rW2nQE9EbWx+8PSFBdB3TtD0UGYOxtefCVa5hsrNo5NUOJJGX5f4xHiXE1i2m5nQ80QPg==} - engines: {node: '>=18'} + '@ai-sdk/openai-compatible@3.0.11': + resolution: {integrity: sha512-PKLyt5PfjV2maWJPZpm3W29vCc+BbyqSPAcghXhl+iIxzFNjpGPa6UD/8J0b9l7w/lJCZKuhcef9q+Gp5WqUvw==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@3.0.84': - resolution: {integrity: sha512-cmgbeJL0bbY0yTJH4/AdmP5E7MjWRL9G8UdhIi0JlV/So03o82ORJofW8OzwCZPTORVQblFbpZXYGDcUd9NdUQ==} - engines: {node: '>=18'} + '@ai-sdk/openai@4.0.15': + resolution: {integrity: sha512-JpTLQp5RUbRcs5nOyPEu5NRdxZLUnD/uCyT3qzy26D+iunCeL7KJV58ER9kwisAKnTjWravfNblaQNiWr20M9A==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.38': - resolution: {integrity: sha512-/HHGmtKllqjg1OLc023v9w9kK3laW7Z6TzfZukYQWCsGBbzB9p60zTvvpXFVcs44NZBVXL3viOa1HRKUbeee8g==} - engines: {node: '>=18'} + '@ai-sdk/provider-utils@5.0.10': + resolution: {integrity: sha512-uPyec0+85dwxZYXtb8qe8gCjhjDfxP4LCDo/uRQS/iG+FIgYbHPRhr/ys281udG90bTaE18+5cxWraYaf8oHCw==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider@3.0.14': - resolution: {integrity: sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA==} - engines: {node: '>=18'} + '@ai-sdk/provider@4.0.3': + resolution: {integrity: sha512-e0CpNWJUY7OxAFAnCZkw+ri9QOHWwTs1tXP42782KFGCU07qt8NiXCrCVowyCB5dP2r5/Uls+g2oPd8kOJn9dw==} + engines: {node: '>=22'} '@aklinker1/rollup-plugin-visualizer@5.12.0': resolution: {integrity: sha512-X24LvEGw6UFmy0lpGJDmXsMyBD58XmX1bbwsaMLhNoM+UMQfQ3b2RtC+nz4b/NoRK5r6QJSKJHBNVeUdwqybaQ==} @@ -4421,11 +4421,11 @@ packages: '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} - deprecated: 'Merged into tsx: https://tsx.is' + deprecated: 'Merged into tsx: https://tsx.hirok.io' '@esbuild-kit/esm-loader@2.6.5': resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} - deprecated: 'Merged into tsx: https://tsx.is' + deprecated: 'Merged into tsx: https://tsx.hirok.io' '@esbuild/aix-ppc64@0.27.4': resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} @@ -9857,6 +9857,9 @@ packages: '@webext-core/match-patterns@1.0.3': resolution: {integrity: sha512-NY39ACqCxdKBmHgw361M9pfJma8e4AZo20w9AY+5ZjIj1W2dvXC8J31G5fjfOGbulW9w4WKpT8fPooi0mLkn9A==} + '@workflow/serde@4.1.0': + resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} + '@workflow/serde@4.1.0-beta.2': resolution: {integrity: sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww==} @@ -9985,9 +9988,9 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ai@6.0.224: - resolution: {integrity: sha512-plo+hHwMANM+P6FjX8RN6W8c8so5NVZGwvDGCWGWwIbvI5tc0ZV1zhr9v/Kq78zyxKZWE50YCSYbqGiPFEhGww==} - engines: {node: '>=18'} + ai@7.0.29: + resolution: {integrity: sha512-q+A+skhl6SyjWliU6W7zNYgDUrEk5SbNrCc5vt4S9n6+n6e7jSorDmu51hlhjDOsS7VwzWGCgbWFvvT3iomtvg==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -17965,45 +17968,46 @@ snapshots: dependencies: zod: 4.4.3 - '@ai-sdk/anthropic@3.0.96(zod@4.4.3)': + '@ai-sdk/anthropic@4.0.15(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.14 - '@ai-sdk/provider-utils': 4.0.38(zod@4.4.3) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.10(zod@4.4.3) zod: 4.4.3 - '@ai-sdk/gateway@3.0.148(zod@4.4.3)': + '@ai-sdk/gateway@4.0.21(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.14 - '@ai-sdk/provider-utils': 4.0.38(zod@4.4.3) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.10(zod@4.4.3) '@vercel/oidc': 3.2.0 zod: 4.4.3 - '@ai-sdk/mistral@3.0.48(zod@4.4.3)': + '@ai-sdk/mistral@4.0.12(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.14 - '@ai-sdk/provider-utils': 4.0.38(zod@4.4.3) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.10(zod@4.4.3) zod: 4.4.3 - '@ai-sdk/openai-compatible@2.0.59(zod@4.4.3)': + '@ai-sdk/openai-compatible@3.0.11(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.14 - '@ai-sdk/provider-utils': 4.0.38(zod@4.4.3) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.10(zod@4.4.3) zod: 4.4.3 - '@ai-sdk/openai@3.0.84(zod@4.4.3)': + '@ai-sdk/openai@4.0.15(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.14 - '@ai-sdk/provider-utils': 4.0.38(zod@4.4.3) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.10(zod@4.4.3) zod: 4.4.3 - '@ai-sdk/provider-utils@4.0.38(zod@4.4.3)': + '@ai-sdk/provider-utils@5.0.10(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 3.0.14 + '@ai-sdk/provider': 4.0.3 '@standard-schema/spec': 1.1.0 + '@workflow/serde': 4.1.0 eventsource-parser: 3.0.8 zod: 4.4.3 - '@ai-sdk/provider@3.0.14': + '@ai-sdk/provider@4.0.3': dependencies: json-schema: 0.4.0 @@ -19701,7 +19705,7 @@ snapshots: cjs-module-lexer: 1.2.3 esbuild: 0.27.4 miniflare: 4.20260603.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - vitest: 4.1.6(@opentelemetry/api@1.9.1)(@types/node@25.5.2)(@vitest/coverage-v8@4.1.6)(@vitest/ui@4.1.6)(esbuild@0.27.4)(jiti@2.7.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.4) + vitest: 4.1.6(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.6)(@vitest/ui@4.1.6)(esbuild@0.27.4)(jiti@2.7.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.4) wrangler: 4.98.0(@cloudflare/workers-types@4.20260605.1)(bufferutil@4.1.0)(utf-8-validate@6.0.6) zod: 3.25.76 transitivePeerDependencies: @@ -26166,7 +26170,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.6(@opentelemetry/api@1.9.1)(@types/node@25.5.2)(@vitest/coverage-v8@4.1.6)(@vitest/ui@4.1.6)(esbuild@0.27.4)(jiti@2.7.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.4) + vitest: 4.1.6(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.6)(@vitest/ui@4.1.6)(esbuild@0.27.4)(jiti@2.7.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.4) '@vitest/expect@3.2.4': dependencies: @@ -26244,7 +26248,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vitest: 4.1.6(@opentelemetry/api@1.9.1)(@types/node@25.5.2)(@vitest/coverage-v8@4.1.6)(@vitest/ui@4.1.6)(esbuild@0.27.4)(jiti@2.7.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.4) + vitest: 4.1.6(@opentelemetry/api@1.9.1)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.6)(@vitest/ui@4.1.6)(esbuild@0.27.4)(jiti@2.7.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.4) '@vitest/utils@3.2.4': dependencies: @@ -26389,6 +26393,8 @@ snapshots: '@webext-core/match-patterns@1.0.3': {} + '@workflow/serde@4.1.0': {} + '@workflow/serde@4.1.0-beta.2': {} '@workos-inc/node@8.13.0': @@ -26536,12 +26542,11 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ai@6.0.224(zod@4.4.3): + ai@7.0.29(zod@4.4.3): dependencies: - '@ai-sdk/gateway': 3.0.148(zod@4.4.3) - '@ai-sdk/provider': 3.0.14 - '@ai-sdk/provider-utils': 4.0.38(zod@4.4.3) - '@opentelemetry/api': 1.9.1 + '@ai-sdk/gateway': 4.0.21(zod@4.4.3) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.10(zod@4.4.3) zod: 4.4.3 ajv-formats@2.1.1: @@ -29704,11 +29709,11 @@ snapshots: he@1.2.0: {} - headroom-ai@0.22.4(@ai-sdk/provider@3.0.14)(@anthropic-ai/sdk@0.104.1(zod@4.4.3))(ai@6.0.224(zod@4.4.3))(openai@6.29.0(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.4.3)): + headroom-ai@0.22.4(@ai-sdk/provider@4.0.3)(@anthropic-ai/sdk@0.104.1(zod@4.4.3))(ai@7.0.29(zod@4.4.3))(openai@6.29.0(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.4.3)): optionalDependencies: - '@ai-sdk/provider': 3.0.14 + '@ai-sdk/provider': 4.0.3 '@anthropic-ai/sdk': 0.104.1(zod@4.4.3) - ai: 6.0.224(zod@4.4.3) + ai: 7.0.29(zod@4.4.3) openai: 6.29.0(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.4.3) hermes-compiler@0.14.1: {} From b7ba0d50f87f04718985518ffcb8a06bef442240 Mon Sep 17 00:00:00 2001 From: chrarnoldus <12196001+chrarnoldus@users.noreply.github.com> Date: Tue, 21 Jul 2026 14:11:55 +0000 Subject: [PATCH 2/2] test(web): transform ESM-only AI SDK packages in Jest AI SDK v7 is ESM-only (no CJS build), so Jest must transform the `ai` package and its ESM dependency closure instead of loading them as CommonJS. Add them to the transformIgnorePatterns exception list: - ai - @ai-sdk/* (gateway, provider, provider-utils, openai, anthropic, ...) - @standard-schema/spec - @workflow/serde - eventsource-parser Fixes 'Cannot use import statement outside a module' failures in web test suites that transitively import the AI SDK. --- apps/web/jest.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/jest.config.ts b/apps/web/jest.config.ts index ecdac91d98..34bd87f9e0 100644 --- a/apps/web/jest.config.ts +++ b/apps/web/jest.config.ts @@ -52,7 +52,7 @@ const config: Config = { ], modulePathIgnorePatterns: ['/../../.worktrees/'], transformIgnorePatterns: [ - 'node_modules/.pnpm/(?!(@octokit|universal-user-agent|universal-github-app-jwt|before-after-hook|bottleneck|p-limit|yocto-queue))', + 'node_modules/.pnpm/(?!(@octokit|universal-user-agent|universal-github-app-jwt|before-after-hook|bottleneck|p-limit|yocto-queue|ai@|@ai-sdk|@standard-schema|@workflow|eventsource-parser))', ], // Parallel execution configuration