diff --git a/assistant/package.json b/assistant/package.json index 677e8f2..aa509ec 100644 --- a/assistant/package.json +++ b/assistant/package.json @@ -53,13 +53,13 @@ "@kevisual/router": "^0.0.64", "@kevisual/types": "^0.0.12", "@kevisual/use-config": "^1.0.28", - "@opencode-ai/plugin": "^1.1.44", + "@opencode-ai/plugin": "^1.1.47", "@types/bun": "^1.3.8", "@types/node": "^25.1.0", "@types/send": "^1.2.1", "@types/ws": "^8.18.1", "chalk": "^5.6.2", - "commander": "^14.0.2", + "commander": "^14.0.3", "cross-env": "^10.1.0", "dayjs": "^1.11.19", "dotenv": "^17.2.3", @@ -77,12 +77,12 @@ "access": "public" }, "dependencies": { - "@aws-sdk/client-s3": "^3.978.0", - "@kevisual/ha-api": "^0.0.6", + "@aws-sdk/client-s3": "^3.980.0", + "@kevisual/ha-api": "^0.0.8", "@kevisual/js-filter": "^0.0.5", - "@kevisual/oss": "^0.0.16", + "@kevisual/oss": "^0.0.18", "@kevisual/video-tools": "^0.0.13", - "@opencode-ai/sdk": "^1.1.44", + "@opencode-ai/sdk": "^1.1.47", "es-toolkit": "^1.44.0", "eventemitter3": "^5.0.4", "lowdb": "^7.0.1", diff --git a/assistant/src/command/asst-server/index.ts b/assistant/src/command/asst-server/index.ts index c18fd89..9ed214f 100644 --- a/assistant/src/command/asst-server/index.ts +++ b/assistant/src/command/asst-server/index.ts @@ -1,6 +1,7 @@ import { program, Command } from '@/program.ts'; import { spawnSync } from 'node:child_process'; - +import { parseHomeArg, HomeConfigDir } from '@/module/assistant/config/args.ts'; +import './reload.ts' const command = new Command('server') .description('启动服务') .option('-d, --daemon', '是否以守护进程方式运行') @@ -28,17 +29,22 @@ const command = new Command('server') shellCommands.push(`-e ${options.interpreter}`); } const basename = _interpreter.split('/').pop(); + const m = parseHomeArg(HomeConfigDir); + const cwd = m.isDev ? process.cwd() : m.configDir; + console.log('当前工作目录:', cwd); if (basename.includes('bun')) { console.log(`Assistant server shell command: bun src/run-server.ts server ${shellCommands.join(' ')}`); const child = spawnSync(_interpreter, ['src/run-server.ts', ...shellCommands], { stdio: 'inherit', shell: true, + cwd: cwd, }); } else { console.log(`Assistant server shell command: asst-server ${shellCommands.join(' ')}`); const child = spawnSync('asst-server', shellCommands, { stdio: 'inherit', shell: true, + cwd: cwd, }); } }); diff --git a/assistant/src/command/asst-server/reload.ts b/assistant/src/command/asst-server/reload.ts new file mode 100644 index 0000000..ba5d7db --- /dev/null +++ b/assistant/src/command/asst-server/reload.ts @@ -0,0 +1,17 @@ +import { program, Command } from '@/program.ts'; +import { spawnSync } from 'node:child_process'; + +const reload = new Command('reload') + .description('重载正在运行的 Assistant Server 服务') + .action(() => { + console.log('正在重载 Assistant Server 服务...'); + const cwd = 'pm2 restart assistant-server'; + const child = spawnSync('pm2', ['restart', 'assistant-server'], { + stdio: 'inherit', + shell: true, + cwd: cwd, + }); + console.log('Assistant Server 服务重载完成。'); + }); + +program.addCommand(reload); \ No newline at end of file diff --git a/assistant/src/command/plugins/install.ts b/assistant/src/command/plugins/install.ts new file mode 100644 index 0000000..c5e6600 --- /dev/null +++ b/assistant/src/command/plugins/install.ts @@ -0,0 +1,79 @@ +import { program, Command, assistantConfig } from '@/program.ts'; +import { spawnSync } from 'node:child_process'; +import { parseHomeArg, HomeConfigDir } from '@/module/assistant/config/args.ts'; +import { execCommand } from '@/module/npm-install.ts'; + +/** + * 解析包名,分离出安装包名和配置名称 + * 例如: @kevisual/cnb/routes -> pkgName: @kevisual/cnb, configName: routes + * 例如: react -> pkgName: react, configName: react + */ +function parsePluginName(name: string): { pkgName: string; configName: string } { + if (name.startsWith('@') && name.includes('/')) { + const parts = name.split('/'); + if (parts.length >= 3) { + // @scope/package/submodule -> pkgName: @scope/package, configName: @scope/package/submodule + return { + pkgName: parts.slice(0, 2).join('/'), + configName: name, + }; + } + } + return { pkgName: name, configName: name }; +} + +const pluginCommand = new Command('plugin'); + +const installCommand = new Command('install') + .alias('i') + .argument('') + .description('安装Routes插件').action(async (name, options) => { + const { pkgName, configName } = parsePluginName(name); + const m = parseHomeArg(HomeConfigDir); + const cwd = m.isDev ? process.cwd() : m.configDir; + const shellCommand = `pnpm i ${pkgName} -w`; + const result = execCommand(shellCommand, { cwd }); + if (result.status === 0) { + const mount = assistantConfig.checkMounted(); + const config = assistantConfig.getConfig(); + const routes = config.routes || []; + if (!routes.includes(configName)) { + routes.push(configName); + config.routes = routes; + assistantConfig.setConfig(config); + console.log(`插件 ${configName} 安装成功并已添加到配置中。`); + } else { + console.log(`插件 ${configName} 已存在于配置中。`); + } + } + }); + +const uninstallCommand = new Command('remove') + .alias('r') + .argument('') + .description('卸载Routes插件').action(async (name, options) => { + const { pkgName, configName } = parsePluginName(name); + const m = parseHomeArg(HomeConfigDir); + const cwd = m.isDev ? process.cwd() : m.configDir; + const shellCommand = `pnpm remove ${pkgName} -w`; + const result = execCommand(shellCommand, { cwd }); + assistantConfig.checkMounted(); + const config = assistantConfig.getConfig(); + let routes = config.routes || []; + // 从配置中移除时,查找匹配的配置名称 + const index = routes.findIndex(r => r === configName); + if (index !== -1) { + routes.splice(index, 1); + config.routes = routes; + assistantConfig.setConfig(config); + console.log(`插件 ${configName} 卸载成功并已从配置中移除。`); + } else { + console.log(`插件 ${configName} 不存在于配置中。`); + } + }); + +pluginCommand.addCommand(uninstallCommand); + +pluginCommand.addCommand(installCommand); + +program.addCommand(pluginCommand); \ No newline at end of file diff --git a/assistant/src/index.ts b/assistant/src/index.ts index df960a9..11bec8b 100644 --- a/assistant/src/index.ts +++ b/assistant/src/index.ts @@ -5,6 +5,7 @@ import './command/asst-server/index.ts'; import './command/app/index.ts'; import './command/run-scripts/index.ts'; import './command/ai/index.ts'; +import './command/plugins/install.ts'; /** * 通过命令行解析器解析参数 diff --git a/assistant/src/module/assistant/config/args.ts b/assistant/src/module/assistant/config/args.ts new file mode 100644 index 0000000..8bbc4c3 --- /dev/null +++ b/assistant/src/module/assistant/config/args.ts @@ -0,0 +1,86 @@ + + +import { logger } from '@/module/logger.ts'; +import path from 'path'; +import { homedir } from 'os'; + +let kevisualDir = path.join(homedir(), 'kevisual'); +const envKevisualDir = process.env.ASSISTANT_CONFIG_DIR +if (envKevisualDir) { + kevisualDir = envKevisualDir; + logger.debug('使用环境变量 ASSISTANT_CONFIG_DIR 作为 kevisual 目录:', kevisualDir); +} + +export const HomeConfigDir = path.join(kevisualDir, 'assistant-app'); + +export function parseArgs(args: string[]) { + const result: { root?: string; home?: boolean; help?: boolean } = { home: true }; + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + // 处理 root 参数 + if (arg === '--root') { + if (i + 1 < args.length && !args[i + 1].startsWith('-')) { + result.root = args[i + 1]; + i++; // 跳过下一个参数,因为它是值 + } + } + if (arg === '--help' || arg === '-h') { + result.help = true; + } + } + if (result.root) { + result.home = false; + } + return result; +} + + +/** + * 手动解析命令行参数 + * @param homedir + * @returns + */ +export const parseHomeArg = (homedir?: string) => { + const args = process.argv.slice(2); + const execPath = process.execPath; + const options = parseArgs(args); + let _configDir: string | undefined = undefined; + if (options.home && homedir) { + _configDir = homedir; + } else if (options.root) { + _configDir = options.root; + } + const checkUrl = ['.opencode', 'bin/opencode', 'opencode.exe'] + const isOpencode = checkUrl.some((item) => execPath.includes(item)) + let isServer = false; + // 如果args包含 server 则认为是服务端运行。其中config中server必须存在 + const checkArgs = process.argv.slice(1); + // console.log('parseHomeArg args:', checkArgs, execPath); + const isArgsServer = checkArgs.some((item) => item === 'server' || item.includes('asst-server') || item.includes('run-server.ts')); + const isDev = checkArgs.some(item => item.includes('run-server.ts')); + let isDaemon = false; + if (isArgsServer) { + // 判断 --daemon 参数, 如果有则认为是守护进程运行 + if (checkArgs.includes('--daemon') || checkArgs.includes('-d')) { + isDaemon = true; + } + // 判断 -s 或者 --start 参数 + if (checkArgs.includes('-s') || checkArgs.includes('--start')) { + isServer = true; + } + } + return { + isOpencode, + options, + isDev, + isDaemon, + configDir: _configDir, + isServer + }; +}; + +export const parseHelpArg = () => { + const args = process.argv.slice(2); + const options = parseArgs(args); + return !!options?.help; +}; \ No newline at end of file diff --git a/assistant/src/module/assistant/config/index.ts b/assistant/src/module/assistant/config/index.ts index ff98fd4..aa23629 100644 --- a/assistant/src/module/assistant/config/index.ts +++ b/assistant/src/module/assistant/config/index.ts @@ -6,17 +6,12 @@ import { ProxyInfo } from '../proxy/proxy.ts'; import dotenv from 'dotenv'; import { logger } from '@/module/logger.ts'; import { z } from 'zod' +import { HomeConfigDir } from './args.ts' -let kevisualDir = path.join(homedir(), 'kevisual'); -const envKevisualDir = process.env.ASSISTANT_CONFIG_DIR -if (envKevisualDir) { - kevisualDir = envKevisualDir; - logger.debug('使用环境变量 ASSISTANT_CONFIG_DIR 作为 kevisual 目录:', kevisualDir); -} /** * 助手配置文件路径, 全局配置文件目录 */ -export const configDir = createDir(path.join(kevisualDir, 'assistant-app')); +export const configDir = createDir(HomeConfigDir); /** * 助手配置文件初始化 @@ -383,72 +378,6 @@ export class AssistantConfig { type AppConfig = { list: any[]; }; -export function parseArgs(args: string[]) { - const result: { root?: string; home?: boolean; help?: boolean } = { home: true }; - for (let i = 0; i < args.length; i++) { - const arg = args[i]; - // 处理 root 参数 - if (arg === '--root') { - if (i + 1 < args.length && !args[i + 1].startsWith('-')) { - result.root = args[i + 1]; - i++; // 跳过下一个参数,因为它是值 - } - } - if (arg === '--help' || arg === '-h') { - result.help = true; - } - } - if (result.root) { - result.home = false; - } - return result; -} -/** - * 手动解析命令行参数 - * @param homedir - * @returns - */ -export const parseHomeArg = (homedir?: string) => { - const args = process.argv.slice(2); - const execPath = process.execPath; - const options = parseArgs(args); - let _configDir = undefined; - if (options.home && homedir) { - _configDir = homedir; - } else if (options.root) { - _configDir = options.root; - } - const checkUrl = ['.opencode', 'bin/opencode', 'opencode.exe'] - const isOpencode = checkUrl.some((item) => execPath.includes(item)) - let isServer = false; - // 如果args包含 server 则认为是服务端运行。其中config中server必须存在 - console.log('parseHomeArg args:', args); - if (args.includes('server') || args.includes('assistant-server')) { - let isDaemon = false; - // 判断 --daemon 参数, 如果有则认为是守护进程运行 - if (args.includes('--daemon') || args.includes('-d')) { - isDaemon = true; - } - if (!isDaemon) { - // 判断 -s 或者 --start 参数 - if (args.includes('-s') || args.includes('--start')) { - isServer = true; - } - } - } - return { - isOpencode, - options, - configDir: _configDir, - isServer - }; -}; - -export const parseHelpArg = () => { - const args = process.argv.slice(2); - const options = parseArgs(args); - return !!options?.help; -}; export const parseIfJson = (content: string) => { try { @@ -458,3 +387,5 @@ export const parseIfJson = (content: string) => { return {}; } }; + +export * from './args.ts'; \ No newline at end of file diff --git a/assistant/src/module/assistant/local-app-manager/assistant-app-resolve.ts b/assistant/src/module/assistant/local-app-manager/assistant-app-resolve.ts new file mode 100644 index 0000000..bc9205b --- /dev/null +++ b/assistant/src/module/assistant/local-app-manager/assistant-app-resolve.ts @@ -0,0 +1,108 @@ +import path from 'node:path'; +import fs from 'node:fs'; + +export class ModuleResolver { + private root: string; + private pkgCache = new Map(); + + constructor(root: string) { + this.root = root; + } + + /** + * 解析模块路径 + * - 绝对路径 → 直接返回 + * - @开头 → 解析 scoped 包 exports/main + * - 普通包名 → 从 node_modules 查找 + * - 相对路径 → 从 root 查找 + */ + resolve(routePath: string): string { + if (path.isAbsolute(routePath)) { + return routePath; + } + + // Scoped 包 @org/pkg/subpath + if (routePath.startsWith('@')) { + return this.resolveScopedPackage(routePath); + } + + // 普通包名 pkg 或 pkg/subpath + if (!routePath.startsWith('.') && !routePath.startsWith('/')) { + const pkgPath = path.join(this.root, 'node_modules', routePath); + if (this.fileIsExists(pkgPath)) { + return pkgPath; + } + } + + // 相对路径 ./xxx 或 ../xxx + const localFullPath = path.resolve(this.root, routePath); + return this.fileIsExists(localFullPath) ? localFullPath : routePath; + } + + /** 解析 scoped 包 */ + private resolveScopedPackage(routePath: string): string { + const parts = routePath.split('/'); + const pkgName = parts.slice(0, 2).join('/'); // @org/pkg + const subPath = parts.slice(2).join('/'); // routes + + const pkgPath = path.join(this.root, 'node_modules', pkgName); + const pkgJsonPath = path.join(pkgPath, 'package.json'); + + const pkg = this.readPackageJson(pkgJsonPath); + if (!pkg) { + return routePath; + } + + const entryPath = this.resolvePackageExport(pkg, subPath); + return path.join(pkgPath, entryPath); + } + + /** 解析 package.json exports/main 字段 */ + private resolvePackageExport(pkg: any, subPath: string): string { + const exportsField = pkg.exports; + + if (exportsField && typeof exportsField === 'object') { + const exportKey = subPath ? `./${subPath}` : '.'; + if (exportsField[exportKey]) { + const entry = exportsField[exportKey]; + if (typeof entry === 'object') { + return entry.import || entry.default || entry; + } + return entry; + } + } + + return pkg.main || 'index.js'; + } + + /** 带缓存读取 package.json */ + private readPackageJson(pkgJsonPath: string): any | null { + try { + const cached = this.pkgCache.get(pkgJsonPath); + const stats = fs.statSync(pkgJsonPath); + if (cached && cached.mtime === stats.mtimeMs) { + return cached.pkg; + } + const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8')); + this.pkgCache.set(pkgJsonPath, { pkg, mtime: stats.mtimeMs }); + return pkg; + } catch { + return null; + } + } + + /** 文件是否存在 */ + private fileIsExists(filepath: string): boolean { + try { + fs.accessSync(filepath, fs.constants.F_OK); + return true; + } catch { + return false; + } + } + + /** 清空缓存 */ + clearCache(): void { + this.pkgCache.clear(); + } +} 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 fcbcca3..d6f2b98 100644 --- a/assistant/src/module/assistant/local-app-manager/assistant-app.ts +++ b/assistant/src/module/assistant/local-app-manager/assistant-app.ts @@ -11,6 +11,7 @@ import { getEnvToken } from '@/module/http-token.ts'; import { initApi } from '@kevisual/api/proxy' import { Query } from '@kevisual/query'; import { initLightCode } from '@/module/light-code/index.ts'; +import { ModuleResolver } from './assistant-app-resolve.ts'; export class AssistantApp extends Manager { config: AssistantConfig; pagesPath: string; @@ -18,6 +19,8 @@ export class AssistantApp extends Manager { attemptedConnectTimes = 0; remoteApp: RemoteApp | null = null; remoteUrl: string | null = null; + private resolver: ModuleResolver; + constructor(config: AssistantConfig, mainApp?: App) { config.checkMounted(); const appsPath = config?.configPath?.appsDir || path.join(process.cwd(), 'apps'); @@ -31,6 +34,7 @@ export class AssistantApp extends Manager { }); this.pagesPath = pagesPath; this.config = config; + this.resolver = new ModuleResolver(config.configPath.configDir); } async pageList() { const pages = await glob(['*/*/package.json'], { @@ -212,21 +216,16 @@ export class AssistantApp extends Manager { } } async initRoutes() { - // TODO 初始化应用内置路由 const routes = this.config.getConfig().routes || []; for (const route of routes) { try { - if (typeof route === 'string') { - await import(route); - console.log('安装路由', route); - } else if (typeof route === 'object' && route.path) { - const routePath = route.path; - await import(routePath); - console.log('安装路由', routePath); - } + const routeStr = typeof route === 'string' ? route : route.path; + const resolvedPath = this.resolver.resolve(routeStr); + await import(resolvedPath); + console.log('路由已初始化', route); } catch (err) { console.error('初始化路由失败', route, err); } } } -} +} \ No newline at end of file diff --git a/assistant/src/module/npm-install.ts b/assistant/src/module/npm-install.ts index 4371671..32be6e2 100644 --- a/assistant/src/module/npm-install.ts +++ b/assistant/src/module/npm-install.ts @@ -33,4 +33,14 @@ export const installDeps = async (opts: InstallDepsOptions) => { } else { syncSpawn('npm', params, { cwd: appPath, stdio: 'inherit', env: process.env }); } +}; + +export const execCommand = (command: string, options: { cwd?: string } = {}) => { + const { cwd } = options; + return spawnSync(command, { + stdio: 'inherit', + shell: true, + cwd: cwd, + env: process.env, + }); }; \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1302d6a..1d9c8f2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -124,23 +124,23 @@ importers: assistant: dependencies: '@aws-sdk/client-s3': - specifier: ^3.978.0 - version: 3.978.0 + specifier: ^3.980.0 + version: 3.980.0 '@kevisual/ha-api': - specifier: ^0.0.6 - version: 0.0.6 + specifier: ^0.0.8 + version: 0.0.8 '@kevisual/js-filter': specifier: ^0.0.5 version: 0.0.5 '@kevisual/oss': - specifier: ^0.0.16 - version: 0.0.16 + specifier: ^0.0.18 + version: 0.0.18 '@kevisual/video-tools': specifier: ^0.0.13 version: 0.0.13(dotenv@17.2.3)(supports-color@10.2.2) '@opencode-ai/sdk': - specifier: ^1.1.44 - version: 1.1.44 + specifier: ^1.1.47 + version: 1.1.47 es-toolkit: specifier: ^1.44.0 version: 1.44.0 @@ -200,8 +200,8 @@ importers: specifier: ^1.0.28 version: 1.0.28(dotenv@17.2.3) '@opencode-ai/plugin': - specifier: ^1.1.44 - version: 1.1.44 + specifier: ^1.1.47 + version: 1.1.47 '@types/bun': specifier: ^1.3.8 version: 1.3.8 @@ -218,8 +218,8 @@ importers: specifier: ^5.6.2 version: 5.6.2 commander: - specifier: ^14.0.2 - version: 14.0.2 + specifier: ^14.0.3 + version: 14.0.3 cross-env: specifier: ^10.1.0 version: 10.1.0 @@ -468,147 +468,131 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.978.0': - resolution: {integrity: sha512-2chs05VbfgRNb5ZEYIwooeHCaL+DjwvrW3ElkslI71ltEqVNdeWvB7hbkLWPPKazV3kjY3H90pLDY8mMqsET+A==} + '@aws-sdk/client-s3@3.980.0': + resolution: {integrity: sha512-ch8QqKehyn1WOYbd8LyDbWjv84Z9OEj9qUxz8q3IOCU3ftAVkVR0wAuN96a1xCHnpOJcQZo3rOB08RlyKdkGxQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sso@3.975.0': - resolution: {integrity: sha512-HpgJuleH7P6uILxzJKQOmlHdwaCY+xYC6VgRDzlwVEqU/HXjo4m2gOAyjUbpXlBOCWfGgMUzfBlNJ9z3MboqEQ==} + '@aws-sdk/client-sso@3.980.0': + resolution: {integrity: sha512-AhNXQaJ46C1I+lQ+6Kj+L24il5K9lqqIanJd8lMszPmP7bLnmX0wTKK0dxywcvrLdij3zhWttjAKEBNgLtS8/A==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.972.0': - resolution: {integrity: sha512-nEeUW2M9F+xdIaD98F5MBcQ4ITtykj3yKbgFZ6J0JtL3bq+Z90szQ6Yy8H/BLPYXTs3V4n9ifnBo8cprRDiE6A==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/core@3.973.4': - resolution: {integrity: sha512-8Rk+kPP74YiR47x54bxYlKZswsaSh0a4XvvRUMLvyS/koNawhsGu/+qSZxREqUeTO+GkKpFvSQIsAZR+deUP+g==} + '@aws-sdk/core@3.973.5': + resolution: {integrity: sha512-IMM7xGfLGW6lMvubsA4j6BHU5FPgGAxoQ/NA63KqNLMwTS+PeMBcx8DPHL12Vg6yqOZnqok9Mu4H2BdQyq7gSA==} engines: {node: '>=20.0.0'} '@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.972.2': - resolution: {integrity: sha512-wzH1EdrZsytG1xN9UHaK12J9+kfrnd2+c8y0LVoS4O4laEjPoie1qVK3k8/rZe7KOtvULzyMnO3FT4Krr9Z0Dg==} + '@aws-sdk/credential-provider-env@3.972.3': + resolution: {integrity: sha512-OBYNY4xQPq7Rx+oOhtyuyO0AQvdJSpXRg7JuPNBJH4a1XXIzJQl4UHQTPKZKwfJXmYLpv4+OkcFen4LYmDPd3g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.4': - resolution: {integrity: sha512-OC7F3ipXV12QfDEWybQGHLzoeHBlAdx/nLzPfHP0Wsabu3JBffu5nlzSaJNf7to9HGtOW8Bpu8NX0ugmDrCbtw==} + '@aws-sdk/credential-provider-http@3.972.5': + resolution: {integrity: sha512-GpvBgEmSZPvlDekd26Zi+XsI27Qz7y0utUx0g2fSTSiDzhnd1FSa1owuodxR0BcUKNL7U2cOVhhDxgZ4iSoPVg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.2': - resolution: {integrity: sha512-Jrb8sLm6k8+L7520irBrvCtdLxNtrG7arIxe9TCeMJt/HxqMGJdbIjw8wILzkEHLMIi4MecF2FbXCln7OT1Tag==} + '@aws-sdk/credential-provider-ini@3.972.3': + resolution: {integrity: sha512-rMQAIxstP7cLgYfsRGrGOlpyMl0l8JL2mcke3dsIPLWke05zKOFyR7yoJzWCsI/QiIxjRbxpvPiAeKEA6CoYkg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.2': - resolution: {integrity: sha512-mlaw2aiI3DrimW85ZMn3g7qrtHueidS58IGytZ+mbFpsYLK5wMjCAKZQtt7VatLMtSBG/dn/EY4njbnYXIDKeQ==} + '@aws-sdk/credential-provider-login@3.972.3': + resolution: {integrity: sha512-Gc3O91iVvA47kp2CLIXOwuo5ffo1cIpmmyIewcYjAcvurdFHQ8YdcBe1KHidnbbBO4/ZtywGBACsAX5vr3UdoA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.3': - resolution: {integrity: sha512-iu+JwWHM7tHowKqE+8wNmI3sM6mPEiI9Egscz2BEV7adyKmV95oR9tBO4VIOl72FGDi7X9mXg19VtqIpSkEEsA==} + '@aws-sdk/credential-provider-node@3.972.4': + resolution: {integrity: sha512-UwerdzosMSY7V5oIZm3NsMDZPv2aSVzSkZxYxIOWHBeKTZlUqW7XpHtJMZ4PZpJ+HMRhgP+MDGQx4THndgqJfQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.2': - resolution: {integrity: sha512-NLKLTT7jnUe9GpQAVkPTJO+cs2FjlQDt5fArIYS7h/Iw/CvamzgGYGFRVD2SE05nOHCMwafUSi42If8esGFV+g==} + '@aws-sdk/credential-provider-process@3.972.3': + resolution: {integrity: sha512-xkSY7zjRqeVc6TXK2xr3z1bTLm0wD8cj3lAkproRGaO4Ku7dPlKy843YKnHrUOUzOnMezdZ4xtmFc0eKIDTo2w==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.2': - resolution: {integrity: sha512-YpwDn8g3gCGUl61cCV0sRxP2pFIwg+ZsMfWQ/GalSyjXtRkctCMFA+u0yPb/Q4uTfNEiya1Y4nm0C5rIHyPW5Q==} + '@aws-sdk/credential-provider-sso@3.972.3': + resolution: {integrity: sha512-8Ww3F5Ngk8dZ6JPL/V5LhCU1BwMfQd3tLdoEuzaewX8FdnT633tPr+KTHySz9FK7fFPcz5qG3R5edVEhWQD4AA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.2': - resolution: {integrity: sha512-x9DAiN9Qz+NjJ99ltDiVQ8d511M/tuF/9MFbe2jUgo7HZhD6+x4S3iT1YcP07ndwDUjmzKGmeOEgE24k4qvfdg==} + '@aws-sdk/credential-provider-web-identity@3.972.3': + resolution: {integrity: sha512-62VufdcH5rRfiRKZRcf1wVbbt/1jAntMj1+J0qAd+r5pQRg2t0/P9/Rz16B1o5/0Se9lVL506LRjrhIJAhYBfA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.972.2': - resolution: {integrity: sha512-ofuXBnitp9j8t05O4NQVrpMZDECPtUhRIWdLzR35baR5njOIPY7YqNtJE+yELVpSn2m4jt2sV1ezYMBY4/Lo+w==} + '@aws-sdk/middleware-bucket-endpoint@3.972.3': + resolution: {integrity: sha512-fmbgWYirF67YF1GfD7cg5N6HHQ96EyRNx/rDIrTF277/zTWVuPI2qS/ZHgofwR1NZPe/NWvoppflQY01LrbVLg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-expect-continue@3.972.2': - resolution: {integrity: sha512-d9bBQlGk1T5j5rWfof20M2tErddOSoSLDauP2/yyuXfeOfQRCSBUZNrApSxjJ9Hw+/RDGR/XL+LEOqmXxSlV3A==} + '@aws-sdk/middleware-expect-continue@3.972.3': + resolution: {integrity: sha512-4msC33RZsXQpUKR5QR4HnvBSNCPLGHmB55oDiROqqgyOc+TOfVu2xgi5goA7ms6MdZLeEh2905UfWMnMMF4mRg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.972.2': - resolution: {integrity: sha512-GgWVZJdzXzqhXxzNAYB3TnZCj7d5rZNdovqSIV91e97nowHVaExRoyaZ3H/Ydqot7veHGPTl8nBp464zZeLDTQ==} + '@aws-sdk/middleware-flexible-checksums@3.972.3': + resolution: {integrity: sha512-MkNGJ6qB9kpsLwL18kC/ZXppsJbftHVGCisqpEVbTQsum8CLYDX1Bmp/IvhRGNxsqCO2w9/4PwhDKBjG3Uvr4Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.972.2': - resolution: {integrity: sha512-42hZ8jEXT2uR6YybCzNq9OomqHPw43YIfRfz17biZjMQA4jKSQUaHIl6VvqO2Ddl5904pXg2Yd/ku78S0Ikgog==} + '@aws-sdk/middleware-host-header@3.972.3': + resolution: {integrity: sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-location-constraint@3.972.2': - resolution: {integrity: sha512-pyayzpq+VQiG1o9pEUyr6BXEJ2g2t4JIPdNxDkIHp2AhR63Gy/10WQkXTBOgRnfQ7/aLPLOnjRIWwOPp0CfUlA==} + '@aws-sdk/middleware-location-constraint@3.972.3': + resolution: {integrity: sha512-nIg64CVrsXp67vbK0U1/Is8rik3huS3QkRHn2DRDx4NldrEFMgdkZGI/+cZMKD9k4YOS110Dfu21KZLHrFA/1g==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.972.2': - resolution: {integrity: sha512-iUzdXKOgi4JVDDEG/VvoNw50FryRCEm0qAudw12DcZoiNJWl0rN6SYVLcL1xwugMfQncCXieK5UBlG6mhH7iYA==} + '@aws-sdk/middleware-logger@3.972.3': + resolution: {integrity: sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.972.2': - resolution: {integrity: sha512-/mzlyzJDtngNFd/rAYvqx29a2d0VuiYKN84Y/Mu9mGw7cfMOCyRK+896tb9wV6MoPRHUX7IXuKCIL8nzz2Pz5A==} + '@aws-sdk/middleware-recursion-detection@3.972.3': + resolution: {integrity: sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.0': - resolution: {integrity: sha512-0bcKFXWx+NZ7tIlOo7KjQ+O2rydiHdIQahrq+fN6k9Osky29v17guy68urUKfhTobR6iY6KvxkroFWaFtTgS5w==} + '@aws-sdk/middleware-sdk-s3@3.972.5': + resolution: {integrity: sha512-3IgeIDiQ15tmMBFIdJ1cTy3A9rXHGo+b9p22V38vA3MozeMyVC8VmCYdDLA0iMWo4VHA9LDJTgCM0+xU3wjBOg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.4': - resolution: {integrity: sha512-lradfn72Td7lswhZKi86VKRNkDtmQR7bq9shX1kaPK1itjThxfcx7ogXSvMm/0cuqoYGic8UUXQOaK4kpU933g==} + '@aws-sdk/middleware-ssec@3.972.3': + resolution: {integrity: sha512-dU6kDuULN3o3jEHcjm0c4zWJlY1zWVkjG9NPe9qxYLLpcbdj5kRYBS2DdWYD+1B9f910DezRuws7xDEqKkHQIg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-ssec@3.972.2': - resolution: {integrity: sha512-HJ3OmQnlQ1es6esrDWnx3nVPhBAN89WaFCzsDcb6oT7TMjBPUfZ5+1BpI7B0Hnme8cc6kp7qc4cgo2plrlROJA==} + '@aws-sdk/middleware-user-agent@3.972.5': + resolution: {integrity: sha512-TVZQ6PWPwQbahUI8V+Er+gS41ctIawcI/uMNmQtQ7RMcg3JYn6gyKAFKUb3HFYx2OjYlx1u11sETSwwEUxVHTg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.972.4': - resolution: {integrity: sha512-6sU8jrSJvY/lqSnU6IYsa8SrCKwOZ4Enl6O4xVJo8RCq9Bdr5Giuw2eUaJAk9GPcpr4OFcmSFv3JOLhpKGeRZA==} + '@aws-sdk/nested-clients@3.980.0': + resolution: {integrity: sha512-/dONY5xc5/CCKzOqHZCTidtAR4lJXWkGefXvTRKdSKMGaYbbKsxDckisd6GfnvPSLxWtvQzwgRGRutMRoYUApQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.975.0': - resolution: {integrity: sha512-OkeFHPlQj2c/Y5bQGkX14pxhDWUGUFt3LRHhjcDKsSCw6lrxKcxN3WFZN0qbJwKNydP+knL5nxvfgKiCLpTLRA==} + '@aws-sdk/region-config-resolver@3.972.3': + resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.972.2': - resolution: {integrity: sha512-/7vRBsfmiOlg2X67EdKrzzQGw5/SbkXb7ALHQmlQLkZh8qNgvS2G2dDC6NtF3hzFlpP3j2k+KIEtql/6VrI6JA==} + '@aws-sdk/signature-v4-multi-region@3.980.0': + resolution: {integrity: sha512-tO2jBj+ZIVM0nEgi1SyxWtaYGpuAJdsrugmWcI3/U2MPWCYsrvKasUo0026NvJJao38wyUq9B8XTG8Xu53j/VA==} engines: {node: '>=20.0.0'} - '@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.975.0': - resolution: {integrity: sha512-AWQt64hkVbDQ+CmM09wnvSk2mVyH4iRROkmYkr3/lmUtFNbE2L/fnw26sckZnUcFCsHPqbkQrcsZAnTcBLbH4w==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/types@3.972.0': - resolution: {integrity: sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==} + '@aws-sdk/token-providers@3.980.0': + resolution: {integrity: sha512-1nFileg1wAgDmieRoj9dOawgr2hhlh7xdvcH57b1NnqfPaVlcqVJyPc6k3TLDUFPY69eEwNxdGue/0wIz58vjA==} engines: {node: '>=20.0.0'} '@aws-sdk/types@3.973.1': resolution: {integrity: sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-arn-parser@3.972.0': - resolution: {integrity: sha512-RM5Mmo/KJ593iMSrALlHEOcc9YOIyOsDmS5x2NLOMdEmzv1o00fcpAkCQ02IGu1eFneBFT7uX0Mpag0HI+Cz2g==} - engines: {node: '>=20.0.0'} - '@aws-sdk/util-arn-parser@3.972.2': resolution: {integrity: sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.972.0': - resolution: {integrity: sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==} + '@aws-sdk/util-endpoints@3.980.0': + resolution: {integrity: sha512-AjKBNEc+rjOZQE1HwcD9aCELqg1GmUj1rtICKuY8cgwB73xJ4U/kNyqKKpN2k9emGqlfDY2D8itIp/vDc6OKpw==} 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.972.2': - resolution: {integrity: sha512-gz76bUyebPZRxIsBHJUd/v+yiyFzm9adHbr8NykP2nm+z/rFyvQneOHajrUejtmnc5tTBeaDPL4X25TnagRk4A==} + '@aws-sdk/util-user-agent-browser@3.972.3': + resolution: {integrity: sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==} - '@aws-sdk/util-user-agent-node@3.972.2': - resolution: {integrity: sha512-vnxOc4C6AR7hVbwyFo1YuH0GB6dgJlWt8nIOOJpnzJAWJPkUMPJ9Zv2lnKsSU7TTZbhP2hEO8OZ4PYH59XFv8Q==} + '@aws-sdk/util-user-agent-node@3.972.3': + resolution: {integrity: sha512-gqG+02/lXQtO0j3US6EVnxtwwoXQC5l2qkhLCrqUrqdtcQxV7FDMbm9wLjKqoronSHyELGTjbFKK/xV5q1bZNA==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -616,10 +600,6 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.972.0': - resolution: {integrity: sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg==} - engines: {node: '>=20.0.0'} - '@aws-sdk/xml-builder@3.972.2': resolution: {integrity: sha512-jGOOV/bV1DhkkUhHiZ3/1GZ67cZyOXaDb7d1rYD6ZiXf5V9tBNOcgqXwRRPvrCbYaFRa1pPMFb3ZjqjWpR3YfA==} engines: {node: '>=20.0.0'} @@ -1338,8 +1318,8 @@ packages: '@kevisual/cache@0.0.3': resolution: {integrity: sha512-BWEck69KYL96/ywjYVkML974RHjDJTj2ITQND1zFPR+hlBV1H1p55QZgSYRJCObg3EAV1S9Zic/fR2T4pfe8yg==} - '@kevisual/cache@0.0.4': - resolution: {integrity: sha512-NlyriJ9fC27TgQhWYbEH9hG84R2k0lIofOxo/+nVHN6a6LJSLnVbpDIysRcnH8MI52n/XHfWwLSjeDDL3D1/cQ==} + '@kevisual/cache@0.0.5': + resolution: {integrity: sha512-fgtUYGUUq/DY0KFV4CkWszNqvQUaA8XvMTUjoR9ZXRpau5IIDolD/Wen2TFsZ7G3Rfy+lef5dnaiZVDkZwdVKg==} '@kevisual/cnb@0.0.13': resolution: {integrity: sha512-n98lwnlVHz8YqceR/fcorYUaBzcvwwqehyOAGVrqCVwVLsltYmYuHUhzVy1bK3NJ6zwhVdoDrkq7+bv3ZqDT3g==} @@ -1351,8 +1331,8 @@ packages: resolution: {integrity: sha512-4T/m2LqhtwWEW+lWmg7jLxKFW7VtIAftsWFDDZvh10bZunqFf8iXxChHcVSQWikghJb4cq1IkWzPkvc2l+Asdw==} hasBin: true - '@kevisual/ha-api@0.0.6': - resolution: {integrity: sha512-pZwcE4XYCDItTpMhIP0dIuo2+C07YmhWukVMgTvUuUQBgNo4KJmpItYjeGIvBGsvEM4AjsDGV1mCjTOB1zLu3Q==} + '@kevisual/ha-api@0.0.8': + resolution: {integrity: sha512-RVBrHOXx471lwVmoP5lnAw4XAwyBN3BsJvwaJKLTpAaefvZ2slZEuJZY7lAX7OVEAZJLrfjH+QeErLQ+EvpdVA==} '@kevisual/js-filter@0.0.5': resolution: {integrity: sha512-+S+Sf3K/aP6XtZI2s7TgKOr35UuvUvtpJ9YDW30a+mY0/N8gRuzyKhieBzQN7Ykayzz70uoMavBXut2rUlLgzw==} @@ -1369,8 +1349,8 @@ packages: '@kevisual/logger@0.0.4': resolution: {integrity: sha512-+fpr92eokSxoGOW1SIRl/27lPuO+zyY+feR5o2Q4YCNlAdt2x64NwC/w8r/3NEC5QenLgd4K0azyKTI2mHbARw==} - '@kevisual/oss@0.0.16': - resolution: {integrity: sha512-kGnXySE4h8jcGrywL1RZWhOXzN3jyO8WVsX4W4zaFbfotH/zD9nIe8OfUS6a6Jci0ZL14OmDzoyaCLWHzHy0Lg==} + '@kevisual/oss@0.0.18': + resolution: {integrity: sha512-vTdXe41inq4oc+bfYIR3xMDm8GZyOAaWq3DBh+Eur9uNOJcIUdgZBVPOm2uSigmjl3PvqekUw8bE/vbWWJAY7w==} '@kevisual/permission@0.0.3': resolution: {integrity: sha512-8JsA/5O5Ax/z+M+MYpFYdlioHE6jNmWMuFSokBWYs9CCAHNiSKMR01YLkoVDoPvncfH/Y8F5K/IEXRCbptuMNA==} @@ -1472,12 +1452,15 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@opencode-ai/plugin@1.1.44': - resolution: {integrity: sha512-5w66Dq2Fugwgr2yrd8obvnlIEjBOuya82UgfR/3z3EzlyNDi2sitQSYbz7CcOtwd89eZ0n/tH/JX2KDGVuzxTQ==} + '@opencode-ai/plugin@1.1.47': + resolution: {integrity: sha512-gNMPz72altieDfLhUw3VAT1xbduKi3w3wZ57GLeS7qU9W474HdvdIiLBnt2Xq3U7Ko0/0tvK3nzCker6IIDqmQ==} '@opencode-ai/sdk@1.1.44': resolution: {integrity: sha512-coQgtSSCbY46/GY+M5zG0rChiLSJWSjPERRt5L1hbjvDWvErelVV0ILPbd1+3CwJLFTedBYgotby2TcO8U0IfQ==} + '@opencode-ai/sdk@1.1.47': + resolution: {integrity: sha512-s3PBHwk1sP6Zt/lJxIWSBWZ1TnrI1nFxSP97LCODUytouAQgbygZ1oDH7O2sGMBEuGdA8B1nNSPla0aRSN3IpA==} + '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} @@ -2814,6 +2797,10 @@ packages: resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + commander@2.15.1: resolution: {integrity: sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==} @@ -5352,29 +5339,29 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.978.0': + '@aws-sdk/client-s3@3.980.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.4 - '@aws-sdk/credential-provider-node': 3.972.3 - '@aws-sdk/middleware-bucket-endpoint': 3.972.2 - '@aws-sdk/middleware-expect-continue': 3.972.2 - '@aws-sdk/middleware-flexible-checksums': 3.972.2 - '@aws-sdk/middleware-host-header': 3.972.2 - '@aws-sdk/middleware-location-constraint': 3.972.2 - '@aws-sdk/middleware-logger': 3.972.2 - '@aws-sdk/middleware-recursion-detection': 3.972.2 - '@aws-sdk/middleware-sdk-s3': 3.972.4 - '@aws-sdk/middleware-ssec': 3.972.2 - '@aws-sdk/middleware-user-agent': 3.972.4 - '@aws-sdk/region-config-resolver': 3.972.2 - '@aws-sdk/signature-v4-multi-region': 3.972.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/credential-provider-node': 3.972.4 + '@aws-sdk/middleware-bucket-endpoint': 3.972.3 + '@aws-sdk/middleware-expect-continue': 3.972.3 + '@aws-sdk/middleware-flexible-checksums': 3.972.3 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-location-constraint': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-sdk-s3': 3.972.5 + '@aws-sdk/middleware-ssec': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/signature-v4-multi-region': 3.980.0 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.972.0 - '@aws-sdk/util-user-agent-browser': 3.972.2 - '@aws-sdk/util-user-agent-node': 3.972.2 + '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.3 '@smithy/config-resolver': 4.4.6 '@smithy/core': 3.22.0 '@smithy/eventstream-serde-browser': 4.2.8 @@ -5412,20 +5399,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.975.0': + '@aws-sdk/client-sso@3.980.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.4 - '@aws-sdk/middleware-host-header': 3.972.2 - '@aws-sdk/middleware-logger': 3.972.2 - '@aws-sdk/middleware-recursion-detection': 3.972.2 - '@aws-sdk/middleware-user-agent': 3.972.4 - '@aws-sdk/region-config-resolver': 3.972.2 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.972.0 - '@aws-sdk/util-user-agent-browser': 3.972.2 - '@aws-sdk/util-user-agent-node': 3.972.2 + '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.3 '@smithy/config-resolver': 4.4.6 '@smithy/core': 3.22.0 '@smithy/fetch-http-handler': 5.3.9 @@ -5455,23 +5442,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.972.0': - dependencies: - '@aws-sdk/types': 3.972.0 - '@aws-sdk/xml-builder': 3.972.0 - '@smithy/core': 3.22.0 - '@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.11.1 - '@smithy/types': 4.12.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/core@3.973.4': + '@aws-sdk/core@3.973.5': dependencies: '@aws-sdk/types': 3.973.1 '@aws-sdk/xml-builder': 3.972.2 @@ -5492,17 +5463,17 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.2': + '@aws-sdk/credential-provider-env@3.972.3': dependencies: - '@aws-sdk/core': 3.973.4 + '@aws-sdk/core': 3.973.5 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.4': + '@aws-sdk/credential-provider-http@3.972.5': dependencies: - '@aws-sdk/core': 3.973.4 + '@aws-sdk/core': 3.973.5 '@aws-sdk/types': 3.973.1 '@smithy/fetch-http-handler': 5.3.9 '@smithy/node-http-handler': 4.4.8 @@ -5513,16 +5484,16 @@ snapshots: '@smithy/util-stream': 4.5.10 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.972.2': + '@aws-sdk/credential-provider-ini@3.972.3': dependencies: - '@aws-sdk/core': 3.973.4 - '@aws-sdk/credential-provider-env': 3.972.2 - '@aws-sdk/credential-provider-http': 3.972.4 - '@aws-sdk/credential-provider-login': 3.972.2 - '@aws-sdk/credential-provider-process': 3.972.2 - '@aws-sdk/credential-provider-sso': 3.972.2 - '@aws-sdk/credential-provider-web-identity': 3.972.2 - '@aws-sdk/nested-clients': 3.975.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/credential-provider-env': 3.972.3 + '@aws-sdk/credential-provider-http': 3.972.5 + '@aws-sdk/credential-provider-login': 3.972.3 + '@aws-sdk/credential-provider-process': 3.972.3 + '@aws-sdk/credential-provider-sso': 3.972.3 + '@aws-sdk/credential-provider-web-identity': 3.972.3 + '@aws-sdk/nested-clients': 3.980.0 '@aws-sdk/types': 3.973.1 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 @@ -5532,10 +5503,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.972.2': + '@aws-sdk/credential-provider-login@3.972.3': dependencies: - '@aws-sdk/core': 3.973.4 - '@aws-sdk/nested-clients': 3.975.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/nested-clients': 3.980.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 @@ -5545,14 +5516,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.972.3': + '@aws-sdk/credential-provider-node@3.972.4': dependencies: - '@aws-sdk/credential-provider-env': 3.972.2 - '@aws-sdk/credential-provider-http': 3.972.4 - '@aws-sdk/credential-provider-ini': 3.972.2 - '@aws-sdk/credential-provider-process': 3.972.2 - '@aws-sdk/credential-provider-sso': 3.972.2 - '@aws-sdk/credential-provider-web-identity': 3.972.2 + '@aws-sdk/credential-provider-env': 3.972.3 + '@aws-sdk/credential-provider-http': 3.972.5 + '@aws-sdk/credential-provider-ini': 3.972.3 + '@aws-sdk/credential-provider-process': 3.972.3 + '@aws-sdk/credential-provider-sso': 3.972.3 + '@aws-sdk/credential-provider-web-identity': 3.972.3 '@aws-sdk/types': 3.973.1 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 @@ -5562,20 +5533,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.972.2': + '@aws-sdk/credential-provider-process@3.972.3': dependencies: - '@aws-sdk/core': 3.973.4 + '@aws-sdk/core': 3.973.5 '@aws-sdk/types': 3.973.1 '@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.972.2': + '@aws-sdk/credential-provider-sso@3.972.3': dependencies: - '@aws-sdk/client-sso': 3.975.0 - '@aws-sdk/core': 3.973.4 - '@aws-sdk/token-providers': 3.975.0 + '@aws-sdk/client-sso': 3.980.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/token-providers': 3.980.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -5584,10 +5555,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.2': + '@aws-sdk/credential-provider-web-identity@3.972.3': dependencies: - '@aws-sdk/core': 3.973.4 - '@aws-sdk/nested-clients': 3.975.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/nested-clients': 3.980.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -5596,7 +5567,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-bucket-endpoint@3.972.2': + '@aws-sdk/middleware-bucket-endpoint@3.972.3': dependencies: '@aws-sdk/types': 3.973.1 '@aws-sdk/util-arn-parser': 3.972.2 @@ -5606,19 +5577,19 @@ snapshots: '@smithy/util-config-provider': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.972.2': + '@aws-sdk/middleware-expect-continue@3.972.3': dependencies: '@aws-sdk/types': 3.973.1 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.972.2': + '@aws-sdk/middleware-flexible-checksums@3.972.3': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.973.4 + '@aws-sdk/core': 3.973.5 '@aws-sdk/crc64-nvme': 3.972.0 '@aws-sdk/types': 3.973.1 '@smithy/is-array-buffer': 4.2.0 @@ -5630,26 +5601,26 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.972.2': + '@aws-sdk/middleware-host-header@3.972.3': dependencies: '@aws-sdk/types': 3.973.1 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.972.2': + '@aws-sdk/middleware-location-constraint@3.972.3': dependencies: '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.972.2': + '@aws-sdk/middleware-logger@3.972.3': dependencies: '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.972.2': + '@aws-sdk/middleware-recursion-detection@3.972.3': dependencies: '@aws-sdk/types': 3.973.1 '@aws/lambda-invoke-store': 0.2.3 @@ -5657,26 +5628,9 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.0': + '@aws-sdk/middleware-sdk-s3@3.972.5': dependencies: - '@aws-sdk/core': 3.972.0 - '@aws-sdk/types': 3.972.0 - '@aws-sdk/util-arn-parser': 3.972.0 - '@smithy/core': 3.22.0 - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.11.1 - '@smithy/types': 4.12.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.10 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-sdk-s3@3.972.4': - dependencies: - '@aws-sdk/core': 3.973.4 + '@aws-sdk/core': 3.973.5 '@aws-sdk/types': 3.973.1 '@aws-sdk/util-arn-parser': 3.972.2 '@smithy/core': 3.22.0 @@ -5691,36 +5645,36 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.972.2': + '@aws-sdk/middleware-ssec@3.972.3': dependencies: '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.4': + '@aws-sdk/middleware-user-agent@3.972.5': dependencies: - '@aws-sdk/core': 3.973.4 + '@aws-sdk/core': 3.973.5 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.972.0 + '@aws-sdk/util-endpoints': 3.980.0 '@smithy/core': 3.22.0 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.975.0': + '@aws-sdk/nested-clients@3.980.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.4 - '@aws-sdk/middleware-host-header': 3.972.2 - '@aws-sdk/middleware-logger': 3.972.2 - '@aws-sdk/middleware-recursion-detection': 3.972.2 - '@aws-sdk/middleware-user-agent': 3.972.4 - '@aws-sdk/region-config-resolver': 3.972.2 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.972.0 - '@aws-sdk/util-user-agent-browser': 3.972.2 - '@aws-sdk/util-user-agent-node': 3.972.2 + '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.3 '@smithy/config-resolver': 4.4.6 '@smithy/core': 3.22.0 '@smithy/fetch-http-handler': 5.3.9 @@ -5750,7 +5704,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.972.2': + '@aws-sdk/region-config-resolver@3.972.3': dependencies: '@aws-sdk/types': 3.973.1 '@smithy/config-resolver': 4.4.6 @@ -5758,19 +5712,19 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.972.0': + '@aws-sdk/signature-v4-multi-region@3.980.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.0 - '@aws-sdk/types': 3.972.0 + '@aws-sdk/middleware-sdk-s3': 3.972.5 + '@aws-sdk/types': 3.973.1 '@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.975.0': + '@aws-sdk/token-providers@3.980.0': dependencies: - '@aws-sdk/core': 3.973.4 - '@aws-sdk/nested-clients': 3.975.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/nested-clients': 3.980.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -5779,27 +5733,18 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.972.0': - dependencies: - '@smithy/types': 4.12.0 - tslib: 2.8.1 - '@aws-sdk/types@3.973.1': dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.972.0': - dependencies: - tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.972.2': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.972.0': + '@aws-sdk/util-endpoints@3.980.0': dependencies: - '@aws-sdk/types': 3.972.0 + '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-endpoints': 3.2.8 @@ -5809,27 +5754,21 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.972.2': + '@aws-sdk/util-user-agent-browser@3.972.3': dependencies: '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 bowser: 2.13.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.972.2': + '@aws-sdk/util-user-agent-node@3.972.3': dependencies: - '@aws-sdk/middleware-user-agent': 3.972.4 + '@aws-sdk/middleware-user-agent': 3.972.5 '@aws-sdk/types': 3.973.1 '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.0': - dependencies: - '@smithy/types': 4.12.0 - fast-xml-parser: 5.2.5 - tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.2': dependencies: '@smithy/types': 4.12.0 @@ -6542,7 +6481,7 @@ snapshots: dependencies: idb-keyval: 6.2.1 - '@kevisual/cache@0.0.4': + '@kevisual/cache@0.0.5': dependencies: idb-keyval: 6.2.2 lru-cache: 11.2.5 @@ -6594,9 +6533,9 @@ snapshots: transitivePeerDependencies: - typescript - '@kevisual/ha-api@0.0.6': + '@kevisual/ha-api@0.0.8': dependencies: - '@kevisual/cache': 0.0.4 + '@kevisual/cache': 0.0.5 fuse.js: 7.1.0 lru-cache: 11.2.5 @@ -6645,7 +6584,7 @@ snapshots: '@kevisual/logger@0.0.4': {} - '@kevisual/oss@0.0.16': {} + '@kevisual/oss@0.0.18': {} '@kevisual/permission@0.0.3': {} @@ -6825,13 +6764,15 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@opencode-ai/plugin@1.1.44': + '@opencode-ai/plugin@1.1.47': dependencies: - '@opencode-ai/sdk': 1.1.44 + '@opencode-ai/sdk': 1.1.47 zod: 4.1.8 '@opencode-ai/sdk@1.1.44': {} + '@opencode-ai/sdk@1.1.47': {} + '@oslojs/encoding@1.1.0': {} '@peculiar/asn1-cms@2.6.0': @@ -8565,6 +8506,8 @@ snapshots: commander@14.0.2: {} + commander@14.0.3: {} + commander@2.15.1: {} common-ancestor-path@1.0.1: {}