From 813005ab9c1654455f371a7ca2689fcb71e2d71f Mon Sep 17 00:00:00 2001 From: abearxiong Date: Wed, 11 Mar 2026 13:49:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0cnb=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E5=AF=B9=E8=AF=9D=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=8F=90=E9=97=AE=E5=92=8C=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent/app.ts | 13 ++- agent/routes/chat/chat.ts | 36 ++++++++ agent/routes/index.ts | 1 + package.json | 17 ++-- pnpm-lock.yaml | 188 +++++++++++++++++++++++++++++++------- 5 files changed, 214 insertions(+), 41 deletions(-) create mode 100644 agent/routes/chat/chat.ts diff --git a/agent/app.ts b/agent/app.ts index 252eb99..16181c9 100644 --- a/agent/app.ts +++ b/agent/app.ts @@ -3,6 +3,9 @@ import { useContextKey } from '@kevisual/context' import { useKey } from '@kevisual/use-config' import { CNB } from '../src/index.ts'; import { CNBManager } from './modules/cnb-manager.ts' +import { createOpenAICompatible } from '@ai-sdk/openai-compatible'; + + export const cnbManager = new CNBManager() // CNB_TOKEN是降级兼容变量,推荐使用CNB_API_KEY @@ -28,7 +31,13 @@ export const app = await useContextKey('app', () => { export const notCNBCheck = (ctx: any) => { const isCNB = useKey('CNB'); if (!isCNB) { - ctx.throw(400, '当前环境非 cnb-board 环境,无法获取 live 内容'); + ctx.throw(400, '当前环境非 cnb-board 环境,无法获取内容'); } return false; -} \ No newline at end of file +} +const repo = useKey('CNB_REPO_SLUG_LOWERCASE') as string || 'kevision/kevision'; +export const cnbAi = createOpenAICompatible({ + baseURL: `https://api.cnb.cool/${repo}/-/ai/`, + name: 'custom-cnb', + apiKey: token, +}); \ No newline at end of file diff --git a/agent/routes/chat/chat.ts b/agent/routes/chat/chat.ts new file mode 100644 index 0000000..ef3fdae --- /dev/null +++ b/agent/routes/chat/chat.ts @@ -0,0 +1,36 @@ +import { runAgent } from '@kevisual/ai/agent' +import { app, notCNBCheck, cnbAi } from '../../app.ts'; +import z from 'zod'; + +app.route({ + path: 'cnb', + key: 'chat', + description: 'cnb智能对话接口', + middleware: ['auth'], + metadata: { + args: { + question: z.string().describe('用户输入的问题'), + messages: z.array(z.object({ + role: z.enum(['user', 'assistant']).describe('消息角色,user表示用户输入,assistant表示助手回复'), + content: z.string().describe('消息内容') + })).describe('对话消息列表,按照时间顺序排列,包含用户和助手的历史消息') + } + } +}).define(async (ctx) => { + // notCNBCheck(ctx); + if (!ctx.args.question && !ctx.args.messages) { + ctx.throw(400, '缺少必要参数,必须提供question或messages'); + return; + } + const messages = ctx.args.messages || [{ + role: 'user', + content: ctx.args.question + }] + const result = await runAgent({ + app, + messages: messages, + languageModel: cnbAi('auto'), + token: ctx.query?.token as string, + }); + ctx.body = result; +}).addTo(app); \ No newline at end of file diff --git a/agent/routes/index.ts b/agent/routes/index.ts index ae024d8..ee400b1 100644 --- a/agent/routes/index.ts +++ b/agent/routes/index.ts @@ -10,6 +10,7 @@ import './cnb-board/index.ts'; import './share/index.ts'; import './cnb-manager/index.ts'; import './build/index.ts'; +import './chat/chat.ts'; /** * 验证上下文中的 App ID 是否与指定的 App ID 匹配 diff --git a/package.json b/package.json index d26609d..fcb66e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/cnb", - "version": "0.0.42", + "version": "0.0.41", "description": "", "main": "index.js", "basename": "/root/cnb", @@ -16,7 +16,8 @@ }, "keywords": [], "bin": { - "cnb": "./bin/index.js" + "cnb": "./bin/index.js", + "cloud": "./bin/index.js" }, "files": [ "dist", @@ -25,20 +26,22 @@ ], "author": "abearxiong (https://www.xiongxiao.me)", "license": "MIT", - "packageManager": "pnpm@10.31.0", + "packageManager": "pnpm@10.32.1", "type": "module", "devDependencies": { - "@kevisual/ai": "^0.0.26", + "@ai-sdk/openai-compatible": "^2.0.35", + "@kevisual/ai": "^0.0.27", "@kevisual/api": "^0.0.62", "@kevisual/code-builder": "^0.0.6", "@kevisual/context": "^0.0.8", "@kevisual/dts": "^0.0.4", "@kevisual/remote-app": "^0.0.6", "@kevisual/types": "^0.0.12", - "@opencode-ai/plugin": "^1.2.23", + "@opencode-ai/plugin": "^1.2.24", "@types/bun": "^1.3.10", - "@types/node": "^25.3.5", + "@types/node": "^25.4.0", "@types/ws": "^8.18.1", + "ai": "^6.0.116", "commander": "^14.0.3", "dayjs": "^1.11.19", "dotenv": "^17.3.1" @@ -51,7 +54,7 @@ }, "dependencies": { "@kevisual/query": "^0.0.53", - "@kevisual/router": "^0.0.90", + "@kevisual/router": "^0.1.1", "@kevisual/use-config": "^1.0.30", "es-toolkit": "^1.45.1", "nanoid": "^5.1.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 298ddc9..637c64a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: ^0.0.53 version: 0.0.53 '@kevisual/router': - specifier: ^0.0.90 - version: 0.0.90 + specifier: ^0.1.1 + version: 0.1.1 '@kevisual/use-config': specifier: ^1.0.30 version: 1.0.30(dotenv@17.3.1) @@ -36,9 +36,12 @@ importers: specifier: ^4.3.6 version: 4.3.6 devDependencies: + '@ai-sdk/openai-compatible': + specifier: ^2.0.35 + version: 2.0.35(zod@4.3.6) '@kevisual/ai': - specifier: ^0.0.26 - version: 0.0.26 + specifier: ^0.0.27 + version: 0.0.27 '@kevisual/api': specifier: ^0.0.62 version: 0.0.62(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -58,17 +61,20 @@ importers: specifier: ^0.0.12 version: 0.0.12 '@opencode-ai/plugin': - specifier: ^1.2.23 - version: 1.2.23 + specifier: ^1.2.24 + version: 1.2.24 '@types/bun': specifier: ^1.3.10 version: 1.3.10 '@types/node': - specifier: ^25.3.5 - version: 25.3.5 + specifier: ^25.4.0 + version: 25.4.0 '@types/ws': specifier: ^8.18.1 version: 8.18.1 + ai: + specifier: ^6.0.116 + version: 6.0.116(zod@4.3.6) commander: specifier: ^14.0.3 version: 14.0.3 @@ -81,6 +87,40 @@ importers: packages: + '@ai-sdk/anthropic@3.0.58': + resolution: {integrity: sha512-/53SACgmVukO4bkms4dpxpRlYhW8Ct6QZRe6sj1Pi5H00hYhxIrqfiLbZBGxkdRvjsBQeP/4TVGsXgH5rQeb8Q==} + engines: {node: '>=18'} + peerDependencies: + zod: ^4.3.6 + + '@ai-sdk/gateway@3.0.66': + resolution: {integrity: sha512-SIQ0YY0iMuv+07HLsZ+bB990zUJ6S4ujORAh+Jv1V2KGNn73qQKnGO0JBk+w+Res8YqOFSycwDoWcFlQrVxS4A==} + engines: {node: '>=18'} + peerDependencies: + zod: ^4.3.6 + + '@ai-sdk/openai-compatible@2.0.35': + resolution: {integrity: sha512-g3wA57IAQFb+3j4YuFndgkUdXyRETZVvbfAWM+UX7bZSxA3xjes0v3XKgIdKdekPtDGsh4ZX2byHD0gJIMPfiA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^4.3.6 + + '@ai-sdk/openai@3.0.41': + resolution: {integrity: sha512-IZ42A+FO+vuEQCVNqlnAPYQnnUpUfdJIwn1BEDOBywiEHa23fw7PahxVtlX9zm3/zMvTW4JKPzWyvAgDu+SQ2A==} + engines: {node: '>=18'} + peerDependencies: + zod: ^4.3.6 + + '@ai-sdk/provider-utils@4.0.19': + resolution: {integrity: sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^4.3.6 + + '@ai-sdk/provider@3.0.8': + resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} + engines: {node: '>=18'} + '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} @@ -92,8 +132,8 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@kevisual/ai@0.0.26': - resolution: {integrity: sha512-lhaMpxi+vgqPdyBKiuNbSil4hy13tNLbDiqCtG0qUXKtvoowK6xMx269pSSYkYBivczM8g8I0XEouuJceUpJPg==} + '@kevisual/ai@0.0.27': + resolution: {integrity: sha512-1FlDg3Tj4171XY5NpTq+do69CyACgDE5oTA1RJYxQlGgaPeAjx2V2ahBgIDHRRhMSX/ztB1pBF1rx4zDoXq99A==} '@kevisual/api@0.0.62': resolution: {integrity: sha512-GB8Ho2absXoXoZP2GKyuoRqRqjdwtV0JR512DXBaKJR2sIPn1KvuglbBiX+zPjDBBskv/ApvZKOoSwj1OmkrKQ==} @@ -112,6 +152,9 @@ packages: '@kevisual/js-filter@0.0.5': resolution: {integrity: sha512-+S+Sf3K/aP6XtZI2s7TgKOr35UuvUvtpJ9YDW30a+mY0/N8gRuzyKhieBzQN7Ykayzz70uoMavBXut2rUlLgzw==} + '@kevisual/js-filter@0.0.6': + resolution: {integrity: sha512-FcbOsmS1inhwrfgXMM/XLFTGTHUxBCss32JEMYdEFWQDYCar5rN8cxD1W8FuKDTVRlpA+zBpQ/BE6XT4UaeljA==} + '@kevisual/load@0.0.6': resolution: {integrity: sha512-+3YTFehRcZ1haGel5DKYMUwmi5i6f2psyaPZlfkKU/cOXgkpwoG9/BEqPCnPjicKqqnksEpixVRkyHJ+5bjLVA==} @@ -121,17 +164,14 @@ packages: '@kevisual/permission@0.0.4': resolution: {integrity: sha512-zwBYPnT/z21W4q2wkklJrxvoYBYWG/+a3iXFDKqXQAnDOcxm/SU1f1N6FQb9KxGKl36/fclVlhxlxqszvKCenQ==} - '@kevisual/query@0.0.52': - resolution: {integrity: sha512-m1UbyDTIxtfAQXM+EqhXA4ytE2V8rV8mXTZVBwzfW9O6+gtvAcRY7K1YYxfewTSXLVh9nwvfHe0KQ8MDL5ukyw==} - '@kevisual/query@0.0.53': resolution: {integrity: sha512-PAhpCLBr0emz0lGNlTVHMbJiC5wrtGLbInPddRzgKE35fiyNt+SWSsUWABiD0DeNrLN/OxWyAFobt880Z/e5MQ==} '@kevisual/remote-app@0.0.6': resolution: {integrity: sha512-yc3BKAhtY+SzrvQSebeyR/QR93nPctndNMnW6ne1YPK+Kfpuf8gi7W4zlg18EJh7FEpDuDVHKqVp1klsWjESqQ==} - '@kevisual/router@0.0.90': - resolution: {integrity: sha512-pFNfjsJkN9NqSVuyQB6QjvJnBeyrR/JQrM/KPa+PtvkByp0UA2FFFtSbB/OX7rduEKcXg5GImm4yucqFLdzewQ==} + '@kevisual/router@0.1.1': + resolution: {integrity: sha512-+uaJc+Bf/T1mfxyfy9PmwuxJGPOLhVqrmsli2xUPqkkFvizrFIGB1vBTITuo5XP/FnwGqxgbjsitG57AMubm3w==} '@kevisual/types@0.0.12': resolution: {integrity: sha512-zJXH2dosir3jVrQ6QG4i0+iLQeT9gJ3H+cKXs8ReWboxBSYzUZO78XssVeVrFPsJ33iaAqo4q3DWbSS1dWGn7Q==} @@ -149,11 +189,15 @@ packages: resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} engines: {node: '>= 20.19.0'} - '@opencode-ai/plugin@1.2.23': - resolution: {integrity: sha512-5DRhitKrMK02u0AKrF+jIK+gUj0GyzN34bXkABXgNMTYDPwiMPkh4UPDJjjRrlofRgWQgmSLFc0nARHX4f92qA==} + '@opencode-ai/plugin@1.2.24': + resolution: {integrity: sha512-B3hw415D+2w6AtdRdvKWkuQVT0LXDWTdnAZhZC6gbd+UHh5O5DMmnZTe/YM8yK8ZZO9Dvo5rnV78TdDDYunJiw==} - '@opencode-ai/sdk@1.2.23': - resolution: {integrity: sha512-f0qtJ5GFsEK8fCgT13zL7Ev7lFt03mf9HTQqmpJEgJpDaSx3Mb3ZGJCsfyw48SAASISkq+4Lct/4P17CKG7xUg==} + '@opencode-ai/sdk@1.2.24': + resolution: {integrity: sha512-MQamFkRl4B/3d6oIRLNpkYR2fcwet1V/ffKyOKJXWjtP/CT9PDJMtLpu6olVHjXKQi8zMNltwuMhv1QsNtRlZg==} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} '@paralleldrive/cuid2@3.3.0': resolution: {integrity: sha512-OqiFvSOF0dBSesELYY2CAMa4YINvlLpvKOz/rv6NeZEqiyttlHgv98Juwv4Ch+GrEV7IZ8jfI2VcEoYUjXXCjw==} @@ -337,14 +381,17 @@ packages: cpu: [x64] os: [win32] + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@types/bun@1.3.10': resolution: {integrity: sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/node@25.3.5': - resolution: {integrity: sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==} + '@types/node@25.4.0': + resolution: {integrity: sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -352,6 +399,16 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@vercel/oidc@3.1.0': + resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} + engines: {node: '>= 20'} + + ai@6.0.116: + resolution: {integrity: sha512-7yM+cTmyRLeNIXwt4Vj+mrrJgVQ9RMIW5WO0ydoLoYkewIvsMcvUmqS4j2RJTUXaF1HphwmSKUMQ/HypNRGOmA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^4.3.6 + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -411,6 +468,10 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -455,6 +516,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + lru-cache@11.2.5: resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} engines: {node: 20 || >=22} @@ -648,6 +712,42 @@ packages: snapshots: + '@ai-sdk/anthropic@3.0.58(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@4.3.6) + zod: 4.3.6 + + '@ai-sdk/gateway@3.0.66(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@4.3.6) + '@vercel/oidc': 3.1.0 + zod: 4.3.6 + + '@ai-sdk/openai-compatible@2.0.35(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@4.3.6) + zod: 4.3.6 + + '@ai-sdk/openai@3.0.41(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@4.3.6) + zod: 4.3.6 + + '@ai-sdk/provider-utils@4.0.19(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 + zod: 4.3.6 + + '@ai-sdk/provider@3.0.8': + dependencies: + json-schema: 0.4.0 + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -660,11 +760,17 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} - '@kevisual/ai@0.0.26': + '@kevisual/ai@0.0.27': dependencies: + '@ai-sdk/anthropic': 3.0.58(zod@4.3.6) + '@ai-sdk/openai': 3.0.41(zod@4.3.6) + '@ai-sdk/openai-compatible': 2.0.35(zod@4.3.6) + '@kevisual/js-filter': 0.0.6 '@kevisual/logger': 0.0.4 '@kevisual/permission': 0.0.4 - '@kevisual/query': 0.0.52 + '@kevisual/query': 0.0.53 + ai: 6.0.116(zod@4.3.6) + zod: 4.3.6 '@kevisual/api@0.0.62(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: @@ -704,6 +810,8 @@ snapshots: '@kevisual/js-filter@0.0.5': {} + '@kevisual/js-filter@0.0.6': {} + '@kevisual/load@0.0.6': dependencies: eventemitter3: 5.0.1 @@ -712,13 +820,11 @@ snapshots: '@kevisual/permission@0.0.4': {} - '@kevisual/query@0.0.52': {} - '@kevisual/query@0.0.53': {} '@kevisual/remote-app@0.0.6': {} - '@kevisual/router@0.0.90': + '@kevisual/router@0.1.1': dependencies: es-toolkit: 1.45.1 @@ -733,12 +839,14 @@ snapshots: '@noble/hashes@2.0.1': {} - '@opencode-ai/plugin@1.2.23': + '@opencode-ai/plugin@1.2.24': dependencies: - '@opencode-ai/sdk': 1.2.23 + '@opencode-ai/sdk': 1.2.24 zod: 4.3.6 - '@opencode-ai/sdk@1.2.23': {} + '@opencode-ai/sdk@1.2.24': {} + + '@opentelemetry/api@1.9.0': {} '@paralleldrive/cuid2@3.3.0': dependencies: @@ -860,13 +968,15 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true + '@standard-schema/spec@1.1.0': {} + '@types/bun@1.3.10': dependencies: bun-types: 1.3.10 '@types/estree@1.0.8': {} - '@types/node@25.3.5': + '@types/node@25.4.0': dependencies: undici-types: 7.18.2 @@ -874,7 +984,17 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.3.5 + '@types/node': 25.4.0 + + '@vercel/oidc@3.1.0': {} + + ai@6.0.116(zod@4.3.6): + dependencies: + '@ai-sdk/gateway': 3.0.66(zod@4.3.6) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@4.3.6) + '@opentelemetry/api': 1.9.0 + zod: 4.3.6 anymatch@3.1.3: dependencies: @@ -885,7 +1005,7 @@ snapshots: bun-types@1.3.10: dependencies: - '@types/node': 25.3.5 + '@types/node': 25.4.0 chokidar@5.0.0: dependencies: @@ -921,6 +1041,8 @@ snapshots: eventemitter3@5.0.4: {} + eventsource-parser@3.0.6: {} + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -963,6 +1085,8 @@ snapshots: js-tokens@4.0.0: optional: true + json-schema@0.4.0: {} + lru-cache@11.2.5: {} magic-string@0.30.21: