From 6867de838e1237575301563979f4c09f43af53ac Mon Sep 17 00:00:00 2001 From: xion Date: Sun, 27 Apr 2025 22:16:09 +0800 Subject: [PATCH] feat: add silky cli tools --- assistant/.gitignore | 4 +- assistant/bin/assistant.js | 0 assistant/bun-lib.config.mjs | 26 + assistant/package.json | 15 +- assistant/pnpm-lock.yaml | 3123 +++++++++++++++++ assistant/pnpm-workspace.yaml | 2 + assistant/src/command/app/index.ts | 36 + assistant/src/index.ts | 1 + assistant/src/lib.ts | 2 + .../src/module/assistant/config/index.ts | 27 +- assistant/src/module/assistant/index.ts | 1 - .../src/module/assistant/install/index.ts | 121 - assistant/src/module/index.ts | 0 assistant/src/services/app/index.ts | 125 +- assistant/src/services/init/index.ts | 17 +- assistant/task-command/mod.ts | 74 +- assistant/task-command/package.json | 5 +- assistant/tasks/{silkyai => delete}/deno.json | 0 assistant/tasks/{silkyai => delete}/deno.lock | 0 assistant/tasks/silkyai-cli/.npmrc | 2 + assistant/tasks/silkyai-cli/bin/silky.js | 4 + assistant/tasks/silkyai-cli/bun.config.mjs | 26 + assistant/tasks/silkyai-cli/package.json | 40 + .../silkyai-cli/src/command/check/index.ts | 2 + .../silkyai-cli/src/command/check/init-env.ts | 68 + .../silkyai-cli/src/command/check/init.ts | 25 + assistant/tasks/silkyai-cli/src/config.ts | 7 + assistant/tasks/silkyai-cli/src/index.ts | 19 + .../tasks/silkyai-cli/src/mdoules/talkshow.ts | 116 + assistant/tasks/silkyai-cli/src/program.ts | 24 + assistant/tasks/silkyai-cli/src/run.ts | 6 + .../silkyai-cli/src/services/init/index.ts | 12 + assistant/tasks/silkyai-cli/tsconfig.json | 14 + assistant/tasks/silkyai/talkshow.ts | 74 - assistant/tsconfig.json | 4 + bin/assistant.js | 0 package.json | 3 +- pnpm-lock.yaml | 10 +- src/command/app/front-app/index.ts | 38 +- src/module/download/install.ts | 19 +- src/module/query.ts | 9 + src/query/app-manager/query-app.ts | 17 +- 42 files changed, 3867 insertions(+), 251 deletions(-) mode change 100644 => 100755 assistant/bin/assistant.js create mode 100644 assistant/bun-lib.config.mjs create mode 100644 assistant/pnpm-lock.yaml create mode 100644 assistant/pnpm-workspace.yaml create mode 100644 assistant/src/command/app/index.ts create mode 100644 assistant/src/lib.ts delete mode 100644 assistant/src/module/assistant/install/index.ts create mode 100644 assistant/src/module/index.ts rename assistant/tasks/{silkyai => delete}/deno.json (100%) rename assistant/tasks/{silkyai => delete}/deno.lock (100%) create mode 100644 assistant/tasks/silkyai-cli/.npmrc create mode 100755 assistant/tasks/silkyai-cli/bin/silky.js create mode 100644 assistant/tasks/silkyai-cli/bun.config.mjs create mode 100644 assistant/tasks/silkyai-cli/package.json create mode 100644 assistant/tasks/silkyai-cli/src/command/check/index.ts create mode 100644 assistant/tasks/silkyai-cli/src/command/check/init-env.ts create mode 100644 assistant/tasks/silkyai-cli/src/command/check/init.ts create mode 100644 assistant/tasks/silkyai-cli/src/config.ts create mode 100644 assistant/tasks/silkyai-cli/src/index.ts create mode 100644 assistant/tasks/silkyai-cli/src/mdoules/talkshow.ts create mode 100644 assistant/tasks/silkyai-cli/src/program.ts create mode 100644 assistant/tasks/silkyai-cli/src/run.ts create mode 100644 assistant/tasks/silkyai-cli/src/services/init/index.ts create mode 100644 assistant/tasks/silkyai-cli/tsconfig.json delete mode 100644 assistant/tasks/silkyai/talkshow.ts mode change 100644 => 100755 bin/assistant.js diff --git a/assistant/.gitignore b/assistant/.gitignore index ad43321..99d1b66 100644 --- a/assistant/.gitignore +++ b/assistant/.gitignore @@ -8,4 +8,6 @@ pack-dist assistant-app .env* -!.env*example \ No newline at end of file +!.env*example + +libs \ No newline at end of file diff --git a/assistant/bin/assistant.js b/assistant/bin/assistant.js old mode 100644 new mode 100755 diff --git a/assistant/bun-lib.config.mjs b/assistant/bun-lib.config.mjs new file mode 100644 index 0000000..0f9efd1 --- /dev/null +++ b/assistant/bun-lib.config.mjs @@ -0,0 +1,26 @@ +import path from 'node:path'; +import pkg from './package.json'; +import fs from 'node:fs'; +// bun run src/index.ts -- +import { fileURLToPath } from 'node:url'; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +/** + * + * @param {string} p + * @returns + */ +export const w = (p) => path.join(__dirname, p); +await Bun.build({ + target: 'node', + format: 'esm', + entrypoints: [w('./src/lib.ts')], + outdir: w('./libs'), + naming: { + entry: 'assistant-lib.mjs', + }, + external: ['pm2'], + define: { + ENVISION_VERSION: JSON.stringify(pkg.version), + }, + env: 'ENVISION_*', +}); \ No newline at end of file diff --git a/assistant/package.json b/assistant/package.json index b7ea22a..0d19308 100644 --- a/assistant/package.json +++ b/assistant/package.json @@ -20,16 +20,27 @@ "scripts": { "dev": "bun run src/run.ts ", "dev:server": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 bun --watch src/run-server.ts", + "build:lib": "bun run bun-lib.config.mjs", + "postbuild:lib": "dts -i src/lib.ts -o assistant-lib.d.ts -d libs -t", "build": "rimraf dist && bun run bun.config.mjs" }, "bin": { "ev-assistant": "bin/assistant.js", "ev-asst": "bin/assistant.js" }, + "exports": { + ".": { + "import": "./dist/assistant.mjs" + }, + "./lib": { + "import": "./libs/assistant-lib.mjs", + "types": "./libs/assistant-lib.d.ts" + } + }, "devDependencies": { "@kevisual/ai-center": "^0.0.3", "@kevisual/load": "^0.0.6", - "@kevisual/local-app-manager": "^0.1.16", + "@kevisual/local-app-manager": "^0.1.17", "@kevisual/query": "0.0.17", "@kevisual/query-login": "0.0.5", "@kevisual/router": "^0.0.13", @@ -54,6 +65,7 @@ "pino-pretty": "^13.0.0", "send": "^1.2.0", "supports-color": "^10.0.0", + "tslib": "^2.8.1", "ws": "npm:@kevisual/ws", "zustand": "^5.0.3" }, @@ -64,6 +76,7 @@ "access": "public" }, "dependencies": { + "esbuild": "^0.25.3", "pm2": "^6.0.5" } } \ No newline at end of file diff --git a/assistant/pnpm-lock.yaml b/assistant/pnpm-lock.yaml new file mode 100644 index 0000000..a62355f --- /dev/null +++ b/assistant/pnpm-lock.yaml @@ -0,0 +1,3123 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + esbuild: + specifier: ^0.25.3 + version: 0.25.3 + pm2: + specifier: ^6.0.5 + version: 6.0.5(supports-color@10.0.0) + devDependencies: + '@kevisual/ai-center': + specifier: ^0.0.3 + version: 0.0.3 + '@kevisual/load': + specifier: ^0.0.6 + version: 0.0.6 + '@kevisual/local-app-manager': + specifier: ^0.1.17 + version: 0.1.17(@kevisual/router@0.0.13)(@kevisual/types@0.0.7)(@kevisual/use-config@1.0.11(dotenv@16.5.0))(pm2@6.0.5(supports-color@10.0.0)) + '@kevisual/query': + specifier: 0.0.17 + version: 0.0.17(@kevisual/ws@8.0.0) + '@kevisual/query-login': + specifier: 0.0.5 + version: 0.0.5(@kevisual/query@0.0.17(@kevisual/ws@8.0.0))(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.3) + '@kevisual/router': + specifier: ^0.0.13 + version: 0.0.13 + '@kevisual/task-command': + specifier: ^0.0.2 + version: 0.0.2 + '@kevisual/types': + specifier: ^0.0.7 + version: 0.0.7 + '@kevisual/use-config': + specifier: ^1.0.11 + version: 1.0.11(dotenv@16.5.0) + '@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.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 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + dotenv: + specifier: ^16.5.0 + version: 16.5.0 + get-port: + specifier: ^7.1.0 + version: 7.1.0 + inquirer: + 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 + pino-pretty: + specifier: ^13.0.0 + version: 13.0.0 + send: + specifier: ^1.2.0 + version: 1.2.0(supports-color@10.0.0) + supports-color: + specifier: ^10.0.0 + version: 10.0.0 + tslib: + specifier: ^2.8.1 + version: 2.8.1 + ws: + specifier: npm:@kevisual/ws + version: '@kevisual/ws@8.0.0' + zustand: + specifier: ^5.0.3 + version: 5.0.3 + + tasks/silkyai-cli: + dependencies: + pm2: + specifier: ^6.0.5 + version: 6.0.5(supports-color@10.0.0) + devDependencies: + '@kevisual/assistant-cli': + specifier: workspace:* + version: link:../.. + '@kevisual/task-command': + specifier: ^0.0.7 + version: 0.0.7 + 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 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + dotenv: + specifier: ^16.5.0 + version: 16.5.0 + inquirer: + 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 + +packages: + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@esbuild/aix-ppc64@0.25.3': + resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.3': + resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.3': + resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.3': + resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.3': + resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.3': + resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.3': + resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.3': + resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.3': + resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.3': + resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.3': + resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.3': + resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.3': + resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.3': + resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.3': + resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.3': + resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.3': + resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.3': + resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.3': + resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.3': + resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.3': + resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.3': + resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.3': + resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.3': + resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.3': + resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@inquirer/checkbox@4.1.5': + resolution: {integrity: sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.9': + resolution: {integrity: sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.1.10': + resolution: {integrity: sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.10': + resolution: {integrity: sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.12': + resolution: {integrity: sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.11': + resolution: {integrity: sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==} + engines: {node: '>=18'} + + '@inquirer/input@4.1.9': + resolution: {integrity: sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.12': + resolution: {integrity: sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.12': + resolution: {integrity: sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@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.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'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@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'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@kevisual/ai-center@0.0.3': + resolution: {integrity: sha512-GYY8PyOxh8G9VYkm5rBCmOabrdIdN5b5kyx15OaX0fZEi1rG5bzDTL4BTqx5KhurG01HHbXiq32BbCv4ZaSMVA==} + + '@kevisual/cache@0.0.2': + resolution: {integrity: sha512-2Cl5KF2Gi27uLfhO6CdTMFnRzx9vYnqevAo7d9ab3rOaqTgF8tLeAXglXyRbaWW3WUbHU2XaOb4r98uUsqIQQw==} + + '@kevisual/load@0.0.6': + resolution: {integrity: sha512-+3YTFehRcZ1haGel5DKYMUwmi5i6f2psyaPZlfkKU/cOXgkpwoG9/BEqPCnPjicKqqnksEpixVRkyHJ+5bjLVA==} + + '@kevisual/local-app-manager@0.1.17': + resolution: {integrity: sha512-0Ye+GwxPd9FwaICNJoG5avkScVZ9OnTtUfskFFA6UBiSJ7MT4ZBhS2dzwU4o2Yl6mV951M7rXN5Kbs08pYJWUg==} + 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: + '@kevisual/query': ^0.0.17 + + '@kevisual/query@0.0.17': + resolution: {integrity: sha512-WMvWM+3pNlPKNhoxPX9fldMp1tOeJrkRM/tXA4bvOnftIoX2yeI4v0wTpbGJXES/bLlo7OC2kV8SeKF0K6dnxQ==} + + '@kevisual/router@0.0.13': + resolution: {integrity: sha512-raji8aKXr0jigmJVOKBXb5gpstiAuyoIDy9m6SyPf4lRjCU3pspVI1bpscOUCBlaPICo6TLzPQxXhyTvvvtdWw==} + + '@kevisual/task-command@0.0.2': + resolution: {integrity: sha512-GVGcm2edTdIkiRaO8PoR8MhkHEyqq2xG3knMI6Ba+0YknzRECAzR0tgkHLGRPyIClG0J6gDzo2qaglf2s3ci5w==} + + '@kevisual/task-command@0.0.7': + resolution: {integrity: sha512-2vkKJVgjCQEeewKeCU7+U5K4mU6by2rWTDEsUrCbZ6K0fgg4QpfvrtXK1YGVNbywKIXuT95ol7QQS+gMN7hgcA==} + + '@kevisual/types@0.0.7': + resolution: {integrity: sha512-qU/vg7WilTmxbWQZ4PbYNaTDQO83KaCqoT10FbGg8FCwGG2luuEKTvCYcXfvpl7qA+AHGKcSm0JJc61s4oLCww==} + + '@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'} + + '@pm2/agent@2.1.1': + resolution: {integrity: sha512-0V9ckHWd/HSC8BgAbZSoq8KXUG81X97nSkAxmhKDhmF8vanyaoc1YXwc2KVkbWz82Rg4gjd2n9qiT3i7bdvGrQ==} + + '@pm2/io@6.1.0': + resolution: {integrity: sha512-IxHuYURa3+FQ6BKePlgChZkqABUKFYH6Bwbw7V/pWU1pP6iR1sCI26l7P9ThUEB385ruZn/tZS3CXDUF5IA1NQ==} + 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'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@16.0.1': + resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-typescript@12.1.2': + resolution: {integrity: sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0||^4.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.40.0': + resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.40.0': + resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.40.0': + resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.40.0': + resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.40.0': + resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.40.0': + resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.40.0': + resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.40.0': + resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.40.0': + resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.40.0': + resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.40.0': + resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.40.0': + resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.40.0': + resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.40.0': + resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.40.0': + resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + 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==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@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==} + + '@types/node-fetch@2.6.12': + resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@18.19.87': + resolution: {integrity: sha512-OIAAu6ypnVZHmsHCeJ+7CCSub38QNBS9uceMQeg7K5Ur0Jr+wG9wEOEvvMbhp09pxD5czIUy/jND7s7Tb6Nw7A==} + + '@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'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + 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==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + 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==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bun-types@1.2.10: + resolution: {integrity: sha512-b5ITZMnVdf3m1gMvJHG+gIfeJHiQPJak0f7925Hxu6ZN5VKA8AGy4GZ4lM+Xkn6jtWxg5S3ldWvfmXdvnkp3GQ==} + + call-bind-apply-helpers@1.0.2: + 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} + + 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'} + + 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'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@2.15.1: + resolution: {integrity: sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + 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.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + 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'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deepmerge@4.3.1: + 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'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + 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'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.3: + resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} + engines: {node: '>=18'} + hasBin: true + + 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'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + 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==} + + external-editor@3.1.0: + 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==} + + 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'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fclone@1.0.11: + resolution: {integrity: sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==} + + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-range@7.1.1: + 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 + + form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + + formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} + + get-proto@1.0.1: + 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'} + + gopd@1.2.0: + 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'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + + http-errors@2.0.0: + 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==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + 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.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + joycon@3.1.1: + 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==} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + 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.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + 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} + + 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'} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-forge@1.3.1: + 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'} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + openai@4.96.0: + resolution: {integrity: sha512-dKoW56i02Prv2XQolJ9Rl9Svqubqkzg3QpwEOBuSVZLk05Shelu7s+ErRTwFc1Bs3JZ2qBqBfVpXQiJhwOGG8A==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + os-tmpdir@1.0.2: + 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'} + + 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'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + 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==} + + pino-pretty@13.0.0: + resolution: {integrity: sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==} + hasBin: true + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.6.0: + resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} + hasBin: true + + 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@6.0.5: + resolution: {integrity: sha512-+O43WPaEiwYbm6/XSpAOO1Rtya/Uof0n7x8hJZGfwIuepesNTIVArpZh4KqFfze0cvvqZMr0maTW3ifhvmyeMQ==} + engines: {node: '>=16.0.0'} + hasBin: true + + process-warning@4.0.1: + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + + promptly@2.2.0: + resolution: {integrity: sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==} + + proxy-agent@6.4.0: + resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + range-parser@1.2.1: + 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'} + + real-require@0.2.0: + 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@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + rollup-plugin-dts@6.2.1: + resolution: {integrity: sha512-sR3CxYUl7i2CHa0O7bA45mCrgADyAQ0tVtGSqi3yvH28M+eg1+g5d7kQ9hLvEz5dorK3XVsH5L2jwHLQf72DzA==} + engines: {node: '>=16'} + peerDependencies: + rollup: ^3.29.4 || ^4 + typescript: ^4.5 || ^5.0 + + rollup@4.40.0: + resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-series@1.1.9: + resolution: {integrity: sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + 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==} + + selfsigned@2.4.1: + 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.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + 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==} + + 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'} + + split2@4.2.0: + 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'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + 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 + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tslib@1.9.3: + resolution: {integrity: sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + 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'} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + 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'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + 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 + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + + zustand@5.0.3: + resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + +snapshots: + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + optional: true + + '@babel/helper-validator-identifier@7.25.9': + optional: true + + '@esbuild/aix-ppc64@0.25.3': + optional: true + + '@esbuild/android-arm64@0.25.3': + optional: true + + '@esbuild/android-arm@0.25.3': + optional: true + + '@esbuild/android-x64@0.25.3': + optional: true + + '@esbuild/darwin-arm64@0.25.3': + optional: true + + '@esbuild/darwin-x64@0.25.3': + optional: true + + '@esbuild/freebsd-arm64@0.25.3': + optional: true + + '@esbuild/freebsd-x64@0.25.3': + optional: true + + '@esbuild/linux-arm64@0.25.3': + optional: true + + '@esbuild/linux-arm@0.25.3': + optional: true + + '@esbuild/linux-ia32@0.25.3': + optional: true + + '@esbuild/linux-loong64@0.25.3': + optional: true + + '@esbuild/linux-mips64el@0.25.3': + optional: true + + '@esbuild/linux-ppc64@0.25.3': + optional: true + + '@esbuild/linux-riscv64@0.25.3': + optional: true + + '@esbuild/linux-s390x@0.25.3': + optional: true + + '@esbuild/linux-x64@0.25.3': + optional: true + + '@esbuild/netbsd-arm64@0.25.3': + optional: true + + '@esbuild/netbsd-x64@0.25.3': + optional: true + + '@esbuild/openbsd-arm64@0.25.3': + optional: true + + '@esbuild/openbsd-x64@0.25.3': + optional: true + + '@esbuild/sunos-x64@0.25.3': + optional: true + + '@esbuild/win32-arm64@0.25.3': + optional: true + + '@esbuild/win32-ia32@0.25.3': + optional: true + + '@esbuild/win32-x64@0.25.3': + optional: true + + '@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.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.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.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.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.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.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.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.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.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.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.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.15.2)': + optionalDependencies: + '@types/node': 22.15.2 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@kevisual/ai-center@0.0.3': {} + + '@kevisual/cache@0.0.2(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.3)': + dependencies: + '@rollup/plugin-commonjs': 28.0.3(rollup@4.40.0) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.40.0) + '@rollup/plugin-typescript': 12.1.2(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.3) + idb-keyval: 6.2.1 + rollup-plugin-dts: 6.2.1(rollup@4.40.0)(typescript@5.8.3) + transitivePeerDependencies: + - rollup + - tslib + - typescript + + '@kevisual/load@0.0.6': + dependencies: + eventemitter3: 5.0.1 + + '@kevisual/local-app-manager@0.1.17(@kevisual/router@0.0.13)(@kevisual/types@0.0.7)(@kevisual/use-config@1.0.11(dotenv@16.5.0))(pm2@6.0.5(supports-color@10.0.0))': + dependencies: + '@kevisual/router': 0.0.13 + '@kevisual/types': 0.0.7 + '@kevisual/use-config': 1.0.11(dotenv@16.5.0) + pm2: 6.0.5(supports-color@10.0.0) + + '@kevisual/query-login@0.0.5(@kevisual/query@0.0.17(@kevisual/ws@8.0.0))(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.3)': + dependencies: + '@kevisual/cache': 0.0.2(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.3) + '@kevisual/query': 0.0.17(@kevisual/ws@8.0.0) + dotenv: 16.5.0 + transitivePeerDependencies: + - rollup + - tslib + - typescript + + '@kevisual/query@0.0.17(@kevisual/ws@8.0.0)': + dependencies: + openai: 4.96.0(@kevisual/ws@8.0.0) + transitivePeerDependencies: + - encoding + - ws + - zod + + '@kevisual/router@0.0.13': + dependencies: + path-to-regexp: 8.2.0 + selfsigned: 2.4.1 + + '@kevisual/task-command@0.0.2': {} + + '@kevisual/task-command@0.0.7': {} + + '@kevisual/types@0.0.7': {} + + '@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': {} + + '@pm2/agent@2.1.1(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 + pm2-axon: 4.0.1(supports-color@10.0.0) + pm2-axon-rpc: 0.7.1(supports-color@10.0.0) + proxy-agent: 6.4.0(supports-color@10.0.0) + semver: 7.5.4 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@pm2/io@6.1.0(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.4(rollup@4.40.0) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.4.4(picomatch@4.0.2) + is-reference: 1.2.1 + magic-string: 0.30.17 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.40.0 + + '@rollup/plugin-node-resolve@16.0.1(rollup@4.40.0)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.40.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 + optionalDependencies: + rollup: 4.40.0 + + '@rollup/plugin-typescript@12.1.2(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.3)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.40.0) + resolve: 1.22.10 + typescript: 5.8.3 + optionalDependencies: + rollup: 4.40.0 + tslib: 2.8.1 + + '@rollup/pluginutils@5.1.4(rollup@4.40.0)': + dependencies: + '@types/estree': 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.40.0 + + '@rollup/rollup-android-arm-eabi@4.40.0': + optional: true + + '@rollup/rollup-android-arm64@4.40.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.40.0': + optional: true + + '@rollup/rollup-darwin-x64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.40.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.40.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.40.0': + optional: true + + '@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 + + '@types/estree@1.0.7': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.16 + + '@types/lodash@4.17.16': {} + + '@types/mime@1.3.5': {} + + '@types/node-fetch@2.6.12': + dependencies: + '@types/node': 22.15.2 + form-data: 4.0.2 + + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 22.15.2 + + '@types/node@18.19.87': + dependencies: + undici-types: 5.26.5 + + '@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.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 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + 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: {} + + basic-ftp@5.0.5: {} + + binary-extensions@2.3.0: {} + + blessed@0.1.81: {} + + bodec@0.1.0: {} + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-from@1.1.2: {} + + bun-types@1.2.10: + dependencies: + '@types/node': 22.15.2 + + call-bind-apply-helpers@1.0.2: + dependencies: + 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 + + cli-tableau@2.0.1: + dependencies: + chalk: 3.0.0 + + cli-width@4.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@13.1.0: {} + + commander@2.15.1: {} + + commondir@1.0.1: {} + + croner@4.1.97: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + culvert@0.1.2: {} + + data-uri-to-buffer@6.0.2: {} + + dateformat@4.6.3: {} + + 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: {} + + dotenv@16.5.0: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + emoji-regex@8.0.0: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.4: + 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: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.3 + '@esbuild/android-arm': 0.25.3 + '@esbuild/android-arm64': 0.25.3 + '@esbuild/android-x64': 0.25.3 + '@esbuild/darwin-arm64': 0.25.3 + '@esbuild/darwin-x64': 0.25.3 + '@esbuild/freebsd-arm64': 0.25.3 + '@esbuild/freebsd-x64': 0.25.3 + '@esbuild/linux-arm': 0.25.3 + '@esbuild/linux-arm64': 0.25.3 + '@esbuild/linux-ia32': 0.25.3 + '@esbuild/linux-loong64': 0.25.3 + '@esbuild/linux-mips64el': 0.25.3 + '@esbuild/linux-ppc64': 0.25.3 + '@esbuild/linux-riscv64': 0.25.3 + '@esbuild/linux-s390x': 0.25.3 + '@esbuild/linux-x64': 0.25.3 + '@esbuild/netbsd-arm64': 0.25.3 + '@esbuild/netbsd-x64': 0.25.3 + '@esbuild/openbsd-arm64': 0.25.3 + '@esbuild/openbsd-x64': 0.25.3 + '@esbuild/sunos-x64': 0.25.3 + '@esbuild/win32-arm64': 0.25.3 + '@esbuild/win32-ia32': 0.25.3 + '@esbuild/win32-x64': 0.25.3 + + 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@5.0.1: {} + + eventemitter2@6.4.9: {} + + eventemitter3@5.0.1: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + 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-json-patch@3.1.1: {} + + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + + fclone@1.0.11: {} + + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fill-range@7.1.1: + 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) + + form-data-encoder@1.7.2: {} + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + + fresh@2.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-port@7.1.0: {} + + get-proto@1.0.1: + dependencies: + 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 + + gopd@1.2.0: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + help-me@5.0.0: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + 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 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + idb-keyval@6.2.1: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + 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.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-module@1.0.0: {} + + is-number@7.0.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.7 + + isexe@2.0.0: {} + + 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 + + lodash-es@4.17.21: {} + + lodash@4.17.21: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lru-cache@7.18.3: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + math-intrinsics@1.1.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + minimist@1.2.8: {} + + mkdirp@1.0.4: {} + + module-details-from-path@1.0.3: {} + + ms@2.1.3: {} + + mute-stream@0.0.8: {} + + mute-stream@2.0.0: {} + + 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: + dependencies: + whatwg-url: 5.0.0 + + node-forge@1.3.1: {} + + normalize-path@3.0.0: {} + + on-exit-leak-free@2.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + openai@4.96.0(@kevisual/ws@8.0.0): + dependencies: + '@types/node': 18.19.87 + '@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 + optionalDependencies: + ws: '@kevisual/ws@8.0.0' + transitivePeerDependencies: + - encoding + + 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 + + pako@0.2.9: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-to-regexp@8.2.0: {} + + picocolors@1.1.1: + optional: true + + picomatch@2.3.1: {} + + 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 + + pino-pretty@13.0.0: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pump: 3.0.2 + secure-json-parse: 2.7.0 + sonic-boom: 4.2.0 + strip-json-comments: 3.1.1 + + pino-std-serializers@7.0.0: {} + + pino@9.6.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 4.0.1 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + + 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@6.0.5(supports-color@10.0.0): + dependencies: + '@pm2/agent': 2.1.1(supports-color@10.0.0) + '@pm2/io': 6.1.0(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.7.1 + 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 + + process-warning@4.0.1: {} + + promptly@2.2.0: + dependencies: + read: 1.0.7 + + proxy-agent@6.4.0(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 + once: 1.4.0 + + quick-format-unescaped@4.0.4: {} + + range-parser@1.2.1: {} + + read@1.0.7: + dependencies: + mute-stream: 0.0.8 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + 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.10 + transitivePeerDependencies: + - supports-color + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rollup-plugin-dts@6.2.1(rollup@4.40.0)(typescript@5.8.3): + dependencies: + magic-string: 0.30.17 + rollup: 4.40.0 + typescript: 5.8.3 + optionalDependencies: + '@babel/code-frame': 7.26.2 + + rollup@4.40.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.40.0 + '@rollup/rollup-android-arm64': 4.40.0 + '@rollup/rollup-darwin-arm64': 4.40.0 + '@rollup/rollup-darwin-x64': 4.40.0 + '@rollup/rollup-freebsd-arm64': 4.40.0 + '@rollup/rollup-freebsd-x64': 4.40.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 + '@rollup/rollup-linux-arm-musleabihf': 4.40.0 + '@rollup/rollup-linux-arm64-gnu': 4.40.0 + '@rollup/rollup-linux-arm64-musl': 4.40.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-musl': 4.40.0 + '@rollup/rollup-linux-s390x-gnu': 4.40.0 + '@rollup/rollup-linux-x64-gnu': 4.40.0 + '@rollup/rollup-linux-x64-musl': 4.40.0 + '@rollup/rollup-win32-arm64-msvc': 4.40.0 + '@rollup/rollup-win32-ia32-msvc': 4.40.0 + '@rollup/rollup-win32-x64-msvc': 4.40.0 + fsevents: 2.3.3 + + run-async@3.0.0: {} + + run-series@1.1.9: {} + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.2.1: {} + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + secure-json-parse@2.7.0: {} + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.7.1: {} + + send@1.2.0(supports-color@10.0.0): + dependencies: + debug: 4.4.0(supports-color@10.0.0) + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + 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 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + split2@4.2.0: {} + + sprintf-js@1.1.2: {} + + sprintf-js@1.1.3: {} + + statuses@2.0.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + 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 + + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + tslib@1.9.3: {} + + tslib@2.8.1: {} + + 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.3: {} + + undici-types@5.26.5: {} + + 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: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + ws@7.5.10: {} + + yallist@4.0.0: {} + + yoctocolors-cjs@2.1.2: {} + + zustand@5.0.3: {} diff --git a/assistant/pnpm-workspace.yaml b/assistant/pnpm-workspace.yaml new file mode 100644 index 0000000..8075d02 --- /dev/null +++ b/assistant/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'tasks/**' \ No newline at end of file diff --git a/assistant/src/command/app/index.ts b/assistant/src/command/app/index.ts new file mode 100644 index 0000000..d3345c6 --- /dev/null +++ b/assistant/src/command/app/index.ts @@ -0,0 +1,36 @@ +import { program, Command, assistantConfig } from '@/program.ts'; +import { AppDownload } from '@/services/app/index.ts'; + +const appManagerCommand = new Command('app').description('本地的应用模块的安装和下载, 分为 app 和 web 两种类型'); +program.addCommand(appManagerCommand); + +const downloadCommand = new Command('download') + .description('下载应用') + .option('-i, --id ', '应用名称') + .option('-t, --type ', '应用类型', 'web') + .option('-r, --registry ', '应用源 https://kevisual.cn') + .action(async (options) => { + const { id, type } = options; + assistantConfig.checkMounted(); + const registry = options.registry || assistantConfig.getRegistry(); + // console.log('registry', registry); + const app = new AppDownload(assistantConfig); + if (id) { + await app.downloadApp({ id, type, registry }); + } + }); + +appManagerCommand.addCommand(downloadCommand); + +const deleteCommand = new Command('delete') + .description('删除应用') + .option('-i, --id ', '应用名称') + .option('-t, --type ', '应用类型', 'web') + .action(async (options) => { + const { id, type } = options; + const app = new AppDownload(assistantConfig); + if (id) { + await app.deleteApp({ id, type }); + } + }); +appManagerCommand.addCommand(deleteCommand); diff --git a/assistant/src/index.ts b/assistant/src/index.ts index 1db8480..4257b26 100644 --- a/assistant/src/index.ts +++ b/assistant/src/index.ts @@ -2,6 +2,7 @@ import { program, runProgram } from '@/program.ts'; import './command/config-manager/index.ts'; import './command/app-manager/index.ts'; import './command/asst-server/index.ts'; +import './command/app/index.ts'; /** * 通过命令行解析器解析参数 diff --git a/assistant/src/lib.ts b/assistant/src/lib.ts new file mode 100644 index 0000000..0623e26 --- /dev/null +++ b/assistant/src/lib.ts @@ -0,0 +1,2 @@ +export * from './module/assistant/index.ts'; +export { AssistantInit } from './services/init/index.ts'; diff --git a/assistant/src/module/assistant/config/index.ts b/assistant/src/module/assistant/config/index.ts index e8b84f8..411b89f 100644 --- a/assistant/src/module/assistant/config/index.ts +++ b/assistant/src/module/assistant/config/index.ts @@ -60,8 +60,9 @@ export const initConfig = (configRootPath: string) => { }; export type ReturnInitConfigType = ReturnType; -type AssistantConfigData = { - pageApi?: string; // https://kevisual.silkyai.cn +export type AssistantConfigData = { + pageApi?: string; // https://kevisual.cn + registry?: string; // https://kevisual.cn proxy?: ProxyInfo[]; apiProxyList?: ProxyInfo[]; description?: string; @@ -135,6 +136,10 @@ export class AssistantConfig { } return this.getConfig(); } + getRegistry() { + const config = this.getCacheAssistantConfig(); + return config?.registry || config?.pageApi; + } /** * 设置 assistant-config.json 配置 * @param config @@ -211,19 +216,23 @@ export class AssistantConfig { * pem: 证书目录 * @param configDir */ - static detectConfigDir(configDir?: string) { + static detectConfigDir(configDir?: string, deep = 3) { 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, '..'); + if (deep >= 2) { + 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, '../..'); + if (deep >= 3) { + const lastConfigPath2 = path.join(checkConfigDir, '../..', 'assistant-app'); + if (checkFileExists(lastConfigPath2)) { + return path.join(checkConfigDir, '../..'); + } } // 如果没有找到助手配置文件目录,则返回当前目录, 执行默认创建助手配置文件目录 return checkConfigDir; diff --git a/assistant/src/module/assistant/index.ts b/assistant/src/module/assistant/index.ts index b3ee912..bf8172a 100644 --- a/assistant/src/module/assistant/index.ts +++ b/assistant/src/module/assistant/index.ts @@ -1,4 +1,3 @@ -export * from './install/index.ts'; export * from './config/index.ts'; export * from './file/index.ts'; diff --git a/assistant/src/module/assistant/install/index.ts b/assistant/src/module/assistant/install/index.ts deleted file mode 100644 index 9be450b..0000000 --- a/assistant/src/module/assistant/install/index.ts +++ /dev/null @@ -1,121 +0,0 @@ -import path from 'node:path'; -import fs from 'node:fs'; -import { checkFileExists } from '../file/index.ts'; - -type DownloadTask = { - downloadPath: string; - downloadUrl: string; - user: string; - key: string; - version: string; -}; -export type Package = { - id: string; - name?: string; - version?: string; - description?: string; - title?: string; - user?: string; - key?: string; - [key: string]: any; -}; -type InstallAppOpts = { - appDir?: string; - kevisualUrl?: string; - /** - * 是否是客户端, 下载到 assistant-config的下面 - */ -}; -export const installApp = async (app: Package, opts: InstallAppOpts = {}) => { - // const _app = demoData; - const { appDir = '', kevisualUrl = 'https://kevisual.cn' } = opts; - const _app = app; - try { - let files = _app.data.files || []; - const version = _app.version; - const user = _app.user; - const key = _app.key; - - const downFiles = files.map((file: any) => { - const noVersionPath = file.path.replace(`/${version}`, ''); - return { - ...file, - downloadPath: path.join(appDir, noVersionPath), - downloadUrl: `${kevisualUrl}/${noVersionPath}`, - }; - }); - const downloadTasks: DownloadTask[] = downFiles as any; - for (const file of downloadTasks) { - const downloadPath = file.downloadPath; - const downloadUrl = file.downloadUrl; - const dir = path.dirname(downloadPath); - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }); - } - const res = await fetch(downloadUrl); - const blob = await res.blob(); - fs.writeFileSync(downloadPath, Buffer.from(await blob.arrayBuffer())); - } - let indexHtml = files.find((file: any) => file.name === 'index.html'); - if (!indexHtml) { - files.push({ - name: 'index.html', - path: `${user}/${key}/index.html`, - }); - fs.writeFileSync(path.join(appDir, `${user}/${key}/index.html`), JSON.stringify(app, null, 2)); - } - _app.data.files = files; - return { - code: 200, - data: _app, - message: 'Install app success', - }; - } catch (error) { - console.error(error); - return { - code: 500, - message: 'Install app failed', - }; - } -}; -export const checkAppDir = (appDir: string) => { - const files = fs.readdirSync(appDir); - if (files.length === 0) { - fs.rmSync(appDir, { recursive: true }); - } -}; - -type UninstallAppOpts = { - appDir?: string; -}; -export const uninstallApp = async (app: Partial, opts: UninstallAppOpts = {}) => { - const { appDir = '' } = opts; - try { - const { user, key } = app; - const keyDir = path.join(appDir, user, key); - const parentDir = path.join(appDir, user); - if (!checkFileExists(appDir) || !checkFileExists(keyDir)) { - return { - code: 200, - message: 'uninstall app success', - }; - } - try { - // 删除appDir和文件 - fs.rmSync(keyDir, { recursive: true }); - } catch (error) { - console.error(error); - } - checkAppDir(parentDir); - return { - code: 200, - message: 'Uninstall app success', - }; - } catch (error) { - console.error(error); - return { - code: 500, - message: 'Uninstall app failed', - }; - } -}; diff --git a/assistant/src/module/index.ts b/assistant/src/module/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/assistant/src/services/app/index.ts b/assistant/src/services/app/index.ts index fb3ebba..c40a72b 100644 --- a/assistant/src/services/app/index.ts +++ b/assistant/src/services/app/index.ts @@ -1 +1,124 @@ -// app downlaod +import { checkFileExists, AssistantConfig } from '@/module/assistant/index.ts'; +import path from 'path'; +import fs from 'fs'; +import inquirer from 'inquirer'; + +import { spawnSync } from 'child_process'; +export const runCommand = (command: string, args: string[]) => { + const result = spawnSync(command, args, { + stdio: 'inherit', + shell: true, + }); + if (result.error) { + console.error('Error executing command:', result.error); + throw result.error; + } + if (result.status !== 0) { + console.error('Command failed with status:', result.status); + throw new Error(`Command failed with status: ${result.status}`); + } + return result; +}; +export type appType = 'web' | 'app'; + +type DownloadAppOptions = { + /** + * 应用名称 + * @type {string} + * @example user/app + * @description 应用名称 + */ + id: string; + type?: appType; + registry?: string; + /** + * 应用名称,默认为 user/app的 app + */ + appName?: string; +}; +type DeleteAppOptions = { + /** + * 应用名称 + * @type {string} + * @example user/app + * @description 应用名称 + */ + id: string; + type?: appType; + appName?: string; +}; +export class AppDownload { + config: AssistantConfig; + constructor(config: AssistantConfig) { + this.config = config; + } + async downloadApp(opts: DownloadAppOptions) { + const { id, type = 'web' } = opts; + const configDir = this.config.configDir; + this.config?.checkMounted(); + const appsDir = this.config.configPath?.appsDir; + const pageDir = this.config.configPath?.pageDir; + if (!id) { + throw new Error('应用名称不能为空'); + } + const command = 'ev'; + const args = ['app', 'download']; + args.push('-i', id); + if (type) { + args.push('-t', type); + } + const appName = opts?.appName || id.split('/').pop(); + if (type === 'web') { + args.push('-o', pageDir); + } else if (type === 'app') { + args.push('-o', path.join(appsDir, appName)); + } else { + throw new Error('应用类型错误,只能是 web 或 app'); + } + if (opts.registry) { + args.push('-r', opts.registry); + } + return runCommand(command, args); + } + async confirm(message?: string) { + const { confirm } = await inquirer.prompt([ + { + type: 'confirm', + name: 'confirm', + message: message || '是否继续删除应用?', + default: false, + }, + ]); + return confirm; + } + async deleteApp(opts: DeleteAppOptions) { + const { id, type = 'web' } = opts; + const appName = opts?.appName || id.split('/').pop(); + this.config?.checkMounted(); + const appsDir = this.config.configPath?.appsDir; + const pageDir = this.config.configPath?.pageDir; + if (!id) { + throw new Error('应用名称不能为空'); + } + let deletePath = ''; + let isDelete = false; + if (type === 'web') { + // 直接删除路径就行 + const pagePath = path.join(pageDir, id); + deletePath = pagePath; + } else if (type === 'app') { + const appPath = path.join(appsDir, appName); + deletePath = appPath; + } + if (deletePath && checkFileExists(deletePath)) { + const confirm = await this.confirm(`是否删除 ${deletePath} 应用?`); + if (!confirm) { + console.log('取消删除应用'); + return; + } + fs.rmSync(deletePath, { recursive: true }); + isDelete = true; + console.log(`删除应用成功: ${deletePath}`); + } + } +} diff --git a/assistant/src/services/init/index.ts b/assistant/src/services/init/index.ts index 2dc22f7..0c0bf30 100644 --- a/assistant/src/services/init/index.ts +++ b/assistant/src/services/init/index.ts @@ -1,6 +1,6 @@ import fs from 'node:fs'; import path from 'node:path'; -import { checkFileExists, AssistantConfig } from '@/module/assistant/index.ts'; +import { checkFileExists, AssistantConfig, AssistantConfigData } from '@/module/assistant/index.ts'; import { chalk } from '@/module/chalk.ts'; import { HttpsPem } from '@/module/assistant/https/sign.ts'; export type AssistantInitOptions = { @@ -66,13 +66,16 @@ export class AssistantInit extends AssistantConfig { const assistantPath = this.configPath?.configPath; // 创建助手配置文件 assistant-config.json if (!checkFileExists(assistantPath, true)) { - this.setConfig({ - description: '助手配置文件', - home: '/root/center', - proxy: [], - apiProxyList: [], - }); + this.setConfig(this.getDefaultInitAssistantConfig()); console.log(chalk.green('助手配置文件assistant-config.json创建成功')); } } + protected getDefaultInitAssistantConfig() { + return { + description: '助手配置文件', + home: '/root/center', + proxy: [], + apiProxyList: [], + } as AssistantConfigData; + } } diff --git a/assistant/task-command/mod.ts b/assistant/task-command/mod.ts index 9e96501..cccc430 100644 --- a/assistant/task-command/mod.ts +++ b/assistant/task-command/mod.ts @@ -2,7 +2,7 @@ import { execSync } from 'node:child_process'; export const TaskCommandType = ['npm-install'] as const; export type TaskCommand = { - key?: string; + key?: any; /** * 任务描述 */ @@ -30,10 +30,38 @@ export type TaskCommand = { * 如果没有这个文本,表示任务没有安装 */ beforeCheck?: string; + tags?: string[]; + meta?: any; +}; +type RunTaskResult = { + code?: number; + message?: string; + data?: any; + output?: string; + task?: TaskCommand; +}; +type TaskCommandOptions = { + isDebug?: boolean; + isLog?: boolean; }; export class TasksCommand { - tasks: Map = new Map(); - constructor() {} + tasks: Map = new Map(); + isDebug: boolean = false; + isLog: boolean = false; + constructor(opts?: TaskCommandOptions) { + this.isDebug = opts?.isDebug ?? false; + this.isLog = opts?.isLog ?? false; + } + log(...args: any[]) { + if (this.isLog) { + console.log(...args); + } + } + debug(...args: any[]) { + if (this.isDebug) { + console.log(...args); + } + } addTask(task: TaskCommand, run?: boolean) { const key = task?.key || task?.description; if (!key) { @@ -45,12 +73,17 @@ export class TasksCommand { } return this; } - getTask(name: string) { + getTask(name: string | number) { return this.tasks.get(name); } - runTask(name: string) { - const task = this.getTask(name); - const end = (data?: { code: number; [key: string]: any }) => { + runTask(taskName: string | number | TaskCommand): RunTaskResult { + let task: TaskCommand | undefined; + if (typeof taskName === 'string' || typeof taskName === 'number') { + task = this.getTask(taskName); + } else if (typeof taskName === 'object') { + task = taskName; + } + const end = (data?: RunTaskResult) => { return { ...data, task, @@ -59,7 +92,8 @@ export class TasksCommand { if (!task) { return { code: 500, - message: `没有找到 ${name} 这个任务`, + message: `没有找到这个任务`, + task: task, }; } let { command, before, after, afterCheck, beforeCheck, type } = task; @@ -68,8 +102,9 @@ export class TasksCommand { } if (before) { const res = this.runCommand(before); - console.log('before', res, beforeCheck, this.checkForContainue(res, beforeCheck)); - if (!this.checkForContainue(res, beforeCheck)) { + const checkForContainue = this.checkForContainue(res, beforeCheck); + this.debug('运行前检测', { runCommandResult: res, beforeCheck, checkForContainue }); + if (!checkForContainue) { return end({ code: 200, message: `当前任务不需要执行, ${command}`, @@ -77,12 +112,14 @@ export class TasksCommand { } } const res = this.runCommand(command); - console.log('runCommand', res); + this.debug(`执行任务:${command}`, { runCommandResult: res }); if (res.code !== 200) { + this.debug('当前任务执行失败:', { runCommandResult: res }); return end(res); } let checkText = res.data || ''; if (after) { + this.debug('执行后检测是否成功:', { after }); const res = this.runCommand(after); if (res.code !== 200) { return end(res); @@ -91,10 +128,11 @@ export class TasksCommand { } if (afterCheck) { const isSuccess = checkText?.includes?.(afterCheck); + this.debug('执行后检测是否成功:', { afterCheck, checkText, isSuccess }); return end({ code: isSuccess ? 200 : 500, output: res.data, - check: afterCheck, + data: afterCheck, message: isSuccess ? `当前任务执行成功, ${command}` : `当前任务执行失败, ${command}`, }); } @@ -139,4 +177,16 @@ export class TasksCommand { }; } } + getTasksArray() { + const tasks = Array.from(this.tasks.values()); + return tasks; + } + /** + * 根据标签获取任务 + * @param tag + */ + getTasksArrayByTag(tag?: string) { + const tasks = Array.from(this.tasks.values()); + return tasks.filter((task) => !tag || task.tags?.includes(tag) || task.meta?.tags?.includes(tag) || task.key === tag); + } } diff --git a/assistant/task-command/package.json b/assistant/task-command/package.json index 70dfb74..395d574 100644 --- a/assistant/task-command/package.json +++ b/assistant/task-command/package.json @@ -1,11 +1,12 @@ { "name": "@kevisual/task-command", - "version": "0.0.2", + "version": "0.0.7", "description": "", "types": "mod.d.ts", "scripts": { "dts": "dts -i mod.ts -o mod.d.ts -d .", - "build": "bun run bun.config.mjs" + "build": "bun run bun.config.mjs", + "postbuild": "dts -i mod.ts -o mod.d.ts -d ." }, "keywords": [], "publishConfig": { diff --git a/assistant/tasks/silkyai/deno.json b/assistant/tasks/delete/deno.json similarity index 100% rename from assistant/tasks/silkyai/deno.json rename to assistant/tasks/delete/deno.json diff --git a/assistant/tasks/silkyai/deno.lock b/assistant/tasks/delete/deno.lock similarity index 100% rename from assistant/tasks/silkyai/deno.lock rename to assistant/tasks/delete/deno.lock diff --git a/assistant/tasks/silkyai-cli/.npmrc b/assistant/tasks/silkyai-cli/.npmrc new file mode 100644 index 0000000..7446745 --- /dev/null +++ b/assistant/tasks/silkyai-cli/.npmrc @@ -0,0 +1,2 @@ +//npm.xiongxiao.me/:_authToken=${ME_NPM_TOKEN} +//registry.npmjs.org/:_authToken=${NPM_TOKEN} \ No newline at end of file diff --git a/assistant/tasks/silkyai-cli/bin/silky.js b/assistant/tasks/silkyai-cli/bin/silky.js new file mode 100755 index 0000000..236ea17 --- /dev/null +++ b/assistant/tasks/silkyai-cli/bin/silky.js @@ -0,0 +1,4 @@ +#!/usr/bin/env node +import { runParser } from '../dist/silky.mjs'; + +runParser(process.argv); diff --git a/assistant/tasks/silkyai-cli/bun.config.mjs b/assistant/tasks/silkyai-cli/bun.config.mjs new file mode 100644 index 0000000..51c17d2 --- /dev/null +++ b/assistant/tasks/silkyai-cli/bun.config.mjs @@ -0,0 +1,26 @@ +import path from 'node:path'; +import pkg from './package.json'; +import fs from 'node:fs'; +// bun run src/index.ts -- +import { fileURLToPath } from 'node:url'; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +/** + * + * @param {string} p + * @returns + */ +export const w = (p) => path.join(__dirname, p); +await Bun.build({ + target: 'node', + format: 'esm', + entrypoints: [w('./src/index.ts')], + outdir: w('./dist'), + naming: { + entry: 'silky.mjs', + }, + external: ['pm2'], + define: { + ENVISION_VERSION: JSON.stringify(pkg.version), + }, + env: 'ENVISION_*', +}); diff --git a/assistant/tasks/silkyai-cli/package.json b/assistant/tasks/silkyai-cli/package.json new file mode 100644 index 0000000..9b0f1be --- /dev/null +++ b/assistant/tasks/silkyai-cli/package.json @@ -0,0 +1,40 @@ +{ + "name": "@kevisual/silky-cli", + "version": "0.0.3", + "description": "", + "main": "index.js", + "scripts": { + "dev": "bun run src/run.ts ", + "build": "bun run bun.config.mjs" + }, + "bin": { + "silky": "./bin/silky.js" + }, + "keywords": [], + "author": "abearxiong (https://www.xiongxiao.me)", + "license": "MIT", + "packageManager": "pnpm@10.9.0", + "type": "module", + "publishConfig": { + "access": "public" + }, + "files": [ + "bin", + "dist" + ], + "devDependencies": { + "@kevisual/assistant-cli": "workspace:*", + "@kevisual/task-command": "^0.0.7", + "chalk": "^5.4.1", + "commander": "^13.1.0", + "cross-env": "^7.0.3", + "dayjs": "^1.11.13", + "dotenv": "^16.5.0", + "inquirer": "^12.6.0", + "lodash-es": "^4.17.21", + "nanoid": "^5.1.5" + }, + "dependencies": { + "pm2": "^6.0.5" + } +} \ No newline at end of file diff --git a/assistant/tasks/silkyai-cli/src/command/check/index.ts b/assistant/tasks/silkyai-cli/src/command/check/index.ts new file mode 100644 index 0000000..dc20e42 --- /dev/null +++ b/assistant/tasks/silkyai-cli/src/command/check/index.ts @@ -0,0 +1,2 @@ +import './init.ts' +import './init-env.ts' \ No newline at end of file diff --git a/assistant/tasks/silkyai-cli/src/command/check/init-env.ts b/assistant/tasks/silkyai-cli/src/command/check/init-env.ts new file mode 100644 index 0000000..93c397d --- /dev/null +++ b/assistant/tasks/silkyai-cli/src/command/check/init-env.ts @@ -0,0 +1,68 @@ +import { program, Command } from '@/program.ts'; + +import { TaskKey, silkyCommand } from '@/mdoules/talkshow.ts'; + +const description = `初始化运行环境,安装 +1. @kevisual/cli +2. pm2 + +可选安装: +deno +bun + +`; +const isDev = process.env.NODE_ENV === 'development'; +const testEnv = new Command('init-env') + .description(description) + .option('-a --all') + .action((options) => { + let tag = options.all ? 'env' : 'must-env'; + silkyCommand.isDebug = isDev ?? false; + const envTask = silkyCommand.getTasksArrayByTag(tag); + + for (const value of envTask) { + try { + const res = silkyCommand.runTask(value); + if (res.code === 200) { + console.log('执行结果:', res.code, res.message); + } else { + console.log('执行结果错误:', res.task?.description, res.message); + } + } catch (error) { + console.log('error', error); + continue; + } + } + }); + +program.addCommand(testEnv); + +const appDownloadDesc = `下载安装talkshow的应用模块, +1. root/talkshow-admin +2. root/talkshow-code-center +3. root/center +`; +const appDownloadTask = new Command('init-talkshow') + .description(appDownloadDesc) + .option('-a --all', '下载所有应用模块或者只下载talkshow相关的') + .action((options) => { + // + let tag = options.all ? 'app' : 'talkshow'; + const appTask = silkyCommand.getTasksArrayByTag(tag); + silkyCommand.isDebug = true; + for (const value of appTask) { + try { + const res = silkyCommand.runTask(value); + if (res.code === 200) { + console.log('执行结果:', res.task?.description, res.code); + } else { + console.log('执行结果错误:', res.task?.description, res.message); + } + } catch (error) { + console.log('error', error); + continue; + } + } + }); + +program.addCommand(appDownloadTask); diff --git a/assistant/tasks/silkyai-cli/src/command/check/init.ts b/assistant/tasks/silkyai-cli/src/command/check/init.ts new file mode 100644 index 0000000..7993d56 --- /dev/null +++ b/assistant/tasks/silkyai-cli/src/command/check/init.ts @@ -0,0 +1,25 @@ +import { program, Command } from '@/program.ts'; +import path from 'node:path'; +import { AssistantInit } from '@/services/init/index.ts'; + +type InitCommandOptions = { + path?: string; +}; +const Init = new Command('init') + .description('初始化一个助手客户端,生成配置文件。') + .option('-p --path ', '助手路径,默认为执行命令的目录,如果助手路径不存在则创建。') + .action((opts: InitCommandOptions) => { + // 如果path参数存在,检测path是否是相对路径,如果是相对路径,则转换为绝对路径 + if (opts.path && !opts.path.startsWith('/')) { + opts.path = path.join(process.cwd(), opts.path); + } else if (opts.path) { + opts.path = path.resolve(opts.path); + } + const configDir = AssistantInit.detectConfigDir(opts.path); + const assistantInit = new AssistantInit({ + path: configDir, + }); + assistantInit.init(); + }); + +program.addCommand(Init); diff --git a/assistant/tasks/silkyai-cli/src/config.ts b/assistant/tasks/silkyai-cli/src/config.ts new file mode 100644 index 0000000..d02e0dd --- /dev/null +++ b/assistant/tasks/silkyai-cli/src/config.ts @@ -0,0 +1,7 @@ +import { AssistantConfig } from '@kevisual/assistant-cli/lib'; + +export const configDir = AssistantConfig.detectConfigDir(null, 1); +export const assistantConfig = new AssistantConfig({ + configDir, + init: false, +}); diff --git a/assistant/tasks/silkyai-cli/src/index.ts b/assistant/tasks/silkyai-cli/src/index.ts new file mode 100644 index 0000000..d2127a2 --- /dev/null +++ b/assistant/tasks/silkyai-cli/src/index.ts @@ -0,0 +1,19 @@ +import { program, runProgram } from '@/program.ts'; + +/** + * 通过命令行解析器解析参数 + * args[0] 是执行的命令, example: node + * args[1] 是执行的脚本, example: index.ts + * @param argv + */ +export const runParser = async (argv: string[]) => { + // program.parse(process.argv); + // console.log('argv', argv); + try { + program.parse(argv); + } catch (error) { + console.error('执行错误:', error.message); + } +}; + +export { runProgram }; diff --git a/assistant/tasks/silkyai-cli/src/mdoules/talkshow.ts b/assistant/tasks/silkyai-cli/src/mdoules/talkshow.ts new file mode 100644 index 0000000..8d9832e --- /dev/null +++ b/assistant/tasks/silkyai-cli/src/mdoules/talkshow.ts @@ -0,0 +1,116 @@ +import { TasksCommand } from '@kevisual/task-command/mod.ts'; +export const silkyCommand = new TasksCommand(); +export const enum TaskKey { + ev = 1, + pm2, + deno, + bun, + silkyInit, + appCenter, + appTalkshowAdmin, + appTalkshow, +} +export const init = { + description: '安装依赖', + key: TaskKey.ev, + command: 'npm install -g @kevisual/cli --registry=https://registry.npmmirror.com', + type: 'npm-install', + before: 'ev -v', + beforeCheck: '.', + tags: ['env', 'must-env'], +}; +silkyCommand.addTask(init); + +const init1 = { + description: '安装 pm2', + type: 'npm-install', + key: TaskKey.pm2, + command: 'npm install -g pm2 --registry=https://registry.npmmirror.com', + before: 'pm2 -v', + beforeCheck: '.', + tags: ['env', 'must-env'], +}; +silkyCommand.addTask(init1); + +const init2 = { + description: '安装 deno', + command: 'npm install -g deno --registry=https://registry.npmmirror.com', + key: TaskKey.deno, + type: 'npm-install', + before: 'deno -v', + beforeCheck: 'deno', + tags: ['env'], +}; +silkyCommand.addTask(init2); + +const init3 = { + description: '安装 bun', + type: 'npm-install', + key: TaskKey.bun, + command: 'npm install -g bun --registry=https://registry.npmmirror.com', + before: 'bun -v', + beforeCheck: '.', + tags: ['env'], +}; +silkyCommand.addTask(init3); + +// =========================== +// 安装talkshow的程序到本地 + +const talkInit = { + description: '初始化一个助手客户端,生成配置文件。', + key: TaskKey.silkyInit, + command: 'silky init', +}; +silkyCommand.addTask(talkInit); + +const task1 = { + description: '下载前端应用 root/center 应用', + key: TaskKey.appCenter, + command: 'asst app download -i root/center', + tags: ['app', 'root'], +}; +silkyCommand.addTask(task1); + +const task2 = { + description: '下载前端应用 root/talkshow-admin 应用', + key: TaskKey.appTalkshowAdmin, + command: 'asst app download -i root/talkshow-admin', + tags: ['app', 'talkshow'], +}; +silkyCommand.addTask(task2); + +const task3 = { + description: '安装后端应用 root/talkshow-code-center 应用', + key: TaskKey.appTalkshow, + command: 'asst app download -i root/talkshow-code-center -t app', + tags: ['app', 'talkshow'], +}; +silkyCommand.addTask(task3); + +// =========================== +const testTask = { + description: '测试', + command: 'npm i -g nodemon --registry=https://registry.npmmirror.com', + type: 'npm-install', + before: 'nodemon -v', + beforeCheck: '.', + key: 'test-task', +}; +silkyCommand.addTask(testTask); + +const runTask1 = async () => { + const tasksCommand = new TasksCommand(); + tasksCommand.addTask(init2); + const res = tasksCommand.runTask(init2.description); + console.log(res); +}; +// runTask1(); +const runTestTask = async () => { + const tasksCommand = new TasksCommand(); + tasksCommand.addTask(testTask); + const res = tasksCommand.runTask(testTask); + console.log(res); + return res; +}; +// runTestTask(); diff --git a/assistant/tasks/silkyai-cli/src/program.ts b/assistant/tasks/silkyai-cli/src/program.ts new file mode 100644 index 0000000..27b8997 --- /dev/null +++ b/assistant/tasks/silkyai-cli/src/program.ts @@ -0,0 +1,24 @@ +import { program, Command } from 'commander'; +import fs from 'fs'; +import './command/check/index.ts'; + +// 将多个子命令加入主程序中 +let version = '0.0.1'; +try { + // @ts-ignore + if (ENVISION_VERSION) version = ENVISION_VERSION; +} catch (e) {} +// @ts-ignore +program.name('silky').description('A CLI tool with silky').version(version, '-v, --version', 'output the current version'); + +export { program, Command }; + +/** + * 在命令行中运行程序 + * 当前命令参数去执行 其他的应用模块 + * @param args + */ +export const runProgram = (args: string[]) => { + const [_app, _command] = process.argv; + program.parse([_app, _command, ...args]); +}; diff --git a/assistant/tasks/silkyai-cli/src/run.ts b/assistant/tasks/silkyai-cli/src/run.ts new file mode 100644 index 0000000..9086961 --- /dev/null +++ b/assistant/tasks/silkyai-cli/src/run.ts @@ -0,0 +1,6 @@ +import { runParser } from './index.ts'; + +/** + * test run parser + */ +runParser(process.argv); diff --git a/assistant/tasks/silkyai-cli/src/services/init/index.ts b/assistant/tasks/silkyai-cli/src/services/init/index.ts new file mode 100644 index 0000000..0343892 --- /dev/null +++ b/assistant/tasks/silkyai-cli/src/services/init/index.ts @@ -0,0 +1,12 @@ +import { AssistantInit as BaseAssistantInit } from '@kevisual/assistant-cli/lib'; + +export class AssistantInit extends BaseAssistantInit { + constructor(options: { path?: string }) { + super(options); + } + protected getDefaultInitAssistantConfig() { + const config = super.getDefaultInitAssistantConfig(); + config.registry = 'https://kevisual.silkyai.cn'; + return config; + } +} diff --git a/assistant/tasks/silkyai-cli/tsconfig.json b/assistant/tasks/silkyai-cli/tsconfig.json new file mode 100644 index 0000000..75f256e --- /dev/null +++ b/assistant/tasks/silkyai-cli/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "@kevisual/types/json/backend.json", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": [ + "src/*" + ] + }, + }, + "include": [ + "src/**/*", + ], +} \ No newline at end of file diff --git a/assistant/tasks/silkyai/talkshow.ts b/assistant/tasks/silkyai/talkshow.ts deleted file mode 100644 index 2574085..0000000 --- a/assistant/tasks/silkyai/talkshow.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { TasksCommand } from 'https://esm.xiongxiao.me/@kevisual/task-command/mod.ts'; -// import { TasksCommand } from '../../task-command/mod.ts'; -const init = { - description: '安装依赖', - command: 'npm install -g @kevisual/cli --registry=https://registry.npmmirror.com', - afterCheck: 'added', -}; -const init1 = { - description: '安装 pm2', - type: 'npm-install', - command: 'npm install -g pm2 --registry=https://registry.npmmirror.com', - before: 'pm2 -v', -}; -const init2 = { - description: '安装 deno', - command: 'npm install -g deno --registry=https://registry.npmmirror.com', - type: 'npm-install', - before: 'deno -v', - beforeCheck: 'deno', -}; -const init3 = { - description: '安装 bun', - type: 'npm-install', - command: 'npm install -g bun --registry=https://registry.npmmirror.com', - beforeCheck: 'bun -v', -}; - -// =========================== -// 安装talkshow的程序到本地 -const talk = { - description: '设置默认的 base registry 地址 为 https://kevisual.silkyai.cn', - command: 'ev base -s https://kevisual.silkyai.cn', -}; -const talkInit = { - description: '初始化一个助手客户端,生成配置文件。', - command: 'asst init', -}; -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', -}; - -// =========================== - -const runTask1 = async () => { - const tasksCommand = new TasksCommand(); - tasksCommand.addTask(init2); - const res = tasksCommand.runTask(init2.description); - console.log(res); -}; -// runTask1(); -const runTestTask = async () => { - const tasksCommand = new TasksCommand(); - const task = { - description: 'test', - command: 'npm i -g rollup --registry=https://registry.npmmirror.com', - type: 'npm-install', - }; - tasksCommand.addTask(task); - const res = tasksCommand.runTask(task.description); - console.log(res); - return res; -}; -runTestTask(); diff --git a/assistant/tsconfig.json b/assistant/tsconfig.json index 75f256e..b23d0f2 100644 --- a/assistant/tsconfig.json +++ b/assistant/tsconfig.json @@ -2,6 +2,10 @@ "extends": "@kevisual/types/json/backend.json", "compilerOptions": { "baseUrl": ".", + "module": "NodeNext", + "outDir": "./libs", + "allowImportingTsExtensions": true, + "noEmit": true, "paths": { "@/*": [ "src/*" diff --git a/bin/assistant.js b/bin/assistant.js old mode 100644 new mode 100755 diff --git a/package.json b/package.json index becae0b..714ddf3 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "scripts": { "dev": "bun run src/run.ts ", "build": "rimraf dist && bun run bun.config.mjs", - "dts": "dts-bundle-generator --external-inlines=@types/jsonwebtoken src/index.ts -o dist/index.d.ts " + "dts": "dts-bundle-generator --external-inlines=@types/jsonwebtoken src/index.ts -o dist/index.d.ts ", + "build:all": "rimraf dist && bun run bun.config.mjs && bun run assistant/bun.config.mjs" }, "keywords": [ "kevisual", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08b98bf..1189677 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -92,8 +92,8 @@ importers: 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.7)(@kevisual/use-config@1.0.11(dotenv@16.5.0))(pm2@6.0.5(supports-color@10.0.0)) + specifier: ^0.1.17 + version: 0.1.17(@kevisual/router@0.0.13)(@kevisual/types@0.0.7)(@kevisual/use-config@1.0.11(dotenv@16.5.0))(pm2@6.0.5(supports-color@10.0.0)) '@kevisual/query': specifier: 0.0.17 version: 0.0.17(@kevisual/ws@8.0.0)(encoding@0.1.13) @@ -535,8 +535,8 @@ 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==} + '@kevisual/local-app-manager@0.1.17': + resolution: {integrity: sha512-0Ye+GwxPd9FwaICNJoG5avkScVZ9OnTtUfskFFA6UBiSJ7MT4ZBhS2dzwU4o2Yl6mV951M7rXN5Kbs08pYJWUg==} peerDependencies: '@kevisual/router': ^0.0.6 '@kevisual/types': ^0.0.1 @@ -2623,7 +2623,7 @@ snapshots: dependencies: eventemitter3: 5.0.1 - '@kevisual/local-app-manager@0.1.16(@kevisual/router@0.0.13)(@kevisual/types@0.0.7)(@kevisual/use-config@1.0.11(dotenv@16.5.0))(pm2@6.0.5(supports-color@10.0.0))': + '@kevisual/local-app-manager@0.1.17(@kevisual/router@0.0.13)(@kevisual/types@0.0.7)(@kevisual/use-config@1.0.11(dotenv@16.5.0))(pm2@6.0.5(supports-color@10.0.0))': dependencies: '@kevisual/router': 0.0.13 '@kevisual/types': 0.0.7 diff --git a/src/command/app/front-app/index.ts b/src/command/app/front-app/index.ts index 337506a..e3f532c 100644 --- a/src/command/app/front-app/index.ts +++ b/src/command/app/front-app/index.ts @@ -9,6 +9,9 @@ import { checkAppDir, installApp, uninstallApp } from '@/module/download/install import { fileIsExist } from '@/uitls/file.ts'; import fs from 'fs'; import { getConfig } from '@/module/get-config.ts'; +import path from 'path'; +import inquirer from 'inquirer'; +import { baseURL, getUrl } from '@/module/query.ts'; export const appCommand = new Command('app').description('app 命令').action(() => { console.log('app'); }); @@ -55,7 +58,6 @@ const downloadAppCommand = new Command('download') } else { data.id = id; } - const res = await queryApp(data); let registry = 'https://kevisual.cn'; if (options?.registry) { registry = new URL(options.registry).origin; @@ -63,6 +65,8 @@ const downloadAppCommand = new Command('download') const config = getConfig(); registry = new URL(config.baseURL).origin; } + const res = await queryApp(data, { url: getUrl(registry) }); + console.log('registry', registry, data); if (res.code === 200) { const app = res.data; let appType: 'app' | 'web' = 'web'; @@ -88,9 +92,36 @@ const downloadAppCommand = new Command('download') const uninstallAppCommand = new Command('uninstall') .alias('remove') - .description('卸载 app serve client的包') + .description('卸载 app serve client的包。 手动删除更简单。') .option('-i, --id ', 'user/key') + .option('-t, --type ', 'app,或者web, 默认为web', 'web') + .option('-p, --path ', '删除的路径, 如果存在,则优先执行,不会去判断 id 和 type 。') .action(async (options) => { + if (options.path) { + const _path = path.resolve(options.path); + try { + const checkPath = fileIsExist(_path); + if (!checkPath) { + console.error(chalk.red('path is error, 请输入正确的路径')); + } else { + const answer = await inquirer.prompt([ + { + type: 'confirm', + name: 'confirm', + message: `确定要删除 ${_path} 吗?`, + default: false, + }, + ]); + if (answer.confirm) { + fs.rmSync(_path, { recursive: true }); + console.log(chalk.green('删除成功', _path)); + } + } + } catch (e) { + console.error(chalk.red('删除失败', e)); + } + return; + } const id = options.id || ''; if (!id) { console.error(chalk.red('id is required')); @@ -102,7 +133,7 @@ const uninstallAppCommand = new Command('uninstall') data.user = user; data.key = key; } else { - console.error(chalk.red('id is required')); + console.error(chalk.red('id is required user/key')); return; } @@ -113,6 +144,7 @@ const uninstallAppCommand = new Command('uninstall') }, { appDir: '', + type: options.type, }, ); if (result.code === 200) { diff --git a/src/module/download/install.ts b/src/module/download/install.ts index 4609628..be71b8b 100644 --- a/src/module/download/install.ts +++ b/src/module/download/install.ts @@ -105,11 +105,17 @@ export const installApp = async (app: Package, opts: InstallAppOpts = {}) => { }; } }; +/** + * 检查是否为空,如果为空则删除 + * @param appDir + */ export const checkAppDir = (appDir: string) => { - const files = fs.readdirSync(appDir); - if (files.length === 0) { - fs.rmSync(appDir, { recursive: true }); - } + try { + const files = fs.readdirSync(appDir); + if (files.length === 0) { + fs.rmSync(appDir, { recursive: true }); + } + } catch (error) {} }; export const checkFileExists = (path: string) => { try { @@ -121,9 +127,10 @@ export const checkFileExists = (path: string) => { }; type UninstallAppOpts = { appDir?: string; + type?: 'app' | 'web'; }; export const uninstallApp = async (app: Partial, opts: UninstallAppOpts = {}) => { - const { appDir = '' } = opts; + const { appDir = '', type = 'web' } = opts; try { const { user, key } = app; const keyDir = path.join(appDir, user, key); @@ -140,7 +147,7 @@ export const uninstallApp = async (app: Partial, opts: UninstallAppOpts } catch (error) { console.error(error); } - checkAppDir(parentDir); + type === 'web' && checkAppDir(parentDir); return { code: 200, message: 'Uninstall app success', diff --git a/src/module/query.ts b/src/module/query.ts index 83a93b2..7f86600 100644 --- a/src/module/query.ts +++ b/src/module/query.ts @@ -45,3 +45,12 @@ export const queryLogin = new QueryLoginNode({ // console.log('onLoad'); }, }); + +/** + * + * @param url + * @returns + */ +export const getUrl = (url: string) => { + return new URL('/api/router', url).href; +}; diff --git a/src/query/app-manager/query-app.ts b/src/query/app-manager/query-app.ts index deb1c41..9160887 100644 --- a/src/query/app-manager/query-app.ts +++ b/src/query/app-manager/query-app.ts @@ -5,12 +5,15 @@ type QueryAppParams = { user?: string; key?: string; }; -export const queryApp = async (params: QueryAppParams) => { - return await query.post({ - path: 'app', - key: 'getApp', - data: { - ...params, +export const queryApp = async (params: QueryAppParams, opts?: any) => { + return await query.post( + { + path: 'app', + key: 'getApp', + data: { + ...params, + }, }, - }); + opts, + ); };