├── .github └── workflows │ └── code-review.yaml ├── .gitignore ├── README.md ├── img ├── img-config.png └── img-select.png ├── package-lock.json ├── package.json ├── src ├── commit-ui.ts ├── config.ts ├── main.ts ├── script.ts ├── updater.ts └── wizard.ts └── tsconfig.json /.github/workflows/code-review.yaml: -------------------------------------------------------------------------------- 1 | name: Code Review 2 | on: 3 | pull_request: 4 | types: [ opened, synchronize, reopened ] 5 | pull_request_review_comment: 6 | types: [ created ] 7 | 8 | jobs: 9 | review: 10 | runs-on: ubuntu-latest 11 | permissions: 12 | contents: read 13 | pull-requests: write 14 | steps: 15 | - name: Checkout code 16 | uses: actions/checkout@v4 17 | 18 | - name: Run Code Review 19 | uses: utsmannn/corivai@v5 20 | with: 21 | reviewer-api-key: ${{ secrets.REVIEWER_API_KEY }} 22 | github-token: ${{ secrets.GITHUB_TOKEN }} 23 | openai-url: https://generativelanguage.googleapis.com/v1beta/openai/ 24 | max-diff-size: 500000 25 | model-name: gemini-1.5-flash -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Node.js 2 | node_modules/ 3 | npm-debug.log 4 | yarn-debug.log 5 | yarn-error.log 6 | .pnpm-debug.log 7 | .npm 8 | *.tgz 9 | 10 | # Logs 11 | logs 12 | *.log 13 | 14 | # Environment variables 15 | .env 16 | .env.local 17 | .env.*.local 18 | 19 | # Build output 20 | dist/ 21 | build/ 22 | out/ 23 | .next/ 24 | .nuxt/ 25 | coverage/ 26 | 27 | # macOS system files 28 | .DS_Store 29 | .AppleDouble 30 | .LSOverride 31 | ._* 32 | .DocumentRevisions-V100 33 | .fseventsd 34 | .Spotlight-V100 35 | .TemporaryItems 36 | .Trashes 37 | .VolumeIcon.icns 38 | .com.apple.timemachine.donotpresent 39 | 40 | # VSCode specific files 41 | .vscode/* 42 | !.vscode/settings.json 43 | !.vscode/tasks.json 44 | !.vscode/launch.json 45 | !.vscode/extensions.json 46 | *.code-workspace 47 | 48 | # Local History for Visual Studio Code 49 | .history/ 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional REPL history 58 | .node_repl_history 59 | 60 | # Output of 'npm pack' 61 | *.tgz 62 | 63 | # Yarn Integrity file 64 | .yarn-integrity 65 | 66 | # TypeScript specific 67 | *.tsbuildinfo 68 | .tsbuildinfo 69 | *.js.map 70 | *.tsx.map 71 | *.ts.map 72 | *.d.ts.map 73 | dist/ 74 | lib/ 75 | types/ 76 | # Exclude TypeScript source files if you're compiling to JavaScript 77 | # Uncomment the following lines if you want to ignore .ts files 78 | # *.ts 79 | # *.tsx 80 | # Include specific .ts files if needed 81 | # !types/*.ts -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Commitah CLI 2 | 3 | A powerful Command Line Interface (CLI) tool that leverages AI to generate meaningful and standardized Git commit messages. Commitah analyzes your staged changes and provides contextual commit message suggestions following conventional commit standards. 4 | 5 | ## Features 6 | 7 | - 🤖 **AI-Powered Messages**: Generates commit messages by analyzing git diff using various AI providers 8 | - 🎨 **Interactive UI**: User-friendly CLI interface for selecting commit messages 9 | - ⚙️ **Multiple AI Providers**: Supports OpenAI, Gemini, DeepSeek, and Ollama 10 | - 🔧 **Configurable**: Customize message specifications and provider settings 11 | - 📝 **Conventional Commits**: Follows standardized commit message format 12 | 13 | | Commit selection v2 | 14 | | ---- | 15 | | ![alt text](img/img-select.png) | 16 | 17 | | AI Provider on configuration v2 | 18 | | ---- | 19 | | ![alt text](img/img-config.png) | 20 | 21 | ## Prerequisites 22 | 23 | - Node.js v16 or later 24 | - Git installed and available in PATH 25 | - API key from your chosen AI provider (OpenAI, Gemini, DeepSeek) or Ollama running locally 26 | 27 | ## Installation 28 | 29 | ```bash 30 | npm install --global commitah 31 | ``` 32 | 33 | ## Usage 34 | 35 | Basic usage: 36 | ```bash 37 | # Stage your changes first 38 | git add . 39 | 40 | # Generate commit message 41 | commitah 42 | ``` 43 | 44 | Available options: 45 | ```bash 46 | # Show current configuration 47 | commitah --config 48 | 49 | # Update configuration 50 | commitah --config-update 51 | 52 | # Preview commit message without committing 53 | commitah --show 54 | ``` 55 | 56 | ## Configuration 57 | 58 | Configuration is stored in `~/.commitahconfig-v2`. The tool will create a default configuration on first run.
You can update the configuration using the `--config-update` option. 59 | 60 | Example configuration: 61 | ```json 62 | { 63 | "provider": "OpenAI", 64 | "providerApiKey": "your-api-key", 65 | "providerUrl": "https://api.openai.com/v1", 66 | "messageSpec": "conventional commit", 67 | "sizeOption": 3, 68 | "model": "gpt-4-turbo-preview" 69 | } 70 | ``` 71 | 72 | ### Supported Providers 73 | 74 | - **OpenAI**: Uses GPT models 75 | - **Gemini**: Uses Google's Gemini models 76 | - **DeepSeek**: Uses DeepSeek's language models 77 | - **Ollama**: Uses locally hosted models 78 | 79 | ## Ollama Setup Instructions 80 | 81 | 1. First, install Ollama on your system following the instructions at [Ollama's official website](https://ollama.ai) 82 | 83 | 2. Pull the **recommended models**: 84 | ```bash 85 | # Pull Qwen2.5 Coder 86 | ollama pull qwen2.5-coder 87 | 88 | # Pull Dolphin 3 89 | ollama pull dolphin3 90 | 91 | # Pull Gemma 2B 92 | ollama pull gemma:2b 93 | ``` 94 | 95 | 3. Configure Commitah to use Ollama: 96 | ```bash 97 | commitah --config-update 98 | ``` 99 | Then: 100 | - Select 'Ollama' as the provider 101 | - Enter your Ollama URL (default: http://localhost:11434) 102 | - Select one of the recommended models: 103 | - qwen2.5-coder (Recommended for best code understanding) 104 | - dolphin3 (Good balance of speed and accuracy) 105 | - gemma:2b (Lightweight option) 106 | 107 | Note: Ensure Ollama is running before using Commitah with these models. 108 | 109 | ## How It Works 110 | 111 | 1. Analyzes staged changes using `git diff` 112 | 2. Sends the diff to the configured AI provider 113 | 3. Generates multiple commit message suggestions 114 | 4. Presents an interactive UI to select the preferred message 115 | 5. Creates the commit with the selected message 116 | 117 | ## Development 118 | 119 | To build from source: 120 | 121 | ```bash 122 | # Clone the repository 123 | git clone [repository-url] 124 | 125 | # Install dependencies 126 | npm install 127 | 128 | # Build the project 129 | npm run build 130 | ``` 131 | 132 | ## License 133 | 134 | ISC License 135 | 136 | ## Author 137 | 138 | Muhammad Utsman 139 | -------------------------------------------------------------------------------- /img/img-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/utsmannn/commitah/e26ab2b57b1dee9afcc1712505357b8f7994982e/img/img-config.png -------------------------------------------------------------------------------- /img/img-select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/utsmannn/commitah/e26ab2b57b1dee9afcc1712505357b8f7994982e/img/img-select.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "commitah", 3 | "version": "2.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "commitah", 9 | "version": "2.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "blessed": "^0.1.81", 13 | "chalk": "^5.4.1", 14 | "clear": "^0.1.0", 15 | "clui": "^0.3.6", 16 | "commander": "^13.1.0", 17 | "figlet": "^1.8.0", 18 | "ink": "^5.1.0", 19 | "ink-text-input": "^6.0.0", 20 | "inquirer": "^12.2.0", 21 | "node-fetch": "^3.3.2", 22 | "open": "^10.1.0", 23 | "openai": "^4.81.0", 24 | "ora": "^8.1.1", 25 | "react": "^18.3.1", 26 | "ts-node": "^10.9.2", 27 | "tsx": "^4.19.2", 28 | "typescript": "^5.7.2", 29 | "yargs": "^17.7.2", 30 | "zod": "^3.24.1", 31 | "zx": "^8.2.4" 32 | }, 33 | "bin": { 34 | "commitah": "dist/main.js" 35 | }, 36 | "devDependencies": { 37 | "@inquirer/select": "^4.0.3", 38 | "@types/blessed": "^0.1.25", 39 | "@types/chalk": "^0.4.31", 40 | "@types/clui": "^0.3.4", 41 | "@types/commander": "^2.12.0", 42 | "@types/figlet": "^1.7.0", 43 | "@types/ink": "^0.5.2", 44 | "@types/ink-text-input": "^2.0.5", 45 | "@types/inquirer": "^9.0.7", 46 | "@types/node": "^22.12.0", 47 | "@types/react": "^19.0.8", 48 | "@types/yargs": "^17.0.33", 49 | "ora": "^8.1.1", 50 | "ts-node": "^10.9.2", 51 | "typescript": "^5.7.2" 52 | } 53 | }, 54 | "node_modules/@alcalzone/ansi-tokenize": { 55 | "version": "0.1.3", 56 | "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz", 57 | "integrity": "sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==", 58 | "license": "MIT", 59 | "dependencies": { 60 | "ansi-styles": "^6.2.1", 61 | "is-fullwidth-code-point": "^4.0.0" 62 | }, 63 | "engines": { 64 | "node": ">=14.13.1" 65 | } 66 | }, 67 | "node_modules/@alcalzone/ansi-tokenize/node_modules/ansi-styles": { 68 | "version": "6.2.1", 69 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 70 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 71 | "license": "MIT", 72 | "engines": { 73 | "node": ">=12" 74 | }, 75 | "funding": { 76 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 77 | } 78 | }, 79 | "node_modules/@alcalzone/ansi-tokenize/node_modules/is-fullwidth-code-point": { 80 | "version": "4.0.0", 81 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", 82 | "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", 83 | "license": "MIT", 84 | "engines": { 85 | "node": ">=12" 86 | }, 87 | "funding": { 88 | "url": "https://github.com/sponsors/sindresorhus" 89 | } 90 | }, 91 | "node_modules/@cspotcode/source-map-support": { 92 | "version": "0.8.1", 93 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 94 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 95 | "dev": true, 96 | "license": "MIT", 97 | "dependencies": { 98 | "@jridgewell/trace-mapping": "0.3.9" 99 | }, 100 | "engines": { 101 | "node": ">=12" 102 | } 103 | }, 104 | "node_modules/@esbuild/aix-ppc64": { 105 | "version": "0.23.1", 106 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", 107 | "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", 108 | "cpu": [ 109 | "ppc64" 110 | ], 111 | "license": "MIT", 112 | "optional": true, 113 | "os": [ 114 | "aix" 115 | ], 116 | "engines": { 117 | "node": ">=18" 118 | } 119 | }, 120 | "node_modules/@esbuild/android-arm": { 121 | "version": "0.23.1", 122 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", 123 | "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", 124 | "cpu": [ 125 | "arm" 126 | ], 127 | "license": "MIT", 128 | "optional": true, 129 | "os": [ 130 | "android" 131 | ], 132 | "engines": { 133 | "node": ">=18" 134 | } 135 | }, 136 | "node_modules/@esbuild/android-arm64": { 137 | "version": "0.23.1", 138 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", 139 | "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", 140 | "cpu": [ 141 | "arm64" 142 | ], 143 | "license": "MIT", 144 | "optional": true, 145 | "os": [ 146 | "android" 147 | ], 148 | "engines": { 149 | "node": ">=18" 150 | } 151 | }, 152 | "node_modules/@esbuild/android-x64": { 153 | "version": "0.23.1", 154 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", 155 | "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", 156 | "cpu": [ 157 | "x64" 158 | ], 159 | "license": "MIT", 160 | "optional": true, 161 | "os": [ 162 | "android" 163 | ], 164 | "engines": { 165 | "node": ">=18" 166 | } 167 | }, 168 | "node_modules/@esbuild/darwin-arm64": { 169 | "version": "0.23.1", 170 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", 171 | "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", 172 | "cpu": [ 173 | "arm64" 174 | ], 175 | "license": "MIT", 176 | "optional": true, 177 | "os": [ 178 | "darwin" 179 | ], 180 | "engines": { 181 | "node": ">=18" 182 | } 183 | }, 184 | "node_modules/@esbuild/darwin-x64": { 185 | "version": "0.23.1", 186 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", 187 | "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", 188 | "cpu": [ 189 | "x64" 190 | ], 191 | "license": "MIT", 192 | "optional": true, 193 | "os": [ 194 | "darwin" 195 | ], 196 | "engines": { 197 | "node": ">=18" 198 | } 199 | }, 200 | "node_modules/@esbuild/freebsd-arm64": { 201 | "version": "0.23.1", 202 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", 203 | "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", 204 | "cpu": [ 205 | "arm64" 206 | ], 207 | "license": "MIT", 208 | "optional": true, 209 | "os": [ 210 | "freebsd" 211 | ], 212 | "engines": { 213 | "node": ">=18" 214 | } 215 | }, 216 | "node_modules/@esbuild/freebsd-x64": { 217 | "version": "0.23.1", 218 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", 219 | "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", 220 | "cpu": [ 221 | "x64" 222 | ], 223 | "license": "MIT", 224 | "optional": true, 225 | "os": [ 226 | "freebsd" 227 | ], 228 | "engines": { 229 | "node": ">=18" 230 | } 231 | }, 232 | "node_modules/@esbuild/linux-arm": { 233 | "version": "0.23.1", 234 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", 235 | "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", 236 | "cpu": [ 237 | "arm" 238 | ], 239 | "license": "MIT", 240 | "optional": true, 241 | "os": [ 242 | "linux" 243 | ], 244 | "engines": { 245 | "node": ">=18" 246 | } 247 | }, 248 | "node_modules/@esbuild/linux-arm64": { 249 | "version": "0.23.1", 250 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", 251 | "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", 252 | "cpu": [ 253 | "arm64" 254 | ], 255 | "license": "MIT", 256 | "optional": true, 257 | "os": [ 258 | "linux" 259 | ], 260 | "engines": { 261 | "node": ">=18" 262 | } 263 | }, 264 | "node_modules/@esbuild/linux-ia32": { 265 | "version": "0.23.1", 266 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", 267 | "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", 268 | "cpu": [ 269 | "ia32" 270 | ], 271 | "license": "MIT", 272 | "optional": true, 273 | "os": [ 274 | "linux" 275 | ], 276 | "engines": { 277 | "node": ">=18" 278 | } 279 | }, 280 | "node_modules/@esbuild/linux-loong64": { 281 | "version": "0.23.1", 282 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", 283 | "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", 284 | "cpu": [ 285 | "loong64" 286 | ], 287 | "license": "MIT", 288 | "optional": true, 289 | "os": [ 290 | "linux" 291 | ], 292 | "engines": { 293 | "node": ">=18" 294 | } 295 | }, 296 | "node_modules/@esbuild/linux-mips64el": { 297 | "version": "0.23.1", 298 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", 299 | "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", 300 | "cpu": [ 301 | "mips64el" 302 | ], 303 | "license": "MIT", 304 | "optional": true, 305 | "os": [ 306 | "linux" 307 | ], 308 | "engines": { 309 | "node": ">=18" 310 | } 311 | }, 312 | "node_modules/@esbuild/linux-ppc64": { 313 | "version": "0.23.1", 314 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", 315 | "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", 316 | "cpu": [ 317 | "ppc64" 318 | ], 319 | "license": "MIT", 320 | "optional": true, 321 | "os": [ 322 | "linux" 323 | ], 324 | "engines": { 325 | "node": ">=18" 326 | } 327 | }, 328 | "node_modules/@esbuild/linux-riscv64": { 329 | "version": "0.23.1", 330 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", 331 | "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", 332 | "cpu": [ 333 | "riscv64" 334 | ], 335 | "license": "MIT", 336 | "optional": true, 337 | "os": [ 338 | "linux" 339 | ], 340 | "engines": { 341 | "node": ">=18" 342 | } 343 | }, 344 | "node_modules/@esbuild/linux-s390x": { 345 | "version": "0.23.1", 346 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", 347 | "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", 348 | "cpu": [ 349 | "s390x" 350 | ], 351 | "license": "MIT", 352 | "optional": true, 353 | "os": [ 354 | "linux" 355 | ], 356 | "engines": { 357 | "node": ">=18" 358 | } 359 | }, 360 | "node_modules/@esbuild/linux-x64": { 361 | "version": "0.23.1", 362 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", 363 | "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", 364 | "cpu": [ 365 | "x64" 366 | ], 367 | "license": "MIT", 368 | "optional": true, 369 | "os": [ 370 | "linux" 371 | ], 372 | "engines": { 373 | "node": ">=18" 374 | } 375 | }, 376 | "node_modules/@esbuild/netbsd-x64": { 377 | "version": "0.23.1", 378 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", 379 | "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", 380 | "cpu": [ 381 | "x64" 382 | ], 383 | "license": "MIT", 384 | "optional": true, 385 | "os": [ 386 | "netbsd" 387 | ], 388 | "engines": { 389 | "node": ">=18" 390 | } 391 | }, 392 | "node_modules/@esbuild/openbsd-arm64": { 393 | "version": "0.23.1", 394 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", 395 | "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", 396 | "cpu": [ 397 | "arm64" 398 | ], 399 | "license": "MIT", 400 | "optional": true, 401 | "os": [ 402 | "openbsd" 403 | ], 404 | "engines": { 405 | "node": ">=18" 406 | } 407 | }, 408 | "node_modules/@esbuild/openbsd-x64": { 409 | "version": "0.23.1", 410 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", 411 | "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", 412 | "cpu": [ 413 | "x64" 414 | ], 415 | "license": "MIT", 416 | "optional": true, 417 | "os": [ 418 | "openbsd" 419 | ], 420 | "engines": { 421 | "node": ">=18" 422 | } 423 | }, 424 | "node_modules/@esbuild/sunos-x64": { 425 | "version": "0.23.1", 426 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", 427 | "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", 428 | "cpu": [ 429 | "x64" 430 | ], 431 | "license": "MIT", 432 | "optional": true, 433 | "os": [ 434 | "sunos" 435 | ], 436 | "engines": { 437 | "node": ">=18" 438 | } 439 | }, 440 | "node_modules/@esbuild/win32-arm64": { 441 | "version": "0.23.1", 442 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", 443 | "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", 444 | "cpu": [ 445 | "arm64" 446 | ], 447 | "license": "MIT", 448 | "optional": true, 449 | "os": [ 450 | "win32" 451 | ], 452 | "engines": { 453 | "node": ">=18" 454 | } 455 | }, 456 | "node_modules/@esbuild/win32-ia32": { 457 | "version": "0.23.1", 458 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", 459 | "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", 460 | "cpu": [ 461 | "ia32" 462 | ], 463 | "license": "MIT", 464 | "optional": true, 465 | "os": [ 466 | "win32" 467 | ], 468 | "engines": { 469 | "node": ">=18" 470 | } 471 | }, 472 | "node_modules/@esbuild/win32-x64": { 473 | "version": "0.23.1", 474 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", 475 | "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", 476 | "cpu": [ 477 | "x64" 478 | ], 479 | "license": "MIT", 480 | "optional": true, 481 | "os": [ 482 | "win32" 483 | ], 484 | "engines": { 485 | "node": ">=18" 486 | } 487 | }, 488 | "node_modules/@inquirer/checkbox": { 489 | "version": "4.0.3", 490 | "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.3.tgz", 491 | "integrity": "sha512-CEt9B4e8zFOGtc/LYeQx5m8nfqQeG/4oNNv0PUvXGG0mys+wR/WbJ3B4KfSQ4Fcr3AQfpiuFOi3fVvmPfvNbxw==", 492 | "license": "MIT", 493 | "dependencies": { 494 | "@inquirer/core": "^10.1.1", 495 | "@inquirer/figures": "^1.0.8", 496 | "@inquirer/type": "^3.0.1", 497 | "ansi-escapes": "^4.3.2", 498 | "yoctocolors-cjs": "^2.1.2" 499 | }, 500 | "engines": { 501 | "node": ">=18" 502 | }, 503 | "peerDependencies": { 504 | "@types/node": ">=18" 505 | } 506 | }, 507 | "node_modules/@inquirer/confirm": { 508 | "version": "5.1.0", 509 | "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.0.tgz", 510 | "integrity": "sha512-osaBbIMEqVFjTX5exoqPXs6PilWQdjaLhGtMDXMXg/yxkHXNq43GlxGyTA35lK2HpzUgDN+Cjh/2AmqCN0QJpw==", 511 | "license": "MIT", 512 | "dependencies": { 513 | "@inquirer/core": "^10.1.1", 514 | "@inquirer/type": "^3.0.1" 515 | }, 516 | "engines": { 517 | "node": ">=18" 518 | }, 519 | "peerDependencies": { 520 | "@types/node": ">=18" 521 | } 522 | }, 523 | "node_modules/@inquirer/core": { 524 | "version": "10.1.1", 525 | "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.1.tgz", 526 | "integrity": "sha512-rmZVXy9iZvO3ZStEe/ayuuwIJ23LSF13aPMlLMTQARX6lGUBDHGV8UB5i9MRrfy0+mZwt5/9bdy8llszSD3NQA==", 527 | "license": "MIT", 528 | "dependencies": { 529 | "@inquirer/figures": "^1.0.8", 530 | "@inquirer/type": "^3.0.1", 531 | "ansi-escapes": "^4.3.2", 532 | "cli-width": "^4.1.0", 533 | "mute-stream": "^2.0.0", 534 | "signal-exit": "^4.1.0", 535 | "strip-ansi": "^6.0.1", 536 | "wrap-ansi": "^6.2.0", 537 | "yoctocolors-cjs": "^2.1.2" 538 | }, 539 | "engines": { 540 | "node": ">=18" 541 | } 542 | }, 543 | "node_modules/@inquirer/editor": { 544 | "version": "4.2.0", 545 | "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.0.tgz", 546 | "integrity": "sha512-Z3LeGsD3WlItDqLxTPciZDbGtm0wrz7iJGS/uUxSiQxef33ZrBq7LhsXg30P7xrWz1kZX4iGzxxj5SKZmJ8W+w==", 547 | "license": "MIT", 548 | "dependencies": { 549 | "@inquirer/core": "^10.1.1", 550 | "@inquirer/type": "^3.0.1", 551 | "external-editor": "^3.1.0" 552 | }, 553 | "engines": { 554 | "node": ">=18" 555 | }, 556 | "peerDependencies": { 557 | "@types/node": ">=18" 558 | } 559 | }, 560 | "node_modules/@inquirer/expand": { 561 | "version": "4.0.3", 562 | "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.3.tgz", 563 | "integrity": "sha512-MDszqW4HYBpVMmAoy/FA9laLrgo899UAga0itEjsYrBthKieDZNc0e16gdn7N3cQ0DSf/6zsTBZMuDYDQU4ktg==", 564 | "license": "MIT", 565 | "dependencies": { 566 | "@inquirer/core": "^10.1.1", 567 | "@inquirer/type": "^3.0.1", 568 | "yoctocolors-cjs": "^2.1.2" 569 | }, 570 | "engines": { 571 | "node": ">=18" 572 | }, 573 | "peerDependencies": { 574 | "@types/node": ">=18" 575 | } 576 | }, 577 | "node_modules/@inquirer/figures": { 578 | "version": "1.0.8", 579 | "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", 580 | "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", 581 | "license": "MIT", 582 | "engines": { 583 | "node": ">=18" 584 | } 585 | }, 586 | "node_modules/@inquirer/input": { 587 | "version": "4.1.0", 588 | "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.0.tgz", 589 | "integrity": "sha512-16B8A9hY741yGXzd8UJ9R8su/fuuyO2e+idd7oVLYjP23wKJ6ILRIIHcnXe8/6AoYgwRS2zp4PNsW/u/iZ24yg==", 590 | "license": "MIT", 591 | "dependencies": { 592 | "@inquirer/core": "^10.1.1", 593 | "@inquirer/type": "^3.0.1" 594 | }, 595 | "engines": { 596 | "node": ">=18" 597 | }, 598 | "peerDependencies": { 599 | "@types/node": ">=18" 600 | } 601 | }, 602 | "node_modules/@inquirer/number": { 603 | "version": "3.0.3", 604 | "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.3.tgz", 605 | "integrity": "sha512-HA/W4YV+5deKCehIutfGBzNxWH1nhvUC67O4fC9ufSijn72yrYnRmzvC61dwFvlXIG1fQaYWi+cqNE9PaB9n6Q==", 606 | "license": "MIT", 607 | "dependencies": { 608 | "@inquirer/core": "^10.1.1", 609 | "@inquirer/type": "^3.0.1" 610 | }, 611 | "engines": { 612 | "node": ">=18" 613 | }, 614 | "peerDependencies": { 615 | "@types/node": ">=18" 616 | } 617 | }, 618 | "node_modules/@inquirer/password": { 619 | "version": "4.0.3", 620 | "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.3.tgz", 621 | "integrity": "sha512-3qWjk6hS0iabG9xx0U1plwQLDBc/HA/hWzLFFatADpR6XfE62LqPr9GpFXBkLU0KQUaIXZ996bNG+2yUvocH8w==", 622 | "license": "MIT", 623 | "dependencies": { 624 | "@inquirer/core": "^10.1.1", 625 | "@inquirer/type": "^3.0.1", 626 | "ansi-escapes": "^4.3.2" 627 | }, 628 | "engines": { 629 | "node": ">=18" 630 | }, 631 | "peerDependencies": { 632 | "@types/node": ">=18" 633 | } 634 | }, 635 | "node_modules/@inquirer/prompts": { 636 | "version": "7.2.0", 637 | "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.0.tgz", 638 | "integrity": "sha512-ZXYZ5oGVrb+hCzcglPeVerJ5SFwennmDOPfXq1WyeZIrPGySLbl4W6GaSsBFvu3WII36AOK5yB8RMIEEkBjf8w==", 639 | "license": "MIT", 640 | "dependencies": { 641 | "@inquirer/checkbox": "^4.0.3", 642 | "@inquirer/confirm": "^5.1.0", 643 | "@inquirer/editor": "^4.2.0", 644 | "@inquirer/expand": "^4.0.3", 645 | "@inquirer/input": "^4.1.0", 646 | "@inquirer/number": "^3.0.3", 647 | "@inquirer/password": "^4.0.3", 648 | "@inquirer/rawlist": "^4.0.3", 649 | "@inquirer/search": "^3.0.3", 650 | "@inquirer/select": "^4.0.3" 651 | }, 652 | "engines": { 653 | "node": ">=18" 654 | }, 655 | "peerDependencies": { 656 | "@types/node": ">=18" 657 | } 658 | }, 659 | "node_modules/@inquirer/rawlist": { 660 | "version": "4.0.3", 661 | "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.3.tgz", 662 | "integrity": "sha512-5MhinSzfmOiZlRoPezfbJdfVCZikZs38ja3IOoWe7H1dxL0l3Z2jAUgbBldeyhhOkELdGvPlBfQaNbeLslib1w==", 663 | "license": "MIT", 664 | "dependencies": { 665 | "@inquirer/core": "^10.1.1", 666 | "@inquirer/type": "^3.0.1", 667 | "yoctocolors-cjs": "^2.1.2" 668 | }, 669 | "engines": { 670 | "node": ">=18" 671 | }, 672 | "peerDependencies": { 673 | "@types/node": ">=18" 674 | } 675 | }, 676 | "node_modules/@inquirer/search": { 677 | "version": "3.0.3", 678 | "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.3.tgz", 679 | "integrity": "sha512-mQTCbdNolTGvGGVCJSI6afDwiSGTV+fMLPEIMDJgIV6L/s3+RYRpxt6t0DYnqMQmemnZ/Zq0vTIRwoHT1RgcTg==", 680 | "license": "MIT", 681 | "dependencies": { 682 | "@inquirer/core": "^10.1.1", 683 | "@inquirer/figures": "^1.0.8", 684 | "@inquirer/type": "^3.0.1", 685 | "yoctocolors-cjs": "^2.1.2" 686 | }, 687 | "engines": { 688 | "node": ">=18" 689 | }, 690 | "peerDependencies": { 691 | "@types/node": ">=18" 692 | } 693 | }, 694 | "node_modules/@inquirer/select": { 695 | "version": "4.0.3", 696 | "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.3.tgz", 697 | "integrity": "sha512-OZfKDtDE8+J54JYAFTUGZwvKNfC7W/gFCjDkcsO7HnTH/wljsZo9y/FJquOxMy++DY0+9l9o/MOZ8s5s1j5wmw==", 698 | "license": "MIT", 699 | "dependencies": { 700 | "@inquirer/core": "^10.1.1", 701 | "@inquirer/figures": "^1.0.8", 702 | "@inquirer/type": "^3.0.1", 703 | "ansi-escapes": "^4.3.2", 704 | "yoctocolors-cjs": "^2.1.2" 705 | }, 706 | "engines": { 707 | "node": ">=18" 708 | }, 709 | "peerDependencies": { 710 | "@types/node": ">=18" 711 | } 712 | }, 713 | "node_modules/@inquirer/type": { 714 | "version": "3.0.1", 715 | "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.1.tgz", 716 | "integrity": "sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==", 717 | "license": "MIT", 718 | "engines": { 719 | "node": ">=18" 720 | }, 721 | "peerDependencies": { 722 | "@types/node": ">=18" 723 | } 724 | }, 725 | "node_modules/@jridgewell/resolve-uri": { 726 | "version": "3.1.2", 727 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 728 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 729 | "dev": true, 730 | "license": "MIT", 731 | "engines": { 732 | "node": ">=6.0.0" 733 | } 734 | }, 735 | "node_modules/@jridgewell/sourcemap-codec": { 736 | "version": "1.5.0", 737 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 738 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 739 | "dev": true, 740 | "license": "MIT" 741 | }, 742 | "node_modules/@jridgewell/trace-mapping": { 743 | "version": "0.3.9", 744 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 745 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 746 | "dev": true, 747 | "license": "MIT", 748 | "dependencies": { 749 | "@jridgewell/resolve-uri": "^3.0.3", 750 | "@jridgewell/sourcemap-codec": "^1.4.10" 751 | } 752 | }, 753 | "node_modules/@tsconfig/node10": { 754 | "version": "1.0.11", 755 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", 756 | "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", 757 | "dev": true, 758 | "license": "MIT" 759 | }, 760 | "node_modules/@tsconfig/node12": { 761 | "version": "1.0.11", 762 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 763 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 764 | "dev": true, 765 | "license": "MIT" 766 | }, 767 | "node_modules/@tsconfig/node14": { 768 | "version": "1.0.3", 769 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 770 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 771 | "dev": true, 772 | "license": "MIT" 773 | }, 774 | "node_modules/@tsconfig/node16": { 775 | "version": "1.0.4", 776 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 777 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 778 | "dev": true, 779 | "license": "MIT" 780 | }, 781 | "node_modules/@types/blessed": { 782 | "version": "0.1.25", 783 | "resolved": "https://registry.npmjs.org/@types/blessed/-/blessed-0.1.25.tgz", 784 | "integrity": "sha512-kQsjBgtsbJLmG6CJA+Z6Nujj+tq1fcSE3UIowbDvzQI4wWmoTV7djUDhSo5lDjgwpIN0oRvks0SA5mMdKE5eFg==", 785 | "dev": true, 786 | "license": "MIT", 787 | "dependencies": { 788 | "@types/node": "*" 789 | } 790 | }, 791 | "node_modules/@types/chalk": { 792 | "version": "0.4.31", 793 | "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz", 794 | "integrity": "sha512-nF0fisEPYMIyfrFgabFimsz9Lnuu9MwkNrrlATm2E4E46afKDyeelT+8bXfw1VSc7sLBxMxRgT7PxTC2JcqN4Q==", 795 | "dev": true, 796 | "license": "MIT" 797 | }, 798 | "node_modules/@types/cli-color": { 799 | "version": "2.0.6", 800 | "resolved": "https://registry.npmjs.org/@types/cli-color/-/cli-color-2.0.6.tgz", 801 | "integrity": "sha512-uLK0/0dOYdkX8hNsezpYh1gc8eerbhf9bOKZ3e24sP67703mw9S14/yW6mSTatiaKO9v+mU/a1EVy4rOXXeZTA==", 802 | "dev": true, 803 | "license": "MIT" 804 | }, 805 | "node_modules/@types/clui": { 806 | "version": "0.3.4", 807 | "resolved": "https://registry.npmjs.org/@types/clui/-/clui-0.3.4.tgz", 808 | "integrity": "sha512-546l5CCaNQyg8OgFG84WINSW6J37/x2a+7uX650peQ7VscBKD6x4IlNn1syeK4EdixVzBpOG7H08XjmYs2MwQA==", 809 | "dev": true, 810 | "license": "MIT", 811 | "dependencies": { 812 | "@types/cli-color": "*" 813 | } 814 | }, 815 | "node_modules/@types/commander": { 816 | "version": "2.12.0", 817 | "resolved": "https://registry.npmjs.org/@types/commander/-/commander-2.12.0.tgz", 818 | "integrity": "sha512-DDmRkovH7jPjnx7HcbSnqKg2JeNANyxNZeUvB0iE+qKBLN+vzN5iSIwt+J2PFSmBuYEut4mgQvI/fTX9YQH/vw==", 819 | "dev": true, 820 | "license": "MIT", 821 | "dependencies": { 822 | "commander": "*" 823 | } 824 | }, 825 | "node_modules/@types/figlet": { 826 | "version": "1.7.0", 827 | "resolved": "https://registry.npmjs.org/@types/figlet/-/figlet-1.7.0.tgz", 828 | "integrity": "sha512-KwrT7p/8Eo3Op/HBSIwGXOsTZKYiM9NpWRBJ5sVjWP/SmlS+oxxRvJht/FNAtliJvja44N3ul1yATgohnVBV0Q==", 829 | "dev": true, 830 | "license": "MIT" 831 | }, 832 | "node_modules/@types/fs-extra": { 833 | "version": "11.0.4", 834 | "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", 835 | "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", 836 | "license": "MIT", 837 | "optional": true, 838 | "dependencies": { 839 | "@types/jsonfile": "*", 840 | "@types/node": "*" 841 | } 842 | }, 843 | "node_modules/@types/ink": { 844 | "version": "0.5.2", 845 | "resolved": "https://registry.npmjs.org/@types/ink/-/ink-0.5.2.tgz", 846 | "integrity": "sha512-yEuhWTRMXJkIWiaM58c5kuRot5HFccv9kjjgy0fBZG0+tYb+sMBaxHNPVqyZXspGGlmwDOQ1d3BsygWpWlW17w==", 847 | "dev": true, 848 | "license": "MIT", 849 | "dependencies": { 850 | "@types/node": "*", 851 | "@types/prop-types": "*" 852 | } 853 | }, 854 | "node_modules/@types/ink-text-input": { 855 | "version": "2.0.5", 856 | "resolved": "https://registry.npmjs.org/@types/ink-text-input/-/ink-text-input-2.0.5.tgz", 857 | "integrity": "sha512-dp6qIrf/VKQyiJfLSOTk7XhbAG3SkGLMrL/5QwaOpYae20+/+VFLuEgpfjpAWOITVL7uyiE9nKdQ4pk03T2F+Q==", 858 | "dev": true, 859 | "license": "MIT", 860 | "dependencies": { 861 | "@types/ink": "^0.5.2" 862 | } 863 | }, 864 | "node_modules/@types/inquirer": { 865 | "version": "9.0.7", 866 | "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz", 867 | "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==", 868 | "dev": true, 869 | "license": "MIT", 870 | "dependencies": { 871 | "@types/through": "*", 872 | "rxjs": "^7.2.0" 873 | } 874 | }, 875 | "node_modules/@types/jsonfile": { 876 | "version": "6.1.4", 877 | "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", 878 | "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", 879 | "license": "MIT", 880 | "optional": true, 881 | "dependencies": { 882 | "@types/node": "*" 883 | } 884 | }, 885 | "node_modules/@types/node": { 886 | "version": "22.12.0", 887 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", 888 | "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", 889 | "license": "MIT", 890 | "dependencies": { 891 | "undici-types": "~6.20.0" 892 | } 893 | }, 894 | "node_modules/@types/node-fetch": { 895 | "version": "2.6.12", 896 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", 897 | "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", 898 | "license": "MIT", 899 | "dependencies": { 900 | "@types/node": "*", 901 | "form-data": "^4.0.0" 902 | } 903 | }, 904 | "node_modules/@types/prop-types": { 905 | "version": "15.7.14", 906 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", 907 | "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", 908 | "dev": true, 909 | "license": "MIT" 910 | }, 911 | "node_modules/@types/react": { 912 | "version": "19.0.8", 913 | "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.8.tgz", 914 | "integrity": "sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==", 915 | "devOptional": true, 916 | "license": "MIT", 917 | "dependencies": { 918 | "csstype": "^3.0.2" 919 | } 920 | }, 921 | "node_modules/@types/through": { 922 | "version": "0.0.33", 923 | "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", 924 | "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", 925 | "dev": true, 926 | "license": "MIT", 927 | "dependencies": { 928 | "@types/node": "*" 929 | } 930 | }, 931 | "node_modules/@types/yargs": { 932 | "version": "17.0.33", 933 | "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", 934 | "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", 935 | "dev": true, 936 | "license": "MIT", 937 | "dependencies": { 938 | "@types/yargs-parser": "*" 939 | } 940 | }, 941 | "node_modules/@types/yargs-parser": { 942 | "version": "21.0.3", 943 | "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", 944 | "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", 945 | "dev": true, 946 | "license": "MIT" 947 | }, 948 | "node_modules/abort-controller": { 949 | "version": "3.0.0", 950 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 951 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 952 | "license": "MIT", 953 | "dependencies": { 954 | "event-target-shim": "^5.0.0" 955 | }, 956 | "engines": { 957 | "node": ">=6.5" 958 | } 959 | }, 960 | "node_modules/acorn": { 961 | "version": "8.14.0", 962 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 963 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 964 | "dev": true, 965 | "license": "MIT", 966 | "bin": { 967 | "acorn": "bin/acorn" 968 | }, 969 | "engines": { 970 | "node": ">=0.4.0" 971 | } 972 | }, 973 | "node_modules/acorn-walk": { 974 | "version": "8.3.4", 975 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", 976 | "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", 977 | "dev": true, 978 | "license": "MIT", 979 | "dependencies": { 980 | "acorn": "^8.11.0" 981 | }, 982 | "engines": { 983 | "node": ">=0.4.0" 984 | } 985 | }, 986 | "node_modules/agentkeepalive": { 987 | "version": "4.6.0", 988 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", 989 | "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", 990 | "license": "MIT", 991 | "dependencies": { 992 | "humanize-ms": "^1.2.1" 993 | }, 994 | "engines": { 995 | "node": ">= 8.0.0" 996 | } 997 | }, 998 | "node_modules/ansi-escapes": { 999 | "version": "4.3.2", 1000 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 1001 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 1002 | "license": "MIT", 1003 | "dependencies": { 1004 | "type-fest": "^0.21.3" 1005 | }, 1006 | "engines": { 1007 | "node": ">=8" 1008 | }, 1009 | "funding": { 1010 | "url": "https://github.com/sponsors/sindresorhus" 1011 | } 1012 | }, 1013 | "node_modules/ansi-regex": { 1014 | "version": "5.0.1", 1015 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1016 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1017 | "license": "MIT", 1018 | "engines": { 1019 | "node": ">=8" 1020 | } 1021 | }, 1022 | "node_modules/ansi-styles": { 1023 | "version": "4.3.0", 1024 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1025 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1026 | "license": "MIT", 1027 | "dependencies": { 1028 | "color-convert": "^2.0.1" 1029 | }, 1030 | "engines": { 1031 | "node": ">=8" 1032 | }, 1033 | "funding": { 1034 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1035 | } 1036 | }, 1037 | "node_modules/arg": { 1038 | "version": "4.1.3", 1039 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 1040 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 1041 | "dev": true, 1042 | "license": "MIT" 1043 | }, 1044 | "node_modules/asynckit": { 1045 | "version": "0.4.0", 1046 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 1047 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 1048 | "license": "MIT" 1049 | }, 1050 | "node_modules/auto-bind": { 1051 | "version": "5.0.1", 1052 | "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", 1053 | "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", 1054 | "license": "MIT", 1055 | "engines": { 1056 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1057 | }, 1058 | "funding": { 1059 | "url": "https://github.com/sponsors/sindresorhus" 1060 | } 1061 | }, 1062 | "node_modules/blessed": { 1063 | "version": "0.1.81", 1064 | "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", 1065 | "integrity": "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==", 1066 | "license": "MIT", 1067 | "bin": { 1068 | "blessed": "bin/tput.js" 1069 | }, 1070 | "engines": { 1071 | "node": ">= 0.8.0" 1072 | } 1073 | }, 1074 | "node_modules/bundle-name": { 1075 | "version": "4.1.0", 1076 | "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", 1077 | "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", 1078 | "license": "MIT", 1079 | "dependencies": { 1080 | "run-applescript": "^7.0.0" 1081 | }, 1082 | "engines": { 1083 | "node": ">=18" 1084 | }, 1085 | "funding": { 1086 | "url": "https://github.com/sponsors/sindresorhus" 1087 | } 1088 | }, 1089 | "node_modules/chalk": { 1090 | "version": "5.4.1", 1091 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", 1092 | "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", 1093 | "license": "MIT", 1094 | "engines": { 1095 | "node": "^12.17.0 || ^14.13 || >=16.0.0" 1096 | }, 1097 | "funding": { 1098 | "url": "https://github.com/chalk/chalk?sponsor=1" 1099 | } 1100 | }, 1101 | "node_modules/chardet": { 1102 | "version": "0.7.0", 1103 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 1104 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 1105 | "license": "MIT" 1106 | }, 1107 | "node_modules/clear": { 1108 | "version": "0.1.0", 1109 | "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz", 1110 | "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==", 1111 | "engines": { 1112 | "node": "*" 1113 | } 1114 | }, 1115 | "node_modules/cli-boxes": { 1116 | "version": "3.0.0", 1117 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", 1118 | "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", 1119 | "license": "MIT", 1120 | "engines": { 1121 | "node": ">=10" 1122 | }, 1123 | "funding": { 1124 | "url": "https://github.com/sponsors/sindresorhus" 1125 | } 1126 | }, 1127 | "node_modules/cli-color": { 1128 | "version": "0.3.2", 1129 | "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.2.tgz", 1130 | "integrity": "sha512-Ys/nDhHNRcxrS4EUI2RS/QCUE+61AMuEOj3sWDX+EIHkJWj+4XkRbOdwdxJteAJKjXYBbeFJMtfaEPd1MBF9pQ==", 1131 | "dependencies": { 1132 | "d": "~0.1.1", 1133 | "es5-ext": "~0.10.2", 1134 | "memoizee": "0.3.x", 1135 | "timers-ext": "0.1.x" 1136 | } 1137 | }, 1138 | "node_modules/cli-cursor": { 1139 | "version": "5.0.0", 1140 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", 1141 | "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", 1142 | "dev": true, 1143 | "license": "MIT", 1144 | "dependencies": { 1145 | "restore-cursor": "^5.0.0" 1146 | }, 1147 | "engines": { 1148 | "node": ">=18" 1149 | }, 1150 | "funding": { 1151 | "url": "https://github.com/sponsors/sindresorhus" 1152 | } 1153 | }, 1154 | "node_modules/cli-spinners": { 1155 | "version": "2.9.2", 1156 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", 1157 | "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", 1158 | "dev": true, 1159 | "license": "MIT", 1160 | "engines": { 1161 | "node": ">=6" 1162 | }, 1163 | "funding": { 1164 | "url": "https://github.com/sponsors/sindresorhus" 1165 | } 1166 | }, 1167 | "node_modules/cli-truncate": { 1168 | "version": "4.0.0", 1169 | "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", 1170 | "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", 1171 | "license": "MIT", 1172 | "dependencies": { 1173 | "slice-ansi": "^5.0.0", 1174 | "string-width": "^7.0.0" 1175 | }, 1176 | "engines": { 1177 | "node": ">=18" 1178 | }, 1179 | "funding": { 1180 | "url": "https://github.com/sponsors/sindresorhus" 1181 | } 1182 | }, 1183 | "node_modules/cli-truncate/node_modules/ansi-regex": { 1184 | "version": "6.1.0", 1185 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 1186 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 1187 | "license": "MIT", 1188 | "engines": { 1189 | "node": ">=12" 1190 | }, 1191 | "funding": { 1192 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1193 | } 1194 | }, 1195 | "node_modules/cli-truncate/node_modules/ansi-styles": { 1196 | "version": "6.2.1", 1197 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 1198 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 1199 | "license": "MIT", 1200 | "engines": { 1201 | "node": ">=12" 1202 | }, 1203 | "funding": { 1204 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1205 | } 1206 | }, 1207 | "node_modules/cli-truncate/node_modules/emoji-regex": { 1208 | "version": "10.4.0", 1209 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", 1210 | "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", 1211 | "license": "MIT" 1212 | }, 1213 | "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { 1214 | "version": "4.0.0", 1215 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", 1216 | "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", 1217 | "license": "MIT", 1218 | "engines": { 1219 | "node": ">=12" 1220 | }, 1221 | "funding": { 1222 | "url": "https://github.com/sponsors/sindresorhus" 1223 | } 1224 | }, 1225 | "node_modules/cli-truncate/node_modules/slice-ansi": { 1226 | "version": "5.0.0", 1227 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", 1228 | "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", 1229 | "license": "MIT", 1230 | "dependencies": { 1231 | "ansi-styles": "^6.0.0", 1232 | "is-fullwidth-code-point": "^4.0.0" 1233 | }, 1234 | "engines": { 1235 | "node": ">=12" 1236 | }, 1237 | "funding": { 1238 | "url": "https://github.com/chalk/slice-ansi?sponsor=1" 1239 | } 1240 | }, 1241 | "node_modules/cli-truncate/node_modules/string-width": { 1242 | "version": "7.2.0", 1243 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", 1244 | "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", 1245 | "license": "MIT", 1246 | "dependencies": { 1247 | "emoji-regex": "^10.3.0", 1248 | "get-east-asian-width": "^1.0.0", 1249 | "strip-ansi": "^7.1.0" 1250 | }, 1251 | "engines": { 1252 | "node": ">=18" 1253 | }, 1254 | "funding": { 1255 | "url": "https://github.com/sponsors/sindresorhus" 1256 | } 1257 | }, 1258 | "node_modules/cli-truncate/node_modules/strip-ansi": { 1259 | "version": "7.1.0", 1260 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1261 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1262 | "license": "MIT", 1263 | "dependencies": { 1264 | "ansi-regex": "^6.0.1" 1265 | }, 1266 | "engines": { 1267 | "node": ">=12" 1268 | }, 1269 | "funding": { 1270 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1271 | } 1272 | }, 1273 | "node_modules/cli-width": { 1274 | "version": "4.1.0", 1275 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", 1276 | "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", 1277 | "license": "ISC", 1278 | "engines": { 1279 | "node": ">= 12" 1280 | } 1281 | }, 1282 | "node_modules/cliui": { 1283 | "version": "8.0.1", 1284 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 1285 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 1286 | "license": "ISC", 1287 | "dependencies": { 1288 | "string-width": "^4.2.0", 1289 | "strip-ansi": "^6.0.1", 1290 | "wrap-ansi": "^7.0.0" 1291 | }, 1292 | "engines": { 1293 | "node": ">=12" 1294 | } 1295 | }, 1296 | "node_modules/cliui/node_modules/wrap-ansi": { 1297 | "version": "7.0.0", 1298 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1299 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1300 | "license": "MIT", 1301 | "dependencies": { 1302 | "ansi-styles": "^4.0.0", 1303 | "string-width": "^4.1.0", 1304 | "strip-ansi": "^6.0.0" 1305 | }, 1306 | "engines": { 1307 | "node": ">=10" 1308 | }, 1309 | "funding": { 1310 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1311 | } 1312 | }, 1313 | "node_modules/clui": { 1314 | "version": "0.3.6", 1315 | "resolved": "https://registry.npmjs.org/clui/-/clui-0.3.6.tgz", 1316 | "integrity": "sha512-Z4UbgZILlIAjkEkZiDOa2aoYjohKx7fa6DxIh6cE9A6WNWZ61iXfQc6CmdC9SKdS5nO0P0UyQ+WfoXfB65e3HQ==", 1317 | "dependencies": { 1318 | "cli-color": "0.3.2" 1319 | } 1320 | }, 1321 | "node_modules/code-excerpt": { 1322 | "version": "4.0.0", 1323 | "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", 1324 | "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", 1325 | "license": "MIT", 1326 | "dependencies": { 1327 | "convert-to-spaces": "^2.0.1" 1328 | }, 1329 | "engines": { 1330 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1331 | } 1332 | }, 1333 | "node_modules/color-convert": { 1334 | "version": "2.0.1", 1335 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1336 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1337 | "license": "MIT", 1338 | "dependencies": { 1339 | "color-name": "~1.1.4" 1340 | }, 1341 | "engines": { 1342 | "node": ">=7.0.0" 1343 | } 1344 | }, 1345 | "node_modules/color-name": { 1346 | "version": "1.1.4", 1347 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1348 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1349 | "license": "MIT" 1350 | }, 1351 | "node_modules/combined-stream": { 1352 | "version": "1.0.8", 1353 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 1354 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 1355 | "license": "MIT", 1356 | "dependencies": { 1357 | "delayed-stream": "~1.0.0" 1358 | }, 1359 | "engines": { 1360 | "node": ">= 0.8" 1361 | } 1362 | }, 1363 | "node_modules/commander": { 1364 | "version": "13.1.0", 1365 | "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", 1366 | "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", 1367 | "license": "MIT", 1368 | "engines": { 1369 | "node": ">=18" 1370 | } 1371 | }, 1372 | "node_modules/convert-to-spaces": { 1373 | "version": "2.0.1", 1374 | "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", 1375 | "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", 1376 | "license": "MIT", 1377 | "engines": { 1378 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1379 | } 1380 | }, 1381 | "node_modules/create-require": { 1382 | "version": "1.1.1", 1383 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 1384 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 1385 | "dev": true, 1386 | "license": "MIT" 1387 | }, 1388 | "node_modules/csstype": { 1389 | "version": "3.1.3", 1390 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 1391 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 1392 | "devOptional": true, 1393 | "license": "MIT" 1394 | }, 1395 | "node_modules/d": { 1396 | "version": "0.1.1", 1397 | "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", 1398 | "integrity": "sha512-0SdM9V9pd/OXJHoWmTfNPTAeD+lw6ZqHg+isPyBFuJsZLSE0Ygg1cYZ/0l6DrKQXMOqGOu1oWupMoOfoRfMZrQ==", 1399 | "license": "MIT", 1400 | "dependencies": { 1401 | "es5-ext": "~0.10.2" 1402 | } 1403 | }, 1404 | "node_modules/data-uri-to-buffer": { 1405 | "version": "4.0.1", 1406 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", 1407 | "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", 1408 | "license": "MIT", 1409 | "engines": { 1410 | "node": ">= 12" 1411 | } 1412 | }, 1413 | "node_modules/default-browser": { 1414 | "version": "5.2.1", 1415 | "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", 1416 | "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", 1417 | "license": "MIT", 1418 | "dependencies": { 1419 | "bundle-name": "^4.1.0", 1420 | "default-browser-id": "^5.0.0" 1421 | }, 1422 | "engines": { 1423 | "node": ">=18" 1424 | }, 1425 | "funding": { 1426 | "url": "https://github.com/sponsors/sindresorhus" 1427 | } 1428 | }, 1429 | "node_modules/default-browser-id": { 1430 | "version": "5.0.0", 1431 | "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", 1432 | "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", 1433 | "license": "MIT", 1434 | "engines": { 1435 | "node": ">=18" 1436 | }, 1437 | "funding": { 1438 | "url": "https://github.com/sponsors/sindresorhus" 1439 | } 1440 | }, 1441 | "node_modules/define-lazy-prop": { 1442 | "version": "3.0.0", 1443 | "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", 1444 | "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", 1445 | "license": "MIT", 1446 | "engines": { 1447 | "node": ">=12" 1448 | }, 1449 | "funding": { 1450 | "url": "https://github.com/sponsors/sindresorhus" 1451 | } 1452 | }, 1453 | "node_modules/delayed-stream": { 1454 | "version": "1.0.0", 1455 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1456 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 1457 | "license": "MIT", 1458 | "engines": { 1459 | "node": ">=0.4.0" 1460 | } 1461 | }, 1462 | "node_modules/diff": { 1463 | "version": "4.0.2", 1464 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1465 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1466 | "dev": true, 1467 | "license": "BSD-3-Clause", 1468 | "engines": { 1469 | "node": ">=0.3.1" 1470 | } 1471 | }, 1472 | "node_modules/emoji-regex": { 1473 | "version": "8.0.0", 1474 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1475 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1476 | "license": "MIT" 1477 | }, 1478 | "node_modules/environment": { 1479 | "version": "1.1.0", 1480 | "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", 1481 | "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", 1482 | "license": "MIT", 1483 | "engines": { 1484 | "node": ">=18" 1485 | }, 1486 | "funding": { 1487 | "url": "https://github.com/sponsors/sindresorhus" 1488 | } 1489 | }, 1490 | "node_modules/es-toolkit": { 1491 | "version": "1.32.0", 1492 | "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.32.0.tgz", 1493 | "integrity": "sha512-ZfSfHP1l6ubgW/B/FRtqb9bYdMvI6jizbOSfbwwJNcOQ1QE6TFsC3jpQkZ900uUPSR3t3SU5Ds7UWKnYz+uP8Q==", 1494 | "license": "MIT", 1495 | "workspaces": [ 1496 | "docs", 1497 | "benchmarks" 1498 | ] 1499 | }, 1500 | "node_modules/es5-ext": { 1501 | "version": "0.10.64", 1502 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", 1503 | "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", 1504 | "hasInstallScript": true, 1505 | "license": "ISC", 1506 | "dependencies": { 1507 | "es6-iterator": "^2.0.3", 1508 | "es6-symbol": "^3.1.3", 1509 | "esniff": "^2.0.1", 1510 | "next-tick": "^1.1.0" 1511 | }, 1512 | "engines": { 1513 | "node": ">=0.10" 1514 | } 1515 | }, 1516 | "node_modules/es6-iterator": { 1517 | "version": "2.0.3", 1518 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 1519 | "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", 1520 | "license": "MIT", 1521 | "dependencies": { 1522 | "d": "1", 1523 | "es5-ext": "^0.10.35", 1524 | "es6-symbol": "^3.1.1" 1525 | } 1526 | }, 1527 | "node_modules/es6-iterator/node_modules/d": { 1528 | "version": "1.0.2", 1529 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", 1530 | "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", 1531 | "license": "ISC", 1532 | "dependencies": { 1533 | "es5-ext": "^0.10.64", 1534 | "type": "^2.7.2" 1535 | }, 1536 | "engines": { 1537 | "node": ">=0.12" 1538 | } 1539 | }, 1540 | "node_modules/es6-symbol": { 1541 | "version": "3.1.4", 1542 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", 1543 | "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", 1544 | "license": "ISC", 1545 | "dependencies": { 1546 | "d": "^1.0.2", 1547 | "ext": "^1.7.0" 1548 | }, 1549 | "engines": { 1550 | "node": ">=0.12" 1551 | } 1552 | }, 1553 | "node_modules/es6-symbol/node_modules/d": { 1554 | "version": "1.0.2", 1555 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", 1556 | "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", 1557 | "license": "ISC", 1558 | "dependencies": { 1559 | "es5-ext": "^0.10.64", 1560 | "type": "^2.7.2" 1561 | }, 1562 | "engines": { 1563 | "node": ">=0.12" 1564 | } 1565 | }, 1566 | "node_modules/es6-weak-map": { 1567 | "version": "0.1.4", 1568 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", 1569 | "integrity": "sha512-P+N5Cd2TXeb7G59euFiM7snORspgbInS29Nbf3KNO2JQp/DyhvMCDWd58nsVAXwYJ6W3Bx7qDdy6QQ3PCJ7jKQ==", 1570 | "license": "MIT", 1571 | "dependencies": { 1572 | "d": "~0.1.1", 1573 | "es5-ext": "~0.10.6", 1574 | "es6-iterator": "~0.1.3", 1575 | "es6-symbol": "~2.0.1" 1576 | } 1577 | }, 1578 | "node_modules/es6-weak-map/node_modules/es6-iterator": { 1579 | "version": "0.1.3", 1580 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", 1581 | "integrity": "sha512-6TOmbFM6OPWkTe+bQ3ZuUkvqcWUjAnYjKUCLdbvRsAUz2Pr+fYIibwNXNkLNtIK9PPFbNMZZddaRNkyJhlGJhA==", 1582 | "license": "MIT", 1583 | "dependencies": { 1584 | "d": "~0.1.1", 1585 | "es5-ext": "~0.10.5", 1586 | "es6-symbol": "~2.0.1" 1587 | } 1588 | }, 1589 | "node_modules/es6-weak-map/node_modules/es6-symbol": { 1590 | "version": "2.0.1", 1591 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", 1592 | "integrity": "sha512-wjobO4zO8726HVU7mI2OA/B6QszqwHJuKab7gKHVx+uRfVVYGcWJkCIFxV2Madqb9/RUSrhJ/r6hPfG7FsWtow==", 1593 | "license": "MIT", 1594 | "dependencies": { 1595 | "d": "~0.1.1", 1596 | "es5-ext": "~0.10.5" 1597 | } 1598 | }, 1599 | "node_modules/esbuild": { 1600 | "version": "0.23.1", 1601 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", 1602 | "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", 1603 | "hasInstallScript": true, 1604 | "license": "MIT", 1605 | "bin": { 1606 | "esbuild": "bin/esbuild" 1607 | }, 1608 | "engines": { 1609 | "node": ">=18" 1610 | }, 1611 | "optionalDependencies": { 1612 | "@esbuild/aix-ppc64": "0.23.1", 1613 | "@esbuild/android-arm": "0.23.1", 1614 | "@esbuild/android-arm64": "0.23.1", 1615 | "@esbuild/android-x64": "0.23.1", 1616 | "@esbuild/darwin-arm64": "0.23.1", 1617 | "@esbuild/darwin-x64": "0.23.1", 1618 | "@esbuild/freebsd-arm64": "0.23.1", 1619 | "@esbuild/freebsd-x64": "0.23.1", 1620 | "@esbuild/linux-arm": "0.23.1", 1621 | "@esbuild/linux-arm64": "0.23.1", 1622 | "@esbuild/linux-ia32": "0.23.1", 1623 | "@esbuild/linux-loong64": "0.23.1", 1624 | "@esbuild/linux-mips64el": "0.23.1", 1625 | "@esbuild/linux-ppc64": "0.23.1", 1626 | "@esbuild/linux-riscv64": "0.23.1", 1627 | "@esbuild/linux-s390x": "0.23.1", 1628 | "@esbuild/linux-x64": "0.23.1", 1629 | "@esbuild/netbsd-x64": "0.23.1", 1630 | "@esbuild/openbsd-arm64": "0.23.1", 1631 | "@esbuild/openbsd-x64": "0.23.1", 1632 | "@esbuild/sunos-x64": "0.23.1", 1633 | "@esbuild/win32-arm64": "0.23.1", 1634 | "@esbuild/win32-ia32": "0.23.1", 1635 | "@esbuild/win32-x64": "0.23.1" 1636 | } 1637 | }, 1638 | "node_modules/escalade": { 1639 | "version": "3.2.0", 1640 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 1641 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 1642 | "license": "MIT", 1643 | "engines": { 1644 | "node": ">=6" 1645 | } 1646 | }, 1647 | "node_modules/escape-string-regexp": { 1648 | "version": "2.0.0", 1649 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", 1650 | "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 1651 | "license": "MIT", 1652 | "engines": { 1653 | "node": ">=8" 1654 | } 1655 | }, 1656 | "node_modules/esniff": { 1657 | "version": "2.0.1", 1658 | "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", 1659 | "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", 1660 | "license": "ISC", 1661 | "dependencies": { 1662 | "d": "^1.0.1", 1663 | "es5-ext": "^0.10.62", 1664 | "event-emitter": "^0.3.5", 1665 | "type": "^2.7.2" 1666 | }, 1667 | "engines": { 1668 | "node": ">=0.10" 1669 | } 1670 | }, 1671 | "node_modules/esniff/node_modules/d": { 1672 | "version": "1.0.2", 1673 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", 1674 | "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", 1675 | "license": "ISC", 1676 | "dependencies": { 1677 | "es5-ext": "^0.10.64", 1678 | "type": "^2.7.2" 1679 | }, 1680 | "engines": { 1681 | "node": ">=0.12" 1682 | } 1683 | }, 1684 | "node_modules/event-emitter": { 1685 | "version": "0.3.5", 1686 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 1687 | "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", 1688 | "license": "MIT", 1689 | "dependencies": { 1690 | "d": "1", 1691 | "es5-ext": "~0.10.14" 1692 | } 1693 | }, 1694 | "node_modules/event-emitter/node_modules/d": { 1695 | "version": "1.0.2", 1696 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", 1697 | "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", 1698 | "license": "ISC", 1699 | "dependencies": { 1700 | "es5-ext": "^0.10.64", 1701 | "type": "^2.7.2" 1702 | }, 1703 | "engines": { 1704 | "node": ">=0.12" 1705 | } 1706 | }, 1707 | "node_modules/event-target-shim": { 1708 | "version": "5.0.1", 1709 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 1710 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 1711 | "license": "MIT", 1712 | "engines": { 1713 | "node": ">=6" 1714 | } 1715 | }, 1716 | "node_modules/ext": { 1717 | "version": "1.7.0", 1718 | "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", 1719 | "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", 1720 | "license": "ISC", 1721 | "dependencies": { 1722 | "type": "^2.7.2" 1723 | } 1724 | }, 1725 | "node_modules/external-editor": { 1726 | "version": "3.1.0", 1727 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 1728 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 1729 | "license": "MIT", 1730 | "dependencies": { 1731 | "chardet": "^0.7.0", 1732 | "iconv-lite": "^0.4.24", 1733 | "tmp": "^0.0.33" 1734 | }, 1735 | "engines": { 1736 | "node": ">=4" 1737 | } 1738 | }, 1739 | "node_modules/fetch-blob": { 1740 | "version": "3.2.0", 1741 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", 1742 | "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", 1743 | "funding": [ 1744 | { 1745 | "type": "github", 1746 | "url": "https://github.com/sponsors/jimmywarting" 1747 | }, 1748 | { 1749 | "type": "paypal", 1750 | "url": "https://paypal.me/jimmywarting" 1751 | } 1752 | ], 1753 | "license": "MIT", 1754 | "dependencies": { 1755 | "node-domexception": "^1.0.0", 1756 | "web-streams-polyfill": "^3.0.3" 1757 | }, 1758 | "engines": { 1759 | "node": "^12.20 || >= 14.13" 1760 | } 1761 | }, 1762 | "node_modules/figlet": { 1763 | "version": "1.8.0", 1764 | "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.8.0.tgz", 1765 | "integrity": "sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw==", 1766 | "license": "MIT", 1767 | "bin": { 1768 | "figlet": "bin/index.js" 1769 | }, 1770 | "engines": { 1771 | "node": ">= 0.4.0" 1772 | } 1773 | }, 1774 | "node_modules/form-data": { 1775 | "version": "4.0.1", 1776 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", 1777 | "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", 1778 | "license": "MIT", 1779 | "dependencies": { 1780 | "asynckit": "^0.4.0", 1781 | "combined-stream": "^1.0.8", 1782 | "mime-types": "^2.1.12" 1783 | }, 1784 | "engines": { 1785 | "node": ">= 6" 1786 | } 1787 | }, 1788 | "node_modules/form-data-encoder": { 1789 | "version": "1.7.2", 1790 | "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", 1791 | "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", 1792 | "license": "MIT" 1793 | }, 1794 | "node_modules/formdata-node": { 1795 | "version": "4.4.1", 1796 | "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", 1797 | "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", 1798 | "license": "MIT", 1799 | "dependencies": { 1800 | "node-domexception": "1.0.0", 1801 | "web-streams-polyfill": "4.0.0-beta.3" 1802 | }, 1803 | "engines": { 1804 | "node": ">= 12.20" 1805 | } 1806 | }, 1807 | "node_modules/formdata-node/node_modules/web-streams-polyfill": { 1808 | "version": "4.0.0-beta.3", 1809 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", 1810 | "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", 1811 | "license": "MIT", 1812 | "engines": { 1813 | "node": ">= 14" 1814 | } 1815 | }, 1816 | "node_modules/formdata-polyfill": { 1817 | "version": "4.0.10", 1818 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 1819 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 1820 | "license": "MIT", 1821 | "dependencies": { 1822 | "fetch-blob": "^3.1.2" 1823 | }, 1824 | "engines": { 1825 | "node": ">=12.20.0" 1826 | } 1827 | }, 1828 | "node_modules/fsevents": { 1829 | "version": "2.3.3", 1830 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1831 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1832 | "hasInstallScript": true, 1833 | "license": "MIT", 1834 | "optional": true, 1835 | "os": [ 1836 | "darwin" 1837 | ], 1838 | "engines": { 1839 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1840 | } 1841 | }, 1842 | "node_modules/get-caller-file": { 1843 | "version": "2.0.5", 1844 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1845 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1846 | "license": "ISC", 1847 | "engines": { 1848 | "node": "6.* || 8.* || >= 10.*" 1849 | } 1850 | }, 1851 | "node_modules/get-east-asian-width": { 1852 | "version": "1.3.0", 1853 | "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", 1854 | "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", 1855 | "license": "MIT", 1856 | "engines": { 1857 | "node": ">=18" 1858 | }, 1859 | "funding": { 1860 | "url": "https://github.com/sponsors/sindresorhus" 1861 | } 1862 | }, 1863 | "node_modules/get-tsconfig": { 1864 | "version": "4.8.1", 1865 | "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", 1866 | "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", 1867 | "license": "MIT", 1868 | "dependencies": { 1869 | "resolve-pkg-maps": "^1.0.0" 1870 | }, 1871 | "funding": { 1872 | "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" 1873 | } 1874 | }, 1875 | "node_modules/humanize-ms": { 1876 | "version": "1.2.1", 1877 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 1878 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 1879 | "license": "MIT", 1880 | "dependencies": { 1881 | "ms": "^2.0.0" 1882 | } 1883 | }, 1884 | "node_modules/iconv-lite": { 1885 | "version": "0.4.24", 1886 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1887 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1888 | "license": "MIT", 1889 | "dependencies": { 1890 | "safer-buffer": ">= 2.1.2 < 3" 1891 | }, 1892 | "engines": { 1893 | "node": ">=0.10.0" 1894 | } 1895 | }, 1896 | "node_modules/indent-string": { 1897 | "version": "5.0.0", 1898 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", 1899 | "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", 1900 | "license": "MIT", 1901 | "engines": { 1902 | "node": ">=12" 1903 | }, 1904 | "funding": { 1905 | "url": "https://github.com/sponsors/sindresorhus" 1906 | } 1907 | }, 1908 | "node_modules/ink": { 1909 | "version": "5.1.0", 1910 | "resolved": "https://registry.npmjs.org/ink/-/ink-5.1.0.tgz", 1911 | "integrity": "sha512-3vIO+CU4uSg167/dZrg4wHy75llUINYXxN4OsdaCkE40q4zyOTPwNc2VEpLnnWsIvIQeo6x6lilAhuaSt+rIsA==", 1912 | "license": "MIT", 1913 | "dependencies": { 1914 | "@alcalzone/ansi-tokenize": "^0.1.3", 1915 | "ansi-escapes": "^7.0.0", 1916 | "ansi-styles": "^6.2.1", 1917 | "auto-bind": "^5.0.1", 1918 | "chalk": "^5.3.0", 1919 | "cli-boxes": "^3.0.0", 1920 | "cli-cursor": "^4.0.0", 1921 | "cli-truncate": "^4.0.0", 1922 | "code-excerpt": "^4.0.0", 1923 | "es-toolkit": "^1.22.0", 1924 | "indent-string": "^5.0.0", 1925 | "is-in-ci": "^1.0.0", 1926 | "patch-console": "^2.0.0", 1927 | "react-reconciler": "^0.29.0", 1928 | "scheduler": "^0.23.0", 1929 | "signal-exit": "^3.0.7", 1930 | "slice-ansi": "^7.1.0", 1931 | "stack-utils": "^2.0.6", 1932 | "string-width": "^7.2.0", 1933 | "type-fest": "^4.27.0", 1934 | "widest-line": "^5.0.0", 1935 | "wrap-ansi": "^9.0.0", 1936 | "ws": "^8.18.0", 1937 | "yoga-wasm-web": "~0.3.3" 1938 | }, 1939 | "engines": { 1940 | "node": ">=18" 1941 | }, 1942 | "peerDependencies": { 1943 | "@types/react": ">=18.0.0", 1944 | "react": ">=18.0.0", 1945 | "react-devtools-core": "^4.19.1" 1946 | }, 1947 | "peerDependenciesMeta": { 1948 | "@types/react": { 1949 | "optional": true 1950 | }, 1951 | "react-devtools-core": { 1952 | "optional": true 1953 | } 1954 | } 1955 | }, 1956 | "node_modules/ink-text-input": { 1957 | "version": "6.0.0", 1958 | "resolved": "https://registry.npmjs.org/ink-text-input/-/ink-text-input-6.0.0.tgz", 1959 | "integrity": "sha512-Fw64n7Yha5deb1rHY137zHTAbSTNelUKuB5Kkk2HACXEtwIHBCf9OH2tP/LQ9fRYTl1F0dZgbW0zPnZk6FA9Lw==", 1960 | "license": "MIT", 1961 | "dependencies": { 1962 | "chalk": "^5.3.0", 1963 | "type-fest": "^4.18.2" 1964 | }, 1965 | "engines": { 1966 | "node": ">=18" 1967 | }, 1968 | "peerDependencies": { 1969 | "ink": ">=5", 1970 | "react": ">=18" 1971 | } 1972 | }, 1973 | "node_modules/ink-text-input/node_modules/type-fest": { 1974 | "version": "4.33.0", 1975 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz", 1976 | "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==", 1977 | "license": "(MIT OR CC0-1.0)", 1978 | "engines": { 1979 | "node": ">=16" 1980 | }, 1981 | "funding": { 1982 | "url": "https://github.com/sponsors/sindresorhus" 1983 | } 1984 | }, 1985 | "node_modules/ink/node_modules/ansi-escapes": { 1986 | "version": "7.0.0", 1987 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", 1988 | "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", 1989 | "license": "MIT", 1990 | "dependencies": { 1991 | "environment": "^1.0.0" 1992 | }, 1993 | "engines": { 1994 | "node": ">=18" 1995 | }, 1996 | "funding": { 1997 | "url": "https://github.com/sponsors/sindresorhus" 1998 | } 1999 | }, 2000 | "node_modules/ink/node_modules/ansi-regex": { 2001 | "version": "6.1.0", 2002 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 2003 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 2004 | "license": "MIT", 2005 | "engines": { 2006 | "node": ">=12" 2007 | }, 2008 | "funding": { 2009 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 2010 | } 2011 | }, 2012 | "node_modules/ink/node_modules/ansi-styles": { 2013 | "version": "6.2.1", 2014 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 2015 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 2016 | "license": "MIT", 2017 | "engines": { 2018 | "node": ">=12" 2019 | }, 2020 | "funding": { 2021 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2022 | } 2023 | }, 2024 | "node_modules/ink/node_modules/cli-cursor": { 2025 | "version": "4.0.0", 2026 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", 2027 | "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", 2028 | "license": "MIT", 2029 | "dependencies": { 2030 | "restore-cursor": "^4.0.0" 2031 | }, 2032 | "engines": { 2033 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2034 | }, 2035 | "funding": { 2036 | "url": "https://github.com/sponsors/sindresorhus" 2037 | } 2038 | }, 2039 | "node_modules/ink/node_modules/emoji-regex": { 2040 | "version": "10.4.0", 2041 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", 2042 | "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", 2043 | "license": "MIT" 2044 | }, 2045 | "node_modules/ink/node_modules/onetime": { 2046 | "version": "5.1.2", 2047 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2048 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2049 | "license": "MIT", 2050 | "dependencies": { 2051 | "mimic-fn": "^2.1.0" 2052 | }, 2053 | "engines": { 2054 | "node": ">=6" 2055 | }, 2056 | "funding": { 2057 | "url": "https://github.com/sponsors/sindresorhus" 2058 | } 2059 | }, 2060 | "node_modules/ink/node_modules/restore-cursor": { 2061 | "version": "4.0.0", 2062 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", 2063 | "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", 2064 | "license": "MIT", 2065 | "dependencies": { 2066 | "onetime": "^5.1.0", 2067 | "signal-exit": "^3.0.2" 2068 | }, 2069 | "engines": { 2070 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2071 | }, 2072 | "funding": { 2073 | "url": "https://github.com/sponsors/sindresorhus" 2074 | } 2075 | }, 2076 | "node_modules/ink/node_modules/signal-exit": { 2077 | "version": "3.0.7", 2078 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2079 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 2080 | "license": "ISC" 2081 | }, 2082 | "node_modules/ink/node_modules/string-width": { 2083 | "version": "7.2.0", 2084 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", 2085 | "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", 2086 | "license": "MIT", 2087 | "dependencies": { 2088 | "emoji-regex": "^10.3.0", 2089 | "get-east-asian-width": "^1.0.0", 2090 | "strip-ansi": "^7.1.0" 2091 | }, 2092 | "engines": { 2093 | "node": ">=18" 2094 | }, 2095 | "funding": { 2096 | "url": "https://github.com/sponsors/sindresorhus" 2097 | } 2098 | }, 2099 | "node_modules/ink/node_modules/strip-ansi": { 2100 | "version": "7.1.0", 2101 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2102 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2103 | "license": "MIT", 2104 | "dependencies": { 2105 | "ansi-regex": "^6.0.1" 2106 | }, 2107 | "engines": { 2108 | "node": ">=12" 2109 | }, 2110 | "funding": { 2111 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2112 | } 2113 | }, 2114 | "node_modules/ink/node_modules/type-fest": { 2115 | "version": "4.33.0", 2116 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz", 2117 | "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==", 2118 | "license": "(MIT OR CC0-1.0)", 2119 | "engines": { 2120 | "node": ">=16" 2121 | }, 2122 | "funding": { 2123 | "url": "https://github.com/sponsors/sindresorhus" 2124 | } 2125 | }, 2126 | "node_modules/ink/node_modules/wrap-ansi": { 2127 | "version": "9.0.0", 2128 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", 2129 | "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", 2130 | "license": "MIT", 2131 | "dependencies": { 2132 | "ansi-styles": "^6.2.1", 2133 | "string-width": "^7.0.0", 2134 | "strip-ansi": "^7.1.0" 2135 | }, 2136 | "engines": { 2137 | "node": ">=18" 2138 | }, 2139 | "funding": { 2140 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2141 | } 2142 | }, 2143 | "node_modules/inquirer": { 2144 | "version": "12.2.0", 2145 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.2.0.tgz", 2146 | "integrity": "sha512-CI0yGbyd5SS4vP7i180S9i95yI+M3ONaljfLBlNS1IIIZ7n+xbH76WzHkIHj253huRiXaKQZl8zijOl0Y0mjqg==", 2147 | "license": "MIT", 2148 | "dependencies": { 2149 | "@inquirer/core": "^10.1.1", 2150 | "@inquirer/prompts": "^7.2.0", 2151 | "@inquirer/type": "^3.0.1", 2152 | "ansi-escapes": "^4.3.2", 2153 | "mute-stream": "^2.0.0", 2154 | "run-async": "^3.0.0", 2155 | "rxjs": "^7.8.1" 2156 | }, 2157 | "engines": { 2158 | "node": ">=18" 2159 | }, 2160 | "peerDependencies": { 2161 | "@types/node": ">=18" 2162 | } 2163 | }, 2164 | "node_modules/is-docker": { 2165 | "version": "3.0.0", 2166 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", 2167 | "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", 2168 | "license": "MIT", 2169 | "bin": { 2170 | "is-docker": "cli.js" 2171 | }, 2172 | "engines": { 2173 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2174 | }, 2175 | "funding": { 2176 | "url": "https://github.com/sponsors/sindresorhus" 2177 | } 2178 | }, 2179 | "node_modules/is-fullwidth-code-point": { 2180 | "version": "3.0.0", 2181 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2182 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2183 | "license": "MIT", 2184 | "engines": { 2185 | "node": ">=8" 2186 | } 2187 | }, 2188 | "node_modules/is-in-ci": { 2189 | "version": "1.0.0", 2190 | "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-1.0.0.tgz", 2191 | "integrity": "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==", 2192 | "license": "MIT", 2193 | "bin": { 2194 | "is-in-ci": "cli.js" 2195 | }, 2196 | "engines": { 2197 | "node": ">=18" 2198 | }, 2199 | "funding": { 2200 | "url": "https://github.com/sponsors/sindresorhus" 2201 | } 2202 | }, 2203 | "node_modules/is-inside-container": { 2204 | "version": "1.0.0", 2205 | "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", 2206 | "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", 2207 | "license": "MIT", 2208 | "dependencies": { 2209 | "is-docker": "^3.0.0" 2210 | }, 2211 | "bin": { 2212 | "is-inside-container": "cli.js" 2213 | }, 2214 | "engines": { 2215 | "node": ">=14.16" 2216 | }, 2217 | "funding": { 2218 | "url": "https://github.com/sponsors/sindresorhus" 2219 | } 2220 | }, 2221 | "node_modules/is-interactive": { 2222 | "version": "2.0.0", 2223 | "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", 2224 | "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", 2225 | "dev": true, 2226 | "license": "MIT", 2227 | "engines": { 2228 | "node": ">=12" 2229 | }, 2230 | "funding": { 2231 | "url": "https://github.com/sponsors/sindresorhus" 2232 | } 2233 | }, 2234 | "node_modules/is-unicode-supported": { 2235 | "version": "2.1.0", 2236 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", 2237 | "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", 2238 | "dev": true, 2239 | "license": "MIT", 2240 | "engines": { 2241 | "node": ">=18" 2242 | }, 2243 | "funding": { 2244 | "url": "https://github.com/sponsors/sindresorhus" 2245 | } 2246 | }, 2247 | "node_modules/is-wsl": { 2248 | "version": "3.1.0", 2249 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", 2250 | "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", 2251 | "license": "MIT", 2252 | "dependencies": { 2253 | "is-inside-container": "^1.0.0" 2254 | }, 2255 | "engines": { 2256 | "node": ">=16" 2257 | }, 2258 | "funding": { 2259 | "url": "https://github.com/sponsors/sindresorhus" 2260 | } 2261 | }, 2262 | "node_modules/js-tokens": { 2263 | "version": "4.0.0", 2264 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2265 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2266 | "license": "MIT" 2267 | }, 2268 | "node_modules/log-symbols": { 2269 | "version": "6.0.0", 2270 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", 2271 | "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", 2272 | "dev": true, 2273 | "license": "MIT", 2274 | "dependencies": { 2275 | "chalk": "^5.3.0", 2276 | "is-unicode-supported": "^1.3.0" 2277 | }, 2278 | "engines": { 2279 | "node": ">=18" 2280 | }, 2281 | "funding": { 2282 | "url": "https://github.com/sponsors/sindresorhus" 2283 | } 2284 | }, 2285 | "node_modules/log-symbols/node_modules/is-unicode-supported": { 2286 | "version": "1.3.0", 2287 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", 2288 | "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", 2289 | "dev": true, 2290 | "license": "MIT", 2291 | "engines": { 2292 | "node": ">=12" 2293 | }, 2294 | "funding": { 2295 | "url": "https://github.com/sponsors/sindresorhus" 2296 | } 2297 | }, 2298 | "node_modules/loose-envify": { 2299 | "version": "1.4.0", 2300 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2301 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2302 | "license": "MIT", 2303 | "dependencies": { 2304 | "js-tokens": "^3.0.0 || ^4.0.0" 2305 | }, 2306 | "bin": { 2307 | "loose-envify": "cli.js" 2308 | } 2309 | }, 2310 | "node_modules/lru-queue": { 2311 | "version": "0.1.0", 2312 | "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", 2313 | "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", 2314 | "license": "MIT", 2315 | "dependencies": { 2316 | "es5-ext": "~0.10.2" 2317 | } 2318 | }, 2319 | "node_modules/make-error": { 2320 | "version": "1.3.6", 2321 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 2322 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 2323 | "dev": true, 2324 | "license": "ISC" 2325 | }, 2326 | "node_modules/memoizee": { 2327 | "version": "0.3.10", 2328 | "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", 2329 | "integrity": "sha512-LLzVUuWwGBKK188spgOK/ukrp5zvd9JGsiLDH41pH9vt5jvhZfsu5pxDuAnYAMG8YEGce72KO07sSBy9KkvOfw==", 2330 | "license": "MIT", 2331 | "dependencies": { 2332 | "d": "~0.1.1", 2333 | "es5-ext": "~0.10.11", 2334 | "es6-weak-map": "~0.1.4", 2335 | "event-emitter": "~0.3.4", 2336 | "lru-queue": "0.1", 2337 | "next-tick": "~0.2.2", 2338 | "timers-ext": "0.1" 2339 | } 2340 | }, 2341 | "node_modules/memoizee/node_modules/next-tick": { 2342 | "version": "0.2.2", 2343 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", 2344 | "integrity": "sha512-f7h4svPtl+QidoBv4taKXUjJ70G2asaZ8G28nS0OkqaalX8dwwrtWtyxEDPK62AC00ur/+/E0pUwBwY5EPn15Q==", 2345 | "license": "MIT" 2346 | }, 2347 | "node_modules/mime-db": { 2348 | "version": "1.52.0", 2349 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2350 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 2351 | "license": "MIT", 2352 | "engines": { 2353 | "node": ">= 0.6" 2354 | } 2355 | }, 2356 | "node_modules/mime-types": { 2357 | "version": "2.1.35", 2358 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2359 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2360 | "license": "MIT", 2361 | "dependencies": { 2362 | "mime-db": "1.52.0" 2363 | }, 2364 | "engines": { 2365 | "node": ">= 0.6" 2366 | } 2367 | }, 2368 | "node_modules/mimic-fn": { 2369 | "version": "2.1.0", 2370 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2371 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 2372 | "license": "MIT", 2373 | "engines": { 2374 | "node": ">=6" 2375 | } 2376 | }, 2377 | "node_modules/mimic-function": { 2378 | "version": "5.0.1", 2379 | "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", 2380 | "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", 2381 | "dev": true, 2382 | "license": "MIT", 2383 | "engines": { 2384 | "node": ">=18" 2385 | }, 2386 | "funding": { 2387 | "url": "https://github.com/sponsors/sindresorhus" 2388 | } 2389 | }, 2390 | "node_modules/ms": { 2391 | "version": "2.1.3", 2392 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2393 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2394 | "license": "MIT" 2395 | }, 2396 | "node_modules/mute-stream": { 2397 | "version": "2.0.0", 2398 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", 2399 | "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", 2400 | "license": "ISC", 2401 | "engines": { 2402 | "node": "^18.17.0 || >=20.5.0" 2403 | } 2404 | }, 2405 | "node_modules/next-tick": { 2406 | "version": "1.1.0", 2407 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", 2408 | "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", 2409 | "license": "ISC" 2410 | }, 2411 | "node_modules/node-domexception": { 2412 | "version": "1.0.0", 2413 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 2414 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 2415 | "funding": [ 2416 | { 2417 | "type": "github", 2418 | "url": "https://github.com/sponsors/jimmywarting" 2419 | }, 2420 | { 2421 | "type": "github", 2422 | "url": "https://paypal.me/jimmywarting" 2423 | } 2424 | ], 2425 | "license": "MIT", 2426 | "engines": { 2427 | "node": ">=10.5.0" 2428 | } 2429 | }, 2430 | "node_modules/node-fetch": { 2431 | "version": "3.3.2", 2432 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", 2433 | "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", 2434 | "license": "MIT", 2435 | "dependencies": { 2436 | "data-uri-to-buffer": "^4.0.0", 2437 | "fetch-blob": "^3.1.4", 2438 | "formdata-polyfill": "^4.0.10" 2439 | }, 2440 | "engines": { 2441 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2442 | }, 2443 | "funding": { 2444 | "type": "opencollective", 2445 | "url": "https://opencollective.com/node-fetch" 2446 | } 2447 | }, 2448 | "node_modules/onetime": { 2449 | "version": "7.0.0", 2450 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", 2451 | "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", 2452 | "dev": true, 2453 | "license": "MIT", 2454 | "dependencies": { 2455 | "mimic-function": "^5.0.0" 2456 | }, 2457 | "engines": { 2458 | "node": ">=18" 2459 | }, 2460 | "funding": { 2461 | "url": "https://github.com/sponsors/sindresorhus" 2462 | } 2463 | }, 2464 | "node_modules/open": { 2465 | "version": "10.1.0", 2466 | "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", 2467 | "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", 2468 | "license": "MIT", 2469 | "dependencies": { 2470 | "default-browser": "^5.2.1", 2471 | "define-lazy-prop": "^3.0.0", 2472 | "is-inside-container": "^1.0.0", 2473 | "is-wsl": "^3.1.0" 2474 | }, 2475 | "engines": { 2476 | "node": ">=18" 2477 | }, 2478 | "funding": { 2479 | "url": "https://github.com/sponsors/sindresorhus" 2480 | } 2481 | }, 2482 | "node_modules/openai": { 2483 | "version": "4.81.0", 2484 | "resolved": "https://registry.npmjs.org/openai/-/openai-4.81.0.tgz", 2485 | "integrity": "sha512-lXkFkV+He3O6RGnldHncRGef4uWHssDsAVwN5I3bWcgIdDPy/w8vgtIAwvZxAj49m4WiwWVD0+eGTJ9xOv/ISA==", 2486 | "license": "Apache-2.0", 2487 | "dependencies": { 2488 | "@types/node": "^18.11.18", 2489 | "@types/node-fetch": "^2.6.4", 2490 | "abort-controller": "^3.0.0", 2491 | "agentkeepalive": "^4.2.1", 2492 | "form-data-encoder": "1.7.2", 2493 | "formdata-node": "^4.3.2", 2494 | "node-fetch": "^2.6.7" 2495 | }, 2496 | "bin": { 2497 | "openai": "bin/cli" 2498 | }, 2499 | "peerDependencies": { 2500 | "ws": "^8.18.0", 2501 | "zod": "^3.23.8" 2502 | }, 2503 | "peerDependenciesMeta": { 2504 | "ws": { 2505 | "optional": true 2506 | }, 2507 | "zod": { 2508 | "optional": true 2509 | } 2510 | } 2511 | }, 2512 | "node_modules/openai/node_modules/@types/node": { 2513 | "version": "18.19.74", 2514 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.74.tgz", 2515 | "integrity": "sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A==", 2516 | "license": "MIT", 2517 | "dependencies": { 2518 | "undici-types": "~5.26.4" 2519 | } 2520 | }, 2521 | "node_modules/openai/node_modules/node-fetch": { 2522 | "version": "2.7.0", 2523 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 2524 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 2525 | "license": "MIT", 2526 | "dependencies": { 2527 | "whatwg-url": "^5.0.0" 2528 | }, 2529 | "engines": { 2530 | "node": "4.x || >=6.0.0" 2531 | }, 2532 | "peerDependencies": { 2533 | "encoding": "^0.1.0" 2534 | }, 2535 | "peerDependenciesMeta": { 2536 | "encoding": { 2537 | "optional": true 2538 | } 2539 | } 2540 | }, 2541 | "node_modules/openai/node_modules/undici-types": { 2542 | "version": "5.26.5", 2543 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 2544 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 2545 | "license": "MIT" 2546 | }, 2547 | "node_modules/ora": { 2548 | "version": "8.1.1", 2549 | "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.1.tgz", 2550 | "integrity": "sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==", 2551 | "dev": true, 2552 | "license": "MIT", 2553 | "dependencies": { 2554 | "chalk": "^5.3.0", 2555 | "cli-cursor": "^5.0.0", 2556 | "cli-spinners": "^2.9.2", 2557 | "is-interactive": "^2.0.0", 2558 | "is-unicode-supported": "^2.0.0", 2559 | "log-symbols": "^6.0.0", 2560 | "stdin-discarder": "^0.2.2", 2561 | "string-width": "^7.2.0", 2562 | "strip-ansi": "^7.1.0" 2563 | }, 2564 | "engines": { 2565 | "node": ">=18" 2566 | }, 2567 | "funding": { 2568 | "url": "https://github.com/sponsors/sindresorhus" 2569 | } 2570 | }, 2571 | "node_modules/ora/node_modules/ansi-regex": { 2572 | "version": "6.1.0", 2573 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 2574 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 2575 | "dev": true, 2576 | "license": "MIT", 2577 | "engines": { 2578 | "node": ">=12" 2579 | }, 2580 | "funding": { 2581 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 2582 | } 2583 | }, 2584 | "node_modules/ora/node_modules/emoji-regex": { 2585 | "version": "10.4.0", 2586 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", 2587 | "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", 2588 | "dev": true, 2589 | "license": "MIT" 2590 | }, 2591 | "node_modules/ora/node_modules/string-width": { 2592 | "version": "7.2.0", 2593 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", 2594 | "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", 2595 | "dev": true, 2596 | "license": "MIT", 2597 | "dependencies": { 2598 | "emoji-regex": "^10.3.0", 2599 | "get-east-asian-width": "^1.0.0", 2600 | "strip-ansi": "^7.1.0" 2601 | }, 2602 | "engines": { 2603 | "node": ">=18" 2604 | }, 2605 | "funding": { 2606 | "url": "https://github.com/sponsors/sindresorhus" 2607 | } 2608 | }, 2609 | "node_modules/ora/node_modules/strip-ansi": { 2610 | "version": "7.1.0", 2611 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2612 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2613 | "dev": true, 2614 | "license": "MIT", 2615 | "dependencies": { 2616 | "ansi-regex": "^6.0.1" 2617 | }, 2618 | "engines": { 2619 | "node": ">=12" 2620 | }, 2621 | "funding": { 2622 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2623 | } 2624 | }, 2625 | "node_modules/os-tmpdir": { 2626 | "version": "1.0.2", 2627 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 2628 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", 2629 | "license": "MIT", 2630 | "engines": { 2631 | "node": ">=0.10.0" 2632 | } 2633 | }, 2634 | "node_modules/patch-console": { 2635 | "version": "2.0.0", 2636 | "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", 2637 | "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", 2638 | "license": "MIT", 2639 | "engines": { 2640 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2641 | } 2642 | }, 2643 | "node_modules/react": { 2644 | "version": "18.3.1", 2645 | "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", 2646 | "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", 2647 | "license": "MIT", 2648 | "dependencies": { 2649 | "loose-envify": "^1.1.0" 2650 | }, 2651 | "engines": { 2652 | "node": ">=0.10.0" 2653 | } 2654 | }, 2655 | "node_modules/react-reconciler": { 2656 | "version": "0.29.2", 2657 | "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", 2658 | "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", 2659 | "license": "MIT", 2660 | "dependencies": { 2661 | "loose-envify": "^1.1.0", 2662 | "scheduler": "^0.23.2" 2663 | }, 2664 | "engines": { 2665 | "node": ">=0.10.0" 2666 | }, 2667 | "peerDependencies": { 2668 | "react": "^18.3.1" 2669 | } 2670 | }, 2671 | "node_modules/require-directory": { 2672 | "version": "2.1.1", 2673 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2674 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2675 | "license": "MIT", 2676 | "engines": { 2677 | "node": ">=0.10.0" 2678 | } 2679 | }, 2680 | "node_modules/resolve-pkg-maps": { 2681 | "version": "1.0.0", 2682 | "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", 2683 | "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", 2684 | "license": "MIT", 2685 | "funding": { 2686 | "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" 2687 | } 2688 | }, 2689 | "node_modules/restore-cursor": { 2690 | "version": "5.1.0", 2691 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", 2692 | "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", 2693 | "dev": true, 2694 | "license": "MIT", 2695 | "dependencies": { 2696 | "onetime": "^7.0.0", 2697 | "signal-exit": "^4.1.0" 2698 | }, 2699 | "engines": { 2700 | "node": ">=18" 2701 | }, 2702 | "funding": { 2703 | "url": "https://github.com/sponsors/sindresorhus" 2704 | } 2705 | }, 2706 | "node_modules/run-applescript": { 2707 | "version": "7.0.0", 2708 | "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", 2709 | "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", 2710 | "license": "MIT", 2711 | "engines": { 2712 | "node": ">=18" 2713 | }, 2714 | "funding": { 2715 | "url": "https://github.com/sponsors/sindresorhus" 2716 | } 2717 | }, 2718 | "node_modules/run-async": { 2719 | "version": "3.0.0", 2720 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", 2721 | "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", 2722 | "license": "MIT", 2723 | "engines": { 2724 | "node": ">=0.12.0" 2725 | } 2726 | }, 2727 | "node_modules/rxjs": { 2728 | "version": "7.8.1", 2729 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", 2730 | "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", 2731 | "license": "Apache-2.0", 2732 | "dependencies": { 2733 | "tslib": "^2.1.0" 2734 | } 2735 | }, 2736 | "node_modules/safer-buffer": { 2737 | "version": "2.1.2", 2738 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2739 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2740 | "license": "MIT" 2741 | }, 2742 | "node_modules/scheduler": { 2743 | "version": "0.23.2", 2744 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", 2745 | "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", 2746 | "license": "MIT", 2747 | "dependencies": { 2748 | "loose-envify": "^1.1.0" 2749 | } 2750 | }, 2751 | "node_modules/signal-exit": { 2752 | "version": "4.1.0", 2753 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2754 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 2755 | "license": "ISC", 2756 | "engines": { 2757 | "node": ">=14" 2758 | }, 2759 | "funding": { 2760 | "url": "https://github.com/sponsors/isaacs" 2761 | } 2762 | }, 2763 | "node_modules/slice-ansi": { 2764 | "version": "7.1.0", 2765 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", 2766 | "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", 2767 | "license": "MIT", 2768 | "dependencies": { 2769 | "ansi-styles": "^6.2.1", 2770 | "is-fullwidth-code-point": "^5.0.0" 2771 | }, 2772 | "engines": { 2773 | "node": ">=18" 2774 | }, 2775 | "funding": { 2776 | "url": "https://github.com/chalk/slice-ansi?sponsor=1" 2777 | } 2778 | }, 2779 | "node_modules/slice-ansi/node_modules/ansi-styles": { 2780 | "version": "6.2.1", 2781 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 2782 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 2783 | "license": "MIT", 2784 | "engines": { 2785 | "node": ">=12" 2786 | }, 2787 | "funding": { 2788 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2789 | } 2790 | }, 2791 | "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { 2792 | "version": "5.0.0", 2793 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", 2794 | "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", 2795 | "license": "MIT", 2796 | "dependencies": { 2797 | "get-east-asian-width": "^1.0.0" 2798 | }, 2799 | "engines": { 2800 | "node": ">=18" 2801 | }, 2802 | "funding": { 2803 | "url": "https://github.com/sponsors/sindresorhus" 2804 | } 2805 | }, 2806 | "node_modules/stack-utils": { 2807 | "version": "2.0.6", 2808 | "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", 2809 | "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", 2810 | "license": "MIT", 2811 | "dependencies": { 2812 | "escape-string-regexp": "^2.0.0" 2813 | }, 2814 | "engines": { 2815 | "node": ">=10" 2816 | } 2817 | }, 2818 | "node_modules/stdin-discarder": { 2819 | "version": "0.2.2", 2820 | "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", 2821 | "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", 2822 | "dev": true, 2823 | "license": "MIT", 2824 | "engines": { 2825 | "node": ">=18" 2826 | }, 2827 | "funding": { 2828 | "url": "https://github.com/sponsors/sindresorhus" 2829 | } 2830 | }, 2831 | "node_modules/string-width": { 2832 | "version": "4.2.3", 2833 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2834 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2835 | "license": "MIT", 2836 | "dependencies": { 2837 | "emoji-regex": "^8.0.0", 2838 | "is-fullwidth-code-point": "^3.0.0", 2839 | "strip-ansi": "^6.0.1" 2840 | }, 2841 | "engines": { 2842 | "node": ">=8" 2843 | } 2844 | }, 2845 | "node_modules/strip-ansi": { 2846 | "version": "6.0.1", 2847 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2848 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2849 | "license": "MIT", 2850 | "dependencies": { 2851 | "ansi-regex": "^5.0.1" 2852 | }, 2853 | "engines": { 2854 | "node": ">=8" 2855 | } 2856 | }, 2857 | "node_modules/timers-ext": { 2858 | "version": "0.1.8", 2859 | "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", 2860 | "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", 2861 | "license": "ISC", 2862 | "dependencies": { 2863 | "es5-ext": "^0.10.64", 2864 | "next-tick": "^1.1.0" 2865 | }, 2866 | "engines": { 2867 | "node": ">=0.12" 2868 | } 2869 | }, 2870 | "node_modules/tmp": { 2871 | "version": "0.0.33", 2872 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2873 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2874 | "license": "MIT", 2875 | "dependencies": { 2876 | "os-tmpdir": "~1.0.2" 2877 | }, 2878 | "engines": { 2879 | "node": ">=0.6.0" 2880 | } 2881 | }, 2882 | "node_modules/tr46": { 2883 | "version": "0.0.3", 2884 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2885 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", 2886 | "license": "MIT" 2887 | }, 2888 | "node_modules/ts-node": { 2889 | "version": "10.9.2", 2890 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", 2891 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", 2892 | "dev": true, 2893 | "license": "MIT", 2894 | "dependencies": { 2895 | "@cspotcode/source-map-support": "^0.8.0", 2896 | "@tsconfig/node10": "^1.0.7", 2897 | "@tsconfig/node12": "^1.0.7", 2898 | "@tsconfig/node14": "^1.0.0", 2899 | "@tsconfig/node16": "^1.0.2", 2900 | "acorn": "^8.4.1", 2901 | "acorn-walk": "^8.1.1", 2902 | "arg": "^4.1.0", 2903 | "create-require": "^1.1.0", 2904 | "diff": "^4.0.1", 2905 | "make-error": "^1.1.1", 2906 | "v8-compile-cache-lib": "^3.0.1", 2907 | "yn": "3.1.1" 2908 | }, 2909 | "bin": { 2910 | "ts-node": "dist/bin.js", 2911 | "ts-node-cwd": "dist/bin-cwd.js", 2912 | "ts-node-esm": "dist/bin-esm.js", 2913 | "ts-node-script": "dist/bin-script.js", 2914 | "ts-node-transpile-only": "dist/bin-transpile.js", 2915 | "ts-script": "dist/bin-script-deprecated.js" 2916 | }, 2917 | "peerDependencies": { 2918 | "@swc/core": ">=1.2.50", 2919 | "@swc/wasm": ">=1.2.50", 2920 | "@types/node": "*", 2921 | "typescript": ">=2.7" 2922 | }, 2923 | "peerDependenciesMeta": { 2924 | "@swc/core": { 2925 | "optional": true 2926 | }, 2927 | "@swc/wasm": { 2928 | "optional": true 2929 | } 2930 | } 2931 | }, 2932 | "node_modules/tslib": { 2933 | "version": "2.8.1", 2934 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 2935 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 2936 | "license": "0BSD" 2937 | }, 2938 | "node_modules/tsx": { 2939 | "version": "4.19.2", 2940 | "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", 2941 | "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", 2942 | "license": "MIT", 2943 | "dependencies": { 2944 | "esbuild": "~0.23.0", 2945 | "get-tsconfig": "^4.7.5" 2946 | }, 2947 | "bin": { 2948 | "tsx": "dist/cli.mjs" 2949 | }, 2950 | "engines": { 2951 | "node": ">=18.0.0" 2952 | }, 2953 | "optionalDependencies": { 2954 | "fsevents": "~2.3.3" 2955 | } 2956 | }, 2957 | "node_modules/type": { 2958 | "version": "2.7.3", 2959 | "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", 2960 | "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", 2961 | "license": "ISC" 2962 | }, 2963 | "node_modules/type-fest": { 2964 | "version": "0.21.3", 2965 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 2966 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 2967 | "license": "(MIT OR CC0-1.0)", 2968 | "engines": { 2969 | "node": ">=10" 2970 | }, 2971 | "funding": { 2972 | "url": "https://github.com/sponsors/sindresorhus" 2973 | } 2974 | }, 2975 | "node_modules/typescript": { 2976 | "version": "5.7.2", 2977 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", 2978 | "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", 2979 | "dev": true, 2980 | "license": "Apache-2.0", 2981 | "bin": { 2982 | "tsc": "bin/tsc", 2983 | "tsserver": "bin/tsserver" 2984 | }, 2985 | "engines": { 2986 | "node": ">=14.17" 2987 | } 2988 | }, 2989 | "node_modules/undici-types": { 2990 | "version": "6.20.0", 2991 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", 2992 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", 2993 | "license": "MIT" 2994 | }, 2995 | "node_modules/v8-compile-cache-lib": { 2996 | "version": "3.0.1", 2997 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 2998 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 2999 | "dev": true, 3000 | "license": "MIT" 3001 | }, 3002 | "node_modules/web-streams-polyfill": { 3003 | "version": "3.3.3", 3004 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", 3005 | "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", 3006 | "license": "MIT", 3007 | "engines": { 3008 | "node": ">= 8" 3009 | } 3010 | }, 3011 | "node_modules/webidl-conversions": { 3012 | "version": "3.0.1", 3013 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 3014 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", 3015 | "license": "BSD-2-Clause" 3016 | }, 3017 | "node_modules/whatwg-url": { 3018 | "version": "5.0.0", 3019 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 3020 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 3021 | "license": "MIT", 3022 | "dependencies": { 3023 | "tr46": "~0.0.3", 3024 | "webidl-conversions": "^3.0.0" 3025 | } 3026 | }, 3027 | "node_modules/widest-line": { 3028 | "version": "5.0.0", 3029 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", 3030 | "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", 3031 | "license": "MIT", 3032 | "dependencies": { 3033 | "string-width": "^7.0.0" 3034 | }, 3035 | "engines": { 3036 | "node": ">=18" 3037 | }, 3038 | "funding": { 3039 | "url": "https://github.com/sponsors/sindresorhus" 3040 | } 3041 | }, 3042 | "node_modules/widest-line/node_modules/ansi-regex": { 3043 | "version": "6.1.0", 3044 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 3045 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 3046 | "license": "MIT", 3047 | "engines": { 3048 | "node": ">=12" 3049 | }, 3050 | "funding": { 3051 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 3052 | } 3053 | }, 3054 | "node_modules/widest-line/node_modules/emoji-regex": { 3055 | "version": "10.4.0", 3056 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", 3057 | "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", 3058 | "license": "MIT" 3059 | }, 3060 | "node_modules/widest-line/node_modules/string-width": { 3061 | "version": "7.2.0", 3062 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", 3063 | "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", 3064 | "license": "MIT", 3065 | "dependencies": { 3066 | "emoji-regex": "^10.3.0", 3067 | "get-east-asian-width": "^1.0.0", 3068 | "strip-ansi": "^7.1.0" 3069 | }, 3070 | "engines": { 3071 | "node": ">=18" 3072 | }, 3073 | "funding": { 3074 | "url": "https://github.com/sponsors/sindresorhus" 3075 | } 3076 | }, 3077 | "node_modules/widest-line/node_modules/strip-ansi": { 3078 | "version": "7.1.0", 3079 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 3080 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 3081 | "license": "MIT", 3082 | "dependencies": { 3083 | "ansi-regex": "^6.0.1" 3084 | }, 3085 | "engines": { 3086 | "node": ">=12" 3087 | }, 3088 | "funding": { 3089 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 3090 | } 3091 | }, 3092 | "node_modules/wrap-ansi": { 3093 | "version": "6.2.0", 3094 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 3095 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 3096 | "license": "MIT", 3097 | "dependencies": { 3098 | "ansi-styles": "^4.0.0", 3099 | "string-width": "^4.1.0", 3100 | "strip-ansi": "^6.0.0" 3101 | }, 3102 | "engines": { 3103 | "node": ">=8" 3104 | } 3105 | }, 3106 | "node_modules/ws": { 3107 | "version": "8.18.0", 3108 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 3109 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 3110 | "license": "MIT", 3111 | "engines": { 3112 | "node": ">=10.0.0" 3113 | }, 3114 | "peerDependencies": { 3115 | "bufferutil": "^4.0.1", 3116 | "utf-8-validate": ">=5.0.2" 3117 | }, 3118 | "peerDependenciesMeta": { 3119 | "bufferutil": { 3120 | "optional": true 3121 | }, 3122 | "utf-8-validate": { 3123 | "optional": true 3124 | } 3125 | } 3126 | }, 3127 | "node_modules/y18n": { 3128 | "version": "5.0.8", 3129 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 3130 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 3131 | "license": "ISC", 3132 | "engines": { 3133 | "node": ">=10" 3134 | } 3135 | }, 3136 | "node_modules/yargs": { 3137 | "version": "17.7.2", 3138 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 3139 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 3140 | "license": "MIT", 3141 | "dependencies": { 3142 | "cliui": "^8.0.1", 3143 | "escalade": "^3.1.1", 3144 | "get-caller-file": "^2.0.5", 3145 | "require-directory": "^2.1.1", 3146 | "string-width": "^4.2.3", 3147 | "y18n": "^5.0.5", 3148 | "yargs-parser": "^21.1.1" 3149 | }, 3150 | "engines": { 3151 | "node": ">=12" 3152 | } 3153 | }, 3154 | "node_modules/yargs-parser": { 3155 | "version": "21.1.1", 3156 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 3157 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 3158 | "license": "ISC", 3159 | "engines": { 3160 | "node": ">=12" 3161 | } 3162 | }, 3163 | "node_modules/yn": { 3164 | "version": "3.1.1", 3165 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 3166 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 3167 | "dev": true, 3168 | "license": "MIT", 3169 | "engines": { 3170 | "node": ">=6" 3171 | } 3172 | }, 3173 | "node_modules/yoctocolors-cjs": { 3174 | "version": "2.1.2", 3175 | "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", 3176 | "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", 3177 | "license": "MIT", 3178 | "engines": { 3179 | "node": ">=18" 3180 | }, 3181 | "funding": { 3182 | "url": "https://github.com/sponsors/sindresorhus" 3183 | } 3184 | }, 3185 | "node_modules/yoga-wasm-web": { 3186 | "version": "0.3.3", 3187 | "resolved": "https://registry.npmjs.org/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz", 3188 | "integrity": "sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==", 3189 | "license": "MIT" 3190 | }, 3191 | "node_modules/zod": { 3192 | "version": "3.24.1", 3193 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", 3194 | "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", 3195 | "license": "MIT", 3196 | "funding": { 3197 | "url": "https://github.com/sponsors/colinhacks" 3198 | } 3199 | }, 3200 | "node_modules/zx": { 3201 | "version": "8.2.4", 3202 | "resolved": "https://registry.npmjs.org/zx/-/zx-8.2.4.tgz", 3203 | "integrity": "sha512-g9wVU+5+M+zVen/3IyAZfsZFmeqb6vDfjqFggakviz5uLK7OAejOirX+jeTOkyvAh/OYRlCgw+SdqzN7F61QVQ==", 3204 | "license": "Apache-2.0", 3205 | "bin": { 3206 | "zx": "build/cli.js" 3207 | }, 3208 | "engines": { 3209 | "node": ">= 12.17.0" 3210 | }, 3211 | "optionalDependencies": { 3212 | "@types/fs-extra": ">=11", 3213 | "@types/node": ">=20" 3214 | } 3215 | } 3216 | } 3217 | } 3218 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "commitah", 3 | "version": "2.1.1", 4 | "main": "index.js", 5 | "type": "module", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "tsx src/main.ts", 9 | "build": "tsc", 10 | "assemble": "tsc && tsx src/main.ts", 11 | "wizard": "tsx src/wizard.ts" 12 | }, 13 | "bin": { 14 | "commitah": "dist/main.js" 15 | }, 16 | "keywords": [], 17 | "author": "Muhammad Utsman", 18 | "license": "ISC", 19 | "description": "Auto commit with message powered by Generative AI with Multiple provider", 20 | "dependencies": { 21 | "blessed": "^0.1.81", 22 | "chalk": "^5.4.1", 23 | "clear": "^0.1.0", 24 | "clui": "^0.3.6", 25 | "commander": "^13.1.0", 26 | "figlet": "^1.8.0", 27 | "node-fetch": "^3.3.2", 28 | "openai": "^4.81.0", 29 | "ora": "^8.1.1", 30 | "ts-node": "^10.9.2", 31 | "tsx": "^4.19.2", 32 | "typescript": "^5.7.2", 33 | "yargs": "^17.7.2", 34 | "zod": "^3.24.1", 35 | "zx": "^8.2.4" 36 | }, 37 | "devDependencies": { 38 | "@inquirer/select": "^4.0.3", 39 | "@types/blessed": "^0.1.25", 40 | "@types/chalk": "^0.4.31", 41 | "@types/clui": "^0.3.4", 42 | "@types/commander": "^2.12.0", 43 | "@types/figlet": "^1.7.0", 44 | "@types/inquirer": "^9.0.7", 45 | "@types/yargs": "^17.0.33", 46 | "ora": "^8.1.1", 47 | "ts-node": "^10.9.2", 48 | "typescript": "^5.7.2" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/commit-ui.ts: -------------------------------------------------------------------------------- 1 | import blessed from 'blessed' 2 | 3 | export class CommitSelector { 4 | private screen: blessed.Widgets.Screen 5 | private form: blessed.Widgets.FormElement> 6 | private radioset: blessed.Widgets.RadioSetElement 7 | private resolveMessage?: (value: string | null) => void 8 | private messages: string[] = [] 9 | private readonly ITEM_SPACING = 2 10 | 11 | constructor() { 12 | this.screen = blessed.screen({ 13 | smartCSR: true, 14 | title: 'Select Commit Message' 15 | }) 16 | 17 | this.form = blessed.form>({ 18 | parent: this.screen, 19 | width: '90%', 20 | height: '90%', 21 | top: 1, 22 | left: 'center', 23 | keys: true, 24 | vi: true 25 | }) 26 | 27 | blessed.box({ 28 | parent: this.form, 29 | top: 1, 30 | left: 2, 31 | right: 2, 32 | height: 1, 33 | content: 'Select Commit Message (↑↓ to select, Enter to check/submit)', 34 | style: { 35 | fg: 'white' 36 | } 37 | }) 38 | 39 | this.radioset = blessed.radioset({ 40 | parent: this.form, 41 | top: 4, 42 | left: 2, 43 | right: 2, 44 | height: 'shrink', 45 | style: { 46 | bg: 'default' 47 | }, 48 | }) as blessed.Widgets.RadioSetElement 49 | 50 | this.setupKeys() 51 | } 52 | 53 | private setupKeys(): void { 54 | this.screen.key(['escape', 'C-c'], () => { 55 | this.screen.destroy() 56 | if (this.resolveMessage) { 57 | this.resolveMessage(null) 58 | } 59 | }) 60 | 61 | this.screen.key(['enter'], () => { 62 | const focused = this.screen.focused as blessed.Widgets.RadioButtonElement 63 | const focusedContainer = this.radioset.children.find(container => 64 | container.children[0] === focused 65 | ) 66 | const focusedIndex = this.radioset.children.indexOf(focusedContainer!) 67 | 68 | if (focusedIndex === this.getSelectedIndex()) { 69 | this.screen.destroy() 70 | this.resolveMessage?.(this.messages[focusedIndex]) 71 | } else { 72 | this.radioset.children.forEach((container, idx) => { 73 | (container.children[0] as blessed.Widgets.RadioButtonElement).checked = idx === focusedIndex 74 | }) 75 | this.screen.render() 76 | } 77 | }) 78 | } 79 | 80 | public showMessages(messages: string[]): Promise { 81 | return new Promise((resolve) => { 82 | this.resolveMessage = resolve 83 | this.messages = messages 84 | 85 | this.radioset.children.forEach(child => child.destroy()) 86 | 87 | messages.forEach((message, index) => { 88 | const container = blessed.box({ 89 | parent: this.radioset, 90 | top: index * this.ITEM_SPACING, 91 | left: 0, 92 | height: this.ITEM_SPACING, 93 | width: '100%-2' 94 | }) 95 | 96 | const radio = blessed.radiobutton({ 97 | parent: container, 98 | top: 0, 99 | left: 0, 100 | height: 1, 101 | content: ' ' + message, 102 | checked: index === 0, 103 | mouse: true, 104 | style: { 105 | bg: 'default' 106 | }, 107 | }) 108 | 109 | radio.on('click', () => { 110 | const radios = this.radioset.children.map(container => 111 | container.children[0] as blessed.Widgets.RadioButtonElement 112 | ) 113 | radios.forEach((r, idx) => { 114 | r.checked = r === radio 115 | }) 116 | this.screen.render() 117 | }) 118 | }) 119 | 120 | const firstRadio = (this.radioset.children[0].children[0]) as blessed.Widgets.RadioButtonElement 121 | if (firstRadio) { 122 | firstRadio.focus() 123 | } 124 | 125 | this.screen.render() 126 | }) 127 | } 128 | 129 | private getSelectedIndex(): number { 130 | return this.radioset.children.findIndex(container => 131 | (container.children[0] as blessed.Widgets.RadioButtonElement).checked 132 | ) 133 | } 134 | } -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import * as fs from "fs" 2 | import * as path from "path" 3 | 4 | interface Config { 5 | readonly providerApiKey: string 6 | readonly messageSpec: string 7 | readonly provider: string 8 | readonly providerUrl: string 9 | readonly sizeOption: number 10 | readonly model: string 11 | } 12 | 13 | function createDefaultConfig(): Config { 14 | return { 15 | provider: "", 16 | providerApiKey: "", 17 | providerUrl: "", 18 | messageSpec: "More tech detailing and comprehensive in one line message.", 19 | sizeOption: 3, 20 | model: "gemini-2.0-flash-exp" 21 | } 22 | } 23 | 24 | function getConfigPath(): string { 25 | const homeDir = process.env.HOME || process.env.USERPROFILE 26 | return path.join(homeDir!, ".commitahconfig-v2") 27 | } 28 | 29 | export function loadConfig(): Config { 30 | const configPath = getConfigPath() 31 | 32 | if (!fs.existsSync(configPath)) { 33 | console.warn("Config file not found, creating default config.") 34 | saveConfig(createDefaultConfig()) 35 | return createDefaultConfig() 36 | } 37 | 38 | try { 39 | const fileContent = fs.readFileSync(configPath, "utf8") 40 | const parsedConfig = JSON.parse(fileContent) as Partial 41 | 42 | return { ...createDefaultConfig(), ...parsedConfig } 43 | } catch (error) { 44 | console.error("Failed to load config file, using default config.", error) 45 | return createDefaultConfig() 46 | } 47 | } 48 | 49 | function saveConfig(config: Config): void { 50 | const configPath = getConfigPath() 51 | 52 | try { 53 | fs.writeFileSync(configPath, JSON.stringify(config, null, 4), "utf8") 54 | console.log("Config file saved successfully at:", configPath) 55 | } catch (error) { 56 | console.error("Failed to save config file.", error) 57 | } 58 | } 59 | 60 | export function updateConfig(newConfig: Partial): Config { 61 | const currentConfig = loadConfig() 62 | const updatedConfig = { ...currentConfig, ...newConfig } 63 | saveConfig(updatedConfig) 64 | return updatedConfig 65 | } -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | process.removeAllListeners('warning') 4 | 5 | import { main } from "./script.js"; 6 | 7 | 8 | await main() -------------------------------------------------------------------------------- /src/script.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk" 2 | import figlet from "figlet" 3 | import yargs from "yargs" 4 | import ora from 'ora' 5 | import OpenAI from 'openai' 6 | import { $ } from "zx/core" 7 | import { loadConfig } from "./config.js" 8 | import { checkForUpdates } from './updater.js' 9 | import { zodResponseFormat } from "openai/helpers/zod" 10 | import { z } from "zod" 11 | import { ConfigProviderForm } from "./wizard.js" 12 | import { exit } from "process" 13 | import { CommitSelector } from "./commit-ui.js" 14 | 15 | const CommitMessage = z.object({ 16 | messages: z.array(z.object({ 17 | message: z.string() 18 | })) 19 | }) 20 | 21 | interface DiffCommit { 22 | diff: string | null 23 | prevCommit: string | null 24 | error: string | null 25 | } 26 | 27 | const argv = await yargs(process.argv.slice(2)).options({ 28 | config: { 29 | type: 'boolean', 30 | default: false 31 | }, 32 | configUpdate: { 33 | name: 'config-update', 34 | type: 'boolean', 35 | default: false 36 | }, 37 | show: { 38 | type: 'boolean', 39 | default: false 40 | } 41 | }).parseAsync() 42 | 43 | export async function main() { 44 | console.log(chalk.red(figlet.textSync('Commit Ah!'))) 45 | 46 | await checkForUpdates() 47 | 48 | if (argv.config) { 49 | await showCurrentConfig() 50 | } else if (argv.configUpdate) { 51 | await promptAndUpdateConfig() 52 | } else { 53 | start(argv.show) 54 | } 55 | } 56 | 57 | async function start(show: boolean) { 58 | await checkproviderApiKey() 59 | 60 | const diff = await getGitDiff() 61 | const colors = [chalk.red, chalk.yellow, chalk.green, chalk.blue, chalk.magenta, chalk.cyan] 62 | 63 | if (diff.diff) { 64 | const spinner = ora({ 65 | text: 'Generating commit..', 66 | spinner: { 67 | interval: 80, 68 | frames: Array.from({ length: colors.length }, (_, i) => { 69 | const color = colors[i] 70 | return color(i % 2 === 0 ? '✦' : '✧') 71 | }) 72 | } 73 | }) 74 | 75 | const diffAsContext = JSON.stringify(diff.diff) 76 | const prevCommit = diff.prevCommit ? JSON.stringify(diff.prevCommit) : '' 77 | 78 | spinner.start() 79 | const textCommitMessage = await generateCommitMessages(diffAsContext, prevCommit) 80 | spinner.stop() 81 | 82 | try { 83 | const selector = new CommitSelector() 84 | const answer = await selector.showMessages(textCommitMessage) 85 | 86 | if (answer === null) { 87 | console.log(chalk.yellow('Commit selection cancelled')) 88 | return 89 | } 90 | 91 | if (show) { 92 | console.log(chalk.green(`\n '${answer}'\n`)) 93 | } else { 94 | spinner.text = 'Git committing...' 95 | spinner.start() 96 | 97 | const commitMessage: string = answer 98 | 99 | const gitCommit = await $`git commit -m ${commitMessage}`.nothrow().quiet() 100 | const commitOutput = gitCommit.stdout.trim() 101 | if (gitCommit.exitCode !== 0) { 102 | spinner.fail(`Something error: ${commitOutput}`) 103 | } else { 104 | spinner.succeed(commitOutput) 105 | } 106 | } 107 | } catch (error) { 108 | console.log(error) 109 | spinner.fail('Something error') 110 | } 111 | 112 | } else { 113 | console.error('Something went wrong. Make sure there are staged changes using "git add".') 114 | process.exit(0) 115 | } 116 | } 117 | 118 | async function showCurrentConfig() { 119 | const currentConfigString = ` 120 | 121 | Provider : ${loadConfig().provider} 122 | Provider URL : ${loadConfig().providerUrl} 123 | Provider API key : ${loadConfig().providerApiKey} 124 | AI Model : ${loadConfig().model} 125 | Message Specification : ${loadConfig().messageSpec} 126 | Output count : ${loadConfig().sizeOption} 127 | 128 | ` 129 | console.log(currentConfigString) 130 | } 131 | 132 | async function promptAndUpdateConfig() { 133 | const configForm = new ConfigProviderForm() 134 | await configForm.run() 135 | 136 | console.log("Configuration updated successfully:", loadConfig()) 137 | } 138 | 139 | async function getGitDiff(): Promise { 140 | let diffCommit: DiffCommit = { 141 | diff: null, 142 | prevCommit: null, 143 | error: null 144 | } 145 | 146 | try { 147 | const isGitInstalled = await $`git --version`.nothrow().quiet() 148 | if (isGitInstalled.exitCode !== 0) { 149 | console.error("Error: Git is not installed or not found in PATH.") 150 | diffCommit.error = "Error: Git is not installed or not found in PATH." 151 | return diffCommit 152 | } 153 | 154 | const isInsideGitRepo = await $`git rev-parse --is-inside-work-tree`.nothrow().quiet() 155 | if (isInsideGitRepo.exitCode !== 0) { 156 | console.error("Error: Not a git repository. Please initialize git with 'git init'.") 157 | diffCommit.error = "Error: Not a git repository. Please initialize git with 'git init'." 158 | return diffCommit 159 | } 160 | 161 | const hasPreviousCommit = await $`git rev-list --max-count=1 HEAD`.nothrow().quiet() 162 | 163 | if (hasPreviousCommit.exitCode !== 0) { 164 | const diffResult = await $`git diff --staged --unified=5 --color=never`.nothrow().quiet() 165 | diffCommit.diff = diffResult.stdout.trim() 166 | diffCommit.prevCommit = 'Initial commit' 167 | return diffCommit 168 | } 169 | 170 | const diffResult = await $`git diff --staged --unified=5 --color=never`.nothrow().quiet() 171 | const prevCommits = await $`git log --pretty=format:"%s"`.nothrow().quiet() 172 | diffCommit.error = null 173 | diffCommit.diff = diffResult.stdout.trim() 174 | diffCommit.prevCommit = prevCommits.stdout.trim() 175 | return diffCommit 176 | 177 | } catch (error) { 178 | console.error("An error occurred:", error) 179 | diffCommit.error = "An error occurred" 180 | return diffCommit 181 | } 182 | } 183 | 184 | async function checkproviderApiKey() { 185 | 186 | if (!loadConfig().providerApiKey || !loadConfig().providerUrl) { 187 | const configForm = new ConfigProviderForm() 188 | await configForm.run() 189 | 190 | if (!loadConfig().providerApiKey || !loadConfig().providerUrl) { 191 | console.error('Provider not set, exiting...') 192 | exit(0) 193 | } 194 | } 195 | 196 | } 197 | 198 | async function generateCommitMessages(diff: string, prevCommit: string): Promise { 199 | const config = loadConfig() 200 | let baseUrl = config.providerUrl 201 | 202 | if (!isURL(baseUrl)) { 203 | console.error(`\nUrl provider is broken! Please run 'commitah --config-update' and re-config again.`) 204 | exit(0) 205 | } 206 | 207 | if (config.provider === 'Ollama') { 208 | const ollamaBaseUrl = config.providerUrl + '/v1' 209 | baseUrl = ollamaBaseUrl.replace(/([^:])\/\/+/g, '$1/').replace(/(\/v1)(?:\/v1)+/g, '$1') 210 | } 211 | 212 | const openai = new OpenAI({ 213 | baseURL: baseUrl, 214 | apiKey: config.providerApiKey 215 | }) 216 | 217 | const systemMessage = ` 218 | You are an expert at analyzing the git diff changes. 219 | 220 | Follow these rules for commit messages: 221 | 1. Format: [scope]([optional context]): 222 | 223 | 2. Follow Conventional Commits rules with scope types 224 | 225 | 3. Message should be minimum 90 characters and maximum 110 characters 226 | 227 | 4. Message should be more highly technical, include file name or function 228 | 229 | Follow this additional rules: ${config.messageSpec} 230 | ` 231 | 232 | try { 233 | const completion = await openai.beta.chat.completions.parse({ 234 | model: config.model || "gpt-4", 235 | messages: [ 236 | { 237 | role: "system", 238 | content: systemMessage 239 | }, 240 | { 241 | role: "user", 242 | content: `Previous commits: ${prevCommit}\nCurrent diff: ${diff}\nProvide ${config.sizeOption} alternative commit message options following conventional commit format and previous commits.` 243 | } 244 | ], 245 | response_format: zodResponseFormat(CommitMessage, "commitSuggestions") 246 | }).catch(error => { 247 | if (error.status === 401) { 248 | console.error(`Authentication error: Invalid API key for ${config.provider}`) 249 | exit(1) 250 | } 251 | if (error.status === 404) { 252 | console.error(`Model ${config.model} not found in ${config.provider}`) 253 | exit(1) 254 | } 255 | if (error.status === 429) { 256 | console.error(`Rate limit exceeded for ${config.provider}`) 257 | exit(1) 258 | } 259 | throw error 260 | }) 261 | 262 | if (!completion) { 263 | console.error(`Failed to get response from ${config.provider}`) 264 | exit(1) 265 | } 266 | 267 | const parsed = completion.choices[0]?.message?.parsed 268 | if (!parsed) { 269 | console.error(`No parsed result from ${config.provider}`) 270 | exit(1) 271 | } 272 | 273 | return parsed.messages.map(item => item.message) 274 | } catch (error) { 275 | console.error(`Error generating commit messages from ${config.provider}:`, error) 276 | exit(1) 277 | } 278 | } 279 | 280 | function isURL(string: string): boolean { 281 | const urlRegex = /^(https?:\/\/)?(www\.)?([a-zA-Z0-9\-\.]+\.)+([a-zA-Z0-9\-\/]+)([/?#]*)*$/; 282 | return urlRegex.test(string); 283 | } -------------------------------------------------------------------------------- /src/updater.ts: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch' 2 | import { exec } from 'child_process' 3 | import { promisify } from 'util' 4 | 5 | interface NpmRegistryResponse { 6 | 'dist-tags': { 7 | latest: string 8 | } 9 | } 10 | 11 | const execAsync = promisify(exec) 12 | const PACKAGE_NAME = 'commitah' 13 | 14 | async function getCurrentVersion(): Promise { 15 | try { 16 | const { stdout } = await execAsync(`${PACKAGE_NAME} --version`) 17 | return stdout.trim() 18 | } catch (error) { 19 | console.error('Error getting current version:', error) 20 | return '0.0.0' 21 | } 22 | } 23 | 24 | export async function checkForUpdates(): Promise { 25 | try { 26 | const currentVersion = await getCurrentVersion() 27 | const response = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}`) 28 | if (!response.ok) { 29 | throw new Error(`HTTP error! Status: ${response.status}`) 30 | } 31 | 32 | const data = await response.json() as NpmRegistryResponse 33 | const latestVersion = data['dist-tags'].latest 34 | 35 | if (isNewVersionAvailable(currentVersion, latestVersion)) { 36 | console.log(`New version available: ${latestVersion}. Updating...`) 37 | await updatePackage() 38 | console.log('Update completed. Please restart the script.') 39 | process.exit(0) 40 | } 41 | } catch (error) { 42 | console.error("Error checking for updates:", error) 43 | } 44 | } 45 | 46 | function isNewVersionAvailable(currentVersion: string, latestVersion: string): boolean { 47 | const currentParts = currentVersion.split('.').map(Number) 48 | const latestParts = latestVersion.split('.').map(Number) 49 | 50 | for (let i = 0; i < latestParts.length; i++) { 51 | if (latestParts[i] > (currentParts[i] || 0)) { 52 | return true 53 | } 54 | if (latestParts[i] < (currentParts[i] || 0)) { 55 | return false 56 | } 57 | } 58 | return false 59 | } 60 | 61 | async function updatePackage(): Promise { 62 | try { 63 | await execAsync(`npm install -g ${PACKAGE_NAME}@latest`) 64 | console.log('Package updated successfully.') 65 | } catch (error) { 66 | console.error('Error updating package:', error) 67 | } 68 | } -------------------------------------------------------------------------------- /src/wizard.ts: -------------------------------------------------------------------------------- 1 | // wizard.ts 2 | import blessed from 'blessed' 3 | import { loadConfig, updateConfig } from './config.js' 4 | 5 | interface FormData { 6 | provider: string 7 | apiKey: string 8 | model: string 9 | resultCount: string 10 | } 11 | 12 | type FocusableElement = blessed.Widgets.RadioButtonElement | blessed.Widgets.TextboxElement | blessed.Widgets.ButtonElement 13 | 14 | export class ConfigProviderForm { 15 | screen: blessed.Widgets.Screen 16 | private form: blessed.Widgets.FormElement 17 | private textboxes: Map = new Map() 18 | private textLabels: Map = new Map() 19 | private submitButton!: blessed.Widgets.ButtonElement 20 | private radioset!: blessed.Widgets.RadioSetElement 21 | private providers = [ 22 | 'OpenAI', 23 | 'Gemini', 24 | 'DeepSeek', 25 | 'Ollama', 26 | 'Custom' 27 | ] 28 | private resolveForm?: (value: boolean) => void 29 | 30 | constructor() { 31 | this.screen = blessed.screen({ 32 | smartCSR: true, 33 | title: 'Commitah AI Provider Configuration' 34 | }) 35 | 36 | this.form = blessed.form({ 37 | parent: this.screen, 38 | width: '90%', 39 | height: '90%', 40 | top: 1, 41 | left: 'center', 42 | keys: true, 43 | vi: true 44 | }) as blessed.Widgets.FormElement 45 | 46 | blessed.box({ 47 | parent: this.form, 48 | top: 0, 49 | left: 2, 50 | right: 0, 51 | height: 1, 52 | content: 'Commitah AI Provider Configuration' 53 | }) 54 | 55 | this.createRadioFields() 56 | this.createFields() 57 | this.createButton() 58 | this.setupKeys() 59 | } 60 | 61 | private createRadioFields(): void { 62 | blessed.text({ 63 | parent: this.form, 64 | top: 2, 65 | left: 2, 66 | content: 'Provider:', 67 | height: 1 68 | }) 69 | 70 | this.radioset = blessed.radioset({ 71 | parent: this.form, 72 | top: 2, 73 | left: 25, 74 | height: 6 75 | }) as blessed.Widgets.RadioSetElement 76 | 77 | let radioTop = 0 78 | this.providers.forEach((provider, index) => { 79 | const radio = blessed.radiobutton({ 80 | parent: this.radioset, 81 | top: radioTop, 82 | left: 0, 83 | height: 1, 84 | content: provider, 85 | checked: index === 0 86 | }) 87 | 88 | radio.on('check', () => { 89 | this.updateFields(provider) 90 | }) 91 | 92 | radioTop += 1 93 | }) 94 | } 95 | 96 | private updateFields(provider: string): void { 97 | const apiKeyLabel = this.textLabels.get('apiKey') 98 | const modelLabel = this.textLabels.get('model') 99 | const apiKeyField = this.textboxes.get('apiKey') 100 | const modelField = this.textboxes.get('model') 101 | const resultCountLabel = this.textLabels.get('resultCount') 102 | const resultCountField = this.textboxes.get('resultCount') 103 | 104 | const customUrlLabel = this.textLabels.get('customUrl') 105 | const customApiKeyLabel = this.textLabels.get('customApiKey') 106 | const customUrlField = this.textboxes.get('customUrl') 107 | const customApiKeyField = this.textboxes.get('customApiKey') 108 | 109 | // Toggle visibility based on provider 110 | if (provider === 'Custom') { 111 | // Hide standard apiKey field 112 | apiKeyLabel?.hide() 113 | apiKeyField?.hide() 114 | // Show custom fields 115 | customUrlLabel?.show() 116 | customApiKeyLabel?.show() 117 | customUrlField?.show() 118 | customApiKeyField?.show() 119 | // Keep model and result count visible 120 | modelLabel?.show() 121 | modelField?.show() 122 | resultCountLabel?.show() 123 | resultCountField?.show() 124 | } else { 125 | // Show standard fields 126 | apiKeyLabel?.show() 127 | apiKeyField?.show() 128 | modelLabel?.show() 129 | modelField?.show() 130 | resultCountLabel?.show() 131 | resultCountField?.show() 132 | // Hide custom fields 133 | customUrlLabel?.hide() 134 | customApiKeyLabel?.hide() 135 | customUrlField?.hide() 136 | customApiKeyField?.hide() 137 | 138 | if (apiKeyLabel) { 139 | apiKeyLabel.setContent(provider === 'Ollama' ? 'Ollama URL:' : `${provider} API Key:`) 140 | } 141 | } 142 | 143 | // Update model field for all providers 144 | if (modelField) { 145 | switch (provider) { 146 | case 'OpenAI': 147 | modelField.setValue('gpt-4-turbo-preview') 148 | break 149 | case 'Gemini': 150 | modelField.setValue('gemini-1.5-flash') 151 | break 152 | case 'DeepSeek': 153 | modelField.setValue('deepseek-chat') 154 | break 155 | case 'Ollama': 156 | modelField.setValue('llama3.2') 157 | break 158 | case 'Custom': 159 | // Keep existing value or clear it 160 | modelField.setValue(modelField.value || '') 161 | break 162 | } 163 | } 164 | 165 | this.screen.render() 166 | } 167 | 168 | private createFields(): void { 169 | const currentConfig = loadConfig() 170 | const initialProvider = currentConfig.provider || 'OpenAI' 171 | 172 | // Create standard fields with model field first 173 | const fields = [ 174 | { 175 | name: 'model', 176 | label: 'Model:', 177 | value: currentConfig.model || '', 178 | top: 8 179 | }, 180 | { 181 | name: 'apiKey', 182 | label: initialProvider === 'Ollama' ? 'Ollama URL:' : `${initialProvider} API Key:`, 183 | top: 10, 184 | value: initialProvider === 'Ollama' ? currentConfig.providerUrl : currentConfig.providerApiKey 185 | }, 186 | { 187 | name: 'resultCount', 188 | label: 'Result count:', 189 | value: currentConfig.sizeOption?.toString() || '1', 190 | top: 14 // Moved down to accommodate custom fields 191 | } 192 | ] 193 | 194 | fields.forEach(field => { 195 | const textLabel = blessed.text({ 196 | parent: this.form, 197 | top: field.top, 198 | left: 2, 199 | content: field.label, 200 | height: 1 201 | }) 202 | 203 | const textbox = blessed.textbox({ 204 | parent: this.form, 205 | name: field.name, 206 | top: field.top, 207 | left: 25, 208 | right: 2, 209 | height: 1, 210 | style: { 211 | focus: { 212 | bg: 'blue', 213 | fg: 'white' 214 | } 215 | }, 216 | inputOnFocus: true, 217 | value: field.value, 218 | 219 | }) as blessed.Widgets.TextboxElement 220 | 221 | textbox.key('enter', () => { 222 | const nextField = this.getNextVisibleField(field.name) 223 | if (nextField) { 224 | nextField.focus() 225 | } else { 226 | this.submitButton.focus() 227 | } 228 | }) 229 | 230 | this.textboxes.set(field.name, textbox) 231 | this.textLabels.set(field.name, textLabel) 232 | }) 233 | 234 | // Add custom provider fields after model field 235 | const customFields = [ 236 | { 237 | name: 'customUrl', 238 | label: 'Custom URL:', 239 | top: 10, 240 | value: currentConfig.provider === 'Custom' ? currentConfig.providerUrl : '', 241 | }, 242 | { 243 | name: 'customApiKey', 244 | label: 'Custom API Key:', 245 | top: 12, 246 | value: currentConfig.provider === 'Custom' ? currentConfig.providerApiKey : '', 247 | } 248 | ] 249 | 250 | customFields.forEach(field => { 251 | const textLabel = blessed.text({ 252 | parent: this.form, 253 | top: field.top, 254 | left: 2, 255 | content: field.label, 256 | height: 1 257 | }) 258 | 259 | const textbox = blessed.textbox({ 260 | parent: this.form, 261 | name: field.name, 262 | top: field.top, 263 | left: 25, 264 | right: 2, 265 | height: 1, 266 | style: { 267 | focus: { 268 | bg: 'blue', 269 | fg: 'white' 270 | } 271 | }, 272 | inputOnFocus: true, 273 | value: field.value, 274 | }) as blessed.Widgets.TextboxElement 275 | 276 | textbox.key('enter', () => { 277 | const nextField = this.getNextVisibleField(field.name) 278 | if (nextField) { 279 | nextField.focus() 280 | } else { 281 | this.submitButton.focus() 282 | } 283 | }) 284 | 285 | this.textboxes.set(field.name, textbox) 286 | this.textLabels.set(field.name, textLabel) 287 | 288 | // Initially hide custom fields if not Custom provider 289 | if (initialProvider !== 'Custom') { 290 | textLabel.hide() 291 | textbox.hide() 292 | } 293 | }) 294 | 295 | // Initialize radio button state for Custom provider 296 | if (initialProvider === 'Custom') { 297 | const radioButtons = this.radioset.children as blessed.Widgets.RadioButtonElement[] 298 | radioButtons.forEach(radio => { 299 | if (radio.content === 'Custom') { 300 | radio.check() 301 | } 302 | }) 303 | // Hide standard apiKey field 304 | this.textLabels.get('apiKey')?.hide() 305 | this.textboxes.get('apiKey')?.hide() 306 | } 307 | } 308 | 309 | private getNextVisibleField(currentFieldName: string): blessed.Widgets.TextboxElement | null { 310 | const fields = Array.from(this.textboxes.entries()) 311 | const currentIndex = fields.findIndex(([name]) => name === currentFieldName) 312 | 313 | for (let i = currentIndex + 1; i < fields.length; i++) { 314 | const [, field] = fields[i] 315 | if (!field.hidden) { 316 | return field 317 | } 318 | } 319 | return null 320 | } 321 | 322 | private createButton(): void { 323 | this.submitButton = blessed.button({ 324 | parent: this.form, 325 | bottom: 3, 326 | left: 'center', 327 | content: '[ Submit ]', 328 | style: { 329 | focus: { 330 | bg: 'blue', 331 | fg: 'white' 332 | } 333 | }, 334 | height: 1, 335 | width: 12, 336 | mouse: true, 337 | keys: true, 338 | padding: { 339 | left: 1, 340 | right: 1 341 | } 342 | }) as blessed.Widgets.ButtonElement 343 | 344 | this.submitButton.key('enter', () => { 345 | let selectedProvider = '' 346 | const radios = this.radioset.children as blessed.Widgets.RadioButtonElement[] 347 | radios.forEach((radio, index) => { 348 | if (radio.checked) { 349 | selectedProvider = this.providers[index] 350 | } 351 | }) 352 | 353 | const formData: FormData = { 354 | provider: selectedProvider, 355 | apiKey: this.textboxes.get('apiKey')?.value || '', 356 | model: this.textboxes.get('model')?.value || '', 357 | resultCount: this.textboxes.get('resultCount')?.value || '1' 358 | } 359 | 360 | const configUpdate: any = { 361 | model: formData.model, // Model is always saved from the model field 362 | sizeOption: parseInt(formData.resultCount, 10) || 1, 363 | messageSpec: "conventional commit", 364 | provider: selectedProvider 365 | } 366 | 367 | if (formData.provider === 'Ollama') { 368 | configUpdate.providerUrl = formData.apiKey 369 | configUpdate.providerApiKey = 'ollama' 370 | } else if (formData.provider === 'Custom') { 371 | configUpdate.providerUrl = this.textboxes.get('customUrl')?.value || '' 372 | configUpdate.providerApiKey = this.textboxes.get('customApiKey')?.value || '' 373 | } else { 374 | let baseUrl = '' 375 | switch (formData.provider) { 376 | case 'OpenAI': 377 | baseUrl = 'https://api.openai.com/v1' 378 | break 379 | case 'Gemini': 380 | baseUrl = 'https://generativelanguage.googleapis.com/v1beta/openai/' 381 | break 382 | case 'DeepSeek': 383 | baseUrl = 'https://api.deepseek.com/v1' 384 | break 385 | } 386 | 387 | configUpdate.providerUrl = baseUrl 388 | configUpdate.providerApiKey = formData.apiKey 389 | } 390 | 391 | updateConfig(configUpdate) 392 | 393 | this.screen.destroy() 394 | if (this.resolveForm) { 395 | this.resolveForm(true) 396 | } 397 | }) 398 | } 399 | 400 | private setupKeys(): void { 401 | this.screen.key(['escape', 'C-c'], () => { 402 | this.screen.destroy() 403 | if (this.resolveForm) { 404 | this.resolveForm(false) 405 | } 406 | }) 407 | 408 | this.screen.key(['tab'], () => { 409 | const elements: FocusableElement[] = [ 410 | ...(this.radioset.children as blessed.Widgets.RadioButtonElement[]), 411 | ...Array.from(this.textboxes.values()), 412 | this.submitButton 413 | ] 414 | 415 | const focused = this.screen.focused as FocusableElement 416 | const currentIndex = elements.indexOf(focused) 417 | const nextIndex = (currentIndex + 1) % elements.length 418 | elements[nextIndex].focus() 419 | }) 420 | } 421 | public run(): Promise { 422 | return new Promise((resolve) => { 423 | this.resolveForm = resolve 424 | const firstRadio = this.radioset.children[0] as blessed.Widgets.RadioButtonElement 425 | if (firstRadio) { 426 | firstRadio.focus() 427 | } 428 | this.screen.render() 429 | }) 430 | } 431 | 432 | public waitForKey( 433 | keys: string[] 434 | ): Promise { 435 | return new Promise((resolve) => { 436 | this.screen.key(keys, () => { 437 | resolve() 438 | }) 439 | }) 440 | } 441 | 442 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "ESNext", 5 | "strict": true, 6 | "esModuleInterop": true, 7 | "moduleResolution": "node", 8 | "outDir": "dist", 9 | "rootDir": "src", 10 | "types": [ 11 | "zx" 12 | ] 13 | }, 14 | "include": [ 15 | "src/**/*.ts" 16 | , "src/script.mjs" ], 17 | "exclude": [ 18 | "node_modules" 19 | ] 20 | } --------------------------------------------------------------------------------