From bcc12209e0561650ef9b6691ef76a78da5f73404 Mon Sep 17 00:00:00 2001 From: xion Date: Sat, 26 Apr 2025 03:15:11 +0800 Subject: [PATCH] init --- assistant/.gitignore | 3 + assistant/bin/assistant-server.js | 4 + assistant/bin/assistant.js | 4 + assistant/bun.config.mjs | 14 + assistant/package.json | 26 +- assistant/src/app.ts | 10 +- assistant/src/command/app-manager/index.ts | 68 + assistant/src/config.ts | 7 + assistant/src/index.ts | 1 + .../src/module/assistant/config/index.ts | 72 +- assistant/src/module/assistant/https/sign.ts | 81 +- assistant/src/module/assistant/index.ts | 2 + .../local-app-manager/assistant-app.ts | 18 + .../assistant/local-app-manager/index.ts | 3 + .../src/module/assistant/proxy/file-proxy.ts | 6 +- .../proxy/{api-proxy.ts => http-proxy.ts} | 23 +- assistant/src/module/assistant/proxy/index.ts | 2 +- assistant/src/module/assistant/proxy/proxy.ts | 18 +- .../src/module/assistant/proxy/ws-proxy.ts | 134 +- assistant/src/program.ts | 3 +- assistant/src/{serve.ts => server.ts} | 4 +- assistant/src/services/init/index.ts | 6 + assistant/src/services/proxy/local-proxy.ts | 3 +- .../src/services/proxy/proxy-page-index.ts | 53 +- assistant/src/test/ws.ts | 27 + assistant/tasks/silkyai/talkshow.ts | 14 + bin/assistant.js | 4 + pnpm-lock.yaml | 1224 ++++++++++++++++- 28 files changed, 1708 insertions(+), 126 deletions(-) create mode 100644 assistant/bin/assistant-server.js create mode 100644 assistant/bin/assistant.js create mode 100644 assistant/src/command/app-manager/index.ts create mode 100644 assistant/src/config.ts create mode 100644 assistant/src/module/assistant/local-app-manager/assistant-app.ts create mode 100644 assistant/src/module/assistant/local-app-manager/index.ts rename assistant/src/module/assistant/proxy/{api-proxy.ts => http-proxy.ts} (74%) rename assistant/src/{serve.ts => server.ts} (63%) create mode 100644 assistant/src/test/ws.ts create mode 100644 assistant/tasks/silkyai/talkshow.ts diff --git a/assistant/.gitignore b/assistant/.gitignore index c8906bf..ad43321 100644 --- a/assistant/.gitignore +++ b/assistant/.gitignore @@ -6,3 +6,6 @@ dist pack-dist assistant-app + +.env* +!.env*example \ No newline at end of file diff --git a/assistant/bin/assistant-server.js b/assistant/bin/assistant-server.js new file mode 100644 index 0000000..5668f57 --- /dev/null +++ b/assistant/bin/assistant-server.js @@ -0,0 +1,4 @@ +#!/usr/bin/env node +import { runParser } from '../dist/assistant-server.mjs'; + +runParser(process.argv); diff --git a/assistant/bin/assistant.js b/assistant/bin/assistant.js new file mode 100644 index 0000000..603e45f --- /dev/null +++ b/assistant/bin/assistant.js @@ -0,0 +1,4 @@ +#!/usr/bin/env node +import { runParser } from '../dist/assistant.mjs'; + +runParser(process.argv); diff --git a/assistant/bun.config.mjs b/assistant/bun.config.mjs index 4678546..1dc6da3 100644 --- a/assistant/bun.config.mjs +++ b/assistant/bun.config.mjs @@ -17,3 +17,17 @@ await Bun.build({ }, env: 'ENVISION_*', }); + +await Bun.build({ + target: 'node', + format: 'esm', + entrypoints: ['./src/server.ts'], + outdir: './dist', + naming: { + entry: 'assistan-server.mjs', + }, + define: { + ENVISION_VERSION: JSON.stringify(pkg.version), + }, + env: 'ENVISION_*', +}); diff --git a/assistant/package.json b/assistant/package.json index 94b10dd..671308c 100644 --- a/assistant/package.json +++ b/assistant/package.json @@ -10,7 +10,7 @@ ], "author": "abearxiong (https://www.xiongxiao.me)", "license": "MIT", - "packageManager": "pnpm@10.7.0", + "packageManager": "pnpm@10.9.0", "type": "module", "files": [ "dist", @@ -19,24 +19,36 @@ ], "scripts": { "dev": "bun run src/run.ts ", - "dev:serve": "bun --watch src/serve.ts", + "dev:server": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 bun --watch src/server.ts", "build": "rimraf dist && bun run bun.config.mjs" }, + "bin": { + "ev-assistant": "bin/assistant.js", + "ev-asst": "bin/assistant.js" + }, "devDependencies": { "@kevisual/load": "^0.0.6", + "@kevisual/local-app-manager": "^0.1.16", "@kevisual/query": "0.0.17", "@kevisual/query-login": "0.0.5", "@kevisual/router": "^0.0.13", "@kevisual/use-config": "^1.0.11", "@types/bun": "^1.2.10", - "@types/node": "^22.14.1", + "@types/lodash-es": "^4.17.12", + "@types/node": "^22.15.2", "@types/send": "^0.17.4", + "@types/ws": "^8.18.1", "chalk": "^5.4.1", "commander": "^13.1.0", - "inquirer": "^12.5.2", + "cross-env": "^7.0.3", + "inquirer": "^12.6.0", + "lodash-es": "^4.17.21", + "nanoid": "^5.1.5", "pino": "^9.6.0", "pino-pretty": "^13.0.0", "send": "^1.2.0", + "supports-color": "^10.0.0", + "ws": "npm:@kevisual/ws", "zustand": "^5.0.3" }, "engines": { @@ -44,5 +56,11 @@ }, "publishConfig": { "access": "public" + }, + "dependencies": { + "dayjs": "^1.11.13" + }, + "overrides": { + "ws": "npm:@kevisual/ws" } } \ No newline at end of file diff --git a/assistant/src/app.ts b/assistant/src/app.ts index c457edf..a3b12cc 100644 --- a/assistant/src/app.ts +++ b/assistant/src/app.ts @@ -1,13 +1,7 @@ import { App } from '@kevisual/router'; -import { AssistantConfig } from '@/module/assistant/index.ts'; import { HttpsPem } from '@/module/assistant/https/sign.ts'; -import path from 'node:path'; - -export const configDir = path.resolve(process.env.assistantConfigDir || process.cwd()); -export const assistantConfig = new AssistantConfig({ - configDir, - init: true, -}); +import { assistantConfig } from '@/config.ts'; +export { assistantConfig }; const httpsPem = new HttpsPem(assistantConfig); export const app = new App({ serverOptions: { diff --git a/assistant/src/command/app-manager/index.ts b/assistant/src/command/app-manager/index.ts new file mode 100644 index 0000000..1fc9f63 --- /dev/null +++ b/assistant/src/command/app-manager/index.ts @@ -0,0 +1,68 @@ +import { AssistantApp } from '@/module/assistant/index.ts'; +import { program, Command, assistantConfig } from '@/program.ts'; + +const appManagerCommand = new Command('app-manager').alias('am').description('Manage Assistant Apps 管理本地的应用模块'); +program.addCommand(appManagerCommand); + +appManagerCommand + .command('list') + .description('List all installed apps') + .action(async () => { + const manager = new AssistantApp(assistantConfig); + await manager.loadConfig(); + const showInfos = manager.getAllAppShowInfo(); + console.log('Installed Apps:', showInfos); + }); + +appManagerCommand + .command('detect') + .description('Detect all installed apps') + .action(async () => { + const manager = new AssistantApp(assistantConfig); + await manager.loadConfig(); + const showInfos = await manager.detectApp(); + if (showInfos === true) { + const showInfos = manager.getAllAppShowInfo(); + console.log('Installed Apps:', showInfos); + } else { + console.log('Install New Apps:', showInfos); + } + }); + +appManagerCommand + .command('start') + .argument('', '应用的 key 名称') + .action(async (appKey: string) => { + const manager = new AssistantApp(assistantConfig); + await manager.loadConfig(); + manager.start(appKey); + console.log('Start App:', appKey); + }); + +appManagerCommand + .command('stop') + .argument('', '应用的 key 名称') + .action(async (appKey: string) => { + const manager = new AssistantApp(assistantConfig); + try { + await manager.loadConfig(); + await manager.stop(appKey); + } catch (error) { + console.error(error); + } + console.log('Stop App:', appKey); + }); + +appManagerCommand + .command('restart') + .argument('', '应用的 key 名称') + .action(async (appKey: string) => { + const manager = new AssistantApp(assistantConfig); + try { + await manager.loadConfig(); + await manager.restart(appKey); + } catch (error) { + console.error(error); + } + console.log('Restart App:', appKey); + }); diff --git a/assistant/src/config.ts b/assistant/src/config.ts new file mode 100644 index 0000000..ebcb84e --- /dev/null +++ b/assistant/src/config.ts @@ -0,0 +1,7 @@ +import { AssistantConfig } from '@/module/assistant/index.ts'; + +export const configDir = AssistantConfig.detectConfigDir(); +export const assistantConfig = new AssistantConfig({ + configDir, + init: true, +}); diff --git a/assistant/src/index.ts b/assistant/src/index.ts index dcf71d1..55de4e8 100644 --- a/assistant/src/index.ts +++ b/assistant/src/index.ts @@ -1,5 +1,6 @@ import { program, runProgram } from '@/program.ts'; import './command/init/index.ts'; +import './command/app-manager/index.ts'; /** * 通过命令行解析器解析参数 diff --git a/assistant/src/module/assistant/config/index.ts b/assistant/src/module/assistant/config/index.ts index d6bf318..af07f14 100644 --- a/assistant/src/module/assistant/config/index.ts +++ b/assistant/src/module/assistant/config/index.ts @@ -17,11 +17,12 @@ const configDir = createDir(path.join(homedir(), '.config/envision/assistant-app export const initConfig = (configRootPath: string) => { const configDir = createDir(path.join(configRootPath, 'assistant-app')); const configPath = path.join(configDir, 'assistant-config.json'); - const appConfigPath = path.join(configDir, 'assistant-app-config.json'); - const appDir = createDir(path.join(configDir, 'frontend')); - const serviceDir = createDir(path.join(configDir, 'services')); - const serviceConfigPath = path.join(serviceDir, 'assistant-service-config.json'); + const pageConfigPath = path.join(configDir, 'assistant-page-config.json'); + const pageDir = createDir(path.join(configDir, 'page')); + const appsDir = createDir(path.join(configDir, 'apps')); + const appsConfigPath = path.join(appsDir, 'assistant-apps-config.json'); const appPidPath = path.join(configDir, 'assistant-app.pid'); + const envConfigPath = path.join(configDir, '.env'); return { /** * 助手配置文件路径 @@ -34,30 +35,34 @@ export const initConfig = (configRootPath: string) => { /** * 服务目录, 后端服务目录 */ - serviceDir, + appsDir, /** * 服务配置文件路径 assistant-service-config.json */ - serviceConfigPath, + appsConfigPath, /** * 应用目录, 前端应用目录 */ - appDir, + pageDir, /** - * 应用配置文件路径, assistant-app-config.json + * 应用配置文件路径, assistant-page-config.json */ - appConfigPath, + pageConfigPath, /** * 应用进程pid文件路径 */ appPidPath, + /** + * 环境变量配置文件路径 + */ + envConfigPath, }; }; export type ReturnInitConfigType = ReturnType; type AssistantConfigData = { pageApi?: string; // https://kevisual.silkyai.cn - proxy?: { user: string; key: string; path: string }[]; + proxy?: ProxyInfo[]; apiProxyList?: ProxyInfo[]; description?: string; }; @@ -120,25 +125,25 @@ export class AssistantConfig { * 应用配置 * @returns */ - getAppConfig(): AppConfig { - const { appConfigPath } = this.configPath; - if (!checkFileExists(appConfigPath)) { + getPageConfig(): AppConfig { + const { pageConfigPath } = this.configPath; + if (!checkFileExists(pageConfigPath)) { return { list: [], }; } - return JSON.parse(fs.readFileSync(appConfigPath, 'utf8')); + return JSON.parse(fs.readFileSync(pageConfigPath, 'utf8')); } setAppConfig(config?: AppConfig) { - const _config = this.getAppConfig(); + const _config = this.getPageConfig(); const _saveConfig = { ..._config, ...config }; - const { appConfigPath } = this.configPath; + const { pageConfigPath } = this.configPath; - fs.writeFileSync(appConfigPath, JSON.stringify(_saveConfig, null, 2)); + fs.writeFileSync(pageConfigPath, JSON.stringify(_saveConfig, null, 2)); return _saveConfig; } assAppConfig(app: any) { - const config = this.getAppConfig(); + const config = this.getPageConfig(); const assistantConfig = this.getCacheAssistantConfig(); const _apps = config.list; const _proxy = assistantConfig.proxy || []; @@ -166,7 +171,36 @@ export class AssistantConfig { return config; } getAppList() { - return this.getAppConfig().list; + return this.getPageConfig().list; + } + /** + * process.env.ASSISTANT_CONFIG_DIR || process.cwd() + * configDir是助手配置文件目录,文件内部包函 + * assistant-config.json 配置文件 + * assistant-page-config.json 应用配置文件 + * assistant-app.pid 应用进程pid文件 + * .env 环境变量配置文件 + * apps: 服务目录 + * page: 应用目录 + * pem: 证书目录 + * @param configDir + */ + static detectConfigDir(configDir?: string) { + const checkConfigDir = path.resolve(configDir || process.env.ASSISTANT_CONFIG_DIR || process.cwd()); + const configPath = path.join(checkConfigDir, 'assistant-app'); + if (checkFileExists(configPath)) { + return path.join(checkConfigDir); + } + const lastConfigPath = path.join(checkConfigDir, '..', 'assistant-app'); + if (checkFileExists(lastConfigPath)) { + return path.join(checkConfigDir, '..'); + } + const lastConfigPath2 = path.join(checkConfigDir, '../..', 'assistant-app'); + if (checkFileExists(lastConfigPath2)) { + return path.join(checkConfigDir, '../..'); + } + // 如果没有找到助手配置文件目录,则返回当前目录, 执行默认创建助手配置文件目录 + return checkConfigDir; } } diff --git a/assistant/src/module/assistant/https/sign.ts b/assistant/src/module/assistant/https/sign.ts index a9e2e2f..476d2bd 100644 --- a/assistant/src/module/assistant/https/sign.ts +++ b/assistant/src/module/assistant/https/sign.ts @@ -4,6 +4,8 @@ import fs from 'node:fs'; import { AssistantConfig } from '../config/index.ts'; import { checkFileExists } from '../file/index.ts'; import { chalk } from '@/module/chalk.ts'; +import dayjs from 'dayjs'; + type Attributes = { name: string; value: string; @@ -36,24 +38,91 @@ export class HttpsPem { const pemPath = { key: path.join(pemDir, 'https-private-key.pem'), cert: path.join(pemDir, 'https-cert.pem'), + config: path.join(pemDir, 'https-config.json'), + }; + const writeCreate = (opts: { key: string; cert: string; data: { createTime: number; expireTime: number } }) => { + fs.writeFileSync(pemPath.key, opts.key); + fs.writeFileSync(pemPath.cert, opts.cert); + fs.writeFileSync(pemPath.config, JSON.stringify(opts.data, null, 2)); }; if (!checkFileExists(pemPath.key) || !checkFileExists(pemPath.cert)) { - const { key, cert } = this.createCert(); - fs.writeFileSync(pemPath.key, key); - fs.writeFileSync(pemPath.cert, cert); - console.log(chalk.green('证书创建成功')) + const { key, cert, data } = this.createCert(); + writeCreate({ key, cert, data }); + console.log(chalk.green('证书创建成功,浏览器需要导入当前证书')); return { key, cert, }; } + + if (!checkFileExists(pemPath.config)) { + const data = this.createExpireData(); + fs.writeFileSync(pemPath.config, JSON.stringify(data, null, 2)); + } const key = fs.readFileSync(pemPath.key, 'utf-8'); const cert = fs.readFileSync(pemPath.cert, 'utf-8'); + const config = fs.readFileSync(pemPath.config, 'utf-8'); + let expireTime = 0; + try { + const data = JSON.parse(config); + expireTime = data.expireTime; + if (typeof expireTime !== 'number') { + throw new Error('expireTime is not a number'); + } + } catch (error) { + console.log(chalk.red('证书配置文件损坏,重新生成证书')); + } + const now = new Date().getTime(); + if (now > expireTime) { + this.removeCert(); + const { key, cert, data } = this.createCert(); + writeCreate({ key, cert, data }); + console.log(chalk.green('证书更新成功, 浏览器需要重新导入当前证书')); + return { + key, + cert, + }; + } return { key, cert, }; } + createExpireData() { + const expireTime = new Date().getTime() + 365 * 24 * 60 * 60 * 1000; + const expireDate = dayjs(expireTime).format('YYYY-MM-DD HH:mm:ss'); + return { + description: '手动导入证书到浏览器, https-cert.pem文件, 具体使用教程访问 https://kevisual.cn/root/pem-docs/', + createTime: new Date().getTime(), + expireDate, + expireTime, + }; + } + /* + * 重新生成证书 + */ + removeCert() { + const pemDir = this.getPemDir(); + const pemPath = { + key: path.join(pemDir, 'https-private-key.pem'), + cert: path.join(pemDir, 'https-cert.pem'), + }; + const oldPath = { + key: path.join(pemDir, 'https-private-key.pem.bak'), + cert: path.join(pemDir, 'https-cert.pem.bak'), + }; + if (checkFileExists(pemPath.key)) { + fs.renameSync(pemPath.key, oldPath.key); + } + if (checkFileExists(pemPath.cert)) { + fs.renameSync(pemPath.cert, oldPath.cert); + } + } + /* + * 创建证书 + * @param attrs 证书属性 + * @param altNames 证书备用名称 + */ createCert(attrs?: Attributes[], altNames?: AltNames[]) { const attributes = attrs || []; const altNamesList = altNames || []; @@ -71,9 +140,13 @@ export class HttpsPem { ], altNamesList, ); + const data = this.createExpireData(); return { key, cert, + data: { + ...data, + }, }; } } diff --git a/assistant/src/module/assistant/index.ts b/assistant/src/module/assistant/index.ts index f0f3010..b3ee912 100644 --- a/assistant/src/module/assistant/index.ts +++ b/assistant/src/module/assistant/index.ts @@ -5,3 +5,5 @@ export * from './file/index.ts'; export * from './process/index.ts'; export * from './proxy/index.ts'; + +export * from './local-app-manager/index.ts'; \ No newline at end of file diff --git a/assistant/src/module/assistant/local-app-manager/assistant-app.ts b/assistant/src/module/assistant/local-app-manager/assistant-app.ts new file mode 100644 index 0000000..7a720f1 --- /dev/null +++ b/assistant/src/module/assistant/local-app-manager/assistant-app.ts @@ -0,0 +1,18 @@ +import { Manager } from '@kevisual/local-app-manager/manager'; +import { AssistantConfig } from '@/module/assistant/index.ts'; +import path from 'node:path'; + +export class AssistantApp extends Manager { + config: AssistantConfig; + + constructor(config: AssistantConfig) { + const appsPath = config.configPath?.appsDir || path.join(process.cwd(), 'apps'); + const appsConfigPath = config.configPath?.appsConfigPath; + const configFimename = path.basename(appsConfigPath || ''); + super({ + appsPath, + configFilename: configFimename, + }); + this.config = config; + } +} diff --git a/assistant/src/module/assistant/local-app-manager/index.ts b/assistant/src/module/assistant/local-app-manager/index.ts new file mode 100644 index 0000000..8bcff8e --- /dev/null +++ b/assistant/src/module/assistant/local-app-manager/index.ts @@ -0,0 +1,3 @@ +export { Manager } from '@kevisual/local-app-manager/manager'; +export { Pm2Manager } from '@kevisual/local-app-manager/pm2'; +export { AssistantApp } from './assistant-app.ts'; diff --git a/assistant/src/module/assistant/proxy/file-proxy.ts b/assistant/src/module/assistant/proxy/file-proxy.ts index de6247e..344c5ac 100644 --- a/assistant/src/module/assistant/proxy/file-proxy.ts +++ b/assistant/src/module/assistant/proxy/file-proxy.ts @@ -4,6 +4,7 @@ import fs from 'node:fs'; import path from 'path'; import { ProxyInfo } from './proxy.ts'; import { checkFileExists } from '../file/index.ts'; +import { log } from '@/module/logger.ts'; export const fileProxy = (req: http.IncomingMessage, res: http.ServerResponse, proxyApi: ProxyInfo) => { // url开头的文件 @@ -11,6 +12,9 @@ export const fileProxy = (req: http.IncomingMessage, res: http.ServerResponse, p const [user, key, _info] = url.pathname.split('/'); const pathname = url.pathname.slice(1); const { indexPath = '', target = '', rootPath = process.cwd() } = proxyApi; + if (!indexPath) { + return res.end('Not Found indexPath'); + } try { // 检测文件是否存在,如果文件不存在,则返回404 let filePath = ''; @@ -23,7 +27,7 @@ export const fileProxy = (req: http.IncomingMessage, res: http.ServerResponse, p filePath = path.join(rootPath, target, indexPath); exist = checkFileExists(filePath, true); } - console.log('filePath', filePath, exist); + log.debug('filePath', { filePath, exist }); if (!exist) { res.statusCode = 404; diff --git a/assistant/src/module/assistant/proxy/api-proxy.ts b/assistant/src/module/assistant/proxy/http-proxy.ts similarity index 74% rename from assistant/src/module/assistant/proxy/api-proxy.ts rename to assistant/src/module/assistant/proxy/http-proxy.ts index 9fdbe2f..8e5036d 100644 --- a/assistant/src/module/assistant/proxy/api-proxy.ts +++ b/assistant/src/module/assistant/proxy/http-proxy.ts @@ -28,10 +28,13 @@ export const createApiProxy = (api: string, paths: string[] = ['/api', '/v1']) = return pathList; }; -export const apiProxy = (req: http.IncomingMessage, res: http.ServerResponse, proxyApi: ProxyInfo) => { +export const httpProxy = (req: http.IncomingMessage, res: http.ServerResponse, proxyApi: ProxyInfo) => { const { target } = proxyApi; const _u = new URL(req.url, `${target}`); - console.log('proxyApi', { url: req.url, target: _u.href }); + // console.log('proxyApi', { url: req.url, target: _u.href }); + if (proxyApi.pathname) { + _u.pathname = _u.pathname.replace(proxyApi.path, proxyApi.pathname); + } // 设置代理请求的目标 URL 和请求头 let header: any = {}; if (req.headers?.['Authorization'] && !req.headers?.['authorization']) { @@ -41,6 +44,9 @@ export const apiProxy = (req: http.IncomingMessage, res: http.ServerResponse, pr // 处理大小写不一致的cookie header.cookie = req.headers['cookie'] || req.headers['Cookie']; } + // console.log('host', req.headers.host, proxyApi, _u.href, req.headers.authorization); + const origin = req.headers?.origin || req.headers?.referer || 'http://localhost'; + const cookieHost = new URL(origin).host.split(':')[0]; // 提取req的headers中的非HOST的header const headers = Object.keys(req.headers).filter((item) => item && item.toLowerCase() !== 'host'); headers.forEach((item) => { @@ -54,11 +60,12 @@ export const apiProxy = (req: http.IncomingMessage, res: http.ServerResponse, pr } header[item] = req.headers[item]; }); - const options: http.RequestOptions = { + const options: http.RequestOptions | https.RequestOptions = { host: _u.hostname, path: req.url, method: req.method, headers: { + ['kevisual-origin']: 'assistant', ...header, }, }; @@ -67,12 +74,20 @@ export const apiProxy = (req: http.IncomingMessage, res: http.ServerResponse, pr // @ts-ignore options.port = _u.port; } + const isHttps = _u.protocol === 'https:'; const httpProxy = _u.protocol === 'https:' ? https : http; + console.log('httpProxy', { isHttps, target, url: _u.href }); + if (isHttps) { + // @ts-ignore + options.rejectUnauthorized = false; // 忽略证书错误 + } + // 创建代理请求 const proxyReq = httpProxy.request(options, (proxyRes) => { // Modify the 'set-cookie' headers using rewriteCookieDomain if (proxyRes.headers['set-cookie']) { - proxyRes.headers['set-cookie'] = proxyRes.headers['set-cookie'].map((cookie) => rewriteCookieDomain(cookie, 'localhost')); + proxyRes.headers['set-cookie'] = proxyRes.headers['set-cookie'].map((cookie) => rewriteCookieDomain(cookie, cookieHost)); + console.log('rewritten set-cookie:', proxyRes.headers['set-cookie']); } // 将代理服务器的响应头和状态码返回给客户端 res.writeHead(proxyRes.statusCode, proxyRes.headers); diff --git a/assistant/src/module/assistant/proxy/index.ts b/assistant/src/module/assistant/proxy/index.ts index 3af7f79..58afd2f 100644 --- a/assistant/src/module/assistant/proxy/index.ts +++ b/assistant/src/module/assistant/proxy/index.ts @@ -1,5 +1,5 @@ export * from './proxy.ts'; export * from './file-proxy.ts'; export { default as send } from 'send'; -export * from './api-proxy.ts'; +export * from './http-proxy.ts'; export * from './ws-proxy.ts'; \ No newline at end of file diff --git a/assistant/src/module/assistant/proxy/proxy.ts b/assistant/src/module/assistant/proxy/proxy.ts index 793db74..bec35a1 100644 --- a/assistant/src/module/assistant/proxy/proxy.ts +++ b/assistant/src/module/assistant/proxy/proxy.ts @@ -1,4 +1,7 @@ export type ProxyInfo = { + /** + * 代理路径, 比如/root/center, 匹配的路径 + */ path?: string; /** * 目标地址 @@ -7,21 +10,28 @@ export type ProxyInfo = { /** * 类型 */ - type?: 'static' | 'dynamic' | 'minio'; + type?: 'file' | 'dynamic' | 'minio' | 'http'; /** - * 是否使用websocket + * 目标的 pathname, 默认为请求的url.pathname, 设置了pathname,则会使用pathname作为请求的url.pathname + * @default undefined + * @example /api/v1/user + */ + pathname?: string; + /** + * 是否使用websocket, http * @default false */ ws?: boolean; /** - * 首要文件,比如index.html, 设置了首要文件,如果文件不存在,则访问首要文件 + * 首要文件,比如index.html, type为fileProxy代理有用 设置了首要文件,如果文件不存在,则访问首要文件 */ indexPath?: string; /** - * 根路径, 默认是process.cwd() + * 根路径, 默认是process.cwd(), type为fileProxy代理有用,必须为绝对路径 */ rootPath?: string; }; + export type ApiList = { path: string; /** diff --git a/assistant/src/module/assistant/proxy/ws-proxy.ts b/assistant/src/module/assistant/proxy/ws-proxy.ts index d8cc5ff..67f3a5a 100644 --- a/assistant/src/module/assistant/proxy/ws-proxy.ts +++ b/assistant/src/module/assistant/proxy/ws-proxy.ts @@ -1,49 +1,103 @@ -import { Server } from 'http'; -import WebSocket from 'ws'; +import type { Server as HttpsServer } from 'node:https'; +import type { Server as HttpServer } from 'node:http'; +import type { Http2Server } from 'node:http2'; +import { WebSocket } from 'ws'; import { ProxyInfo } from './proxy.ts'; +import { WebSocketServer } from 'ws'; + +export const wss = new WebSocketServer({ + noServer: true, +}); + +type WssAppOptions = { + wss: WebSocketServer; + apiList: ProxyInfo[]; +}; +class WssApp { + wss: WebSocketServer; + apiList: ProxyInfo[]; + constructor(opts: WssAppOptions) { + this.wss = opts.wss; + this.apiList = opts.apiList; + } + upgrade(request: any, socket: any, head: any) { + const req = request as any; + const wss = this.wss; + const url = new URL(req.url, 'http://localhost'); + const id = url.searchParams.get('id'); + console.log('upgrade', request.url, id); + wss.handleUpgrade(req, socket, head, (ws) => { + wss.emit('connection', ws, req); + }); + } + async handleConnection(ws: WebSocket, req: any) { + console.log('connected', req.url); + const that = this; + const proxyApiList: ProxyInfo[] = that.apiList || []; + const proxyApi = proxyApiList.find((item) => req.url.startsWith(item.path)); + + if (proxyApi && proxyApi.ws) { + const _u = new URL(req.url, `${proxyApi.target}`); + if (proxyApi.pathname) { + _u.pathname = _u.pathname.replace(proxyApi.path, proxyApi.pathname); + } + const isHttps = _u.protocol === 'https:'; + const wsProtocol = isHttps ? 'wss' : 'ws'; + const wsUrl = `${wsProtocol}://${_u.host}${_u.pathname}`; + console.log('WebSocket proxy URL', { wsUrl }); + const proxySocket = new WebSocket(wsUrl, { + // headers: req.headers, + rejectUnauthorized: false, + }); + proxySocket.on('open', () => { + ws.on('message', (message) => { + console.log('WebSocket client message', message); + proxySocket.send(message); + }); + proxySocket.on('message', (message) => { + // console.log('WebSocket proxy message', message); + ws.send(message.toString()); + }); + }); + + proxySocket.on('error', (err) => { + console.error(`WebSocket proxy error: ${err.message}`); + }); + proxySocket.on('close', () => { + console.log('WebSocket proxy closed'); + }); + ws.on('error', (err) => { + console.error('WebSocket client error', err); + proxySocket?.close?.(); + }); + ws.on('close', () => { + console.log('WebSocket client closed'); + proxySocket?.close?.(); + }); + } else { + ws.send(JSON.stringify({ type: 'error', message: 'not found' })); + ws.close(); + } + } +} /** * websocket代理 * apiList: [{ path: '/api/router', target: 'https://kevisual.xiongxiao.me' }] * @param server * @param config */ -export const wsProxy = (server: Server, config: { apiList: ProxyInfo[] }) => { - console.log('Upgrade initialization started'); - - server.on('upgrade', (req, socket, head) => { - const proxyApiList: ProxyInfo[] = config?.apiList || []; - const proxyApi = proxyApiList.find((item) => req.url.startsWith(item.path)); - - if (proxyApi && proxyApi.ws) { - const _u = new URL(req.url, `${proxyApi.target}`); - const isHttps = _u.protocol === 'https:'; - const wsProtocol = isHttps ? 'wss' : 'ws'; - const wsUrl = `${wsProtocol}://${_u.hostname}${_u.pathname}`; - - const proxySocket = new WebSocket(wsUrl, { - headers: req.headers, - }); - - proxySocket.on('open', () => { - socket.on('data', (data) => { - proxySocket.send(data); - }); - - proxySocket.on('message', (message) => { - socket.write(message); - }); - }); - - proxySocket.on('error', (err) => { - console.error(`WebSocket proxy error: ${err.message}`); - socket.end(); - }); - - socket.on('error', () => { - proxySocket.close(); - }); - } else { - socket.end(); - } +export const wsProxy = (server: HttpServer | HttpsServer | Http2Server, config: { apiList: ProxyInfo[] }) => { + // console.log('Upgrade initialization started'); + const wssApp = new WssApp({ + wss: wss, + apiList: config.apiList, + }); + wss.on('connection', async (ws, req) => { + // console.log('WebSocket connection established'); + await wssApp.handleConnection(ws, req); + }); + // 处理升级请求 + server.on('upgrade', (request, socket, head) => { + wssApp.upgrade(request, socket, head); }); }; diff --git a/assistant/src/program.ts b/assistant/src/program.ts index 6dcfa9d..3af29fc 100644 --- a/assistant/src/program.ts +++ b/assistant/src/program.ts @@ -1,4 +1,5 @@ import { program, Command } from 'commander'; +import { assistantConfig } from './config.ts'; import fs from 'fs'; // 将多个子命令加入主程序中 let version = '0.0.1'; @@ -15,7 +16,7 @@ const ls = new Command('ls').description('List files in the current directory'). }); program.addCommand(ls); -export { program, Command }; +export { program, Command, assistantConfig }; /** * 在命令行中运行程序 diff --git a/assistant/src/serve.ts b/assistant/src/server.ts similarity index 63% rename from assistant/src/serve.ts rename to assistant/src/server.ts index 82e5601..c17d2a7 100644 --- a/assistant/src/serve.ts +++ b/assistant/src/server.ts @@ -1,8 +1,10 @@ import { app } from './app.ts'; -import { proxyRoute } from './services/proxy/proxy-page-index.ts'; +import { proxyRoute, proxyWs } from './services/proxy/proxy-page-index.ts'; app.listen(51015, () => { console.log('Server is running on http://localhost:51015'); }); app.server.on(proxyRoute); + +proxyWs(); diff --git a/assistant/src/services/init/index.ts b/assistant/src/services/init/index.ts index 987e1ec..e741fa2 100644 --- a/assistant/src/services/init/index.ts +++ b/assistant/src/services/init/index.ts @@ -1,3 +1,4 @@ +import fs from 'node:fs'; import path from 'node:path'; import { checkFileExists, AssistantConfig } from '@/module/assistant/index.ts'; import { chalk } from '@/module/chalk.ts'; @@ -40,5 +41,10 @@ export class AssistantInit extends AssistantConfig { }); console.log(chalk.green('助手配置文件创建成功')); } + const env = this.configPath?.envConfigPath; + if (!checkFileExists(env, true)) { + fs.writeFileSync(env, '# 环境配置文件\n'); + console.log(chalk.green('助手环境配置文件创建成功')); + } } } diff --git a/assistant/src/services/proxy/local-proxy.ts b/assistant/src/services/proxy/local-proxy.ts index a92ff00..70a99f0 100644 --- a/assistant/src/services/proxy/local-proxy.ts +++ b/assistant/src/services/proxy/local-proxy.ts @@ -43,8 +43,7 @@ export class LocalProxy { } } init() { - const frontAppDir = this.assistantConfig.configPath?.appDir; - console.log('frontAppDir', frontAppDir); + const frontAppDir = this.assistantConfig.configPath?.pageDir; if (frontAppDir) { const userList = fs.readdirSync(frontAppDir); const localProxyProxyList: ProxyType[] = []; diff --git a/assistant/src/services/proxy/proxy-page-index.ts b/assistant/src/services/proxy/proxy-page-index.ts index a2682f0..136d0e8 100644 --- a/assistant/src/services/proxy/proxy-page-index.ts +++ b/assistant/src/services/proxy/proxy-page-index.ts @@ -1,14 +1,14 @@ -import { fileProxy, apiProxy, createApiProxy } from '@/module/assistant/index.ts'; +import { fileProxy, httpProxy, createApiProxy, wsProxy } from '@/module/assistant/index.ts'; import http from 'http'; import { LocalProxy } from './local-proxy.ts'; -import { assistantConfig } from '@/app.ts'; +import { assistantConfig, app } from '@/app.ts'; import { log } from '@/module/logger.ts'; const localProxy = new LocalProxy({ assistantConfig, }); export const proxyRoute = async (req: http.IncomingMessage, res: http.ServerResponse) => { const _assistantConfig = assistantConfig.getCacheAssistantConfig(); - const appDir = assistantConfig.configPath?.appDir; + const appDir = assistantConfig.configPath?.pageDir; const url = new URL(req.url, 'http://localhost'); const pathname = url.pathname; if (pathname.startsWith('/favicon.ico')) { @@ -17,7 +17,7 @@ export const proxyRoute = async (req: http.IncomingMessage, res: http.ServerResp return; } if (pathname.startsWith('/client')) { - console.log('handle by router'); + console.debug('handle by router'); return; } // client, api, v1, serve 开头的拦截 @@ -25,8 +25,8 @@ export const proxyRoute = async (req: http.IncomingMessage, res: http.ServerResp const defaultApiProxy = createApiProxy(_assistantConfig?.pageApi || 'https://kevisual.cn'); const apiBackendProxy = [...apiProxyList, ...defaultApiProxy].find((item) => pathname.startsWith(item.path)); if (apiBackendProxy) { - console.log('apiBackendProxy', apiBackendProxy, req.url); - return apiProxy(req, res, { + log.debug('apiBackendProxy', { apiBackendProxy, url: req.url }); + return httpProxy(req, res, { path: apiBackendProxy.path, target: apiBackendProxy.target, }); @@ -45,13 +45,19 @@ export const proxyRoute = async (req: http.IncomingMessage, res: http.ServerResp } const proxyApiList = _assistantConfig?.proxy || []; const proxyApi = proxyApiList.find((item) => pathname.startsWith(item.path)); - if (proxyApi) { - log.log('proxyApi', { proxyApi, pathname }); - const { user, key } = proxyApi; + if (proxyApi && proxyApi.type === 'file') { + log.debug('proxyApi', { proxyApi, pathname }); + const _indexPath = proxyApi.indexPath || `${_user}/${_app}/index.html`; + const _rootPath = proxyApi.rootPath; + if (!_rootPath) { + log.error('Not Found rootPath', { proxyApi, pathname }); + return res.end(`Not Found [${proxyApi.path}] rootPath`); + } return fileProxy(req, res, { path: proxyApi.path, // 代理路径, 比如/root/center - rootPath: appDir, // 根路径 - indexPath: `${user}/${key}/index.html`, // 首页路径 + rootPath: proxyApi.rootPath, + ...proxyApi, + indexPath: _indexPath, // 首页路径 }); } const localProxyProxyList = localProxy.getLocalProxyList(); @@ -60,26 +66,31 @@ export const proxyRoute = async (req: http.IncomingMessage, res: http.ServerResp log.log('localProxyProxy', { localProxyProxy, url: req.url }); return fileProxy(req, res, { path: localProxyProxy.path, - rootPath: assistantConfig.configPath?.appDir, + rootPath: appDir, indexPath: localProxyProxy.indexPath, }); } - console.log('handle by router 404', req.url); const creatCenterProxy = createApiProxy(_assistantConfig?.pageApi || 'https://kevisual.cn', ['/root']); const centerProxy = creatCenterProxy.find((item) => pathname.startsWith(item.path)); if (centerProxy) { - console.log('centerProxy', centerProxy, req.url); - return apiProxy(req, res, { + return httpProxy(req, res, { path: centerProxy.path, target: centerProxy.target, - type: 'static', + type: 'http', }); } + log.debug('handle by router 404', req.url); + res.statusCode = 404; res.end('Not Found Proxy'); - // console.log('getCacheAssistantConfig().pageApi', getCacheAssistantConfig().pageApi); - // return apiProxy(req, res, { - // path: url.pathname, - // target: getCacheAssistantConfig().pageApi, - // }); +}; + +export const proxyWs = () => { + const apiProxyList = assistantConfig.getCacheAssistantConfig()?.apiProxyList || []; + const proxy = assistantConfig.getCacheAssistantConfig()?.proxy || []; + const proxyApi = [...apiProxyList, ...proxy].filter((item) => item.ws); + log.debug('proxyApi ', proxyApi); + wsProxy(app.server.server, { + apiList: proxyApi, + }); }; diff --git a/assistant/src/test/ws.ts b/assistant/src/test/ws.ts new file mode 100644 index 0000000..538f4b4 --- /dev/null +++ b/assistant/src/test/ws.ts @@ -0,0 +1,27 @@ +import { WebSocket } from 'ws'; + +export const main = () => { + // https://192.168.31.39:16000/tts + const url = 'https://192.168.31.39:16000/tts'; + // const wss + const ws = new WebSocket('wss://192.168.31.39:16000/tts', { + rejectUnauthorized: false, // 禁用证书验证 + }); + + ws.on('open', () => { + console.log('WebSocket connection opened'); + }); + + ws.on('message', (data) => { + console.log(`Received message: ${data}`); + }); + + ws.on('close', () => { + console.log('WebSocket test connection closed'); + }); + + ws.on('error', (error) => { + console.error(`WebSocket error: ${error}`); + }); +}; +main(); diff --git a/assistant/tasks/silkyai/talkshow.ts b/assistant/tasks/silkyai/talkshow.ts new file mode 100644 index 0000000..8d8d30c --- /dev/null +++ b/assistant/tasks/silkyai/talkshow.ts @@ -0,0 +1,14 @@ +const task1 = { + description: '下载前端应用 root/center 应用', + command: 'ev app download -i root/center -o assistant-app/page', +}; + +const task2 = { + description: '下载前端应用 root/talkshow-admin 应用', + command: 'ev app download -i root/talkshow-admin -o assistant-app/page', +}; + +const task3 = { + description: '安装后端应用 root/talkshow-code-center 应用', + command: 'ev app download -i root/talkshow-code-center -t app -o assistant-app/apps/talkshow-code-center', +}; diff --git a/bin/assistant.js b/bin/assistant.js index e69de29..603e45f 100644 --- a/bin/assistant.js +++ b/bin/assistant.js @@ -0,0 +1,4 @@ +#!/usr/bin/env node +import { runParser } from '../dist/assistant.mjs'; + +runParser(process.argv); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93da3ae..14be2ab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -70,16 +70,23 @@ importers: version: 5.0.3 assistant: + dependencies: + dayjs: + specifier: ^1.11.13 + version: 1.11.13 devDependencies: '@kevisual/load': specifier: ^0.0.6 version: 0.0.6 + '@kevisual/local-app-manager': + specifier: ^0.1.16 + version: 0.1.16(@kevisual/router@0.0.13)(@kevisual/types@0.0.1)(@kevisual/use-config@1.0.11(dotenv@16.5.0))(pm2@5.4.3(supports-color@10.0.0)) '@kevisual/query': specifier: 0.0.17 - version: 0.0.17(encoding@0.1.13)(ws@8.18.0) + version: 0.0.17(@kevisual/ws@8.0.0)(encoding@0.1.13) '@kevisual/query-login': specifier: 0.0.5 - version: 0.0.5(@kevisual/query@0.0.17(encoding@0.1.13)(ws@8.18.0))(rollup@4.40.0)(typescript@5.8.2) + version: 0.0.5(@kevisual/query@0.0.17(@kevisual/ws@8.0.0)(encoding@0.1.13))(rollup@4.40.0)(typescript@5.8.2) '@kevisual/router': specifier: ^0.0.13 version: 0.0.13 @@ -89,21 +96,36 @@ importers: '@types/bun': specifier: ^1.2.10 version: 1.2.10 + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 '@types/node': - specifier: ^22.14.1 - version: 22.14.1 + specifier: ^22.15.2 + version: 22.15.2 '@types/send': specifier: ^0.17.4 version: 0.17.4 + '@types/ws': + specifier: ^8.18.1 + version: 8.18.1 chalk: specifier: ^5.4.1 version: 5.4.1 commander: specifier: ^13.1.0 version: 13.1.0 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 inquirer: - specifier: ^12.5.2 - version: 12.5.2(@types/node@22.14.1) + specifier: ^12.6.0 + version: 12.6.0(@types/node@22.15.2) + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + nanoid: + specifier: ^5.1.5 + version: 5.1.5 pino: specifier: ^9.6.0 version: 9.6.0 @@ -112,7 +134,13 @@ importers: version: 13.0.0 send: specifier: ^1.2.0 - version: 1.2.0 + version: 1.2.0(supports-color@10.0.0) + supports-color: + specifier: ^10.0.0 + version: 10.0.0 + ws: + specifier: npm:@kevisual/ws + version: '@kevisual/ws@8.0.0' zustand: specifier: ^5.0.3 version: 5.0.3 @@ -381,6 +409,15 @@ packages: '@types/node': optional: true + '@inquirer/prompts@7.5.0': + resolution: {integrity: sha512-tk8Bx7l5AX/CR0sVfGj3Xg6v7cYlFBkEahH+EgBB+cZib6Fc83dwerTbzj7f2+qKckjIUGsviWRI1d7lx6nqQA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/rawlist@4.0.12': resolution: {integrity: sha512-wNPJZy8Oc7RyGISPxp9/MpTOqX8lr0r+lCCWm7hQra+MDtYRgINv1hxw7R+vKP71Bu/3LszabxOodfV/uTfsaA==} engines: {node: '>=18'} @@ -390,6 +427,15 @@ packages: '@types/node': optional: true + '@inquirer/rawlist@4.1.0': + resolution: {integrity: sha512-6ob45Oh9pXmfprKqUiEeMz/tjtVTFQTgDDz1xAMKMrIvyrYjAmRbQZjMJfsictlL4phgjLhdLu27IkHNnNjB7g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/search@3.0.12': resolution: {integrity: sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==} engines: {node: '>=18'} @@ -408,6 +454,15 @@ packages: '@types/node': optional: true + '@inquirer/select@4.2.0': + resolution: {integrity: sha512-KkXQ4aSySWimpV4V/TUJWdB3tdfENZUU765GjOIZ0uPwdbGIG6jrxD4dDf1w68uP+DVtfNhr1A92B+0mbTZ8FA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/type@3.0.6': resolution: {integrity: sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==} engines: {node: '>=18'} @@ -449,6 +504,14 @@ packages: '@kevisual/load@0.0.6': resolution: {integrity: sha512-+3YTFehRcZ1haGel5DKYMUwmi5i6f2psyaPZlfkKU/cOXgkpwoG9/BEqPCnPjicKqqnksEpixVRkyHJ+5bjLVA==} + '@kevisual/local-app-manager@0.1.16': + resolution: {integrity: sha512-PiXjL6bFuWyyEgzCaM6omDm7cFYeUMv7SFJ+Axg88RAamqpSHaIhRxvj2wfd+HAh089a16o8oRF9V62cWaURDQ==} + peerDependencies: + '@kevisual/router': ^0.0.6 + '@kevisual/types': ^0.0.1 + '@kevisual/use-config': ^1.0.11 + pm2: ^5.4.3 + '@kevisual/query-login@0.0.5': resolution: {integrity: sha512-389cMMWAisjQoafxX+cUEa2z41S5koDjiyHkucfCkhRoP4M6g0iqbBMavLKmLOWSKx3R8e3ZmXT6RfsYGBb8Ww==} peerDependencies: @@ -460,11 +523,18 @@ packages: '@kevisual/router@0.0.13': resolution: {integrity: sha512-raji8aKXr0jigmJVOKBXb5gpstiAuyoIDy9m6SyPf4lRjCU3pspVI1bpscOUCBlaPICo6TLzPQxXhyTvvvtdWw==} + '@kevisual/types@0.0.1': + resolution: {integrity: sha512-3Wn6WjpfbOGTqIVS7YQ/0CIQEEbZEp+uCTbIWqTZyuytiA/Xoglr5kG3AbTuLFQ81AvfxjEjp5dAnFub+2IhhQ==} + '@kevisual/use-config@1.0.11': resolution: {integrity: sha512-ccilQTRZTpO075L67ZBXhr8Lp3i73/W5cCMT5enMjVrnJT5K0i5JH5IbzBhF6WY5Rj8dmVsAyyjJe24ClyM7Eg==} peerDependencies: dotenv: ^16.4.7 + '@kevisual/ws@8.0.0': + resolution: {integrity: sha512-jlFxSlXUEz93cFW+UYT5BXv/rFVgiMQnIfqRYZ0gj1hSP8PMGRqMqUoHSLfKvfRRS4jseLSvTTeEKSQpZJtURg==} + engines: {node: '>=10.0.0'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -481,6 +551,20 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pm2/agent@2.0.4': + resolution: {integrity: sha512-n7WYvvTJhHLS2oBb1PjOtgLpMhgImOq8sXkPBw6smeg9LJBWZjiEgPKOpR8mn9UJZsB5P3W4V/MyvNnp31LKeA==} + + '@pm2/io@6.0.1': + resolution: {integrity: sha512-KiA+shC6sULQAr9mGZ1pg+6KVW9MF8NpG99x26Lf/082/Qy8qsTCtnJy+HQReW1A9Rdf0C/404cz0RZGZro+IA==} + engines: {node: '>=6.0'} + + '@pm2/js-api@0.8.0': + resolution: {integrity: sha512-nmWzrA/BQZik3VBz+npRcNIu01kdBhWL0mxKmP1ciF/gTcujPTQqt027N9fc1pK9ERM8RipFhymw7RcmCyOEYA==} + engines: {node: '>=4.0'} + + '@pm2/pm2-version-check@1.0.4': + resolution: {integrity: sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==} + '@rollup/plugin-commonjs@28.0.3': resolution: {integrity: sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==} engines: {node: '>=16.0.0 || 14 >= 14.17'} @@ -721,6 +805,9 @@ packages: cpu: [x64] os: [win32] + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@types/bun@1.2.10': resolution: {integrity: sha512-eilv6WFM3M0c9ztJt7/g80BDusK98z/FrFwseZgT4bXCq2vPhXD4z8R3oddmAn+R/Nmz9vBn4kweJKmGTZj+lg==} @@ -736,6 +823,12 @@ packages: '@types/jsonwebtoken@9.0.9': resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.16': + resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} + '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -754,20 +847,40 @@ packages: '@types/node@22.14.1': resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} + '@types/node@22.15.2': + resolution: {integrity: sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + agentkeepalive@4.6.0: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} + amp-message@0.1.2: + resolution: {integrity: sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==} + + amp@0.3.1: + resolution: {integrity: sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -791,6 +904,23 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + + async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -801,6 +931,22 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + blessed@0.1.81: + resolution: {integrity: sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==} + engines: {node: '>= 0.8.0'} + hasBin: true + + bodec@0.1.0: + resolution: {integrity: sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==} + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -811,6 +957,9 @@ packages: buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + bun-types@1.2.10: resolution: {integrity: sha512-b5ITZMnVdf3m1gMvJHG+gIfeJHiQPJak0f7925Hxu6ZN5VKA8AGy4GZ4lM+Xkn6jtWxg5S3ldWvfmXdvnkp3GQ==} @@ -828,6 +977,10 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + chalk@5.4.1: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -835,6 +988,13 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + charm@0.1.2: + resolution: {integrity: sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -843,6 +1003,10 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + cli-tableau@2.0.1: + resolution: {integrity: sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==} + engines: {node: '>=8.10.0'} + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -865,6 +1029,9 @@ packages: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} + commander@2.15.1: + resolution: {integrity: sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -876,6 +1043,14 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} + croner@4.1.97: + resolution: {integrity: sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -883,9 +1058,39 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + culvert@0.1.2: + resolution: {integrity: sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + dayjs@1.8.36: + resolution: {integrity: sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -899,6 +1104,10 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -940,6 +1149,10 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -964,9 +1177,31 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -975,6 +1210,15 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} + eventemitter2@0.4.14: + resolution: {integrity: sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==} + + eventemitter2@5.0.1: + resolution: {integrity: sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==} + + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -982,6 +1226,9 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} + extrareqp2@1.0.0: + resolution: {integrity: sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==} + fast-copy@3.0.2: resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} @@ -989,6 +1236,9 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-json-patch@3.1.1: + resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} + fast-redact@3.5.0: resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} @@ -999,6 +1249,9 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fclone@1.0.11: + resolution: {integrity: sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==} + fdir@6.4.0: resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==} peerDependencies: @@ -1023,6 +1276,15 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} @@ -1058,6 +1320,21 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-uri@6.0.4: + resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} + engines: {node: '>= 14'} + + git-node-fs@1.0.0: + resolution: {integrity: sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==} + peerDependencies: + js-git: ^0.7.8 + peerDependenciesMeta: + js-git: + optional: true + + git-sha1@0.1.2: + resolution: {integrity: sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1070,6 +1347,10 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -1089,6 +1370,14 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -1110,6 +1399,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + inquirer@12.5.2: resolution: {integrity: sha512-qoDk/vdSTIaXNXAoNnlg7ubexpJfUo7t8GT2vylxvE49BrLhToFuPPdMViidG2boHV7+AcP1TCkJs/+PPoF2QQ==} engines: {node: '>=18'} @@ -1119,6 +1411,23 @@ packages: '@types/node': optional: true + inquirer@12.6.0: + resolution: {integrity: sha512-3zmmccQd/8o65nPOZJZ+2wqt76Ghw3+LaMrmc6JE/IzcvQhJ1st+QLCOo/iLS85/tILU0myG31a2TAZX0ysAvg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-core-module@2.15.1: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} @@ -1155,9 +1464,22 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-git@0.7.8: + resolution: {integrity: sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -1168,6 +1490,10 @@ packages: jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + lazy@1.0.11: + resolution: {integrity: sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA==} + engines: {node: '>=0.2.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -1179,6 +1505,9 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -1203,9 +1532,20 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} @@ -1255,14 +1595,25 @@ packages: resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} engines: {node: '>= 18'} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} hasBin: true + module-details-from-path@1.0.3: + resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} @@ -1275,6 +1626,20 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.1.5: + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} + engines: {node: ^18 || >=20} + hasBin: true + + needle@2.4.0: + resolution: {integrity: sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==} + engines: {node: '>= 4.4.x'} + hasBin: true + + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -1292,6 +1657,14 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nssocket@0.6.0: + resolution: {integrity: sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w==} + engines: {node: '>= 0.10.x'} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -1323,9 +1696,20 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1352,6 +1736,14 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + pidusage@2.0.21: + resolution: {integrity: sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==} + engines: {node: '>=8'} + + pidusage@3.0.2: + resolution: {integrity: sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==} + engines: {node: '>=10'} + pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} @@ -1370,6 +1762,29 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pm2-axon-rpc@0.7.1: + resolution: {integrity: sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==} + engines: {node: '>=5'} + + pm2-axon@4.0.1: + resolution: {integrity: sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==} + engines: {node: '>=5'} + + pm2-deploy@1.0.2: + resolution: {integrity: sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==} + engines: {node: '>=4.0.0'} + + pm2-multimeter@0.1.2: + resolution: {integrity: sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA==} + + pm2-sysmonit@1.2.8: + resolution: {integrity: sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==} + + pm2@5.4.3: + resolution: {integrity: sha512-4/I1htIHzZk1Y67UgOCo4F1cJtas1kSds31N8zN0PybO230id1nigyjGuGFzUnGmUFPmrJ0On22fO1ChFlp7VQ==} + engines: {node: '>=12.0.0'} + hasBin: true + postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} @@ -1395,6 +1810,16 @@ packages: process-warning@4.0.1: resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + promptly@2.2.0: + resolution: {integrity: sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==} + + proxy-agent@6.3.1: + resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} @@ -1412,6 +1837,14 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + read@1.0.7: + resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} + engines: {node: '>=0.8'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1420,6 +1853,10 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} + require-in-the-middle@5.2.0: + resolution: {integrity: sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==} + engines: {node: '>=6'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -1460,6 +1897,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-series@1.1.9: + resolution: {integrity: sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==} + rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} @@ -1473,6 +1913,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} @@ -1480,6 +1923,11 @@ packages: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -1500,10 +1948,28 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shimmer@1.2.1: + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.4: + resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sonic-boom@4.2.0: resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} @@ -1511,6 +1977,13 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -1519,6 +1992,12 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + sprintf-js@1.1.2: + resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -1548,10 +2027,24 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + supports-color@10.0.0: + resolution: {integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==} + engines: {node: '>=18'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + systeminformation@5.25.11: + resolution: {integrity: sha512-jI01fn/t47rrLTQB0FTlMCC+5dYx8o0RRF+R4BPiUNsvg5OdY0s9DKMFmJGrx5SwMZQ4cag0Gl6v8oycso9b/g==} + engines: {node: '>=8.0.0'} + os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + hasBin: true + tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} @@ -1598,6 +2091,9 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tslib@1.9.3: + resolution: {integrity: sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -1620,6 +2116,13 @@ packages: typescript: optional: true + tv4@1.3.0: + resolution: {integrity: sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==} + engines: {node: '>= 0.8.0'} + + tx2@1.0.5: + resolution: {integrity: sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==} + type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -1635,6 +2138,10 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + vizion@2.2.1: + resolution: {integrity: sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==} + engines: {node: '>=4.0'} + web-streams-polyfill@4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} @@ -1671,6 +2178,18 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -1683,6 +2202,9 @@ packages: utf-8-validate: optional: true + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} @@ -1806,6 +2328,16 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + '@inquirer/checkbox@4.1.5(@types/node@22.15.2)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.15.2) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@22.15.2) + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.2 + '@inquirer/confirm@5.1.9(@types/node@22.14.1)': dependencies: '@inquirer/core': 10.1.10(@types/node@22.14.1) @@ -1813,6 +2345,13 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + '@inquirer/confirm@5.1.9(@types/node@22.15.2)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.15.2) + '@inquirer/type': 3.0.6(@types/node@22.15.2) + optionalDependencies: + '@types/node': 22.15.2 + '@inquirer/core@10.1.10(@types/node@22.14.1)': dependencies: '@inquirer/figures': 1.0.11 @@ -1826,6 +2365,19 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + '@inquirer/core@10.1.10(@types/node@22.15.2)': + dependencies: + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@22.15.2) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.2 + '@inquirer/editor@4.2.10(@types/node@22.14.1)': dependencies: '@inquirer/core': 10.1.10(@types/node@22.14.1) @@ -1834,6 +2386,14 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + '@inquirer/editor@4.2.10(@types/node@22.15.2)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.15.2) + '@inquirer/type': 3.0.6(@types/node@22.15.2) + external-editor: 3.1.0 + optionalDependencies: + '@types/node': 22.15.2 + '@inquirer/expand@4.0.12(@types/node@22.14.1)': dependencies: '@inquirer/core': 10.1.10(@types/node@22.14.1) @@ -1842,6 +2402,14 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + '@inquirer/expand@4.0.12(@types/node@22.15.2)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.15.2) + '@inquirer/type': 3.0.6(@types/node@22.15.2) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.2 + '@inquirer/figures@1.0.11': {} '@inquirer/input@4.1.9(@types/node@22.14.1)': @@ -1851,6 +2419,13 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + '@inquirer/input@4.1.9(@types/node@22.15.2)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.15.2) + '@inquirer/type': 3.0.6(@types/node@22.15.2) + optionalDependencies: + '@types/node': 22.15.2 + '@inquirer/number@3.0.12(@types/node@22.14.1)': dependencies: '@inquirer/core': 10.1.10(@types/node@22.14.1) @@ -1858,6 +2433,13 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + '@inquirer/number@3.0.12(@types/node@22.15.2)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.15.2) + '@inquirer/type': 3.0.6(@types/node@22.15.2) + optionalDependencies: + '@types/node': 22.15.2 + '@inquirer/password@4.0.12(@types/node@22.14.1)': dependencies: '@inquirer/core': 10.1.10(@types/node@22.14.1) @@ -1866,6 +2448,14 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + '@inquirer/password@4.0.12(@types/node@22.15.2)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.15.2) + '@inquirer/type': 3.0.6(@types/node@22.15.2) + ansi-escapes: 4.3.2 + optionalDependencies: + '@types/node': 22.15.2 + '@inquirer/prompts@7.4.1(@types/node@22.14.1)': dependencies: '@inquirer/checkbox': 4.1.5(@types/node@22.14.1) @@ -1881,6 +2471,21 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + '@inquirer/prompts@7.5.0(@types/node@22.15.2)': + dependencies: + '@inquirer/checkbox': 4.1.5(@types/node@22.15.2) + '@inquirer/confirm': 5.1.9(@types/node@22.15.2) + '@inquirer/editor': 4.2.10(@types/node@22.15.2) + '@inquirer/expand': 4.0.12(@types/node@22.15.2) + '@inquirer/input': 4.1.9(@types/node@22.15.2) + '@inquirer/number': 3.0.12(@types/node@22.15.2) + '@inquirer/password': 4.0.12(@types/node@22.15.2) + '@inquirer/rawlist': 4.1.0(@types/node@22.15.2) + '@inquirer/search': 3.0.12(@types/node@22.15.2) + '@inquirer/select': 4.2.0(@types/node@22.15.2) + optionalDependencies: + '@types/node': 22.15.2 + '@inquirer/rawlist@4.0.12(@types/node@22.14.1)': dependencies: '@inquirer/core': 10.1.10(@types/node@22.14.1) @@ -1889,6 +2494,14 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + '@inquirer/rawlist@4.1.0(@types/node@22.15.2)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.15.2) + '@inquirer/type': 3.0.6(@types/node@22.15.2) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.2 + '@inquirer/search@3.0.12(@types/node@22.14.1)': dependencies: '@inquirer/core': 10.1.10(@types/node@22.14.1) @@ -1898,6 +2511,15 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + '@inquirer/search@3.0.12(@types/node@22.15.2)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.15.2) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@22.15.2) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.2 + '@inquirer/select@4.1.1(@types/node@22.14.1)': dependencies: '@inquirer/core': 10.1.10(@types/node@22.14.1) @@ -1908,10 +2530,24 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + '@inquirer/select@4.2.0(@types/node@22.15.2)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.15.2) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@22.15.2) + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.2 + '@inquirer/type@3.0.6(@types/node@22.14.1)': optionalDependencies: '@types/node': 22.14.1 + '@inquirer/type@3.0.6(@types/node@22.15.2)': + optionalDependencies: + '@types/node': 22.15.2 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -1958,6 +2594,23 @@ snapshots: dependencies: eventemitter3: 5.0.1 + '@kevisual/local-app-manager@0.1.16(@kevisual/router@0.0.13)(@kevisual/types@0.0.1)(@kevisual/use-config@1.0.11(dotenv@16.5.0))(pm2@5.4.3(supports-color@10.0.0))': + dependencies: + '@kevisual/router': 0.0.13 + '@kevisual/types': 0.0.1 + '@kevisual/use-config': 1.0.11(dotenv@16.5.0) + pm2: 5.4.3(supports-color@10.0.0) + + '@kevisual/query-login@0.0.5(@kevisual/query@0.0.17(@kevisual/ws@8.0.0)(encoding@0.1.13))(rollup@4.40.0)(typescript@5.8.2)': + dependencies: + '@kevisual/cache': 0.0.2(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.2) + '@kevisual/query': 0.0.17(@kevisual/ws@8.0.0)(encoding@0.1.13) + dotenv: 16.5.0 + transitivePeerDependencies: + - rollup + - tslib + - typescript + '@kevisual/query-login@0.0.5(@kevisual/query@0.0.17(encoding@0.1.13)(ws@8.18.0))(rollup@4.40.0)(typescript@5.8.2)': dependencies: '@kevisual/cache': 0.0.2(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.2) @@ -1968,6 +2621,14 @@ snapshots: - tslib - typescript + '@kevisual/query@0.0.17(@kevisual/ws@8.0.0)(encoding@0.1.13)': + dependencies: + openai: 4.88.0(@kevisual/ws@8.0.0)(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - ws + - zod + '@kevisual/query@0.0.17(encoding@0.1.13)(ws@8.18.0)': dependencies: openai: 4.88.0(encoding@0.1.13)(ws@8.18.0) @@ -1981,11 +2642,15 @@ snapshots: path-to-regexp: 8.2.0 selfsigned: 2.4.1 + '@kevisual/types@0.0.1': {} + '@kevisual/use-config@1.0.11(dotenv@16.5.0)': dependencies: '@kevisual/load': 0.0.6 dotenv: 16.5.0 + '@kevisual/ws@8.0.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2001,6 +2666,57 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@pm2/agent@2.0.4(supports-color@10.0.0)': + dependencies: + async: 3.2.6 + chalk: 3.0.0 + dayjs: 1.8.36 + debug: 4.3.7(supports-color@10.0.0) + eventemitter2: 5.0.1 + fast-json-patch: 3.1.1 + fclone: 1.0.11 + nssocket: 0.6.0 + pm2-axon: 4.0.1(supports-color@10.0.0) + pm2-axon-rpc: 0.7.1(supports-color@10.0.0) + proxy-agent: 6.3.1(supports-color@10.0.0) + semver: 7.5.4 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@pm2/io@6.0.1(supports-color@10.0.0)': + dependencies: + async: 2.6.4 + debug: 4.3.7(supports-color@10.0.0) + eventemitter2: 6.4.9 + require-in-the-middle: 5.2.0(supports-color@10.0.0) + semver: 7.5.4 + shimmer: 1.2.1 + signal-exit: 3.0.7 + tslib: 1.9.3 + transitivePeerDependencies: + - supports-color + + '@pm2/js-api@0.8.0(supports-color@10.0.0)': + dependencies: + async: 2.6.4 + debug: 4.3.7(supports-color@10.0.0) + eventemitter2: 6.4.9 + extrareqp2: 1.0.0(debug@4.3.7(supports-color@10.0.0)) + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@pm2/pm2-version-check@1.0.4(supports-color@10.0.0)': + dependencies: + debug: 4.4.0(supports-color@10.0.0) + transitivePeerDependencies: + - supports-color + '@rollup/plugin-commonjs@28.0.3(rollup@4.40.0)': dependencies: '@rollup/pluginutils': 5.1.2(rollup@4.40.0) @@ -2160,6 +2876,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.40.0': optional: true + '@tootallnate/quickjs-emscripten@0.23.0': {} + '@types/bun@1.2.10': dependencies: bun-types: 1.2.10 @@ -2173,7 +2891,13 @@ snapshots: '@types/jsonwebtoken@9.0.9': dependencies: '@types/ms': 0.7.34 - '@types/node': 22.14.1 + '@types/node': 22.15.2 + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.16 + + '@types/lodash@4.17.16': {} '@types/mime@1.3.5': {} @@ -2181,12 +2905,12 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.2 form-data: 4.0.2 '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.2 '@types/node@18.19.80': dependencies: @@ -2196,21 +2920,39 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/node@22.15.2': + dependencies: + undici-types: 6.21.0 + '@types/resolve@1.20.2': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.14.1 + '@types/node': 22.15.2 + + '@types/ws@8.18.1': + dependencies: + '@types/node': 22.15.2 abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 + agent-base@7.1.3: {} + agentkeepalive@4.6.0: dependencies: humanize-ms: 1.2.1 + amp-message@0.1.2: + dependencies: + amp: 0.3.1 + + amp@0.3.1: {} + + ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -2227,12 +2969,37 @@ snapshots: any-promise@1.3.0: {} + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + + async@2.6.4: + dependencies: + lodash: 4.17.21 + + async@3.2.6: {} + asynckit@0.4.0: {} atomic-sleep@1.0.0: {} balanced-match@1.0.2: {} + basic-ftp@5.0.5: {} + + binary-extensions@2.3.0: {} + + blessed@0.1.81: {} + + bodec@0.1.0: {} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -2243,9 +3010,11 @@ snapshots: buffer-equal-constant-time@1.0.1: {} + buffer-from@1.1.2: {} + bun-types@1.2.10: dependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.2 bundle-require@5.1.0(esbuild@0.25.0): dependencies: @@ -2259,16 +3028,39 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@5.4.1: {} chardet@0.7.0: {} + charm@0.1.2: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + chokidar@4.0.3: dependencies: readdirp: 4.1.2 chownr@3.0.0: {} + cli-tableau@2.0.1: + dependencies: + chalk: 3.0.0 + cli-width@4.1.0: {} color-convert@2.0.1: @@ -2285,12 +3077,20 @@ snapshots: commander@13.1.0: {} + commander@2.15.1: {} + commander@4.1.1: {} commondir@1.0.1: {} consola@3.4.2: {} + croner@4.1.97: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.3 + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -2299,14 +3099,42 @@ snapshots: crypto-js@4.2.0: {} + culvert@0.1.2: {} + + data-uri-to-buffer@6.0.2: {} + dateformat@4.6.3: {} - debug@4.4.0: + dayjs@1.11.13: {} + + dayjs@1.8.36: {} + + debug@3.2.7(supports-color@10.0.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 10.0.0 + + debug@4.3.7(supports-color@10.0.0): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 10.0.0 + + debug@4.4.0(supports-color@10.0.0): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 10.0.0 deepmerge@4.3.1: {} + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + delayed-stream@1.0.0: {} depd@2.0.0: {} @@ -2342,6 +3170,10 @@ snapshots: dependencies: once: 1.4.0 + enquirer@2.3.6: + dependencies: + ansi-colors: 4.1.3 + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -2387,12 +3219,34 @@ snapshots: escape-html@1.0.3: {} + escape-string-regexp@4.0.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@5.3.0: {} + estree-walker@2.0.2: {} + esutils@2.0.3: {} + etag@1.8.1: {} event-target-shim@5.0.1: {} + eventemitter2@0.4.14: {} + + eventemitter2@5.0.1: {} + + eventemitter2@6.4.9: {} + eventemitter3@5.0.1: {} external-editor@3.1.0: @@ -2401,6 +3255,12 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 + extrareqp2@1.0.0(debug@4.3.7(supports-color@10.0.0)): + dependencies: + follow-redirects: 1.15.9(debug@4.3.7(supports-color@10.0.0)) + transitivePeerDependencies: + - debug + fast-copy@3.0.2: {} fast-glob@3.3.3: @@ -2411,6 +3271,8 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-json-patch@3.1.1: {} + fast-redact@3.5.0: {} fast-safe-stringify@2.1.1: {} @@ -2419,6 +3281,8 @@ snapshots: dependencies: reusify: 1.0.4 + fclone@1.0.11: {} + fdir@6.4.0(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -2433,6 +3297,10 @@ snapshots: dependencies: to-regex-range: 5.0.1 + follow-redirects@1.15.9(debug@4.3.7(supports-color@10.0.0)): + optionalDependencies: + debug: 4.3.7(supports-color@10.0.0) + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 @@ -2477,6 +3345,20 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-uri@6.0.4(supports-color@10.0.0): + dependencies: + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.4.0(supports-color@10.0.0) + transitivePeerDependencies: + - supports-color + + git-node-fs@1.0.0(js-git@0.7.8): + optionalDependencies: + js-git: 0.7.8 + + git-sha1@0.1.2: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2492,6 +3374,8 @@ snapshots: gopd@1.2.0: {} + has-flag@4.0.0: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -2512,6 +3396,20 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@7.0.2(supports-color@10.0.0): + dependencies: + agent-base: 7.1.3 + debug: 4.4.0(supports-color@10.0.0) + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6(supports-color@10.0.0): + dependencies: + agent-base: 7.1.3 + debug: 4.4.0(supports-color@10.0.0) + transitivePeerDependencies: + - supports-color + humanize-ms@1.2.1: dependencies: ms: 2.1.3 @@ -2531,6 +3429,8 @@ snapshots: inherits@2.0.4: {} + ini@1.3.8: {} + inquirer@12.5.2(@types/node@22.14.1): dependencies: '@inquirer/core': 10.1.10(@types/node@22.14.1) @@ -2543,6 +3443,27 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + inquirer@12.6.0(@types/node@22.15.2): + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.15.2) + '@inquirer/prompts': 7.5.0(@types/node@22.15.2) + '@inquirer/type': 3.0.6(@types/node@22.15.2) + ansi-escapes: 4.3.2 + mute-stream: 2.0.0 + run-async: 3.0.0 + rxjs: 7.8.2 + optionalDependencies: + '@types/node': 22.15.2 + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -2573,9 +3494,25 @@ snapshots: joycon@3.1.1: {} + js-git@0.7.8: + dependencies: + bodec: 0.1.0 + culvert: 0.1.2 + git-sha1: 0.1.2 + pako: 0.2.9 + js-tokens@4.0.0: optional: true + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@1.1.0: {} + + json-stringify-safe@5.0.1: + optional: true + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 @@ -2600,12 +3537,16 @@ snapshots: jwa: 1.4.1 safe-buffer: 5.2.1 + lazy@1.0.11: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} load-tsconfig@0.2.5: {} + lodash-es@4.17.21: {} + lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -2622,8 +3563,16 @@ snapshots: lodash.sortby@4.7.0: {} + lodash@4.17.21: {} + lru-cache@10.4.3: {} + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lru-cache@7.18.3: {} + magic-string@0.30.11: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -2666,10 +3615,16 @@ snapshots: minipass: 7.1.2 rimraf: 5.0.10 + mkdirp@1.0.4: {} + mkdirp@3.0.1: {} + module-details-from-path@1.0.3: {} + ms@2.1.3: {} + mute-stream@0.0.8: {} + mute-stream@2.0.0: {} mz@2.7.0: @@ -2681,6 +3636,18 @@ snapshots: nanoid@3.3.9: optional: true + nanoid@5.1.5: {} + + needle@2.4.0(supports-color@10.0.0): + dependencies: + debug: 3.2.7(supports-color@10.0.0) + iconv-lite: 0.4.24 + sax: 1.4.1 + transitivePeerDependencies: + - supports-color + + netmask@2.0.2: {} + node-domexception@1.0.0: {} node-fetch@2.7.0(encoding@0.1.13): @@ -2691,6 +3658,13 @@ snapshots: node-forge@1.3.1: {} + normalize-path@3.0.0: {} + + nssocket@0.6.0: + dependencies: + eventemitter2: 0.4.14 + lazy: 1.0.11 + object-assign@4.1.1: {} on-exit-leak-free@2.1.2: {} @@ -2703,6 +3677,20 @@ snapshots: dependencies: wrappy: 1.0.2 + openai@4.88.0(@kevisual/ws@8.0.0)(encoding@0.1.13): + dependencies: + '@types/node': 18.19.80 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0(encoding@0.1.13) + optionalDependencies: + ws: '@kevisual/ws@8.0.0' + transitivePeerDependencies: + - encoding + openai@4.88.0(encoding@0.1.13)(ws@8.18.0): dependencies: '@types/node': 18.19.80 @@ -2719,8 +3707,28 @@ snapshots: os-tmpdir@1.0.2: {} + pac-proxy-agent@7.2.0(supports-color@10.0.0): + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.3 + debug: 4.4.0(supports-color@10.0.0) + get-uri: 6.0.4(supports-color@10.0.0) + http-proxy-agent: 7.0.2(supports-color@10.0.0) + https-proxy-agent: 7.0.6(supports-color@10.0.0) + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5(supports-color@10.0.0) + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + package-json-from-dist@1.0.1: {} + pako@0.2.9: {} + path-key@3.1.1: {} path-parse@1.0.7: {} @@ -2738,6 +3746,15 @@ snapshots: picomatch@4.0.2: {} + pidusage@2.0.21: + dependencies: + safe-buffer: 5.2.1 + optional: true + + pidusage@3.0.2: + dependencies: + safe-buffer: 5.2.1 + pino-abstract-transport@2.0.0: dependencies: split2: 4.2.0 @@ -2776,6 +3793,79 @@ snapshots: pirates@4.0.6: {} + pm2-axon-rpc@0.7.1(supports-color@10.0.0): + dependencies: + debug: 4.4.0(supports-color@10.0.0) + transitivePeerDependencies: + - supports-color + + pm2-axon@4.0.1(supports-color@10.0.0): + dependencies: + amp: 0.3.1 + amp-message: 0.1.2 + debug: 4.4.0(supports-color@10.0.0) + escape-string-regexp: 4.0.0 + transitivePeerDependencies: + - supports-color + + pm2-deploy@1.0.2: + dependencies: + run-series: 1.1.9 + tv4: 1.3.0 + + pm2-multimeter@0.1.2: + dependencies: + charm: 0.1.2 + + pm2-sysmonit@1.2.8(supports-color@10.0.0): + dependencies: + async: 3.2.6 + debug: 4.4.0(supports-color@10.0.0) + pidusage: 2.0.21 + systeminformation: 5.25.11 + tx2: 1.0.5 + transitivePeerDependencies: + - supports-color + optional: true + + pm2@5.4.3(supports-color@10.0.0): + dependencies: + '@pm2/agent': 2.0.4(supports-color@10.0.0) + '@pm2/io': 6.0.1(supports-color@10.0.0) + '@pm2/js-api': 0.8.0(supports-color@10.0.0) + '@pm2/pm2-version-check': 1.0.4(supports-color@10.0.0) + async: 3.2.6 + blessed: 0.1.81 + chalk: 3.0.0 + chokidar: 3.6.0 + cli-tableau: 2.0.1 + commander: 2.15.1 + croner: 4.1.97 + dayjs: 1.11.13 + debug: 4.4.0(supports-color@10.0.0) + enquirer: 2.3.6 + eventemitter2: 5.0.1 + fclone: 1.0.11 + js-yaml: 4.1.0 + mkdirp: 1.0.4 + needle: 2.4.0(supports-color@10.0.0) + pidusage: 3.0.2 + pm2-axon: 4.0.1(supports-color@10.0.0) + pm2-axon-rpc: 0.7.1(supports-color@10.0.0) + pm2-deploy: 1.0.2 + pm2-multimeter: 0.1.2 + promptly: 2.2.0 + semver: 7.6.3 + source-map-support: 0.5.21 + sprintf-js: 1.1.2 + vizion: 2.2.1 + optionalDependencies: + pm2-sysmonit: 1.2.8(supports-color@10.0.0) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + postcss-load-config@6.0.1(postcss@8.5.3): dependencies: lilconfig: 3.1.3 @@ -2791,6 +3881,25 @@ snapshots: process-warning@4.0.1: {} + promptly@2.2.0: + dependencies: + read: 1.0.7 + + proxy-agent@6.3.1(supports-color@10.0.0): + dependencies: + agent-base: 7.1.3 + debug: 4.4.0(supports-color@10.0.0) + http-proxy-agent: 7.0.2(supports-color@10.0.0) + https-proxy-agent: 7.0.6(supports-color@10.0.0) + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0(supports-color@10.0.0) + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5(supports-color@10.0.0) + transitivePeerDependencies: + - supports-color + + proxy-from-env@1.1.0: {} + pump@3.0.2: dependencies: end-of-stream: 1.4.4 @@ -2804,10 +3913,26 @@ snapshots: range-parser@1.2.1: {} + read@1.0.7: + dependencies: + mute-stream: 0.0.8 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + readdirp@4.1.2: {} real-require@0.2.0: {} + require-in-the-middle@5.2.0(supports-color@10.0.0): + dependencies: + debug: 4.4.0(supports-color@10.0.0) + module-details-from-path: 1.0.3 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + resolve-from@5.0.0: {} resolve@1.22.8: @@ -2888,6 +4013,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 + run-series@1.1.9: {} + rxjs@7.8.2: dependencies: tslib: 2.8.1 @@ -2898,6 +4025,8 @@ snapshots: safer-buffer@2.1.2: {} + sax@1.4.1: {} + secure-json-parse@2.7.0: {} selfsigned@2.4.1: @@ -2905,11 +4034,15 @@ snapshots: '@types/node-forge': 1.3.11 node-forge: 1.3.1 + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + semver@7.6.3: {} - send@1.2.0: + send@1.2.0(supports-color@10.0.0): dependencies: - debug: 4.4.0 + debug: 4.4.0(supports-color@10.0.0) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -2931,8 +4064,27 @@ snapshots: shebang-regex@3.0.0: {} + shimmer@1.2.1: {} + + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.5(supports-color@10.0.0): + dependencies: + agent-base: 7.1.3 + debug: 4.4.0(supports-color@10.0.0) + socks: 2.8.4 + transitivePeerDependencies: + - supports-color + + socks@2.8.4: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + sonic-boom@4.2.0: dependencies: atomic-sleep: 1.0.0 @@ -2940,12 +4092,23 @@ snapshots: source-map-js@1.2.1: optional: true + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 split2@4.2.0: {} + sprintf-js@1.1.2: {} + + sprintf-js@1.1.3: {} + statuses@2.0.1: {} string-width@4.2.3: @@ -2980,8 +4143,17 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 + supports-color@10.0.0: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} + systeminformation@5.25.11: + optional: true + tar@7.4.3: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -3030,6 +4202,8 @@ snapshots: ts-interface-checker@0.1.13: {} + tslib@1.9.3: {} + tslib@2.8.1: {} tsup@8.4.0(postcss@8.5.3)(typescript@5.8.2): @@ -3038,7 +4212,7 @@ snapshots: cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 - debug: 4.4.0 + debug: 4.4.0(supports-color@10.0.0) esbuild: 0.25.0 joycon: 3.1.1 picocolors: 1.1.1 @@ -3059,6 +4233,13 @@ snapshots: - tsx - yaml + tv4@1.3.0: {} + + tx2@1.0.5: + dependencies: + json-stringify-safe: 5.0.1 + optional: true + type-fest@0.21.3: {} typescript@5.8.2: {} @@ -3067,6 +4248,13 @@ snapshots: undici-types@6.21.0: {} + vizion@2.2.1: + dependencies: + async: 2.6.4 + git-node-fs: 1.0.0(js-git@0.7.8) + ini: 1.3.8 + js-git: 0.7.8 + web-streams-polyfill@4.0.0-beta.3: {} webidl-conversions@3.0.1: {} @@ -3108,9 +4296,13 @@ snapshots: wrappy@1.0.2: {} + ws@7.5.10: {} + ws@8.18.0: optional: true + yallist@4.0.0: {} + yallist@5.0.0: {} yoctocolors-cjs@2.1.2: {}