├── .github └── workflows │ └── publish.yml ├── .gitignore ├── .npmrc ├── .prettierrc ├── .vscode ├── launch.json └── settings.json ├── LICENSE ├── README.md ├── ai!.js ├── ai.js ├── aic!.js ├── aic.js ├── aiq!.js ├── aiq.js ├── eslint.config.js ├── lib ├── aiClient │ ├── adapters │ │ ├── BaseAdapter.js │ │ ├── OllamaAdapter.js │ │ └── OpenAIAdapter.js │ └── aiClient.js ├── cli.js ├── config.js ├── logger.js └── prompts │ ├── CommandPrompt.js │ ├── Prompt.js │ ├── PromptFormatter.js │ └── QueryPrompt.js ├── package-lock.json ├── package.json └── prompts ├── command ├── default.hbs └── llama3:8b.hbs └── query └── default.hbs /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish to npm 2 | 3 | on: 4 | push: 5 | branches: main 6 | 7 | permissions: 8 | contents: write 9 | 10 | jobs: 11 | publish: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | 16 | - uses: actions/setup-node@v3 17 | with: 18 | node-version: "18" 19 | 20 | - run: npm ci 21 | 22 | - name: Get current npm version 23 | id: current_version 24 | run: | 25 | CURRENT_VERSION=$(node -p 'require(`./package.json`).version') 26 | echo "current_version=${CURRENT_VERSION}" >> $GITHUB_ENV 27 | echo "Current npm version: ${CURRENT_VERSION}" 28 | 29 | - name: Get previous npm version 30 | id: previous_version 31 | run: | 32 | PREV_VERSION=$(npm show $(node -p 'require(`./package.json`).name') version) 33 | echo "prev_version=${PREV_VERSION}" >> $GITHUB_ENV 34 | echo "Previous npm version: ${PREV_VERSION}" 35 | 36 | - name: Check version change 37 | id: version_check 38 | run: | 39 | if [ "${{ env.current_version }}" != "${{ env.prev_version }}" ]; then 40 | echo "changed=true" >> $GITHUB_ENV 41 | else 42 | echo "changed=false" >> $GITHUB_ENV 43 | fi 44 | echo "Version changed: ${{ env.changed }}" 45 | 46 | - name: Publish to npm 47 | if: env.changed == 'true' 48 | uses: JS-DevTools/npm-publish@v3 49 | with: 50 | token: ${{ secrets.NPM_TOKEN }} 51 | 52 | - name: Create GitHub Release 53 | if: env.changed == 'true' 54 | uses: actions/create-release@v1 55 | with: 56 | tag_name: v${{ env.current_version }} 57 | release_name: Release v${{ env.current_version }} 58 | body: New release v${{ env.current_version }} 59 | draft: false 60 | prerelease: false 61 | env: 62 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store 3 | .env 4 | .idea/ 5 | dist/ 6 | build/ 7 | *.log 8 | *.tmp 9 | *.swp 10 | *.bak 11 | *.orig 12 | *.sass-cache/ 13 | *.sublime-project 14 | *.sublime-workspace 15 | *.tmproj 16 | *.tmignore 17 | package 18 | /package 19 | *.db 20 | *.db* 21 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | //registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN} 2 | registry=https://registry.npmjs.org/ 3 | always-auth=true 4 | engine-strict=true -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false 4 | } 5 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "type": "node", 6 | "request": "launch", 7 | "name": "aiHelloWorld", 8 | "skipFiles": [ 9 | "/**" 10 | ], 11 | "program": "${workspaceFolder}/ai.js", 12 | "args": [ 13 | "In a directory called hello_world create a nodejs application that says hello world. " 14 | ], 15 | "console": "integratedTerminal" 16 | }, 17 | { 18 | "type": "node", 19 | "request": "launch", 20 | "name": "aiChat", 21 | "skipFiles": [ 22 | "/**" 23 | ], 24 | "program": "${workspaceFolder}/aic.js", 25 | "args": [ 26 | "how much would a woodchuck chuk " 27 | ], 28 | "console": "integratedTerminal" 29 | }, 30 | { 31 | "type": "node", 32 | "request": "launch", 33 | "name": "aiChat", 34 | "skipFiles": [ 35 | "/**" 36 | ], 37 | "program": "${workspaceFolder}/aic!.js", 38 | "args": [ 39 | "how much would a woodchuck chuk " 40 | ], 41 | "console": "integratedTerminal" 42 | }, 43 | { 44 | "type": "node", 45 | "request": "launch", 46 | "name": "aiQUERY", 47 | "skipFiles": [ 48 | "/**" 49 | ], 50 | "program": "${workspaceFolder}/aiq.js", 51 | "args": [ 52 | "mysql show me all the records for transactions" 53 | ], 54 | "console": "integratedTerminal" 55 | }, 56 | { 57 | "type": "node", 58 | "request": "launch", 59 | "name": "aiQUERY delete", 60 | "skipFiles": [ 61 | "/**" 62 | ], 63 | "program": "${workspaceFolder}/aiq.js", 64 | "args": [ 65 | "mysql delete all the transaction records" 66 | ], 67 | "console": "integratedTerminal" 68 | }, 69 | { 70 | "type": "node", 71 | "request": "launch", 72 | "name": "aiQUERY zigbee", 73 | "skipFiles": [ 74 | "/**" 75 | ], 76 | "program": "${workspaceFolder}/aiq.js", 77 | "args": [ 78 | "zigbee.db delete all the transaction records" 79 | ], 80 | "console": "integratedTerminal" 81 | }, 82 | { 83 | "type": "node", 84 | "request": "launch", 85 | "name": "aiConfig", 86 | "skipFiles": [ 87 | "/**" 88 | ], 89 | "program": "${workspaceFolder}/ai.js", 90 | "args": [ 91 | "config" 92 | ], 93 | "console": "integratedTerminal" 94 | } 95 | ] 96 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "rvest.vs-code-prettier-eslint", 3 | "editor.formatOnType": false, // required 4 | "editor.formatOnPaste": true, // optional 5 | "editor.formatOnSave": true, // optional 6 | "editor.formatOnSaveMode": "file", // required to format on save 7 | "files.autoSave": "onFocusChange", // optional but recommended 8 | "vs-code-prettier-eslint.prettierLast": false // set as "true" to run 'prettier' last not first 9 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [2024] [Jason Jacobs] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🎉 Command AI 2 | 3 | ```text 4 | ██████╗ ██████╗ ███╗ ███╗███╗ ███╗ █████╗ ███╗ ██╗██████╗ █████╗ ██╗ 5 | ██╔════╝██╔═══██╗████╗ ████║████╗ ████║██╔══██╗████╗ ██║██╔══██╗██╔══██╗██║ 6 | ██║ ██║ ██║██╔████╔██║██╔████╔██║███████║██╔██╗ ██║██║ ██║███████║██║ 7 | ██║ ██║ ██║██║╚██╔╝██║██║╚██╔╝██║██╔══██║██║╚██╗██║██║ ██║██╔══██║██║ 8 | ╚██████╗╚██████╔╝██║ ╚═╝ ██║██║ ╚═╝ ██║██║ ██║██║ ╚████║██████╔╝██║ ██║██║ 9 | ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═════╝ ╚═╝ ╚═╝╚═╝ 10 | ``` 11 | 12 | [![Maintainability](https://api.codeclimate.com/v1/badges/fb6299a2ae58c7570afa/maintainability)](https://codeclimate.com/github/CommandAI/ai-cli/maintainability) 13 | 14 | 15 | 16 | Welcome to Command AI, your new AI-powered command-line buddies! These programs makes handling tasks a breeze. Whether you need to automate routine tasks, set up new projects, run background operations, or simply start a chat. Just tell it what you want, and it'll get to work. Check out some cool things it can do: 17 | 18 | - **Automate Your Routine Tasks:** Need a cron job that checks your IP and pings a specific URL if it changes? Just ask! 19 | 20 | ```bash 21 | ai "make a cron job that checks my IP and calls https://myipchanged.com when it changes" 22 | ``` 23 | 24 | - **Set Up Projects on the Fly:** Want to start an npm project that spins up a configurable web server greeting you with "hello world"? No problem. 25 | 26 | ```bash 27 | ai "create an npm project in ~/hello-world that starts a webserver saying 'hello world' and reads configs from a .env file" 28 | ``` 29 | 30 | - **Run Background Jobs:** Need to list all the JavaScript files on your computer and save them in a file? It can handle that in the background. 31 | 32 | ```bash 33 | ai "in the background, list all the JS files on this computer and put them in ~/js.txt" 34 | ``` 35 | 36 | - **Query Databases with AI**: Want to interact with a database using natural language? Use `aiq`! Suports MYSQL, Postgres, and SQLite. 37 | 38 | ```bash 39 | aiq my_database "list all users where age is over 30" 40 | ``` 41 | 42 | 43 | - **Start an AI conversation:** Want to have a conversation with an AI? It can do that too. 44 | 45 | ```bash 46 | aic "what is the meaning of life?" 47 | ``` 48 | 49 | Just type your request into the CLI with `ai "your requests here"`, and watch the magic happen. It's like having a personal assistant for your terminal! 50 | 51 | ## 🚧 ALPHA Stage Alert 🚧 52 | 53 | This tool is still in its alpha stage, so expect some hiccups as we fine-tune our prompts for different models. The default settings show you execution plans and descriptions before running scripts to keep you in the loop / safe. 54 | 55 | ## 🔥 Features 56 | 57 | - **AI Service Selection**: Pick between Ollama, ChatGPT, and any OpenAI compatable server. 58 | - **Easy Configuration**: Set everything up quickly with a few prompts. 59 | - **Command Line Power**: Ask the AI to do any task(s) you would want to do at the command line. 60 | - **DB Power**: Ask the AI for any information from your DB in plain language. 61 | - **Conversational AI**: Start a conversation with the AI. 62 | 63 | ## 📋 Requirements 64 | 65 | - Node.js 66 | - npm 67 | 68 | ## 🚀 Installation 69 | 70 | 1. **Install globally via npm**: 71 | 72 | ```bash 73 | npm install -g command-ai 74 | ``` 75 | 76 | 2. **Upgrade**: 77 | 78 | ```bash 79 | ai upgrade 80 | ``` 81 | 82 | ## 🎮 Usage 83 | 84 | ### Initial Setup 85 | 86 | The first time you run it, you’ll set up your AI service and other settings. It saves everything in `~/.commandai/config.json`. 87 | 88 | ```bash 89 | ai 90 | ``` 91 | 92 | ### Provide Command Input 93 | 94 | Type your command either as an argument or enter it when prompted. 95 | 96 | ```bash 97 | ai "your requests here" 98 | 99 | # Example requests (use quotes if your shell needs them): 100 | ai make a cron job that checks my IP and calls https://myipchanged.com when it changes 101 | 102 | ai create an npm project in ~/hello-world that starts a webserver saying "hello world" and reads configs from a .env file 103 | 104 | ai in the background, list all the JS files on this computer and put them in ~/js.txt 105 | 106 | # Start AI Database Query (first param is the database name, second is the query) 107 | aiq my_database "list all users where age is over 30" 108 | # or 109 | aiq my_database "list all users where age is over 30 110 | 111 | # Don't start a AI Database Query Session.. Just get one response in JSON format. 112 | aiq! my_database "list all users where age is over 30" 113 | 114 | # Start an AI conversation 115 | aic "what is the meaning of life?" 116 | 117 | # Get only one response from AI 118 | aic! "what is the meaning of life?" 119 | ``` 120 | 121 | More commands.. 122 | 123 | ```bash 124 | # If you don't provide prompt, `ai` will just ask you to enter it. 125 | ai 126 | 127 | # If you are feeling lucky an exclamation will execute without confirmation. 128 | ai! list all the dot files 129 | 130 | # Reconfigure 131 | ai config 132 | aic config 133 | 134 | #configure db connections 135 | aiq config 136 | 137 | # Upgrade Command AI 138 | ai upgrade 139 | ``` 140 | 141 | ### Execution Plans & Descriptions 142 | 143 | After you enter a command, Command AI will fetch a script and show you the plan and description. You decide if you want to run it! 144 | 145 | ### Logging 146 | 147 | If you turn logging on, commands and results are stored so you can revisit them anytime. (also please turn on and send if you open up a bug ticket) 148 | 149 | ## ⚙️ Configuration 150 | 151 | AI Settings for all utilies are stored at `~/.commandai/config.json`. Here’s what it looks like: 152 | 153 | ```json 154 | { 155 | "aiService": "", // Pick "Ollama" "ChatGPT" "OpenAI" 156 | "ollamaUrl": "", // Ollama server URL 157 | "ollamaModel": "", // Model for Ollama 158 | "openAIApiKey": "", // ChatGPT / OpenAI API key 159 | "openAIModel": "", // Model for OpenAI 160 | "openAIUrl": "", // URL for OpenAI not needed for ChatGPT 161 | "showExecutionDescription": true, // Show descriptions 162 | "showExecutionPlan": true, // Show plans 163 | "enableLogging": false // Enable logging 164 | } 165 | ``` 166 | 167 | DB Settings for `aiq` are stored at `~/.commandai/db.json`. You can setup as many connections as you like. Here’s what it looks like: 168 | 169 | ```json 170 | [ 171 | { 172 | "name": "PostgreSQL_Connection", 173 | "type": "postgres", 174 | "config": { 175 | "user": "postgres_user", 176 | "host": "localhost", 177 | "database": "postgres_db", 178 | "password": "postgres_password", 179 | "port": 5432 180 | } 181 | }, 182 | { 183 | "name": "MySQL_Connection", 184 | "type": "mysql", 185 | "config": { 186 | "user": "mysql_user", 187 | "host": "localhost", 188 | "database": "mysql_db", 189 | "password": "mysql_password", 190 | "port": 3306 191 | } 192 | }, 193 | { 194 | "name": "SQLite_Connection", 195 | "type": "sqlite", 196 | "config": { 197 | "filename": "/path/to/sqlite.db" 198 | } 199 | }, 200 | { 201 | "name": "MSSQL_Connection", 202 | "type": "mssql", 203 | "config": { 204 | "user": "mssql_user", 205 | "host": "localhost", 206 | "database": "mssql_db", 207 | "password": "mssql_password", 208 | "port": 1433 209 | } 210 | } 211 | ] 212 | ``` 213 | 214 | NOTE! sqlite does not require to be in the config you can just list the file as the first param. 215 | 216 | ## 💻 Development 217 | 218 | Want to help out? Great! Clone the repo and install dependencies: 219 | 220 | ```bash 221 | git clone https://github.com/username/command-ai.git 222 | cd command-ai 223 | npm install 224 | ``` 225 | 226 | Run the project: 227 | 228 | ```bash 229 | npm start 230 | ``` 231 | 232 | ## 🤝 Contributing 233 | 234 | We’d love your help! Fork the repo, checkout the `pre-release` branch, make some changes, and send over a pull request. If you want to use the code for your local usage instead of installing it globally, follow these steps: 235 | 236 | 1. **Clone your forked repo:** 237 | ```sh 238 | git clone https://github.com/your-username/command-ai.git 239 | cd command-ai 240 | ``` 241 | 2. **Checkout the `pre-release` branch:** 242 | ```sh 243 | git checkout pre-release 244 | ``` 245 | This branch is where we merge all the new features and bug fixes before they are released. 246 | 3. **Link the project locally:** 247 | ```sh 248 | npm link 249 | ``` 250 | After these steps, you can use the commands (ai, aic, aiq, etc.) from your local development environment without installing the package globally. 251 | 252 | 253 | 254 | ## 📜 License 255 | 256 | This project is licensed under the MIT License. 257 | 258 | --- 259 | 260 | Enjoy making your CLI life easier with Command AI! 261 | -------------------------------------------------------------------------------- /ai!.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import main from "./ai.js"; 4 | 5 | main(false); 6 | -------------------------------------------------------------------------------- /ai.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import inquirer from "inquirer"; 4 | import ora from "ora"; 5 | import gradient from "gradient-string"; 6 | import JSONScript from "jsonscriptlib"; 7 | 8 | import AIClient from "./lib/aiClient/aiClient.js"; 9 | import Logger from "./lib/logger.js"; 10 | 11 | import { getCommand, getConfig, cliCommands } from "./lib/cli.js"; 12 | 13 | const logger = new Logger("command"); 14 | 15 | async function executeScript(script) { 16 | try { 17 | const result = await script.execute(); 18 | 19 | if (result.error) { 20 | logger.error({ error: result.error }, "Execution Error"); 21 | } else { 22 | result.results.forEach((res) => { 23 | if (res.type === "cmd") { 24 | //console.log(res.result); 25 | } else if (res.type === "file") { 26 | console.log(`File ${res.result}`); 27 | } 28 | }); 29 | } 30 | } catch (error) { 31 | console.log(error); 32 | } 33 | } 34 | 35 | async function generateScript(command, config) { 36 | const spinner = ora(gradient.cristal("Thinking...")).start(); 37 | const client = new AIClient(config); 38 | const jsonScript = await client.generateScript(command); 39 | spinner.succeed(gradient.cristal("Ready.")); 40 | console.log(); 41 | logger.info({ jsonScript: JSON.parse(jsonScript) }, "JSON Response logged"); 42 | return jsonScript; 43 | } 44 | 45 | function displayExecutionDescription(script) { 46 | console.log(gradient.cristal("Execution Description:")); 47 | console.log( 48 | script.executionDescription 49 | .map((line) => gradient.teen(line.trim())) 50 | .join("\n"), 51 | ); 52 | console.log(); 53 | } 54 | 55 | function displayExecutionPlan(script) { 56 | console.log(gradient.cristal("Execution Plan:")); 57 | script.executionPlan.forEach((line) => { 58 | line = line.trim(); 59 | if (line.startsWith("Create file:")) { 60 | const coloredLine = line.replace(/^(Create file:)/, ""); 61 | console.log( 62 | gradient.passion("Create file:") + gradient.teen(coloredLine), 63 | ); 64 | } else { 65 | console.log(gradient.teen(line)); 66 | } 67 | }); 68 | console.log(); 69 | } 70 | 71 | function displayExecutionDetails(script, config) { 72 | if (config.showExecutionDescription) { 73 | displayExecutionDescription(script); 74 | } 75 | 76 | if (config.showExecutionPlan) { 77 | displayExecutionPlan(script); 78 | } 79 | } 80 | 81 | async function promptUser() { 82 | const { proceedOption } = await inquirer.prompt([ 83 | { 84 | type: "list", 85 | name: "proceedOption", 86 | message: "Do you want to proceed with the execution?", 87 | choices: [ 88 | { name: "Yes", value: "yes" }, 89 | { name: "No", value: "no" }, 90 | { name: "New Solution", value: "newSolution" }, 91 | ], 92 | }, 93 | ]); 94 | return proceedOption; 95 | } 96 | 97 | async function executeWithRetries( 98 | command, 99 | config, 100 | continuePrompt, 101 | maxRetries = 3, 102 | ) { 103 | let retryCount = 0; 104 | 105 | while (retryCount <= maxRetries) { 106 | try { 107 | await executeScriptFlow(command, config, continuePrompt); 108 | } catch (error) { 109 | handleError(error, retryCount, maxRetries); 110 | retryCount += 1; 111 | } 112 | } 113 | } 114 | 115 | async function executeScriptFlow(command, config, continuePrompt) { 116 | const jsonScript = await generateScript(command, config); 117 | const script = new JSONScript(JSON.parse(jsonScript)); 118 | 119 | displayExecutionDetails(script, config); 120 | 121 | const shouldPromptUser = continuePrompt && command[0] !== "!"; 122 | const proceedOption = shouldPromptUser ? await promptUser() : "yes"; 123 | 124 | if (proceedOption === "yes") { 125 | await executeScript(script); 126 | process.exit(); 127 | } else if (proceedOption === "no") { 128 | logger.info("Execution aborted by user."); 129 | process.exit(); 130 | } 131 | } 132 | 133 | function handleError(error, retryCount, maxRetries) { 134 | logger.error(`An error occurred: ${error.message}`); 135 | if (retryCount >= maxRetries) { 136 | logger.error("Max retries reached. Aborting execution."); 137 | process.exit(1); 138 | } 139 | } 140 | 141 | async function main(continuePrompt = true) { 142 | const command = await getCommand(); 143 | 144 | if(await cliCommands(command)) { 145 | const config = await getConfig(command); 146 | await executeWithRetries(command, config, continuePrompt); 147 | } 148 | } 149 | 150 | 151 | if (!`file://${process.argv[1]}`.includes('!')) { 152 | main(); 153 | } 154 | 155 | export default main; 156 | -------------------------------------------------------------------------------- /aic!.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import main from "./aic.js"; 4 | 5 | main(false); 6 | -------------------------------------------------------------------------------- /aic.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import inquirer from "inquirer"; 4 | import ora from "ora"; 5 | import gradient from "gradient-string"; 6 | 7 | import AIClient from "./lib/aiClient/aiClient.js"; 8 | import Logger from "./lib/logger.js"; 9 | import { getConfig, getCommand } from "./lib/cli.js"; 10 | 11 | import { marked } from "marked"; 12 | import { markedTerminal } from "marked-terminal"; 13 | 14 | const logger = new Logger("chat"); 15 | 16 | function markdownToConsole(text) { 17 | let terminalHighlightedCode = ""; 18 | try { 19 | marked.use(markedTerminal()); 20 | 21 | terminalHighlightedCode = marked(text); //console.log(terminalHighlightedCode); 22 | } catch (error) { 23 | console.error("An error occurred while highlighting code:", error); 24 | } 25 | 26 | return terminalHighlightedCode; 27 | } 28 | 29 | async function askQuestion(question, client) { 30 | const spinner = ora(gradient.cristal("Thinking...")).start(); 31 | try { 32 | const response = await client.generateResponse(question); 33 | spinner.succeed(gradient.cristal("Ready.")); 34 | 35 | console.log(markdownToConsole(response.trim())); 36 | } catch (error) { 37 | spinner.fail(gradient.cristal("Failed to get response.")); 38 | logger.error({ error: error.message }, "Error occurred."); 39 | } 40 | } 41 | 42 | async function chatPrompt() { 43 | const { result } = await inquirer.prompt([ 44 | { 45 | type: "input", 46 | name: "result", 47 | message: ">", 48 | }, 49 | ]); 50 | return result; 51 | } 52 | 53 | async function startConversation(client, initialQuestion) { 54 | let continueConversation = true; 55 | let question = initialQuestion; 56 | 57 | while (continueConversation) { 58 | if (!question) { 59 | question = await chatPrompt(); 60 | } 61 | 62 | if (shouldExitConversation(question)) { 63 | continueConversation = false; 64 | break; 65 | } 66 | 67 | await askQuestion(question, client); 68 | question = null; 69 | } 70 | 71 | console.log(gradient.morning("Goodbye!")); 72 | process.exit(0); 73 | } 74 | 75 | function shouldExitConversation(question) { 76 | const exitWords = new Set(["exit", "goodbye", "quit"]); 77 | return !question || exitWords.has(question.toLowerCase().trim()); 78 | } 79 | 80 | async function main(startConvo = true) { 81 | try { 82 | const command = await getCommand(); 83 | const config = await getConfig(command); 84 | const client = new AIClient(config); 85 | if (startConvo) { 86 | await startConversation(client, command); 87 | } else { 88 | await askQuestion(command, client); 89 | } 90 | process.exit(0); 91 | } catch (error) { 92 | logger.error(`An error occurred: ${error.message}`); 93 | process.exit(1); 94 | } 95 | } 96 | 97 | if (!`file://${process.argv[1]}`.includes('!')) { 98 | main(); 99 | } 100 | 101 | export default main; 102 | -------------------------------------------------------------------------------- /aiq!.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import main from "./aiq.js"; 4 | 5 | main(false); 6 | -------------------------------------------------------------------------------- /aiq.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import fs from "fs"; 4 | import path from "path"; 5 | import inquirer from "inquirer"; 6 | import ora from "ora"; 7 | import gradient from "gradient-string"; 8 | import AIClient from "./lib/aiClient/aiClient.js"; 9 | import { getConfig } from "./lib/cli.js"; 10 | 11 | import { getDatabaseAdapter } from "dbinfoz"; 12 | 13 | const configFilePath = path.resolve(process.env.HOME, ".commandai/db.json"); 14 | 15 | let USE_PROMPT = true; 16 | 17 | function consoleLog(message) { 18 | if (USE_PROMPT) { 19 | console.log(message); 20 | } 21 | } 22 | 23 | async function fileExists(filePath) { 24 | return fs.existsSync(filePath); 25 | } 26 | 27 | async function getConnectionConfig(dbConfigs, nameOrFilePath) { 28 | let dbConfig = dbConfigs.find( 29 | (config) => 30 | config.name === nameOrFilePath || 31 | (config.config && config.config.filename === nameOrFilePath), 32 | ); 33 | 34 | if (!dbConfig) { 35 | if (await fileExists(nameOrFilePath)) { 36 | dbConfig = { type: 'sqlite', config: { filename: nameOrFilePath } }; 37 | } else { 38 | const relativePath = path.resolve(process.cwd(), nameOrFilePath); 39 | 40 | if (await fileExists(relativePath)) { 41 | dbConfig = { type: 'sqlite', config: { filename: relativePath } }; 42 | } else { 43 | throw new Error(`Configuration for ${nameOrFilePath} not found and it's not a file!`); 44 | } 45 | } 46 | } 47 | 48 | return dbConfig; 49 | } 50 | 51 | 52 | async function generateQuery(command, client, dbAdapter) { 53 | let spinner = null; 54 | if (USE_PROMPT) { spinner = ora(gradient.cristal("Thinking...")).start(); } 55 | const queryString = await client.generateQuery(command, dbAdapter); 56 | if (USE_PROMPT) { spinner.succeed(gradient.cristal("Query generated.")); } 57 | 58 | const queryObject = JSON.parse(queryString); 59 | return queryObject; 60 | } 61 | 62 | async function retryQuery(client, dbAdapter) { 63 | const spinner = ora(gradient.cristal("Thinking...")).start(); 64 | const queryString = await client.generateQuery( 65 | "That was invalid sql. Try again. Remember the schemas.", 66 | dbAdapter, 67 | ); 68 | spinner.succeed(gradient.cristal("Query generated.")); 69 | consoleLog(queryString); 70 | 71 | const queryObject = JSON.parse(queryString); 72 | return queryObject; 73 | } 74 | 75 | async function executeQuery(adapter, query) { 76 | return await adapter.runQuery(query); 77 | } 78 | 79 | async function promptUser() { 80 | const { userChoice } = await inquirer.prompt([ 81 | { 82 | type: "list", 83 | name: "userChoice", 84 | message: 85 | "This query will modify the database. Do you want to execute it?", 86 | choices: ["yes", "no"], 87 | }, 88 | ]); 89 | return userChoice; 90 | } 91 | 92 | async function promptUserWithPreview(previewCount = null) { 93 | const message = 94 | previewCount !== null 95 | ? `This query will modify ${previewCount} records. Do you want to execute or preview it?` 96 | : "This query will modify the database. Do you want to execute or preview it?"; 97 | 98 | const { userChoice } = await inquirer.prompt([ 99 | { 100 | type: "list", 101 | name: "userChoice", 102 | message: message, 103 | choices: ["yes", "no", "preview"], 104 | }, 105 | ]); 106 | 107 | return userChoice; 108 | } 109 | 110 | async function validateArguments(args) { 111 | if (args.length === 0) { 112 | return "no-params"; 113 | } 114 | if (args.length === 1) { 115 | return "single-param"; 116 | } 117 | return "execute-query"; 118 | } 119 | 120 | async function setupClient(command) { 121 | const config = await getConfig(command); 122 | return new AIClient(config); 123 | } 124 | 125 | async function getPreviewCount(adapter, previewQuery) { 126 | try { 127 | const result = await executeQuery(adapter, previewQuery); 128 | if ( 129 | Array.isArray(result) && 130 | result.length > 0 && 131 | result[0].count !== undefined 132 | ) { 133 | return result[0].count; 134 | } 135 | return null; 136 | } catch (error) { 137 | console.error(`Error fetching preview count: ${error.message}`); 138 | return null; 139 | } 140 | } 141 | 142 | async function handleQuery(command, client, adapter) { 143 | const queryObj = await generateQuery(command, client, adapter); 144 | consoleLog(gradient.cristal("Generated Query:")); 145 | consoleLog(gradient.teen(queryObj.query)); 146 | return queryObj; 147 | } 148 | 149 | async function checkIfModifyingQuery(query) { 150 | const modifyingStatementsRegex = 151 | /\b(insert|update|delete|drop|alter|create|truncate|replace)\b/i; 152 | return modifyingStatementsRegex.test(query); 153 | } 154 | 155 | async function getUserChoiceForModification(adapter, queryObj) { 156 | const previewCount = await getPreviewCount(adapter, queryObj.preview_count); 157 | return await promptUserWithPreview(previewCount); 158 | } 159 | 160 | async function tryExecutePreviewQuery(adapter, previewQuery) { 161 | try { 162 | const previewResult = await executeQuery(adapter, previewQuery); 163 | console.log(gradient.cristal("Preview Result:")); 164 | console.log(previewResult); 165 | const finalChoice = await promptUser(); 166 | return finalChoice === "yes"; 167 | } catch (error) { 168 | console.error(`Error executing preview query: ${error.message}`); 169 | return false; 170 | } 171 | } 172 | 173 | async function handleUserPrompt(queryObj, adapter) { 174 | if (await checkIfModifyingQuery(queryObj.query)) { 175 | const userChoice = await getUserChoiceForModification(adapter, queryObj); 176 | 177 | if (userChoice === "no") { 178 | return false; 179 | } else if (userChoice === "preview") { 180 | return await tryExecutePreviewQuery(adapter, queryObj.preview_query); 181 | } 182 | } 183 | 184 | return true; 185 | } 186 | 187 | async function displayPagedResult(result) { 188 | const pageSize = 10; 189 | let currentPage = 0; 190 | const totalPages = Math.ceil(result.length / pageSize); 191 | 192 | while (true) { 193 | const start = currentPage * pageSize; 194 | const end = start + pageSize; 195 | const pageResult = result.slice(start, end); 196 | 197 | console.log(gradient.cristal(`Page ${currentPage + 1} of ${totalPages}:`)); 198 | console.log(pageResult); 199 | 200 | const { action } = await inquirer.prompt([ 201 | { 202 | type: 'list', 203 | name: 'action', 204 | message: 'Navigate:', 205 | choices: ['Next', 'Previous', 'Exit'], 206 | }, 207 | ]); 208 | 209 | if (action === 'Next' && currentPage < totalPages - 1) { 210 | currentPage++; 211 | } else if (action === 'Previous' && currentPage > 0) { 212 | currentPage--; 213 | } else if (action === 'Exit') { 214 | break; 215 | } 216 | } 217 | } 218 | 219 | 220 | async function executeWithRetries(adapter, query, client, prompt) { 221 | let retries = 2; 222 | 223 | while (retries >= 0) { 224 | try { 225 | const result = await executeQuery(adapter, query); 226 | if (result.length > 0) { 227 | if (prompt) { 228 | await displayPagedResult(result); 229 | } else { 230 | console.log(JSON.stringify(result, null, 2)); 231 | } 232 | } else { 233 | console.log("No records found."); 234 | } 235 | break; 236 | } catch (error) { 237 | if (retries > 0) { 238 | console.error(`Invalid SQL: ${error.message}. Retrying...`); 239 | retries--; 240 | await retryQuery(client, adapter); 241 | } else { 242 | console.error("Failed to execute the query after multiple attempts."); 243 | break; 244 | } 245 | } 246 | } 247 | } 248 | 249 | 250 | async function processQuery(dbConfigs, connectionNameOrFile, command, client) { 251 | const connectionConfig = await getConnectionConfig(dbConfigs, connectionNameOrFile); 252 | const adapter = getDatabaseAdapter(connectionConfig.type, connectionConfig.config); 253 | 254 | const queryObj = await handleQuery(command, client, adapter); 255 | 256 | const shouldExecute = await handleUserPrompt(queryObj, adapter); 257 | 258 | if (shouldExecute) { 259 | await executeWithRetries(adapter, queryObj.query, client, USE_PROMPT); 260 | } else { 261 | consoleLog("Query execution aborted by user."); 262 | } 263 | } 264 | 265 | async function loadConfig() { 266 | if (!fs.existsSync(configFilePath)) { 267 | return []; 268 | } 269 | 270 | const configContent = fs.readFileSync(configFilePath, "utf-8"); 271 | return JSON.parse(configContent); 272 | } 273 | 274 | async function saveConfig(config) { 275 | fs.writeFileSync(configFilePath, JSON.stringify(config, null, 2), "utf-8"); 276 | } 277 | 278 | // eslint-disable-next-line max-lines-per-function 279 | async function manageConfig() { 280 | const dbConfigs = await loadConfig(); 281 | const choices = 282 | dbConfigs.length > 0 283 | ? ["Add new connection", "Edit a connection", "Remove a connection"] 284 | : ["Add new connection"]; 285 | 286 | const { action } = await inquirer.prompt([ 287 | { 288 | type: "list", 289 | name: "action", 290 | message: "What would you like to do?", 291 | choices, 292 | }, 293 | ]); 294 | 295 | switch (action) { 296 | case "Add new connection": 297 | return await addConnection(dbConfigs); 298 | case "Edit a connection": 299 | return await editConnection(dbConfigs); 300 | case "Remove a connection": 301 | await removeConnection(dbConfigs); 302 | break; 303 | } 304 | } 305 | 306 | async function addConnection(dbConfigs) { 307 | const newConnection = await promptConnectionDetails(); 308 | dbConfigs.push(newConnection); 309 | await saveConfig(dbConfigs); 310 | console.log("New connection added successfully."); 311 | return [dbConfigs, newConnection.name]; 312 | } 313 | 314 | async function editConnection(dbConfigs) { 315 | const { connectionName } = await inquirer.prompt([ 316 | { 317 | type: "list", 318 | name: "connectionName", 319 | message: "Choose a connection to edit:", 320 | choices: dbConfigs.map((config) => config.name), 321 | }, 322 | ]); 323 | 324 | const connectionIndex = dbConfigs.findIndex( 325 | (config) => config.name === connectionName, 326 | ); 327 | const updatedConnection = await promptConnectionDetails( 328 | dbConfigs[connectionIndex], 329 | ); 330 | dbConfigs[connectionIndex] = updatedConnection; 331 | await saveConfig(dbConfigs); 332 | console.log("Connection edited successfully."); 333 | return [dbConfigs, connectionName]; 334 | } 335 | 336 | async function removeConnection(dbConfigs) { 337 | const { connectionName } = await inquirer.prompt([ 338 | { 339 | type: "list", 340 | name: "connectionName", 341 | message: "Choose a connection to remove:", 342 | choices: dbConfigs.map((config) => config.name), 343 | }, 344 | ]); 345 | 346 | const updatedConfigs = dbConfigs.filter( 347 | (config) => config.name !== connectionName, 348 | ); 349 | await saveConfig(updatedConfigs); 350 | console.log("Connection removed successfully."); 351 | } 352 | 353 | function getValue(value, defaultValue = "") { 354 | return value || defaultValue; 355 | } 356 | 357 | // eslint-disable-next-line max-lines-per-function, complexity 358 | async function promptConnectionDetails(existingConfig = {}) { 359 | const questions = [ 360 | { 361 | type: "input", 362 | name: "name", 363 | message: "Connection name:", 364 | default: getValue(existingConfig.name), 365 | }, 366 | { 367 | type: "list", 368 | name: "type", 369 | message: "Database type:", 370 | choices: ["postgres", "mysql", "sqlite"], 371 | default: getValue(existingConfig.type), 372 | }, 373 | { 374 | type: "input", 375 | name: "user", 376 | message: "Database user:", 377 | when: (answers) => answers.type !== "sqlite", 378 | default: getValue(existingConfig.config?.user), 379 | }, 380 | { 381 | type: "input", 382 | name: "host", 383 | message: "Database host:", 384 | when: (answers) => answers.type !== "sqlite", 385 | default: getValue(existingConfig.config?.host), 386 | }, 387 | { 388 | type: "input", 389 | name: "database", 390 | message: "Database name:", 391 | default: getValue(existingConfig.config?.database), 392 | }, 393 | { 394 | type: "password", 395 | name: "password", 396 | message: "Database password:", 397 | when: (answers) => answers.type !== "sqlite", 398 | default: getValue(existingConfig.config?.password), 399 | }, 400 | { 401 | type: "number", 402 | name: "port", 403 | message: "Database port:", 404 | when: (answers) => answers.type !== "sqlite", 405 | default: getValue(existingConfig.config?.port, 5432), 406 | }, 407 | { 408 | type: "input", 409 | name: "filename", 410 | message: "SQLite file path:", 411 | when: (answers) => answers.type === "sqlite", 412 | default: getValue(existingConfig.config?.filename), 413 | }, 414 | ]; 415 | 416 | const answers = await inquirer.prompt(questions); 417 | 418 | return { 419 | name: answers.name, 420 | type: answers.type, 421 | config: { 422 | user: answers.user, 423 | host: answers.host, 424 | database: answers.database, 425 | password: answers.password, 426 | port: answers.port, 427 | ...(answers.type === "sqlite" && { filename: answers.filename }), 428 | }, 429 | }; 430 | } 431 | 432 | function shouldExitConversation(question) { 433 | const exitWords = new Set(["exit", "goodbye", "quit"]); 434 | return !question || exitWords.has(question.toLowerCase().trim()); 435 | } 436 | 437 | async function promptForCommands(dbConfigs, connectionNameOrFile, client) { 438 | let command; 439 | do { 440 | const input = await inquirer.prompt([ 441 | { 442 | type: "input", 443 | name: "command", 444 | message: "aiq>", 445 | }, 446 | ]); 447 | command = input.command; 448 | 449 | if (shouldExitConversation(command)) { 450 | break; 451 | } 452 | 453 | await processQuery(dbConfigs, connectionNameOrFile, command, client); 454 | } while (true); 455 | } 456 | 457 | async function handleNoOrSingleParam() { 458 | const [dbConfigs, connectionNameOrFile] = await manageConfig(); 459 | const client = await setupClient(); 460 | 461 | await promptForCommands(dbConfigs, connectionNameOrFile, client); 462 | } 463 | 464 | async function handleExecuteQuery(args, prompt) { 465 | const connectionNameOrFile = args[0]; 466 | const command = args.slice(1).join(" "); 467 | const dbConfigs = await loadConfig(); 468 | const client = await setupClient(command); 469 | await processQuery(dbConfigs, connectionNameOrFile, command, client); 470 | if (prompt) { 471 | await promptForCommands(dbConfigs, connectionNameOrFile, client); 472 | } 473 | } 474 | 475 | async function main(prompt = true) { 476 | USE_PROMPT = prompt; 477 | 478 | let args = process.argv.slice(2); 479 | if(args.length === 1) { args = args[0].split(' ') } 480 | const paramType = await validateArguments(args); 481 | 482 | switch (paramType) { 483 | case "no-params": 484 | case "single-param": 485 | await handleNoOrSingleParam(); 486 | break; 487 | case "execute-query": 488 | await handleExecuteQuery(args, prompt); 489 | break; 490 | default: 491 | throw new Error(`Unknown paramType: ${paramType}`); 492 | } 493 | 494 | process.exit(0); 495 | } 496 | 497 | if (!`file://${process.argv[1]}`.includes('!')) { 498 | main(); 499 | } 500 | 501 | export default main; 502 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import globals from "globals"; 2 | import pluginJs from "@eslint/js"; 3 | 4 | export default [ 5 | { 6 | languageOptions: { 7 | globals: globals.node, 8 | }, 9 | rules: { 10 | complexity: ["error", 5], 11 | "max-lines-per-function": ["error", { max: 25 }], 12 | }, 13 | }, 14 | pluginJs.configs.recommended, 15 | ]; 16 | -------------------------------------------------------------------------------- /lib/aiClient/adapters/BaseAdapter.js: -------------------------------------------------------------------------------- 1 | import CommandPrompt from "../../prompts/CommandPrompt.js"; 2 | import QueryPrompt from "../../prompts/QueryPrompt.js"; 3 | import Logger from "../../../lib/logger.js"; 4 | const logger = new Logger("command"); 5 | 6 | class BaseAdapter { 7 | constructor(config) { 8 | this.model = config.model; 9 | 10 | this.logger = logger; 11 | this.messages = []; 12 | } 13 | 14 | async generateQuery(request, dbAdapter) { 15 | if (this.messages.length == 0) { 16 | const formatedPrompt = await this.formatQueryPrompt(dbAdapter); 17 | 18 | this.messages.push({ 19 | role: "system", 20 | content: formatedPrompt, 21 | }); 22 | } 23 | 24 | const response = await this.generateResponse(request); 25 | 26 | return this.massage(response); 27 | } 28 | 29 | async generateScript(command) { 30 | try { 31 | if (this.messages.length > 0) { 32 | const response = await this.generateResponse( 33 | "Try a differnt solution.", 34 | ); 35 | 36 | return this.massage(response); 37 | } else { 38 | const formatedPrompt = await this.formatCommandPrompt(command); 39 | const response = await this.generateResponse(formatedPrompt); 40 | 41 | return this.massage(response); 42 | } 43 | } catch (error) { 44 | this.logger.error("Failed to generate script: " + error.message); 45 | } 46 | } 47 | 48 | isJsonString(str) { 49 | try { 50 | const parsed = JSON.parse(str); 51 | return typeof parsed === "object" && parsed !== null; 52 | } catch { 53 | return false; 54 | } 55 | } 56 | 57 | massage(response) { 58 | if (this.isJsonString(response)) { 59 | return response; 60 | } 61 | 62 | const codeBlockMatch = response.match( 63 | /```(?:json|sql)?\s*([\s\S]*?)\s*```/, 64 | ); 65 | if (codeBlockMatch && this.isJsonString(codeBlockMatch[1])) { 66 | return codeBlockMatch[1].trim(); 67 | } 68 | 69 | return response; 70 | } 71 | 72 | async formatCommandPrompt(command) { 73 | const commandPrompt = new CommandPrompt(this.model); 74 | return await commandPrompt.out(command); 75 | } 76 | 77 | async formatQueryPrompt(dbAdapter) { 78 | const queryPrompt = new QueryPrompt(this.model, dbAdapter); 79 | return await queryPrompt.out(); 80 | } 81 | } 82 | 83 | export default BaseAdapter; 84 | -------------------------------------------------------------------------------- /lib/aiClient/adapters/OllamaAdapter.js: -------------------------------------------------------------------------------- 1 | import { Ollama } from "ollama"; 2 | import BaseAdapter from "./BaseAdapter.js"; 3 | 4 | class OllamaAdapter extends BaseAdapter { 5 | constructor(config) { 6 | super(config); 7 | this.baseURL = config.ollamaUrl; 8 | this.model = config.ollamaModel; 9 | } 10 | 11 | async generateResponse(command) { 12 | try { 13 | const ollama = new Ollama({ host: this.baseURL }); 14 | 15 | this.messages.push({ role: "user", content: command }); 16 | 17 | const response = await ollama.chat({ 18 | model: this.model, 19 | messages: this.messages, 20 | }); 21 | 22 | this.messages.push(response.message); 23 | 24 | this.logger.info(`SERVER RESPONSE ${response.message.content}`); 25 | 26 | return response.message.content; 27 | } catch (error) { 28 | this.logger.error("Failed to chat: " + error.message); 29 | } 30 | } 31 | } 32 | 33 | export default OllamaAdapter; 34 | -------------------------------------------------------------------------------- /lib/aiClient/adapters/OpenAIAdapter.js: -------------------------------------------------------------------------------- 1 | import OpenAI from "openai"; 2 | import BaseAdapter from "./BaseAdapter.js"; 3 | 4 | class OpenAIAdapter extends BaseAdapter { 5 | constructor(config) { 6 | super(config); 7 | this.apiKey = config.openAIApiKey; 8 | this.model = config.openAIModel; 9 | this.apiUrl = config.openAIApiUrl || "https://api.openai.com/v1"; 10 | } 11 | 12 | async generateResponse(command) { 13 | try { 14 | const openai = new OpenAI({ 15 | apiKey: this.apiKey, 16 | baseURL: this.apiUrl, 17 | }); 18 | 19 | this.messages.push({ 20 | role: "user", 21 | content: command, 22 | }); 23 | 24 | const response = await openai.chat.completions.create({ 25 | messages: this.messages, 26 | model: this.model, 27 | }); 28 | 29 | let content = response.choices[0].message.content; 30 | this.messages.push(response.choices[0].message); 31 | this.logger.info(`SERVER RESPONSE ${content}`); 32 | 33 | return content; 34 | } catch (error) { 35 | this.logger.error("Failed to chat: " + error.message); 36 | } 37 | } 38 | } 39 | 40 | export default OpenAIAdapter; 41 | -------------------------------------------------------------------------------- /lib/aiClient/aiClient.js: -------------------------------------------------------------------------------- 1 | import OllamaAdapter from "./adapters/OllamaAdapter.js"; 2 | import OpenAIAdapter from "./adapters/OpenAIAdapter.js"; 3 | 4 | class AIClient { 5 | constructor(config) { 6 | this.adapter = 7 | config.aiService === "ChatGPT" || "OpenAI" 8 | ? new OpenAIAdapter(config) 9 | : new OllamaAdapter(config); 10 | } 11 | 12 | async generateQuery(request, dbAdapter) { 13 | return await this.adapter.generateQuery(request, dbAdapter); 14 | } 15 | 16 | async generateScript(command) { 17 | return await this.adapter.generateScript(command); 18 | } 19 | 20 | async generateResponse(command) { 21 | return await this.adapter.generateResponse(command); 22 | } 23 | } 24 | 25 | export default AIClient; 26 | -------------------------------------------------------------------------------- /lib/cli.js: -------------------------------------------------------------------------------- 1 | import { exec } from "child_process"; 2 | import { readFileSync } from "fs"; 3 | import { join, dirname } from "path"; 4 | import getStdin from "get-stdin"; 5 | import inquirer from "inquirer"; 6 | import gradient from "gradient-string"; 7 | 8 | import { loadConfig, configure } from "./config.js"; 9 | import { fileURLToPath } from 'url'; 10 | 11 | const __filename = fileURLToPath(import.meta.url); 12 | const __dirname = dirname(__filename); 13 | 14 | export async function getCommandInput(defaultValue = "") { 15 | const { command } = await inquirer.prompt([ 16 | { 17 | type: "input", 18 | name: "command", 19 | message: "What would you like me to do??:", 20 | default: defaultValue, 21 | validate: (input) => (input ? true : "?????????????!!!????????"), 22 | }, 23 | ]); 24 | return command; 25 | } 26 | 27 | export async function getCommand() { 28 | let command = process.argv.slice(2).join(" "); 29 | 30 | if (!command) { 31 | const stdinInput = await getStdin(); 32 | if (stdinInput.trim()) { 33 | command = stdinInput.trim(); 34 | } else { 35 | command = await getCommandInput(); 36 | } 37 | } 38 | 39 | return command; 40 | } 41 | 42 | export async function cliCommands(command) { 43 | if (command.toLowerCase() === "upgrade") { 44 | exec("npm update -g command-ai", (error, stdout, stderr) => { 45 | if (error) { 46 | console.error(`Error: ${error.message}`); 47 | } else if (stderr) { 48 | console.error(`stderr: ${stderr}`); 49 | } else { 50 | console.log(stdout); 51 | } 52 | 53 | }); 54 | return false; 55 | } 56 | 57 | if (command.toLowerCase() === "version" || command.toLowerCase() === "-v") { 58 | const packageJsonPath = join(__dirname, "../package.json"); 59 | const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8")); 60 | console.log(`Version: ${packageJson.version}`); 61 | 62 | return false; 63 | } 64 | 65 | return true; 66 | } 67 | 68 | export async function getConfig(command = "") { 69 | let config = loadConfig(); 70 | if (!config) { 71 | console.log(); 72 | console.log(LOGO); 73 | console.log(); 74 | 75 | console.log(gradient.cristal("No configuration found.")); 76 | console.log(); 77 | config = await configure(); 78 | } else { 79 | if ( 80 | command.toUpperCase() === "CONFIG" || 81 | command.toUpperCase() === "CONFIGURE" 82 | ) { 83 | config = await configure(config); 84 | command = await getCommandInput(); 85 | } 86 | } 87 | return config; 88 | } 89 | 90 | const raw_logo = [ 91 | " ██████╗ ██████╗ ███╗ ███╗███╗ ███╗ █████╗ ███╗ ██╗██████╗ █████╗ ██╗", 92 | "██╔════╝██╔═══██╗████╗ ████║████╗ ████║██╔══██╗████╗ ██║██╔══██╗██╔══██╗██║", 93 | "██║ ██║ ██║██╔████╔██║██╔████╔██║███████║██╔██╗ ██║██║ ██║███████║██║", 94 | "██║ ██║ ██║██║╚██╔╝██║██║╚██╔╝██║██╔══██║██║╚██╗██║██║ ██║██╔══██║██║", 95 | "╚██████╗╚██████╔╝██║ ╚═╝ ██║██║ ╚═╝ ██║██║ ██║██║ ╚████║██████╔╝██║ ██║██║", 96 | " ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═════╝ ╚═╝ ╚═╝╚═╝", 97 | ]; 98 | 99 | export const LOGO = gradient.atlas.multiline(raw_logo.join("\n")); 100 | -------------------------------------------------------------------------------- /lib/config.js: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import path from "path"; 3 | import inquirer from "inquirer"; 4 | import os from "os"; 5 | import { OpenAI } from "openai"; 6 | import { Ollama } from "ollama"; 7 | import gradient from "gradient-string"; 8 | 9 | const configPath = path.join(os.homedir(), ".commandai", "config.json"); 10 | const defaultOpenAIModel = "gpt-4o"; 11 | const defaultOpenAIApiUrl = "https://api.openai.com/v1"; 12 | const defaultOllamaUrl = "http://127.0.0.1:11434"; 13 | 14 | async function checkOllamaActive(url = defaultOllamaUrl) { 15 | try { 16 | const ollama = new Ollama(url); 17 | await ollama.list(); 18 | return true; 19 | } catch (error) { 20 | console.error("Ollama is not active:", error.message); 21 | return false; 22 | } 23 | } 24 | 25 | function loadConfig() { 26 | if (fs.existsSync(configPath)) { 27 | const configFile = fs.readFileSync(configPath); 28 | const config = JSON.parse(configFile); 29 | 30 | if (!config.openAIApiUrl) { 31 | config.openAIApiUrl = config.chatgptApiUrl; 32 | 33 | delete config.chatgptApiUrl; 34 | } 35 | 36 | if (!config.openAIModel) { 37 | config.openAIModel = config.chatgptModel; 38 | 39 | delete config.chatgptModel; 40 | } 41 | 42 | if (!config.openAIApiKey) { 43 | config.openAIApiKey = config.chatgptApiKey; 44 | 45 | delete config.chatgptApiKey; 46 | } 47 | 48 | config.model = 49 | config.aiService === "Ollama" ? config.ollamaModel : config.openAIModel; 50 | 51 | if (config.aiService === "ChatGPT") { 52 | config.openAIApiUrl = defaultOpenAIApiUrl; 53 | } 54 | 55 | return config; 56 | } else { 57 | return null; 58 | } 59 | } 60 | 61 | async function saveConfig(config) { 62 | config.model = 63 | config.aiService === "Ollama" ? config.ollamaModel : config.openAIModel; 64 | const dir = path.dirname(configPath); 65 | if (!fs.existsSync(dir)) { 66 | fs.mkdirSync(dir, { recursive: true }); 67 | } 68 | fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); 69 | console.log(); 70 | console.log(gradient.cristal(`Config saved successfully at: ${configPath}`)); 71 | console.log(); 72 | } 73 | 74 | async function validateApiKey(apiKey, openAIApiUrl) { 75 | try { 76 | const openai = new OpenAI({ baseURL: openAIApiUrl, apiKey: apiKey }); 77 | await openai.models.list(); 78 | return true; 79 | } catch (error) { 80 | console.error("Invalid API key:", error.message); 81 | return false; 82 | } 83 | } 84 | 85 | async function fetchOpenAIModels(openAIApiUrl, apiKey) { 86 | try { 87 | const openai = new OpenAI({ baseURL: openAIApiUrl, apiKey: apiKey }); 88 | const response = await openai.models.list(); 89 | return response.data.map((model) => model.id); 90 | } catch (error) { 91 | console.error("Failed to fetch models:", error.message); 92 | return []; 93 | } 94 | } 95 | 96 | async function validateOllamaUrl(url) { 97 | try { 98 | const ollama = new Ollama({ host: url }); 99 | await ollama.list(); 100 | return true; 101 | } catch (error) { 102 | console.error("Failed to connect to Ollama server:", error.message); 103 | return false; 104 | } 105 | } 106 | 107 | async function fetchOllamaModels(url) { 108 | try { 109 | const ollama = new Ollama({ host: url }); 110 | const response = await ollama.list(); 111 | return response.models.map((model) => model.name); 112 | } catch (error) { 113 | console.error("Failed to fetch models from Ollama server:", error.message); 114 | return []; 115 | } 116 | } 117 | 118 | async function promptAiService(choices, defaultValue) { 119 | const aiService = await inquirer.prompt([ 120 | { 121 | type: "list", 122 | name: "aiService", 123 | message: "Select the AI service:", 124 | choices: choices, 125 | default: defaultValue, 126 | }, 127 | ]); 128 | return aiService.aiService; 129 | } 130 | 131 | async function promptOllamaURL(defaultUrl) { 132 | const ollamaConfig = await inquirer.prompt([ 133 | { 134 | type: "input", 135 | name: "ollamaUrl", 136 | message: "Enter the URL for the Ollama server:", 137 | default: defaultUrl, 138 | }, 139 | ]); 140 | 141 | const isValidUrl = await validateOllamaUrl(ollamaConfig.ollamaUrl); 142 | if (!isValidUrl) { 143 | console.error("Invalid Ollama server URL. Please try again."); 144 | return null; 145 | } 146 | 147 | return ollamaConfig; 148 | } 149 | 150 | async function promptOllamaModel(defaultModel) { 151 | const models = await fetchOllamaModels(defaultOllamaUrl); 152 | if (models.length === 0) { 153 | console.error( 154 | "No models found on the Ollama server.", 155 | "Please ensure that models are installed and the server is properly configured.", 156 | ); 157 | 158 | return null; 159 | } 160 | 161 | const ollamaModel = await inquirer.prompt([ 162 | { 163 | type: "list", 164 | name: "ollamaModel", 165 | message: "Select the Ollama model:", 166 | choices: models, 167 | default: defaultModel, 168 | }, 169 | ]); 170 | 171 | return ollamaModel; 172 | } 173 | 174 | async function promptOllamaConfig(defaultUrl, defaultModel) { 175 | const ollamaConfig = await promptOllamaURL(defaultUrl); 176 | 177 | if (!ollamaConfig) return null; 178 | 179 | const ollamaModel = await promptOllamaModel(defaultModel); 180 | 181 | if (!ollamaModel) return null; 182 | 183 | return { 184 | ollamaUrl: ollamaConfig.ollamaUrl, 185 | ollamaModel: ollamaModel, 186 | }; 187 | } 188 | 189 | async function promptOpenAIAPIKey(defaultApiKey, openAIApiUrl) { 190 | const openAIConfig = await inquirer.prompt([ 191 | { 192 | type: "input", 193 | name: "openAIApiKey", 194 | message: "Enter your OpenAI API key:", 195 | default: defaultApiKey, 196 | }, 197 | ]); 198 | 199 | const isValidApiKey = await validateApiKey(openAIConfig.openAIApiKey, openAIApiUrl); 200 | 201 | if (!isValidApiKey) { 202 | return null; 203 | } 204 | 205 | return openAIConfig; 206 | } 207 | 208 | 209 | async function promptOpenAIModels(defaultModel, openAIApiUrl, openAIApiKey) { 210 | const models = await fetchOpenAIModels(openAIApiUrl, openAIApiKey); 211 | 212 | if (models.length === 0) { 213 | console.error( 214 | "No models found for the provided API key. Please try again.", 215 | ); 216 | return null; 217 | } 218 | 219 | const openAIModel = await inquirer.prompt([ 220 | { 221 | type: "list", 222 | name: "openAIModel", 223 | message: "Select the OpenAI model:", 224 | choices: models, 225 | default: defaultModel, 226 | }, 227 | ]); 228 | 229 | return openAIModel; 230 | } 231 | 232 | async function promptOpenAIURL(defaultUrl) { 233 | const openAIApiUrl = await inquirer.prompt([ 234 | { 235 | type: "input", 236 | name: "openAIApiUrl", 237 | message: "Enter the URL for the OpenAI server:", 238 | default: defaultUrl, 239 | }, 240 | ]); 241 | 242 | return openAIApiUrl; 243 | } 244 | 245 | async function promptOpenAIConfig(config) { 246 | let openAIApiUrl = { openAIApiUrl: config.openAIApiUrl || defaultOpenAIApiUrl }; 247 | 248 | if (config.aiService === "OpenAI") { 249 | openAIApiUrl = await promptOpenAIURL(config.openAIApiUrl); 250 | if (!openAIApiUrl) return null; 251 | } else { 252 | openAIApiUrl = { openAIApiUrl: defaultOpenAIApiUrl }; 253 | } 254 | 255 | const openAIConfig = await promptOpenAIAPIKey(config.openAIApiKey, openAIApiUrl.openAIApiUrl); 256 | 257 | if (!openAIConfig) return null; 258 | 259 | const openAIModel = await promptOpenAIModels(config.openAIModel, openAIApiUrl.openAIApiUrl, config.openAIApiKey); 260 | 261 | if (!openAIModel) return null; 262 | 263 | if (openAIApiUrl) { 264 | return { 265 | openAIApiKey: openAIConfig.openAIApiKey, 266 | openAIModel: openAIModel.openAIModel, 267 | openAIApiUrl: openAIApiUrl.openAIApiUrl, 268 | }; 269 | } else { 270 | return { 271 | openAIApiKey: openAIConfig.openAIApiKey, 272 | openAIModel: openAIModel.openAIModel, 273 | }; 274 | } 275 | } 276 | 277 | async function getAIServiceChoices() { 278 | const isOllamaActive = await checkOllamaActive(); 279 | return [ 280 | { name: isOllamaActive ? "Ollama (Running)" : "Ollama", value: "Ollama" }, 281 | { name: "ChatGPT", value: "ChatGPT" }, 282 | { name: "OpenAI", value: "OpenAI" }, 283 | ]; 284 | } 285 | 286 | async function configure( 287 | defaultConfig = { 288 | aiService: "", 289 | ollamaUrl: defaultOllamaUrl, 290 | ollamaModel: "", 291 | openAIApiKey: "", 292 | openAIModel: defaultOpenAIModel, 293 | openAIApiUrl: defaultOpenAIApiUrl, 294 | showExecutionDescription: true, 295 | showExecutionPlan: true, 296 | enableLogging: false, 297 | }, 298 | ) { 299 | let finalConfig = { ...defaultConfig }; 300 | const aiServiceChoices = await getAIServiceChoices(); 301 | 302 | finalConfig = await promptAndConfigureAIService( 303 | finalConfig, 304 | aiServiceChoices, 305 | ); 306 | 307 | if (finalConfig) await saveConfig(finalConfig); 308 | 309 | return finalConfig; 310 | } 311 | 312 | async function promptAndConfigureAIService(finalConfig, aiServiceChoices) { 313 | let validConfig = false; 314 | 315 | while (!validConfig) { 316 | finalConfig.aiService = await promptAiService( 317 | aiServiceChoices, 318 | finalConfig.aiService, 319 | ); 320 | 321 | const serviceConfig = await configureSelectedAIService(finalConfig); 322 | if (!serviceConfig) continue; 323 | Object.assign(finalConfig, serviceConfig); 324 | 325 | finalConfig.model = 326 | finalConfig.aiService === "Ollama" 327 | ? finalConfig.ollamaModel 328 | : finalConfig.openAIModel; 329 | 330 | validConfig = true; 331 | } 332 | 333 | return finalConfig; 334 | } 335 | 336 | async function configureSelectedAIService(finalConfig) { 337 | if (finalConfig.aiService === "Ollama") { 338 | return await configureOllamaService(finalConfig); 339 | } else if (finalConfig.aiService === "ChatGPT") { 340 | return await configureOpenAIService(finalConfig); 341 | } else if (finalConfig.aiService === "OpenAI") { 342 | return await configureOpenAIService(finalConfig); 343 | } 344 | return null; 345 | } 346 | 347 | async function configureOllamaService(finalConfig) { 348 | const ollamaConfig = await promptOllamaConfig( 349 | finalConfig.ollamaUrl, 350 | finalConfig.ollamaModel, 351 | ); 352 | if (!ollamaConfig) return null; 353 | 354 | return { 355 | ollamaUrl: ollamaConfig.ollamaUrl, 356 | ollamaModel: ollamaConfig.ollamaModel, 357 | }; 358 | } 359 | 360 | async function configureOpenAIService(finalConfig) { 361 | const openAIConfig = await promptOpenAIConfig(finalConfig); 362 | if (!openAIConfig) return null; 363 | 364 | if (finalConfig.aiService === "OpenAI") { 365 | return { 366 | openAIApiKey: openAIConfig.openAIApiKey, 367 | openAIModel: openAIConfig.openAIModel, 368 | openAIApiUrl: openAIConfig.openAIApiUrl, 369 | }; 370 | } else { 371 | return { 372 | openAIApiKey: openAIConfig.openAIApiKey, 373 | openAIModel: openAIConfig.openAIModel, 374 | }; 375 | } 376 | } 377 | 378 | export { loadConfig, saveConfig, configure }; 379 | -------------------------------------------------------------------------------- /lib/logger.js: -------------------------------------------------------------------------------- 1 | import pino from "pino"; 2 | import path from "path"; 3 | import fs from "fs"; 4 | import { loadConfig } from "./config.js"; 5 | 6 | const config = loadConfig(); 7 | const LOG_DIRECTORY = path.resolve( 8 | process.env.HOME || process.env.USERPROFILE, 9 | ".commandai", 10 | ); 11 | 12 | if (!fs.existsSync(LOG_DIRECTORY)) { 13 | fs.mkdirSync(LOG_DIRECTORY, { recursive: true }); 14 | } 15 | 16 | class Logger { 17 | constructor(logName) { 18 | const logFilePath = path.join(LOG_DIRECTORY, `${logName}.log`); 19 | 20 | if (config?.enableLogging) { 21 | this.logger = pino({ 22 | level: "info", 23 | transport: { 24 | target: "pino-pretty", 25 | options: { 26 | destination: logFilePath, 27 | mkdir: true, 28 | }, 29 | }, 30 | }); 31 | } else { 32 | this.logger = pino({ level: "silent" }); 33 | } 34 | } 35 | 36 | info(message) { 37 | this.logger.info(message); 38 | } 39 | 40 | error(message) { 41 | this.logger.error(message); 42 | } 43 | 44 | warn(message) { 45 | this.logger.warn(message); 46 | } 47 | 48 | debug(message) { 49 | this.logger.debug(message); 50 | } 51 | } 52 | 53 | export default Logger; 54 | -------------------------------------------------------------------------------- /lib/prompts/CommandPrompt.js: -------------------------------------------------------------------------------- 1 | import Prompt from "./Prompt.js"; 2 | import os from "os"; 3 | 4 | class CommandPrompt extends Prompt { 5 | constructor(model_name) { 6 | super("command", model_name); 7 | } 8 | 9 | checkRootPermissions() { 10 | try { 11 | return process.getuid && process.getuid() === 0; 12 | } catch (error) { 13 | console.error("Error checking root permissions:", error); 14 | return false; 15 | } 16 | } 17 | 18 | context(command) { 19 | return { 20 | osType: os.type(), 21 | osVersion: os.release(), 22 | cwd: process.cwd(), 23 | shell: process.env.SHELL || "unknown shell", 24 | user: process.env.USER || "unknown user", 25 | hasRootPermissions: this.checkRootPermissions(), 26 | command: command, 27 | }; 28 | } 29 | 30 | async out(command) { 31 | return await super.out(this.context(command)); 32 | } 33 | } 34 | 35 | export default CommandPrompt; 36 | -------------------------------------------------------------------------------- /lib/prompts/Prompt.js: -------------------------------------------------------------------------------- 1 | import PromptFormatter from "./PromptFormatter.js"; 2 | import fs from "fs"; 3 | import path from "path"; 4 | import { fileURLToPath } from "url"; 5 | import Logger from "../../lib/logger.js"; 6 | 7 | const __filename = fileURLToPath(import.meta.url); 8 | const __dirname = path.dirname(__filename); 9 | 10 | class Prompt { 11 | constructor(task, model_name) { 12 | this.task = task; 13 | this.model_name = model_name; 14 | this.logger = new Logger(task); 15 | 16 | this.modelTemplatePath = path.join( 17 | __dirname, 18 | `../../prompts/${task}/${model_name}.hbs` 19 | ); 20 | this.defaultTemplatePath = path.join( 21 | __dirname, 22 | `../../prompts/${task}/default.hbs` 23 | ); 24 | 25 | this.loadAppropriateTemplate(); 26 | } 27 | 28 | templateExists(filePath) { 29 | return fs.existsSync(filePath); 30 | } 31 | 32 | loadAppropriateTemplate() { 33 | if (this.templateExists(this.modelTemplatePath)) { 34 | this.promptFormatter = new PromptFormatter(this.modelTemplatePath); 35 | this.logger.info(`Prompt Template: ${this.modelTemplatePath}`); 36 | } else if (this.templateExists(this.defaultTemplatePath)) { 37 | this.promptFormatter = new PromptFormatter(this.defaultTemplatePath); 38 | this.logger.info(`Prompt Template: ${this.defaultTemplatePath}`); 39 | } else { 40 | this.logger.error(`No template found for task: ${this.task}`); 41 | throw new Error(`No template found for task: ${this.task}`); 42 | } 43 | } 44 | 45 | async out(context) { 46 | const prompt = await this.promptFormatter.format(context); 47 | this.logger.info(`PROMPT: ${prompt}`); 48 | return await this.promptFormatter.format(context); 49 | } 50 | } 51 | 52 | export default Prompt; 53 | -------------------------------------------------------------------------------- /lib/prompts/PromptFormatter.js: -------------------------------------------------------------------------------- 1 | import Handlebars from "handlebars"; 2 | import { promises as fs } from "fs"; 3 | 4 | Handlebars.Utils.escapeExpression = (string) => string; 5 | 6 | class PromptFormatter { 7 | constructor(templatePath) { 8 | this.templatePath = templatePath; 9 | this.template = null; 10 | } 11 | 12 | async loadTemplate() { 13 | try { 14 | const templateContent = await fs.readFile(this.templatePath, "utf-8"); 15 | this.template = Handlebars.compile( 16 | templateContent.trim().replace(/\s\s+/g, " "), 17 | ); 18 | } catch (error) { 19 | throw new Error(`Failed to load template: ${error.message}`); 20 | } 21 | } 22 | 23 | async format(context) { 24 | if (!this.template) { 25 | await this.loadTemplate(); 26 | } 27 | return this.template(context); 28 | } 29 | } 30 | 31 | export default PromptFormatter; 32 | -------------------------------------------------------------------------------- /lib/prompts/QueryPrompt.js: -------------------------------------------------------------------------------- 1 | import Prompt from "./Prompt.js"; 2 | import os from "os"; 3 | 4 | class QueryPrompt extends Prompt { 5 | constructor(model_name, dbAdapter) { 6 | super("query", model_name); 7 | this.dbAdapter = dbAdapter; 8 | } 9 | 10 | async context() { 11 | let tableAndSchemasObj = await this.dbAdapter.getAllTablesAndSchemas(); 12 | const tablesAndSchemas = JSON.stringify(tableAndSchemasObj); 13 | 14 | const dbType = Object.getPrototypeOf(this.dbAdapter).constructor.name.replace('Adapter', ''); 15 | 16 | return { 17 | dbType: dbType, 18 | tablesAndSchemas: tablesAndSchemas, 19 | }; 20 | } 21 | 22 | async out() { 23 | const context = await this.context(); 24 | return await super.out(context); 25 | } 26 | } 27 | 28 | export default QueryPrompt; 29 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "command-ai", 3 | "version": "0.30.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "command-ai", 9 | "version": "0.30.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "chalk": "^5.3.0", 13 | "dbinfoz": "^0.14.0", 14 | "get-stdin": "^9.0.0", 15 | "gradient-string": "^2.0.2", 16 | "handlebars": "^4.7.8", 17 | "highlight.js": "^11.9.0", 18 | "inquirer": "^9.3.4", 19 | "jsonscriptlib": "^0.9.0", 20 | "marked": "^13.0.2", 21 | "marked-terminal": "^7.1.0", 22 | "ollama": "^0.5.2", 23 | "openai": "^4.52.3", 24 | "ora": "^8.0.1", 25 | "pino": "^9.2.0", 26 | "pino-pretty": "^11.2.1" 27 | }, 28 | "bin": { 29 | "ai": "ai.js", 30 | "ai!": "ai!.js", 31 | "aic": "aic.js", 32 | "aic!": "aic!.js", 33 | "aiq": "aiq.js", 34 | "aiq!": "aiq!.js" 35 | }, 36 | "devDependencies": { 37 | "@eslint/js": "^9.6.0", 38 | "eslint": "^9.6.0", 39 | "globals": "^15.8.0", 40 | "prettier": "^3.3.2", 41 | "prettier-eslint": "^16.3.0" 42 | }, 43 | "engines": { 44 | "node": ">=18.0.0" 45 | } 46 | }, 47 | "node_modules/@azure/abort-controller": { 48 | "version": "2.1.2", 49 | "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", 50 | "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", 51 | "dependencies": { 52 | "tslib": "^2.6.2" 53 | }, 54 | "engines": { 55 | "node": ">=18.0.0" 56 | } 57 | }, 58 | "node_modules/@azure/core-auth": { 59 | "version": "1.9.0", 60 | "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz", 61 | "integrity": "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==", 62 | "dependencies": { 63 | "@azure/abort-controller": "^2.0.0", 64 | "@azure/core-util": "^1.11.0", 65 | "tslib": "^2.6.2" 66 | }, 67 | "engines": { 68 | "node": ">=18.0.0" 69 | } 70 | }, 71 | "node_modules/@azure/core-client": { 72 | "version": "1.9.2", 73 | "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", 74 | "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", 75 | "dependencies": { 76 | "@azure/abort-controller": "^2.0.0", 77 | "@azure/core-auth": "^1.4.0", 78 | "@azure/core-rest-pipeline": "^1.9.1", 79 | "@azure/core-tracing": "^1.0.0", 80 | "@azure/core-util": "^1.6.1", 81 | "@azure/logger": "^1.0.0", 82 | "tslib": "^2.6.2" 83 | }, 84 | "engines": { 85 | "node": ">=18.0.0" 86 | } 87 | }, 88 | "node_modules/@azure/core-http-compat": { 89 | "version": "2.1.2", 90 | "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.1.2.tgz", 91 | "integrity": "sha512-5MnV1yqzZwgNLLjlizsU3QqOeQChkIXw781Fwh1xdAqJR5AA32IUaq6xv1BICJvfbHoa+JYcaij2HFkhLbNTJQ==", 92 | "dependencies": { 93 | "@azure/abort-controller": "^2.0.0", 94 | "@azure/core-client": "^1.3.0", 95 | "@azure/core-rest-pipeline": "^1.3.0" 96 | }, 97 | "engines": { 98 | "node": ">=18.0.0" 99 | } 100 | }, 101 | "node_modules/@azure/core-lro": { 102 | "version": "2.7.2", 103 | "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz", 104 | "integrity": "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==", 105 | "dependencies": { 106 | "@azure/abort-controller": "^2.0.0", 107 | "@azure/core-util": "^1.2.0", 108 | "@azure/logger": "^1.0.0", 109 | "tslib": "^2.6.2" 110 | }, 111 | "engines": { 112 | "node": ">=18.0.0" 113 | } 114 | }, 115 | "node_modules/@azure/core-paging": { 116 | "version": "1.6.2", 117 | "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz", 118 | "integrity": "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==", 119 | "dependencies": { 120 | "tslib": "^2.6.2" 121 | }, 122 | "engines": { 123 | "node": ">=18.0.0" 124 | } 125 | }, 126 | "node_modules/@azure/core-rest-pipeline": { 127 | "version": "1.17.0", 128 | "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.17.0.tgz", 129 | "integrity": "sha512-62Vv8nC+uPId3j86XJ0WI+sBf0jlqTqPUFCBNrGtlaUeQUIXWV/D8GE5A1d+Qx8H7OQojn2WguC8kChD6v0shA==", 130 | "dependencies": { 131 | "@azure/abort-controller": "^2.0.0", 132 | "@azure/core-auth": "^1.8.0", 133 | "@azure/core-tracing": "^1.0.1", 134 | "@azure/core-util": "^1.9.0", 135 | "@azure/logger": "^1.0.0", 136 | "http-proxy-agent": "^7.0.0", 137 | "https-proxy-agent": "^7.0.0", 138 | "tslib": "^2.6.2" 139 | }, 140 | "engines": { 141 | "node": ">=18.0.0" 142 | } 143 | }, 144 | "node_modules/@azure/core-rest-pipeline/node_modules/agent-base": { 145 | "version": "7.1.1", 146 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", 147 | "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", 148 | "dependencies": { 149 | "debug": "^4.3.4" 150 | }, 151 | "engines": { 152 | "node": ">= 14" 153 | } 154 | }, 155 | "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": { 156 | "version": "7.0.2", 157 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", 158 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 159 | "dependencies": { 160 | "agent-base": "^7.1.0", 161 | "debug": "^4.3.4" 162 | }, 163 | "engines": { 164 | "node": ">= 14" 165 | } 166 | }, 167 | "node_modules/@azure/core-rest-pipeline/node_modules/https-proxy-agent": { 168 | "version": "7.0.5", 169 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", 170 | "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", 171 | "dependencies": { 172 | "agent-base": "^7.0.2", 173 | "debug": "4" 174 | }, 175 | "engines": { 176 | "node": ">= 14" 177 | } 178 | }, 179 | "node_modules/@azure/core-tracing": { 180 | "version": "1.2.0", 181 | "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz", 182 | "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", 183 | "dependencies": { 184 | "tslib": "^2.6.2" 185 | }, 186 | "engines": { 187 | "node": ">=18.0.0" 188 | } 189 | }, 190 | "node_modules/@azure/core-util": { 191 | "version": "1.11.0", 192 | "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.11.0.tgz", 193 | "integrity": "sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==", 194 | "dependencies": { 195 | "@azure/abort-controller": "^2.0.0", 196 | "tslib": "^2.6.2" 197 | }, 198 | "engines": { 199 | "node": ">=18.0.0" 200 | } 201 | }, 202 | "node_modules/@azure/identity": { 203 | "version": "4.5.0", 204 | "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.5.0.tgz", 205 | "integrity": "sha512-EknvVmtBuSIic47xkOqyNabAme0RYTw52BTMz8eBgU1ysTyMrD1uOoM+JdS0J/4Yfp98IBT3osqq3BfwSaNaGQ==", 206 | "dependencies": { 207 | "@azure/abort-controller": "^2.0.0", 208 | "@azure/core-auth": "^1.9.0", 209 | "@azure/core-client": "^1.9.2", 210 | "@azure/core-rest-pipeline": "^1.17.0", 211 | "@azure/core-tracing": "^1.0.0", 212 | "@azure/core-util": "^1.11.0", 213 | "@azure/logger": "^1.0.0", 214 | "@azure/msal-browser": "^3.26.1", 215 | "@azure/msal-node": "^2.15.0", 216 | "events": "^3.0.0", 217 | "jws": "^4.0.0", 218 | "open": "^8.0.0", 219 | "stoppable": "^1.1.0", 220 | "tslib": "^2.2.0" 221 | }, 222 | "engines": { 223 | "node": ">=18.0.0" 224 | } 225 | }, 226 | "node_modules/@azure/keyvault-common": { 227 | "version": "2.0.0", 228 | "resolved": "https://registry.npmjs.org/@azure/keyvault-common/-/keyvault-common-2.0.0.tgz", 229 | "integrity": "sha512-wRLVaroQtOqfg60cxkzUkGKrKMsCP6uYXAOomOIysSMyt1/YM0eUn9LqieAWM8DLcU4+07Fio2YGpPeqUbpP9w==", 230 | "dependencies": { 231 | "@azure/abort-controller": "^2.0.0", 232 | "@azure/core-auth": "^1.3.0", 233 | "@azure/core-client": "^1.5.0", 234 | "@azure/core-rest-pipeline": "^1.8.0", 235 | "@azure/core-tracing": "^1.0.0", 236 | "@azure/core-util": "^1.10.0", 237 | "@azure/logger": "^1.1.4", 238 | "tslib": "^2.2.0" 239 | }, 240 | "engines": { 241 | "node": ">=18.0.0" 242 | } 243 | }, 244 | "node_modules/@azure/keyvault-keys": { 245 | "version": "4.9.0", 246 | "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.9.0.tgz", 247 | "integrity": "sha512-ZBP07+K4Pj3kS4TF4XdkqFcspWwBHry3vJSOFM5k5ZABvf7JfiMonvaFk2nBF6xjlEbMpz5PE1g45iTMme0raQ==", 248 | "dependencies": { 249 | "@azure/abort-controller": "^2.0.0", 250 | "@azure/core-auth": "^1.3.0", 251 | "@azure/core-client": "^1.5.0", 252 | "@azure/core-http-compat": "^2.0.1", 253 | "@azure/core-lro": "^2.2.0", 254 | "@azure/core-paging": "^1.1.1", 255 | "@azure/core-rest-pipeline": "^1.8.1", 256 | "@azure/core-tracing": "^1.0.0", 257 | "@azure/core-util": "^1.0.0", 258 | "@azure/keyvault-common": "^2.0.0", 259 | "@azure/logger": "^1.0.0", 260 | "tslib": "^2.2.0" 261 | }, 262 | "engines": { 263 | "node": ">=18.0.0" 264 | } 265 | }, 266 | "node_modules/@azure/logger": { 267 | "version": "1.1.4", 268 | "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz", 269 | "integrity": "sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==", 270 | "dependencies": { 271 | "tslib": "^2.6.2" 272 | }, 273 | "engines": { 274 | "node": ">=18.0.0" 275 | } 276 | }, 277 | "node_modules/@azure/msal-browser": { 278 | "version": "3.26.1", 279 | "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.26.1.tgz", 280 | "integrity": "sha512-y78sr9g61aCAH9fcLO1um+oHFXc1/5Ap88RIsUSuzkm0BHzFnN+PXGaQeuM1h5Qf5dTnWNOd6JqkskkMPAhh7Q==", 281 | "dependencies": { 282 | "@azure/msal-common": "14.15.0" 283 | }, 284 | "engines": { 285 | "node": ">=0.8.0" 286 | } 287 | }, 288 | "node_modules/@azure/msal-common": { 289 | "version": "14.15.0", 290 | "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.15.0.tgz", 291 | "integrity": "sha512-ImAQHxmpMneJ/4S8BRFhjt1MZ3bppmpRPYYNyzeQPeFN288YKbb8TmmISQEbtfkQ1BPASvYZU5doIZOPBAqENQ==", 292 | "engines": { 293 | "node": ">=0.8.0" 294 | } 295 | }, 296 | "node_modules/@azure/msal-node": { 297 | "version": "2.15.0", 298 | "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.15.0.tgz", 299 | "integrity": "sha512-gVPW8YLz92ZeCibQH2QUw96odJoiM3k/ZPH3f2HxptozmH6+OnyyvKXo/Egg39HAM230akarQKHf0W74UHlh0Q==", 300 | "dependencies": { 301 | "@azure/msal-common": "14.15.0", 302 | "jsonwebtoken": "^9.0.0", 303 | "uuid": "^8.3.0" 304 | }, 305 | "engines": { 306 | "node": ">=16" 307 | } 308 | }, 309 | "node_modules/@colors/colors": { 310 | "version": "1.5.0", 311 | "license": "MIT", 312 | "optional": true, 313 | "engines": { 314 | "node": ">=0.1.90" 315 | } 316 | }, 317 | "node_modules/@eslint-community/eslint-utils": { 318 | "version": "4.4.0", 319 | "dev": true, 320 | "license": "MIT", 321 | "dependencies": { 322 | "eslint-visitor-keys": "^3.3.0" 323 | }, 324 | "engines": { 325 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 326 | }, 327 | "peerDependencies": { 328 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 329 | } 330 | }, 331 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 332 | "version": "3.4.3", 333 | "dev": true, 334 | "license": "Apache-2.0", 335 | "engines": { 336 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 337 | }, 338 | "funding": { 339 | "url": "https://opencollective.com/eslint" 340 | } 341 | }, 342 | "node_modules/@eslint-community/regexpp": { 343 | "version": "4.11.0", 344 | "dev": true, 345 | "license": "MIT", 346 | "engines": { 347 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 348 | } 349 | }, 350 | "node_modules/@eslint/config-array": { 351 | "version": "0.17.0", 352 | "dev": true, 353 | "license": "Apache-2.0", 354 | "dependencies": { 355 | "@eslint/object-schema": "^2.1.4", 356 | "debug": "^4.3.1", 357 | "minimatch": "^3.1.2" 358 | }, 359 | "engines": { 360 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 361 | } 362 | }, 363 | "node_modules/@eslint/eslintrc": { 364 | "version": "3.1.0", 365 | "dev": true, 366 | "license": "MIT", 367 | "dependencies": { 368 | "ajv": "^6.12.4", 369 | "debug": "^4.3.2", 370 | "espree": "^10.0.1", 371 | "globals": "^14.0.0", 372 | "ignore": "^5.2.0", 373 | "import-fresh": "^3.2.1", 374 | "js-yaml": "^4.1.0", 375 | "minimatch": "^3.1.2", 376 | "strip-json-comments": "^3.1.1" 377 | }, 378 | "engines": { 379 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 380 | }, 381 | "funding": { 382 | "url": "https://opencollective.com/eslint" 383 | } 384 | }, 385 | "node_modules/@eslint/eslintrc/node_modules/globals": { 386 | "version": "14.0.0", 387 | "dev": true, 388 | "license": "MIT", 389 | "engines": { 390 | "node": ">=18" 391 | }, 392 | "funding": { 393 | "url": "https://github.com/sponsors/sindresorhus" 394 | } 395 | }, 396 | "node_modules/@eslint/js": { 397 | "version": "9.6.0", 398 | "dev": true, 399 | "license": "MIT", 400 | "engines": { 401 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 402 | } 403 | }, 404 | "node_modules/@eslint/object-schema": { 405 | "version": "2.1.4", 406 | "dev": true, 407 | "license": "Apache-2.0", 408 | "engines": { 409 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 410 | } 411 | }, 412 | "node_modules/@gar/promisify": { 413 | "version": "1.1.3", 414 | "license": "MIT", 415 | "optional": true 416 | }, 417 | "node_modules/@humanwhocodes/config-array": { 418 | "version": "0.11.14", 419 | "dev": true, 420 | "license": "Apache-2.0", 421 | "dependencies": { 422 | "@humanwhocodes/object-schema": "^2.0.2", 423 | "debug": "^4.3.1", 424 | "minimatch": "^3.0.5" 425 | }, 426 | "engines": { 427 | "node": ">=10.10.0" 428 | } 429 | }, 430 | "node_modules/@humanwhocodes/module-importer": { 431 | "version": "1.0.1", 432 | "dev": true, 433 | "license": "Apache-2.0", 434 | "engines": { 435 | "node": ">=12.22" 436 | }, 437 | "funding": { 438 | "type": "github", 439 | "url": "https://github.com/sponsors/nzakas" 440 | } 441 | }, 442 | "node_modules/@humanwhocodes/object-schema": { 443 | "version": "2.0.3", 444 | "dev": true, 445 | "license": "BSD-3-Clause" 446 | }, 447 | "node_modules/@humanwhocodes/retry": { 448 | "version": "0.3.0", 449 | "dev": true, 450 | "license": "Apache-2.0", 451 | "engines": { 452 | "node": ">=18.18" 453 | }, 454 | "funding": { 455 | "type": "github", 456 | "url": "https://github.com/sponsors/nzakas" 457 | } 458 | }, 459 | "node_modules/@inquirer/figures": { 460 | "version": "1.0.3", 461 | "license": "MIT", 462 | "engines": { 463 | "node": ">=18" 464 | } 465 | }, 466 | "node_modules/@jest/schemas": { 467 | "version": "29.6.3", 468 | "dev": true, 469 | "license": "MIT", 470 | "dependencies": { 471 | "@sinclair/typebox": "^0.27.8" 472 | }, 473 | "engines": { 474 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 475 | } 476 | }, 477 | "node_modules/@js-joda/core": { 478 | "version": "5.6.3", 479 | "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.6.3.tgz", 480 | "integrity": "sha512-T1rRxzdqkEXcou0ZprN1q9yDRlvzCPLqmlNt5IIsGBzoEVgLCCYrKEwc84+TvsXuAc95VAZwtWD2zVsKPY4bcA==" 481 | }, 482 | "node_modules/@nodelib/fs.scandir": { 483 | "version": "2.1.5", 484 | "dev": true, 485 | "license": "MIT", 486 | "dependencies": { 487 | "@nodelib/fs.stat": "2.0.5", 488 | "run-parallel": "^1.1.9" 489 | }, 490 | "engines": { 491 | "node": ">= 8" 492 | } 493 | }, 494 | "node_modules/@nodelib/fs.stat": { 495 | "version": "2.0.5", 496 | "dev": true, 497 | "license": "MIT", 498 | "engines": { 499 | "node": ">= 8" 500 | } 501 | }, 502 | "node_modules/@nodelib/fs.walk": { 503 | "version": "1.2.8", 504 | "dev": true, 505 | "license": "MIT", 506 | "dependencies": { 507 | "@nodelib/fs.scandir": "2.1.5", 508 | "fastq": "^1.6.0" 509 | }, 510 | "engines": { 511 | "node": ">= 8" 512 | } 513 | }, 514 | "node_modules/@npmcli/fs": { 515 | "version": "1.1.1", 516 | "license": "ISC", 517 | "optional": true, 518 | "dependencies": { 519 | "@gar/promisify": "^1.0.1", 520 | "semver": "^7.3.5" 521 | } 522 | }, 523 | "node_modules/@npmcli/move-file": { 524 | "version": "1.1.2", 525 | "license": "MIT", 526 | "optional": true, 527 | "dependencies": { 528 | "mkdirp": "^1.0.4", 529 | "rimraf": "^3.0.2" 530 | }, 531 | "engines": { 532 | "node": ">=10" 533 | } 534 | }, 535 | "node_modules/@sinclair/typebox": { 536 | "version": "0.27.8", 537 | "dev": true, 538 | "license": "MIT" 539 | }, 540 | "node_modules/@sindresorhus/is": { 541 | "version": "4.6.0", 542 | "license": "MIT", 543 | "engines": { 544 | "node": ">=10" 545 | }, 546 | "funding": { 547 | "url": "https://github.com/sindresorhus/is?sponsor=1" 548 | } 549 | }, 550 | "node_modules/@tediousjs/connection-string": { 551 | "version": "0.5.0", 552 | "resolved": "https://registry.npmjs.org/@tediousjs/connection-string/-/connection-string-0.5.0.tgz", 553 | "integrity": "sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ==" 554 | }, 555 | "node_modules/@tootallnate/once": { 556 | "version": "1.1.2", 557 | "license": "MIT", 558 | "optional": true, 559 | "engines": { 560 | "node": ">= 6" 561 | } 562 | }, 563 | "node_modules/@types/node": { 564 | "version": "18.19.39", 565 | "license": "MIT", 566 | "dependencies": { 567 | "undici-types": "~5.26.4" 568 | } 569 | }, 570 | "node_modules/@types/node-fetch": { 571 | "version": "2.6.11", 572 | "license": "MIT", 573 | "dependencies": { 574 | "@types/node": "*", 575 | "form-data": "^4.0.0" 576 | } 577 | }, 578 | "node_modules/@types/readable-stream": { 579 | "version": "4.0.16", 580 | "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.16.tgz", 581 | "integrity": "sha512-Fvp+8OcU8PyV90KTk5tR/rI8OjD3MP5NUow5rjOsZo+9zxf4p4soJtK9j4V6yeG30TH6rZxqRaP4JLa8lNNTNQ==", 582 | "dependencies": { 583 | "@types/node": "*", 584 | "safe-buffer": "~5.1.1" 585 | } 586 | }, 587 | "node_modules/@types/readable-stream/node_modules/safe-buffer": { 588 | "version": "5.1.2", 589 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 590 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 591 | }, 592 | "node_modules/@types/tinycolor2": { 593 | "version": "1.4.6", 594 | "license": "MIT" 595 | }, 596 | "node_modules/@typescript-eslint/scope-manager": { 597 | "version": "6.21.0", 598 | "dev": true, 599 | "license": "MIT", 600 | "dependencies": { 601 | "@typescript-eslint/types": "6.21.0", 602 | "@typescript-eslint/visitor-keys": "6.21.0" 603 | }, 604 | "engines": { 605 | "node": "^16.0.0 || >=18.0.0" 606 | }, 607 | "funding": { 608 | "type": "opencollective", 609 | "url": "https://opencollective.com/typescript-eslint" 610 | } 611 | }, 612 | "node_modules/@typescript-eslint/types": { 613 | "version": "6.21.0", 614 | "dev": true, 615 | "license": "MIT", 616 | "engines": { 617 | "node": "^16.0.0 || >=18.0.0" 618 | }, 619 | "funding": { 620 | "type": "opencollective", 621 | "url": "https://opencollective.com/typescript-eslint" 622 | } 623 | }, 624 | "node_modules/@typescript-eslint/typescript-estree": { 625 | "version": "6.21.0", 626 | "dev": true, 627 | "license": "BSD-2-Clause", 628 | "dependencies": { 629 | "@typescript-eslint/types": "6.21.0", 630 | "@typescript-eslint/visitor-keys": "6.21.0", 631 | "debug": "^4.3.4", 632 | "globby": "^11.1.0", 633 | "is-glob": "^4.0.3", 634 | "minimatch": "9.0.3", 635 | "semver": "^7.5.4", 636 | "ts-api-utils": "^1.0.1" 637 | }, 638 | "engines": { 639 | "node": "^16.0.0 || >=18.0.0" 640 | }, 641 | "funding": { 642 | "type": "opencollective", 643 | "url": "https://opencollective.com/typescript-eslint" 644 | }, 645 | "peerDependenciesMeta": { 646 | "typescript": { 647 | "optional": true 648 | } 649 | } 650 | }, 651 | "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { 652 | "version": "2.0.1", 653 | "dev": true, 654 | "license": "MIT", 655 | "dependencies": { 656 | "balanced-match": "^1.0.0" 657 | } 658 | }, 659 | "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 660 | "version": "9.0.3", 661 | "dev": true, 662 | "license": "ISC", 663 | "dependencies": { 664 | "brace-expansion": "^2.0.1" 665 | }, 666 | "engines": { 667 | "node": ">=16 || 14 >=14.17" 668 | }, 669 | "funding": { 670 | "url": "https://github.com/sponsors/isaacs" 671 | } 672 | }, 673 | "node_modules/@typescript-eslint/visitor-keys": { 674 | "version": "6.21.0", 675 | "dev": true, 676 | "license": "MIT", 677 | "dependencies": { 678 | "@typescript-eslint/types": "6.21.0", 679 | "eslint-visitor-keys": "^3.4.1" 680 | }, 681 | "engines": { 682 | "node": "^16.0.0 || >=18.0.0" 683 | }, 684 | "funding": { 685 | "type": "opencollective", 686 | "url": "https://opencollective.com/typescript-eslint" 687 | } 688 | }, 689 | "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { 690 | "version": "3.4.3", 691 | "dev": true, 692 | "license": "Apache-2.0", 693 | "engines": { 694 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 695 | }, 696 | "funding": { 697 | "url": "https://opencollective.com/eslint" 698 | } 699 | }, 700 | "node_modules/@ungap/structured-clone": { 701 | "version": "1.2.0", 702 | "dev": true, 703 | "license": "ISC" 704 | }, 705 | "node_modules/abbrev": { 706 | "version": "1.1.1", 707 | "license": "ISC", 708 | "optional": true 709 | }, 710 | "node_modules/abort-controller": { 711 | "version": "3.0.0", 712 | "license": "MIT", 713 | "dependencies": { 714 | "event-target-shim": "^5.0.0" 715 | }, 716 | "engines": { 717 | "node": ">=6.5" 718 | } 719 | }, 720 | "node_modules/acorn": { 721 | "version": "8.12.1", 722 | "dev": true, 723 | "license": "MIT", 724 | "bin": { 725 | "acorn": "bin/acorn" 726 | }, 727 | "engines": { 728 | "node": ">=0.4.0" 729 | } 730 | }, 731 | "node_modules/acorn-jsx": { 732 | "version": "5.3.2", 733 | "dev": true, 734 | "license": "MIT", 735 | "peerDependencies": { 736 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 737 | } 738 | }, 739 | "node_modules/agent-base": { 740 | "version": "6.0.2", 741 | "license": "MIT", 742 | "optional": true, 743 | "dependencies": { 744 | "debug": "4" 745 | }, 746 | "engines": { 747 | "node": ">= 6.0.0" 748 | } 749 | }, 750 | "node_modules/agentkeepalive": { 751 | "version": "4.5.0", 752 | "license": "MIT", 753 | "dependencies": { 754 | "humanize-ms": "^1.2.1" 755 | }, 756 | "engines": { 757 | "node": ">= 8.0.0" 758 | } 759 | }, 760 | "node_modules/aggregate-error": { 761 | "version": "3.1.0", 762 | "license": "MIT", 763 | "optional": true, 764 | "dependencies": { 765 | "clean-stack": "^2.0.0", 766 | "indent-string": "^4.0.0" 767 | }, 768 | "engines": { 769 | "node": ">=8" 770 | } 771 | }, 772 | "node_modules/ajv": { 773 | "version": "6.12.6", 774 | "dev": true, 775 | "license": "MIT", 776 | "dependencies": { 777 | "fast-deep-equal": "^3.1.1", 778 | "fast-json-stable-stringify": "^2.0.0", 779 | "json-schema-traverse": "^0.4.1", 780 | "uri-js": "^4.2.2" 781 | }, 782 | "funding": { 783 | "type": "github", 784 | "url": "https://github.com/sponsors/epoberezkin" 785 | } 786 | }, 787 | "node_modules/ansi-escapes": { 788 | "version": "4.3.2", 789 | "license": "MIT", 790 | "dependencies": { 791 | "type-fest": "^0.21.3" 792 | }, 793 | "engines": { 794 | "node": ">=8" 795 | }, 796 | "funding": { 797 | "url": "https://github.com/sponsors/sindresorhus" 798 | } 799 | }, 800 | "node_modules/ansi-regex": { 801 | "version": "5.0.1", 802 | "license": "MIT", 803 | "engines": { 804 | "node": ">=8" 805 | } 806 | }, 807 | "node_modules/ansi-styles": { 808 | "version": "5.2.0", 809 | "dev": true, 810 | "license": "MIT", 811 | "engines": { 812 | "node": ">=10" 813 | }, 814 | "funding": { 815 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 816 | } 817 | }, 818 | "node_modules/any-promise": { 819 | "version": "1.3.0", 820 | "license": "MIT" 821 | }, 822 | "node_modules/aproba": { 823 | "version": "2.0.0", 824 | "license": "ISC", 825 | "optional": true 826 | }, 827 | "node_modules/are-we-there-yet": { 828 | "version": "3.0.1", 829 | "license": "ISC", 830 | "optional": true, 831 | "dependencies": { 832 | "delegates": "^1.0.0", 833 | "readable-stream": "^3.6.0" 834 | }, 835 | "engines": { 836 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 837 | } 838 | }, 839 | "node_modules/are-we-there-yet/node_modules/readable-stream": { 840 | "version": "3.6.2", 841 | "license": "MIT", 842 | "optional": true, 843 | "dependencies": { 844 | "inherits": "^2.0.3", 845 | "string_decoder": "^1.1.1", 846 | "util-deprecate": "^1.0.1" 847 | }, 848 | "engines": { 849 | "node": ">= 6" 850 | } 851 | }, 852 | "node_modules/argparse": { 853 | "version": "2.0.1", 854 | "dev": true, 855 | "license": "Python-2.0" 856 | }, 857 | "node_modules/array-union": { 858 | "version": "2.1.0", 859 | "dev": true, 860 | "license": "MIT", 861 | "engines": { 862 | "node": ">=8" 863 | } 864 | }, 865 | "node_modules/asynckit": { 866 | "version": "0.4.0", 867 | "license": "MIT" 868 | }, 869 | "node_modules/atomic-sleep": { 870 | "version": "1.0.0", 871 | "license": "MIT", 872 | "engines": { 873 | "node": ">=8.0.0" 874 | } 875 | }, 876 | "node_modules/balanced-match": { 877 | "version": "1.0.2", 878 | "devOptional": true, 879 | "license": "MIT" 880 | }, 881 | "node_modules/base64-js": { 882 | "version": "1.5.1", 883 | "funding": [ 884 | { 885 | "type": "github", 886 | "url": "https://github.com/sponsors/feross" 887 | }, 888 | { 889 | "type": "patreon", 890 | "url": "https://www.patreon.com/feross" 891 | }, 892 | { 893 | "type": "consulting", 894 | "url": "https://feross.org/support" 895 | } 896 | ], 897 | "license": "MIT" 898 | }, 899 | "node_modules/bindings": { 900 | "version": "1.5.0", 901 | "license": "MIT", 902 | "dependencies": { 903 | "file-uri-to-path": "1.0.0" 904 | } 905 | }, 906 | "node_modules/bl": { 907 | "version": "4.1.0", 908 | "license": "MIT", 909 | "dependencies": { 910 | "buffer": "^5.5.0", 911 | "inherits": "^2.0.4", 912 | "readable-stream": "^3.4.0" 913 | } 914 | }, 915 | "node_modules/bl/node_modules/buffer": { 916 | "version": "5.7.1", 917 | "funding": [ 918 | { 919 | "type": "github", 920 | "url": "https://github.com/sponsors/feross" 921 | }, 922 | { 923 | "type": "patreon", 924 | "url": "https://www.patreon.com/feross" 925 | }, 926 | { 927 | "type": "consulting", 928 | "url": "https://feross.org/support" 929 | } 930 | ], 931 | "license": "MIT", 932 | "dependencies": { 933 | "base64-js": "^1.3.1", 934 | "ieee754": "^1.1.13" 935 | } 936 | }, 937 | "node_modules/bl/node_modules/readable-stream": { 938 | "version": "3.6.2", 939 | "license": "MIT", 940 | "dependencies": { 941 | "inherits": "^2.0.3", 942 | "string_decoder": "^1.1.1", 943 | "util-deprecate": "^1.0.1" 944 | }, 945 | "engines": { 946 | "node": ">= 6" 947 | } 948 | }, 949 | "node_modules/brace-expansion": { 950 | "version": "1.1.11", 951 | "devOptional": true, 952 | "license": "MIT", 953 | "dependencies": { 954 | "balanced-match": "^1.0.0", 955 | "concat-map": "0.0.1" 956 | } 957 | }, 958 | "node_modules/braces": { 959 | "version": "3.0.3", 960 | "dev": true, 961 | "license": "MIT", 962 | "dependencies": { 963 | "fill-range": "^7.1.1" 964 | }, 965 | "engines": { 966 | "node": ">=8" 967 | } 968 | }, 969 | "node_modules/buffer": { 970 | "version": "6.0.3", 971 | "funding": [ 972 | { 973 | "type": "github", 974 | "url": "https://github.com/sponsors/feross" 975 | }, 976 | { 977 | "type": "patreon", 978 | "url": "https://www.patreon.com/feross" 979 | }, 980 | { 981 | "type": "consulting", 982 | "url": "https://feross.org/support" 983 | } 984 | ], 985 | "license": "MIT", 986 | "dependencies": { 987 | "base64-js": "^1.3.1", 988 | "ieee754": "^1.2.1" 989 | } 990 | }, 991 | "node_modules/buffer-equal-constant-time": { 992 | "version": "1.0.1", 993 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 994 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" 995 | }, 996 | "node_modules/cacache": { 997 | "version": "15.3.0", 998 | "license": "ISC", 999 | "optional": true, 1000 | "dependencies": { 1001 | "@npmcli/fs": "^1.0.0", 1002 | "@npmcli/move-file": "^1.0.1", 1003 | "chownr": "^2.0.0", 1004 | "fs-minipass": "^2.0.0", 1005 | "glob": "^7.1.4", 1006 | "infer-owner": "^1.0.4", 1007 | "lru-cache": "^6.0.0", 1008 | "minipass": "^3.1.1", 1009 | "minipass-collect": "^1.0.2", 1010 | "minipass-flush": "^1.0.5", 1011 | "minipass-pipeline": "^1.2.2", 1012 | "mkdirp": "^1.0.3", 1013 | "p-map": "^4.0.0", 1014 | "promise-inflight": "^1.0.1", 1015 | "rimraf": "^3.0.2", 1016 | "ssri": "^8.0.1", 1017 | "tar": "^6.0.2", 1018 | "unique-filename": "^1.1.1" 1019 | }, 1020 | "engines": { 1021 | "node": ">= 10" 1022 | } 1023 | }, 1024 | "node_modules/cacache/node_modules/lru-cache": { 1025 | "version": "6.0.0", 1026 | "license": "ISC", 1027 | "optional": true, 1028 | "dependencies": { 1029 | "yallist": "^4.0.0" 1030 | }, 1031 | "engines": { 1032 | "node": ">=10" 1033 | } 1034 | }, 1035 | "node_modules/callsites": { 1036 | "version": "3.1.0", 1037 | "dev": true, 1038 | "license": "MIT", 1039 | "engines": { 1040 | "node": ">=6" 1041 | } 1042 | }, 1043 | "node_modules/chalk": { 1044 | "version": "5.3.0", 1045 | "license": "MIT", 1046 | "engines": { 1047 | "node": "^12.17.0 || ^14.13 || >=16.0.0" 1048 | }, 1049 | "funding": { 1050 | "url": "https://github.com/chalk/chalk?sponsor=1" 1051 | } 1052 | }, 1053 | "node_modules/char-regex": { 1054 | "version": "1.0.2", 1055 | "license": "MIT", 1056 | "engines": { 1057 | "node": ">=10" 1058 | } 1059 | }, 1060 | "node_modules/chardet": { 1061 | "version": "0.7.0", 1062 | "license": "MIT" 1063 | }, 1064 | "node_modules/chownr": { 1065 | "version": "2.0.0", 1066 | "license": "ISC", 1067 | "engines": { 1068 | "node": ">=10" 1069 | } 1070 | }, 1071 | "node_modules/clean-stack": { 1072 | "version": "2.2.0", 1073 | "license": "MIT", 1074 | "optional": true, 1075 | "engines": { 1076 | "node": ">=6" 1077 | } 1078 | }, 1079 | "node_modules/cli-cursor": { 1080 | "version": "4.0.0", 1081 | "license": "MIT", 1082 | "dependencies": { 1083 | "restore-cursor": "^4.0.0" 1084 | }, 1085 | "engines": { 1086 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1087 | }, 1088 | "funding": { 1089 | "url": "https://github.com/sponsors/sindresorhus" 1090 | } 1091 | }, 1092 | "node_modules/cli-highlight": { 1093 | "version": "2.1.11", 1094 | "license": "ISC", 1095 | "dependencies": { 1096 | "chalk": "^4.0.0", 1097 | "highlight.js": "^10.7.1", 1098 | "mz": "^2.4.0", 1099 | "parse5": "^5.1.1", 1100 | "parse5-htmlparser2-tree-adapter": "^6.0.0", 1101 | "yargs": "^16.0.0" 1102 | }, 1103 | "bin": { 1104 | "highlight": "bin/highlight" 1105 | }, 1106 | "engines": { 1107 | "node": ">=8.0.0", 1108 | "npm": ">=5.0.0" 1109 | } 1110 | }, 1111 | "node_modules/cli-highlight/node_modules/ansi-styles": { 1112 | "version": "4.3.0", 1113 | "license": "MIT", 1114 | "dependencies": { 1115 | "color-convert": "^2.0.1" 1116 | }, 1117 | "engines": { 1118 | "node": ">=8" 1119 | }, 1120 | "funding": { 1121 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1122 | } 1123 | }, 1124 | "node_modules/cli-highlight/node_modules/chalk": { 1125 | "version": "4.1.2", 1126 | "license": "MIT", 1127 | "dependencies": { 1128 | "ansi-styles": "^4.1.0", 1129 | "supports-color": "^7.1.0" 1130 | }, 1131 | "engines": { 1132 | "node": ">=10" 1133 | }, 1134 | "funding": { 1135 | "url": "https://github.com/chalk/chalk?sponsor=1" 1136 | } 1137 | }, 1138 | "node_modules/cli-highlight/node_modules/highlight.js": { 1139 | "version": "10.7.3", 1140 | "license": "BSD-3-Clause", 1141 | "engines": { 1142 | "node": "*" 1143 | } 1144 | }, 1145 | "node_modules/cli-spinners": { 1146 | "version": "2.9.2", 1147 | "license": "MIT", 1148 | "engines": { 1149 | "node": ">=6" 1150 | }, 1151 | "funding": { 1152 | "url": "https://github.com/sponsors/sindresorhus" 1153 | } 1154 | }, 1155 | "node_modules/cli-table3": { 1156 | "version": "0.6.5", 1157 | "license": "MIT", 1158 | "dependencies": { 1159 | "string-width": "^4.2.0" 1160 | }, 1161 | "engines": { 1162 | "node": "10.* || >= 12.*" 1163 | }, 1164 | "optionalDependencies": { 1165 | "@colors/colors": "1.5.0" 1166 | } 1167 | }, 1168 | "node_modules/cli-width": { 1169 | "version": "4.1.0", 1170 | "license": "ISC", 1171 | "engines": { 1172 | "node": ">= 12" 1173 | } 1174 | }, 1175 | "node_modules/cliui": { 1176 | "version": "7.0.4", 1177 | "license": "ISC", 1178 | "dependencies": { 1179 | "string-width": "^4.2.0", 1180 | "strip-ansi": "^6.0.0", 1181 | "wrap-ansi": "^7.0.0" 1182 | } 1183 | }, 1184 | "node_modules/cliui/node_modules/ansi-styles": { 1185 | "version": "4.3.0", 1186 | "license": "MIT", 1187 | "dependencies": { 1188 | "color-convert": "^2.0.1" 1189 | }, 1190 | "engines": { 1191 | "node": ">=8" 1192 | }, 1193 | "funding": { 1194 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1195 | } 1196 | }, 1197 | "node_modules/cliui/node_modules/wrap-ansi": { 1198 | "version": "7.0.0", 1199 | "license": "MIT", 1200 | "dependencies": { 1201 | "ansi-styles": "^4.0.0", 1202 | "string-width": "^4.1.0", 1203 | "strip-ansi": "^6.0.0" 1204 | }, 1205 | "engines": { 1206 | "node": ">=10" 1207 | }, 1208 | "funding": { 1209 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1210 | } 1211 | }, 1212 | "node_modules/clone": { 1213 | "version": "1.0.4", 1214 | "license": "MIT", 1215 | "engines": { 1216 | "node": ">=0.8" 1217 | } 1218 | }, 1219 | "node_modules/color-convert": { 1220 | "version": "2.0.1", 1221 | "license": "MIT", 1222 | "dependencies": { 1223 | "color-name": "~1.1.4" 1224 | }, 1225 | "engines": { 1226 | "node": ">=7.0.0" 1227 | } 1228 | }, 1229 | "node_modules/color-name": { 1230 | "version": "1.1.4", 1231 | "license": "MIT" 1232 | }, 1233 | "node_modules/color-support": { 1234 | "version": "1.1.3", 1235 | "license": "ISC", 1236 | "optional": true, 1237 | "bin": { 1238 | "color-support": "bin.js" 1239 | } 1240 | }, 1241 | "node_modules/colorette": { 1242 | "version": "2.0.20", 1243 | "license": "MIT" 1244 | }, 1245 | "node_modules/combined-stream": { 1246 | "version": "1.0.8", 1247 | "license": "MIT", 1248 | "dependencies": { 1249 | "delayed-stream": "~1.0.0" 1250 | }, 1251 | "engines": { 1252 | "node": ">= 0.8" 1253 | } 1254 | }, 1255 | "node_modules/commander": { 1256 | "version": "11.1.0", 1257 | "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", 1258 | "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", 1259 | "engines": { 1260 | "node": ">=16" 1261 | } 1262 | }, 1263 | "node_modules/common-tags": { 1264 | "version": "1.8.2", 1265 | "dev": true, 1266 | "license": "MIT", 1267 | "engines": { 1268 | "node": ">=4.0.0" 1269 | } 1270 | }, 1271 | "node_modules/concat-map": { 1272 | "version": "0.0.1", 1273 | "devOptional": true, 1274 | "license": "MIT" 1275 | }, 1276 | "node_modules/console-control-strings": { 1277 | "version": "1.1.0", 1278 | "license": "ISC", 1279 | "optional": true 1280 | }, 1281 | "node_modules/cross-spawn": { 1282 | "version": "7.0.3", 1283 | "dev": true, 1284 | "license": "MIT", 1285 | "dependencies": { 1286 | "path-key": "^3.1.0", 1287 | "shebang-command": "^2.0.0", 1288 | "which": "^2.0.1" 1289 | }, 1290 | "engines": { 1291 | "node": ">= 8" 1292 | } 1293 | }, 1294 | "node_modules/dateformat": { 1295 | "version": "4.6.3", 1296 | "license": "MIT", 1297 | "engines": { 1298 | "node": "*" 1299 | } 1300 | }, 1301 | "node_modules/dbinfoz": { 1302 | "version": "0.14.0", 1303 | "resolved": "https://registry.npmjs.org/dbinfoz/-/dbinfoz-0.14.0.tgz", 1304 | "integrity": "sha512-8NLjmj3gEyxbMu1ZwPEby77QvoEkk5NrHKSwX4oSKeaREherwuSx1y08cXmxBEjrSmvByUX9axoKscuilSXfmg==", 1305 | "dependencies": { 1306 | "mssql": "^11.0.1", 1307 | "mysql2": "^3.9.1", 1308 | "pg": "^8.11.3", 1309 | "sqlite3": "^5.1.7" 1310 | } 1311 | }, 1312 | "node_modules/debug": { 1313 | "version": "4.3.5", 1314 | "license": "MIT", 1315 | "dependencies": { 1316 | "ms": "2.1.2" 1317 | }, 1318 | "engines": { 1319 | "node": ">=6.0" 1320 | }, 1321 | "peerDependenciesMeta": { 1322 | "supports-color": { 1323 | "optional": true 1324 | } 1325 | } 1326 | }, 1327 | "node_modules/decompress-response": { 1328 | "version": "6.0.0", 1329 | "license": "MIT", 1330 | "dependencies": { 1331 | "mimic-response": "^3.1.0" 1332 | }, 1333 | "engines": { 1334 | "node": ">=10" 1335 | }, 1336 | "funding": { 1337 | "url": "https://github.com/sponsors/sindresorhus" 1338 | } 1339 | }, 1340 | "node_modules/deep-extend": { 1341 | "version": "0.6.0", 1342 | "license": "MIT", 1343 | "engines": { 1344 | "node": ">=4.0.0" 1345 | } 1346 | }, 1347 | "node_modules/deep-is": { 1348 | "version": "0.1.4", 1349 | "dev": true, 1350 | "license": "MIT" 1351 | }, 1352 | "node_modules/defaults": { 1353 | "version": "1.0.4", 1354 | "license": "MIT", 1355 | "dependencies": { 1356 | "clone": "^1.0.2" 1357 | }, 1358 | "funding": { 1359 | "url": "https://github.com/sponsors/sindresorhus" 1360 | } 1361 | }, 1362 | "node_modules/define-lazy-prop": { 1363 | "version": "2.0.0", 1364 | "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", 1365 | "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", 1366 | "engines": { 1367 | "node": ">=8" 1368 | } 1369 | }, 1370 | "node_modules/delayed-stream": { 1371 | "version": "1.0.0", 1372 | "license": "MIT", 1373 | "engines": { 1374 | "node": ">=0.4.0" 1375 | } 1376 | }, 1377 | "node_modules/delegates": { 1378 | "version": "1.0.0", 1379 | "license": "MIT", 1380 | "optional": true 1381 | }, 1382 | "node_modules/denque": { 1383 | "version": "2.1.0", 1384 | "license": "Apache-2.0", 1385 | "engines": { 1386 | "node": ">=0.10" 1387 | } 1388 | }, 1389 | "node_modules/detect-libc": { 1390 | "version": "2.0.3", 1391 | "license": "Apache-2.0", 1392 | "engines": { 1393 | "node": ">=8" 1394 | } 1395 | }, 1396 | "node_modules/dir-glob": { 1397 | "version": "3.0.1", 1398 | "dev": true, 1399 | "license": "MIT", 1400 | "dependencies": { 1401 | "path-type": "^4.0.0" 1402 | }, 1403 | "engines": { 1404 | "node": ">=8" 1405 | } 1406 | }, 1407 | "node_modules/dlv": { 1408 | "version": "1.1.3", 1409 | "dev": true, 1410 | "license": "MIT" 1411 | }, 1412 | "node_modules/doctrine": { 1413 | "version": "3.0.0", 1414 | "dev": true, 1415 | "license": "Apache-2.0", 1416 | "dependencies": { 1417 | "esutils": "^2.0.2" 1418 | }, 1419 | "engines": { 1420 | "node": ">=6.0.0" 1421 | } 1422 | }, 1423 | "node_modules/ecdsa-sig-formatter": { 1424 | "version": "1.0.11", 1425 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 1426 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 1427 | "dependencies": { 1428 | "safe-buffer": "^5.0.1" 1429 | } 1430 | }, 1431 | "node_modules/emoji-regex": { 1432 | "version": "8.0.0", 1433 | "license": "MIT" 1434 | }, 1435 | "node_modules/emojilib": { 1436 | "version": "2.4.0", 1437 | "license": "MIT" 1438 | }, 1439 | "node_modules/encoding": { 1440 | "version": "0.1.13", 1441 | "license": "MIT", 1442 | "optional": true, 1443 | "dependencies": { 1444 | "iconv-lite": "^0.6.2" 1445 | } 1446 | }, 1447 | "node_modules/encoding/node_modules/iconv-lite": { 1448 | "version": "0.6.3", 1449 | "license": "MIT", 1450 | "optional": true, 1451 | "dependencies": { 1452 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1453 | }, 1454 | "engines": { 1455 | "node": ">=0.10.0" 1456 | } 1457 | }, 1458 | "node_modules/end-of-stream": { 1459 | "version": "1.4.4", 1460 | "license": "MIT", 1461 | "dependencies": { 1462 | "once": "^1.4.0" 1463 | } 1464 | }, 1465 | "node_modules/env-paths": { 1466 | "version": "2.2.1", 1467 | "license": "MIT", 1468 | "optional": true, 1469 | "engines": { 1470 | "node": ">=6" 1471 | } 1472 | }, 1473 | "node_modules/environment": { 1474 | "version": "1.1.0", 1475 | "license": "MIT", 1476 | "engines": { 1477 | "node": ">=18" 1478 | }, 1479 | "funding": { 1480 | "url": "https://github.com/sponsors/sindresorhus" 1481 | } 1482 | }, 1483 | "node_modules/err-code": { 1484 | "version": "2.0.3", 1485 | "license": "MIT", 1486 | "optional": true 1487 | }, 1488 | "node_modules/escalade": { 1489 | "version": "3.1.2", 1490 | "license": "MIT", 1491 | "engines": { 1492 | "node": ">=6" 1493 | } 1494 | }, 1495 | "node_modules/escape-string-regexp": { 1496 | "version": "4.0.0", 1497 | "dev": true, 1498 | "license": "MIT", 1499 | "engines": { 1500 | "node": ">=10" 1501 | }, 1502 | "funding": { 1503 | "url": "https://github.com/sponsors/sindresorhus" 1504 | } 1505 | }, 1506 | "node_modules/eslint": { 1507 | "version": "9.6.0", 1508 | "dev": true, 1509 | "license": "MIT", 1510 | "dependencies": { 1511 | "@eslint-community/eslint-utils": "^4.2.0", 1512 | "@eslint-community/regexpp": "^4.6.1", 1513 | "@eslint/config-array": "^0.17.0", 1514 | "@eslint/eslintrc": "^3.1.0", 1515 | "@eslint/js": "9.6.0", 1516 | "@humanwhocodes/module-importer": "^1.0.1", 1517 | "@humanwhocodes/retry": "^0.3.0", 1518 | "@nodelib/fs.walk": "^1.2.8", 1519 | "ajv": "^6.12.4", 1520 | "chalk": "^4.0.0", 1521 | "cross-spawn": "^7.0.2", 1522 | "debug": "^4.3.2", 1523 | "escape-string-regexp": "^4.0.0", 1524 | "eslint-scope": "^8.0.1", 1525 | "eslint-visitor-keys": "^4.0.0", 1526 | "espree": "^10.1.0", 1527 | "esquery": "^1.5.0", 1528 | "esutils": "^2.0.2", 1529 | "fast-deep-equal": "^3.1.3", 1530 | "file-entry-cache": "^8.0.0", 1531 | "find-up": "^5.0.0", 1532 | "glob-parent": "^6.0.2", 1533 | "ignore": "^5.2.0", 1534 | "imurmurhash": "^0.1.4", 1535 | "is-glob": "^4.0.0", 1536 | "is-path-inside": "^3.0.3", 1537 | "json-stable-stringify-without-jsonify": "^1.0.1", 1538 | "levn": "^0.4.1", 1539 | "lodash.merge": "^4.6.2", 1540 | "minimatch": "^3.1.2", 1541 | "natural-compare": "^1.4.0", 1542 | "optionator": "^0.9.3", 1543 | "strip-ansi": "^6.0.1", 1544 | "text-table": "^0.2.0" 1545 | }, 1546 | "bin": { 1547 | "eslint": "bin/eslint.js" 1548 | }, 1549 | "engines": { 1550 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1551 | }, 1552 | "funding": { 1553 | "url": "https://eslint.org/donate" 1554 | } 1555 | }, 1556 | "node_modules/eslint-scope": { 1557 | "version": "8.0.1", 1558 | "dev": true, 1559 | "license": "BSD-2-Clause", 1560 | "dependencies": { 1561 | "esrecurse": "^4.3.0", 1562 | "estraverse": "^5.2.0" 1563 | }, 1564 | "engines": { 1565 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1566 | }, 1567 | "funding": { 1568 | "url": "https://opencollective.com/eslint" 1569 | } 1570 | }, 1571 | "node_modules/eslint-visitor-keys": { 1572 | "version": "4.0.0", 1573 | "dev": true, 1574 | "license": "Apache-2.0", 1575 | "engines": { 1576 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1577 | }, 1578 | "funding": { 1579 | "url": "https://opencollective.com/eslint" 1580 | } 1581 | }, 1582 | "node_modules/eslint/node_modules/ansi-styles": { 1583 | "version": "4.3.0", 1584 | "dev": true, 1585 | "license": "MIT", 1586 | "dependencies": { 1587 | "color-convert": "^2.0.1" 1588 | }, 1589 | "engines": { 1590 | "node": ">=8" 1591 | }, 1592 | "funding": { 1593 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1594 | } 1595 | }, 1596 | "node_modules/eslint/node_modules/chalk": { 1597 | "version": "4.1.2", 1598 | "dev": true, 1599 | "license": "MIT", 1600 | "dependencies": { 1601 | "ansi-styles": "^4.1.0", 1602 | "supports-color": "^7.1.0" 1603 | }, 1604 | "engines": { 1605 | "node": ">=10" 1606 | }, 1607 | "funding": { 1608 | "url": "https://github.com/chalk/chalk?sponsor=1" 1609 | } 1610 | }, 1611 | "node_modules/espree": { 1612 | "version": "10.1.0", 1613 | "dev": true, 1614 | "license": "BSD-2-Clause", 1615 | "dependencies": { 1616 | "acorn": "^8.12.0", 1617 | "acorn-jsx": "^5.3.2", 1618 | "eslint-visitor-keys": "^4.0.0" 1619 | }, 1620 | "engines": { 1621 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1622 | }, 1623 | "funding": { 1624 | "url": "https://opencollective.com/eslint" 1625 | } 1626 | }, 1627 | "node_modules/esquery": { 1628 | "version": "1.5.0", 1629 | "dev": true, 1630 | "license": "BSD-3-Clause", 1631 | "dependencies": { 1632 | "estraverse": "^5.1.0" 1633 | }, 1634 | "engines": { 1635 | "node": ">=0.10" 1636 | } 1637 | }, 1638 | "node_modules/esrecurse": { 1639 | "version": "4.3.0", 1640 | "dev": true, 1641 | "license": "BSD-2-Clause", 1642 | "dependencies": { 1643 | "estraverse": "^5.2.0" 1644 | }, 1645 | "engines": { 1646 | "node": ">=4.0" 1647 | } 1648 | }, 1649 | "node_modules/estraverse": { 1650 | "version": "5.3.0", 1651 | "dev": true, 1652 | "license": "BSD-2-Clause", 1653 | "engines": { 1654 | "node": ">=4.0" 1655 | } 1656 | }, 1657 | "node_modules/esutils": { 1658 | "version": "2.0.3", 1659 | "dev": true, 1660 | "license": "BSD-2-Clause", 1661 | "engines": { 1662 | "node": ">=0.10.0" 1663 | } 1664 | }, 1665 | "node_modules/event-target-shim": { 1666 | "version": "5.0.1", 1667 | "license": "MIT", 1668 | "engines": { 1669 | "node": ">=6" 1670 | } 1671 | }, 1672 | "node_modules/events": { 1673 | "version": "3.3.0", 1674 | "license": "MIT", 1675 | "engines": { 1676 | "node": ">=0.8.x" 1677 | } 1678 | }, 1679 | "node_modules/expand-template": { 1680 | "version": "2.0.3", 1681 | "license": "(MIT OR WTFPL)", 1682 | "engines": { 1683 | "node": ">=6" 1684 | } 1685 | }, 1686 | "node_modules/external-editor": { 1687 | "version": "3.1.0", 1688 | "license": "MIT", 1689 | "dependencies": { 1690 | "chardet": "^0.7.0", 1691 | "iconv-lite": "^0.4.24", 1692 | "tmp": "^0.0.33" 1693 | }, 1694 | "engines": { 1695 | "node": ">=4" 1696 | } 1697 | }, 1698 | "node_modules/fast-copy": { 1699 | "version": "3.0.2", 1700 | "license": "MIT" 1701 | }, 1702 | "node_modules/fast-deep-equal": { 1703 | "version": "3.1.3", 1704 | "dev": true, 1705 | "license": "MIT" 1706 | }, 1707 | "node_modules/fast-glob": { 1708 | "version": "3.3.2", 1709 | "dev": true, 1710 | "license": "MIT", 1711 | "dependencies": { 1712 | "@nodelib/fs.stat": "^2.0.2", 1713 | "@nodelib/fs.walk": "^1.2.3", 1714 | "glob-parent": "^5.1.2", 1715 | "merge2": "^1.3.0", 1716 | "micromatch": "^4.0.4" 1717 | }, 1718 | "engines": { 1719 | "node": ">=8.6.0" 1720 | } 1721 | }, 1722 | "node_modules/fast-glob/node_modules/glob-parent": { 1723 | "version": "5.1.2", 1724 | "dev": true, 1725 | "license": "ISC", 1726 | "dependencies": { 1727 | "is-glob": "^4.0.1" 1728 | }, 1729 | "engines": { 1730 | "node": ">= 6" 1731 | } 1732 | }, 1733 | "node_modules/fast-json-stable-stringify": { 1734 | "version": "2.1.0", 1735 | "dev": true, 1736 | "license": "MIT" 1737 | }, 1738 | "node_modules/fast-levenshtein": { 1739 | "version": "2.0.6", 1740 | "dev": true, 1741 | "license": "MIT" 1742 | }, 1743 | "node_modules/fast-redact": { 1744 | "version": "3.5.0", 1745 | "license": "MIT", 1746 | "engines": { 1747 | "node": ">=6" 1748 | } 1749 | }, 1750 | "node_modules/fast-safe-stringify": { 1751 | "version": "2.1.1", 1752 | "license": "MIT" 1753 | }, 1754 | "node_modules/fastq": { 1755 | "version": "1.17.1", 1756 | "dev": true, 1757 | "license": "ISC", 1758 | "dependencies": { 1759 | "reusify": "^1.0.4" 1760 | } 1761 | }, 1762 | "node_modules/file-entry-cache": { 1763 | "version": "8.0.0", 1764 | "dev": true, 1765 | "license": "MIT", 1766 | "dependencies": { 1767 | "flat-cache": "^4.0.0" 1768 | }, 1769 | "engines": { 1770 | "node": ">=16.0.0" 1771 | } 1772 | }, 1773 | "node_modules/file-uri-to-path": { 1774 | "version": "1.0.0", 1775 | "license": "MIT" 1776 | }, 1777 | "node_modules/fill-range": { 1778 | "version": "7.1.1", 1779 | "dev": true, 1780 | "license": "MIT", 1781 | "dependencies": { 1782 | "to-regex-range": "^5.0.1" 1783 | }, 1784 | "engines": { 1785 | "node": ">=8" 1786 | } 1787 | }, 1788 | "node_modules/find-up": { 1789 | "version": "5.0.0", 1790 | "dev": true, 1791 | "license": "MIT", 1792 | "dependencies": { 1793 | "locate-path": "^6.0.0", 1794 | "path-exists": "^4.0.0" 1795 | }, 1796 | "engines": { 1797 | "node": ">=10" 1798 | }, 1799 | "funding": { 1800 | "url": "https://github.com/sponsors/sindresorhus" 1801 | } 1802 | }, 1803 | "node_modules/flat-cache": { 1804 | "version": "4.0.1", 1805 | "dev": true, 1806 | "license": "MIT", 1807 | "dependencies": { 1808 | "flatted": "^3.2.9", 1809 | "keyv": "^4.5.4" 1810 | }, 1811 | "engines": { 1812 | "node": ">=16" 1813 | } 1814 | }, 1815 | "node_modules/flatted": { 1816 | "version": "3.3.1", 1817 | "dev": true, 1818 | "license": "ISC" 1819 | }, 1820 | "node_modules/form-data": { 1821 | "version": "4.0.0", 1822 | "license": "MIT", 1823 | "dependencies": { 1824 | "asynckit": "^0.4.0", 1825 | "combined-stream": "^1.0.8", 1826 | "mime-types": "^2.1.12" 1827 | }, 1828 | "engines": { 1829 | "node": ">= 6" 1830 | } 1831 | }, 1832 | "node_modules/form-data-encoder": { 1833 | "version": "1.7.2", 1834 | "license": "MIT" 1835 | }, 1836 | "node_modules/formdata-node": { 1837 | "version": "4.4.1", 1838 | "license": "MIT", 1839 | "dependencies": { 1840 | "node-domexception": "1.0.0", 1841 | "web-streams-polyfill": "4.0.0-beta.3" 1842 | }, 1843 | "engines": { 1844 | "node": ">= 12.20" 1845 | } 1846 | }, 1847 | "node_modules/formdata-node/node_modules/web-streams-polyfill": { 1848 | "version": "4.0.0-beta.3", 1849 | "license": "MIT", 1850 | "engines": { 1851 | "node": ">= 14" 1852 | } 1853 | }, 1854 | "node_modules/fs-constants": { 1855 | "version": "1.0.0", 1856 | "license": "MIT" 1857 | }, 1858 | "node_modules/fs-minipass": { 1859 | "version": "2.1.0", 1860 | "license": "ISC", 1861 | "dependencies": { 1862 | "minipass": "^3.0.0" 1863 | }, 1864 | "engines": { 1865 | "node": ">= 8" 1866 | } 1867 | }, 1868 | "node_modules/fs.realpath": { 1869 | "version": "1.0.0", 1870 | "devOptional": true, 1871 | "license": "ISC" 1872 | }, 1873 | "node_modules/gauge": { 1874 | "version": "4.0.4", 1875 | "license": "ISC", 1876 | "optional": true, 1877 | "dependencies": { 1878 | "aproba": "^1.0.3 || ^2.0.0", 1879 | "color-support": "^1.1.3", 1880 | "console-control-strings": "^1.1.0", 1881 | "has-unicode": "^2.0.1", 1882 | "signal-exit": "^3.0.7", 1883 | "string-width": "^4.2.3", 1884 | "strip-ansi": "^6.0.1", 1885 | "wide-align": "^1.1.5" 1886 | }, 1887 | "engines": { 1888 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1889 | } 1890 | }, 1891 | "node_modules/generate-function": { 1892 | "version": "2.3.1", 1893 | "license": "MIT", 1894 | "dependencies": { 1895 | "is-property": "^1.0.2" 1896 | } 1897 | }, 1898 | "node_modules/get-caller-file": { 1899 | "version": "2.0.5", 1900 | "license": "ISC", 1901 | "engines": { 1902 | "node": "6.* || 8.* || >= 10.*" 1903 | } 1904 | }, 1905 | "node_modules/get-east-asian-width": { 1906 | "version": "1.2.0", 1907 | "license": "MIT", 1908 | "engines": { 1909 | "node": ">=18" 1910 | }, 1911 | "funding": { 1912 | "url": "https://github.com/sponsors/sindresorhus" 1913 | } 1914 | }, 1915 | "node_modules/get-stdin": { 1916 | "version": "9.0.0", 1917 | "license": "MIT", 1918 | "engines": { 1919 | "node": ">=12" 1920 | }, 1921 | "funding": { 1922 | "url": "https://github.com/sponsors/sindresorhus" 1923 | } 1924 | }, 1925 | "node_modules/github-from-package": { 1926 | "version": "0.0.0", 1927 | "license": "MIT" 1928 | }, 1929 | "node_modules/glob": { 1930 | "version": "7.2.3", 1931 | "devOptional": true, 1932 | "license": "ISC", 1933 | "dependencies": { 1934 | "fs.realpath": "^1.0.0", 1935 | "inflight": "^1.0.4", 1936 | "inherits": "2", 1937 | "minimatch": "^3.1.1", 1938 | "once": "^1.3.0", 1939 | "path-is-absolute": "^1.0.0" 1940 | }, 1941 | "engines": { 1942 | "node": "*" 1943 | }, 1944 | "funding": { 1945 | "url": "https://github.com/sponsors/isaacs" 1946 | } 1947 | }, 1948 | "node_modules/glob-parent": { 1949 | "version": "6.0.2", 1950 | "dev": true, 1951 | "license": "ISC", 1952 | "dependencies": { 1953 | "is-glob": "^4.0.3" 1954 | }, 1955 | "engines": { 1956 | "node": ">=10.13.0" 1957 | } 1958 | }, 1959 | "node_modules/globals": { 1960 | "version": "15.8.0", 1961 | "dev": true, 1962 | "license": "MIT", 1963 | "engines": { 1964 | "node": ">=18" 1965 | }, 1966 | "funding": { 1967 | "url": "https://github.com/sponsors/sindresorhus" 1968 | } 1969 | }, 1970 | "node_modules/globby": { 1971 | "version": "11.1.0", 1972 | "dev": true, 1973 | "license": "MIT", 1974 | "dependencies": { 1975 | "array-union": "^2.1.0", 1976 | "dir-glob": "^3.0.1", 1977 | "fast-glob": "^3.2.9", 1978 | "ignore": "^5.2.0", 1979 | "merge2": "^1.4.1", 1980 | "slash": "^3.0.0" 1981 | }, 1982 | "engines": { 1983 | "node": ">=10" 1984 | }, 1985 | "funding": { 1986 | "url": "https://github.com/sponsors/sindresorhus" 1987 | } 1988 | }, 1989 | "node_modules/graceful-fs": { 1990 | "version": "4.2.11", 1991 | "license": "ISC", 1992 | "optional": true 1993 | }, 1994 | "node_modules/gradient-string": { 1995 | "version": "2.0.2", 1996 | "license": "MIT", 1997 | "dependencies": { 1998 | "chalk": "^4.1.2", 1999 | "tinygradient": "^1.1.5" 2000 | }, 2001 | "engines": { 2002 | "node": ">=10" 2003 | } 2004 | }, 2005 | "node_modules/gradient-string/node_modules/ansi-styles": { 2006 | "version": "4.3.0", 2007 | "license": "MIT", 2008 | "dependencies": { 2009 | "color-convert": "^2.0.1" 2010 | }, 2011 | "engines": { 2012 | "node": ">=8" 2013 | }, 2014 | "funding": { 2015 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2016 | } 2017 | }, 2018 | "node_modules/gradient-string/node_modules/chalk": { 2019 | "version": "4.1.2", 2020 | "license": "MIT", 2021 | "dependencies": { 2022 | "ansi-styles": "^4.1.0", 2023 | "supports-color": "^7.1.0" 2024 | }, 2025 | "engines": { 2026 | "node": ">=10" 2027 | }, 2028 | "funding": { 2029 | "url": "https://github.com/chalk/chalk?sponsor=1" 2030 | } 2031 | }, 2032 | "node_modules/graphemer": { 2033 | "version": "1.4.0", 2034 | "dev": true, 2035 | "license": "MIT" 2036 | }, 2037 | "node_modules/handlebars": { 2038 | "version": "4.7.8", 2039 | "license": "MIT", 2040 | "dependencies": { 2041 | "minimist": "^1.2.5", 2042 | "neo-async": "^2.6.2", 2043 | "source-map": "^0.6.1", 2044 | "wordwrap": "^1.0.0" 2045 | }, 2046 | "bin": { 2047 | "handlebars": "bin/handlebars" 2048 | }, 2049 | "engines": { 2050 | "node": ">=0.4.7" 2051 | }, 2052 | "optionalDependencies": { 2053 | "uglify-js": "^3.1.4" 2054 | } 2055 | }, 2056 | "node_modules/has-ansi": { 2057 | "version": "2.0.0", 2058 | "dev": true, 2059 | "license": "MIT", 2060 | "dependencies": { 2061 | "ansi-regex": "^2.0.0" 2062 | }, 2063 | "engines": { 2064 | "node": ">=0.10.0" 2065 | } 2066 | }, 2067 | "node_modules/has-ansi/node_modules/ansi-regex": { 2068 | "version": "2.1.1", 2069 | "dev": true, 2070 | "license": "MIT", 2071 | "engines": { 2072 | "node": ">=0.10.0" 2073 | } 2074 | }, 2075 | "node_modules/has-flag": { 2076 | "version": "4.0.0", 2077 | "license": "MIT", 2078 | "engines": { 2079 | "node": ">=8" 2080 | } 2081 | }, 2082 | "node_modules/has-unicode": { 2083 | "version": "2.0.1", 2084 | "license": "ISC", 2085 | "optional": true 2086 | }, 2087 | "node_modules/help-me": { 2088 | "version": "5.0.0", 2089 | "license": "MIT" 2090 | }, 2091 | "node_modules/highlight.js": { 2092 | "version": "11.9.0", 2093 | "license": "BSD-3-Clause", 2094 | "engines": { 2095 | "node": ">=12.0.0" 2096 | } 2097 | }, 2098 | "node_modules/http-cache-semantics": { 2099 | "version": "4.1.1", 2100 | "license": "BSD-2-Clause", 2101 | "optional": true 2102 | }, 2103 | "node_modules/http-proxy-agent": { 2104 | "version": "4.0.1", 2105 | "license": "MIT", 2106 | "optional": true, 2107 | "dependencies": { 2108 | "@tootallnate/once": "1", 2109 | "agent-base": "6", 2110 | "debug": "4" 2111 | }, 2112 | "engines": { 2113 | "node": ">= 6" 2114 | } 2115 | }, 2116 | "node_modules/https-proxy-agent": { 2117 | "version": "5.0.1", 2118 | "license": "MIT", 2119 | "optional": true, 2120 | "dependencies": { 2121 | "agent-base": "6", 2122 | "debug": "4" 2123 | }, 2124 | "engines": { 2125 | "node": ">= 6" 2126 | } 2127 | }, 2128 | "node_modules/humanize-ms": { 2129 | "version": "1.2.1", 2130 | "license": "MIT", 2131 | "dependencies": { 2132 | "ms": "^2.0.0" 2133 | } 2134 | }, 2135 | "node_modules/iconv-lite": { 2136 | "version": "0.4.24", 2137 | "license": "MIT", 2138 | "dependencies": { 2139 | "safer-buffer": ">= 2.1.2 < 3" 2140 | }, 2141 | "engines": { 2142 | "node": ">=0.10.0" 2143 | } 2144 | }, 2145 | "node_modules/ieee754": { 2146 | "version": "1.2.1", 2147 | "funding": [ 2148 | { 2149 | "type": "github", 2150 | "url": "https://github.com/sponsors/feross" 2151 | }, 2152 | { 2153 | "type": "patreon", 2154 | "url": "https://www.patreon.com/feross" 2155 | }, 2156 | { 2157 | "type": "consulting", 2158 | "url": "https://feross.org/support" 2159 | } 2160 | ], 2161 | "license": "BSD-3-Clause" 2162 | }, 2163 | "node_modules/ignore": { 2164 | "version": "5.3.1", 2165 | "dev": true, 2166 | "license": "MIT", 2167 | "engines": { 2168 | "node": ">= 4" 2169 | } 2170 | }, 2171 | "node_modules/import-fresh": { 2172 | "version": "3.3.0", 2173 | "dev": true, 2174 | "license": "MIT", 2175 | "dependencies": { 2176 | "parent-module": "^1.0.0", 2177 | "resolve-from": "^4.0.0" 2178 | }, 2179 | "engines": { 2180 | "node": ">=6" 2181 | }, 2182 | "funding": { 2183 | "url": "https://github.com/sponsors/sindresorhus" 2184 | } 2185 | }, 2186 | "node_modules/imurmurhash": { 2187 | "version": "0.1.4", 2188 | "devOptional": true, 2189 | "license": "MIT", 2190 | "engines": { 2191 | "node": ">=0.8.19" 2192 | } 2193 | }, 2194 | "node_modules/indent-string": { 2195 | "version": "4.0.0", 2196 | "devOptional": true, 2197 | "license": "MIT", 2198 | "engines": { 2199 | "node": ">=8" 2200 | } 2201 | }, 2202 | "node_modules/infer-owner": { 2203 | "version": "1.0.4", 2204 | "license": "ISC", 2205 | "optional": true 2206 | }, 2207 | "node_modules/inflight": { 2208 | "version": "1.0.6", 2209 | "devOptional": true, 2210 | "license": "ISC", 2211 | "dependencies": { 2212 | "once": "^1.3.0", 2213 | "wrappy": "1" 2214 | } 2215 | }, 2216 | "node_modules/inherits": { 2217 | "version": "2.0.4", 2218 | "license": "ISC" 2219 | }, 2220 | "node_modules/ini": { 2221 | "version": "1.3.8", 2222 | "license": "ISC" 2223 | }, 2224 | "node_modules/inquirer": { 2225 | "version": "9.3.4", 2226 | "license": "MIT", 2227 | "dependencies": { 2228 | "@inquirer/figures": "^1.0.3", 2229 | "ansi-escapes": "^4.3.2", 2230 | "cli-width": "^4.1.0", 2231 | "external-editor": "^3.1.0", 2232 | "mute-stream": "1.0.0", 2233 | "ora": "^5.4.1", 2234 | "run-async": "^3.0.0", 2235 | "rxjs": "^7.8.1", 2236 | "string-width": "^4.2.3", 2237 | "strip-ansi": "^6.0.1", 2238 | "wrap-ansi": "^6.2.0", 2239 | "yoctocolors-cjs": "^2.1.2" 2240 | }, 2241 | "engines": { 2242 | "node": ">=18" 2243 | } 2244 | }, 2245 | "node_modules/inquirer/node_modules/ansi-styles": { 2246 | "version": "4.3.0", 2247 | "license": "MIT", 2248 | "dependencies": { 2249 | "color-convert": "^2.0.1" 2250 | }, 2251 | "engines": { 2252 | "node": ">=8" 2253 | }, 2254 | "funding": { 2255 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2256 | } 2257 | }, 2258 | "node_modules/inquirer/node_modules/chalk": { 2259 | "version": "4.1.2", 2260 | "license": "MIT", 2261 | "dependencies": { 2262 | "ansi-styles": "^4.1.0", 2263 | "supports-color": "^7.1.0" 2264 | }, 2265 | "engines": { 2266 | "node": ">=10" 2267 | }, 2268 | "funding": { 2269 | "url": "https://github.com/chalk/chalk?sponsor=1" 2270 | } 2271 | }, 2272 | "node_modules/inquirer/node_modules/cli-cursor": { 2273 | "version": "3.1.0", 2274 | "license": "MIT", 2275 | "dependencies": { 2276 | "restore-cursor": "^3.1.0" 2277 | }, 2278 | "engines": { 2279 | "node": ">=8" 2280 | } 2281 | }, 2282 | "node_modules/inquirer/node_modules/is-interactive": { 2283 | "version": "1.0.0", 2284 | "license": "MIT", 2285 | "engines": { 2286 | "node": ">=8" 2287 | } 2288 | }, 2289 | "node_modules/inquirer/node_modules/is-unicode-supported": { 2290 | "version": "0.1.0", 2291 | "license": "MIT", 2292 | "engines": { 2293 | "node": ">=10" 2294 | }, 2295 | "funding": { 2296 | "url": "https://github.com/sponsors/sindresorhus" 2297 | } 2298 | }, 2299 | "node_modules/inquirer/node_modules/log-symbols": { 2300 | "version": "4.1.0", 2301 | "license": "MIT", 2302 | "dependencies": { 2303 | "chalk": "^4.1.0", 2304 | "is-unicode-supported": "^0.1.0" 2305 | }, 2306 | "engines": { 2307 | "node": ">=10" 2308 | }, 2309 | "funding": { 2310 | "url": "https://github.com/sponsors/sindresorhus" 2311 | } 2312 | }, 2313 | "node_modules/inquirer/node_modules/ora": { 2314 | "version": "5.4.1", 2315 | "license": "MIT", 2316 | "dependencies": { 2317 | "bl": "^4.1.0", 2318 | "chalk": "^4.1.0", 2319 | "cli-cursor": "^3.1.0", 2320 | "cli-spinners": "^2.5.0", 2321 | "is-interactive": "^1.0.0", 2322 | "is-unicode-supported": "^0.1.0", 2323 | "log-symbols": "^4.1.0", 2324 | "strip-ansi": "^6.0.0", 2325 | "wcwidth": "^1.0.1" 2326 | }, 2327 | "engines": { 2328 | "node": ">=10" 2329 | }, 2330 | "funding": { 2331 | "url": "https://github.com/sponsors/sindresorhus" 2332 | } 2333 | }, 2334 | "node_modules/inquirer/node_modules/restore-cursor": { 2335 | "version": "3.1.0", 2336 | "license": "MIT", 2337 | "dependencies": { 2338 | "onetime": "^5.1.0", 2339 | "signal-exit": "^3.0.2" 2340 | }, 2341 | "engines": { 2342 | "node": ">=8" 2343 | } 2344 | }, 2345 | "node_modules/ip-address": { 2346 | "version": "9.0.5", 2347 | "license": "MIT", 2348 | "optional": true, 2349 | "dependencies": { 2350 | "jsbn": "1.1.0", 2351 | "sprintf-js": "^1.1.3" 2352 | }, 2353 | "engines": { 2354 | "node": ">= 12" 2355 | } 2356 | }, 2357 | "node_modules/is-docker": { 2358 | "version": "2.2.1", 2359 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", 2360 | "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", 2361 | "bin": { 2362 | "is-docker": "cli.js" 2363 | }, 2364 | "engines": { 2365 | "node": ">=8" 2366 | }, 2367 | "funding": { 2368 | "url": "https://github.com/sponsors/sindresorhus" 2369 | } 2370 | }, 2371 | "node_modules/is-extglob": { 2372 | "version": "2.1.1", 2373 | "dev": true, 2374 | "license": "MIT", 2375 | "engines": { 2376 | "node": ">=0.10.0" 2377 | } 2378 | }, 2379 | "node_modules/is-fullwidth-code-point": { 2380 | "version": "3.0.0", 2381 | "license": "MIT", 2382 | "engines": { 2383 | "node": ">=8" 2384 | } 2385 | }, 2386 | "node_modules/is-glob": { 2387 | "version": "4.0.3", 2388 | "dev": true, 2389 | "license": "MIT", 2390 | "dependencies": { 2391 | "is-extglob": "^2.1.1" 2392 | }, 2393 | "engines": { 2394 | "node": ">=0.10.0" 2395 | } 2396 | }, 2397 | "node_modules/is-interactive": { 2398 | "version": "2.0.0", 2399 | "license": "MIT", 2400 | "engines": { 2401 | "node": ">=12" 2402 | }, 2403 | "funding": { 2404 | "url": "https://github.com/sponsors/sindresorhus" 2405 | } 2406 | }, 2407 | "node_modules/is-lambda": { 2408 | "version": "1.0.1", 2409 | "license": "MIT", 2410 | "optional": true 2411 | }, 2412 | "node_modules/is-number": { 2413 | "version": "7.0.0", 2414 | "dev": true, 2415 | "license": "MIT", 2416 | "engines": { 2417 | "node": ">=0.12.0" 2418 | } 2419 | }, 2420 | "node_modules/is-path-inside": { 2421 | "version": "3.0.3", 2422 | "dev": true, 2423 | "license": "MIT", 2424 | "engines": { 2425 | "node": ">=8" 2426 | } 2427 | }, 2428 | "node_modules/is-property": { 2429 | "version": "1.0.2", 2430 | "license": "MIT" 2431 | }, 2432 | "node_modules/is-unicode-supported": { 2433 | "version": "2.0.0", 2434 | "license": "MIT", 2435 | "engines": { 2436 | "node": ">=18" 2437 | }, 2438 | "funding": { 2439 | "url": "https://github.com/sponsors/sindresorhus" 2440 | } 2441 | }, 2442 | "node_modules/is-wsl": { 2443 | "version": "2.2.0", 2444 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", 2445 | "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", 2446 | "dependencies": { 2447 | "is-docker": "^2.0.0" 2448 | }, 2449 | "engines": { 2450 | "node": ">=8" 2451 | } 2452 | }, 2453 | "node_modules/isexe": { 2454 | "version": "2.0.0", 2455 | "devOptional": true, 2456 | "license": "ISC" 2457 | }, 2458 | "node_modules/joycon": { 2459 | "version": "3.1.1", 2460 | "license": "MIT", 2461 | "engines": { 2462 | "node": ">=10" 2463 | } 2464 | }, 2465 | "node_modules/js-md4": { 2466 | "version": "0.3.2", 2467 | "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", 2468 | "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==" 2469 | }, 2470 | "node_modules/js-yaml": { 2471 | "version": "4.1.0", 2472 | "dev": true, 2473 | "license": "MIT", 2474 | "dependencies": { 2475 | "argparse": "^2.0.1" 2476 | }, 2477 | "bin": { 2478 | "js-yaml": "bin/js-yaml.js" 2479 | } 2480 | }, 2481 | "node_modules/jsbn": { 2482 | "version": "1.1.0", 2483 | "license": "MIT", 2484 | "optional": true 2485 | }, 2486 | "node_modules/json-buffer": { 2487 | "version": "3.0.1", 2488 | "dev": true, 2489 | "license": "MIT" 2490 | }, 2491 | "node_modules/json-schema-traverse": { 2492 | "version": "0.4.1", 2493 | "dev": true, 2494 | "license": "MIT" 2495 | }, 2496 | "node_modules/json-stable-stringify-without-jsonify": { 2497 | "version": "1.0.1", 2498 | "dev": true, 2499 | "license": "MIT" 2500 | }, 2501 | "node_modules/jsonscriptlib": { 2502 | "version": "0.9.0", 2503 | "license": "MIT" 2504 | }, 2505 | "node_modules/jsonwebtoken": { 2506 | "version": "9.0.2", 2507 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", 2508 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", 2509 | "dependencies": { 2510 | "jws": "^3.2.2", 2511 | "lodash.includes": "^4.3.0", 2512 | "lodash.isboolean": "^3.0.3", 2513 | "lodash.isinteger": "^4.0.4", 2514 | "lodash.isnumber": "^3.0.3", 2515 | "lodash.isplainobject": "^4.0.6", 2516 | "lodash.isstring": "^4.0.1", 2517 | "lodash.once": "^4.0.0", 2518 | "ms": "^2.1.1", 2519 | "semver": "^7.5.4" 2520 | }, 2521 | "engines": { 2522 | "node": ">=12", 2523 | "npm": ">=6" 2524 | } 2525 | }, 2526 | "node_modules/jsonwebtoken/node_modules/jwa": { 2527 | "version": "1.4.1", 2528 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 2529 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 2530 | "dependencies": { 2531 | "buffer-equal-constant-time": "1.0.1", 2532 | "ecdsa-sig-formatter": "1.0.11", 2533 | "safe-buffer": "^5.0.1" 2534 | } 2535 | }, 2536 | "node_modules/jsonwebtoken/node_modules/jws": { 2537 | "version": "3.2.2", 2538 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 2539 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 2540 | "dependencies": { 2541 | "jwa": "^1.4.1", 2542 | "safe-buffer": "^5.0.1" 2543 | } 2544 | }, 2545 | "node_modules/jwa": { 2546 | "version": "2.0.0", 2547 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", 2548 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", 2549 | "dependencies": { 2550 | "buffer-equal-constant-time": "1.0.1", 2551 | "ecdsa-sig-formatter": "1.0.11", 2552 | "safe-buffer": "^5.0.1" 2553 | } 2554 | }, 2555 | "node_modules/jws": { 2556 | "version": "4.0.0", 2557 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", 2558 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", 2559 | "dependencies": { 2560 | "jwa": "^2.0.0", 2561 | "safe-buffer": "^5.0.1" 2562 | } 2563 | }, 2564 | "node_modules/keyv": { 2565 | "version": "4.5.4", 2566 | "dev": true, 2567 | "license": "MIT", 2568 | "dependencies": { 2569 | "json-buffer": "3.0.1" 2570 | } 2571 | }, 2572 | "node_modules/levn": { 2573 | "version": "0.4.1", 2574 | "dev": true, 2575 | "license": "MIT", 2576 | "dependencies": { 2577 | "prelude-ls": "^1.2.1", 2578 | "type-check": "~0.4.0" 2579 | }, 2580 | "engines": { 2581 | "node": ">= 0.8.0" 2582 | } 2583 | }, 2584 | "node_modules/locate-path": { 2585 | "version": "6.0.0", 2586 | "dev": true, 2587 | "license": "MIT", 2588 | "dependencies": { 2589 | "p-locate": "^5.0.0" 2590 | }, 2591 | "engines": { 2592 | "node": ">=10" 2593 | }, 2594 | "funding": { 2595 | "url": "https://github.com/sponsors/sindresorhus" 2596 | } 2597 | }, 2598 | "node_modules/lodash": { 2599 | "version": "4.17.21", 2600 | "dev": true, 2601 | "license": "MIT" 2602 | }, 2603 | "node_modules/lodash.includes": { 2604 | "version": "4.3.0", 2605 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 2606 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" 2607 | }, 2608 | "node_modules/lodash.isboolean": { 2609 | "version": "3.0.3", 2610 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 2611 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" 2612 | }, 2613 | "node_modules/lodash.isinteger": { 2614 | "version": "4.0.4", 2615 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 2616 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" 2617 | }, 2618 | "node_modules/lodash.isnumber": { 2619 | "version": "3.0.3", 2620 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 2621 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" 2622 | }, 2623 | "node_modules/lodash.isplainobject": { 2624 | "version": "4.0.6", 2625 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 2626 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" 2627 | }, 2628 | "node_modules/lodash.isstring": { 2629 | "version": "4.0.1", 2630 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 2631 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" 2632 | }, 2633 | "node_modules/lodash.merge": { 2634 | "version": "4.6.2", 2635 | "dev": true, 2636 | "license": "MIT" 2637 | }, 2638 | "node_modules/lodash.once": { 2639 | "version": "4.1.1", 2640 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 2641 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" 2642 | }, 2643 | "node_modules/log-symbols": { 2644 | "version": "6.0.0", 2645 | "license": "MIT", 2646 | "dependencies": { 2647 | "chalk": "^5.3.0", 2648 | "is-unicode-supported": "^1.3.0" 2649 | }, 2650 | "engines": { 2651 | "node": ">=18" 2652 | }, 2653 | "funding": { 2654 | "url": "https://github.com/sponsors/sindresorhus" 2655 | } 2656 | }, 2657 | "node_modules/log-symbols/node_modules/is-unicode-supported": { 2658 | "version": "1.3.0", 2659 | "license": "MIT", 2660 | "engines": { 2661 | "node": ">=12" 2662 | }, 2663 | "funding": { 2664 | "url": "https://github.com/sponsors/sindresorhus" 2665 | } 2666 | }, 2667 | "node_modules/loglevel": { 2668 | "version": "1.9.1", 2669 | "dev": true, 2670 | "license": "MIT", 2671 | "engines": { 2672 | "node": ">= 0.6.0" 2673 | }, 2674 | "funding": { 2675 | "type": "tidelift", 2676 | "url": "https://tidelift.com/funding/github/npm/loglevel" 2677 | } 2678 | }, 2679 | "node_modules/loglevel-colored-level-prefix": { 2680 | "version": "1.0.0", 2681 | "dev": true, 2682 | "license": "MIT", 2683 | "dependencies": { 2684 | "chalk": "^1.1.3", 2685 | "loglevel": "^1.4.1" 2686 | } 2687 | }, 2688 | "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": { 2689 | "version": "2.1.1", 2690 | "dev": true, 2691 | "license": "MIT", 2692 | "engines": { 2693 | "node": ">=0.10.0" 2694 | } 2695 | }, 2696 | "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": { 2697 | "version": "2.2.1", 2698 | "dev": true, 2699 | "license": "MIT", 2700 | "engines": { 2701 | "node": ">=0.10.0" 2702 | } 2703 | }, 2704 | "node_modules/loglevel-colored-level-prefix/node_modules/chalk": { 2705 | "version": "1.1.3", 2706 | "dev": true, 2707 | "license": "MIT", 2708 | "dependencies": { 2709 | "ansi-styles": "^2.2.1", 2710 | "escape-string-regexp": "^1.0.2", 2711 | "has-ansi": "^2.0.0", 2712 | "strip-ansi": "^3.0.0", 2713 | "supports-color": "^2.0.0" 2714 | }, 2715 | "engines": { 2716 | "node": ">=0.10.0" 2717 | } 2718 | }, 2719 | "node_modules/loglevel-colored-level-prefix/node_modules/escape-string-regexp": { 2720 | "version": "1.0.5", 2721 | "dev": true, 2722 | "license": "MIT", 2723 | "engines": { 2724 | "node": ">=0.8.0" 2725 | } 2726 | }, 2727 | "node_modules/loglevel-colored-level-prefix/node_modules/strip-ansi": { 2728 | "version": "3.0.1", 2729 | "dev": true, 2730 | "license": "MIT", 2731 | "dependencies": { 2732 | "ansi-regex": "^2.0.0" 2733 | }, 2734 | "engines": { 2735 | "node": ">=0.10.0" 2736 | } 2737 | }, 2738 | "node_modules/loglevel-colored-level-prefix/node_modules/supports-color": { 2739 | "version": "2.0.0", 2740 | "dev": true, 2741 | "license": "MIT", 2742 | "engines": { 2743 | "node": ">=0.8.0" 2744 | } 2745 | }, 2746 | "node_modules/long": { 2747 | "version": "5.2.3", 2748 | "license": "Apache-2.0" 2749 | }, 2750 | "node_modules/lru-cache": { 2751 | "version": "8.0.5", 2752 | "license": "ISC", 2753 | "engines": { 2754 | "node": ">=16.14" 2755 | } 2756 | }, 2757 | "node_modules/make-fetch-happen": { 2758 | "version": "9.1.0", 2759 | "license": "ISC", 2760 | "optional": true, 2761 | "dependencies": { 2762 | "agentkeepalive": "^4.1.3", 2763 | "cacache": "^15.2.0", 2764 | "http-cache-semantics": "^4.1.0", 2765 | "http-proxy-agent": "^4.0.1", 2766 | "https-proxy-agent": "^5.0.0", 2767 | "is-lambda": "^1.0.1", 2768 | "lru-cache": "^6.0.0", 2769 | "minipass": "^3.1.3", 2770 | "minipass-collect": "^1.0.2", 2771 | "minipass-fetch": "^1.3.2", 2772 | "minipass-flush": "^1.0.5", 2773 | "minipass-pipeline": "^1.2.4", 2774 | "negotiator": "^0.6.2", 2775 | "promise-retry": "^2.0.1", 2776 | "socks-proxy-agent": "^6.0.0", 2777 | "ssri": "^8.0.0" 2778 | }, 2779 | "engines": { 2780 | "node": ">= 10" 2781 | } 2782 | }, 2783 | "node_modules/make-fetch-happen/node_modules/lru-cache": { 2784 | "version": "6.0.0", 2785 | "license": "ISC", 2786 | "optional": true, 2787 | "dependencies": { 2788 | "yallist": "^4.0.0" 2789 | }, 2790 | "engines": { 2791 | "node": ">=10" 2792 | } 2793 | }, 2794 | "node_modules/marked": { 2795 | "version": "13.0.2", 2796 | "license": "MIT", 2797 | "bin": { 2798 | "marked": "bin/marked.js" 2799 | }, 2800 | "engines": { 2801 | "node": ">= 18" 2802 | } 2803 | }, 2804 | "node_modules/marked-terminal": { 2805 | "version": "7.1.0", 2806 | "license": "MIT", 2807 | "dependencies": { 2808 | "ansi-escapes": "^7.0.0", 2809 | "chalk": "^5.3.0", 2810 | "cli-highlight": "^2.1.11", 2811 | "cli-table3": "^0.6.5", 2812 | "node-emoji": "^2.1.3", 2813 | "supports-hyperlinks": "^3.0.0" 2814 | }, 2815 | "engines": { 2816 | "node": ">=16.0.0" 2817 | }, 2818 | "peerDependencies": { 2819 | "marked": ">=1 <14" 2820 | } 2821 | }, 2822 | "node_modules/marked-terminal/node_modules/ansi-escapes": { 2823 | "version": "7.0.0", 2824 | "license": "MIT", 2825 | "dependencies": { 2826 | "environment": "^1.0.0" 2827 | }, 2828 | "engines": { 2829 | "node": ">=18" 2830 | }, 2831 | "funding": { 2832 | "url": "https://github.com/sponsors/sindresorhus" 2833 | } 2834 | }, 2835 | "node_modules/merge2": { 2836 | "version": "1.4.1", 2837 | "dev": true, 2838 | "license": "MIT", 2839 | "engines": { 2840 | "node": ">= 8" 2841 | } 2842 | }, 2843 | "node_modules/micromatch": { 2844 | "version": "4.0.7", 2845 | "dev": true, 2846 | "license": "MIT", 2847 | "dependencies": { 2848 | "braces": "^3.0.3", 2849 | "picomatch": "^2.3.1" 2850 | }, 2851 | "engines": { 2852 | "node": ">=8.6" 2853 | } 2854 | }, 2855 | "node_modules/mime-db": { 2856 | "version": "1.52.0", 2857 | "license": "MIT", 2858 | "engines": { 2859 | "node": ">= 0.6" 2860 | } 2861 | }, 2862 | "node_modules/mime-types": { 2863 | "version": "2.1.35", 2864 | "license": "MIT", 2865 | "dependencies": { 2866 | "mime-db": "1.52.0" 2867 | }, 2868 | "engines": { 2869 | "node": ">= 0.6" 2870 | } 2871 | }, 2872 | "node_modules/mimic-fn": { 2873 | "version": "2.1.0", 2874 | "license": "MIT", 2875 | "engines": { 2876 | "node": ">=6" 2877 | } 2878 | }, 2879 | "node_modules/mimic-response": { 2880 | "version": "3.1.0", 2881 | "license": "MIT", 2882 | "engines": { 2883 | "node": ">=10" 2884 | }, 2885 | "funding": { 2886 | "url": "https://github.com/sponsors/sindresorhus" 2887 | } 2888 | }, 2889 | "node_modules/minimatch": { 2890 | "version": "3.1.2", 2891 | "devOptional": true, 2892 | "license": "ISC", 2893 | "dependencies": { 2894 | "brace-expansion": "^1.1.7" 2895 | }, 2896 | "engines": { 2897 | "node": "*" 2898 | } 2899 | }, 2900 | "node_modules/minimist": { 2901 | "version": "1.2.8", 2902 | "license": "MIT", 2903 | "funding": { 2904 | "url": "https://github.com/sponsors/ljharb" 2905 | } 2906 | }, 2907 | "node_modules/minipass": { 2908 | "version": "3.3.6", 2909 | "license": "ISC", 2910 | "dependencies": { 2911 | "yallist": "^4.0.0" 2912 | }, 2913 | "engines": { 2914 | "node": ">=8" 2915 | } 2916 | }, 2917 | "node_modules/minipass-collect": { 2918 | "version": "1.0.2", 2919 | "license": "ISC", 2920 | "optional": true, 2921 | "dependencies": { 2922 | "minipass": "^3.0.0" 2923 | }, 2924 | "engines": { 2925 | "node": ">= 8" 2926 | } 2927 | }, 2928 | "node_modules/minipass-fetch": { 2929 | "version": "1.4.1", 2930 | "license": "MIT", 2931 | "optional": true, 2932 | "dependencies": { 2933 | "minipass": "^3.1.0", 2934 | "minipass-sized": "^1.0.3", 2935 | "minizlib": "^2.0.0" 2936 | }, 2937 | "engines": { 2938 | "node": ">=8" 2939 | }, 2940 | "optionalDependencies": { 2941 | "encoding": "^0.1.12" 2942 | } 2943 | }, 2944 | "node_modules/minipass-flush": { 2945 | "version": "1.0.5", 2946 | "license": "ISC", 2947 | "optional": true, 2948 | "dependencies": { 2949 | "minipass": "^3.0.0" 2950 | }, 2951 | "engines": { 2952 | "node": ">= 8" 2953 | } 2954 | }, 2955 | "node_modules/minipass-pipeline": { 2956 | "version": "1.2.4", 2957 | "license": "ISC", 2958 | "optional": true, 2959 | "dependencies": { 2960 | "minipass": "^3.0.0" 2961 | }, 2962 | "engines": { 2963 | "node": ">=8" 2964 | } 2965 | }, 2966 | "node_modules/minipass-sized": { 2967 | "version": "1.0.3", 2968 | "license": "ISC", 2969 | "optional": true, 2970 | "dependencies": { 2971 | "minipass": "^3.0.0" 2972 | }, 2973 | "engines": { 2974 | "node": ">=8" 2975 | } 2976 | }, 2977 | "node_modules/minizlib": { 2978 | "version": "2.1.2", 2979 | "license": "MIT", 2980 | "dependencies": { 2981 | "minipass": "^3.0.0", 2982 | "yallist": "^4.0.0" 2983 | }, 2984 | "engines": { 2985 | "node": ">= 8" 2986 | } 2987 | }, 2988 | "node_modules/mkdirp": { 2989 | "version": "1.0.4", 2990 | "license": "MIT", 2991 | "bin": { 2992 | "mkdirp": "bin/cmd.js" 2993 | }, 2994 | "engines": { 2995 | "node": ">=10" 2996 | } 2997 | }, 2998 | "node_modules/mkdirp-classic": { 2999 | "version": "0.5.3", 3000 | "license": "MIT" 3001 | }, 3002 | "node_modules/ms": { 3003 | "version": "2.1.2", 3004 | "license": "MIT" 3005 | }, 3006 | "node_modules/mssql": { 3007 | "version": "11.0.1", 3008 | "resolved": "https://registry.npmjs.org/mssql/-/mssql-11.0.1.tgz", 3009 | "integrity": "sha512-KlGNsugoT90enKlR8/G36H0kTxPthDhmtNUCwEHvgRza5Cjpjoj+P2X6eMpFUDN7pFrJZsKadL4x990G8RBE1w==", 3010 | "dependencies": { 3011 | "@tediousjs/connection-string": "^0.5.0", 3012 | "commander": "^11.0.0", 3013 | "debug": "^4.3.3", 3014 | "rfdc": "^1.3.0", 3015 | "tarn": "^3.0.2", 3016 | "tedious": "^18.2.1" 3017 | }, 3018 | "bin": { 3019 | "mssql": "bin/mssql" 3020 | }, 3021 | "engines": { 3022 | "node": ">=18" 3023 | } 3024 | }, 3025 | "node_modules/mute-stream": { 3026 | "version": "1.0.0", 3027 | "license": "ISC", 3028 | "engines": { 3029 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 3030 | } 3031 | }, 3032 | "node_modules/mysql2": { 3033 | "version": "3.10.2", 3034 | "license": "MIT", 3035 | "dependencies": { 3036 | "denque": "^2.1.0", 3037 | "generate-function": "^2.3.1", 3038 | "iconv-lite": "^0.6.3", 3039 | "long": "^5.2.1", 3040 | "lru-cache": "^8.0.0", 3041 | "named-placeholders": "^1.1.3", 3042 | "seq-queue": "^0.0.5", 3043 | "sqlstring": "^2.3.2" 3044 | }, 3045 | "engines": { 3046 | "node": ">= 8.0" 3047 | } 3048 | }, 3049 | "node_modules/mysql2/node_modules/iconv-lite": { 3050 | "version": "0.6.3", 3051 | "license": "MIT", 3052 | "dependencies": { 3053 | "safer-buffer": ">= 2.1.2 < 3.0.0" 3054 | }, 3055 | "engines": { 3056 | "node": ">=0.10.0" 3057 | } 3058 | }, 3059 | "node_modules/mz": { 3060 | "version": "2.7.0", 3061 | "license": "MIT", 3062 | "dependencies": { 3063 | "any-promise": "^1.0.0", 3064 | "object-assign": "^4.0.1", 3065 | "thenify-all": "^1.0.0" 3066 | } 3067 | }, 3068 | "node_modules/named-placeholders": { 3069 | "version": "1.1.3", 3070 | "license": "MIT", 3071 | "dependencies": { 3072 | "lru-cache": "^7.14.1" 3073 | }, 3074 | "engines": { 3075 | "node": ">=12.0.0" 3076 | } 3077 | }, 3078 | "node_modules/named-placeholders/node_modules/lru-cache": { 3079 | "version": "7.18.3", 3080 | "license": "ISC", 3081 | "engines": { 3082 | "node": ">=12" 3083 | } 3084 | }, 3085 | "node_modules/napi-build-utils": { 3086 | "version": "1.0.2", 3087 | "license": "MIT" 3088 | }, 3089 | "node_modules/native-duplexpair": { 3090 | "version": "1.0.0", 3091 | "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", 3092 | "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==" 3093 | }, 3094 | "node_modules/natural-compare": { 3095 | "version": "1.4.0", 3096 | "dev": true, 3097 | "license": "MIT" 3098 | }, 3099 | "node_modules/negotiator": { 3100 | "version": "0.6.3", 3101 | "license": "MIT", 3102 | "optional": true, 3103 | "engines": { 3104 | "node": ">= 0.6" 3105 | } 3106 | }, 3107 | "node_modules/neo-async": { 3108 | "version": "2.6.2", 3109 | "license": "MIT" 3110 | }, 3111 | "node_modules/node-abi": { 3112 | "version": "3.65.0", 3113 | "license": "MIT", 3114 | "dependencies": { 3115 | "semver": "^7.3.5" 3116 | }, 3117 | "engines": { 3118 | "node": ">=10" 3119 | } 3120 | }, 3121 | "node_modules/node-addon-api": { 3122 | "version": "7.1.0", 3123 | "license": "MIT", 3124 | "engines": { 3125 | "node": "^16 || ^18 || >= 20" 3126 | } 3127 | }, 3128 | "node_modules/node-domexception": { 3129 | "version": "1.0.0", 3130 | "funding": [ 3131 | { 3132 | "type": "github", 3133 | "url": "https://github.com/sponsors/jimmywarting" 3134 | }, 3135 | { 3136 | "type": "github", 3137 | "url": "https://paypal.me/jimmywarting" 3138 | } 3139 | ], 3140 | "license": "MIT", 3141 | "engines": { 3142 | "node": ">=10.5.0" 3143 | } 3144 | }, 3145 | "node_modules/node-emoji": { 3146 | "version": "2.1.3", 3147 | "license": "MIT", 3148 | "dependencies": { 3149 | "@sindresorhus/is": "^4.6.0", 3150 | "char-regex": "^1.0.2", 3151 | "emojilib": "^2.4.0", 3152 | "skin-tone": "^2.0.0" 3153 | }, 3154 | "engines": { 3155 | "node": ">=18" 3156 | } 3157 | }, 3158 | "node_modules/node-fetch": { 3159 | "version": "2.7.0", 3160 | "license": "MIT", 3161 | "dependencies": { 3162 | "whatwg-url": "^5.0.0" 3163 | }, 3164 | "engines": { 3165 | "node": "4.x || >=6.0.0" 3166 | }, 3167 | "peerDependencies": { 3168 | "encoding": "^0.1.0" 3169 | }, 3170 | "peerDependenciesMeta": { 3171 | "encoding": { 3172 | "optional": true 3173 | } 3174 | } 3175 | }, 3176 | "node_modules/node-gyp": { 3177 | "version": "8.4.1", 3178 | "license": "MIT", 3179 | "optional": true, 3180 | "dependencies": { 3181 | "env-paths": "^2.2.0", 3182 | "glob": "^7.1.4", 3183 | "graceful-fs": "^4.2.6", 3184 | "make-fetch-happen": "^9.1.0", 3185 | "nopt": "^5.0.0", 3186 | "npmlog": "^6.0.0", 3187 | "rimraf": "^3.0.2", 3188 | "semver": "^7.3.5", 3189 | "tar": "^6.1.2", 3190 | "which": "^2.0.2" 3191 | }, 3192 | "bin": { 3193 | "node-gyp": "bin/node-gyp.js" 3194 | }, 3195 | "engines": { 3196 | "node": ">= 10.12.0" 3197 | } 3198 | }, 3199 | "node_modules/nopt": { 3200 | "version": "5.0.0", 3201 | "license": "ISC", 3202 | "optional": true, 3203 | "dependencies": { 3204 | "abbrev": "1" 3205 | }, 3206 | "bin": { 3207 | "nopt": "bin/nopt.js" 3208 | }, 3209 | "engines": { 3210 | "node": ">=6" 3211 | } 3212 | }, 3213 | "node_modules/npmlog": { 3214 | "version": "6.0.2", 3215 | "license": "ISC", 3216 | "optional": true, 3217 | "dependencies": { 3218 | "are-we-there-yet": "^3.0.0", 3219 | "console-control-strings": "^1.1.0", 3220 | "gauge": "^4.0.3", 3221 | "set-blocking": "^2.0.0" 3222 | }, 3223 | "engines": { 3224 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 3225 | } 3226 | }, 3227 | "node_modules/object-assign": { 3228 | "version": "4.1.1", 3229 | "license": "MIT", 3230 | "engines": { 3231 | "node": ">=0.10.0" 3232 | } 3233 | }, 3234 | "node_modules/ollama": { 3235 | "version": "0.5.2", 3236 | "license": "MIT", 3237 | "dependencies": { 3238 | "whatwg-fetch": "^3.6.20" 3239 | } 3240 | }, 3241 | "node_modules/on-exit-leak-free": { 3242 | "version": "2.1.2", 3243 | "license": "MIT", 3244 | "engines": { 3245 | "node": ">=14.0.0" 3246 | } 3247 | }, 3248 | "node_modules/once": { 3249 | "version": "1.4.0", 3250 | "license": "ISC", 3251 | "dependencies": { 3252 | "wrappy": "1" 3253 | } 3254 | }, 3255 | "node_modules/onetime": { 3256 | "version": "5.1.2", 3257 | "license": "MIT", 3258 | "dependencies": { 3259 | "mimic-fn": "^2.1.0" 3260 | }, 3261 | "engines": { 3262 | "node": ">=6" 3263 | }, 3264 | "funding": { 3265 | "url": "https://github.com/sponsors/sindresorhus" 3266 | } 3267 | }, 3268 | "node_modules/open": { 3269 | "version": "8.4.2", 3270 | "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", 3271 | "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", 3272 | "dependencies": { 3273 | "define-lazy-prop": "^2.0.0", 3274 | "is-docker": "^2.1.1", 3275 | "is-wsl": "^2.2.0" 3276 | }, 3277 | "engines": { 3278 | "node": ">=12" 3279 | }, 3280 | "funding": { 3281 | "url": "https://github.com/sponsors/sindresorhus" 3282 | } 3283 | }, 3284 | "node_modules/openai": { 3285 | "version": "4.52.3", 3286 | "license": "Apache-2.0", 3287 | "dependencies": { 3288 | "@types/node": "^18.11.18", 3289 | "@types/node-fetch": "^2.6.4", 3290 | "abort-controller": "^3.0.0", 3291 | "agentkeepalive": "^4.2.1", 3292 | "form-data-encoder": "1.7.2", 3293 | "formdata-node": "^4.3.2", 3294 | "node-fetch": "^2.6.7", 3295 | "web-streams-polyfill": "^3.2.1" 3296 | }, 3297 | "bin": { 3298 | "openai": "bin/cli" 3299 | } 3300 | }, 3301 | "node_modules/optionator": { 3302 | "version": "0.9.4", 3303 | "dev": true, 3304 | "license": "MIT", 3305 | "dependencies": { 3306 | "deep-is": "^0.1.3", 3307 | "fast-levenshtein": "^2.0.6", 3308 | "levn": "^0.4.1", 3309 | "prelude-ls": "^1.2.1", 3310 | "type-check": "^0.4.0", 3311 | "word-wrap": "^1.2.5" 3312 | }, 3313 | "engines": { 3314 | "node": ">= 0.8.0" 3315 | } 3316 | }, 3317 | "node_modules/ora": { 3318 | "version": "8.0.1", 3319 | "license": "MIT", 3320 | "dependencies": { 3321 | "chalk": "^5.3.0", 3322 | "cli-cursor": "^4.0.0", 3323 | "cli-spinners": "^2.9.2", 3324 | "is-interactive": "^2.0.0", 3325 | "is-unicode-supported": "^2.0.0", 3326 | "log-symbols": "^6.0.0", 3327 | "stdin-discarder": "^0.2.1", 3328 | "string-width": "^7.0.0", 3329 | "strip-ansi": "^7.1.0" 3330 | }, 3331 | "engines": { 3332 | "node": ">=18" 3333 | }, 3334 | "funding": { 3335 | "url": "https://github.com/sponsors/sindresorhus" 3336 | } 3337 | }, 3338 | "node_modules/ora/node_modules/ansi-regex": { 3339 | "version": "6.0.1", 3340 | "license": "MIT", 3341 | "engines": { 3342 | "node": ">=12" 3343 | }, 3344 | "funding": { 3345 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 3346 | } 3347 | }, 3348 | "node_modules/ora/node_modules/emoji-regex": { 3349 | "version": "10.3.0", 3350 | "license": "MIT" 3351 | }, 3352 | "node_modules/ora/node_modules/string-width": { 3353 | "version": "7.2.0", 3354 | "license": "MIT", 3355 | "dependencies": { 3356 | "emoji-regex": "^10.3.0", 3357 | "get-east-asian-width": "^1.0.0", 3358 | "strip-ansi": "^7.1.0" 3359 | }, 3360 | "engines": { 3361 | "node": ">=18" 3362 | }, 3363 | "funding": { 3364 | "url": "https://github.com/sponsors/sindresorhus" 3365 | } 3366 | }, 3367 | "node_modules/ora/node_modules/strip-ansi": { 3368 | "version": "7.1.0", 3369 | "license": "MIT", 3370 | "dependencies": { 3371 | "ansi-regex": "^6.0.1" 3372 | }, 3373 | "engines": { 3374 | "node": ">=12" 3375 | }, 3376 | "funding": { 3377 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 3378 | } 3379 | }, 3380 | "node_modules/os-tmpdir": { 3381 | "version": "1.0.2", 3382 | "license": "MIT", 3383 | "engines": { 3384 | "node": ">=0.10.0" 3385 | } 3386 | }, 3387 | "node_modules/p-limit": { 3388 | "version": "3.1.0", 3389 | "dev": true, 3390 | "license": "MIT", 3391 | "dependencies": { 3392 | "yocto-queue": "^0.1.0" 3393 | }, 3394 | "engines": { 3395 | "node": ">=10" 3396 | }, 3397 | "funding": { 3398 | "url": "https://github.com/sponsors/sindresorhus" 3399 | } 3400 | }, 3401 | "node_modules/p-locate": { 3402 | "version": "5.0.0", 3403 | "dev": true, 3404 | "license": "MIT", 3405 | "dependencies": { 3406 | "p-limit": "^3.0.2" 3407 | }, 3408 | "engines": { 3409 | "node": ">=10" 3410 | }, 3411 | "funding": { 3412 | "url": "https://github.com/sponsors/sindresorhus" 3413 | } 3414 | }, 3415 | "node_modules/p-map": { 3416 | "version": "4.0.0", 3417 | "license": "MIT", 3418 | "optional": true, 3419 | "dependencies": { 3420 | "aggregate-error": "^3.0.0" 3421 | }, 3422 | "engines": { 3423 | "node": ">=10" 3424 | }, 3425 | "funding": { 3426 | "url": "https://github.com/sponsors/sindresorhus" 3427 | } 3428 | }, 3429 | "node_modules/parent-module": { 3430 | "version": "1.0.1", 3431 | "dev": true, 3432 | "license": "MIT", 3433 | "dependencies": { 3434 | "callsites": "^3.0.0" 3435 | }, 3436 | "engines": { 3437 | "node": ">=6" 3438 | } 3439 | }, 3440 | "node_modules/parse5": { 3441 | "version": "5.1.1", 3442 | "license": "MIT" 3443 | }, 3444 | "node_modules/parse5-htmlparser2-tree-adapter": { 3445 | "version": "6.0.1", 3446 | "license": "MIT", 3447 | "dependencies": { 3448 | "parse5": "^6.0.1" 3449 | } 3450 | }, 3451 | "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { 3452 | "version": "6.0.1", 3453 | "license": "MIT" 3454 | }, 3455 | "node_modules/path-exists": { 3456 | "version": "4.0.0", 3457 | "dev": true, 3458 | "license": "MIT", 3459 | "engines": { 3460 | "node": ">=8" 3461 | } 3462 | }, 3463 | "node_modules/path-is-absolute": { 3464 | "version": "1.0.1", 3465 | "devOptional": true, 3466 | "license": "MIT", 3467 | "engines": { 3468 | "node": ">=0.10.0" 3469 | } 3470 | }, 3471 | "node_modules/path-key": { 3472 | "version": "3.1.1", 3473 | "dev": true, 3474 | "license": "MIT", 3475 | "engines": { 3476 | "node": ">=8" 3477 | } 3478 | }, 3479 | "node_modules/path-type": { 3480 | "version": "4.0.0", 3481 | "dev": true, 3482 | "license": "MIT", 3483 | "engines": { 3484 | "node": ">=8" 3485 | } 3486 | }, 3487 | "node_modules/pg": { 3488 | "version": "8.12.0", 3489 | "license": "MIT", 3490 | "dependencies": { 3491 | "pg-connection-string": "^2.6.4", 3492 | "pg-pool": "^3.6.2", 3493 | "pg-protocol": "^1.6.1", 3494 | "pg-types": "^2.1.0", 3495 | "pgpass": "1.x" 3496 | }, 3497 | "engines": { 3498 | "node": ">= 8.0.0" 3499 | }, 3500 | "optionalDependencies": { 3501 | "pg-cloudflare": "^1.1.1" 3502 | }, 3503 | "peerDependencies": { 3504 | "pg-native": ">=3.0.1" 3505 | }, 3506 | "peerDependenciesMeta": { 3507 | "pg-native": { 3508 | "optional": true 3509 | } 3510 | } 3511 | }, 3512 | "node_modules/pg-cloudflare": { 3513 | "version": "1.1.1", 3514 | "license": "MIT", 3515 | "optional": true 3516 | }, 3517 | "node_modules/pg-connection-string": { 3518 | "version": "2.6.4", 3519 | "license": "MIT" 3520 | }, 3521 | "node_modules/pg-int8": { 3522 | "version": "1.0.1", 3523 | "license": "ISC", 3524 | "engines": { 3525 | "node": ">=4.0.0" 3526 | } 3527 | }, 3528 | "node_modules/pg-pool": { 3529 | "version": "3.6.2", 3530 | "license": "MIT", 3531 | "peerDependencies": { 3532 | "pg": ">=8.0" 3533 | } 3534 | }, 3535 | "node_modules/pg-protocol": { 3536 | "version": "1.6.1", 3537 | "license": "MIT" 3538 | }, 3539 | "node_modules/pg-types": { 3540 | "version": "2.2.0", 3541 | "license": "MIT", 3542 | "dependencies": { 3543 | "pg-int8": "1.0.1", 3544 | "postgres-array": "~2.0.0", 3545 | "postgres-bytea": "~1.0.0", 3546 | "postgres-date": "~1.0.4", 3547 | "postgres-interval": "^1.1.0" 3548 | }, 3549 | "engines": { 3550 | "node": ">=4" 3551 | } 3552 | }, 3553 | "node_modules/pgpass": { 3554 | "version": "1.0.5", 3555 | "license": "MIT", 3556 | "dependencies": { 3557 | "split2": "^4.1.0" 3558 | } 3559 | }, 3560 | "node_modules/picomatch": { 3561 | "version": "2.3.1", 3562 | "dev": true, 3563 | "license": "MIT", 3564 | "engines": { 3565 | "node": ">=8.6" 3566 | }, 3567 | "funding": { 3568 | "url": "https://github.com/sponsors/jonschlinkert" 3569 | } 3570 | }, 3571 | "node_modules/pino": { 3572 | "version": "9.2.0", 3573 | "license": "MIT", 3574 | "dependencies": { 3575 | "atomic-sleep": "^1.0.0", 3576 | "fast-redact": "^3.1.1", 3577 | "on-exit-leak-free": "^2.1.0", 3578 | "pino-abstract-transport": "^1.2.0", 3579 | "pino-std-serializers": "^7.0.0", 3580 | "process-warning": "^3.0.0", 3581 | "quick-format-unescaped": "^4.0.3", 3582 | "real-require": "^0.2.0", 3583 | "safe-stable-stringify": "^2.3.1", 3584 | "sonic-boom": "^4.0.1", 3585 | "thread-stream": "^3.0.0" 3586 | }, 3587 | "bin": { 3588 | "pino": "bin.js" 3589 | } 3590 | }, 3591 | "node_modules/pino-abstract-transport": { 3592 | "version": "1.2.0", 3593 | "license": "MIT", 3594 | "dependencies": { 3595 | "readable-stream": "^4.0.0", 3596 | "split2": "^4.0.0" 3597 | } 3598 | }, 3599 | "node_modules/pino-pretty": { 3600 | "version": "11.2.1", 3601 | "license": "MIT", 3602 | "dependencies": { 3603 | "colorette": "^2.0.7", 3604 | "dateformat": "^4.6.3", 3605 | "fast-copy": "^3.0.2", 3606 | "fast-safe-stringify": "^2.1.1", 3607 | "help-me": "^5.0.0", 3608 | "joycon": "^3.1.1", 3609 | "minimist": "^1.2.6", 3610 | "on-exit-leak-free": "^2.1.0", 3611 | "pino-abstract-transport": "^1.0.0", 3612 | "pump": "^3.0.0", 3613 | "readable-stream": "^4.0.0", 3614 | "secure-json-parse": "^2.4.0", 3615 | "sonic-boom": "^4.0.1", 3616 | "strip-json-comments": "^3.1.1" 3617 | }, 3618 | "bin": { 3619 | "pino-pretty": "bin.js" 3620 | } 3621 | }, 3622 | "node_modules/pino-std-serializers": { 3623 | "version": "7.0.0", 3624 | "license": "MIT" 3625 | }, 3626 | "node_modules/postgres-array": { 3627 | "version": "2.0.0", 3628 | "license": "MIT", 3629 | "engines": { 3630 | "node": ">=4" 3631 | } 3632 | }, 3633 | "node_modules/postgres-bytea": { 3634 | "version": "1.0.0", 3635 | "license": "MIT", 3636 | "engines": { 3637 | "node": ">=0.10.0" 3638 | } 3639 | }, 3640 | "node_modules/postgres-date": { 3641 | "version": "1.0.7", 3642 | "license": "MIT", 3643 | "engines": { 3644 | "node": ">=0.10.0" 3645 | } 3646 | }, 3647 | "node_modules/postgres-interval": { 3648 | "version": "1.2.0", 3649 | "license": "MIT", 3650 | "dependencies": { 3651 | "xtend": "^4.0.0" 3652 | }, 3653 | "engines": { 3654 | "node": ">=0.10.0" 3655 | } 3656 | }, 3657 | "node_modules/prebuild-install": { 3658 | "version": "7.1.2", 3659 | "license": "MIT", 3660 | "dependencies": { 3661 | "detect-libc": "^2.0.0", 3662 | "expand-template": "^2.0.3", 3663 | "github-from-package": "0.0.0", 3664 | "minimist": "^1.2.3", 3665 | "mkdirp-classic": "^0.5.3", 3666 | "napi-build-utils": "^1.0.1", 3667 | "node-abi": "^3.3.0", 3668 | "pump": "^3.0.0", 3669 | "rc": "^1.2.7", 3670 | "simple-get": "^4.0.0", 3671 | "tar-fs": "^2.0.0", 3672 | "tunnel-agent": "^0.6.0" 3673 | }, 3674 | "bin": { 3675 | "prebuild-install": "bin.js" 3676 | }, 3677 | "engines": { 3678 | "node": ">=10" 3679 | } 3680 | }, 3681 | "node_modules/prelude-ls": { 3682 | "version": "1.2.1", 3683 | "dev": true, 3684 | "license": "MIT", 3685 | "engines": { 3686 | "node": ">= 0.8.0" 3687 | } 3688 | }, 3689 | "node_modules/prettier": { 3690 | "version": "3.3.2", 3691 | "dev": true, 3692 | "license": "MIT", 3693 | "bin": { 3694 | "prettier": "bin/prettier.cjs" 3695 | }, 3696 | "engines": { 3697 | "node": ">=14" 3698 | }, 3699 | "funding": { 3700 | "url": "https://github.com/prettier/prettier?sponsor=1" 3701 | } 3702 | }, 3703 | "node_modules/prettier-eslint": { 3704 | "version": "16.3.0", 3705 | "dev": true, 3706 | "license": "MIT", 3707 | "dependencies": { 3708 | "@typescript-eslint/parser": "^6.7.5", 3709 | "common-tags": "^1.4.0", 3710 | "dlv": "^1.1.0", 3711 | "eslint": "^8.7.0", 3712 | "indent-string": "^4.0.0", 3713 | "lodash.merge": "^4.6.0", 3714 | "loglevel-colored-level-prefix": "^1.0.0", 3715 | "prettier": "^3.0.1", 3716 | "pretty-format": "^29.7.0", 3717 | "require-relative": "^0.8.7", 3718 | "typescript": "^5.2.2", 3719 | "vue-eslint-parser": "^9.1.0" 3720 | }, 3721 | "engines": { 3722 | "node": ">=16.10.0" 3723 | }, 3724 | "peerDependencies": { 3725 | "prettier-plugin-svelte": "^3.0.0", 3726 | "svelte-eslint-parser": "*" 3727 | }, 3728 | "peerDependenciesMeta": { 3729 | "prettier-plugin-svelte": { 3730 | "optional": true 3731 | }, 3732 | "svelte-eslint-parser": { 3733 | "optional": true 3734 | } 3735 | } 3736 | }, 3737 | "node_modules/prettier-eslint/node_modules/@eslint/eslintrc": { 3738 | "version": "2.1.4", 3739 | "dev": true, 3740 | "license": "MIT", 3741 | "dependencies": { 3742 | "ajv": "^6.12.4", 3743 | "debug": "^4.3.2", 3744 | "espree": "^9.6.0", 3745 | "globals": "^13.19.0", 3746 | "ignore": "^5.2.0", 3747 | "import-fresh": "^3.2.1", 3748 | "js-yaml": "^4.1.0", 3749 | "minimatch": "^3.1.2", 3750 | "strip-json-comments": "^3.1.1" 3751 | }, 3752 | "engines": { 3753 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 3754 | }, 3755 | "funding": { 3756 | "url": "https://opencollective.com/eslint" 3757 | } 3758 | }, 3759 | "node_modules/prettier-eslint/node_modules/@eslint/js": { 3760 | "version": "8.57.0", 3761 | "dev": true, 3762 | "license": "MIT", 3763 | "engines": { 3764 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 3765 | } 3766 | }, 3767 | "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": { 3768 | "version": "6.21.0", 3769 | "dev": true, 3770 | "license": "BSD-2-Clause", 3771 | "dependencies": { 3772 | "@typescript-eslint/scope-manager": "6.21.0", 3773 | "@typescript-eslint/types": "6.21.0", 3774 | "@typescript-eslint/typescript-estree": "6.21.0", 3775 | "@typescript-eslint/visitor-keys": "6.21.0", 3776 | "debug": "^4.3.4" 3777 | }, 3778 | "engines": { 3779 | "node": "^16.0.0 || >=18.0.0" 3780 | }, 3781 | "funding": { 3782 | "type": "opencollective", 3783 | "url": "https://opencollective.com/typescript-eslint" 3784 | }, 3785 | "peerDependencies": { 3786 | "eslint": "^7.0.0 || ^8.0.0" 3787 | }, 3788 | "peerDependenciesMeta": { 3789 | "typescript": { 3790 | "optional": true 3791 | } 3792 | } 3793 | }, 3794 | "node_modules/prettier-eslint/node_modules/ansi-styles": { 3795 | "version": "4.3.0", 3796 | "dev": true, 3797 | "license": "MIT", 3798 | "dependencies": { 3799 | "color-convert": "^2.0.1" 3800 | }, 3801 | "engines": { 3802 | "node": ">=8" 3803 | }, 3804 | "funding": { 3805 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3806 | } 3807 | }, 3808 | "node_modules/prettier-eslint/node_modules/chalk": { 3809 | "version": "4.1.2", 3810 | "dev": true, 3811 | "license": "MIT", 3812 | "dependencies": { 3813 | "ansi-styles": "^4.1.0", 3814 | "supports-color": "^7.1.0" 3815 | }, 3816 | "engines": { 3817 | "node": ">=10" 3818 | }, 3819 | "funding": { 3820 | "url": "https://github.com/chalk/chalk?sponsor=1" 3821 | } 3822 | }, 3823 | "node_modules/prettier-eslint/node_modules/eslint": { 3824 | "version": "8.57.0", 3825 | "dev": true, 3826 | "license": "MIT", 3827 | "dependencies": { 3828 | "@eslint-community/eslint-utils": "^4.2.0", 3829 | "@eslint-community/regexpp": "^4.6.1", 3830 | "@eslint/eslintrc": "^2.1.4", 3831 | "@eslint/js": "8.57.0", 3832 | "@humanwhocodes/config-array": "^0.11.14", 3833 | "@humanwhocodes/module-importer": "^1.0.1", 3834 | "@nodelib/fs.walk": "^1.2.8", 3835 | "@ungap/structured-clone": "^1.2.0", 3836 | "ajv": "^6.12.4", 3837 | "chalk": "^4.0.0", 3838 | "cross-spawn": "^7.0.2", 3839 | "debug": "^4.3.2", 3840 | "doctrine": "^3.0.0", 3841 | "escape-string-regexp": "^4.0.0", 3842 | "eslint-scope": "^7.2.2", 3843 | "eslint-visitor-keys": "^3.4.3", 3844 | "espree": "^9.6.1", 3845 | "esquery": "^1.4.2", 3846 | "esutils": "^2.0.2", 3847 | "fast-deep-equal": "^3.1.3", 3848 | "file-entry-cache": "^6.0.1", 3849 | "find-up": "^5.0.0", 3850 | "glob-parent": "^6.0.2", 3851 | "globals": "^13.19.0", 3852 | "graphemer": "^1.4.0", 3853 | "ignore": "^5.2.0", 3854 | "imurmurhash": "^0.1.4", 3855 | "is-glob": "^4.0.0", 3856 | "is-path-inside": "^3.0.3", 3857 | "js-yaml": "^4.1.0", 3858 | "json-stable-stringify-without-jsonify": "^1.0.1", 3859 | "levn": "^0.4.1", 3860 | "lodash.merge": "^4.6.2", 3861 | "minimatch": "^3.1.2", 3862 | "natural-compare": "^1.4.0", 3863 | "optionator": "^0.9.3", 3864 | "strip-ansi": "^6.0.1", 3865 | "text-table": "^0.2.0" 3866 | }, 3867 | "bin": { 3868 | "eslint": "bin/eslint.js" 3869 | }, 3870 | "engines": { 3871 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 3872 | }, 3873 | "funding": { 3874 | "url": "https://opencollective.com/eslint" 3875 | } 3876 | }, 3877 | "node_modules/prettier-eslint/node_modules/eslint-scope": { 3878 | "version": "7.2.2", 3879 | "dev": true, 3880 | "license": "BSD-2-Clause", 3881 | "dependencies": { 3882 | "esrecurse": "^4.3.0", 3883 | "estraverse": "^5.2.0" 3884 | }, 3885 | "engines": { 3886 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 3887 | }, 3888 | "funding": { 3889 | "url": "https://opencollective.com/eslint" 3890 | } 3891 | }, 3892 | "node_modules/prettier-eslint/node_modules/eslint-visitor-keys": { 3893 | "version": "3.4.3", 3894 | "dev": true, 3895 | "license": "Apache-2.0", 3896 | "engines": { 3897 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 3898 | }, 3899 | "funding": { 3900 | "url": "https://opencollective.com/eslint" 3901 | } 3902 | }, 3903 | "node_modules/prettier-eslint/node_modules/espree": { 3904 | "version": "9.6.1", 3905 | "dev": true, 3906 | "license": "BSD-2-Clause", 3907 | "dependencies": { 3908 | "acorn": "^8.9.0", 3909 | "acorn-jsx": "^5.3.2", 3910 | "eslint-visitor-keys": "^3.4.1" 3911 | }, 3912 | "engines": { 3913 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 3914 | }, 3915 | "funding": { 3916 | "url": "https://opencollective.com/eslint" 3917 | } 3918 | }, 3919 | "node_modules/prettier-eslint/node_modules/file-entry-cache": { 3920 | "version": "6.0.1", 3921 | "dev": true, 3922 | "license": "MIT", 3923 | "dependencies": { 3924 | "flat-cache": "^3.0.4" 3925 | }, 3926 | "engines": { 3927 | "node": "^10.12.0 || >=12.0.0" 3928 | } 3929 | }, 3930 | "node_modules/prettier-eslint/node_modules/flat-cache": { 3931 | "version": "3.2.0", 3932 | "dev": true, 3933 | "license": "MIT", 3934 | "dependencies": { 3935 | "flatted": "^3.2.9", 3936 | "keyv": "^4.5.3", 3937 | "rimraf": "^3.0.2" 3938 | }, 3939 | "engines": { 3940 | "node": "^10.12.0 || >=12.0.0" 3941 | } 3942 | }, 3943 | "node_modules/prettier-eslint/node_modules/globals": { 3944 | "version": "13.24.0", 3945 | "dev": true, 3946 | "license": "MIT", 3947 | "dependencies": { 3948 | "type-fest": "^0.20.2" 3949 | }, 3950 | "engines": { 3951 | "node": ">=8" 3952 | }, 3953 | "funding": { 3954 | "url": "https://github.com/sponsors/sindresorhus" 3955 | } 3956 | }, 3957 | "node_modules/prettier-eslint/node_modules/type-fest": { 3958 | "version": "0.20.2", 3959 | "dev": true, 3960 | "license": "(MIT OR CC0-1.0)", 3961 | "engines": { 3962 | "node": ">=10" 3963 | }, 3964 | "funding": { 3965 | "url": "https://github.com/sponsors/sindresorhus" 3966 | } 3967 | }, 3968 | "node_modules/pretty-format": { 3969 | "version": "29.7.0", 3970 | "dev": true, 3971 | "license": "MIT", 3972 | "dependencies": { 3973 | "@jest/schemas": "^29.6.3", 3974 | "ansi-styles": "^5.0.0", 3975 | "react-is": "^18.0.0" 3976 | }, 3977 | "engines": { 3978 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3979 | } 3980 | }, 3981 | "node_modules/process": { 3982 | "version": "0.11.10", 3983 | "license": "MIT", 3984 | "engines": { 3985 | "node": ">= 0.6.0" 3986 | } 3987 | }, 3988 | "node_modules/process-warning": { 3989 | "version": "3.0.0", 3990 | "license": "MIT" 3991 | }, 3992 | "node_modules/promise-inflight": { 3993 | "version": "1.0.1", 3994 | "license": "ISC", 3995 | "optional": true 3996 | }, 3997 | "node_modules/promise-retry": { 3998 | "version": "2.0.1", 3999 | "license": "MIT", 4000 | "optional": true, 4001 | "dependencies": { 4002 | "err-code": "^2.0.2", 4003 | "retry": "^0.12.0" 4004 | }, 4005 | "engines": { 4006 | "node": ">=10" 4007 | } 4008 | }, 4009 | "node_modules/pump": { 4010 | "version": "3.0.0", 4011 | "license": "MIT", 4012 | "dependencies": { 4013 | "end-of-stream": "^1.1.0", 4014 | "once": "^1.3.1" 4015 | } 4016 | }, 4017 | "node_modules/punycode": { 4018 | "version": "2.3.1", 4019 | "dev": true, 4020 | "license": "MIT", 4021 | "engines": { 4022 | "node": ">=6" 4023 | } 4024 | }, 4025 | "node_modules/queue-microtask": { 4026 | "version": "1.2.3", 4027 | "dev": true, 4028 | "funding": [ 4029 | { 4030 | "type": "github", 4031 | "url": "https://github.com/sponsors/feross" 4032 | }, 4033 | { 4034 | "type": "patreon", 4035 | "url": "https://www.patreon.com/feross" 4036 | }, 4037 | { 4038 | "type": "consulting", 4039 | "url": "https://feross.org/support" 4040 | } 4041 | ], 4042 | "license": "MIT" 4043 | }, 4044 | "node_modules/quick-format-unescaped": { 4045 | "version": "4.0.4", 4046 | "license": "MIT" 4047 | }, 4048 | "node_modules/rc": { 4049 | "version": "1.2.8", 4050 | "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", 4051 | "dependencies": { 4052 | "deep-extend": "^0.6.0", 4053 | "ini": "~1.3.0", 4054 | "minimist": "^1.2.0", 4055 | "strip-json-comments": "~2.0.1" 4056 | }, 4057 | "bin": { 4058 | "rc": "cli.js" 4059 | } 4060 | }, 4061 | "node_modules/rc/node_modules/strip-json-comments": { 4062 | "version": "2.0.1", 4063 | "license": "MIT", 4064 | "engines": { 4065 | "node": ">=0.10.0" 4066 | } 4067 | }, 4068 | "node_modules/react-is": { 4069 | "version": "18.3.1", 4070 | "dev": true, 4071 | "license": "MIT" 4072 | }, 4073 | "node_modules/readable-stream": { 4074 | "version": "4.5.2", 4075 | "license": "MIT", 4076 | "dependencies": { 4077 | "abort-controller": "^3.0.0", 4078 | "buffer": "^6.0.3", 4079 | "events": "^3.3.0", 4080 | "process": "^0.11.10", 4081 | "string_decoder": "^1.3.0" 4082 | }, 4083 | "engines": { 4084 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 4085 | } 4086 | }, 4087 | "node_modules/real-require": { 4088 | "version": "0.2.0", 4089 | "license": "MIT", 4090 | "engines": { 4091 | "node": ">= 12.13.0" 4092 | } 4093 | }, 4094 | "node_modules/require-directory": { 4095 | "version": "2.1.1", 4096 | "license": "MIT", 4097 | "engines": { 4098 | "node": ">=0.10.0" 4099 | } 4100 | }, 4101 | "node_modules/require-relative": { 4102 | "version": "0.8.7", 4103 | "dev": true, 4104 | "license": "MIT" 4105 | }, 4106 | "node_modules/resolve-from": { 4107 | "version": "4.0.0", 4108 | "dev": true, 4109 | "license": "MIT", 4110 | "engines": { 4111 | "node": ">=4" 4112 | } 4113 | }, 4114 | "node_modules/restore-cursor": { 4115 | "version": "4.0.0", 4116 | "license": "MIT", 4117 | "dependencies": { 4118 | "onetime": "^5.1.0", 4119 | "signal-exit": "^3.0.2" 4120 | }, 4121 | "engines": { 4122 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 4123 | }, 4124 | "funding": { 4125 | "url": "https://github.com/sponsors/sindresorhus" 4126 | } 4127 | }, 4128 | "node_modules/retry": { 4129 | "version": "0.12.0", 4130 | "license": "MIT", 4131 | "optional": true, 4132 | "engines": { 4133 | "node": ">= 4" 4134 | } 4135 | }, 4136 | "node_modules/reusify": { 4137 | "version": "1.0.4", 4138 | "dev": true, 4139 | "license": "MIT", 4140 | "engines": { 4141 | "iojs": ">=1.0.0", 4142 | "node": ">=0.10.0" 4143 | } 4144 | }, 4145 | "node_modules/rfdc": { 4146 | "version": "1.4.1", 4147 | "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", 4148 | "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" 4149 | }, 4150 | "node_modules/rimraf": { 4151 | "version": "3.0.2", 4152 | "devOptional": true, 4153 | "license": "ISC", 4154 | "dependencies": { 4155 | "glob": "^7.1.3" 4156 | }, 4157 | "bin": { 4158 | "rimraf": "bin.js" 4159 | }, 4160 | "funding": { 4161 | "url": "https://github.com/sponsors/isaacs" 4162 | } 4163 | }, 4164 | "node_modules/run-async": { 4165 | "version": "3.0.0", 4166 | "license": "MIT", 4167 | "engines": { 4168 | "node": ">=0.12.0" 4169 | } 4170 | }, 4171 | "node_modules/run-parallel": { 4172 | "version": "1.2.0", 4173 | "dev": true, 4174 | "funding": [ 4175 | { 4176 | "type": "github", 4177 | "url": "https://github.com/sponsors/feross" 4178 | }, 4179 | { 4180 | "type": "patreon", 4181 | "url": "https://www.patreon.com/feross" 4182 | }, 4183 | { 4184 | "type": "consulting", 4185 | "url": "https://feross.org/support" 4186 | } 4187 | ], 4188 | "license": "MIT", 4189 | "dependencies": { 4190 | "queue-microtask": "^1.2.2" 4191 | } 4192 | }, 4193 | "node_modules/rxjs": { 4194 | "version": "7.8.1", 4195 | "license": "Apache-2.0", 4196 | "dependencies": { 4197 | "tslib": "^2.1.0" 4198 | } 4199 | }, 4200 | "node_modules/safe-buffer": { 4201 | "version": "5.2.1", 4202 | "funding": [ 4203 | { 4204 | "type": "github", 4205 | "url": "https://github.com/sponsors/feross" 4206 | }, 4207 | { 4208 | "type": "patreon", 4209 | "url": "https://www.patreon.com/feross" 4210 | }, 4211 | { 4212 | "type": "consulting", 4213 | "url": "https://feross.org/support" 4214 | } 4215 | ], 4216 | "license": "MIT" 4217 | }, 4218 | "node_modules/safe-stable-stringify": { 4219 | "version": "2.4.3", 4220 | "license": "MIT", 4221 | "engines": { 4222 | "node": ">=10" 4223 | } 4224 | }, 4225 | "node_modules/safer-buffer": { 4226 | "version": "2.1.2", 4227 | "license": "MIT" 4228 | }, 4229 | "node_modules/secure-json-parse": { 4230 | "version": "2.7.0", 4231 | "license": "BSD-3-Clause" 4232 | }, 4233 | "node_modules/semver": { 4234 | "version": "7.6.2", 4235 | "license": "ISC", 4236 | "bin": { 4237 | "semver": "bin/semver.js" 4238 | }, 4239 | "engines": { 4240 | "node": ">=10" 4241 | } 4242 | }, 4243 | "node_modules/seq-queue": { 4244 | "version": "0.0.5" 4245 | }, 4246 | "node_modules/set-blocking": { 4247 | "version": "2.0.0", 4248 | "license": "ISC", 4249 | "optional": true 4250 | }, 4251 | "node_modules/shebang-command": { 4252 | "version": "2.0.0", 4253 | "dev": true, 4254 | "license": "MIT", 4255 | "dependencies": { 4256 | "shebang-regex": "^3.0.0" 4257 | }, 4258 | "engines": { 4259 | "node": ">=8" 4260 | } 4261 | }, 4262 | "node_modules/shebang-regex": { 4263 | "version": "3.0.0", 4264 | "dev": true, 4265 | "license": "MIT", 4266 | "engines": { 4267 | "node": ">=8" 4268 | } 4269 | }, 4270 | "node_modules/signal-exit": { 4271 | "version": "3.0.7", 4272 | "license": "ISC" 4273 | }, 4274 | "node_modules/simple-concat": { 4275 | "version": "1.0.1", 4276 | "funding": [ 4277 | { 4278 | "type": "github", 4279 | "url": "https://github.com/sponsors/feross" 4280 | }, 4281 | { 4282 | "type": "patreon", 4283 | "url": "https://www.patreon.com/feross" 4284 | }, 4285 | { 4286 | "type": "consulting", 4287 | "url": "https://feross.org/support" 4288 | } 4289 | ], 4290 | "license": "MIT" 4291 | }, 4292 | "node_modules/simple-get": { 4293 | "version": "4.0.1", 4294 | "funding": [ 4295 | { 4296 | "type": "github", 4297 | "url": "https://github.com/sponsors/feross" 4298 | }, 4299 | { 4300 | "type": "patreon", 4301 | "url": "https://www.patreon.com/feross" 4302 | }, 4303 | { 4304 | "type": "consulting", 4305 | "url": "https://feross.org/support" 4306 | } 4307 | ], 4308 | "license": "MIT", 4309 | "dependencies": { 4310 | "decompress-response": "^6.0.0", 4311 | "once": "^1.3.1", 4312 | "simple-concat": "^1.0.0" 4313 | } 4314 | }, 4315 | "node_modules/skin-tone": { 4316 | "version": "2.0.0", 4317 | "license": "MIT", 4318 | "dependencies": { 4319 | "unicode-emoji-modifier-base": "^1.0.0" 4320 | }, 4321 | "engines": { 4322 | "node": ">=8" 4323 | } 4324 | }, 4325 | "node_modules/slash": { 4326 | "version": "3.0.0", 4327 | "dev": true, 4328 | "license": "MIT", 4329 | "engines": { 4330 | "node": ">=8" 4331 | } 4332 | }, 4333 | "node_modules/smart-buffer": { 4334 | "version": "4.2.0", 4335 | "license": "MIT", 4336 | "optional": true, 4337 | "engines": { 4338 | "node": ">= 6.0.0", 4339 | "npm": ">= 3.0.0" 4340 | } 4341 | }, 4342 | "node_modules/socks": { 4343 | "version": "2.8.3", 4344 | "license": "MIT", 4345 | "optional": true, 4346 | "dependencies": { 4347 | "ip-address": "^9.0.5", 4348 | "smart-buffer": "^4.2.0" 4349 | }, 4350 | "engines": { 4351 | "node": ">= 10.0.0", 4352 | "npm": ">= 3.0.0" 4353 | } 4354 | }, 4355 | "node_modules/socks-proxy-agent": { 4356 | "version": "6.2.1", 4357 | "license": "MIT", 4358 | "optional": true, 4359 | "dependencies": { 4360 | "agent-base": "^6.0.2", 4361 | "debug": "^4.3.3", 4362 | "socks": "^2.6.2" 4363 | }, 4364 | "engines": { 4365 | "node": ">= 10" 4366 | } 4367 | }, 4368 | "node_modules/sonic-boom": { 4369 | "version": "4.0.1", 4370 | "license": "MIT", 4371 | "dependencies": { 4372 | "atomic-sleep": "^1.0.0" 4373 | } 4374 | }, 4375 | "node_modules/source-map": { 4376 | "version": "0.6.1", 4377 | "license": "BSD-3-Clause", 4378 | "engines": { 4379 | "node": ">=0.10.0" 4380 | } 4381 | }, 4382 | "node_modules/split2": { 4383 | "version": "4.2.0", 4384 | "license": "ISC", 4385 | "engines": { 4386 | "node": ">= 10.x" 4387 | } 4388 | }, 4389 | "node_modules/sprintf-js": { 4390 | "version": "1.1.3", 4391 | "license": "BSD-3-Clause" 4392 | }, 4393 | "node_modules/sqlite3": { 4394 | "version": "5.1.7", 4395 | "hasInstallScript": true, 4396 | "license": "BSD-3-Clause", 4397 | "dependencies": { 4398 | "bindings": "^1.5.0", 4399 | "node-addon-api": "^7.0.0", 4400 | "prebuild-install": "^7.1.1", 4401 | "tar": "^6.1.11" 4402 | }, 4403 | "optionalDependencies": { 4404 | "node-gyp": "8.x" 4405 | }, 4406 | "peerDependencies": { 4407 | "node-gyp": "8.x" 4408 | }, 4409 | "peerDependenciesMeta": { 4410 | "node-gyp": { 4411 | "optional": true 4412 | } 4413 | } 4414 | }, 4415 | "node_modules/sqlstring": { 4416 | "version": "2.3.3", 4417 | "license": "MIT", 4418 | "engines": { 4419 | "node": ">= 0.6" 4420 | } 4421 | }, 4422 | "node_modules/ssri": { 4423 | "version": "8.0.1", 4424 | "license": "ISC", 4425 | "optional": true, 4426 | "dependencies": { 4427 | "minipass": "^3.1.1" 4428 | }, 4429 | "engines": { 4430 | "node": ">= 8" 4431 | } 4432 | }, 4433 | "node_modules/stdin-discarder": { 4434 | "version": "0.2.2", 4435 | "license": "MIT", 4436 | "engines": { 4437 | "node": ">=18" 4438 | }, 4439 | "funding": { 4440 | "url": "https://github.com/sponsors/sindresorhus" 4441 | } 4442 | }, 4443 | "node_modules/stoppable": { 4444 | "version": "1.1.0", 4445 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", 4446 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", 4447 | "engines": { 4448 | "node": ">=4", 4449 | "npm": ">=6" 4450 | } 4451 | }, 4452 | "node_modules/string_decoder": { 4453 | "version": "1.3.0", 4454 | "license": "MIT", 4455 | "dependencies": { 4456 | "safe-buffer": "~5.2.0" 4457 | } 4458 | }, 4459 | "node_modules/string-width": { 4460 | "version": "4.2.3", 4461 | "license": "MIT", 4462 | "dependencies": { 4463 | "emoji-regex": "^8.0.0", 4464 | "is-fullwidth-code-point": "^3.0.0", 4465 | "strip-ansi": "^6.0.1" 4466 | }, 4467 | "engines": { 4468 | "node": ">=8" 4469 | } 4470 | }, 4471 | "node_modules/strip-ansi": { 4472 | "version": "6.0.1", 4473 | "license": "MIT", 4474 | "dependencies": { 4475 | "ansi-regex": "^5.0.1" 4476 | }, 4477 | "engines": { 4478 | "node": ">=8" 4479 | } 4480 | }, 4481 | "node_modules/strip-json-comments": { 4482 | "version": "3.1.1", 4483 | "license": "MIT", 4484 | "engines": { 4485 | "node": ">=8" 4486 | }, 4487 | "funding": { 4488 | "url": "https://github.com/sponsors/sindresorhus" 4489 | } 4490 | }, 4491 | "node_modules/supports-color": { 4492 | "version": "7.2.0", 4493 | "license": "MIT", 4494 | "dependencies": { 4495 | "has-flag": "^4.0.0" 4496 | }, 4497 | "engines": { 4498 | "node": ">=8" 4499 | } 4500 | }, 4501 | "node_modules/supports-hyperlinks": { 4502 | "version": "3.0.0", 4503 | "license": "MIT", 4504 | "dependencies": { 4505 | "has-flag": "^4.0.0", 4506 | "supports-color": "^7.0.0" 4507 | }, 4508 | "engines": { 4509 | "node": ">=14.18" 4510 | } 4511 | }, 4512 | "node_modules/tar": { 4513 | "version": "6.2.1", 4514 | "license": "ISC", 4515 | "dependencies": { 4516 | "chownr": "^2.0.0", 4517 | "fs-minipass": "^2.0.0", 4518 | "minipass": "^5.0.0", 4519 | "minizlib": "^2.1.1", 4520 | "mkdirp": "^1.0.3", 4521 | "yallist": "^4.0.0" 4522 | }, 4523 | "engines": { 4524 | "node": ">=10" 4525 | } 4526 | }, 4527 | "node_modules/tar-fs": { 4528 | "version": "2.1.1", 4529 | "license": "MIT", 4530 | "dependencies": { 4531 | "chownr": "^1.1.1", 4532 | "mkdirp-classic": "^0.5.2", 4533 | "pump": "^3.0.0", 4534 | "tar-stream": "^2.1.4" 4535 | } 4536 | }, 4537 | "node_modules/tar-fs/node_modules/chownr": { 4538 | "version": "1.1.4", 4539 | "license": "ISC" 4540 | }, 4541 | "node_modules/tar-stream": { 4542 | "version": "2.2.0", 4543 | "license": "MIT", 4544 | "dependencies": { 4545 | "bl": "^4.0.3", 4546 | "end-of-stream": "^1.4.1", 4547 | "fs-constants": "^1.0.0", 4548 | "inherits": "^2.0.3", 4549 | "readable-stream": "^3.1.1" 4550 | }, 4551 | "engines": { 4552 | "node": ">=6" 4553 | } 4554 | }, 4555 | "node_modules/tar-stream/node_modules/readable-stream": { 4556 | "version": "3.6.2", 4557 | "license": "MIT", 4558 | "dependencies": { 4559 | "inherits": "^2.0.3", 4560 | "string_decoder": "^1.1.1", 4561 | "util-deprecate": "^1.0.1" 4562 | }, 4563 | "engines": { 4564 | "node": ">= 6" 4565 | } 4566 | }, 4567 | "node_modules/tar/node_modules/minipass": { 4568 | "version": "5.0.0", 4569 | "license": "ISC", 4570 | "engines": { 4571 | "node": ">=8" 4572 | } 4573 | }, 4574 | "node_modules/tarn": { 4575 | "version": "3.0.2", 4576 | "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", 4577 | "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", 4578 | "engines": { 4579 | "node": ">=8.0.0" 4580 | } 4581 | }, 4582 | "node_modules/tedious": { 4583 | "version": "18.6.1", 4584 | "resolved": "https://registry.npmjs.org/tedious/-/tedious-18.6.1.tgz", 4585 | "integrity": "sha512-9AvErXXQTd6l7TDd5EmM+nxbOGyhnmdbp/8c3pw+tjaiSXW9usME90ET/CRG1LN1Y9tPMtz/p83z4Q97B4DDpw==", 4586 | "dependencies": { 4587 | "@azure/core-auth": "^1.7.2", 4588 | "@azure/identity": "^4.2.1", 4589 | "@azure/keyvault-keys": "^4.4.0", 4590 | "@js-joda/core": "^5.6.1", 4591 | "@types/node": ">=18", 4592 | "bl": "^6.0.11", 4593 | "iconv-lite": "^0.6.3", 4594 | "js-md4": "^0.3.2", 4595 | "native-duplexpair": "^1.0.0", 4596 | "sprintf-js": "^1.1.3" 4597 | }, 4598 | "engines": { 4599 | "node": ">=18" 4600 | } 4601 | }, 4602 | "node_modules/tedious/node_modules/bl": { 4603 | "version": "6.0.16", 4604 | "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.16.tgz", 4605 | "integrity": "sha512-V/kz+z2Mx5/6qDfRCilmrukUXcXuCoXKg3/3hDvzKKoSUx8CJKudfIoT29XZc3UE9xBvxs5qictiHdprwtteEg==", 4606 | "dependencies": { 4607 | "@types/readable-stream": "^4.0.0", 4608 | "buffer": "^6.0.3", 4609 | "inherits": "^2.0.4", 4610 | "readable-stream": "^4.2.0" 4611 | } 4612 | }, 4613 | "node_modules/tedious/node_modules/iconv-lite": { 4614 | "version": "0.6.3", 4615 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 4616 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 4617 | "dependencies": { 4618 | "safer-buffer": ">= 2.1.2 < 3.0.0" 4619 | }, 4620 | "engines": { 4621 | "node": ">=0.10.0" 4622 | } 4623 | }, 4624 | "node_modules/text-table": { 4625 | "version": "0.2.0", 4626 | "dev": true, 4627 | "license": "MIT" 4628 | }, 4629 | "node_modules/thenify": { 4630 | "version": "3.3.1", 4631 | "license": "MIT", 4632 | "dependencies": { 4633 | "any-promise": "^1.0.0" 4634 | } 4635 | }, 4636 | "node_modules/thenify-all": { 4637 | "version": "1.6.0", 4638 | "license": "MIT", 4639 | "dependencies": { 4640 | "thenify": ">= 3.1.0 < 4" 4641 | }, 4642 | "engines": { 4643 | "node": ">=0.8" 4644 | } 4645 | }, 4646 | "node_modules/thread-stream": { 4647 | "version": "3.1.0", 4648 | "license": "MIT", 4649 | "dependencies": { 4650 | "real-require": "^0.2.0" 4651 | } 4652 | }, 4653 | "node_modules/tinycolor2": { 4654 | "version": "1.6.0", 4655 | "license": "MIT" 4656 | }, 4657 | "node_modules/tinygradient": { 4658 | "version": "1.1.5", 4659 | "license": "MIT", 4660 | "dependencies": { 4661 | "@types/tinycolor2": "^1.4.0", 4662 | "tinycolor2": "^1.0.0" 4663 | } 4664 | }, 4665 | "node_modules/tmp": { 4666 | "version": "0.0.33", 4667 | "license": "MIT", 4668 | "dependencies": { 4669 | "os-tmpdir": "~1.0.2" 4670 | }, 4671 | "engines": { 4672 | "node": ">=0.6.0" 4673 | } 4674 | }, 4675 | "node_modules/to-regex-range": { 4676 | "version": "5.0.1", 4677 | "dev": true, 4678 | "license": "MIT", 4679 | "dependencies": { 4680 | "is-number": "^7.0.0" 4681 | }, 4682 | "engines": { 4683 | "node": ">=8.0" 4684 | } 4685 | }, 4686 | "node_modules/tr46": { 4687 | "version": "0.0.3", 4688 | "license": "MIT" 4689 | }, 4690 | "node_modules/ts-api-utils": { 4691 | "version": "1.3.0", 4692 | "dev": true, 4693 | "license": "MIT", 4694 | "engines": { 4695 | "node": ">=16" 4696 | }, 4697 | "peerDependencies": { 4698 | "typescript": ">=4.2.0" 4699 | } 4700 | }, 4701 | "node_modules/tslib": { 4702 | "version": "2.6.3", 4703 | "license": "0BSD" 4704 | }, 4705 | "node_modules/tunnel-agent": { 4706 | "version": "0.6.0", 4707 | "license": "Apache-2.0", 4708 | "dependencies": { 4709 | "safe-buffer": "^5.0.1" 4710 | }, 4711 | "engines": { 4712 | "node": "*" 4713 | } 4714 | }, 4715 | "node_modules/type-check": { 4716 | "version": "0.4.0", 4717 | "dev": true, 4718 | "license": "MIT", 4719 | "dependencies": { 4720 | "prelude-ls": "^1.2.1" 4721 | }, 4722 | "engines": { 4723 | "node": ">= 0.8.0" 4724 | } 4725 | }, 4726 | "node_modules/type-fest": { 4727 | "version": "0.21.3", 4728 | "license": "(MIT OR CC0-1.0)", 4729 | "engines": { 4730 | "node": ">=10" 4731 | }, 4732 | "funding": { 4733 | "url": "https://github.com/sponsors/sindresorhus" 4734 | } 4735 | }, 4736 | "node_modules/typescript": { 4737 | "version": "5.5.3", 4738 | "dev": true, 4739 | "license": "Apache-2.0", 4740 | "bin": { 4741 | "tsc": "bin/tsc", 4742 | "tsserver": "bin/tsserver" 4743 | }, 4744 | "engines": { 4745 | "node": ">=14.17" 4746 | } 4747 | }, 4748 | "node_modules/uglify-js": { 4749 | "version": "3.18.0", 4750 | "license": "BSD-2-Clause", 4751 | "optional": true, 4752 | "bin": { 4753 | "uglifyjs": "bin/uglifyjs" 4754 | }, 4755 | "engines": { 4756 | "node": ">=0.8.0" 4757 | } 4758 | }, 4759 | "node_modules/undici-types": { 4760 | "version": "5.26.5", 4761 | "license": "MIT" 4762 | }, 4763 | "node_modules/unicode-emoji-modifier-base": { 4764 | "version": "1.0.0", 4765 | "license": "MIT", 4766 | "engines": { 4767 | "node": ">=4" 4768 | } 4769 | }, 4770 | "node_modules/unique-filename": { 4771 | "version": "1.1.1", 4772 | "license": "ISC", 4773 | "optional": true, 4774 | "dependencies": { 4775 | "unique-slug": "^2.0.0" 4776 | } 4777 | }, 4778 | "node_modules/unique-slug": { 4779 | "version": "2.0.2", 4780 | "license": "ISC", 4781 | "optional": true, 4782 | "dependencies": { 4783 | "imurmurhash": "^0.1.4" 4784 | } 4785 | }, 4786 | "node_modules/uri-js": { 4787 | "version": "4.4.1", 4788 | "dev": true, 4789 | "license": "BSD-2-Clause", 4790 | "dependencies": { 4791 | "punycode": "^2.1.0" 4792 | } 4793 | }, 4794 | "node_modules/util-deprecate": { 4795 | "version": "1.0.2", 4796 | "license": "MIT" 4797 | }, 4798 | "node_modules/uuid": { 4799 | "version": "8.3.2", 4800 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 4801 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 4802 | "bin": { 4803 | "uuid": "dist/bin/uuid" 4804 | } 4805 | }, 4806 | "node_modules/vue-eslint-parser": { 4807 | "version": "9.4.3", 4808 | "dev": true, 4809 | "license": "MIT", 4810 | "dependencies": { 4811 | "debug": "^4.3.4", 4812 | "eslint-scope": "^7.1.1", 4813 | "eslint-visitor-keys": "^3.3.0", 4814 | "espree": "^9.3.1", 4815 | "esquery": "^1.4.0", 4816 | "lodash": "^4.17.21", 4817 | "semver": "^7.3.6" 4818 | }, 4819 | "engines": { 4820 | "node": "^14.17.0 || >=16.0.0" 4821 | }, 4822 | "funding": { 4823 | "url": "https://github.com/sponsors/mysticatea" 4824 | }, 4825 | "peerDependencies": { 4826 | "eslint": ">=6.0.0" 4827 | } 4828 | }, 4829 | "node_modules/vue-eslint-parser/node_modules/eslint-scope": { 4830 | "version": "7.2.2", 4831 | "dev": true, 4832 | "license": "BSD-2-Clause", 4833 | "dependencies": { 4834 | "esrecurse": "^4.3.0", 4835 | "estraverse": "^5.2.0" 4836 | }, 4837 | "engines": { 4838 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 4839 | }, 4840 | "funding": { 4841 | "url": "https://opencollective.com/eslint" 4842 | } 4843 | }, 4844 | "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { 4845 | "version": "3.4.3", 4846 | "dev": true, 4847 | "license": "Apache-2.0", 4848 | "engines": { 4849 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 4850 | }, 4851 | "funding": { 4852 | "url": "https://opencollective.com/eslint" 4853 | } 4854 | }, 4855 | "node_modules/vue-eslint-parser/node_modules/espree": { 4856 | "version": "9.6.1", 4857 | "dev": true, 4858 | "license": "BSD-2-Clause", 4859 | "dependencies": { 4860 | "acorn": "^8.9.0", 4861 | "acorn-jsx": "^5.3.2", 4862 | "eslint-visitor-keys": "^3.4.1" 4863 | }, 4864 | "engines": { 4865 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 4866 | }, 4867 | "funding": { 4868 | "url": "https://opencollective.com/eslint" 4869 | } 4870 | }, 4871 | "node_modules/wcwidth": { 4872 | "version": "1.0.1", 4873 | "license": "MIT", 4874 | "dependencies": { 4875 | "defaults": "^1.0.3" 4876 | } 4877 | }, 4878 | "node_modules/web-streams-polyfill": { 4879 | "version": "3.3.3", 4880 | "license": "MIT", 4881 | "engines": { 4882 | "node": ">= 8" 4883 | } 4884 | }, 4885 | "node_modules/webidl-conversions": { 4886 | "version": "3.0.1", 4887 | "license": "BSD-2-Clause" 4888 | }, 4889 | "node_modules/whatwg-fetch": { 4890 | "version": "3.6.20", 4891 | "license": "MIT" 4892 | }, 4893 | "node_modules/whatwg-url": { 4894 | "version": "5.0.0", 4895 | "license": "MIT", 4896 | "dependencies": { 4897 | "tr46": "~0.0.3", 4898 | "webidl-conversions": "^3.0.0" 4899 | } 4900 | }, 4901 | "node_modules/which": { 4902 | "version": "2.0.2", 4903 | "devOptional": true, 4904 | "license": "ISC", 4905 | "dependencies": { 4906 | "isexe": "^2.0.0" 4907 | }, 4908 | "bin": { 4909 | "node-which": "bin/node-which" 4910 | }, 4911 | "engines": { 4912 | "node": ">= 8" 4913 | } 4914 | }, 4915 | "node_modules/wide-align": { 4916 | "version": "1.1.5", 4917 | "license": "ISC", 4918 | "optional": true, 4919 | "dependencies": { 4920 | "string-width": "^1.0.2 || 2 || 3 || 4" 4921 | } 4922 | }, 4923 | "node_modules/word-wrap": { 4924 | "version": "1.2.5", 4925 | "dev": true, 4926 | "license": "MIT", 4927 | "engines": { 4928 | "node": ">=0.10.0" 4929 | } 4930 | }, 4931 | "node_modules/wordwrap": { 4932 | "version": "1.0.0", 4933 | "license": "MIT" 4934 | }, 4935 | "node_modules/wrap-ansi": { 4936 | "version": "6.2.0", 4937 | "license": "MIT", 4938 | "dependencies": { 4939 | "ansi-styles": "^4.0.0", 4940 | "string-width": "^4.1.0", 4941 | "strip-ansi": "^6.0.0" 4942 | }, 4943 | "engines": { 4944 | "node": ">=8" 4945 | } 4946 | }, 4947 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 4948 | "version": "4.3.0", 4949 | "license": "MIT", 4950 | "dependencies": { 4951 | "color-convert": "^2.0.1" 4952 | }, 4953 | "engines": { 4954 | "node": ">=8" 4955 | }, 4956 | "funding": { 4957 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 4958 | } 4959 | }, 4960 | "node_modules/wrappy": { 4961 | "version": "1.0.2", 4962 | "license": "ISC" 4963 | }, 4964 | "node_modules/xtend": { 4965 | "version": "4.0.2", 4966 | "license": "MIT", 4967 | "engines": { 4968 | "node": ">=0.4" 4969 | } 4970 | }, 4971 | "node_modules/y18n": { 4972 | "version": "5.0.8", 4973 | "license": "ISC", 4974 | "engines": { 4975 | "node": ">=10" 4976 | } 4977 | }, 4978 | "node_modules/yallist": { 4979 | "version": "4.0.0", 4980 | "license": "ISC" 4981 | }, 4982 | "node_modules/yargs": { 4983 | "version": "16.2.0", 4984 | "license": "MIT", 4985 | "dependencies": { 4986 | "cliui": "^7.0.2", 4987 | "escalade": "^3.1.1", 4988 | "get-caller-file": "^2.0.5", 4989 | "require-directory": "^2.1.1", 4990 | "string-width": "^4.2.0", 4991 | "y18n": "^5.0.5", 4992 | "yargs-parser": "^20.2.2" 4993 | }, 4994 | "engines": { 4995 | "node": ">=10" 4996 | } 4997 | }, 4998 | "node_modules/yargs-parser": { 4999 | "version": "20.2.9", 5000 | "license": "ISC", 5001 | "engines": { 5002 | "node": ">=10" 5003 | } 5004 | }, 5005 | "node_modules/yocto-queue": { 5006 | "version": "0.1.0", 5007 | "dev": true, 5008 | "license": "MIT", 5009 | "engines": { 5010 | "node": ">=10" 5011 | }, 5012 | "funding": { 5013 | "url": "https://github.com/sponsors/sindresorhus" 5014 | } 5015 | }, 5016 | "node_modules/yoctocolors-cjs": { 5017 | "version": "2.1.2", 5018 | "license": "MIT", 5019 | "engines": { 5020 | "node": ">=18" 5021 | }, 5022 | "funding": { 5023 | "url": "https://github.com/sponsors/sindresorhus" 5024 | } 5025 | } 5026 | } 5027 | } 5028 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "command-ai", 3 | "version": "0.31.0", 4 | "description": "Command AI", 5 | "main": "ai.js", 6 | "type": "module", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/CommandAI/ai-cli" 10 | }, 11 | "bin": { 12 | "ai": "./ai.js", 13 | "ai!": "./ai!.js", 14 | "aic": "./aic.js", 15 | "aic!": "./aic!.js", 16 | "aiq": "./aiq.js", 17 | "aiq!": "./aiq!.js" 18 | }, 19 | "scripts": { 20 | "start": "node ai.js" 21 | }, 22 | "keywords": [ 23 | "jsonscript", 24 | "script", 25 | "execution", 26 | "commands", 27 | "file-operations", 28 | "ai", 29 | "artificial intelligence", 30 | "cli", 31 | "sql", 32 | "database", 33 | "mysql", 34 | "postgres", 35 | "sqlite" 36 | ], 37 | "author": "Jason Jacobs ", 38 | "license": "MIT", 39 | "dependencies": { 40 | "chalk": "^5.3.0", 41 | "dbinfoz": "^0.14.0", 42 | "get-stdin": "^9.0.0", 43 | "gradient-string": "^2.0.2", 44 | "handlebars": "^4.7.8", 45 | "highlight.js": "^11.9.0", 46 | "inquirer": "^9.3.4", 47 | "jsonscriptlib": "^0.9.0", 48 | "marked": "^13.0.2", 49 | "marked-terminal": "^7.1.0", 50 | "ollama": "^0.5.2", 51 | "openai": "^4.52.3", 52 | "ora": "^8.0.1", 53 | "pino": "^9.2.0", 54 | "pino-pretty": "^11.2.1" 55 | }, 56 | "devDependencies": { 57 | "@eslint/js": "^9.6.0", 58 | "eslint": "^9.6.0", 59 | "globals": "^15.8.0", 60 | "prettier": "^3.3.2", 61 | "prettier-eslint": "^16.3.0" 62 | }, 63 | "engines": { 64 | "node": ">=18.0.0" 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /prompts/command/default.hbs: -------------------------------------------------------------------------------- 1 | I am at a command line on {{osType}} (version {{osVersion}}), 2 | using {{shell}} shell, and logged in as {{user}} 3 | in the directory '{{cwd}}'. 4 | {{#if hasRootPermissions}} 5 | I have root permissions. 6 | {{else}} 7 | I do not have root permissions. 8 | {{/if}} 9 | 10 | I would like to do the following: {{command}} 11 | 12 | Format your response in the following JSON format. Only return the JSON object. 13 | 1. Structure: The JSON is an array of objects. Each object represents a step in the process. 14 | 2. Command Execution: Each object can have a "cmd" field, which contains a command to be executed in the terminal. 15 | 3. File Creation: Each object can also have a "file" field. The "file" field contains an object with two properties: 16 | - "name": The name of the file to be created, including a path if necessary (defaults to the same directory). 17 | - "data": The content to be written into the file. 18 | 4. Comments: Each object can have a "comment" field that provides a description or explanation of the step. 19 | 5. Order: The steps are executed in the order they appear in the array, from top to bottom. -------------------------------------------------------------------------------- /prompts/command/llama3:8b.hbs: -------------------------------------------------------------------------------- 1 | I am at a command line on {{osType}} (version {{osVersion}}), 2 | using {{shell}} shell, and logged in as {{user}} 3 | in the directory '{{cwd}}'. 4 | {{#if hasRootPermissions}} 5 | I have root permissions. 6 | {{else}} 7 | I do not have root permissions. 8 | {{/if}} 9 | 10 | I would like to do the following: {{command}} 11 | 12 | You should only figure out one solution to the problem. 13 | 14 | Format your response in the following JSON format. 15 | 1. Structure: The JSON is an array of objects. Each object represents a step in the process. 16 | 2. Command Execution: Each object can have a "cmd" field, which contains a command to be executed in the terminal. 17 | 3. File Creation: Each object can also have a "file" field. The "file" field contains an object with two properties: 18 | - "name": The name of the file to be created, including a path if necessary (defaults to the same directory). 19 | - "data": The content to be written into the file. 20 | 4. Comments: Each object can have a "comment" field that provides a description or explanation of the step. 21 | 5. Order: The steps are executed in the order they appear in the array, from top to bottom. 22 | 23 | Only return the JSON object. Do not add comments or suggestions around the object. -------------------------------------------------------------------------------- /prompts/query/default.hbs: -------------------------------------------------------------------------------- 1 | You are an AI assistant designed to create {{dbType}} SQL queries. 2 | 3 | The user will request you to get information or update tables. You will generate the SQL to carry out that task. 4 | If the user want to delete or update records you will need to supply both the update query and a query to show which records will be effected. 5 | 6 | Your responses will ONLY be in JSON with three keys: 7 | 1. query: the sql query to carry out the task 8 | 2. preview_query: the SQL query to preview which up to 10 records will be affected (only for DELETE and UPDATE queries). 9 | 3. preview_count: the SQL query to count how many records will be affected (only for DELETE and UPDATE queries). 10 | 11 | example would be 12 | { 13 | "query": "DELETE FROM users WHERE age > 30", 14 | "preview_query": "SELECT * FROM users WHERE age > 30 LIMIT 10", 15 | "preview_count": "SELECT COUNT(*) as count FROM users WHERE age > 30" 16 | } 17 | 18 | below is the tables and schemas in json format 19 | 20 | {{tablesAndSchemas}} --------------------------------------------------------------------------------