diff --git a/assistant/package.json b/assistant/package.json index d2eede5..0c031eb 100644 --- a/assistant/package.json +++ b/assistant/package.json @@ -42,15 +42,16 @@ }, "devDependencies": { "@kevisual/ai": "^0.0.21", + "@kevisual/api": "^0.0.22", "@kevisual/load": "^0.0.6", "@kevisual/local-app-manager": "^0.1.32", "@kevisual/logger": "^0.0.4", - "@kevisual/query": "0.0.35", + "@kevisual/query": "0.0.37", "@kevisual/query-login": "0.0.7", - "@kevisual/router": "^0.0.57", - "@kevisual/types": "^0.0.11", + "@kevisual/router": "^0.0.60", + "@kevisual/types": "^0.0.12", "@kevisual/use-config": "^1.0.28", - "@opencode-ai/plugin": "^1.1.26", + "@opencode-ai/plugin": "^1.1.28", "@types/bun": "^1.3.6", "@types/lodash-es": "^4.17.12", "@types/node": "^25.0.9", @@ -62,7 +63,7 @@ "dayjs": "^1.11.19", "dotenv": "^17.2.3", "get-port": "^7.1.0", - "inquirer": "^13.2.0", + "inquirer": "^13.2.1", "lodash-es": "^4.17.22", "nanoid": "^5.1.6", "send": "^1.2.1", @@ -77,11 +78,11 @@ "access": "public" }, "dependencies": { - "@aws-sdk/client-s3": "^3.971.0", + "@aws-sdk/client-s3": "^3.972.0", "@kevisual/ha-api": "^0.0.6", "@kevisual/oss": "^0.0.16", "@kevisual/video-tools": "^0.0.13", - "@opencode-ai/sdk": "^1.1.26", + "@opencode-ai/sdk": "^1.1.28", "es-toolkit": "^1.44.0", "eventemitter3": "^5.0.4", "lowdb": "^7.0.1", diff --git a/assistant/src/module/assistant/config/index.ts b/assistant/src/module/assistant/config/index.ts index d93d1b8..64b9764 100644 --- a/assistant/src/module/assistant/config/index.ts +++ b/assistant/src/module/assistant/config/index.ts @@ -94,6 +94,15 @@ export type AssistantConfigData = { * 例子: { path: '/root/home', target: 'https://kevisual.cn', pathname: '/root/home' } */ proxy?: ProxyInfo[]; + /** + * Router代理, 会自动获取 {path: 'router', key: 'list'}的路由信息,然后注入到整个router应用当中. + * 例子: { proxy: [ { type: 'router', api: 'https://localhost:50002/api/router' } ] } + * base: 是否使用 /api/router的基础路径,默认false + */ + router?: { + proxy: ProxyInfo[]; + base?: boolean; + } /** * API 代理配置, 比如,api开头的,v1开头的等等 */ diff --git a/assistant/src/module/assistant/local-app-manager/assistant-app.ts b/assistant/src/module/assistant/local-app-manager/assistant-app.ts index 30751fa..3f337bf 100644 --- a/assistant/src/module/assistant/local-app-manager/assistant-app.ts +++ b/assistant/src/module/assistant/local-app-manager/assistant-app.ts @@ -7,12 +7,16 @@ import glob from 'fast-glob'; import type { App } from '@kevisual/router'; import { RemoteApp } from '@/module/remote-app/remote-app.ts'; import { logger } from '@/module/logger.ts'; +import { getEnvToken } from '@/module/http-token.ts'; +import { initApi } from '@kevisual/api/proxy' +import { Query } from '@kevisual/query'; export class AssistantApp extends Manager { config: AssistantConfig; pagesPath: string; remoteIsConnected = false; attemptedConnectTimes = 0; remoteApp: RemoteApp | null = null; + remoteUrl: string | null = null; constructor(config: AssistantConfig, mainApp?: App) { config.checkMounted(); const appsPath = config?.configPath?.appsDir || path.join(process.cwd(), 'apps'); @@ -71,11 +75,17 @@ export class AssistantApp extends Manager { return pagesParse; } - async initRemoteApp() { + async initRemoteApp(opts?: { token?: string, enabled?: boolean }) { const config = this.config.getConfig(); const share = config?.share; - if (share && share.enabled !== false) { - const token = config?.token; + const enabled = opts?.enabled ?? share?.enabled ?? false; + if (share && enabled !== false) { + if (this.remoteApp) { + this.remoteApp.ws?.close(); + this.remoteApp = null; + this.remoteIsConnected = false; + } + const token = config?.token || opts?.token || getEnvToken() as string; const url = new URL(share.url || 'https://kevisual.cn/ws/proxy'); const id = config?.app?.id; if (token && url && id) { @@ -99,12 +109,63 @@ export class AssistantApp extends Manager { }, 5 * 1000); // 第一次断开5秒后重连 }); logger.debug('链接到了远程应用服务器'); + const appId = id; + const username = config?.auth.username || 'unknown'; + const url = new URL(`/${username}/v1/${appId}`, 'https://kevisual.cn/'); + this.remoteUrl = url.toString(); + console.log('远程地址', this.remoteUrl); } else { console.log('Not connected to remote app server'); } this.remoteApp = remoteApp; } else { - // + if (!token) { + logger.error('Token是远程应用连接必须的参数'); + } + } + } + } + async initRouterApp() { + const config = this.config.getConfig(); + const routerProxy = config.router.proxy || []; + const base = config.router.base ?? false; + if (base) { + routerProxy.push({ + type: 'router', + router: { + url: `${this.config.getRegistry()}/api/router`, + } + }) + } + if (routerProxy.length === 0) { + return + } + for (const proxyInfo of routerProxy) { + if (proxyInfo.type !== 'router') { + console.warn('路由的type必须是"router"'); + continue; + } + const url = proxyInfo.router!.url; + if (!url) { + console.warn('路由的api地址不能为空', proxyInfo.router); + continue; + } + const query = new Query({ url }); + try { + initApi({ + router: this.mainApp, + item: { + type: 'api', + api: { + url, + query: query as any, + } + }, + exclude: "WHERE path = 'auth' OR path = 'router' OR path = 'call'", + }) + console.log('Router API 已初始化', url.toString()); + } catch (err) { + console.error('Router API 初始化失败', url.toString(), err); } } } @@ -119,9 +180,10 @@ export class AssistantApp extends Manager { remoteApp.listenProxy(); this.attemptedConnectTimes = 0; console.log('重新连接到了远程应用服务器'); + this.reconnectRemoteApp(); } else { setTimeout(() => { - this.reconnectRemoteApp(); + this.initRouterApp() }, 30 * 1000 + this.attemptedConnectTimes * 10 * 1000); // 30秒后重连 + 每次增加10秒 } } diff --git a/assistant/src/module/assistant/proxy/proxy.ts b/assistant/src/module/assistant/proxy/proxy.ts index 7a4354c..6571677 100644 --- a/assistant/src/module/assistant/proxy/proxy.ts +++ b/assistant/src/module/assistant/proxy/proxy.ts @@ -14,7 +14,7 @@ export type ProxyInfo = { /** * 类型 */ - type?: 'file' | 'dynamic' | 'minio' | 'http' | 's3'; + type?: 'file' | 'dynamic' | 'minio' | 'http' | 's3' | 'router'; /** * 目标的 pathname, 默认为请求的url.pathname, 设置了pathname,则会使用pathname作为请求的url.pathname * @default undefined @@ -41,6 +41,10 @@ export type ProxyInfo = { id?: string; indexPath?: string; rootPath?: string; + }, + router?: { + id?: string; + url?: string; } }; diff --git a/assistant/src/module/http-token.ts b/assistant/src/module/http-token.ts index 6f4f734..7a9232c 100644 --- a/assistant/src/module/http-token.ts +++ b/assistant/src/module/http-token.ts @@ -1,3 +1,4 @@ +import { useKey } from '@kevisual/use-config'; import http from 'node:http'; export const error = (msg: string, code = 500) => { return JSON.stringify({ code, message: msg }); @@ -32,3 +33,7 @@ export const getToken = async (req: http.IncomingMessage) => { return { token }; }; +export const getEnvToken = () => { + const envTokne = useKey('KEVISUAL_TOKEN') || ''; + return envTokne; +} \ No newline at end of file diff --git a/assistant/src/routes/index.ts b/assistant/src/routes/index.ts index 0371702..7a9ac2d 100644 --- a/assistant/src/routes/index.ts +++ b/assistant/src/routes/index.ts @@ -10,10 +10,12 @@ import './call/index.ts' // TODO: 移除 // import './hot-api/key-sender/index.ts'; import './opencode/index.ts'; +import './remote/index.ts'; import os from 'node:os'; import { authCache } from '@/module/cache/auth.ts'; import { createSkill } from '@kevisual/router'; +import { logger } from '@/module/logger.ts'; const getTokenUser = async (token: string) => { const query = assistantConfig.query const res = await query.post({ @@ -41,7 +43,7 @@ export const checkAuth = async (ctx: any, isAdmin = false) => { const config = assistantConfig.getConfig(); const { auth = {} } = config; const token = ctx.query.token; - console.log('checkAuth', ctx.query, { token }); + logger.debug('checkAuth', ctx.query, { token }); if (!token) { return { code: 401, @@ -120,7 +122,7 @@ app description: '管理员鉴权, 获取用户信息,并验证是否为管理员。', }) .define(async (ctx) => { - console.log('query', ctx.query); + logger.debug('query', ctx.query); if (!ctx.query?.token && ctx.appId === app.appId) { return; } diff --git a/assistant/src/routes/remote/index.ts b/assistant/src/routes/remote/index.ts new file mode 100644 index 0000000..0c9accb --- /dev/null +++ b/assistant/src/routes/remote/index.ts @@ -0,0 +1,54 @@ +import { useContextKey } from "@kevisual/context"; +import { app } from "../../app.ts"; +import { AssistantApp } from "@/lib.ts"; + +app.route({ + path: 'remote', + key: 'status', + middleware: ['admin-auth'], + description: '获取远程app连接状态', +}).define(async (ctx) => { + const manager = useContextKey('manager') as AssistantApp; + if (manager?.remoteApp?.isConnect()) { + const url = manager.remoteUrl || '' + ctx.body = { + content: `远程app已经链接, 访问地址:${url}`, + } + } else { + ctx.body = { + content: '远程app未连接', + } + } +}).addTo(app); + +app.route({ + path: 'remote', + key: 'connect', + middleware: ['admin-auth'], + description: '连接远程app', +}).define(async (ctx) => { + const manager = useContextKey('manager') as AssistantApp; + if (!manager) { + ctx.body = { + content: '远程app管理器未初始化', + } + return; + } + if (manager?.remoteApp?.isConnect()) { + const url = manager.remoteUrl || '' + ctx.body = { + content: `远程app已经链接, 访问地址:${url}`, + } + return; + } + await manager.initRemoteApp({ enabled: true, token: ctx.query?.token }).then(() => { + ctx.body = { + content: '远程app连接成功', + } + }).catch((err) => { + ctx.body = { + content: `远程app连接失败: ${err.message}`, + } + }); + +}).addTo(app); \ No newline at end of file diff --git a/assistant/src/server.ts b/assistant/src/server.ts index 7fa06b8..385aa8f 100644 --- a/assistant/src/server.ts +++ b/assistant/src/server.ts @@ -1,3 +1,4 @@ +import { useContextKey } from '@kevisual/context'; import { app, assistantConfig } from './app.ts'; import { proxyRoute, proxyWs } from './services/proxy/proxy-page-index.ts'; import './routes/index.ts'; @@ -50,12 +51,13 @@ export const runServer = async (port: number = 51515, listenPath = '127.0.0.1') ...proxyWs(), qwenAsr, ]); - const manager = new AssistantApp(assistantConfig, app); + const manager = useContextKey('manager', new AssistantApp(assistantConfig, app)); setTimeout(() => { manager.load({ runtime: 'client' }).then(() => { console.log('Assistant App Loaded'); }); manager.initRemoteApp() + manager.initRouterApp() }, 1000); return { diff --git a/assistant/src/services/init/index.ts b/assistant/src/services/init/index.ts index 0b25a25..4e2df26 100644 --- a/assistant/src/services/init/index.ts +++ b/assistant/src/services/init/index.ts @@ -36,9 +36,9 @@ export class AssistantInit extends AssistantConfig { } // 1. 检查助手路径是否存在 if (!this.checkConfigPath()) { - console.log(chalk.blue('助手路径不存在,正在创建...')); super.init(configDir); if (!this.initWorkspace) { return } + console.log(chalk.blue('助手路径不存在,正在创建...')); } else { super.init(configDir); if (!this.initWorkspace) { return } diff --git a/assistant/src/services/proxy/proxy-page-index.ts b/assistant/src/services/proxy/proxy-page-index.ts index 4eeab0b..e59cd04 100644 --- a/assistant/src/services/proxy/proxy-page-index.ts +++ b/assistant/src/services/proxy/proxy-page-index.ts @@ -1,7 +1,7 @@ -import { createApiProxy, ProxyInfo, proxy } from '@/module/assistant/index.ts'; +import { createApiProxy, ProxyInfo, proxy } from '@/module/assistant/index.ts'; import http from 'node:http'; import { LocalProxy } from './local-proxy.ts'; -import { assistantConfig, app, simpleRouter } from '@/app.ts'; +import { assistantConfig, simpleRouter } from '@/app.ts'; import { log, logger } from '@/module/logger.ts'; import { getToken } from '@/module/http-token.ts'; import { getTokenUserCache } from '@/routes/index.ts'; @@ -12,7 +12,7 @@ const localProxy = new LocalProxy({}); localProxy.initFromAssistantConfig(assistantConfig); const isOpenPath = (pathname: string): boolean => { - const openPaths = ['/root/home', '/root/cli']; + const openPaths = ['/root/home', '/root/cli', '/root/login']; for (const openPath of openPaths) { if (pathname.startsWith(openPath)) { return true; @@ -31,7 +31,7 @@ const authFilter = async (req: http.IncomingMessage, res: http.ServerResponse) = const auth = _assistantConfig?.auth || {}; const share = auth.share || 'protected'; const noAdmin = !auth.username; - if (noAdmin) return { code: 500, message: '没有管理员' }; + if (noAdmin) return { code: 200, message: '没有管理员, 直接放过, 让管理登录和自己设置' }; const admin = auth.username; const admins = auth.admin || []; if (admin) { @@ -160,7 +160,7 @@ export const proxyRoute = async (req: http.IncomingMessage, res: http.ServerResp return; } const isOpen = isOpenPath(pathname) - log.debug('proxyRoute', { _user, _app, pathname, noAdmin, isOpen }); + logger.debug('proxyRoute', { _user, _app, pathname, noAdmin, isOpen }); if (noAdmin && !isOpen) { return toSetting(); } @@ -172,19 +172,20 @@ export const proxyRoute = async (req: http.IncomingMessage, res: http.ServerResp const proxyApiList = _assistantConfig?.proxy || []; const proxyApi = proxyApiList.find((item) => pathname.startsWith(item.path)); if (proxyApi) { - log.debug('proxyPage', { proxyApi, pathname }); + logger.debug('proxyPage', { proxyApi, pathname }); return proxyFn(req, res, proxyApi); } const filter = await authFilter(req, res); if (filter.code !== 200) { - console.log('auth filter deny', filter); + logger.debug('auth filter deny', filter); res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); + // TODO: 这里可以做成可配置的登录页面 return res.end(renderNoAuthAndLogin('Not Authorized Proxy')); } const localProxyProxyList = localProxy.getLocalProxyList(); const localProxyProxy = localProxyProxyList.find((item) => pathname.startsWith(item.path)); if (localProxyProxy) { - log.log('localProxyProxy', { localProxyProxy, url: req.url }); + logger.debug('localProxyProxy', { localProxyProxy, url: req.url }); return proxyFn(req, res, { path: localProxyProxy.path, "type": 'file', @@ -203,7 +204,7 @@ export const proxyRoute = async (req: http.IncomingMessage, res: http.ServerResp type: 'http', }); } - log.debug('handle by router 404', req.url); + logger.debug('handle by router 404', req.url); res.statusCode = 404; res.end('Not Found Proxy'); diff --git a/package.json b/package.json index 0d7b96e..701a582 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/cli", - "version": "0.0.90", + "version": "0.0.91", "description": "envision 命令行工具", "type": "module", "basename": "/root/cli", @@ -48,7 +48,7 @@ "@kevisual/app": "^0.0.2", "@kevisual/context": "^0.0.4", "@kevisual/use-config": "^1.0.28", - "@opencode-ai/sdk": "^1.1.26", + "@opencode-ai/sdk": "^1.1.28", "@types/busboy": "^1.5.4", "busboy": "^1.6.0", "eventemitter3": "^5.0.4", @@ -63,7 +63,7 @@ "@kevisual/dts": "^0.0.3", "@kevisual/load": "^0.0.6", "@kevisual/logger": "^0.0.4", - "@kevisual/query": "0.0.35", + "@kevisual/query": "0.0.37", "@kevisual/query-login": "0.0.7", "@types/bun": "^1.3.6", "@types/crypto-js": "^4.2.2", @@ -80,7 +80,7 @@ "ignore": "^7.0.5", "jsonwebtoken": "^9.0.3", "pm2": "^6.0.14", - "tar": "^7.5.4", + "tar": "^7.5.6", "zustand": "^5.0.10" }, "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f946d95..8ef9a60 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: specifier: ^1.0.28 version: 1.0.28(dotenv@17.2.3) '@opencode-ai/sdk': - specifier: ^1.1.26 - version: 1.1.26 + specifier: ^1.1.28 + version: 1.1.28 '@types/busboy': specifier: ^1.5.4 version: 1.5.4 @@ -41,6 +41,9 @@ importers: micromatch: specifier: ^4.0.8 version: 4.0.8 + pm2: + specifier: latest + version: 6.0.14(supports-color@10.2.2) semver: specifier: ^7.7.3 version: 7.7.3 @@ -58,11 +61,11 @@ importers: specifier: ^0.0.4 version: 0.0.4 '@kevisual/query': - specifier: 0.0.35 - version: 0.0.35 + specifier: 0.0.37 + version: 0.0.37 '@kevisual/query-login': specifier: 0.0.7 - version: 0.0.7(@kevisual/query@0.0.35) + version: 0.0.7(@kevisual/query@0.0.37) '@types/bun': specifier: ^1.3.6 version: 1.3.6 @@ -105,12 +108,9 @@ importers: jsonwebtoken: specifier: ^9.0.3 version: 9.0.3 - pm2: - specifier: ^6.0.14 - version: 6.0.14(supports-color@10.2.2) tar: - specifier: ^7.5.4 - version: 7.5.4 + specifier: ^7.5.6 + version: 7.5.6 zustand: specifier: ^5.0.10 version: 5.0.10(@types/react@19.2.8)(react@19.2.3) @@ -118,8 +118,8 @@ importers: assistant: dependencies: '@aws-sdk/client-s3': - specifier: ^3.971.0 - version: 3.971.0 + specifier: ^3.972.0 + version: 3.972.0 '@kevisual/ha-api': specifier: ^0.0.6 version: 0.0.6 @@ -130,8 +130,8 @@ importers: specifier: ^0.0.13 version: 0.0.13(dotenv@17.2.3)(supports-color@10.2.2) '@opencode-ai/sdk': - specifier: ^1.1.26 - version: 1.1.26 + specifier: ^1.1.28 + version: 1.1.28 es-toolkit: specifier: ^1.44.0 version: 1.44.0 @@ -154,6 +154,9 @@ importers: '@kevisual/ai': specifier: ^0.0.21 version: 0.0.21 + '@kevisual/api': + specifier: ^0.0.22 + version: 0.0.22 '@kevisual/load': specifier: ^0.0.6 version: 0.0.6 @@ -164,23 +167,23 @@ importers: specifier: ^0.0.4 version: 0.0.4 '@kevisual/query': - specifier: 0.0.35 - version: 0.0.35 + specifier: 0.0.37 + version: 0.0.37 '@kevisual/query-login': specifier: 0.0.7 - version: 0.0.7(@kevisual/query@0.0.35) + version: 0.0.7(@kevisual/query@0.0.37) '@kevisual/router': - specifier: ^0.0.57 - version: 0.0.57 + specifier: ^0.0.60 + version: 0.0.60 '@kevisual/types': - specifier: ^0.0.11 - version: 0.0.11 + specifier: ^0.0.12 + version: 0.0.12 '@kevisual/use-config': specifier: ^1.0.28 version: 1.0.28(dotenv@17.2.3) '@opencode-ai/plugin': - specifier: ^1.1.26 - version: 1.1.26 + specifier: ^1.1.28 + version: 1.1.28 '@types/bun': specifier: ^1.3.6 version: 1.3.6 @@ -215,8 +218,8 @@ importers: specifier: ^7.1.0 version: 7.1.0 inquirer: - specifier: ^13.2.0 - version: 13.2.0(@types/node@25.0.9) + specifier: ^13.2.1 + version: 13.2.1(@types/node@25.0.9) lodash-es: specifier: ^4.17.22 version: 4.17.22 @@ -456,131 +459,131 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.971.0': - resolution: {integrity: sha512-BBUne390fKa4C4QvZlUZ5gKcu+Uyid4IyQ20N4jl0vS7SK2xpfXlJcgKqPW5ts6kx6hWTQBk6sH5Lf12RvuJxg==} + '@aws-sdk/client-s3@3.972.0': + resolution: {integrity: sha512-ghpDQtjZvbhbnHWymq/V5TL8NppdAGF2THAxYRRBLCJ5JRlq71T24NdovAzvzYaGdH7HtcRkgErBRsFT1gtq4g==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sso@3.971.0': - resolution: {integrity: sha512-Xx+w6DQqJxDdymYyIxyKJnRzPvVJ4e/Aw0czO7aC9L/iraaV7AG8QtRe93OGW6aoHSh72CIiinnpJJfLsQqP4g==} + '@aws-sdk/client-sso@3.972.0': + resolution: {integrity: sha512-5qw6qLiRE4SUiz0hWy878dSR13tSVhbTWhsvFT8mGHe37NRRiaobm5MA2sWD0deRAuO98djSiV+dhWXa1xIFNw==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.970.0': - resolution: {integrity: sha512-klpzObldOq8HXzDjDlY6K8rMhYZU6mXRz6P9F9N+tWnjoYFfeBMra8wYApydElTUYQKP1O7RLHwH1OKFfKcqIA==} + '@aws-sdk/core@3.972.0': + resolution: {integrity: sha512-nEeUW2M9F+xdIaD98F5MBcQ4ITtykj3yKbgFZ6J0JtL3bq+Z90szQ6Yy8H/BLPYXTs3V4n9ifnBo8cprRDiE6A==} engines: {node: '>=20.0.0'} - '@aws-sdk/crc64-nvme@3.969.0': - resolution: {integrity: sha512-IGNkP54HD3uuLnrPCYsv3ZD478UYq+9WwKrIVJ9Pdi3hxPg8562CH3ZHf8hEgfePN31P9Kj+Zu9kq2Qcjjt61A==} + '@aws-sdk/crc64-nvme@3.972.0': + resolution: {integrity: sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.970.0': - resolution: {integrity: sha512-rtVzXzEtAfZBfh+lq3DAvRar4c3jyptweOAJR2DweyXx71QSMY+O879hjpMwES7jl07a3O1zlnFIDo4KP/96kQ==} + '@aws-sdk/credential-provider-env@3.972.0': + resolution: {integrity: sha512-kKHoNv+maHlPQOAhYamhap0PObd16SAb3jwaY0KYgNTiSbeXlbGUZPLioo9oA3wU10zItJzx83ClU7d7h40luA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.970.0': - resolution: {integrity: sha512-CjDbWL7JxjLc9ZxQilMusWSw05yRvUJKRpz59IxDpWUnSMHC9JMMUUkOy5Izk8UAtzi6gupRWArp4NG4labt9Q==} + '@aws-sdk/credential-provider-http@3.972.0': + resolution: {integrity: sha512-xzEi81L7I5jGUbpmqEHCe7zZr54hCABdj4H+3LzktHYuovV/oqnvoDdvZpGFR0e/KAw1+PL38NbGrpG30j6qlA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.971.0': - resolution: {integrity: sha512-c0TGJG4xyfTZz3SInXfGU8i5iOFRrLmy4Bo7lMyH+IpngohYMYGYl61omXqf2zdwMbDv+YJ9AviQTcCaEUKi8w==} + '@aws-sdk/credential-provider-ini@3.972.0': + resolution: {integrity: sha512-ruhAMceUIq2aknFd3jhWxmO0P0Efab5efjyIXOkI9i80g+zDY5VekeSxfqRKStEEJSKSCHDLQuOu0BnAn4Rzew==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.971.0': - resolution: {integrity: sha512-yhbzmDOsk0RXD3rTPhZra4AWVnVAC4nFWbTp+sUty1hrOPurUmhuz8bjpLqYTHGnlMbJp+UqkQONhS2+2LzW2g==} + '@aws-sdk/credential-provider-login@3.972.0': + resolution: {integrity: sha512-SsrsFJsEYAJHO4N/r2P0aK6o8si6f1lprR+Ej8J731XJqTckSGs/HFHcbxOyW/iKt+LNUvZa59/VlJmjhF4bEQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.971.0': - resolution: {integrity: sha512-epUJBAKivtJqalnEBRsYIULKYV063o/5mXNJshZfyvkAgNIzc27CmmKRXTN4zaNOZg8g/UprFp25BGsi19x3nQ==} + '@aws-sdk/credential-provider-node@3.972.0': + resolution: {integrity: sha512-wwJDpEGl6+sOygic8QKu0OHVB8SiodqF1fr5jvUlSFfS6tJss/E9vBc2aFjl7zI6KpAIYfIzIgM006lRrZtWCQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.970.0': - resolution: {integrity: sha512-0XeT8OaT9iMA62DFV9+m6mZfJhrD0WNKf4IvsIpj2Z7XbaYfz3CoDDvNoALf3rPY9NzyMHgDxOspmqdvXP00mw==} + '@aws-sdk/credential-provider-process@3.972.0': + resolution: {integrity: sha512-nmzYhamLDJ8K+v3zWck79IaKMc350xZnWsf/GeaXO6E3MewSzd3lYkTiMi7lEp3/UwDm9NHfPguoPm+mhlSWQQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.971.0': - resolution: {integrity: sha512-dY0hMQ7dLVPQNJ8GyqXADxa9w5wNfmukgQniLxGVn+dMRx3YLViMp5ZpTSQpFhCWNF0oKQrYAI5cHhUJU1hETw==} + '@aws-sdk/credential-provider-sso@3.972.0': + resolution: {integrity: sha512-6mYyfk1SrMZ15cH9T53yAF4YSnvq4yU1Xlgm3nqV1gZVQzmF5kr4t/F3BU3ygbvzi4uSwWxG3I3TYYS5eMlAyg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.971.0': - resolution: {integrity: sha512-F1AwfNLr7H52T640LNON/h34YDiMuIqW/ZreGzhRR6vnFGaSPtNSKAKB2ssAMkLM8EVg8MjEAYD3NCUiEo+t/w==} + '@aws-sdk/credential-provider-web-identity@3.972.0': + resolution: {integrity: sha512-vsJXBGL8H54kz4T6do3p5elATj5d1izVGUXMluRJntm9/I0be/zUYtdd4oDTM2kSUmd4Zhyw3fMQ9lw7CVhd4A==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.969.0': - resolution: {integrity: sha512-MlbrlixtkTVhYhoasblKOkr7n2yydvUZjjxTnBhIuHmkyBS1619oGnTfq/uLeGYb4NYXdeQ5OYcqsRGvmWSuTw==} + '@aws-sdk/middleware-bucket-endpoint@3.972.0': + resolution: {integrity: sha512-IrIjAehc3PrseAGfk2ldtAf+N0BAnNHR1DCZIDh9IAcFrTVWC3Fi9KJdtabrxcY3Onpt/8opOco4EIEAWgMz7A==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-expect-continue@3.969.0': - resolution: {integrity: sha512-qXygzSi8osok7tH9oeuS3HoKw6jRfbvg5Me/X5RlHOvSSqQz8c5O9f3MjUApaCUSwbAU92KrbZWasw2PKiaVHg==} + '@aws-sdk/middleware-expect-continue@3.972.0': + resolution: {integrity: sha512-xyhDoY0qse8MvQC4RZCpT5WoIQ4/kwqv71Dh1s3mdXjL789Z4a6L/khBTSXECR5+egSZ960AInj3aR+CrezDRQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.971.0': - resolution: {integrity: sha512-+hGUDUxeIw8s2kkjfeXym0XZxdh0cqkHkDpEanWYdS1gnWkIR+gf9u/DKbKqGHXILPaqHXhWpLTQTVlaB4sI7Q==} + '@aws-sdk/middleware-flexible-checksums@3.972.0': + resolution: {integrity: sha512-zxK0ezmT7fLEPJ650S8QBc4rGDq5+5rdsLnnuZ6hPaZE4/+QtUoTw+gSDETyiWodNcRuz2ZWnqi17K+7nKtSRg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.969.0': - resolution: {integrity: sha512-AWa4rVsAfBR4xqm7pybQ8sUNJYnjyP/bJjfAw34qPuh3M9XrfGbAHG0aiAfQGrBnmS28jlO6Kz69o+c6PRw1dw==} + '@aws-sdk/middleware-host-header@3.972.0': + resolution: {integrity: sha512-3eztFI6F9/eHtkIaWKN3nT+PM+eQ6p1MALDuNshFk323ixuCZzOOVT8oUqtZa30Z6dycNXJwhlIq7NhUVFfimw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-location-constraint@3.969.0': - resolution: {integrity: sha512-zH7pDfMLG/C4GWMOpvJEoYcSpj7XsNP9+irlgqwi667sUQ6doHQJ3yyDut3yiTk0maq1VgmriPFELyI9lrvH/g==} + '@aws-sdk/middleware-location-constraint@3.972.0': + resolution: {integrity: sha512-WpsxoVPzbGPQGb/jupNYjpE0REcCPtjz7Q7zAt+dyo7fxsLBn4J+Rp6AYzSa04J9VrmrvCqCbVLu6B88PlSKSQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.969.0': - resolution: {integrity: sha512-xwrxfip7Y2iTtCMJ+iifN1E1XMOuhxIHY9DreMCvgdl4r7+48x2S1bCYPWH3eNY85/7CapBWdJ8cerpEl12sQQ==} + '@aws-sdk/middleware-logger@3.972.0': + resolution: {integrity: sha512-ZvdyVRwzK+ra31v1pQrgbqR/KsLD+wwJjHgko6JfoKUBIcEfAwJzQKO6HspHxdHWTVUz6MgvwskheR/TTYZl2g==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.969.0': - resolution: {integrity: sha512-2r3PuNquU3CcS1Am4vn/KHFwLi8QFjMdA/R+CRDXT4AFO/0qxevF/YStW3gAKntQIgWgQV8ZdEtKAoJvLI4UWg==} + '@aws-sdk/middleware-recursion-detection@3.972.0': + resolution: {integrity: sha512-F2SmUeO+S6l1h6dydNet3BQIk173uAkcfU1HDkw/bUdRLAnh15D3HP9vCZ7oCPBNcdEICbXYDmx0BR9rRUHGlQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.970.0': - resolution: {integrity: sha512-v/Y5F1lbFFY7vMeG5yYxuhnn0CAshz6KMxkz1pDyPxejNE9HtA0w8R6OTBh/bVdIm44QpjhbI7qeLdOE/PLzXQ==} + '@aws-sdk/middleware-sdk-s3@3.972.0': + resolution: {integrity: sha512-0bcKFXWx+NZ7tIlOo7KjQ+O2rydiHdIQahrq+fN6k9Osky29v17guy68urUKfhTobR6iY6KvxkroFWaFtTgS5w==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-ssec@3.971.0': - resolution: {integrity: sha512-QGVhvRveYG64ZhnS/b971PxXM6N2NU79Fxck4EfQ7am8v1Br0ctoeDDAn9nXNblLGw87we9Z65F7hMxxiFHd3w==} + '@aws-sdk/middleware-ssec@3.972.0': + resolution: {integrity: sha512-cEr2HtK4R2fi8Y0P95cjbr4KJOjKBt8ms95mEJhabJN8KM4CpD4iS/J1lhvMj+qWir0KBTV6gKmxECXdfL9S6w==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.970.0': - resolution: {integrity: sha512-dnSJGGUGSFGEX2NzvjwSefH+hmZQ347AwbLhAsi0cdnISSge+pcGfOFrJt2XfBIypwFe27chQhlfuf/gWdzpZg==} + '@aws-sdk/middleware-user-agent@3.972.0': + resolution: {integrity: sha512-kFHQm2OCBJCzGWRafgdWHGFjitUXY/OxXngymcX4l8CiyiNDZB27HDDBg2yLj3OUJc4z4fexLMmP8r9vgag19g==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.971.0': - resolution: {integrity: sha512-TWaILL8GyYlhGrxxnmbkazM4QsXatwQgoWUvo251FXmUOsiXDFDVX3hoGIfB3CaJhV2pJPfebHUNJtY6TjZ11g==} + '@aws-sdk/nested-clients@3.972.0': + resolution: {integrity: sha512-QGlbnuGzSQJVG6bR9Qw6G0Blh6abFR4VxNa61ttMbzy9jt28xmk2iGtrYLrQPlCCPhY6enHqjTWm3n3LOb0wAw==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.969.0': - resolution: {integrity: sha512-scj9OXqKpcjJ4jsFLtqYWz3IaNvNOQTFFvEY8XMJXTv+3qF5I7/x9SJtKzTRJEBF3spjzBUYPtGFbs9sj4fisQ==} + '@aws-sdk/region-config-resolver@3.972.0': + resolution: {integrity: sha512-JyOf+R/6vJW8OEVFCAyzEOn2reri/Q+L0z9zx4JQSKWvTmJ1qeFO25sOm8VIfB8URKhfGRTQF30pfYaH2zxt/A==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.970.0': - resolution: {integrity: sha512-z3syXfuK/x/IsKf/AeYmgc2NT7fcJ+3fHaGO+fkghkV9WEba3fPyOwtTBX4KpFMNb2t50zDGZwbzW1/5ighcUQ==} + '@aws-sdk/signature-v4-multi-region@3.972.0': + resolution: {integrity: sha512-2udiRijmjpN81Pvajje4TsjbXDZNP6K9bYUanBYH8hXa/tZG5qfGCySD+TyX0sgDxCQmEDMg3LaQdfjNHBDEgQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.971.0': - resolution: {integrity: sha512-4hKGWZbmuDdONMJV0HJ+9jwTDb0zLfKxcCLx2GEnBY31Gt9GeyIQ+DZ97Bb++0voawj6pnZToFikXTyrEq2x+w==} + '@aws-sdk/token-providers@3.972.0': + resolution: {integrity: sha512-kWlXG+y5nZhgXGEtb72Je+EvqepBPs8E3vZse//1PYLWs2speFqbGE/ywCXmzEJgHgVqSB/u/lqBvs5WlYmSqQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.969.0': - resolution: {integrity: sha512-7IIzM5TdiXn+VtgPdVLjmE6uUBUtnga0f4RiSEI1WW10RPuNvZ9U+pL3SwDiRDAdoGrOF9tSLJOFZmfuwYuVYQ==} + '@aws-sdk/types@3.972.0': + resolution: {integrity: sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-arn-parser@3.968.0': - resolution: {integrity: sha512-gqqvYcitIIM2K4lrDX9de9YvOfXBcVdxfT/iLnvHJd4YHvSXlt+gs+AsL4FfPCxG4IG9A+FyulP9Sb1MEA75vw==} + '@aws-sdk/util-arn-parser@3.972.0': + resolution: {integrity: sha512-RM5Mmo/KJ593iMSrALlHEOcc9YOIyOsDmS5x2NLOMdEmzv1o00fcpAkCQ02IGu1eFneBFT7uX0Mpag0HI+Cz2g==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.970.0': - resolution: {integrity: sha512-TZNZqFcMUtjvhZoZRtpEGQAdULYiy6rcGiXAbLU7e9LSpIYlRqpLa207oMNfgbzlL2PnHko+eVg8rajDiSOYCg==} + '@aws-sdk/util-endpoints@3.972.0': + resolution: {integrity: sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==} engines: {node: '>=20.0.0'} '@aws-sdk/util-locate-window@3.965.2': resolution: {integrity: sha512-qKgO7wAYsXzhwCHhdbaKFyxd83Fgs8/1Ka+jjSPrv2Ll7mB55Wbwlo0kkfMLh993/yEc8aoDIAc1Fz9h4Spi4Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-user-agent-browser@3.969.0': - resolution: {integrity: sha512-bpJGjuKmFr0rA6UKUCmN8D19HQFMLXMx5hKBXqBlPFdalMhxJSjcxzX9DbQh0Fn6bJtxCguFmRGOBdQqNOt49g==} + '@aws-sdk/util-user-agent-browser@3.972.0': + resolution: {integrity: sha512-eOLdkQyoRbDgioTS3Orr7iVsVEutJyMZxvyZ6WAF95IrF0kfWx5Rd/KXnfbnG/VKa2CvjZiitWfouLzfVEyvJA==} - '@aws-sdk/util-user-agent-node@3.971.0': - resolution: {integrity: sha512-Eygjo9mFzQYjbGY3MYO6CsIhnTwAMd3WmuFalCykqEmj2r5zf0leWrhPaqvA5P68V5JdGfPYgj7vhNOd6CtRBQ==} + '@aws-sdk/util-user-agent-node@3.972.0': + resolution: {integrity: sha512-GOy+AiSrE9kGiojiwlZvVVSXwylu4+fmP0MJfvras/MwP09RB/YtQuOVR1E0fKQc6OMwaTNBjgAbOEhxuWFbAw==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -588,8 +591,8 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.969.0': - resolution: {integrity: sha512-BSe4Lx/qdRQQdX8cSSI7Et20vqBspzAjBy8ZmXVoyLkol3y4sXBXzn+BiLtR+oh60ExQn6o2DU4QjdOZbXaKIQ==} + '@aws-sdk/xml-builder@3.972.0': + resolution: {integrity: sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg==} engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.2.3': @@ -1275,6 +1278,9 @@ packages: '@kevisual/api@0.0.17': resolution: {integrity: sha512-hW3Q182Lm8wggWfHTEKVTKsmp8MWFINB9l82nEbnwTnd1Lh9DPeQo1hMft7aeL8aGe4vjFCTv4MHixXjmQTzGg==} + '@kevisual/api@0.0.22': + resolution: {integrity: sha512-e+C6zmSg6zGy7elyo68ZVJ67YdG+8lFbw3wDjMKcPyUIg51x4DqbbW8NZMNzK5k0YsM8p+HAZv43wMB4SeSNqQ==} + '@kevisual/app@0.0.1': resolution: {integrity: sha512-PEx8P3l0iNSqrz9Ib9kVCYfqNMX6/LfNu+cEafmY6ECP1cV5Vmv+TH2fuasMosKjtbH2fAdDi97sbd29tdEK+g==} @@ -1300,6 +1306,9 @@ packages: '@kevisual/js-filter@0.0.3': resolution: {integrity: sha512-vgUB2fUAWS75GUFr/a/tGSSDrPUUmVDktO38k3hIKwU3ZE4tpuhcVxrpUbkXlFS5i0rbL2mAQeID1C6kIlMGRg==} + '@kevisual/js-filter@0.0.5': + resolution: {integrity: sha512-+S+Sf3K/aP6XtZI2s7TgKOr35UuvUvtpJ9YDW30a+mY0/N8gRuzyKhieBzQN7Ykayzz70uoMavBXut2rUlLgzw==} + '@kevisual/kv-code@0.0.4': resolution: {integrity: sha512-9T7//119inomxhddfp0IRrXRzP0nbe0U7hiy+qgfghEbjKGTMkc8rdznz61xBjjMlonTPZnDikedYwNRTykWEw==} @@ -1332,6 +1341,9 @@ packages: '@kevisual/query@0.0.35': resolution: {integrity: sha512-80dyy2LMCmEC72g+X4QWUKlZErhawQPgnGSBNR4yhrBcFgHIJQ14LR1Z+bS5S1I7db+1PDNpaxBTjIaoYoXunw==} + '@kevisual/query@0.0.37': + resolution: {integrity: sha512-ukBhExI7PdQZMfPYjLGbgf7/MJWtNcJbiHcvI1YLwEQnPotjNn5gLxeizfgCR1iW62+fg5Rj2s7Lq9FrvvxaYw==} + '@kevisual/registry@0.0.1': resolution: {integrity: sha512-//OHu9m4JDrMjgP8o8dcjZd3D3IAUkRVlkTSviouZEH7r5m7mccA3Hvzw0XJ/lelx6exC6LWsyv6c4uV0Dp+gw==} @@ -1344,12 +1356,15 @@ packages: '@kevisual/router@0.0.51': resolution: {integrity: sha512-i9qYBeS/um78oC912oWJD3iElB+5NTKyTrz1Hzf4DckiUFnjLL81UPwjIh5I2l9+ul0IZ/Pxx+sFSF99fJkzKg==} - '@kevisual/router@0.0.57': - resolution: {integrity: sha512-ZkbzsZD0FEXKBwLfjT4Evki8akHTPWUTZmnz7eGYnfloWDGudRtPJxqSLhzQ1AqfFuSDKJ8XR52Aa4CKdR05lA==} + '@kevisual/router@0.0.60': + resolution: {integrity: sha512-2v/ZzUstsaq+Uqo+tZX9ys5E+/2erPggCtljv9jTb3NA88ZdHsYUAsd5wUFvLtf9QucpJCzyWEt+InDV/98FKw==} '@kevisual/types@0.0.11': resolution: {integrity: sha512-idNLDTEKVdNXZHFQq8PTN62nflh94kvGtx+v8YDcMxt0Zo+HWVZTFElm+dMQxAs/vn4wo8F2r3VwzWNX/vcqwQ==} + '@kevisual/types@0.0.12': + resolution: {integrity: sha512-zJXH2dosir3jVrQ6QG4i0+iLQeT9gJ3H+cKXs8ReWboxBSYzUZO78XssVeVrFPsJ33iaAqo4q3DWbSS1dWGn7Q==} + '@kevisual/use-config@1.0.28': resolution: {integrity: sha512-ngF+LDbjxpXWrZNmnShIKF/jPpAa+ezV+DcgoZIIzHlRnIjE+rr9sLkN/B7WJbiH9C/j1tQXOILY8ujBqILrow==} peerDependencies: @@ -1411,11 +1426,11 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@opencode-ai/plugin@1.1.26': - resolution: {integrity: sha512-GnhLZuw9NHDJwY5msUZnFIWiLc0SnoBXWZNfnWF5+hu0fcVLgul8gqB2VK4kUv+KOQlzCVMILYikSSQkMYp7RQ==} + '@opencode-ai/plugin@1.1.28': + resolution: {integrity: sha512-EGHjxobzEC2HffJmXtTgWCtmyp6dRELLw/VGtEPsNPkg2wQ21G1RqxpuipNzR+730K2MSElw/bdAr1zNhd2T6A==} - '@opencode-ai/sdk@1.1.26': - resolution: {integrity: sha512-5s+yxNJy7DpWwDq0L//F2sqKERz4640DmDLyrRlFXmckx5prnzFl3liEOOTySOL2WaxgVwjYw8OBiT15v2mAgA==} + '@opencode-ai/sdk@1.1.28': + resolution: {integrity: sha512-fR5mPWu4O6Pu1u+Bj5eUpZix1PCOSSDh7GeE/KyM5pFEqLLoxcNjon5XRMNVggGI4zEFjq48pxdpP4z4mbGeew==} '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} @@ -3442,8 +3457,8 @@ packages: inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} - inquirer@13.2.0: - resolution: {integrity: sha512-4CBv58vLrL4CnMgrscW/T5cLvfWM2nRLevttTiZTQyku7YV7/pc2IKyABBU2rDfVl4PiIB0sTRcwOac7BIYKLA==} + inquirer@13.2.1: + resolution: {integrity: sha512-kjIN+joqgbSncQJ6GfN7gV9AbDQlMA+hJ96xcwkQUwP9KN/ZIusoJ2mAfdt0LPrZJQsEyk5i/YrgJQTxSgzlPw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -4662,8 +4677,8 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} - tar@7.5.4: - resolution: {integrity: sha512-AN04xbWGrSTDmVwlI4/GTlIIwMFk/XEv7uL8aa57zuvRy6s4hdBed+lVq2fAZ89XDa7Us3ANXcE3Tvqvja1kTA==} + tar@7.5.6: + resolution: {integrity: sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==} engines: {node: '>=18'} throttle-debounce@5.0.2: @@ -5254,20 +5269,20 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 '@aws-sdk/util-locate-window': 3.965.2 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -5277,7 +5292,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 '@aws-sdk/util-locate-window': 3.965.2 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -5285,7 +5300,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -5294,33 +5309,33 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.971.0': + '@aws-sdk/client-s3@3.972.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.970.0 - '@aws-sdk/credential-provider-node': 3.971.0 - '@aws-sdk/middleware-bucket-endpoint': 3.969.0 - '@aws-sdk/middleware-expect-continue': 3.969.0 - '@aws-sdk/middleware-flexible-checksums': 3.971.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.970.0 - '@aws-sdk/middleware-ssec': 3.971.0 - '@aws-sdk/middleware-user-agent': 3.970.0 - '@aws-sdk/region-config-resolver': 3.969.0 - '@aws-sdk/signature-v4-multi-region': 3.970.0 - '@aws-sdk/types': 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.971.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/credential-provider-node': 3.972.0 + '@aws-sdk/middleware-bucket-endpoint': 3.972.0 + '@aws-sdk/middleware-expect-continue': 3.972.0 + '@aws-sdk/middleware-flexible-checksums': 3.972.0 + '@aws-sdk/middleware-host-header': 3.972.0 + '@aws-sdk/middleware-location-constraint': 3.972.0 + '@aws-sdk/middleware-logger': 3.972.0 + '@aws-sdk/middleware-recursion-detection': 3.972.0 + '@aws-sdk/middleware-sdk-s3': 3.972.0 + '@aws-sdk/middleware-ssec': 3.972.0 + '@aws-sdk/middleware-user-agent': 3.972.0 + '@aws-sdk/region-config-resolver': 3.972.0 + '@aws-sdk/signature-v4-multi-region': 3.972.0 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/util-endpoints': 3.972.0 + '@aws-sdk/util-user-agent-browser': 3.972.0 + '@aws-sdk/util-user-agent-node': 3.972.0 '@smithy/config-resolver': 4.4.6 '@smithy/core': 3.20.6 '@smithy/eventstream-serde-browser': 4.2.8 @@ -5358,20 +5373,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.971.0': + '@aws-sdk/client-sso@3.972.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.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.970.0 - '@aws-sdk/region-config-resolver': 3.969.0 - '@aws-sdk/types': 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.971.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/middleware-host-header': 3.972.0 + '@aws-sdk/middleware-logger': 3.972.0 + '@aws-sdk/middleware-recursion-detection': 3.972.0 + '@aws-sdk/middleware-user-agent': 3.972.0 + '@aws-sdk/region-config-resolver': 3.972.0 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/util-endpoints': 3.972.0 + '@aws-sdk/util-user-agent-browser': 3.972.0 + '@aws-sdk/util-user-agent-node': 3.972.0 '@smithy/config-resolver': 4.4.6 '@smithy/core': 3.20.6 '@smithy/fetch-http-handler': 5.3.9 @@ -5401,10 +5416,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.970.0': + '@aws-sdk/core@3.972.0': dependencies: - '@aws-sdk/types': 3.969.0 - '@aws-sdk/xml-builder': 3.969.0 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/xml-builder': 3.972.0 '@smithy/core': 3.20.6 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 @@ -5417,23 +5432,23 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/crc64-nvme@3.969.0': + '@aws-sdk/crc64-nvme@3.972.0': dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.970.0': + '@aws-sdk/credential-provider-env@3.972.0': dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/property-provider': 4.2.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.970.0': + '@aws-sdk/credential-provider-http@3.972.0': dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/node-http-handler': 4.4.8 '@smithy/property-provider': 4.2.8 @@ -5443,17 +5458,17 @@ snapshots: '@smithy/util-stream': 4.5.10 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.971.0': + '@aws-sdk/credential-provider-ini@3.972.0': dependencies: - '@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.971.0 - '@aws-sdk/credential-provider-process': 3.970.0 - '@aws-sdk/credential-provider-sso': 3.971.0 - '@aws-sdk/credential-provider-web-identity': 3.971.0 - '@aws-sdk/nested-clients': 3.971.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/credential-provider-env': 3.972.0 + '@aws-sdk/credential-provider-http': 3.972.0 + '@aws-sdk/credential-provider-login': 3.972.0 + '@aws-sdk/credential-provider-process': 3.972.0 + '@aws-sdk/credential-provider-sso': 3.972.0 + '@aws-sdk/credential-provider-web-identity': 3.972.0 + '@aws-sdk/nested-clients': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -5462,11 +5477,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.971.0': + '@aws-sdk/credential-provider-login@3.972.0': dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/nested-clients': 3.971.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/nested-clients': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -5475,15 +5490,15 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.971.0': + '@aws-sdk/credential-provider-node@3.972.0': dependencies: - '@aws-sdk/credential-provider-env': 3.970.0 - '@aws-sdk/credential-provider-http': 3.970.0 - '@aws-sdk/credential-provider-ini': 3.971.0 - '@aws-sdk/credential-provider-process': 3.970.0 - '@aws-sdk/credential-provider-sso': 3.971.0 - '@aws-sdk/credential-provider-web-identity': 3.971.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/credential-provider-env': 3.972.0 + '@aws-sdk/credential-provider-http': 3.972.0 + '@aws-sdk/credential-provider-ini': 3.972.0 + '@aws-sdk/credential-provider-process': 3.972.0 + '@aws-sdk/credential-provider-sso': 3.972.0 + '@aws-sdk/credential-provider-web-identity': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -5492,21 +5507,21 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.970.0': + '@aws-sdk/credential-provider-process@3.972.0': dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/types': 3.972.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.971.0': + '@aws-sdk/credential-provider-sso@3.972.0': dependencies: - '@aws-sdk/client-sso': 3.971.0 - '@aws-sdk/core': 3.970.0 - '@aws-sdk/token-providers': 3.971.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/client-sso': 3.972.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/token-providers': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 @@ -5514,11 +5529,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.971.0': + '@aws-sdk/credential-provider-web-identity@3.972.0': dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/nested-clients': 3.971.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/nested-clients': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 @@ -5526,31 +5541,31 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-bucket-endpoint@3.969.0': + '@aws-sdk/middleware-bucket-endpoint@3.972.0': dependencies: - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-arn-parser': 3.968.0 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/util-arn-parser': 3.972.0 '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 '@smithy/util-config-provider': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.969.0': + '@aws-sdk/middleware-expect-continue@3.972.0': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.971.0': + '@aws-sdk/middleware-flexible-checksums@3.972.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.970.0 - '@aws-sdk/crc64-nvme': 3.969.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/crc64-nvme': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/is-array-buffer': 4.2.0 '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 @@ -5560,38 +5575,38 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.969.0': + '@aws-sdk/middleware-host-header@3.972.0': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.969.0': + '@aws-sdk/middleware-location-constraint@3.972.0': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.969.0': + '@aws-sdk/middleware-logger@3.972.0': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.969.0': + '@aws-sdk/middleware-recursion-detection@3.972.0': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 '@aws/lambda-invoke-store': 0.2.3 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.970.0': + '@aws-sdk/middleware-sdk-s3@3.972.0': dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-arn-parser': 3.968.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/util-arn-parser': 3.972.0 '@smithy/core': 3.20.6 '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 @@ -5604,36 +5619,36 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.971.0': + '@aws-sdk/middleware-ssec@3.972.0': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.970.0': + '@aws-sdk/middleware-user-agent@3.972.0': dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-endpoints': 3.970.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/util-endpoints': 3.972.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.971.0': + '@aws-sdk/nested-clients@3.972.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.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.970.0 - '@aws-sdk/region-config-resolver': 3.969.0 - '@aws-sdk/types': 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.971.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/middleware-host-header': 3.972.0 + '@aws-sdk/middleware-logger': 3.972.0 + '@aws-sdk/middleware-recursion-detection': 3.972.0 + '@aws-sdk/middleware-user-agent': 3.972.0 + '@aws-sdk/region-config-resolver': 3.972.0 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/util-endpoints': 3.972.0 + '@aws-sdk/util-user-agent-browser': 3.972.0 + '@aws-sdk/util-user-agent-node': 3.972.0 '@smithy/config-resolver': 4.4.6 '@smithy/core': 3.20.6 '@smithy/fetch-http-handler': 5.3.9 @@ -5663,28 +5678,28 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.969.0': + '@aws-sdk/region-config-resolver@3.972.0': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 '@smithy/config-resolver': 4.4.6 '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.970.0': + '@aws-sdk/signature-v4-multi-region@3.972.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.970.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/middleware-sdk-s3': 3.972.0 + '@aws-sdk/types': 3.972.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.971.0': + '@aws-sdk/token-providers@3.972.0': dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/nested-clients': 3.971.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/nested-clients': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 @@ -5692,18 +5707,18 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.969.0': + '@aws-sdk/types@3.972.0': dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.968.0': + '@aws-sdk/util-arn-parser@3.972.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.970.0': + '@aws-sdk/util-endpoints@3.972.0': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-endpoints': 3.2.8 @@ -5713,22 +5728,22 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.969.0': + '@aws-sdk/util-user-agent-browser@3.972.0': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.972.0 '@smithy/types': 4.12.0 bowser: 2.13.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.971.0': + '@aws-sdk/util-user-agent-node@3.972.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.970.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/middleware-user-agent': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.969.0': + '@aws-sdk/xml-builder@3.972.0': dependencies: '@smithy/types': 4.12.0 fast-xml-parser: 5.2.5 @@ -6398,6 +6413,14 @@ snapshots: eventemitter3: 5.0.4 nanoid: 5.1.6 + '@kevisual/api@0.0.22': + dependencies: + '@kevisual/js-filter': 0.0.5 + '@kevisual/load': 0.0.6 + es-toolkit: 1.44.0 + eventemitter3: 5.0.4 + nanoid: 5.1.6 + '@kevisual/app@0.0.1(dotenv@17.2.3)': dependencies: '@kevisual/ai': 0.0.19 @@ -6454,6 +6477,8 @@ snapshots: '@kevisual/js-filter@0.0.3': {} + '@kevisual/js-filter@0.0.5': {} + '@kevisual/kv-code@0.0.4(@types/react@19.2.8)(dotenv@17.2.3)': dependencies: '@codemirror/autocomplete': 6.20.0 @@ -6507,6 +6532,12 @@ snapshots: '@kevisual/query': 0.0.35 dotenv: 17.2.3 + '@kevisual/query-login@0.0.7(@kevisual/query@0.0.37)': + dependencies: + '@kevisual/cache': 0.0.3 + '@kevisual/query': 0.0.37 + dotenv: 17.2.3 + '@kevisual/query@0.0.31': {} '@kevisual/query@0.0.32': {} @@ -6515,6 +6546,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@kevisual/query@0.0.37': + dependencies: + tslib: 2.8.1 + '@kevisual/registry@0.0.1(typescript@5.8.2)': dependencies: class-variance-authority: 0.7.1 @@ -6557,12 +6592,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@kevisual/router@0.0.57': + '@kevisual/router@0.0.60': dependencies: hono: 4.11.4 '@kevisual/types@0.0.11': {} + '@kevisual/types@0.0.12': {} + '@kevisual/use-config@1.0.28(dotenv@17.2.3)': dependencies: '@kevisual/load': 0.0.6 @@ -6672,12 +6709,12 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@opencode-ai/plugin@1.1.26': + '@opencode-ai/plugin@1.1.28': dependencies: - '@opencode-ai/sdk': 1.1.26 + '@opencode-ai/sdk': 1.1.28 zod: 4.1.8 - '@opencode-ai/sdk@1.1.26': {} + '@opencode-ai/sdk@1.1.28': {} '@oslojs/encoding@1.1.0': {} @@ -9205,7 +9242,7 @@ snapshots: inline-style-parser@0.2.7: {} - inquirer@13.2.0(@types/node@25.0.9): + inquirer@13.2.1(@types/node@25.0.9): dependencies: '@inquirer/ansi': 2.0.3 '@inquirer/core': 11.1.1(@types/node@25.0.9) @@ -10827,7 +10864,7 @@ snapshots: tapable@2.3.0: {} - tar@7.5.4: + tar@7.5.6: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 diff --git a/src/command/cc.ts b/src/command/claude/cc.ts similarity index 85% rename from src/command/cc.ts rename to src/command/claude/cc.ts index 94cf115..2fe2daa 100644 --- a/src/command/cc.ts +++ b/src/command/claude/cc.ts @@ -1,5 +1,5 @@ import { program, Command } from '@/program.ts'; -import { chalk } from '../module/chalk.ts'; +import { chalk } from '../../module/chalk.ts'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { useKey } from '@kevisual/use-config'; @@ -7,7 +7,7 @@ import os from 'node:os' import fs from 'node:fs'; import { select } from '@inquirer/prompts'; -const MODELS = ['minimax', 'glm', 'volcengine'] as const; +const MODELS = ['minimax', 'glm', 'volcengine', 'bailian'] as const; type Model = typeof MODELS[number]; const changeMinimax = (token?: string) => { @@ -53,7 +53,20 @@ const changeVolcengine = (token?: string) => { } } } - +const changeBailian = (token?: string) => { + const auth_token = token || useKey('BAILIAN_API_KEY') + return { + "env": { + "ANTHROPIC_AUTH_TOKEN": auth_token, + "ANTHROPIC_BASE_URL": "https://coding.dashscope.aliyuncs.com/apps/anthropic", + "ANTHROPIC_DEFAULT_HAIKU_MODEL": "qwen3-coder-plus", + "ANTHROPIC_DEFAULT_OPUS_MODEL": "qwen3-coder-plus", + "ANTHROPIC_DEFAULT_SONNET_MODEL": "qwen3-coder-plus", + "ANTHROPIC_MODEL": "qwen3-coder-plus" + }, + "includeCoAuthoredBy": false + } +} /** * 跳过登录检查,在~/.claude.json的配置中添加字段 "hasCompletedOnboarding": true */ @@ -83,6 +96,7 @@ const modelConfig: Record object> = { minimax: changeMinimax, glm: changeGLM, volcengine: changeVolcengine, + bailian: changeBailian, }; const readOrCreateConfig = (configPath: string): Record => { diff --git a/src/command/opencode/plugin.ts b/src/command/opencode/plugin.ts new file mode 100644 index 0000000..15e482c --- /dev/null +++ b/src/command/opencode/plugin.ts @@ -0,0 +1,2 @@ +// TODO: 对 .opencode/plugin/agent.ts 的内容进行管理 +// 例如添加、删除、列出等操作 \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index becaccf..d149b16 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,7 +17,7 @@ import './command/gist/index.ts'; import './command/config-remote.ts'; import './command/config-secret-remote.ts'; import './command/ai.ts'; -import './command/cc.ts' +import './command/claude/cc.ts' import './command/docker.ts'; // program.parse(process.argv);