diff --git a/agent/modules/cnb-manager.ts b/agent/modules/cnb-manager.ts index 7252471..26f3667 100644 --- a/agent/modules/cnb-manager.ts +++ b/agent/modules/cnb-manager.ts @@ -1,7 +1,10 @@ import { Result } from '@kevisual/query'; import { CNB } from '../../src/index.ts'; +import { useKey } from '@kevisual/context'; export const getConfig = async (opts: { token?: string }) => { - const res = await fetch('https://kevisual.cn/api/router', { + const kevisualEnv = useKey('KEVISUAL_ENV') + const baseUrl = kevisualEnv === 'production' ? 'https://kevisual.cn/api/router' : 'https://kevisual.xiongxiao.me/api/router'; + const res = await fetch(baseUrl, { method: 'POST', body: JSON.stringify({ path: 'config', @@ -51,6 +54,7 @@ export class CNBManager { cnbItem.runAt = Date.now() return cnbItem } + const res = await getConfig({ token: opts?.kevisualToken }) if (res.code === 200) { const cookie = res.data?.data?.CNB_COOKIE diff --git a/agent/routes/repo/repo.ts b/agent/routes/repo/repo.ts index 3ff132b..7d080f9 100644 --- a/agent/routes/repo/repo.ts +++ b/agent/routes/repo/repo.ts @@ -43,6 +43,27 @@ app.route({ } }).addTo(app); +app.route({ + path: 'cnb', + key: 'get-repo', + description: '获取代码仓库详情, 参数name', + middleware: ['auth'], + metadata: { + args: { + name: tool.schema.string().describe('代码仓库名称, 如 my-user/my-repo'), + } + } +}).define(async (ctx) => { + const cnb = await cnbManager.getContext(ctx); + const name = ctx.query?.name; + + if (!name) { + ctx.throw(400, '缺少参数 name'); + } + const res = await cnb.repo.getRepo(name); + ctx.forward(res); +}).addTo(app); + app.route({ path: 'cnb', key: 'create-repo-file', @@ -106,7 +127,56 @@ app.route({ if (!name) { ctx.throw(400, '缺少参数 name'); } + try { + const resCookie = await cnb.user.checkCookieValid() + if (resCookie.code !== 200) { + ctx.throw(401, 'Cookie 无效或已过期'); + } + const res = await cnb.repo.deleteRepoCookie(name); + ctx.forward(res); + } catch (error) { + ctx.code = 200 + ctx.body = { content: '已经删除' } + } +}).addTo(app); - const res = await cnb.repo.deleteRepoCookie(name); + +app.route({ + path: 'cnb', + key: 'update-repo-info', + description: '更新代码仓库信息, 参数name, description', + middleware: ['auth'], + metadata: { + tags: ['opencode'], + ...createSkill({ + skill: 'update-repo-info', + title: '更新代码仓库信息', + args: { + name: tool.schema.string().describe('代码仓库名称'), + description: tool.schema.string().describe('代码仓库描述'), + license: tool.schema.string().describe('代码仓库许可证类型,如 MIT').optional(), + site: tool.schema.string().describe('代码仓库主页链接').optional(), + topics: tool.schema.array(tool.schema.string()).describe('代码仓库话题标签列表').optional(), + }, + summary: '更新代码仓库的信息', + }) + } +}).define(async (ctx) => { + const cnb = await cnbManager.getContext(ctx); + const name = ctx.query?.name; + const description = ctx.query?.description; + const license = ctx.query?.license; + const site = ctx.query?.site; + const topics = ctx.query?.topics; + + if (!name) { + ctx.throw(400, '缺少参数 name'); + } + if (!description) { + ctx.throw(400, '缺少参数 description'); + } + + const res = await cnb.repo.updateRepoInfo(name, { description, license, site, topics }); ctx.forward(res); -}).addTo(app); \ No newline at end of file +}).addTo(app); + diff --git a/agent/routes/workspace/build.ts b/agent/routes/workspace/build.ts new file mode 100644 index 0000000..1265396 --- /dev/null +++ b/agent/routes/workspace/build.ts @@ -0,0 +1,43 @@ +import { createSkill, tool } from '@kevisual/router'; + +import { app, cnbManager, notCNBCheck } from '../../app.ts'; + +// 启动工作空间 +app.route({ + path: 'cnb', + key: 'cloud-build', + description: '云端构建,参数 event, repo, branch, ref, config, env', + middleware: ['auth'], + metadata: { + tags: ['opencode'], + ...createSkill({ + skill: 'cloud-build', + title: '云端构建', + summary: '在云端构建代码仓库,参数包括 event, repo, branch, ref, config, env', + args: { + env: tool.schema.any().optional().describe('构建环境变量,格式为 { "KEY": "VALUE" }'), + event: tool.schema.string().optional().describe('触发事件类型,例如 api_trigger_event'), + branch: tool.schema.string().optional().describe('分支名称,默认主分支'), + config: tool.schema.string().describe('构建config文件内容,例如 cloudbuild.yaml对应的yml的内容'), + repo: tool.schema.string().describe('代码仓库路径,例如 user/repo'), + }, + }) + } +}).define(async (ctx) => { + const cnb = await cnbManager.getContext(ctx); + const repo = ctx.query?.repo; + const branch = ctx.query?.branch || 'main'; + const config = ctx.query?.config; + const event = ctx.query?.event || 'api_trigger_event'; + const env = ctx.query?.env ?? {}; + if (!repo) { + ctx.throw(400, '缺少参数 repo'); + } + const res = await cnb.build.startBuild(repo, { + branch, + config, + event, + env, + }); + ctx.forward(res); +}).addTo(app); \ No newline at end of file diff --git a/agent/routes/workspace/index.ts b/agent/routes/workspace/index.ts index e3c1c93..40e7ea3 100644 --- a/agent/routes/workspace/index.ts +++ b/agent/routes/workspace/index.ts @@ -3,6 +3,7 @@ import { app, cnbManager, notCNBCheck } from '../../app.ts'; import z from 'zod'; import './skills.ts'; import './keep.ts'; +import './build.ts'; // 启动工作空间 app.route({ @@ -67,7 +68,7 @@ app.route({ page: page ?? 1, pageSize: pageSize ?? 100, }); - ctx.forward({ code: 200, message: 'success', data: res }); + ctx.forward(res); }).addTo(app); // 获取工作空间详情 @@ -99,7 +100,7 @@ app.route({ ctx.throw(400, '缺少参数 sn'); } const res = await cnb.workspace.getDetail(repo, sn); - ctx.forward({ code: 200, message: 'success', data: res }); + ctx.forward(res); }).addTo(app); // 删除工作空间 @@ -161,7 +162,6 @@ app.route({ }) } }).define(async (ctx) => { - if (notCNBCheck(ctx)) { return; } const cnb = await cnbManager.getContext(ctx); const pipelineId = ctx.query?.pipelineId; const sn = ctx.query?.sn; @@ -169,6 +169,7 @@ app.route({ ctx.throw(400, 'pipelineId 和 sn 必须提供其中一个'); } const res = await cnb.workspace.stopWorkspace({ pipelineId, sn }); - ctx.forward({ code: 200, message: 'success', data: res }); + ctx.forward(res); }).addTo(app); + diff --git a/package.json b/package.json index f352468..74da834 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "@kevisual/dts": "^0.0.4", "@kevisual/remote-app": "^0.0.6", "@kevisual/types": "^0.0.12", - "@opencode-ai/plugin": "^1.2.22", + "@opencode-ai/plugin": "^1.2.23", "@types/bun": "^1.3.10", "@types/node": "^25.3.5", "@types/ws": "^8.18.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2363f34..298ddc9 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.88 - version: 0.0.88 + specifier: ^0.0.90 + version: 0.0.90 '@kevisual/use-config': specifier: ^1.0.30 version: 1.0.30(dotenv@17.3.1) @@ -39,6 +39,9 @@ importers: '@kevisual/ai': specifier: ^0.0.26 version: 0.0.26 + '@kevisual/api': + specifier: ^0.0.62 + version: 0.0.62(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@kevisual/code-builder': specifier: ^0.0.6 version: 0.0.6 @@ -48,12 +51,15 @@ importers: '@kevisual/dts': specifier: ^0.0.4 version: 0.0.4(typescript@5.9.3) + '@kevisual/remote-app': + specifier: ^0.0.6 + version: 0.0.6 '@kevisual/types': specifier: ^0.0.12 version: 0.0.12 '@opencode-ai/plugin': - specifier: ^1.2.20 - version: 1.2.20 + specifier: ^1.2.23 + version: 1.2.23 '@types/bun': specifier: ^1.3.10 version: 1.3.10 @@ -89,6 +95,9 @@ packages: '@kevisual/ai@0.0.26': resolution: {integrity: sha512-lhaMpxi+vgqPdyBKiuNbSil4hy13tNLbDiqCtG0qUXKtvoowK6xMx269pSSYkYBivczM8g8I0XEouuJceUpJPg==} + '@kevisual/api@0.0.62': + resolution: {integrity: sha512-GB8Ho2absXoXoZP2GKyuoRqRqjdwtV0JR512DXBaKJR2sIPn1KvuglbBiX+zPjDBBskv/ApvZKOoSwj1OmkrKQ==} + '@kevisual/code-builder@0.0.6': resolution: {integrity: sha512-0aqATB31/yw4k4s5/xKnfr4DKbUnx8e3Z3BmKbiXTrc+CqWiWTdlGe9bKI9dZ2Df+xNp6g11W4xM2NICNyyCCw==} hasBin: true @@ -100,6 +109,9 @@ packages: resolution: {integrity: sha512-FVUaH/0nyhbHWpEVjFTGP54PLMm4Hf06aqWLdHOYHNPIgr1aK1C26kOH7iumklGFGk9w93IGxj8Zxe5fap5N2A==} hasBin: true + '@kevisual/js-filter@0.0.5': + resolution: {integrity: sha512-+S+Sf3K/aP6XtZI2s7TgKOr35UuvUvtpJ9YDW30a+mY0/N8gRuzyKhieBzQN7Ykayzz70uoMavBXut2rUlLgzw==} + '@kevisual/load@0.0.6': resolution: {integrity: sha512-+3YTFehRcZ1haGel5DKYMUwmi5i6f2psyaPZlfkKU/cOXgkpwoG9/BEqPCnPjicKqqnksEpixVRkyHJ+5bjLVA==} @@ -115,8 +127,11 @@ packages: '@kevisual/query@0.0.53': resolution: {integrity: sha512-PAhpCLBr0emz0lGNlTVHMbJiC5wrtGLbInPddRzgKE35fiyNt+SWSsUWABiD0DeNrLN/OxWyAFobt880Z/e5MQ==} - '@kevisual/router@0.0.88': - resolution: {integrity: sha512-T8kEbxyTGxZpbxAKDplDjZMIY+HCnXOeEdjwQ11AQetrLuqLFDZS5PnaWdVAHnONUDLhYoftkNj7bGWLtyQDlg==} + '@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/types@0.0.12': resolution: {integrity: sha512-zJXH2dosir3jVrQ6QG4i0+iLQeT9gJ3H+cKXs8ReWboxBSYzUZO78XssVeVrFPsJ33iaAqo4q3DWbSS1dWGn7Q==} @@ -130,11 +145,19 @@ packages: resolution: {integrity: sha512-jLsL80wBBKkrJZrfk3SQpJ9JA/zREdlUROj7eCkmzqduAWKSI0wVcXuCKf+mLFCHB0Q0Tkh2rgzjSlurt3JQgw==} engines: {node: '>=10.0.0'} - '@opencode-ai/plugin@1.2.20': - resolution: {integrity: sha512-BE6TOXVxgF24g5QgtlogSY5B+/AmZJ3cYaVjHZhUVuAli9JEg4RblrbrK2rfgbyZBoZDpjBLGTYtIRTVmOccEA==} + '@noble/hashes@2.0.1': + resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} + engines: {node: '>= 20.19.0'} - '@opencode-ai/sdk@1.2.20': - resolution: {integrity: sha512-U5ROpG21D8jg9rkc1IgKAk1g5dn6X/rkOBfveupd0peSDO9n6VM9aikYccVLaMObxVqdjtG08IeQOFTPVS8ySQ==} + '@opencode-ai/plugin@1.2.23': + resolution: {integrity: sha512-5DRhitKrMK02u0AKrF+jIK+gUj0GyzN34bXkABXgNMTYDPwiMPkh4UPDJjjRrlofRgWQgmSLFc0nARHX4f92qA==} + + '@opencode-ai/sdk@1.2.23': + resolution: {integrity: sha512-f0qtJ5GFsEK8fCgT13zL7Ev7lFt03mf9HTQqmpJEgJpDaSx3Mb3ZGJCsfyw48SAASISkq+4Lct/4P17CKG7xUg==} + + '@paralleldrive/cuid2@3.3.0': + resolution: {integrity: sha512-OqiFvSOF0dBSesELYY2CAMa4YINvlLpvKOz/rv6NeZEqiyttlHgv98Juwv4Ch+GrEV7IZ8jfI2VcEoYUjXXCjw==} + hasBin: true '@rollup/plugin-commonjs@29.0.0': resolution: {integrity: sha512-U2YHaxR2cU/yAiwKJtJRhnyLk7cifnQw0zUpISsocBDoHDJn+HTV74ABqnwr5bEgWUwFZC9oFL6wLe21lHu5eQ==} @@ -333,6 +356,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + bun-types@1.3.10: resolution: {integrity: sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg==} @@ -370,6 +396,9 @@ packages: resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} engines: {node: '>=12'} + error-causes@3.0.2: + resolution: {integrity: sha512-i0B8zq1dHL6mM85FGoxaJnVtx6LD5nL2v0hlpGdntg5FOSyzQ46c9lmz5qx0xRS2+PWHGOHcYxGIBC5Le2dRMw==} + es-toolkit@1.45.1: resolution: {integrity: sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==} @@ -379,6 +408,9 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -396,6 +428,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + fuse.js@7.1.0: + resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} + engines: {node: '>=10'} + h3@1.15.5: resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} @@ -444,6 +480,9 @@ packages: ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + path-browserify-esm@1.0.6: + resolution: {integrity: sha512-9nUwYvvu/yq1PYrUyYCihNWmpzacaRYF6gGbjLWErrZ4MRDWyfPN7RpE8E7tsw8eqBU/rr7mcoTXbS+Vih8uUA==} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -461,6 +500,15 @@ packages: radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + react-dom@19.2.4: + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + peerDependencies: + react: ^19.2.4 + + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} @@ -482,6 +530,18 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + sonner@2.0.7: + resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + spark-md5@3.0.2: + resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -568,6 +628,24 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zustand@5.0.11: + resolution: {integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + snapshots: '@babel/code-frame@7.29.0': @@ -588,6 +666,27 @@ snapshots: '@kevisual/permission': 0.0.4 '@kevisual/query': 0.0.52 + '@kevisual/api@0.0.62(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@kevisual/context': 0.0.8 + '@kevisual/js-filter': 0.0.5 + '@kevisual/load': 0.0.6 + '@paralleldrive/cuid2': 3.3.0 + es-toolkit: 1.45.1 + eventemitter3: 5.0.4 + fuse.js: 7.1.0 + nanoid: 5.1.6 + path-browserify-esm: 1.0.6 + sonner: 2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + spark-md5: 3.0.2 + zustand: 5.0.11(react@19.2.4) + transitivePeerDependencies: + - '@types/react' + - immer + - react + - react-dom + - use-sync-external-store + '@kevisual/code-builder@0.0.6': {} '@kevisual/context@0.0.8': {} @@ -603,6 +702,8 @@ snapshots: transitivePeerDependencies: - typescript + '@kevisual/js-filter@0.0.5': {} + '@kevisual/load@0.0.6': dependencies: eventemitter3: 5.0.1 @@ -615,7 +716,9 @@ snapshots: '@kevisual/query@0.0.53': {} - '@kevisual/router@0.0.88': + '@kevisual/remote-app@0.0.6': {} + + '@kevisual/router@0.0.90': dependencies: es-toolkit: 1.45.1 @@ -628,12 +731,20 @@ snapshots: '@kevisual/ws@8.19.0': {} - '@opencode-ai/plugin@1.2.20': + '@noble/hashes@2.0.1': {} + + '@opencode-ai/plugin@1.2.23': dependencies: - '@opencode-ai/sdk': 1.2.20 + '@opencode-ai/sdk': 1.2.23 zod: 4.3.6 - '@opencode-ai/sdk@1.2.20': {} + '@opencode-ai/sdk@1.2.23': {} + + '@paralleldrive/cuid2@3.3.0': + dependencies: + '@noble/hashes': 2.0.1 + bignumber.js: 9.3.1 + error-causes: 3.0.2 '@rollup/plugin-commonjs@29.0.0(rollup@4.57.1)': dependencies: @@ -770,6 +881,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + bignumber.js@9.3.1: {} + bun-types@1.3.10: dependencies: '@types/node': 25.3.5 @@ -798,12 +911,16 @@ snapshots: dotenv@17.3.1: {} + error-causes@3.0.2: {} + es-toolkit@1.45.1: {} estree-walker@2.0.2: {} eventemitter3@5.0.1: {} + eventemitter3@5.0.4: {} + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -813,6 +930,8 @@ snapshots: function-bind@1.1.2: {} + fuse.js@7.1.0: {} + h3@1.15.5: dependencies: cookie-es: 1.2.2 @@ -864,6 +983,8 @@ snapshots: node-fetch-native: 1.6.7 ufo: 1.6.3 + path-browserify-esm@1.0.6: {} + path-parse@1.0.7: {} picocolors@1.1.1: @@ -875,6 +996,13 @@ snapshots: radix3@1.1.2: {} + react-dom@19.2.4(react@19.2.4): + dependencies: + react: 19.2.4 + scheduler: 0.27.0 + + react@19.2.4: {} + readdirp@5.0.0: {} resolve@1.22.11: @@ -922,6 +1050,15 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 + scheduler@0.27.0: {} + + sonner@2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + spark-md5@3.0.2: {} + supports-preserve-symlinks-flag@1.0.0: {} tslib@2.8.1: {} @@ -946,3 +1083,7 @@ snapshots: ufo: 1.6.3 zod@4.3.6: {} + + zustand@5.0.11(react@19.2.4): + optionalDependencies: + react: 19.2.4