├── .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 | |  |
16 |
17 | | AI Provider on configuration v2 |
18 | | ---- |
19 | |  |
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 | }
--------------------------------------------------------------------------------