feat: add argument parsing and module resolution for assistant app

- Implemented argument parsing in args.ts to handle root, home, and help options.
- Added parseHomeArg and parseHelpArg functions for command line argument handling.
- Created ModuleResolver class in assistant-app-resolve.ts to resolve module paths, including scoped packages and relative paths.
- Introduced caching mechanism for package.json reads to improve performance.
- Added utility functions for checking file existence and clearing the cache.
This commit is contained in:
2026-01-31 17:42:53 +08:00
parent 51822506d7
commit a80a3ede46
11 changed files with 517 additions and 337 deletions

View File

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

View File

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

View File

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

View File

@@ -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('<plugin-name>')
.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('<plugin-name>')
.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);

View File

@@ -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';
/**
* 通过命令行解析器解析参数

View File

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

View File

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

View File

@@ -0,0 +1,108 @@
import path from 'node:path';
import fs from 'node:fs';
export class ModuleResolver {
private root: string;
private pkgCache = new Map<string, { pkg: any; mtime: number }>();
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();
}
}

View File

@@ -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,18 +216,13 @@ 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);
}

View File

@@ -34,3 +34,13 @@ export const installDeps = async (opts: InstallDepsOptions) => {
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,
});
};

437
pnpm-lock.yaml generated
View File

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