diff --git a/.npmrc b/.npmrc index 7446745..c230925 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,3 @@ //npm.xiongxiao.me/:_authToken=${ME_NPM_TOKEN} +//npm.cnb.cool/kevisual/registry/-/packages/:_authToken=${CNB_API_KEY} //registry.npmjs.org/:_authToken=${NPM_TOKEN} \ No newline at end of file diff --git a/assistant/bun.config.mjs b/assistant/bun.config.mjs index a7a7974..3632c3a 100644 --- a/assistant/bun.config.mjs +++ b/assistant/bun.config.mjs @@ -6,7 +6,7 @@ import fs from 'node:fs'; // bun run src/index.ts -- import { fileURLToPath } from 'node:url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const external = ['pm2', '@kevisual/hot-api', '@nut-tree-fork/nut-js']; +const external = ['pm2', '@kevisual/hot-api', '@nut-tree-fork/nut-js', 'bun']; /** * * @param {string} p diff --git a/assistant/package.json b/assistant/package.json index d13edd3..f8bccd1 100644 --- a/assistant/package.json +++ b/assistant/package.json @@ -10,7 +10,7 @@ ], "author": "abearxiong (https://www.xiongxiao.me)", "license": "MIT", - "packageManager": "pnpm@10.26.2", + "packageManager": "pnpm@10.28.0", "type": "module", "files": [ "dist", @@ -41,18 +41,18 @@ } }, "devDependencies": { - "@kevisual/ai": "^0.0.19", + "@kevisual/ai": "^0.0.20", "@kevisual/load": "^0.0.6", "@kevisual/local-app-manager": "^0.1.32", "@kevisual/logger": "^0.0.4", - "@kevisual/query": "0.0.33", + "@kevisual/query": "0.0.35", "@kevisual/query-login": "0.0.7", - "@kevisual/router": "^0.0.52", - "@kevisual/types": "^0.0.10", - "@kevisual/use-config": "^1.0.21", - "@types/bun": "^1.3.5", + "@kevisual/router": "^0.0.55", + "@kevisual/types": "^0.0.11", + "@kevisual/use-config": "^1.0.28", + "@types/bun": "^1.3.6", "@types/lodash-es": "^4.17.12", - "@types/node": "^25.0.3", + "@types/node": "^25.0.9", "@types/send": "^1.2.1", "@types/ws": "^8.18.1", "chalk": "^5.6.2", @@ -61,7 +61,7 @@ "dayjs": "^1.11.19", "dotenv": "^17.2.3", "get-port": "^7.1.0", - "inquirer": "^13.1.0", + "inquirer": "^13.2.0", "lodash-es": "^4.17.22", "nanoid": "^5.1.6", "send": "^1.2.1", @@ -76,7 +76,7 @@ "access": "public" }, "dependencies": { - "@aws-sdk/client-s3": "^3.969.0", + "@aws-sdk/client-s3": "^3.970.0", "@kevisual/ha-api": "^0.0.6", "@kevisual/oss": "^0.0.16", "@kevisual/video-tools": "^0.0.13", @@ -84,6 +84,6 @@ "lowdb": "^7.0.1", "lru-cache": "^11.2.4", "pm2": "^6.0.14", - "unstorage": "^1.17.3" + "unstorage": "^1.17.4" } } \ No newline at end of file diff --git a/assistant/src/app.ts b/assistant/src/app.ts index b35dc43..eda8228 100644 --- a/assistant/src/app.ts +++ b/assistant/src/app.ts @@ -1,6 +1,6 @@ import { App } from '@kevisual/router'; +import { SimpleRouter } from '@kevisual/router/simple' // import { App } from '@kevisual/router/src/app.ts'; -import { HttpsPem } from '@/module/assistant/https/sign.ts'; // import { AssistantConfig } from '@/module/assistant/index.ts'; import { AssistantInit, parseHomeArg } from '@/services/init/index.ts'; import { configDir as HomeConfigDir } from '@/module/assistant/config/index.ts'; @@ -21,8 +21,6 @@ export const assistantQuery = useContextKey('assistantQuery', () => { return new AssistantQuery(assistantConfig); }); -const httpsPem = new HttpsPem(assistantConfig); - export const runtime = useContextKey('runtime', () => { return { type: 'client', @@ -32,36 +30,22 @@ export const runtime = useContextKey('runtime', () => { export const app: App = useContextKey('app', () => { const init = isInit; if (init) { - const config = assistantConfig.getConfig(); - - if (config?.https?.type !== 'https') { - console.log('http模式', 'http'); - return new App({ - serverOptions: { - path: '/client/router', - httpType: 'http', - cors: { - origin: '*', - }, - io: true + return new App({ + serverOptions: { + path: '/client/router', + httpType: 'http', + cors: { + origin: '*', }, - }); - } - } - return new App({ - serverOptions: { - path: '/client/router', - httpType: 'https', - httpsCert: httpsPem.cert, - httpsKey: httpsPem.key, - cors: { - origin: '*', + io: true }, - io: true - }, - }); + }); + } }); +export const simpleRouter = useContextKey('simpleRouter', () => { + return new SimpleRouter(); +}); app.route({ path: 'router', diff --git a/assistant/src/module/assistant/config/index.ts b/assistant/src/module/assistant/config/index.ts index 5775103..e0ceb6f 100644 --- a/assistant/src/module/assistant/config/index.ts +++ b/assistant/src/module/assistant/config/index.ts @@ -155,15 +155,6 @@ export type AssistantConfigData = { * share 是对外共享 pages 目录下的页面 */ auth?: AuthPermission; - /** - * HTTPS 证书配置, 启用后,助手服务会启用 HTTPS 服务, 默认 HTTP - * 理论上也不需要https,因为可以通过反向代理实现https - */ - https?: { - type?: 'https' | 'http'; - keyPath?: string; // 证书私钥路径 - certPath?: string; // 证书路径 - }; }; let assistantConfig: AssistantConfigData; type AssistantConfigOptions = { diff --git a/assistant/src/module/assistant/https/sign.ts b/assistant/src/module/assistant/https/sign.ts deleted file mode 100644 index 6cf1454..0000000 --- a/assistant/src/module/assistant/https/sign.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { createCert } from '@kevisual/router/sign'; -import path from 'node:path'; -import fs from 'node:fs'; -import { AssistantConfig } from '../config/index.ts'; -import { checkFileExists } from '../file/index.ts'; -import { chalk } from '@/module/chalk.ts'; -import dayjs from 'dayjs'; - -type Attributes = { - name: string; - value: string; -}; -type AltNames = { - type: number; - value?: string; - ip?: string; -}; -export class HttpsPem { - assistantConfig: AssistantConfig; - key: string; - cert: string; - isHttps = false; - constructor(assistantConfig: AssistantConfig) { - this.assistantConfig = assistantConfig; - this.#initKeyCert(); - } - #initKeyCert() { - this.assistantConfig.checkMounted(); - const config = this.assistantConfig.getConfig(); - if (config.https) { - const httpsType = config.https?.type || 'https'; - if (httpsType !== 'https') { - // console.log(chalk.yellow('当前配置文件 https.type 不是 https, 不使用证书')); - return; - } - this.isHttps = true; - if (config.https.keyPath) { - const keyPath = config.https.keyPath; - const certPath = config.https.certPath; - if (checkFileExists(keyPath) && checkFileExists(certPath)) { - this.key = fs.readFileSync(keyPath, 'utf-8'); - this.cert = fs.readFileSync(certPath, 'utf-8'); - console.log(chalk.green('使用配置文件 https.keyPath 和 https.certPath 的证书'), keyPath, certPath); - return; - } else { - console.log(chalk.red('证书路径不存在,请检查配置文件 https.keyPath 和 https.certPath 是否正确')); - } - } - } - if(!this.isHttps) return; - const { key, cert } = this.getCert(); - this.key = key; - this.cert = cert; - } - getPemDir() { - const configDir = this.assistantConfig.configPath?.configDir || process.cwd(); - const pemDir = path.join(configDir, 'pem'); - if (!checkFileExists(pemDir)) { - fs.mkdirSync(pemDir, { recursive: true }); - } - return pemDir; - } - getCert() { - if (!this.assistantConfig.init) return; - const pemDir = this.getPemDir(); - const pemPath = { - key: path.join(pemDir, 'https-private-key.pem'), - cert: path.join(pemDir, 'https-cert.pem'), - config: path.join(pemDir, 'https-config.json'), - }; - const writeCreate = (opts: { key: string; cert: string; data: { createTime: number; expireTime: number } }) => { - fs.writeFileSync(pemPath.key, opts.key); - fs.writeFileSync(pemPath.cert, opts.cert); - fs.writeFileSync(pemPath.config, JSON.stringify(opts.data, null, 2)); - }; - if (!checkFileExists(pemPath.key) || !checkFileExists(pemPath.cert)) { - const { key, cert, data } = this.createCert(); - writeCreate({ key, cert, data }); - console.log(chalk.green('证书创建成功,浏览器需要导入当前证书')); - return { - key, - cert, - }; - } - - if (!checkFileExists(pemPath.config)) { - const data = this.createExpireData(); - fs.writeFileSync(pemPath.config, JSON.stringify(data, null, 2)); - } - const key = fs.readFileSync(pemPath.key, 'utf-8'); - const cert = fs.readFileSync(pemPath.cert, 'utf-8'); - const config = fs.readFileSync(pemPath.config, 'utf-8'); - let expireTime = 0; - try { - const data = JSON.parse(config); - expireTime = data.expireTime; - if (typeof expireTime !== 'number') { - throw new Error('expireTime is not a number'); - } - } catch (error) { - console.log(chalk.red('证书配置文件损坏,重新生成证书')); - } - const now = new Date().getTime(); - if (now > expireTime) { - this.removeCert(); - const { key, cert, data } = this.createCert(); - writeCreate({ key, cert, data }); - console.log(chalk.green('证书更新成功, 浏览器需要重新导入当前证书')); - return { - key, - cert, - }; - } - return { - key, - cert, - }; - } - createExpireData() { - const expireTime = new Date().getTime() + 365 * 24 * 60 * 60 * 1000; - const expireDate = dayjs(expireTime).format('YYYY-MM-DD HH:mm:ss'); - return { - description: '手动导入证书到浏览器, https-cert.pem文件, 具体使用教程访问 https://kevisual.cn/root/pem-docs/', - createTime: new Date().getTime(), - expireDate, - expireTime, - }; - } - /* - * 重新生成证书 - */ - removeCert() { - const pemDir = this.getPemDir(); - const pemPath = { - key: path.join(pemDir, 'https-private-key.pem'), - cert: path.join(pemDir, 'https-cert.pem'), - }; - const oldPath = { - key: path.join(pemDir, 'https-private-key.pem.bak'), - cert: path.join(pemDir, 'https-cert.pem.bak'), - }; - if (checkFileExists(pemPath.key)) { - fs.renameSync(pemPath.key, oldPath.key); - } - if (checkFileExists(pemPath.cert)) { - fs.renameSync(pemPath.cert, oldPath.cert); - } - } - /* - * 创建证书 - * @param attrs 证书属性 - * @param altNames 证书备用名称 - */ - createCert(attrs?: Attributes[], altNames?: AltNames[]) { - const attributes = attrs || []; - const altNamesList = altNames || []; - const { key, cert } = createCert( - [ - { - name: 'commonName', - value: 'localhost', - }, - { - name: 'organizationName', - value: 'kevisual', - }, - ...attributes, - ], - altNamesList, - ); - const data = this.createExpireData(); - return { - key, - cert, - data: { - ...data, - }, - }; - } -} diff --git a/assistant/src/module/assistant/proxy/pipe.ts b/assistant/src/module/assistant/proxy/pipe.ts index f3f3bc4..800dc7b 100644 --- a/assistant/src/module/assistant/proxy/pipe.ts +++ b/assistant/src/module/assistant/proxy/pipe.ts @@ -2,7 +2,6 @@ import * as http from 'http'; import * as fs from 'fs'; import { isBun } from './utils.ts'; import { Readable } from 'stream'; - /** * 文件流管道传输函数 * 将指定文件的内容通过流的方式传输给客户端响应 @@ -112,4 +111,17 @@ export const pipeProxyReq = async (req: http.IncomingMessage, proxyReq: http.Cli // Node.js标准环境下直接使用pipe进行流传输 req.pipe(proxyReq, { end: true }); } +} + + +export const pipeBusboy = async (req: http.IncomingMessage, res: http.ServerResponse, busboy: any) => { + if (isBun) { + // @ts-ignore + const bunRequest = req.bun.request; + const arrayBuffer = await bunRequest.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + busboy.end(buffer); + } else { + req.pipe(busboy); + } } \ No newline at end of file diff --git a/assistant/src/routes-simple/index.ts b/assistant/src/routes-simple/index.ts new file mode 100644 index 0000000..05ade16 --- /dev/null +++ b/assistant/src/routes-simple/index.ts @@ -0,0 +1,216 @@ + +// import Busboy from 'busboy'; +// import { simpleRouter } from '../app.ts' +// import http from 'http'; +// import path from 'path'; +// import { createWriteStream } from 'fs'; + +// import { checkAuth } from '@/routes/index.ts'; +// import { pipeBusboy } from '@/module/assistant/proxy/pipe.ts'; +// simpleRouter.get('/client/upload', async (req, res) => { +// if (res.headersSent) return; // 如果响应已发送,不再处理 +// res.writeHead(200, { 'Content-Type': 'application/json' }); +// res.end(JSON.stringify({ message: 'Upload endpoint reached' })); +// }) +// export const error = (msg: string, code = 500) => { +// return JSON.stringify({ code, message: msg }); +// }; +// export const parseIfJson = (data = '{}') => { +// try { +// const _data = JSON.parse(data); +// if (typeof _data === 'object') return _data; +// return {}; +// } catch (error) { +// return {}; +// } +// }; +// const uploadResources = async (req: http.IncomingMessage, res: http.ServerResponse) => { +// const { tokenUser, token } = await checkAuth(req, res); +// if (!tokenUser) { +// res.end(error('Token is invalid.')); +// return; +// } +// const url = new URL(req.url || '', 'http://localhost'); +// const share = !!url.searchParams.get('public'); +// const meta = parseIfJson(url.searchParams.get('meta')); +// const noCheckAppFiles = !!url.searchParams.get('noCheckAppFiles'); +// // 使用 busboy 解析 multipart/form-data +// const busboy = Busboy({ headers: req.headers, preservePath: true }); +// const fields: any = {}; +// const files: any[] = []; +// const filePromises: Promise[] = []; +// let bytesReceived = 0; +// let bytesExpected = parseInt(req.headers['content-length'] || '0'); +// busboy.on('field', (fieldname, value) => { +// fields[fieldname] = value; +// }); + +// busboy.on('file', (fieldname, fileStream, info) => { +// const { filename, encoding, mimeType } = info; +// const tempPath = path.join(cacheFilePath, `${Date.now()}-${Math.random().toString(36).substring(7)}`); +// const writeStream = createWriteStream(tempPath); +// const filePromise = new Promise((resolve, reject) => { +// fileStream.on('data', (chunk) => { +// bytesReceived += chunk.length; +// if (bytesExpected > 0) { +// const progress = (bytesReceived / bytesExpected) * 100; +// const data = { +// progress: progress.toFixed(2), +// message: `Upload progress: ${progress.toFixed(2)}%`, +// }; +// console.log('progress-upload', data); +// writeEvents(req, data); +// } +// }); + +// fileStream.pipe(writeStream); + +// writeStream.on('finish', () => { +// files.push({ +// filepath: tempPath, +// originalFilename: filename, +// mimetype: mimeType, +// }); +// resolve(); +// }); + +// writeStream.on('error', (err) => { +// reject(err); +// }); +// }); + +// filePromises.push(filePromise); +// }); + +// busboy.on('finish', async () => { +// // 等待所有文件写入完成 +// try { +// await Promise.all(filePromises); +// } catch (err) { +// logger.error(`File write error: ${err.message}`); +// res.end(error(`File write error: ${err.message}`)); +// return; +// } +// const clearFiles = () => { +// files.forEach((file) => { +// if (file?.filepath && fs.existsSync(file.filepath)) { +// fs.unlinkSync(file.filepath); +// } +// }); +// }; + +// // 检查是否有文件上传 +// if (files.length === 0) { +// res.end(error('files is required')); +// return; +// } + +// let { appKey, version, username, directory, description } = getKey(fields, ['appKey', 'version', 'username', 'directory', 'description']); +// let uid = tokenUser.id; +// if (username) { +// const user = await User.getUserByToken(token); +// const has = await user.hasUser(username, true); +// if (!has) { +// res.end(error('username is not found')); +// clearFiles(); +// return; +// } +// const _user = await User.findOne({ where: { username } }); +// uid = _user?.id || ''; +// } +// if (!appKey || !version) { +// const config = await ConfigModel.getUploadConfig({ uid }); +// if (config) { +// appKey = config.config?.data?.key || ''; +// version = config.config?.data?.version || ''; +// } +// } +// if (!appKey || !version) { +// res.end(error('appKey or version is not found, please check the upload config.')); +// clearFiles(); +// return; +// } +// const { code, message } = validateDirectory(directory); +// if (code !== 200) { +// res.end(error(message)); +// clearFiles(); +// return; +// } +// // 逐个处理每个上传的文件 +// const uploadedFiles = files; +// logger.info( +// 'upload files', +// uploadedFiles.map((item) => { +// return pick(item, ['filepath', 'originalFilename']); +// }), +// ); +// const uploadResults = []; +// for (let i = 0; i < uploadedFiles.length; i++) { +// const file = uploadedFiles[i]; +// // @ts-ignore +// const tempPath = file.filepath; // 文件上传时的临时路径 +// const relativePath = file.originalFilename; // 保留表单中上传的文件名 (包含文件夹结构) +// // 比如 child2/b.txt +// const minioPath = `${username || tokenUser.username}/${appKey}/${version}${directory ? `/${directory}` : ''}/${relativePath}`; +// // 上传到 MinIO 并保留文件夹结构 +// const isHTML = relativePath.endsWith('.html'); +// const metadata: any = {}; +// if (share) { +// metadata.share = 'public'; +// } +// Object.assign(metadata, meta); +// await minioClient.fPutObject(bucketName, minioPath, tempPath, { +// 'Content-Type': getContentType(relativePath), +// 'app-source': 'user-app', +// 'Cache-Control': isHTML ? 'no-cache' : 'max-age=31536000, immutable', // 缓存一年 +// ...metadata, +// }); +// uploadResults.push({ +// name: relativePath, +// path: minioPath, +// }); +// fs.unlinkSync(tempPath); // 删除临时文件 +// } +// if (!noCheckAppFiles) { +// const _data = { appKey, version, username, files: uploadResults, description, } +// if (_data.description) { +// delete _data.description; +// } +// // 受控 +// const r = await app.call({ +// path: 'app', +// key: 'uploadFiles', +// payload: { +// token: token, +// data: _data, +// }, +// }); +// const data: any = { +// code: r.code, +// data: { +// app: r.body, +// upload: uploadResults, +// }, +// }; +// if (r.message) { +// data.message = r.message; +// } +// console.log('upload data', data); +// res.writeHead(200, { 'Content-Type': 'application/json' }); +// res.end(JSON.stringify(data)); +// } else { +// res.writeHead(200, { 'Content-Type': 'application/json' }); +// res.end( +// JSON.stringify({ +// code: 200, +// data: { +// detect: [], +// upload: uploadResults, +// }, +// }), +// ); +// } +// }); + +// pipeBusboy(req, res, busboy); +// } \ No newline at end of file diff --git a/assistant/src/routes/index.ts b/assistant/src/routes/index.ts index 83d8053..5dc70ce 100644 --- a/assistant/src/routes/index.ts +++ b/assistant/src/routes/index.ts @@ -34,7 +34,7 @@ export const getTokenUserCache = async (token: string) => { } return res; } -const checkAuth = async (ctx: any, isAdmin = false) => { +export const checkAuth = async (ctx: any, isAdmin = false) => { const config = assistantConfig.getConfig(); const { auth = {} } = config; const token = ctx.query.token; diff --git a/assistant/src/server.ts b/assistant/src/server.ts index 57311d4..e4153b2 100644 --- a/assistant/src/server.ts +++ b/assistant/src/server.ts @@ -35,12 +35,11 @@ export const runServer = async (port: number = 51515, listenPath = '127.0.0.1') }); } else { app.listen(_port, listenPath, () => { - const protocol = assistantConfig.getHttps().protocol; let showListenPath = listenPath; if (listenPath === '::') { showListenPath = 'localhost'; } - console.log(`Server is running on ${protocol}://${showListenPath}:${_port}`); + console.log(`Server is running on ${'http'}://${showListenPath}:${_port}`); }); } app.server.on([{ diff --git a/assistant/src/services/init/index.ts b/assistant/src/services/init/index.ts index 23a6f9c..fa53a6a 100644 --- a/assistant/src/services/init/index.ts +++ b/assistant/src/services/init/index.ts @@ -2,7 +2,6 @@ import fs from 'node:fs'; import path from 'node:path'; import { checkFileExists, AssistantConfig, AssistantConfigData, parseHomeArg, parseHelpArg } from '@/module/assistant/index.ts'; import { chalk } from '@/module/chalk.ts'; -import { HttpsPem } from '@/module/assistant/https/sign.ts'; import { Query } from '@kevisual/query/query'; import { installDeps } from '@/module/npm-install.ts' export { parseHomeArg, parseHelpArg }; @@ -77,14 +76,6 @@ export class AssistantInit extends AssistantConfig { fs.writeFileSync(appsConfig, JSON.stringify({ description: 'apps manager.', list: [] })); console.log(chalk.green('助手应用配置文件 apps.json 创建成功')); } - // create pem dir // - const pemDir = path.join(this.configPath?.configDir, 'pem'); - const httpsPem = new HttpsPem(this); - if (httpsPem.isHttps) { - if (!checkFileExists(pemDir)) { - console.log(chalk.green('助手证书目录创建成功')); - } - } } createAssistantConfig() { const assistantPath = this.configPath?.configPath; @@ -218,11 +209,4 @@ export class AssistantInit extends AssistantConfig { }, } as AssistantConfigData; } - getHttps() { - const https = this.getConfig()?.https || {}; - return { - https, - protocol: https?.type === 'https' ? 'https' : 'http', - }; - } } diff --git a/bun.config.mjs b/bun.config.mjs index 5021491..32523bb 100644 --- a/bun.config.mjs +++ b/bun.config.mjs @@ -3,6 +3,7 @@ // @ts-ignore import pkg from './package.json'; // bun run src/index.ts -- +const external = ['bun']; await Bun.build({ target: 'node', format: 'esm', @@ -11,9 +12,8 @@ await Bun.build({ naming: { entry: 'envision.js', }, - + external: external, define: { ENVISION_VERSION: JSON.stringify(pkg.version), }, - env: 'ENVISION_*', }); diff --git a/package.json b/package.json index 8d01e32..e2820d6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/cli", - "version": "0.0.80", + "version": "0.0.82", "description": "envision 命令行工具", "type": "module", "basename": "/root/cli", @@ -45,15 +45,17 @@ "@kevisual/app": "^0.0.2", "@kevisual/context": "^0.0.4", "@kevisual/hot-api": "^0.0.3", - "@kevisual/use-config": "^1.0.26", + "@kevisual/use-config": "^1.0.28", "@nut-tree-fork/nut-js": "^4.2.6", + "@types/busboy": "^1.5.4", + "busboy": "^1.6.0", "eventemitter3": "^5.0.1", "lowdb": "^7.0.1", "lru-cache": "^11.2.4", "micromatch": "^4.0.8", "pm2": "^6.0.14", "semver": "^7.7.3", - "unstorage": "^1.17.3" + "unstorage": "^1.17.4" }, "devDependencies": { "@kevisual/dts": "^0.0.3", @@ -65,7 +67,7 @@ "@types/crypto-js": "^4.2.2", "@types/jsonwebtoken": "^9.0.10", "@types/micromatch": "^4.0.10", - "@types/node": "^25.0.8", + "@types/node": "^25.0.9", "@types/semver": "^7.7.1", "chalk": "^5.6.2", "commander": "^14.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12d91e4..7b79efb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@inquirer/prompts': specifier: ^8.2.0 - version: 8.2.0(@types/node@25.0.8) + version: 8.2.0(@types/node@25.0.9) '@kevisual/app': specifier: ^0.0.2 version: 0.0.2(dotenv@17.2.3) @@ -21,11 +21,17 @@ importers: specifier: ^0.0.3 version: 0.0.3(dotenv@17.2.3) '@kevisual/use-config': - specifier: ^1.0.26 - version: 1.0.26(dotenv@17.2.3) + specifier: ^1.0.28 + version: 1.0.28(dotenv@17.2.3) '@nut-tree-fork/nut-js': specifier: ^4.2.6 version: 4.2.6 + '@types/busboy': + specifier: ^1.5.4 + version: 1.5.4 + busboy: + specifier: ^1.6.0 + version: 1.6.0 eventemitter3: specifier: ^5.0.1 version: 5.0.1 @@ -45,8 +51,8 @@ importers: specifier: ^7.7.3 version: 7.7.3 unstorage: - specifier: ^1.17.3 - version: 1.17.3(idb-keyval@6.2.2) + specifier: ^1.17.4 + version: 1.17.4(idb-keyval@6.2.2) devDependencies: '@kevisual/dts': specifier: ^0.0.3 @@ -76,8 +82,8 @@ importers: specifier: ^4.0.10 version: 4.0.10 '@types/node': - specifier: ^25.0.8 - version: 25.0.8 + specifier: ^25.0.9 + version: 25.0.9 '@types/semver': specifier: ^7.7.1 version: 7.7.1 @@ -115,8 +121,8 @@ importers: assistant: dependencies: '@aws-sdk/client-s3': - specifier: ^3.969.0 - version: 3.969.0 + specifier: ^3.970.0 + version: 3.970.0 '@kevisual/ha-api': specifier: ^0.0.6 version: 0.0.6 @@ -139,12 +145,12 @@ importers: specifier: ^6.0.14 version: 6.0.14(supports-color@10.2.2) unstorage: - specifier: ^1.17.3 - version: 1.17.3(idb-keyval@6.2.2) + specifier: ^1.17.4 + version: 1.17.4(idb-keyval@6.2.2) devDependencies: '@kevisual/ai': - specifier: ^0.0.19 - version: 0.0.19 + specifier: ^0.0.20 + version: 0.0.20 '@kevisual/load': specifier: ^0.0.6 version: 0.0.6 @@ -155,29 +161,29 @@ importers: specifier: ^0.0.4 version: 0.0.4 '@kevisual/query': - specifier: 0.0.33 - version: 0.0.33 + specifier: 0.0.35 + version: 0.0.35 '@kevisual/query-login': specifier: 0.0.7 - version: 0.0.7(@kevisual/query@0.0.33) + version: 0.0.7(@kevisual/query@0.0.35) '@kevisual/router': - specifier: ^0.0.52 - version: 0.0.52(supports-color@10.2.2) + specifier: ^0.0.55 + version: 0.0.55 '@kevisual/types': - specifier: ^0.0.10 - version: 0.0.10 + specifier: ^0.0.11 + version: 0.0.11 '@kevisual/use-config': - specifier: ^1.0.21 - version: 1.0.21(dotenv@17.2.3) + specifier: ^1.0.28 + version: 1.0.28(dotenv@17.2.3) '@types/bun': - specifier: ^1.3.5 - version: 1.3.5 + specifier: ^1.3.6 + version: 1.3.6 '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 '@types/node': - specifier: ^25.0.3 - version: 25.0.3 + specifier: ^25.0.9 + version: 25.0.9 '@types/send': specifier: ^1.2.1 version: 1.2.1 @@ -203,8 +209,8 @@ importers: specifier: ^7.1.0 version: 7.1.0 inquirer: - specifier: ^13.1.0 - version: 13.1.0(@types/node@25.0.3) + specifier: ^13.2.0 + version: 13.2.0(@types/node@25.0.9) lodash-es: specifier: ^4.17.22 version: 4.17.22 @@ -228,16 +234,16 @@ importers: dependencies: '@astrojs/mdx': specifier: ^4.3.13 - version: 4.3.13(astro@5.16.6(@types/node@25.0.8)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2)) + version: 4.3.13(astro@5.16.6(@types/node@25.0.9)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2)) '@astrojs/react': specifier: ^4.4.2 - version: 4.4.2(@types/node@25.0.8)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 4.4.2(@types/node@25.0.9)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@astrojs/sitemap': specifier: ^3.6.0 version: 3.6.0 '@astrojs/vue': specifier: ^5.1.3 - version: 5.1.3(@types/node@25.0.8)(astro@5.16.6(@types/node@25.0.8)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(vue@3.5.26(typescript@5.8.2)) + version: 5.1.3(@types/node@25.0.9)(astro@5.16.6(@types/node@25.0.9)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(vue@3.5.26(typescript@5.8.2)) '@kevisual/api': specifier: ^0.0.5 version: 0.0.5 @@ -261,7 +267,7 @@ importers: version: 1.2.4(@types/react@19.2.7)(react@19.2.3) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2)) + version: 4.1.18(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)) '@uiw/react-md-editor': specifier: ^4.0.11 version: 4.0.11(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -270,7 +276,7 @@ importers: version: 6.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) astro: specifier: ^5.16.6 - version: 5.16.6(@types/node@25.0.8)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2) + version: 5.16.6(@types/node@25.0.9)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -444,52 +450,52 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.969.0': - resolution: {integrity: sha512-dd19qt9wCY60AS0gc7K+C26U1SdtJddn8DkwHu3psCuGaZ8r9EAKbHTNC53iLsYD5OVGsZ5bkHKQ/BjjbSyVTQ==} + '@aws-sdk/client-s3@3.970.0': + resolution: {integrity: sha512-mDC792KkFzLZG9PS1Fv9b18lEzmSNBjAdweLJ83D2CZu6ved9+Pr/Dr+FRs0kSxqY+sUUUuIBmvDYHXY8E8EzA==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sso@3.969.0': - resolution: {integrity: sha512-Qn0Uz6o15q2S+1E6OpwRKmaAMoT4LktEn+Oibk28qb2Mne+emaDawhZXahOJb/wFw5lN2FEH7XoiSNenNNUmCw==} + '@aws-sdk/client-sso@3.970.0': + resolution: {integrity: sha512-ArmgnOsSCXN5VyIvZb4kSP5hpqlRRHolrMtKQ/0N8Hw4MTb7/IeYHSZzVPNzzkuX6gn5Aj8txoUnDPM8O7pc9g==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.969.0': - resolution: {integrity: sha512-qqmQt4z5rEK1OYVkVkboWgy/58CC5QaQ7oy0tvLe3iri/mfZbgJkA+pkwQyRP827DfCBZ3W7Ki9iwSa+B2U7uQ==} + '@aws-sdk/core@3.970.0': + resolution: {integrity: sha512-klpzObldOq8HXzDjDlY6K8rMhYZU6mXRz6P9F9N+tWnjoYFfeBMra8wYApydElTUYQKP1O7RLHwH1OKFfKcqIA==} engines: {node: '>=20.0.0'} '@aws-sdk/crc64-nvme@3.969.0': resolution: {integrity: sha512-IGNkP54HD3uuLnrPCYsv3ZD478UYq+9WwKrIVJ9Pdi3hxPg8562CH3ZHf8hEgfePN31P9Kj+Zu9kq2Qcjjt61A==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.969.0': - resolution: {integrity: sha512-yS96heH5XDUqS3qQNcdObKKMOqZaivuNInMVRpRli48aXW8fX1M3fY67K/Onlqa3Wxu6WfDc3ZGF52SywdLvbg==} + '@aws-sdk/credential-provider-env@3.970.0': + resolution: {integrity: sha512-rtVzXzEtAfZBfh+lq3DAvRar4c3jyptweOAJR2DweyXx71QSMY+O879hjpMwES7jl07a3O1zlnFIDo4KP/96kQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.969.0': - resolution: {integrity: sha512-QCEFxBiUYFUW5VG6k8jKhT4luZndpC7uUY4u1olwt+OnJrl3N2yC7oS34isVBa3ioXZ4A0YagbXTa/3mXUhlAA==} + '@aws-sdk/credential-provider-http@3.970.0': + resolution: {integrity: sha512-CjDbWL7JxjLc9ZxQilMusWSw05yRvUJKRpz59IxDpWUnSMHC9JMMUUkOy5Izk8UAtzi6gupRWArp4NG4labt9Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.969.0': - resolution: {integrity: sha512-lsXyTDkUrZPxjr0XruZrqdcHY9zHcIuoY3TOCQEm23VTc8Np2BenTtjGAIexkL3ar69K4u3FVLQroLpmFxeXqA==} + '@aws-sdk/credential-provider-ini@3.970.0': + resolution: {integrity: sha512-L5R1hN1FY/xCmH65DOYMXl8zqCFiAq0bAq8tJZU32mGjIl1GzGeOkeDa9c461d81o7gsQeYzXyqFD3vXEbJ+kQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.969.0': - resolution: {integrity: sha512-bIRFDf54qIUFFLTZNYt40d6EseNeK9w80dHEs7BVEAWoS23c9+MSqkdg/LJBBK9Kgy01vRmjiedfBZN+jGypLw==} + '@aws-sdk/credential-provider-login@3.970.0': + resolution: {integrity: sha512-C+1dcLr+p2E+9hbHyvrQTZ46Kj4vC2RoP6N935GEukHQa637ZjXs8VlyHJ2xTvbvwwLZQNiu56Cx7o/OFOqw1A==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.969.0': - resolution: {integrity: sha512-lImMjcy/5SGDIBk7PFJCqFO4rFuapKCvo1z2PidD3Cbz2D7wsJnyqUNQIp5Ix0Xc3/uAYG9zXI9kgaMf1dspIQ==} + '@aws-sdk/credential-provider-node@3.970.0': + resolution: {integrity: sha512-nMM0eeVuiLtw1taLRQ+H/H5Qp11rva8ILrzAQXSvlbDeVmbc7d8EeW5Q2xnCJu+3U+2JNZ1uxqIL22pB2sLEMA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.969.0': - resolution: {integrity: sha512-2qQkM0rwd8Hl9nIHtUaqT8Z/djrulovqx/wBHsbRKaISwc2fiT3De1Lk1jx34Jzrz/dTHAMJJi+cML1N4Lk3kw==} + '@aws-sdk/credential-provider-process@3.970.0': + resolution: {integrity: sha512-0XeT8OaT9iMA62DFV9+m6mZfJhrD0WNKf4IvsIpj2Z7XbaYfz3CoDDvNoALf3rPY9NzyMHgDxOspmqdvXP00mw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.969.0': - resolution: {integrity: sha512-JHqXw9Ct3dtZB86/zGFJYWyodr961GyIrqTBhV0brrZFPvcinM9abDSK58jt6GNBM2lqfMCvXL6I4ahNsMdkrg==} + '@aws-sdk/credential-provider-sso@3.970.0': + resolution: {integrity: sha512-ROb+Aijw8nzkB14Nh2XRH861++SeTZykUzk427y8YtgTLxjAOjgDTchDUFW2Fx6GFWkSjqJ3sY7SZyb33IqyFw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.969.0': - resolution: {integrity: sha512-mKCZtqrs3ts3YmIjT4NFlYgT2Oe6syW0nX5m2l7iyrFrLXw26Zo3rx29DjGzycPdJHZZvsIy5y6yqChDuF65ng==} + '@aws-sdk/credential-provider-web-identity@3.970.0': + resolution: {integrity: sha512-r7tnYJJg+B6QvnsRHSW5vDol+ks6n+5jBZdCFdGyK63hjcMRMqHx59zEH8O47UR1PFv5hS2Q3uGz6HXvVtP40Q==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.969.0': @@ -500,8 +506,8 @@ packages: resolution: {integrity: sha512-qXygzSi8osok7tH9oeuS3HoKw6jRfbvg5Me/X5RlHOvSSqQz8c5O9f3MjUApaCUSwbAU92KrbZWasw2PKiaVHg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.969.0': - resolution: {integrity: sha512-RKpo76qcHhQkSgu+wJNvwio8MzMD7ScwBaMCQhJfqzFTrhhlKtMkf8oxhBRRYU7rat368p35h6CbfxM18g/WNQ==} + '@aws-sdk/middleware-flexible-checksums@3.970.0': + resolution: {integrity: sha512-mlKLwX0jWa5EwIvMjJAvVFL/zLAxB/fNLOg4hQCNCUf1qi+XxD+brDopXNPWeA8bSCnpvWfZrQd5yNksG6Fzqg==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-host-header@3.969.0': @@ -520,32 +526,32 @@ packages: resolution: {integrity: sha512-2r3PuNquU3CcS1Am4vn/KHFwLi8QFjMdA/R+CRDXT4AFO/0qxevF/YStW3gAKntQIgWgQV8ZdEtKAoJvLI4UWg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.969.0': - resolution: {integrity: sha512-xjcyZrbtvVaqkmjkhmqX+16Wf7zFVS/cYnNFu/JyG6ekkIxSXEAjptNwSEDzlAiLzf0Hf6dYj5erLZYGa40eWg==} + '@aws-sdk/middleware-sdk-s3@3.970.0': + resolution: {integrity: sha512-v/Y5F1lbFFY7vMeG5yYxuhnn0CAshz6KMxkz1pDyPxejNE9HtA0w8R6OTBh/bVdIm44QpjhbI7qeLdOE/PLzXQ==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-ssec@3.969.0': resolution: {integrity: sha512-9wUYtd5ye4exygKHyl02lPVHUoAFlxxXoqvlw7u2sycfkK6uHLlwdsPru3MkMwj47ZSZs+lkyP/sVKXVMhuaAg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.969.0': - resolution: {integrity: sha512-Y6WkW8QQ2X9jG9HNBWyzp5KlJOCtLqX8VIvGLoGc2wXdZH7dgOy62uFhkfnHbgfiel6fkNYaycjGx/yyxi0JLQ==} + '@aws-sdk/middleware-user-agent@3.970.0': + resolution: {integrity: sha512-dnSJGGUGSFGEX2NzvjwSefH+hmZQ347AwbLhAsi0cdnISSge+pcGfOFrJt2XfBIypwFe27chQhlfuf/gWdzpZg==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.969.0': - resolution: {integrity: sha512-MJrejgODxVYZjQjSpPLJkVuxnbrue1x1R8+as3anT5V/wk9Qc/Pf5B1IFjM3Ak6uOtzuRYNY4auOvcg4U8twDA==} + '@aws-sdk/nested-clients@3.970.0': + resolution: {integrity: sha512-RIl8s4DCa31MXtRFw23iU90OqEoWuwQxiZOZshzsPtjyrunhHFjyZJEqb+vuQcYd1o22SMaYa3lPJRp64OH35Q==} engines: {node: '>=20.0.0'} '@aws-sdk/region-config-resolver@3.969.0': resolution: {integrity: sha512-scj9OXqKpcjJ4jsFLtqYWz3IaNvNOQTFFvEY8XMJXTv+3qF5I7/x9SJtKzTRJEBF3spjzBUYPtGFbs9sj4fisQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.969.0': - resolution: {integrity: sha512-pv8BEQOlUzK+ww8ZfXZOnDzLfPO5+O7puBFtU1fE8CdCAQ/RP/B1XY3hxzW9Xs0dax7graYKnY8wd8ooYy7vBw==} + '@aws-sdk/signature-v4-multi-region@3.970.0': + resolution: {integrity: sha512-z3syXfuK/x/IsKf/AeYmgc2NT7fcJ+3fHaGO+fkghkV9WEba3fPyOwtTBX4KpFMNb2t50zDGZwbzW1/5ighcUQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.969.0': - resolution: {integrity: sha512-ucs6QczPkvGinbGmhMlPCQnagGJ+xsM6itsSWlJzxo9YsP6jR75cBU8pRdaM7nEbtCDnrUHf8W9g3D2Hd9mgVA==} + '@aws-sdk/token-providers@3.970.0': + resolution: {integrity: sha512-YO8KgJecxHIFMhfoP880q51VXFL9V1ELywK5yzVEqzyrwqoG93IUmnTygBUylQrfkbH+QqS0FxEdgwpP3fcwoQ==} engines: {node: '>=20.0.0'} '@aws-sdk/types@3.969.0': @@ -556,8 +562,8 @@ packages: resolution: {integrity: sha512-gqqvYcitIIM2K4lrDX9de9YvOfXBcVdxfT/iLnvHJd4YHvSXlt+gs+AsL4FfPCxG4IG9A+FyulP9Sb1MEA75vw==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.969.0': - resolution: {integrity: sha512-H2x2UwYiA1pHg40jE+OCSc668W9GXRShTiCWy1UPKtZKREbQ63Mgd7NAj+bEMsZUSCdHywqmSsLqKM9IcqQ3Bg==} + '@aws-sdk/util-endpoints@3.970.0': + resolution: {integrity: sha512-TZNZqFcMUtjvhZoZRtpEGQAdULYiy6rcGiXAbLU7e9LSpIYlRqpLa207oMNfgbzlL2PnHko+eVg8rajDiSOYCg==} engines: {node: '>=20.0.0'} '@aws-sdk/util-locate-window@3.965.2': @@ -567,8 +573,8 @@ packages: '@aws-sdk/util-user-agent-browser@3.969.0': resolution: {integrity: sha512-bpJGjuKmFr0rA6UKUCmN8D19HQFMLXMx5hKBXqBlPFdalMhxJSjcxzX9DbQh0Fn6bJtxCguFmRGOBdQqNOt49g==} - '@aws-sdk/util-user-agent-node@3.969.0': - resolution: {integrity: sha512-D11ZuXNXdUMv8XTthMx+LPzkYNQAeQ68FnCTGnFLgLpnR8hVTeZMBBKjQ77wYGzWDk/csHKdCy697gU1On5KjA==} + '@aws-sdk/util-user-agent-node@3.970.0': + resolution: {integrity: sha512-TNQpwIVD6SxMwkD+QKnaujKVyXy5ljN3O3jrI7nCHJ3GlJu5xJrd8yuBnanYCcrn3e2zwdfOh4d4zJAZvvIvVw==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1097,10 +1103,6 @@ packages: cpu: [x64] os: [win32] - '@inquirer/ansi@2.0.2': - resolution: {integrity: sha512-SYLX05PwJVnW+WVegZt1T4Ip1qba1ik+pNJPDiqvk6zS5Y/i8PhRzLpGEtVd7sW0G8cMtkD8t4AZYhQwm8vnww==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - '@inquirer/ansi@2.0.3': resolution: {integrity: sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -1123,15 +1125,6 @@ packages: '@types/node': optional: true - '@inquirer/core@11.1.0': - resolution: {integrity: sha512-+jD/34T1pK8M5QmZD/ENhOfXdl9Zr+BrQAUc5h2anWgi7gggRq15ZbiBeLoObj0TLbdgW7TAIQRU2boMc9uOKQ==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/core@11.1.1': resolution: {integrity: sha512-hV9o15UxX46OyQAtaoMqAOxGR8RVl1aZtDx1jHbCtSJy1tBdTfKxLPKf7utsE4cRy4tcmCQ4+vdV+ca+oNxqNA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -1168,10 +1161,6 @@ packages: '@types/node': optional: true - '@inquirer/figures@2.0.2': - resolution: {integrity: sha512-qXm6EVvQx/FmnSrCWCIGtMHwqeLgxABP8XgcaAoywsL0NFga9gD5kfG0gXiv80GjK9Hsoz4pgGwF/+CjygyV9A==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - '@inquirer/figures@2.0.3': resolution: {integrity: sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -1239,15 +1228,6 @@ packages: '@types/node': optional: true - '@inquirer/type@4.0.2': - resolution: {integrity: sha512-cae7mzluplsjSdgFA6ACLygb5jC8alO0UUnFPyu0E7tNRPrL+q/f8VcSXp+cjZQ7l5CMpDpi2G1+IQvkOiL1Lw==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/type@4.0.3': resolution: {integrity: sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -1455,6 +1435,9 @@ packages: '@kevisual/ai@0.0.19': resolution: {integrity: sha512-AFc8m6OcHZNxCb88bvzhvwWTZ4EVYyPupBzPUsLKLpdNBvsqm9TRboKCM2brJj2cqHnm+H+RbAk9AcGJkYhRCA==} + '@kevisual/ai@0.0.20': + resolution: {integrity: sha512-RW4a1T8XbIaonjp4ndt+5YIVeHR9O+pAzZZ1dWeYIlqQXvDuJdHSVukOh4ohgFS0tyEPzCr39seFeb6Y0YNzkw==} + '@kevisual/api@0.0.5': resolution: {integrity: sha512-5pBu0aSeUeKZM037OgihVzoBfBFqEvywcRo66I51AwGF9/h2xP4PuFqOM7Kqp3KWL+USH8kyEwgwSdJ+FCb5RQ==} @@ -1536,19 +1519,17 @@ packages: '@kevisual/router@0.0.51': resolution: {integrity: sha512-i9qYBeS/um78oC912oWJD3iElB+5NTKyTrz1Hzf4DckiUFnjLL81UPwjIh5I2l9+ul0IZ/Pxx+sFSF99fJkzKg==} - '@kevisual/router@0.0.52': - resolution: {integrity: sha512-Qiv3P1XjzD813Tm79S+atrDb2eickGCI9tuy/aCu512LcoYYJqZhwwkeT4ES0DinnA13Ckqd43QWBR6UmuYkHQ==} + '@kevisual/router@0.0.55': + resolution: {integrity: sha512-DVhXbbUCfSWWXsp1id1HBrkGiMZ6nFUBD1/C5E7IpLE5B32w7sv2xjKUt98OriFl0uyuneMEIZuZsAQaKplQ5g==} '@kevisual/types@0.0.10': resolution: {integrity: sha512-Q73uzzjk9UidumnmCvOpgzqDDvQxsblz22bIFuoiioUFJWwaparx8bpd8ArRyFojicYL1YJoFDzDZ9j9NN8grA==} - '@kevisual/use-config@1.0.21': - resolution: {integrity: sha512-czgy4+tBDBJI6QTnKh2PCwswET6ZpZ4ZqBE/SPkkOivEtlrcPzLs5elwMLZ3goD1XMD4VB3yjumb5WuW/8H8MA==} - peerDependencies: - dotenv: ^17 + '@kevisual/types@0.0.11': + resolution: {integrity: sha512-idNLDTEKVdNXZHFQq8PTN62nflh94kvGtx+v8YDcMxt0Zo+HWVZTFElm+dMQxAs/vn4wo8F2r3VwzWNX/vcqwQ==} - '@kevisual/use-config@1.0.26': - resolution: {integrity: sha512-e5jgEALn4Pb5ReXnqVkK0XyQdRXLyciqmLFY7XVDyXCu7ieh6gxDCb41rsSfBj5ofpG8jH6afOlgWqt2A4BcWg==} + '@kevisual/use-config@1.0.28': + resolution: {integrity: sha512-ngF+LDbjxpXWrZNmnShIKF/jPpAa+ezV+DcgoZIIzHlRnIjE+rr9sLkN/B7WJbiH9C/j1tQXOILY8ujBqILrow==} peerDependencies: dotenv: ^17 @@ -2212,8 +2193,8 @@ packages: resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.20.5': - resolution: {integrity: sha512-0Tz77Td8ynHaowXfOdrD0F1IH4tgWGUhwmLwmpFyTbr+U9WHXNNp9u/k2VjBXGnSe7BwjBERRpXsokGTXzNjhA==} + '@smithy/core@3.20.6': + resolution: {integrity: sha512-BpAffW1mIyRZongoKBbh3RgHG+JDHJek/8hjA/9LnPunM+ejorO6axkxCgwxCe4K//g/JdPeR9vROHDYr/hfnQ==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.2.8': @@ -2276,12 +2257,12 @@ packages: resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.6': - resolution: {integrity: sha512-dpq3bHqbEOBqGBjRVHVFP3eUSPpX0BYtg1D5d5Irgk6orGGAuZfY22rC4sErhg+ZfY/Y0kPqm1XpAmDZg7DeuA==} + '@smithy/middleware-endpoint@4.4.7': + resolution: {integrity: sha512-SCmhUG1UwtnEhF5Sxd8qk7bJwkj1BpFzFlHkXqKCEmDPLrRjJyTGM0EhqT7XBtDaDJjCfjRJQodgZcKDR843qg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.22': - resolution: {integrity: sha512-vwWDMaObSMjw6WCC/3Ae9G7uul5Sk95jr07CDk1gkIMpaDic0phPS1MpVAZ6+YkF7PAzRlpsDjxPwRlh/S11FQ==} + '@smithy/middleware-retry@4.4.23': + resolution: {integrity: sha512-lLEmkQj7I7oKfvZ1wsnToGJouLOtfkMXDKRA1Hi6F+mMp5O1N8GcVWmVeNgTtgZtd0OTXDTI2vpVQmeutydGew==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.9': @@ -2328,8 +2309,8 @@ packages: resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.10.7': - resolution: {integrity: sha512-Uznt0I9z3os3Z+8pbXrOSCTXCA6vrjyN7Ub+8l2pRDum44vLv8qw0qGVkJN0/tZBZotaEFHrDPKUoPNueTr5Vg==} + '@smithy/smithy-client@4.10.8': + resolution: {integrity: sha512-wcr3UEL26k7lLoyf9eVDZoD1nNY3Fa1gbNuOXvfxvVWLGkOVW+RYZgUUp/bXHryJfycIOQnBq9o1JAE00ax8HQ==} engines: {node: '>=18.0.0'} '@smithy/types@4.12.0': @@ -2364,12 +2345,12 @@ packages: resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.21': - resolution: {integrity: sha512-DtmVJarzqtjghtGjCw/PFJolcJkP7GkZgy+hWTAN3YLXNH+IC82uMoMhFoC3ZtIz5mOgCm5+hOGi1wfhVYgrxw==} + '@smithy/util-defaults-mode-browser@4.3.22': + resolution: {integrity: sha512-O2WXr6ZRqPnbyoepb7pKcLt1QL6uRfFzGYJ9sGb5hMJQi7v/4RjRmCQa9mNjA0YiXqsc5lBmLXqJPhjM1Vjv5A==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.24': - resolution: {integrity: sha512-JelBDKPAVswVY666rezBvY6b0nF/v9TXjUbNwDNAyme7qqKYEX687wJv0uze8lBIZVbg30wlWnlYfVSjjpKYFA==} + '@smithy/util-defaults-mode-node@4.2.25': + resolution: {integrity: sha512-7uMhppVNRbgNIpyUBVRfjGHxygP85wpXalRvn9DvUlCx4qgy1AB/uxOPSiDx/jFyrwD3/BypQhx1JK7f3yxrAw==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.2.8': @@ -2526,12 +2507,12 @@ packages: '@types/braces@3.0.5': resolution: {integrity: sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w==} - '@types/bun@1.3.5': - resolution: {integrity: sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w==} - '@types/bun@1.3.6': resolution: {integrity: sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA==} + '@types/busboy@1.5.4': + resolution: {integrity: sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw==} + '@types/crypto-js@4.2.2': resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} @@ -2583,11 +2564,8 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@25.0.3': - resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} - - '@types/node@25.0.8': - resolution: {integrity: sha512-powIePYMmC3ibL0UJ2i2s0WIbq6cg6UyVFQxSCpaPxxzAaziRfimGivjdF943sSGV6RADVbk0Nvlm5P/FB44Zg==} + '@types/node@25.0.9': + resolution: {integrity: sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==} '@types/prismjs@1.26.5': resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} @@ -2958,9 +2936,6 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bun-types@1.3.5: - resolution: {integrity: sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw==} - bun-types@1.3.6: resolution: {integrity: sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ==} @@ -2968,6 +2943,10 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + bytestreamjs@2.0.1: resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} engines: {node: '>=6.0.0'} @@ -3023,6 +3002,10 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -3705,6 +3688,9 @@ packages: h3@1.15.4: resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} + h3@1.15.5: + resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3863,8 +3849,8 @@ packages: inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} - inquirer@13.1.0: - resolution: {integrity: sha512-4vv4GS/9HLnn0radvmHlXUXiNkd2gYCBQ4U1rxZWBJDisu2Z06bzUM9CFU8pcu1vwuAQjo6O+CFiqCYNsEi6qQ==} + inquirer@13.2.0: + resolution: {integrity: sha512-4CBv58vLrL4CnMgrscW/T5cLvfWM2nRLevttTiZTQyku7YV7/pc2IKyABBU2rDfVl4PiIB0sTRcwOac7BIYKLA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -4512,6 +4498,9 @@ packages: node-mock-http@1.0.3: resolution: {integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==} + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -4856,6 +4845,10 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} @@ -5177,6 +5170,10 @@ packages: stream-replace-string@2.0.0: resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + streamx@2.23.0: resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} @@ -5378,6 +5375,9 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} @@ -5502,6 +5502,68 @@ packages: uploadthing: optional: true + unstorage@1.17.4: + resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -5860,12 +5922,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.13(astro@5.16.6(@types/node@25.0.8)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2))': + '@astrojs/mdx@4.3.13(astro@5.16.6(@types/node@25.0.9)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2))': dependencies: '@astrojs/markdown-remark': 6.3.10 '@mdx-js/mdx': 3.1.1 acorn: 8.15.0 - astro: 5.16.6(@types/node@25.0.8)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2) + astro: 5.16.6(@types/node@25.0.9)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -5883,15 +5945,15 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/react@4.4.2(@types/node@25.0.8)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@astrojs/react@4.4.2(@types/node@25.0.9)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2)) + '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) ultrahtml: 1.6.0 - vite: 6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2) transitivePeerDependencies: - '@types/node' - jiti @@ -5924,14 +5986,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/vue@5.1.3(@types/node@25.0.8)(astro@5.16.6(@types/node@25.0.8)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(vue@3.5.26(typescript@5.8.2))': + '@astrojs/vue@5.1.3(@types/node@25.0.9)(astro@5.16.6(@types/node@25.0.9)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(vue@3.5.26(typescript@5.8.2))': dependencies: - '@vitejs/plugin-vue': 5.2.1(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.8.2)) - '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.8.2)) + '@vitejs/plugin-vue': 5.2.1(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.8.2)) + '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.8.2)) '@vue/compiler-sfc': 3.5.25 - astro: 5.16.6(@types/node@25.0.8)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2) - vite: 6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2) - vite-plugin-vue-devtools: 7.7.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.8.2)) + astro: 5.16.6(@types/node@25.0.9)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2) + vite: 6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2) + vite-plugin-vue-devtools: 7.7.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.8.2)) vue: 3.5.26(typescript@5.8.2) transitivePeerDependencies: - '@nuxt/kit' @@ -5996,31 +6058,31 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.969.0': + '@aws-sdk/client-s3@3.970.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.969.0 - '@aws-sdk/credential-provider-node': 3.969.0 + '@aws-sdk/core': 3.970.0 + '@aws-sdk/credential-provider-node': 3.970.0 '@aws-sdk/middleware-bucket-endpoint': 3.969.0 '@aws-sdk/middleware-expect-continue': 3.969.0 - '@aws-sdk/middleware-flexible-checksums': 3.969.0 + '@aws-sdk/middleware-flexible-checksums': 3.970.0 '@aws-sdk/middleware-host-header': 3.969.0 '@aws-sdk/middleware-location-constraint': 3.969.0 '@aws-sdk/middleware-logger': 3.969.0 '@aws-sdk/middleware-recursion-detection': 3.969.0 - '@aws-sdk/middleware-sdk-s3': 3.969.0 + '@aws-sdk/middleware-sdk-s3': 3.970.0 '@aws-sdk/middleware-ssec': 3.969.0 - '@aws-sdk/middleware-user-agent': 3.969.0 + '@aws-sdk/middleware-user-agent': 3.970.0 '@aws-sdk/region-config-resolver': 3.969.0 - '@aws-sdk/signature-v4-multi-region': 3.969.0 + '@aws-sdk/signature-v4-multi-region': 3.970.0 '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-endpoints': 3.969.0 + '@aws-sdk/util-endpoints': 3.970.0 '@aws-sdk/util-user-agent-browser': 3.969.0 - '@aws-sdk/util-user-agent-node': 3.969.0 + '@aws-sdk/util-user-agent-node': 3.970.0 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.20.5 + '@smithy/core': 3.20.6 '@smithy/eventstream-serde-browser': 4.2.8 '@smithy/eventstream-serde-config-resolver': 4.3.8 '@smithy/eventstream-serde-node': 4.2.8 @@ -6031,21 +6093,21 @@ snapshots: '@smithy/invalid-dependency': 4.2.8 '@smithy/md5-js': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.6 - '@smithy/middleware-retry': 4.4.22 + '@smithy/middleware-endpoint': 4.4.7 + '@smithy/middleware-retry': 4.4.23 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.8 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.21 - '@smithy/util-defaults-mode-node': 4.2.24 + '@smithy/util-defaults-mode-browser': 4.3.22 + '@smithy/util-defaults-mode-node': 4.2.25 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -6056,41 +6118,41 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.969.0': + '@aws-sdk/client-sso@3.970.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.969.0 + '@aws-sdk/core': 3.970.0 '@aws-sdk/middleware-host-header': 3.969.0 '@aws-sdk/middleware-logger': 3.969.0 '@aws-sdk/middleware-recursion-detection': 3.969.0 - '@aws-sdk/middleware-user-agent': 3.969.0 + '@aws-sdk/middleware-user-agent': 3.970.0 '@aws-sdk/region-config-resolver': 3.969.0 '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-endpoints': 3.969.0 + '@aws-sdk/util-endpoints': 3.970.0 '@aws-sdk/util-user-agent-browser': 3.969.0 - '@aws-sdk/util-user-agent-node': 3.969.0 + '@aws-sdk/util-user-agent-node': 3.970.0 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.20.5 + '@smithy/core': 3.20.6 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.6 - '@smithy/middleware-retry': 4.4.22 + '@smithy/middleware-endpoint': 4.4.7 + '@smithy/middleware-retry': 4.4.23 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.8 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.21 - '@smithy/util-defaults-mode-node': 4.2.24 + '@smithy/util-defaults-mode-browser': 4.3.22 + '@smithy/util-defaults-mode-node': 4.2.25 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -6099,16 +6161,16 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.969.0': + '@aws-sdk/core@3.970.0': dependencies: '@aws-sdk/types': 3.969.0 '@aws-sdk/xml-builder': 3.969.0 - '@smithy/core': 3.20.5 + '@smithy/core': 3.20.6 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.8 '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 '@smithy/util-middleware': 4.2.8 @@ -6120,37 +6182,37 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.969.0': + '@aws-sdk/credential-provider-env@3.970.0': dependencies: - '@aws-sdk/core': 3.969.0 + '@aws-sdk/core': 3.970.0 '@aws-sdk/types': 3.969.0 '@smithy/property-provider': 4.2.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.969.0': + '@aws-sdk/credential-provider-http@3.970.0': dependencies: - '@aws-sdk/core': 3.969.0 + '@aws-sdk/core': 3.970.0 '@aws-sdk/types': 3.969.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/node-http-handler': 4.4.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.8 '@smithy/types': 4.12.0 '@smithy/util-stream': 4.5.10 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.969.0': + '@aws-sdk/credential-provider-ini@3.970.0': dependencies: - '@aws-sdk/core': 3.969.0 - '@aws-sdk/credential-provider-env': 3.969.0 - '@aws-sdk/credential-provider-http': 3.969.0 - '@aws-sdk/credential-provider-login': 3.969.0 - '@aws-sdk/credential-provider-process': 3.969.0 - '@aws-sdk/credential-provider-sso': 3.969.0 - '@aws-sdk/credential-provider-web-identity': 3.969.0 - '@aws-sdk/nested-clients': 3.969.0 + '@aws-sdk/core': 3.970.0 + '@aws-sdk/credential-provider-env': 3.970.0 + '@aws-sdk/credential-provider-http': 3.970.0 + '@aws-sdk/credential-provider-login': 3.970.0 + '@aws-sdk/credential-provider-process': 3.970.0 + '@aws-sdk/credential-provider-sso': 3.970.0 + '@aws-sdk/credential-provider-web-identity': 3.970.0 + '@aws-sdk/nested-clients': 3.970.0 '@aws-sdk/types': 3.969.0 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 @@ -6160,10 +6222,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.969.0': + '@aws-sdk/credential-provider-login@3.970.0': dependencies: - '@aws-sdk/core': 3.969.0 - '@aws-sdk/nested-clients': 3.969.0 + '@aws-sdk/core': 3.970.0 + '@aws-sdk/nested-clients': 3.970.0 '@aws-sdk/types': 3.969.0 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 @@ -6173,14 +6235,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.969.0': + '@aws-sdk/credential-provider-node@3.970.0': dependencies: - '@aws-sdk/credential-provider-env': 3.969.0 - '@aws-sdk/credential-provider-http': 3.969.0 - '@aws-sdk/credential-provider-ini': 3.969.0 - '@aws-sdk/credential-provider-process': 3.969.0 - '@aws-sdk/credential-provider-sso': 3.969.0 - '@aws-sdk/credential-provider-web-identity': 3.969.0 + '@aws-sdk/credential-provider-env': 3.970.0 + '@aws-sdk/credential-provider-http': 3.970.0 + '@aws-sdk/credential-provider-ini': 3.970.0 + '@aws-sdk/credential-provider-process': 3.970.0 + '@aws-sdk/credential-provider-sso': 3.970.0 + '@aws-sdk/credential-provider-web-identity': 3.970.0 '@aws-sdk/types': 3.969.0 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 @@ -6190,20 +6252,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.969.0': + '@aws-sdk/credential-provider-process@3.970.0': dependencies: - '@aws-sdk/core': 3.969.0 + '@aws-sdk/core': 3.970.0 '@aws-sdk/types': 3.969.0 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.969.0': + '@aws-sdk/credential-provider-sso@3.970.0': dependencies: - '@aws-sdk/client-sso': 3.969.0 - '@aws-sdk/core': 3.969.0 - '@aws-sdk/token-providers': 3.969.0 + '@aws-sdk/client-sso': 3.970.0 + '@aws-sdk/core': 3.970.0 + '@aws-sdk/token-providers': 3.970.0 '@aws-sdk/types': 3.969.0 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -6212,10 +6274,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.969.0': + '@aws-sdk/credential-provider-web-identity@3.970.0': dependencies: - '@aws-sdk/core': 3.969.0 - '@aws-sdk/nested-clients': 3.969.0 + '@aws-sdk/core': 3.970.0 + '@aws-sdk/nested-clients': 3.970.0 '@aws-sdk/types': 3.969.0 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -6241,12 +6303,12 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.969.0': + '@aws-sdk/middleware-flexible-checksums@3.970.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.969.0 + '@aws-sdk/core': 3.970.0 '@aws-sdk/crc64-nvme': 3.969.0 '@aws-sdk/types': 3.969.0 '@smithy/is-array-buffer': 4.2.0 @@ -6285,16 +6347,16 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.969.0': + '@aws-sdk/middleware-sdk-s3@3.970.0': dependencies: - '@aws-sdk/core': 3.969.0 + '@aws-sdk/core': 3.970.0 '@aws-sdk/types': 3.969.0 '@aws-sdk/util-arn-parser': 3.968.0 - '@smithy/core': 3.20.5 + '@smithy/core': 3.20.6 '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.8 '@smithy/types': 4.12.0 '@smithy/util-config-provider': 4.2.0 '@smithy/util-middleware': 4.2.8 @@ -6308,51 +6370,51 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.969.0': + '@aws-sdk/middleware-user-agent@3.970.0': dependencies: - '@aws-sdk/core': 3.969.0 + '@aws-sdk/core': 3.970.0 '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-endpoints': 3.969.0 - '@smithy/core': 3.20.5 + '@aws-sdk/util-endpoints': 3.970.0 + '@smithy/core': 3.20.6 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.969.0': + '@aws-sdk/nested-clients@3.970.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.969.0 + '@aws-sdk/core': 3.970.0 '@aws-sdk/middleware-host-header': 3.969.0 '@aws-sdk/middleware-logger': 3.969.0 '@aws-sdk/middleware-recursion-detection': 3.969.0 - '@aws-sdk/middleware-user-agent': 3.969.0 + '@aws-sdk/middleware-user-agent': 3.970.0 '@aws-sdk/region-config-resolver': 3.969.0 '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-endpoints': 3.969.0 + '@aws-sdk/util-endpoints': 3.970.0 '@aws-sdk/util-user-agent-browser': 3.969.0 - '@aws-sdk/util-user-agent-node': 3.969.0 + '@aws-sdk/util-user-agent-node': 3.970.0 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.20.5 + '@smithy/core': 3.20.6 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.6 - '@smithy/middleware-retry': 4.4.22 + '@smithy/middleware-endpoint': 4.4.7 + '@smithy/middleware-retry': 4.4.23 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.8 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.21 - '@smithy/util-defaults-mode-node': 4.2.24 + '@smithy/util-defaults-mode-browser': 4.3.22 + '@smithy/util-defaults-mode-node': 4.2.25 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -6369,19 +6431,19 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.969.0': + '@aws-sdk/signature-v4-multi-region@3.970.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.969.0 + '@aws-sdk/middleware-sdk-s3': 3.970.0 '@aws-sdk/types': 3.969.0 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.969.0': + '@aws-sdk/token-providers@3.970.0': dependencies: - '@aws-sdk/core': 3.969.0 - '@aws-sdk/nested-clients': 3.969.0 + '@aws-sdk/core': 3.970.0 + '@aws-sdk/nested-clients': 3.970.0 '@aws-sdk/types': 3.969.0 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -6399,7 +6461,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.969.0': + '@aws-sdk/util-endpoints@3.970.0': dependencies: '@aws-sdk/types': 3.969.0 '@smithy/types': 4.12.0 @@ -6418,9 +6480,9 @@ snapshots: bowser: 2.13.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.969.0': + '@aws-sdk/util-user-agent-node@3.970.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.969.0 + '@aws-sdk/middleware-user-agent': 3.970.0 '@aws-sdk/types': 3.969.0 '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 @@ -6932,259 +6994,124 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inquirer/ansi@2.0.2': {} - '@inquirer/ansi@2.0.3': {} - '@inquirer/checkbox@5.0.4(@types/node@25.0.3)': + '@inquirer/checkbox@5.0.4(@types/node@25.0.9)': dependencies: '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.1(@types/node@25.0.3) + '@inquirer/core': 11.1.1(@types/node@25.0.9) '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.0.3) + '@inquirer/type': 4.0.3(@types/node@25.0.9) optionalDependencies: - '@types/node': 25.0.3 + '@types/node': 25.0.9 - '@inquirer/checkbox@5.0.4(@types/node@25.0.8)': + '@inquirer/confirm@6.0.4(@types/node@25.0.9)': + dependencies: + '@inquirer/core': 11.1.1(@types/node@25.0.9) + '@inquirer/type': 4.0.3(@types/node@25.0.9) + optionalDependencies: + '@types/node': 25.0.9 + + '@inquirer/core@11.1.1(@types/node@25.0.9)': dependencies: '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.1(@types/node@25.0.8) '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.0.8) - optionalDependencies: - '@types/node': 25.0.8 - - '@inquirer/confirm@6.0.4(@types/node@25.0.3)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.3) - '@inquirer/type': 4.0.3(@types/node@25.0.3) - optionalDependencies: - '@types/node': 25.0.3 - - '@inquirer/confirm@6.0.4(@types/node@25.0.8)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.8) - '@inquirer/type': 4.0.3(@types/node@25.0.8) - optionalDependencies: - '@types/node': 25.0.8 - - '@inquirer/core@11.1.0(@types/node@25.0.3)': - dependencies: - '@inquirer/ansi': 2.0.2 - '@inquirer/figures': 2.0.2 - '@inquirer/type': 4.0.2(@types/node@25.0.3) + '@inquirer/type': 4.0.3(@types/node@25.0.9) cli-width: 4.1.0 mute-stream: 3.0.0 signal-exit: 4.1.0 wrap-ansi: 9.0.2 optionalDependencies: - '@types/node': 25.0.3 + '@types/node': 25.0.9 - '@inquirer/core@11.1.1(@types/node@25.0.3)': + '@inquirer/editor@5.0.4(@types/node@25.0.9)': dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.0.3) - cli-width: 4.1.0 - mute-stream: 3.0.0 - signal-exit: 4.1.0 - wrap-ansi: 9.0.2 + '@inquirer/core': 11.1.1(@types/node@25.0.9) + '@inquirer/external-editor': 2.0.3(@types/node@25.0.9) + '@inquirer/type': 4.0.3(@types/node@25.0.9) optionalDependencies: - '@types/node': 25.0.3 + '@types/node': 25.0.9 - '@inquirer/core@11.1.1(@types/node@25.0.8)': + '@inquirer/expand@5.0.4(@types/node@25.0.9)': dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.0.8) - cli-width: 4.1.0 - mute-stream: 3.0.0 - signal-exit: 4.1.0 - wrap-ansi: 9.0.2 + '@inquirer/core': 11.1.1(@types/node@25.0.9) + '@inquirer/type': 4.0.3(@types/node@25.0.9) optionalDependencies: - '@types/node': 25.0.8 + '@types/node': 25.0.9 - '@inquirer/editor@5.0.4(@types/node@25.0.3)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.3) - '@inquirer/external-editor': 2.0.3(@types/node@25.0.3) - '@inquirer/type': 4.0.3(@types/node@25.0.3) - optionalDependencies: - '@types/node': 25.0.3 - - '@inquirer/editor@5.0.4(@types/node@25.0.8)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.8) - '@inquirer/external-editor': 2.0.3(@types/node@25.0.8) - '@inquirer/type': 4.0.3(@types/node@25.0.8) - optionalDependencies: - '@types/node': 25.0.8 - - '@inquirer/expand@5.0.4(@types/node@25.0.3)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.3) - '@inquirer/type': 4.0.3(@types/node@25.0.3) - optionalDependencies: - '@types/node': 25.0.3 - - '@inquirer/expand@5.0.4(@types/node@25.0.8)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.8) - '@inquirer/type': 4.0.3(@types/node@25.0.8) - optionalDependencies: - '@types/node': 25.0.8 - - '@inquirer/external-editor@2.0.3(@types/node@25.0.3)': + '@inquirer/external-editor@2.0.3(@types/node@25.0.9)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.0.3 - - '@inquirer/external-editor@2.0.3(@types/node@25.0.8)': - dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.2 - optionalDependencies: - '@types/node': 25.0.8 - - '@inquirer/figures@2.0.2': {} + '@types/node': 25.0.9 '@inquirer/figures@2.0.3': {} - '@inquirer/input@5.0.4(@types/node@25.0.3)': + '@inquirer/input@5.0.4(@types/node@25.0.9)': dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.3) - '@inquirer/type': 4.0.3(@types/node@25.0.3) + '@inquirer/core': 11.1.1(@types/node@25.0.9) + '@inquirer/type': 4.0.3(@types/node@25.0.9) optionalDependencies: - '@types/node': 25.0.3 + '@types/node': 25.0.9 - '@inquirer/input@5.0.4(@types/node@25.0.8)': + '@inquirer/number@4.0.4(@types/node@25.0.9)': dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.8) - '@inquirer/type': 4.0.3(@types/node@25.0.8) + '@inquirer/core': 11.1.1(@types/node@25.0.9) + '@inquirer/type': 4.0.3(@types/node@25.0.9) optionalDependencies: - '@types/node': 25.0.8 + '@types/node': 25.0.9 - '@inquirer/number@4.0.4(@types/node@25.0.3)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.3) - '@inquirer/type': 4.0.3(@types/node@25.0.3) - optionalDependencies: - '@types/node': 25.0.3 - - '@inquirer/number@4.0.4(@types/node@25.0.8)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.8) - '@inquirer/type': 4.0.3(@types/node@25.0.8) - optionalDependencies: - '@types/node': 25.0.8 - - '@inquirer/password@5.0.4(@types/node@25.0.3)': + '@inquirer/password@5.0.4(@types/node@25.0.9)': dependencies: '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.1(@types/node@25.0.3) - '@inquirer/type': 4.0.3(@types/node@25.0.3) + '@inquirer/core': 11.1.1(@types/node@25.0.9) + '@inquirer/type': 4.0.3(@types/node@25.0.9) optionalDependencies: - '@types/node': 25.0.3 + '@types/node': 25.0.9 - '@inquirer/password@5.0.4(@types/node@25.0.8)': + '@inquirer/prompts@8.2.0(@types/node@25.0.9)': + dependencies: + '@inquirer/checkbox': 5.0.4(@types/node@25.0.9) + '@inquirer/confirm': 6.0.4(@types/node@25.0.9) + '@inquirer/editor': 5.0.4(@types/node@25.0.9) + '@inquirer/expand': 5.0.4(@types/node@25.0.9) + '@inquirer/input': 5.0.4(@types/node@25.0.9) + '@inquirer/number': 4.0.4(@types/node@25.0.9) + '@inquirer/password': 5.0.4(@types/node@25.0.9) + '@inquirer/rawlist': 5.2.0(@types/node@25.0.9) + '@inquirer/search': 4.1.0(@types/node@25.0.9) + '@inquirer/select': 5.0.4(@types/node@25.0.9) + optionalDependencies: + '@types/node': 25.0.9 + + '@inquirer/rawlist@5.2.0(@types/node@25.0.9)': + dependencies: + '@inquirer/core': 11.1.1(@types/node@25.0.9) + '@inquirer/type': 4.0.3(@types/node@25.0.9) + optionalDependencies: + '@types/node': 25.0.9 + + '@inquirer/search@4.1.0(@types/node@25.0.9)': + dependencies: + '@inquirer/core': 11.1.1(@types/node@25.0.9) + '@inquirer/figures': 2.0.3 + '@inquirer/type': 4.0.3(@types/node@25.0.9) + optionalDependencies: + '@types/node': 25.0.9 + + '@inquirer/select@5.0.4(@types/node@25.0.9)': dependencies: '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.1(@types/node@25.0.8) - '@inquirer/type': 4.0.3(@types/node@25.0.8) - optionalDependencies: - '@types/node': 25.0.8 - - '@inquirer/prompts@8.2.0(@types/node@25.0.3)': - dependencies: - '@inquirer/checkbox': 5.0.4(@types/node@25.0.3) - '@inquirer/confirm': 6.0.4(@types/node@25.0.3) - '@inquirer/editor': 5.0.4(@types/node@25.0.3) - '@inquirer/expand': 5.0.4(@types/node@25.0.3) - '@inquirer/input': 5.0.4(@types/node@25.0.3) - '@inquirer/number': 4.0.4(@types/node@25.0.3) - '@inquirer/password': 5.0.4(@types/node@25.0.3) - '@inquirer/rawlist': 5.2.0(@types/node@25.0.3) - '@inquirer/search': 4.1.0(@types/node@25.0.3) - '@inquirer/select': 5.0.4(@types/node@25.0.3) - optionalDependencies: - '@types/node': 25.0.3 - - '@inquirer/prompts@8.2.0(@types/node@25.0.8)': - dependencies: - '@inquirer/checkbox': 5.0.4(@types/node@25.0.8) - '@inquirer/confirm': 6.0.4(@types/node@25.0.8) - '@inquirer/editor': 5.0.4(@types/node@25.0.8) - '@inquirer/expand': 5.0.4(@types/node@25.0.8) - '@inquirer/input': 5.0.4(@types/node@25.0.8) - '@inquirer/number': 4.0.4(@types/node@25.0.8) - '@inquirer/password': 5.0.4(@types/node@25.0.8) - '@inquirer/rawlist': 5.2.0(@types/node@25.0.8) - '@inquirer/search': 4.1.0(@types/node@25.0.8) - '@inquirer/select': 5.0.4(@types/node@25.0.8) - optionalDependencies: - '@types/node': 25.0.8 - - '@inquirer/rawlist@5.2.0(@types/node@25.0.3)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.3) - '@inquirer/type': 4.0.3(@types/node@25.0.3) - optionalDependencies: - '@types/node': 25.0.3 - - '@inquirer/rawlist@5.2.0(@types/node@25.0.8)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.8) - '@inquirer/type': 4.0.3(@types/node@25.0.8) - optionalDependencies: - '@types/node': 25.0.8 - - '@inquirer/search@4.1.0(@types/node@25.0.3)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.3) + '@inquirer/core': 11.1.1(@types/node@25.0.9) '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.0.3) + '@inquirer/type': 4.0.3(@types/node@25.0.9) optionalDependencies: - '@types/node': 25.0.3 + '@types/node': 25.0.9 - '@inquirer/search@4.1.0(@types/node@25.0.8)': - dependencies: - '@inquirer/core': 11.1.1(@types/node@25.0.8) - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.0.8) + '@inquirer/type@4.0.3(@types/node@25.0.9)': optionalDependencies: - '@types/node': 25.0.8 - - '@inquirer/select@5.0.4(@types/node@25.0.3)': - dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.1(@types/node@25.0.3) - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.0.3) - optionalDependencies: - '@types/node': 25.0.3 - - '@inquirer/select@5.0.4(@types/node@25.0.8)': - dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.1(@types/node@25.0.8) - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.0.8) - optionalDependencies: - '@types/node': 25.0.8 - - '@inquirer/type@4.0.2(@types/node@25.0.3)': - optionalDependencies: - '@types/node': 25.0.3 - - '@inquirer/type@4.0.3(@types/node@25.0.3)': - optionalDependencies: - '@types/node': 25.0.3 - - '@inquirer/type@4.0.3(@types/node@25.0.8)': - optionalDependencies: - '@types/node': 25.0.8 + '@types/node': 25.0.9 '@isaacs/cliui@8.0.2': dependencies: @@ -7448,6 +7375,12 @@ snapshots: '@kevisual/permission': 0.0.3 '@kevisual/query': 0.0.31 + '@kevisual/ai@0.0.20': + dependencies: + '@kevisual/logger': 0.0.4 + '@kevisual/permission': 0.0.3 + '@kevisual/query': 0.0.35 + '@kevisual/api@0.0.5': dependencies: es-toolkit: 1.43.0 @@ -7459,7 +7392,7 @@ snapshots: '@kevisual/context': 0.0.4 '@kevisual/query': 0.0.31 '@kevisual/router': 0.0.36 - '@kevisual/use-config': 1.0.26(dotenv@17.2.3) + '@kevisual/use-config': 1.0.28(dotenv@17.2.3) mitt: 3.0.1 transitivePeerDependencies: - dotenv @@ -7471,7 +7404,7 @@ snapshots: '@kevisual/context': 0.0.4 '@kevisual/query': 0.0.32 '@kevisual/router': 0.0.39 - '@kevisual/use-config': 1.0.26(dotenv@17.2.3) + '@kevisual/use-config': 1.0.28(dotenv@17.2.3) mitt: 3.0.1 nanoid: 5.1.6 transitivePeerDependencies: @@ -7512,7 +7445,7 @@ snapshots: '@kevisual/ai': 0.0.16 '@kevisual/query': 0.0.31 '@kevisual/router': 0.0.33 - '@kevisual/use-config': 1.0.26(dotenv@17.2.3) + '@kevisual/use-config': 1.0.28(dotenv@17.2.3) '@nut-tree-fork/nut-js': 4.2.6 archiver: 7.0.1 dayjs: 1.11.19 @@ -7647,23 +7580,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@kevisual/router@0.0.52(supports-color@10.2.2)': - dependencies: - eventemitter3: 5.0.1 - path-to-regexp: 8.3.0 - selfsigned: 5.4.0 - send: 1.2.1(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color + '@kevisual/router@0.0.55': {} '@kevisual/types@0.0.10': {} - '@kevisual/use-config@1.0.21(dotenv@17.2.3)': - dependencies: - '@kevisual/load': 0.0.6 - dotenv: 17.2.3 + '@kevisual/types@0.0.11': {} - '@kevisual/use-config@1.0.26(dotenv@17.2.3)': + '@kevisual/use-config@1.0.28(dotenv@17.2.3)': dependencies: '@kevisual/load': 0.0.6 dotenv: 17.2.3 @@ -7673,7 +7596,7 @@ snapshots: '@gradio/client': 2.0.1 '@kevisual/ai': 0.0.19 '@kevisual/router': 0.0.51(supports-color@10.2.2) - '@kevisual/use-config': 1.0.26(dotenv@17.2.3) + '@kevisual/use-config': 1.0.28(dotenv@17.2.3) '@kevisual/video': 0.0.2 crypto-js: 4.2.0 dayjs: 1.11.19 @@ -8524,7 +8447,7 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/core@3.20.5': + '@smithy/core@3.20.6': dependencies: '@smithy/middleware-serde': 4.2.9 '@smithy/protocol-http': 5.3.8 @@ -8628,9 +8551,9 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.6': + '@smithy/middleware-endpoint@4.4.7': dependencies: - '@smithy/core': 3.20.5 + '@smithy/core': 3.20.6 '@smithy/middleware-serde': 4.2.9 '@smithy/node-config-provider': 4.3.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -8639,12 +8562,12 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.22': + '@smithy/middleware-retry@4.4.23': dependencies: '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/service-error-classification': 4.2.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.8 '@smithy/types': 4.12.0 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -8718,10 +8641,10 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.10.7': + '@smithy/smithy-client@4.10.8': dependencies: - '@smithy/core': 3.20.5 - '@smithy/middleware-endpoint': 4.4.6 + '@smithy/core': 3.20.6 + '@smithy/middleware-endpoint': 4.4.7 '@smithy/middleware-stack': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 @@ -8766,20 +8689,20 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.21': + '@smithy/util-defaults-mode-browser@4.3.22': dependencies: '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.24': + '@smithy/util-defaults-mode-node@4.2.25': dependencies: '@smithy/config-resolver': 4.4.6 '@smithy/credential-provider-imds': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.8 '@smithy/types': 4.12.0 tslib: 2.8.1 @@ -8904,12 +8827,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.0.8)(jiti@2.6.1)(lightningcss@1.30.2))': + '@tailwindcss/vite@4.1.18(vite@6.4.1(@types/node@25.0.9)(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.0.8)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2) '@tokenizer/token@0.3.0': {} @@ -8938,14 +8861,14 @@ snapshots: '@types/braces@3.0.5': {} - '@types/bun@1.3.5': - dependencies: - bun-types: 1.3.5 - '@types/bun@1.3.6': dependencies: bun-types: 1.3.6 + '@types/busboy@1.5.4': + dependencies: + '@types/node': 25.0.9 + '@types/crypto-js@4.2.2': {} '@types/debug@4.1.12': @@ -8960,7 +8883,7 @@ snapshots: '@types/fontkit@2.0.8': dependencies: - '@types/node': 25.0.8 + '@types/node': 25.0.9 '@types/hast@2.3.10': dependencies: @@ -8973,7 +8896,7 @@ snapshots: '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 0.7.34 - '@types/node': 25.0.8 + '@types/node': 25.0.9 '@types/lodash-es@4.17.12': dependencies: @@ -9001,11 +8924,7 @@ snapshots: '@types/node@17.0.45': {} - '@types/node@25.0.3': - dependencies: - undici-types: 7.16.0 - - '@types/node@25.0.8': + '@types/node@25.0.9': dependencies: undici-types: 7.16.0 @@ -9023,13 +8942,13 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 25.0.8 + '@types/node': 25.0.9 '@types/semver@7.7.1': {} '@types/send@1.2.1': dependencies: - '@types/node': 25.0.8 + '@types/node': 25.0.9 '@types/trusted-types@2.0.7': {} @@ -9039,7 +8958,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.0.8 + '@types/node': 25.0.9 '@uiw/copy-to-clipboard@1.0.19': {} @@ -9078,7 +8997,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.0.9)(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) @@ -9086,24 +9005,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.0.8)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.0.9)(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.0.8)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.8.2))': + '@vitejs/plugin-vue-jsx@4.2.0(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(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.0.8)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2) vue: 3.5.26(typescript@5.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.1(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.8.2))': + '@vitejs/plugin-vue@5.2.1(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.8.2))': dependencies: - vite: 6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2) vue: 3.5.26(typescript@5.8.2) '@vue/babel-helper-vue-transform-on@1.5.0': {} @@ -9195,14 +9114,14 @@ snapshots: '@vue/compiler-dom': 3.5.26 '@vue/shared': 3.5.26 - '@vue/devtools-core@7.7.9(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.8.2))': + '@vue/devtools-core@7.7.9(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(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.0.8)(jiti@2.6.1)(lightningcss@1.30.2)) + vite-hot-client: 2.1.0(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)) vue: 3.5.26(typescript@5.8.2) transitivePeerDependencies: - vite @@ -9401,7 +9320,7 @@ snapshots: astring@1.9.0: {} - astro@5.16.6(@types/node@25.0.8)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2): + astro@5.16.6(@types/node@25.0.9)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -9458,8 +9377,8 @@ snapshots: unist-util-visit: 5.0.0 unstorage: 1.17.3(idb-keyval@6.2.2) vfile: 6.0.3 - vite: 6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2)) + vite: 6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -9596,18 +9515,18 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bun-types@1.3.5: - dependencies: - '@types/node': 25.0.8 - bun-types@1.3.6: dependencies: - '@types/node': 25.0.8 + '@types/node': 25.0.9 bundle-name@4.1.0: dependencies: run-applescript: 7.1.0 + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + bytestreamjs@2.0.1: {} call-bind-apply-helpers@1.0.2: @@ -9623,7 +9542,7 @@ snapshots: centra@2.7.0: dependencies: - follow-redirects: 1.15.9(debug@4.3.7) + follow-redirects: 1.15.9(debug@4.3.7(supports-color@10.2.2)) transitivePeerDependencies: - debug @@ -9662,6 +9581,10 @@ snapshots: dependencies: readdirp: 4.1.2 + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + chownr@3.0.0: {} ci-info@4.3.1: {} @@ -10353,6 +10276,18 @@ snapshots: ufo: 1.6.1 uncrypto: 0.1.3 + h3@1.15.5: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.5 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.4 + radix3: 1.1.2 + ufo: 1.6.3 + uncrypto: 0.1.3 + has-flag@4.0.0: {} has-symbols@1.1.0: {} @@ -10619,17 +10554,17 @@ snapshots: inline-style-parser@0.2.7: {} - inquirer@13.1.0(@types/node@25.0.3): + inquirer@13.2.0(@types/node@25.0.9): dependencies: - '@inquirer/ansi': 2.0.2 - '@inquirer/core': 11.1.0(@types/node@25.0.3) - '@inquirer/prompts': 8.2.0(@types/node@25.0.3) - '@inquirer/type': 4.0.2(@types/node@25.0.3) + '@inquirer/ansi': 2.0.3 + '@inquirer/core': 11.1.1(@types/node@25.0.9) + '@inquirer/prompts': 8.2.0(@types/node@25.0.9) + '@inquirer/type': 4.0.3(@types/node@25.0.9) mute-stream: 3.0.0 run-async: 4.0.6 rxjs: 7.8.2 optionalDependencies: - '@types/node': 25.0.3 + '@types/node': 25.0.9 ip-address@9.0.5: dependencies: @@ -11469,6 +11404,8 @@ snapshots: node-mock-http@1.0.3: {} + node-mock-http@1.0.4: {} + node-releases@2.0.27: {} normalize-path@3.0.0: {} @@ -11913,6 +11850,8 @@ snapshots: readdirp@4.1.2: {} + readdirp@5.0.0: {} + recma-build-jsx@1.0.0: dependencies: '@types/estree': 1.0.7 @@ -12377,6 +12316,8 @@ snapshots: stream-replace-string@2.0.0: {} + streamsearch@1.1.0: {} + streamx@2.23.0: dependencies: events-universal: 1.0.1 @@ -12573,6 +12514,8 @@ snapshots: ufo@1.6.1: {} + ufo@1.6.3: {} + ultrahtml@1.6.0: {} uncrypto@0.1.3: {} @@ -12674,6 +12617,19 @@ snapshots: optionalDependencies: idb-keyval: 6.2.2 + unstorage@1.17.4(idb-keyval@6.2.2): + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.5 + lru-cache: 11.2.4 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.3 + optionalDependencies: + idb-keyval: 6.2.2 + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: browserslist: 4.28.1 @@ -12701,11 +12657,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.0.8)(jiti@2.6.1)(lightningcss@1.30.2)): + vite-hot-client@2.1.0(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)): dependencies: - vite: 6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2) - vite-plugin-inspect@0.8.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2)): + vite-plugin-inspect@0.8.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.3.0(rollup@4.43.0) @@ -12716,28 +12672,28 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 3.0.2 - vite: 6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2) transitivePeerDependencies: - rollup - supports-color - vite-plugin-vue-devtools@7.7.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.8.2)): + vite-plugin-vue-devtools@7.7.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.8.2)): dependencies: - '@vue/devtools-core': 7.7.9(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.8.2)) + '@vue/devtools-core': 7.7.9(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(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.0.8)(jiti@2.6.1)(lightningcss@1.30.2) - vite-plugin-inspect: 0.8.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2)) - vite-plugin-vue-inspector: 5.3.2(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2)) + vite: 6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2) + vite-plugin-inspect: 0.8.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)) + vite-plugin-vue-inspector: 5.3.2(vite@6.4.1(@types/node@25.0.9)(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.0.8)(jiti@2.6.1)(lightningcss@1.30.2)): + vite-plugin-vue-inspector@5.3.2(vite@6.4.1(@types/node@25.0.9)(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) @@ -12748,11 +12704,11 @@ snapshots: '@vue/compiler-dom': 3.5.25 kolorist: 1.8.0 magic-string: 0.30.17 - vite: 6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2) transitivePeerDependencies: - supports-color - vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2): + vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.2) @@ -12761,14 +12717,14 @@ snapshots: rollup: 4.43.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.0.8 + '@types/node': 25.0.9 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 - vitefu@1.1.1(vite@6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2)): + vitefu@1.1.1(vite@6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)): optionalDependencies: - vite: 6.4.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2) vizion@2.2.1: dependencies: diff --git a/readme.md b/readme.md index 444f86e..b0aeacd 100644 --- a/readme.md +++ b/readme.md @@ -1,8 +1 @@ -# 可视化控制台工具 - -## 1. 上传文件 - -## 2. 下载文件 - -## 3. 同步模板 - +# 一个简单的cli工具 diff --git a/src/command/npm.ts b/src/command/npm.ts index 314ed1d..cca45e7 100644 --- a/src/command/npm.ts +++ b/src/command/npm.ts @@ -14,7 +14,7 @@ const parseIfJson = (str: string) => { return {}; } }; -const command = new Command('npm').description('npm command show publish and set .npmrc').action(async (options) => {}); +const command = new Command('npm').description('npm command show publish and set .npmrc').action(async (options) => { }); const publish = new Command('publish') .argument('[registry]') .option('-p --proxy', 'proxy') @@ -33,6 +33,10 @@ const publish = new Command('publish') name: 'npm', value: 'npm', }, + { + name: 'cnb', + value: 'cnb' + } ], }); } @@ -60,6 +64,9 @@ const publish = new Command('publish') case 'npm': cmd = 'npm publish --registry https://registry.npmjs.org'; break; + case 'cnb': + cmd = 'npm publish --registry https://npm.cnb.cool/kevisual/registry/-/packages/'; + break; default: cmd = 'npm publish --registry https://npm.xiongxiao.me'; break; @@ -136,6 +143,7 @@ const npmrc = new Command('set') const npmrcContent = config?.npmrc || `//npm.xiongxiao.me/:_authToken=\${ME_NPM_TOKEN} +//npm.cnb.cool/kevisual/registry/-/packages/:_authToken=\${CNB_API_KEY} //registry.npmjs.org/:_authToken=\${NPM_TOKEN} `; const execPath = process.cwd(); diff --git a/src/command/sync/sync.ts b/src/command/sync/sync.ts index ccad4a7..0778154 100644 --- a/src/command/sync/sync.ts +++ b/src/command/sync/sync.ts @@ -8,7 +8,7 @@ import { logger, printClickableLink } from '@/module/logger.ts'; import { chalk } from '@/module/chalk.ts'; import path from 'node:path'; import { fileIsExist } from '@/uitls/file.ts'; - +import { confirm } from '@inquirer/prompts' const command = new Command('sync') .option('-d --dir ') .description('同步项目') @@ -33,7 +33,19 @@ const syncUpload = new Command('upload') }; const filepath = sync.getRelativePath(opts.file); const newInfos = []; - + const uploadLength = syncList.length; + logger.info(`开始上传文件,总计 ${uploadLength} 个文件`); + if (uploadLength > 100) { + // 提示用户确认 + const shouldContinue = await confirm({ + message: `即将上传 ${uploadLength} 个文件,是否继续?`, + default: false, + }); + if (!shouldContinue) { + logger.info('已取消上传'); + return; + } + } for (const item of syncList) { if (!item.auth || !item.exist) { nodonwArr.push(item);