From 8d85e834181869cdf0efae62af4ecc098f5b5372 Mon Sep 17 00:00:00 2001 From: xiongxiao Date: Fri, 13 Mar 2026 04:04:47 +0800 Subject: [PATCH] feat(auth): add authentication routes and user token handling - Implemented user authentication routes in `auth.ts` for fetching current user info and admin verification. - Added caching mechanism for user tokens to improve performance. - Created middleware for admin authentication. feat(opencode): create OpenCode client route - Added `opencode-cnb` route for creating OpenCode clients with session management. - Integrated OpenCode SDK for client operations and session handling. refactor(client): encapsulate OpenCode client creation - Created a utility function `getClient` in `client.ts` to initialize OpenCode clients. test(opencode): add tests for OpenCode routes - Implemented test cases for OpenCode routes in `list.ts` to validate functionality. - Created common utilities for testing in `common.ts`. --- assistant/package.json | 6 +- assistant/src/routes/auth.ts | 119 ++++++ assistant/src/routes/index.ts | 123 +----- assistant/src/routes/opencode/cnb.ts | 68 +++ assistant/src/routes/opencode/ls.ts | 22 +- .../src/routes/opencode/module/client.ts | 8 + assistant/src/routes/opencode/module/open.ts | 4 +- assistant/src/routes/opencode/test/common.ts | 9 + assistant/src/routes/opencode/test/list.ts | 14 + package.json | 4 +- pnpm-lock.yaml | 398 +++++++++--------- 11 files changed, 440 insertions(+), 335 deletions(-) create mode 100644 assistant/src/routes/auth.ts create mode 100644 assistant/src/routes/opencode/cnb.ts create mode 100644 assistant/src/routes/opencode/module/client.ts create mode 100644 assistant/src/routes/opencode/test/common.ts create mode 100644 assistant/src/routes/opencode/test/list.ts diff --git a/assistant/package.json b/assistant/package.json index 8d326a3..7efde40 100644 --- a/assistant/package.json +++ b/assistant/package.json @@ -54,13 +54,13 @@ "@kevisual/use-config": "^1.0.30", "@opencode-ai/plugin": "^1.2.24", "@types/bun": "^1.3.10", - "@types/node": "^25.4.0", + "@types/node": "^25.5.0", "@types/send": "^1.2.1", "@types/ws": "^8.18.1", "chalk": "^5.6.2", "commander": "^14.0.3", "cross-env": "^10.1.0", - "dayjs": "^1.11.19", + "dayjs": "^1.11.20", "dotenv": "^17.3.1", "get-port": "^7.1.0", "nanoid": "^5.1.6", @@ -76,7 +76,7 @@ "access": "public" }, "dependencies": { - "@aws-sdk/client-s3": "^3.1007.0", + "@aws-sdk/client-s3": "^3.1008.0", "@kevisual/js-filter": "^0.0.6", "@kevisual/oss": "^0.0.20", "@kevisual/video-tools": "^0.0.13", diff --git a/assistant/src/routes/auth.ts b/assistant/src/routes/auth.ts new file mode 100644 index 0000000..11df08e --- /dev/null +++ b/assistant/src/routes/auth.ts @@ -0,0 +1,119 @@ +import { app, assistantConfig } from '../app.ts'; +import { authCache } from '@/module/cache/auth.ts'; + +import { logger } from '@/module/logger.ts'; +const getTokenUser = async (token: string) => { + const query = assistantConfig.query + const res = await query.post({ + path: 'user', + key: 'me', + token: token, + }); + return res; +} +export const getTokenUserCache = async (token: string) => { + const tokenUser = await authCache.get(token); + if (tokenUser) { + return { + code: 200, + data: tokenUser, + }; + } + const res = await getTokenUser(token); + if (res.code === 200) { + authCache.set(token, res.data); + } + return res; +} +export const checkAuth = async (ctx: any, isAdmin = false) => { + const config = assistantConfig.getConfig(); + const { auth = {} } = config; + const token = ctx.query.token; + logger.debug('checkAuth', ctx.query, { token }); + if (!token) { + return { + code: 401, + message: '未登录', + } + } + // 鉴权代理 + let tokenUser = await authCache.get(token); + if (!tokenUser) { + const tokenUserRes = await getTokenUser(token); + if (tokenUserRes.code !== 200) { + return { + code: tokenUserRes.code, + message: '验证失败' + tokenUserRes.message, + } + } else { + tokenUser = tokenUserRes.data; + } + authCache.set(token, tokenUser); + } + ctx.state = { + ...ctx.state, + token, + tokenUser, + }; + const { username } = tokenUser; + if (!auth.username) { + // 初始管理员账号 + auth.username = username; + assistantConfig.setConfig({ auth }); + } + if (isAdmin && auth.username) { + const admins = config.auth?.admin || []; + let isCheckAdmin = false; + const admin = auth.username; + if (admin === username) { + isCheckAdmin = true; + } + if (!isCheckAdmin && admins.length > 0 && admins.includes(username)) { + isCheckAdmin = true; + } + if (!isCheckAdmin) { + return { + code: 403, + message: '非管理员用户', + } + } + } + return { + code: 200, + data: { tokenUser, token } + } +}; +app + .route({ + path: 'auth', + id: 'auth', + description: '获取当前登录用户信息, 第一个登录的用户为管理员用户', + }) + .define(async (ctx) => { + if (!ctx.query?.token && ctx.appId === app.appId) { + return; + } + const authResult = await checkAuth(ctx); + if (authResult.code !== 200) { + ctx.throw(authResult.code, authResult.message); + } + }) + .addTo(app); +app + .route({ + path: 'auth-admin', + id: 'auth-admin', + description: '管理员鉴权, 获取用户信息,并验证是否为管理员。', + }) + .define(async (ctx) => { + // logger.debug('query', ctx.query); + if (!ctx.query?.token && ctx.appId === app.appId) { + return; + } + ctx.state.isAdmin = true; + const authResult = await checkAuth(ctx, true); + if (authResult.code !== 200) { + ctx.throw(authResult.code, authResult.message); + } + }) + .addTo(app); \ No newline at end of file diff --git a/assistant/src/routes/index.ts b/assistant/src/routes/index.ts index 548db5b..6f4ad36 100644 --- a/assistant/src/routes/index.ts +++ b/assistant/src/routes/index.ts @@ -1,4 +1,4 @@ -import { app, assistantConfig } from '../app.ts'; + import './config/index.ts'; import './client/index.ts'; import './shop-install/index.ts'; @@ -11,121 +11,8 @@ import './remote/index.ts'; // import './kevisual/index.ts' import './cnb-board/index.ts'; -import { authCache } from '@/module/cache/auth.ts'; +import './auth.ts'; + +import { getTokenUserCache, checkAuth } from './auth.ts'; +export { getTokenUserCache, checkAuth } -import { logger } from '@/module/logger.ts'; -const getTokenUser = async (token: string) => { - const query = assistantConfig.query - const res = await query.post({ - path: 'user', - key: 'me', - token: token, - }); - return res; -} -export const getTokenUserCache = async (token: string) => { - const tokenUser = await authCache.get(token); - if (tokenUser) { - return { - code: 200, - data: tokenUser, - }; - } - const res = await getTokenUser(token); - if (res.code === 200) { - authCache.set(token, res.data); - } - return res; -} -export const checkAuth = async (ctx: any, isAdmin = false) => { - const config = assistantConfig.getConfig(); - const { auth = {} } = config; - const token = ctx.query.token; - logger.debug('checkAuth', ctx.query, { token }); - if (!token) { - return { - code: 401, - message: '未登录', - } - } - // 鉴权代理 - let tokenUser = await authCache.get(token); - if (!tokenUser) { - const tokenUserRes = await getTokenUser(token); - if (tokenUserRes.code !== 200) { - return { - code: tokenUserRes.code, - message: '验证失败' + tokenUserRes.message, - } - } else { - tokenUser = tokenUserRes.data; - } - authCache.set(token, tokenUser); - } - ctx.state = { - ...ctx.state, - token, - tokenUser, - }; - const { username } = tokenUser; - if (!auth.username) { - // 初始管理员账号 - auth.username = username; - assistantConfig.setConfig({ auth }); - } - if (isAdmin && auth.username) { - const admins = config.auth?.admin || []; - let isCheckAdmin = false; - const admin = auth.username; - if (admin === username) { - isCheckAdmin = true; - } - if (!isCheckAdmin && admins.length > 0 && admins.includes(username)) { - isCheckAdmin = true; - } - if (!isCheckAdmin) { - return { - code: 403, - message: '非管理员用户', - } - } - } - return { - code: 200, - data: { tokenUser, token } - } -}; -app - .route({ - path: 'auth', - id: 'auth', - description: '获取当前登录用户信息, 第一个登录的用户为管理员用户', - }) - .define(async (ctx) => { - if (!ctx.query?.token && ctx.appId === app.appId) { - return; - } - const authResult = await checkAuth(ctx); - if (authResult.code !== 200) { - ctx.throw(authResult.code, authResult.message); - } - }) - .addTo(app); -app - .route({ - path: 'auth-admin', - id: 'auth-admin', - description: '管理员鉴权, 获取用户信息,并验证是否为管理员。', - }) - .define(async (ctx) => { - // logger.debug('query', ctx.query); - if (!ctx.query?.token && ctx.appId === app.appId) { - return; - } - ctx.state.isAdmin = true; - const authResult = await checkAuth(ctx, true); - if (authResult.code !== 200) { - ctx.throw(authResult.code, authResult.message); - } - }) - .addTo(app); diff --git a/assistant/src/routes/opencode/cnb.ts b/assistant/src/routes/opencode/cnb.ts new file mode 100644 index 0000000..e9c7d8e --- /dev/null +++ b/assistant/src/routes/opencode/cnb.ts @@ -0,0 +1,68 @@ +import { app } from '@/app.ts' +import { z } from 'zod'; +import { getClient } from './module/client.ts'; +import dayjs from 'dayjs'; +import { Session } from '@opencode-ai/sdk'; + +app.route({ + path: 'opencode-cnb', + key: 'question', + middleware: ['auth-admin'], + description: '创建 OpenCode 客户端', + metadata: { + args: { + question: z.string().describe('问题'), + baseUrl: z.string().optional().describe('OpenCode 服务地址,默认为 http://localhost:4096'), + directory: z.string().optional().describe('运行目录,默认为根目录'), + messageID: z.string().optional().describe('消息 ID,选填'), + sessionId: z.string().optional().describe('会话 ID,选填'), + parts: z.array(z.any()).optional().describe('消息内容的分块,优先于 question 参数'), + } + } +}).define(async (ctx) => { + const { question, baseUrl, directory = '/workspace', messageID, sessionId, parts } = ctx.query; + const client = await getClient({ baseUrl: baseUrl }); + if (!client) { + ctx.body = { content: `OpenCode 客户端获取失败` }; + return; + } + if (!question) { + ctx.body = { content: `问题不能为空` }; + return; + } + // const sessionList = await client.session.list() + let session: Session | null = null; + // const hasSession = sessionList.data.find(s => s.directory === directory); + // if (hasSession) { + // session = hasSession; + // } else { + if (sessionId) { + try { + const getSession = await client.session.get({ path: { id: sessionId } }); + session = getSession.data; + } catch (error) { + // 无法获取会话,继续往下走创建会话的逻辑 + } + } + if (!session) { + const createSession = await client.session.create({ + query: { + directory, + }, + }) + session = createSession.data; + } + let _parts: any[] = parts ?? [{ type: "text", text: question }]; + const message = await client.session.prompt({ + body: { + messageID: messageID, + parts: _parts, + }, + path: { + id: sessionId || session.id, + }, + }) + const data = message.data; + + ctx.body = { content: `已经启动`, data }; +}).addTo(app); \ No newline at end of file diff --git a/assistant/src/routes/opencode/ls.ts b/assistant/src/routes/opencode/ls.ts index 0a9aded..da73025 100644 --- a/assistant/src/routes/opencode/ls.ts +++ b/assistant/src/routes/opencode/ls.ts @@ -7,7 +7,7 @@ import { useKey } from '@kevisual/use-config'; app.route({ path: 'opencode', key: 'create', - middleware: ['auth'], + middleware: ['auth-admin'], description: '创建 OpenCode 客户端', metadata: { tags: ['opencode'], @@ -16,7 +16,7 @@ app.route({ title: '创建 OpenCode 客户端', summary: '创建 OpenCode 客户端,如果存在则复用', args: { - port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 5000') + port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096') } }) }, @@ -25,11 +25,11 @@ app.route({ ctx.body = { content: `${opencodeManager.url} OpenCode 客户端已就绪` }; }).addTo(app); -// 关闭 opencode 客户端 5000 +// 关闭 opencode 客户端 4096 app.route({ path: 'opencode', key: 'close', - middleware: ['auth'], + middleware: ['auth-admin'], description: '关闭 OpenCode 客户端', metadata: { tags: ['opencode'], @@ -38,7 +38,7 @@ app.route({ title: '关闭 OpenCode 客户端', summary: '关闭 OpenCode 客户端, 未提供端口则关闭默认端口', args: { - port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 5000') + port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096') } }) }, @@ -51,7 +51,7 @@ app.route({ app.route({ path: 'opencode', key: 'restart', - middleware: ['auth'], + middleware: ['auth-admin'], description: '重启 OpenCode 客户端', metadata: { tags: ['opencode'], @@ -60,7 +60,7 @@ app.route({ title: '重启 OpenCode 客户端', summary: '重启 OpenCode 客户端', args: { - port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 5000') + port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096') } }) }, @@ -73,7 +73,7 @@ app.route({ app.route({ path: 'opencode', key: 'getUrl', - middleware: ['auth'], + middleware: ['auth-admin'], description: '获取 OpenCode 服务 URL', metadata: { tags: ['opencode'], @@ -82,7 +82,7 @@ app.route({ title: '获取 OpenCode 服务 URL', summary: '获取当前 OpenCode 服务的 URL 地址', args: { - port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 5000') + port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096') } }) }, @@ -91,7 +91,7 @@ app.route({ const cnbURL = useKey('CNB_VSCODE_PROXY_URI') as string | undefined; let content = `本地访问地址: ${url}` if (cnbURL) { - content += `\n云端访问地址: ${cnbURL.replace('{{port}}', '5000')}`; + content += `\n云端访问地址: ${cnbURL.replace('{{port}}', '4096')}`; } ctx.body = { content }; }).addTo(app); @@ -114,7 +114,7 @@ app.route({ app.route({ path: 'opencode', key: 'runProject', - middleware: ['auth'], + middleware: ['auth-admin'], metadata: { tags: ['opencode'], ...createSkill({ diff --git a/assistant/src/routes/opencode/module/client.ts b/assistant/src/routes/opencode/module/client.ts new file mode 100644 index 0000000..6d431e1 --- /dev/null +++ b/assistant/src/routes/opencode/module/client.ts @@ -0,0 +1,8 @@ +import { createOpencodeClient } from "@opencode-ai/sdk" + +export const getClient = async (opts?: { baseUrl?: string }) => { + const client = await createOpencodeClient({ + baseUrl: opts?.baseUrl ?? "http://localhost:4096", + }) + return client; +} \ No newline at end of file diff --git a/assistant/src/routes/opencode/module/open.ts b/assistant/src/routes/opencode/module/open.ts index 3fdb34f..49d4762 100644 --- a/assistant/src/routes/opencode/module/open.ts +++ b/assistant/src/routes/opencode/module/open.ts @@ -3,7 +3,7 @@ import getPort from "get-port"; import os from "node:os"; import { execSync } from "node:child_process"; -const DEFAULT_PORT = 5000; +const DEFAULT_PORT = 4096; export class OpencodeManager { private static instance: OpencodeManager | null = null; @@ -57,7 +57,7 @@ export class OpencodeManager { async createOpencodeProject({ directory, - port = 5000 + port = DEFAULT_PORT }: { directory?: string, port?: number }): Promise { const client = createOpencodeClient({ baseUrl: `http://localhost:${port}`, diff --git a/assistant/src/routes/opencode/test/common.ts b/assistant/src/routes/opencode/test/common.ts new file mode 100644 index 0000000..1b51024 --- /dev/null +++ b/assistant/src/routes/opencode/test/common.ts @@ -0,0 +1,9 @@ +import { app } from '@/app.ts'; +import '../cnb.ts' +import "@/routes/auth.ts" +import util from "node:util" +export { app } + +export const showMore = (data: any) => { + return util.inspect(data, { depth: null, colors: true }) +} \ No newline at end of file diff --git a/assistant/src/routes/opencode/test/list.ts b/assistant/src/routes/opencode/test/list.ts new file mode 100644 index 0000000..b88e44a --- /dev/null +++ b/assistant/src/routes/opencode/test/list.ts @@ -0,0 +1,14 @@ +import { app, showMore } from './common.ts'; + +const main = async () => { + const res = await app.run({ + path: 'opencode-cnb', + key: 'question', + payload: { + question: '当前的projects目录下有哪些文件?', + } + }, { appId: app.appId }); + console.log('res', showMore(res)); +} + +main(); \ No newline at end of file diff --git a/package.json b/package.json index bab112e..8a13181 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ }, "devDependencies": { "@kevisual/api": "^0.0.64", - "@kevisual/cnb": "^0.0.42", + "@kevisual/cnb": "^0.0.43", "@kevisual/dts": "^0.0.4", "@kevisual/load": "^0.0.6", "@kevisual/logger": "^0.0.4", @@ -71,7 +71,7 @@ "@types/crypto-js": "^4.2.2", "@types/jsonwebtoken": "^9.0.10", "@types/micromatch": "^4.0.10", - "@types/node": "^25.4.0", + "@types/node": "^25.5.0", "@types/semver": "^7.7.1", "chalk": "^5.6.2", "commander": "^14.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a6000f9..1550965 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@inquirer/prompts': specifier: ^8.3.0 - version: 8.3.0(@types/node@25.4.0) + version: 8.3.0(@types/node@25.5.0) '@kevisual/app': specifier: ^0.0.2 version: 0.0.2(dotenv@17.3.1) @@ -21,8 +21,8 @@ importers: specifier: ^0.0.8 version: 0.0.8 '@kevisual/router': - specifier: ^0.1.0 - version: 0.1.0 + specifier: ^0.1.1 + version: 0.1.1 '@kevisual/use-config': specifier: ^1.0.30 version: 1.0.30(dotenv@17.3.1) @@ -64,11 +64,11 @@ importers: version: 1.17.4(idb-keyval@6.2.2)(ioredis@5.9.3(supports-color@10.2.2)) devDependencies: '@kevisual/api': - specifier: ^0.0.62 - version: 0.0.62(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: ^0.0.64 + version: 0.0.64(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@kevisual/cnb': - specifier: ^0.0.42 - version: 0.0.42(dotenv@17.3.1)(idb-keyval@6.2.2)(ioredis@5.9.3) + specifier: ^0.0.43 + version: 0.0.43(dotenv@17.3.1)(idb-keyval@6.2.2)(ioredis@5.9.3) '@kevisual/dts': specifier: ^0.0.4 version: 0.0.4(typescript@5.8.2) @@ -94,8 +94,8 @@ importers: specifier: ^4.0.10 version: 4.0.10 '@types/node': - specifier: ^25.4.0 - version: 25.4.0 + specifier: ^25.5.0 + version: 25.5.0 '@types/semver': specifier: ^7.7.1 version: 7.7.1 @@ -133,8 +133,8 @@ importers: assistant: dependencies: '@aws-sdk/client-s3': - specifier: ^3.1006.0 - version: 3.1006.0 + specifier: ^3.1008.0 + version: 3.1008.0 '@kevisual/js-filter': specifier: ^0.0.6 version: 0.0.6 @@ -171,13 +171,13 @@ importers: devDependencies: '@inquirer/prompts': specifier: ^8.3.0 - version: 8.3.0(@types/node@25.4.0) + version: 8.3.0(@types/node@25.5.0) '@kevisual/ai': - specifier: ^0.0.27 - version: 0.0.27 + specifier: ^0.0.28 + version: 0.0.28 '@kevisual/api': - specifier: ^0.0.62 - version: 0.0.62(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: ^0.0.64 + version: 0.0.64(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@kevisual/load': specifier: ^0.0.6 version: 0.0.6 @@ -191,8 +191,8 @@ importers: specifier: 0.0.53 version: 0.0.53 '@kevisual/router': - specifier: ^0.1.0 - version: 0.1.0 + specifier: ^0.1.1 + version: 0.1.1 '@kevisual/types': specifier: ^0.0.12 version: 0.0.12 @@ -206,8 +206,8 @@ importers: specifier: ^1.3.10 version: 1.3.10 '@types/node': - specifier: ^25.4.0 - version: 25.4.0 + specifier: ^25.5.0 + version: 25.5.0 '@types/send': specifier: ^1.2.1 version: 1.2.1 @@ -224,8 +224,8 @@ importers: specifier: ^10.1.0 version: 10.1.0 dayjs: - specifier: ^1.11.19 - version: 1.11.19 + specifier: ^1.11.20 + version: 1.11.20 dotenv: specifier: ^17.3.1 version: 17.3.1 @@ -252,16 +252,16 @@ importers: dependencies: '@astrojs/mdx': specifier: ^4.3.13 - version: 4.3.13(astro@5.16.15(@types/node@25.4.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2)) + version: 4.3.13(astro@5.16.15(@types/node@25.5.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2)) '@astrojs/react': specifier: ^4.4.2 - version: 4.4.2(@types/node@25.4.0)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 4.4.2(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@astrojs/sitemap': specifier: ^3.7.0 version: 3.7.0 '@astrojs/vue': specifier: ^5.1.4 - version: 5.1.4(@types/node@25.4.0)(astro@5.16.15(@types/node@25.4.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(vue@3.5.27(typescript@5.8.2)) + version: 5.1.4(@types/node@25.5.0)(astro@5.16.15(@types/node@25.5.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(vue@3.5.27(typescript@5.8.2)) '@kevisual/api': specifier: ^0.0.28 version: 0.0.28 @@ -282,7 +282,7 @@ importers: version: 1.2.4(@types/react@19.2.10)(react@19.2.4) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2)) + version: 4.1.18(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2)) '@uiw/react-md-editor': specifier: ^4.0.11 version: 4.0.11(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -291,7 +291,7 @@ importers: version: 6.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) astro: specifier: ^5.16.15 - version: 5.16.15(@types/node@25.4.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2) + version: 5.16.15(@types/node@25.5.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -499,8 +499,8 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.1006.0': - resolution: {integrity: sha512-tm8R/LgWDC3zWPMCdD990owvBrmuIM2A39+OWKW/HyAomWi6ancPz/H1K/hmxf0bqdXAaRUHBQMAmzwb1aR33Q==} + '@aws-sdk/client-s3@3.1008.0': + resolution: {integrity: sha512-w/SIRD25v2zVMbkn8CYIxUsac8yf5Jghkhw5j7EsNWdJhl56m/nWpUX7t1etFUW1cnzpFjZV0lXt0dNFSnbXwA==} engines: {node: '>=20.0.0'} '@aws-sdk/core@3.973.19': @@ -519,28 +519,28 @@ packages: resolution: {integrity: sha512-9EJROO8LXll5a7eUFqu48k6BChrtokbmgeMWmsH7lBb6lVbtjslUYz/ShLi+SHkYzTomiGBhmzTW7y+H4BxsnA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.18': - resolution: {integrity: sha512-vthIAXJISZnj2576HeyLBj4WTeX+I7PwWeRkbOa0mVX39K13SCGxCgOFuKj2ytm9qTlLOmXe4cdEnroteFtJfw==} + '@aws-sdk/credential-provider-ini@3.972.19': + resolution: {integrity: sha512-pVJVjWqVrPqjpFq7o0mCmeZu1Y0c94OCHSYgivdCD2wfmYVtBbwQErakruhgOD8pcMcx9SCqRw1pzHKR7OGBcA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.18': - resolution: {integrity: sha512-kINzc5BBxdYBkPZ0/i1AMPMOk5b5QaFNbYMElVw5QTX13AKj6jcxnv/YNl9oW9mg+Y08ti19hh01HhyEAxsSJQ==} + '@aws-sdk/credential-provider-login@3.972.19': + resolution: {integrity: sha512-jOXdZ1o+CywQKr6gyxgxuUmnGwTTnY2Kxs1PM7fI6AYtDWDnmW/yKXayNqkF8KjP1unflqMWKVbVt5VgmE3L0g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.19': - resolution: {integrity: sha512-yDWQ9dFTr+IMxwanFe7+tbN5++q8psZBjlUwOiCXn1EzANoBgtqBwcpYcHaMGtn0Wlfj4NuXdf2JaEx1lz5RaQ==} + '@aws-sdk/credential-provider-node@3.972.20': + resolution: {integrity: sha512-0xHca2BnPY0kzjDYPH7vk8YbfdBPpWVS67rtqQMalYDQUCBYS37cZ55K6TuFxCoIyNZgSCFrVKr9PXC5BVvQQw==} engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-process@3.972.17': resolution: {integrity: sha512-c8G8wT1axpJDgaP3xzcy+q8Y1fTi9A2eIQJvyhQ9xuXrUZhlCfXbC0vM9bM1CUXiZppFQ1p7g0tuUMvil/gCPg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.18': - resolution: {integrity: sha512-YHYEfj5S2aqInRt5ub8nDOX8vAxgMvd84wm2Y3WVNfFa/53vOv9T7WOAqXI25qjj3uEcV46xxfqdDQk04h5XQA==} + '@aws-sdk/credential-provider-sso@3.972.19': + resolution: {integrity: sha512-kVjQsEU3b///q7EZGrUzol9wzwJFKbEzqJKSq82A9ShrUTEO7FNylTtby3sPV19ndADZh1H3FB3+5ZrvKtEEeg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.18': - resolution: {integrity: sha512-OqlEQpJ+J3T5B96qtC1zLLwkBloechP+fezKbCH0sbd2cCc0Ra55XpxWpk/hRj69xAOYtHvoC4orx6eTa4zU7g==} + '@aws-sdk/credential-provider-web-identity@3.972.19': + resolution: {integrity: sha512-BV1BlTFdG4w4tAihxN7iXDBoNcNewXD4q8uZlNQiUrnqxwGWUhKHODIQVSPlQGxXClEj+63m+cqZskw+ESmeZg==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.972.7': @@ -583,8 +583,8 @@ packages: resolution: {integrity: sha512-3kNTLtpUdeahxtnJRnj/oIdLAUdzTfr9N40KtxNhtdrq+Q1RPMdCJINRXq37m4t5+r3H70wgC3opW46OzFcZYA==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.996.8': - resolution: {integrity: sha512-6HlLm8ciMW8VzfB80kfIx16PBA9lOa9Dl+dmCBi78JDhvGlx3I7Rorwi5PpVRkL31RprXnYna3yBf6UKkD/PqA==} + '@aws-sdk/nested-clients@3.996.9': + resolution: {integrity: sha512-+RpVtpmQbbtzFOKhMlsRcXM/3f1Z49qTOHaA8gEpHOYruERmog6f2AUtf/oTRLCWjR9H2b3roqryV/hI7QMW8w==} engines: {node: '>=20.0.0'} '@aws-sdk/region-config-resolver@3.972.7': @@ -595,8 +595,8 @@ packages: resolution: {integrity: sha512-mYhh7FY+7OOqjkYkd6+6GgJOsXK1xBWmuR+c5mxJPj2kr5TBNeZq+nUvE9kANWAux5UxDVrNOSiEM/wlHzC3Lg==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1005.0': - resolution: {integrity: sha512-vMxd+ivKqSxU9bHx5vmAlFKDAkjGotFU56IOkDa5DaTu1WWwbcse0yFHEm9I537oVvodaiwMl3VBwgHfzQ2rvw==} + '@aws-sdk/token-providers@3.1008.0': + resolution: {integrity: sha512-TulwlHQBWcJs668kNUDMZHN51DeLrDsYT59Ux4a/nbvr025gM6HjKJJ3LvnZccam7OS/ZKUVkWomCneRQKJbBg==} engines: {node: '>=20.0.0'} '@aws-sdk/types@3.973.5': @@ -618,8 +618,8 @@ packages: '@aws-sdk/util-user-agent-browser@3.972.7': resolution: {integrity: sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw==} - '@aws-sdk/util-user-agent-node@3.973.5': - resolution: {integrity: sha512-Dyy38O4GeMk7UQ48RupfHif//gqnOPbq/zlvRssc11E2mClT+aUfc3VS2yD8oLtzqO3RsqQ9I3gOBB4/+HjPOw==} + '@aws-sdk/util-user-agent-node@3.973.6': + resolution: {integrity: sha512-iF7G0prk7AvmOK64FcLvc/fW+Ty1H+vttajL7PvJFReU8urMxfYmynTTuFKDTA76Wgpq3FzTPKwabMQIXQHiXQ==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1316,14 +1316,14 @@ packages: '@kevisual/ai@0.0.19': resolution: {integrity: sha512-AFc8m6OcHZNxCb88bvzhvwWTZ4EVYyPupBzPUsLKLpdNBvsqm9TRboKCM2brJj2cqHnm+H+RbAk9AcGJkYhRCA==} - '@kevisual/ai@0.0.27': - resolution: {integrity: sha512-1FlDg3Tj4171XY5NpTq+do69CyACgDE5oTA1RJYxQlGgaPeAjx2V2ahBgIDHRRhMSX/ztB1pBF1rx4zDoXq99A==} + '@kevisual/ai@0.0.28': + resolution: {integrity: sha512-GLwCNXfopDvOj+hEZwEIwOV2/3VGd+TCPgBClaYuAv30KzhgehlCW05HPjBducSg+uPcdKacEzZsecHjo5fMUQ==} '@kevisual/api@0.0.28': resolution: {integrity: sha512-WQluRlu2qGM1qktIhPLODie8x382a6jEMfFOcay/rnkCgXK0BRpnqOKwlX7IMLdMqka7GY/BD69kSMnK1Exf5g==} - '@kevisual/api@0.0.62': - resolution: {integrity: sha512-GB8Ho2absXoXoZP2GKyuoRqRqjdwtV0JR512DXBaKJR2sIPn1KvuglbBiX+zPjDBBskv/ApvZKOoSwj1OmkrKQ==} + '@kevisual/api@0.0.64': + resolution: {integrity: sha512-y7wP8ucvi/rflVGd6uJpvuEUTwI7wMef8+ITQzv4flg7a2pwWZYe/DT0TOyaqDAqKOTlXaVIdBeI15jXuUxIIg==} '@kevisual/app@0.0.1': resolution: {integrity: sha512-PEx8P3l0iNSqrz9Ib9kVCYfqNMX6/LfNu+cEafmY6ECP1cV5Vmv+TH2fuasMosKjtbH2fAdDi97sbd29tdEK+g==} @@ -1334,8 +1334,8 @@ packages: '@kevisual/auth@2.0.3': resolution: {integrity: sha512-4xpijaIhlCTr/DlJaV/gmkCQeg45EO1yxWpRvUX+1jCdVbuxSR0wZrF0SD9oybnjmKWMKDNPLsXyduFjMGcItA==} - '@kevisual/cnb@0.0.42': - resolution: {integrity: sha512-eVrTB2kFNaTYFkDx3U7TSdlFKitu+m8wCUCGZoDgH92q0diQI2Gy+Tcaw4NwMtxszPDvd0tzeRwxp+9wDcLdWQ==} + '@kevisual/cnb@0.0.43': + resolution: {integrity: sha512-KgqlxtKqJomnRSPg7n5mAOj/CP0pqbzam6vbUvzJzsMg9uWWKiyCqr202+QbVCBXmfDFBV/38kjgllUZJCRAyg==} hasBin: true '@kevisual/context@0.0.4': @@ -1399,11 +1399,8 @@ packages: '@kevisual/router@0.0.51': resolution: {integrity: sha512-i9qYBeS/um78oC912oWJD3iElB+5NTKyTrz1Hzf4DckiUFnjLL81UPwjIh5I2l9+ul0IZ/Pxx+sFSF99fJkzKg==} - '@kevisual/router@0.0.90': - resolution: {integrity: sha512-pFNfjsJkN9NqSVuyQB6QjvJnBeyrR/JQrM/KPa+PtvkByp0UA2FFFtSbB/OX7rduEKcXg5GImm4yucqFLdzewQ==} - - '@kevisual/router@0.1.0': - resolution: {integrity: sha512-7NHoKP36uWkTDp/hxeUBMtawma91BrOAwG/caOrVsO8tM3wjqhlmCt0sIvLBM+snVJkmylROQR0WGaygd3JqYw==} + '@kevisual/router@0.1.1': + resolution: {integrity: sha512-+uaJc+Bf/T1mfxyfy9PmwuxJGPOLhVqrmsli2xUPqkkFvizrFIGB1vBTITuo5XP/FnwGqxgbjsitG57AMubm3w==} '@kevisual/types@0.0.12': resolution: {integrity: sha512-zJXH2dosir3jVrQ6QG4i0+iLQeT9gJ3H+cKXs8ReWboxBSYzUZO78XssVeVrFPsJ33iaAqo4q3DWbSS1dWGn7Q==} @@ -2553,8 +2550,8 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@25.4.0': - resolution: {integrity: sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==} + '@types/node@25.5.0': + resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} '@types/prismjs@1.26.5': resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} @@ -3072,6 +3069,9 @@ packages: dayjs@1.11.19: resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + dayjs@1.8.36: resolution: {integrity: sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==} @@ -5469,12 +5469,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.13(astro@5.16.15(@types/node@25.4.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2))': + '@astrojs/mdx@4.3.13(astro@5.16.15(@types/node@25.5.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2))': dependencies: '@astrojs/markdown-remark': 6.3.10 '@mdx-js/mdx': 3.1.1 acorn: 8.15.0 - astro: 5.16.15(@types/node@25.4.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2) + astro: 5.16.15(@types/node@25.5.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -5492,15 +5492,15 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/react@4.4.2(@types/node@25.4.0)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@astrojs/react@4.4.2(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2)) + '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) ultrahtml: 1.6.0 - vite: 6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2) transitivePeerDependencies: - '@types/node' - jiti @@ -5533,14 +5533,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/vue@5.1.4(@types/node@25.4.0)(astro@5.16.15(@types/node@25.4.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(vue@3.5.27(typescript@5.8.2))': + '@astrojs/vue@5.1.4(@types/node@25.5.0)(astro@5.16.15(@types/node@25.5.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(vue@3.5.27(typescript@5.8.2))': dependencies: - '@vitejs/plugin-vue': 5.2.4(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) - '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) + '@vitejs/plugin-vue': 5.2.4(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) + '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) '@vue/compiler-sfc': 3.5.27 - astro: 5.16.15(@types/node@25.4.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2) - vite: 6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2) - vite-plugin-vue-devtools: 7.7.9(rollup@4.57.1)(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) + astro: 5.16.15(@types/node@25.5.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2) + vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite-plugin-vue-devtools: 7.7.9(rollup@4.57.1)(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) vue: 3.5.27(typescript@5.8.2) transitivePeerDependencies: - '@nuxt/kit' @@ -5605,13 +5605,13 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.1006.0': + '@aws-sdk/client-s3@3.1008.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/core': 3.973.19 - '@aws-sdk/credential-provider-node': 3.972.19 + '@aws-sdk/credential-provider-node': 3.972.20 '@aws-sdk/middleware-bucket-endpoint': 3.972.7 '@aws-sdk/middleware-expect-continue': 3.972.7 '@aws-sdk/middleware-flexible-checksums': 3.973.5 @@ -5627,7 +5627,7 @@ snapshots: '@aws-sdk/types': 3.973.5 '@aws-sdk/util-endpoints': 3.996.4 '@aws-sdk/util-user-agent-browser': 3.972.7 - '@aws-sdk/util-user-agent-node': 3.973.5 + '@aws-sdk/util-user-agent-node': 3.973.6 '@smithy/config-resolver': 4.4.10 '@smithy/core': 3.23.9 '@smithy/eventstream-serde-browser': 4.2.11 @@ -5707,16 +5707,16 @@ snapshots: '@smithy/util-stream': 4.5.17 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.972.18': + '@aws-sdk/credential-provider-ini@3.972.19': dependencies: '@aws-sdk/core': 3.973.19 '@aws-sdk/credential-provider-env': 3.972.17 '@aws-sdk/credential-provider-http': 3.972.19 - '@aws-sdk/credential-provider-login': 3.972.18 + '@aws-sdk/credential-provider-login': 3.972.19 '@aws-sdk/credential-provider-process': 3.972.17 - '@aws-sdk/credential-provider-sso': 3.972.18 - '@aws-sdk/credential-provider-web-identity': 3.972.18 - '@aws-sdk/nested-clients': 3.996.8 + '@aws-sdk/credential-provider-sso': 3.972.19 + '@aws-sdk/credential-provider-web-identity': 3.972.19 + '@aws-sdk/nested-clients': 3.996.9 '@aws-sdk/types': 3.973.5 '@smithy/credential-provider-imds': 4.2.11 '@smithy/property-provider': 4.2.11 @@ -5726,10 +5726,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.972.18': + '@aws-sdk/credential-provider-login@3.972.19': dependencies: '@aws-sdk/core': 3.973.19 - '@aws-sdk/nested-clients': 3.996.8 + '@aws-sdk/nested-clients': 3.996.9 '@aws-sdk/types': 3.973.5 '@smithy/property-provider': 4.2.11 '@smithy/protocol-http': 5.3.11 @@ -5739,14 +5739,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.972.19': + '@aws-sdk/credential-provider-node@3.972.20': dependencies: '@aws-sdk/credential-provider-env': 3.972.17 '@aws-sdk/credential-provider-http': 3.972.19 - '@aws-sdk/credential-provider-ini': 3.972.18 + '@aws-sdk/credential-provider-ini': 3.972.19 '@aws-sdk/credential-provider-process': 3.972.17 - '@aws-sdk/credential-provider-sso': 3.972.18 - '@aws-sdk/credential-provider-web-identity': 3.972.18 + '@aws-sdk/credential-provider-sso': 3.972.19 + '@aws-sdk/credential-provider-web-identity': 3.972.19 '@aws-sdk/types': 3.973.5 '@smithy/credential-provider-imds': 4.2.11 '@smithy/property-provider': 4.2.11 @@ -5765,11 +5765,11 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.18': + '@aws-sdk/credential-provider-sso@3.972.19': dependencies: '@aws-sdk/core': 3.973.19 - '@aws-sdk/nested-clients': 3.996.8 - '@aws-sdk/token-providers': 3.1005.0 + '@aws-sdk/nested-clients': 3.996.9 + '@aws-sdk/token-providers': 3.1008.0 '@aws-sdk/types': 3.973.5 '@smithy/property-provider': 4.2.11 '@smithy/shared-ini-file-loader': 4.4.6 @@ -5778,10 +5778,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.18': + '@aws-sdk/credential-provider-web-identity@3.972.19': dependencies: '@aws-sdk/core': 3.973.19 - '@aws-sdk/nested-clients': 3.996.8 + '@aws-sdk/nested-clients': 3.996.9 '@aws-sdk/types': 3.973.5 '@smithy/property-provider': 4.2.11 '@smithy/shared-ini-file-loader': 4.4.6 @@ -5885,7 +5885,7 @@ snapshots: '@smithy/util-retry': 4.2.11 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.996.8': + '@aws-sdk/nested-clients@3.996.9': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 @@ -5898,7 +5898,7 @@ snapshots: '@aws-sdk/types': 3.973.5 '@aws-sdk/util-endpoints': 3.996.4 '@aws-sdk/util-user-agent-browser': 3.972.7 - '@aws-sdk/util-user-agent-node': 3.973.5 + '@aws-sdk/util-user-agent-node': 3.973.6 '@smithy/config-resolver': 4.4.10 '@smithy/core': 3.23.9 '@smithy/fetch-http-handler': 5.3.13 @@ -5945,10 +5945,10 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1005.0': + '@aws-sdk/token-providers@3.1008.0': dependencies: '@aws-sdk/core': 3.973.19 - '@aws-sdk/nested-clients': 3.996.8 + '@aws-sdk/nested-clients': 3.996.9 '@aws-sdk/types': 3.973.5 '@smithy/property-provider': 4.2.11 '@smithy/shared-ini-file-loader': 4.4.6 @@ -5985,12 +5985,13 @@ snapshots: bowser: 2.13.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.973.5': + '@aws-sdk/util-user-agent-node@3.973.6': dependencies: '@aws-sdk/middleware-user-agent': 3.972.20 '@aws-sdk/types': 3.973.5 '@smithy/node-config-provider': 4.3.11 '@smithy/types': 4.13.0 + '@smithy/util-config-provider': 4.2.2 tslib: 2.8.1 '@aws-sdk/xml-builder@3.972.10': @@ -6491,122 +6492,122 @@ snapshots: '@inquirer/ansi@2.0.3': {} - '@inquirer/checkbox@5.1.0(@types/node@25.4.0)': + '@inquirer/checkbox@5.1.0(@types/node@25.5.0)': dependencies: '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.5(@types/node@25.4.0) + '@inquirer/core': 11.1.5(@types/node@25.5.0) '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.4.0) + '@inquirer/type': 4.0.3(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/confirm@6.0.8(@types/node@25.4.0)': + '@inquirer/confirm@6.0.8(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.4.0) - '@inquirer/type': 4.0.3(@types/node@25.4.0) + '@inquirer/core': 11.1.5(@types/node@25.5.0) + '@inquirer/type': 4.0.3(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/core@11.1.5(@types/node@25.4.0)': + '@inquirer/core@11.1.5(@types/node@25.5.0)': dependencies: '@inquirer/ansi': 2.0.3 '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.4.0) + '@inquirer/type': 4.0.3(@types/node@25.5.0) cli-width: 4.1.0 fast-wrap-ansi: 0.2.0 mute-stream: 3.0.0 signal-exit: 4.1.0 optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/editor@5.0.8(@types/node@25.4.0)': + '@inquirer/editor@5.0.8(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.4.0) - '@inquirer/external-editor': 2.0.3(@types/node@25.4.0) - '@inquirer/type': 4.0.3(@types/node@25.4.0) + '@inquirer/core': 11.1.5(@types/node@25.5.0) + '@inquirer/external-editor': 2.0.3(@types/node@25.5.0) + '@inquirer/type': 4.0.3(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/expand@5.0.8(@types/node@25.4.0)': + '@inquirer/expand@5.0.8(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.4.0) - '@inquirer/type': 4.0.3(@types/node@25.4.0) + '@inquirer/core': 11.1.5(@types/node@25.5.0) + '@inquirer/type': 4.0.3(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/external-editor@2.0.3(@types/node@25.4.0)': + '@inquirer/external-editor@2.0.3(@types/node@25.5.0)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@inquirer/figures@2.0.3': {} - '@inquirer/input@5.0.8(@types/node@25.4.0)': + '@inquirer/input@5.0.8(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.4.0) - '@inquirer/type': 4.0.3(@types/node@25.4.0) + '@inquirer/core': 11.1.5(@types/node@25.5.0) + '@inquirer/type': 4.0.3(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/number@4.0.8(@types/node@25.4.0)': + '@inquirer/number@4.0.8(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.4.0) - '@inquirer/type': 4.0.3(@types/node@25.4.0) + '@inquirer/core': 11.1.5(@types/node@25.5.0) + '@inquirer/type': 4.0.3(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/password@5.0.8(@types/node@25.4.0)': + '@inquirer/password@5.0.8(@types/node@25.5.0)': dependencies: '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.5(@types/node@25.4.0) - '@inquirer/type': 4.0.3(@types/node@25.4.0) + '@inquirer/core': 11.1.5(@types/node@25.5.0) + '@inquirer/type': 4.0.3(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/prompts@8.3.0(@types/node@25.4.0)': + '@inquirer/prompts@8.3.0(@types/node@25.5.0)': dependencies: - '@inquirer/checkbox': 5.1.0(@types/node@25.4.0) - '@inquirer/confirm': 6.0.8(@types/node@25.4.0) - '@inquirer/editor': 5.0.8(@types/node@25.4.0) - '@inquirer/expand': 5.0.8(@types/node@25.4.0) - '@inquirer/input': 5.0.8(@types/node@25.4.0) - '@inquirer/number': 4.0.8(@types/node@25.4.0) - '@inquirer/password': 5.0.8(@types/node@25.4.0) - '@inquirer/rawlist': 5.2.4(@types/node@25.4.0) - '@inquirer/search': 4.1.4(@types/node@25.4.0) - '@inquirer/select': 5.1.0(@types/node@25.4.0) + '@inquirer/checkbox': 5.1.0(@types/node@25.5.0) + '@inquirer/confirm': 6.0.8(@types/node@25.5.0) + '@inquirer/editor': 5.0.8(@types/node@25.5.0) + '@inquirer/expand': 5.0.8(@types/node@25.5.0) + '@inquirer/input': 5.0.8(@types/node@25.5.0) + '@inquirer/number': 4.0.8(@types/node@25.5.0) + '@inquirer/password': 5.0.8(@types/node@25.5.0) + '@inquirer/rawlist': 5.2.4(@types/node@25.5.0) + '@inquirer/search': 4.1.4(@types/node@25.5.0) + '@inquirer/select': 5.1.0(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/rawlist@5.2.4(@types/node@25.4.0)': + '@inquirer/rawlist@5.2.4(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.4.0) - '@inquirer/type': 4.0.3(@types/node@25.4.0) + '@inquirer/core': 11.1.5(@types/node@25.5.0) + '@inquirer/type': 4.0.3(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/search@4.1.4(@types/node@25.4.0)': + '@inquirer/search@4.1.4(@types/node@25.5.0)': dependencies: - '@inquirer/core': 11.1.5(@types/node@25.4.0) + '@inquirer/core': 11.1.5(@types/node@25.5.0) '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.4.0) + '@inquirer/type': 4.0.3(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/select@5.1.0(@types/node@25.4.0)': + '@inquirer/select@5.1.0(@types/node@25.5.0)': dependencies: '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.5(@types/node@25.4.0) + '@inquirer/core': 11.1.5(@types/node@25.5.0) '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.4.0) + '@inquirer/type': 4.0.3(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/type@4.0.3(@types/node@25.4.0)': + '@inquirer/type@4.0.3(@types/node@25.5.0)': optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@ioredis/commands@1.5.0': optional: true @@ -6640,7 +6641,7 @@ snapshots: '@kevisual/permission': 0.0.3 '@kevisual/query': 0.0.31 - '@kevisual/ai@0.0.27': + '@kevisual/ai@0.0.28': dependencies: '@ai-sdk/anthropic': 3.0.58(zod@4.3.6) '@ai-sdk/openai': 3.0.41(zod@4.3.6) @@ -6661,10 +6662,10 @@ snapshots: fuse.js: 7.1.0 nanoid: 5.1.6 - '@kevisual/api@0.0.62(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@kevisual/api@0.0.64(@types/react@19.2.10)(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/js-filter': 0.0.6 '@kevisual/load': 0.0.6 '@paralleldrive/cuid2': 3.3.0 es-toolkit: 1.45.1 @@ -6709,11 +6710,12 @@ snapshots: '@kevisual/auth@2.0.3': {} - '@kevisual/cnb@0.0.42(dotenv@17.3.1)(idb-keyval@6.2.2)(ioredis@5.9.3)': + '@kevisual/cnb@0.0.43(dotenv@17.3.1)(idb-keyval@6.2.2)(ioredis@5.9.3)': dependencies: '@kevisual/query': 0.0.53 - '@kevisual/router': 0.0.90 + '@kevisual/router': 0.1.1 '@kevisual/use-config': 1.0.30(dotenv@17.3.1) + '@opencode-ai/sdk': 1.2.24 es-toolkit: 1.45.1 nanoid: 5.1.6 unstorage: 1.17.4(idb-keyval@6.2.2)(ioredis@5.9.3(supports-color@10.2.2)) @@ -6861,11 +6863,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@kevisual/router@0.0.90': - dependencies: - es-toolkit: 1.45.1 - - '@kevisual/router@0.1.0': + '@kevisual/router@0.1.1': dependencies: es-toolkit: 1.45.1 @@ -6889,7 +6887,7 @@ snapshots: '@kevisual/use-config': 1.0.30(dotenv@17.3.1) '@kevisual/video': 0.0.2 crypto-js: 4.2.0 - dayjs: 1.11.19 + dayjs: 1.11.20 eventemitter3: 5.0.4 nanoid: 5.1.6 transitivePeerDependencies: @@ -8125,12 +8123,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - '@tailwindcss/vite@4.1.18(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2))': + '@tailwindcss/vite@4.1.18(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2) '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -8163,7 +8161,7 @@ snapshots: '@types/busboy@1.5.4': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/crypto-js@4.2.2': {} @@ -8190,7 +8188,7 @@ snapshots: '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 0.7.34 - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/mdast@4.0.4': dependencies: @@ -8210,7 +8208,7 @@ snapshots: '@types/node@17.0.45': {} - '@types/node@25.4.0': + '@types/node@25.5.0': dependencies: undici-types: 7.18.2 @@ -8228,13 +8226,13 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/semver@7.7.1': {} '@types/send@1.2.1': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/trusted-types@2.0.7': {} @@ -8244,7 +8242,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@uiw/copy-to-clipboard@1.0.19': {} @@ -8285,7 +8283,7 @@ snapshots: '@vercel/oidc@3.1.0': {} - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -8293,24 +8291,24 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@4.2.0(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2))': + '@vitejs/plugin-vue-jsx@4.2.0(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) '@rolldown/pluginutils': 1.0.0-beta.55 '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) - vite: 6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2) vue: 3.5.27(typescript@5.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2))': + '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2))': dependencies: - vite: 6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2) vue: 3.5.27(typescript@5.8.2) '@vue/babel-helper-vue-transform-on@1.5.0': {} @@ -8372,14 +8370,14 @@ snapshots: '@vue/compiler-dom': 3.5.27 '@vue/shared': 3.5.27 - '@vue/devtools-core@7.7.9(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2))': + '@vue/devtools-core@7.7.9(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2))': dependencies: '@vue/devtools-kit': 7.7.9 '@vue/devtools-shared': 7.7.9 mitt: 3.0.1 nanoid: 5.1.6 pathe: 2.0.3 - vite-hot-client: 2.1.0(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2)) + vite-hot-client: 2.1.0(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2)) vue: 3.5.27(typescript@5.8.2) transitivePeerDependencies: - vite @@ -8553,7 +8551,7 @@ snapshots: astring@1.9.0: {} - astro@5.16.15(@types/node@25.4.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2): + astro@5.16.15(@types/node@25.5.0)(idb-keyval@6.2.2)(ioredis@5.9.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.2): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -8610,8 +8608,8 @@ snapshots: unist-util-visit: 5.0.0 unstorage: 1.17.4(idb-keyval@6.2.2)(ioredis@5.9.3(supports-color@10.2.2)) vfile: 6.0.3 - vite: 6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2)) + vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -8716,7 +8714,7 @@ snapshots: bun-types@1.3.10: dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 bundle-name@4.1.0: dependencies: @@ -8906,6 +8904,8 @@ snapshots: dayjs@1.11.19: {} + dayjs@1.11.20: {} + dayjs@1.8.36: {} debug@3.2.7(supports-color@10.2.2): @@ -11454,11 +11454,11 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-hot-client@2.1.0(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2)): + vite-hot-client@2.1.0(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2)): dependencies: - vite: 6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2) - vite-plugin-inspect@0.8.9(rollup@4.57.1)(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2)): + vite-plugin-inspect@0.8.9(rollup@4.57.1)(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.3.0(rollup@4.57.1) @@ -11469,28 +11469,28 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 3.0.2 - vite: 6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2) transitivePeerDependencies: - rollup - supports-color - vite-plugin-vue-devtools@7.7.9(rollup@4.57.1)(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)): + vite-plugin-vue-devtools@7.7.9(rollup@4.57.1)(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)): dependencies: - '@vue/devtools-core': 7.7.9(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) + '@vue/devtools-core': 7.7.9(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) '@vue/devtools-kit': 7.7.9 '@vue/devtools-shared': 7.7.9 execa: 9.6.1 sirv: 3.0.2 - vite: 6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2) - vite-plugin-inspect: 0.8.9(rollup@4.57.1)(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2)) - vite-plugin-vue-inspector: 5.3.2(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2)) + vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite-plugin-inspect: 0.8.9(rollup@4.57.1)(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2)) + vite-plugin-vue-inspector: 5.3.2(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.3.2(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2)): + vite-plugin-vue-inspector@5.3.2(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2)): dependencies: '@babel/core': 7.28.5 '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.5) @@ -11501,11 +11501,11 @@ snapshots: '@vue/compiler-dom': 3.5.27 kolorist: 1.8.0 magic-string: 0.30.21 - vite: 6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2) transitivePeerDependencies: - supports-color - vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2): + vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -11514,14 +11514,14 @@ snapshots: rollup: 4.43.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 - vitefu@1.1.1(vite@6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2)): + vitefu@1.1.1(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2)): optionalDependencies: - vite: 6.4.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.30.2) vizion@2.2.1: dependencies: