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`.
This commit is contained in:
xiongxiao
2026-03-13 04:04:47 +08:00
committed by cnb
parent bd0ce0058e
commit 8d85e83418
11 changed files with 440 additions and 335 deletions

View File

@@ -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",

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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({

View File

@@ -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;
}

View File

@@ -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<OpencodeClient> {
const client = createOpencodeClient({
baseUrl: `http://localhost:${port}`,

View File

@@ -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 })
}

View File

@@ -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();

View File

@@ -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",

398
pnpm-lock.yaml generated
View File

@@ -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: