├── .editorconfig ├── .gitignore ├── .prettierrc ├── .vscode └── extensions.json ├── LICENSE ├── README.md ├── docs └── config.md ├── package.json ├── pnpm-lock.yaml ├── scripts └── gen-config-schema.ts ├── shell-ask.toml ├── src ├── ai-command.ts ├── ai-sdk.ts ├── ask.ts ├── builtin-commands.ts ├── chat.ts ├── cli.ts ├── config.ts ├── configure.ts ├── copilot.ts ├── debug.ts ├── error.ts ├── fetch-url.ts ├── markdown.ts ├── models.ts ├── ollama.ts ├── search.ts ├── tty.ts └── utils.ts ├── tsconfig.json ├── tsup.config.ts └── types.d.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = false 12 | insert_final_newline = false -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .DS_Store 4 | *.log 5 | schema.json 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["tamasfe.even-better-toml"] 3 | } 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 EGOIT (https://egoist.dev) 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 | # shell-ask 2 | 3 | ![preview](https://cdn.jsdelivr.net/gh/egoist-bot/images@main/uPic/js3Bja.png) 4 | 5 | --- 6 | 7 | **Shell Ask is sponsored by [ChatWise](https://chatwise.app), a free chat app for ChatGPT and many other models.** 8 | 9 | ## Install 10 | 11 | This requires Node.js to be installed. 12 | 13 | ```bash 14 | npm i -g shell-ask 15 | ``` 16 | 17 | ## Supported LLMs 18 | 19 | - [OpenAI](https://openai.com) 20 | - [Anthropic Claude](https://anthropic.com) 21 | - [Ollama](https://ollama.com) 22 | - [Google Gemini](https://aistudio.google.com/) 23 | - [Groq](https://console.groq.com) 24 | - [GitHub Copilot Chat](https://github.com/features/copilot) 25 | 26 | ## Configuration 27 | 28 | Minimal config to use OpenAI, create a `~/.config/shell-ask/config.json` with the following content: 29 | 30 | ```json 31 | { 32 | "openai_api_key": "sk-your-key-xxx" 33 | } 34 | ``` 35 | 36 | Check out [config documentation](./docs/config.md) for more. 37 | 38 | ## Usage 39 | 40 | Ask a question: 41 | 42 | ```bash 43 | # Ask a question 44 | ask "get git logs first line only" 45 | 46 | # Make sure it outputs a command only with -c or --command flag 47 | ask "get git logs first line only" -c 48 | ``` 49 | 50 | Using command output as context: 51 | 52 | ```bash 53 | cat package.json | ask "please fix exports" 54 | ``` 55 | 56 | Interactively select a model: 57 | 58 | ```bash 59 | # show all models 60 | ask quest -m 61 | # show all gpt models 62 | ask quest -m gpt 63 | # show all claude models 64 | ask quest -m claude 65 | # show all ollama models 66 | ask quest -m ollama 67 | # show all groq models 68 | ask quest -m groq 69 | ``` 70 | 71 | Select a model by id: 72 | 73 | ```bash 74 | ask "question" -m gpt-4o 75 | ask "question" -m claude-3-opus 76 | ``` 77 | 78 | Prompt without quotes: 79 | 80 | ```bash 81 | # Same prompt 82 | ask "how to delete a docker image" 83 | ask how to delete a docker image 84 | 85 | # Escape using backslash if you need quotes inside the prompt 86 | ask who\'s john titor 87 | ``` 88 | 89 | ### Piping 90 | 91 | You can pipe the output of other programs to `ask`, for example you can use `cat` to add file contents to the LLM context: 92 | 93 | ```bash 94 | cat main.ts | ask "explain the code" 95 | ``` 96 | 97 | If you want to add multiple files, especially when you also want to include filenames in the context, you can use `--files` flag to add files into model context: 98 | 99 | ```bash 100 | ask --files "src/*.ts " "write a concise outline for this project" 101 | ``` 102 | 103 | ### Ask Follow-up Questions 104 | 105 | Using `-r` or `--reply` flag to ask follow-up questions to the previous answer: 106 | 107 | ```bash 108 | ask "how to delete a docker image" 109 | 110 | ask -r "delete last 30 days" 111 | ``` 112 | 113 | ### Result Type 114 | 115 | #### Command 116 | 117 | Using `-c` or `--command` flag to enforce the output to be a command only: 118 | 119 | ```bash 120 | ask "turn foo.mp4 to 720p using ffmpeg" -c 121 | ``` 122 | 123 | Using `-b` or `--breakdown` flag to return a command and the breakdown of the command: 124 | 125 | ```bash 126 | ask "turn foo.mp4 to 720p using ffmpeg" -b 127 | ``` 128 | 129 | #### Custom Type 130 | 131 | Define the type of the result using `-t` or `--type` flag: 132 | 133 | ```bash 134 | cat package.json | ask "extract dependency names" -t "string[]" 135 | 136 | cat README.md | ask "extract headings" -t "{depth:number,title:string}[]" 137 | ``` 138 | 139 | ### Copilot Chat 140 | 141 | First you need to login to Copilot Chat: 142 | 143 | ```bash 144 | ask copilot-login 145 | ``` 146 | 147 | Then you can ask questions: 148 | 149 | ```bash 150 | ask "how to delete a docker image" -m copilot 151 | 152 | # or a specific model 153 | ask "how to delete a docker image" -m copilot-claude-3.5-sonnet 154 | ``` 155 | 156 | To log out, run `ask copilot-logout`. 157 | 158 | ### Web Search 159 | 160 | Enable web search by using `-s` or `--search` flag: 161 | 162 | ```bash 163 | ask -s "how to delete a docker image" 164 | ``` 165 | 166 | Web search is powered by https://s.jina.ai 167 | 168 | ### Fetching Web Pages 169 | 170 | For a single page, you can just use `curl`: 171 | 172 | ```bash 173 | curl -s https://example.com | ask "summarize it" 174 | ``` 175 | 176 | For multiple pages, you can use `-u` or `--url` flag: 177 | 178 | ```bash 179 | ask -u https://example.com/about -u https://example.com/introduction "summarize it" 180 | ``` 181 | 182 | You may only need the markdown output of the web page, you can use https://r.jina.ai to retrive markdown content instead: 183 | 184 | ```bash 185 | ask -u https://r.jina.ai/example.com "summarize it" 186 | ``` 187 | 188 | ### Disable Streaming Output 189 | 190 | Using `--no-stream` flag to disable streaming output: 191 | 192 | ```bash 193 | ask "how to delete a docker image" --no-stream 194 | ``` 195 | 196 | When `--no-stream` is enabled the output markdown will have proper syntax highlighting, when streaming is enabled the output will be plain text because the terminal have trouble clearing the screen when the output is too long 197 | 198 | ### Reusable AI Commands 199 | 200 | Shell Ask allows you to define reusable AI commands in the [config file](./docs/config.md), for example the builtin `ask cm` command: 201 | 202 | ```json 203 | { 204 | "commands": [ 205 | { 206 | "command": "cm", 207 | "description": "Generate git commit message based on git diff output", 208 | "prompt": "Generate git commit message following Conventional Commits specification based on the git diff output in stdin\nYou must return a commit message only, without any other text or quotes." 209 | } 210 | ] 211 | } 212 | ``` 213 | 214 | ### Built-in AI Commands 215 | 216 | - `ask cm`: Generate git commit message from stdin 217 | - example: `git diff | ask cm` 218 | 219 | ## License 220 | 221 | MIT. 222 | -------------------------------------------------------------------------------- /docs/config.md: -------------------------------------------------------------------------------- 1 | # Config 2 | 3 | You can create a global config file at `~/.config/shell-ask/config.json`, or a local config file at `./shell-ask.json` in a folder where you want to run Shell Ask. `.toml` files are also supported. 4 | 5 | ## Example 6 | 7 | In fact this file is generated by the `gen-config-md` command defined in the [shell-ask.toml](../shell-ask.toml) for this project. 8 | 9 | ## Properties 10 | 11 | ### `default_model` (optional) 12 | 13 | - **Type:** `string` 14 | - **Description:** Specifies the default AI model to be used. 15 | 16 | ### `openai_api_key` (optional) 17 | 18 | - **Type:** `string` 19 | - **Description:** The API key for accessing OpenAI services. 20 | - **Default:** `process.env.OPENAI_API_KEY` 21 | 22 | ### `openai_api_url` (optional) 23 | 24 | - **Type:** `string` 25 | - **Description:** The URL for the OpenAI API. 26 | - **Default:** `process.env.OPENAI_API_URL` 27 | 28 | ### `gemini_api_key` (optional) 29 | 30 | - **Type:** `string` 31 | - **Description:** The API key for accessing Gemini services. 32 | - **Default:** `process.env.GEMINI_API_KEY` 33 | 34 | ### `gemini_api_url` (optional) 35 | 36 | - **Type:** `string` 37 | - **Description:** The URL for the Gemini (Google Gen AI) API. 38 | - **Default:** `process.env.GEMINI_API_URL` 39 | 40 | ### `anthropic_api_key` (optional) 41 | 42 | - **Type:** `string` 43 | - **Description:** The API key for accessing Anthropic services. 44 | - **Default:** `process.env.ANTHROPIC_API_KEY` 45 | 46 | ### `groq_api_key` (optional) 47 | 48 | - **Type:** `string` 49 | - **Description:** The API key for accessing Groq services. 50 | - **Default:** `process.env.GROQ_API_KEY` 51 | 52 | ### `commands` (optional) 53 | 54 | - **Type:** `AICommand[]` 55 | - **Description:** A list of AI commands that can be executed. Each command is defined by the `AICommand` type. 56 | 57 | ## AICommand Type 58 | 59 | The `AICommand` type defines the structure of an AI command that can be executed. Below are the properties of the `AICommand` type. 60 | 61 | ### Properties 62 | 63 | #### `command` 64 | 65 | - **Type:** `string` 66 | - **Description:** The CLI command to be executed. 67 | 68 | #### `example` (optional) 69 | 70 | - **Type:** `string` 71 | - **Description:** An example to show in CLI help. 72 | 73 | #### `description` (optional) 74 | 75 | - **Type:** `string` 76 | - **Description:** A description of the command to be shown in CLI help. 77 | 78 | #### `variables` (optional) 79 | 80 | - **Type:** `Record` 81 | - **Description:** A record of variables that the command can use. Each variable is defined by the `AICommandVariable` type. 82 | 83 | #### `prompt` 84 | 85 | - **Type:** `string` 86 | - **Description:** The prompt to send to the AI model. 87 | 88 | #### `require_stdin` (optional) 89 | 90 | - **Type:** `boolean` 91 | - **Description:** Indicates whether the command requires piping output from another program to Shell Ask. 92 | 93 | ## AICommandVariable Type 94 | 95 | The `AICommandVariable` type defines the structure of a variable that can be used in an AI command. Below are the possible types of `AICommandVariable`. 96 | 97 | ### Types 98 | 99 | #### Shell Command 100 | 101 | - **Type:** `string` 102 | - **Description:** A shell command to run, the output of which will be used as the variable value. 103 | 104 | #### Input 105 | 106 | - **Type:** `{ type: "input"; message: string }` 107 | - **Description:** Gets text input from the user. 108 | - `type`: Must be `"input"`. 109 | - `message`: The message to show to the user. 110 | 111 | #### Select 112 | 113 | - **Type:** `{ type: "select"; message: string; choices: { value: string; title: string }[] }` 114 | - **Description:** Gets a choice from the user. 115 | - `type`: Must be `"select"`. 116 | - `message`: The message to show to the user. 117 | - `choices`: An array of choice objects, each containing: 118 | - `value`: The value of the choice. 119 | - `title`: The title of the choice to be displayed to the user. 120 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shell-ask", 3 | "version": "0.0.45", 4 | "description": "Ask LLM any question in your terminal", 5 | "type": "module", 6 | "bin": { 7 | "ask": "./dist/cli.js" 8 | }, 9 | "files": [ 10 | "dist", 11 | "schema.json" 12 | ], 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/egoist/shell-ask" 16 | }, 17 | "scripts": { 18 | "build": "pnpm gen-config-schema && tsup", 19 | "dev": "pnpm build --watch", 20 | "prepublishOnly": "pnpm build", 21 | "gen-config-schema": "bun scripts/gen-config-schema.ts" 22 | }, 23 | "dependencies": { 24 | "@ai-sdk/anthropic": "1.0.2", 25 | "@ai-sdk/google": "1.0.3", 26 | "@ai-sdk/openai": "1.0.4", 27 | "ai": "4.0.3", 28 | "cac": "^6.7.14", 29 | "fast-glob": "^3.3.2", 30 | "joycon": "^3.1.1", 31 | "log-update": "^6.0.0", 32 | "marked": "15.0.1", 33 | "marked-terminal": "7.2.1", 34 | "ollama-ai-provider": "0.16.1", 35 | "prompts": "2.4.2", 36 | "smol-toml": "^1.3.1", 37 | "update-notifier": "7.3.1", 38 | "zod": "^3.23.8" 39 | }, 40 | "devDependencies": { 41 | "@types/marked-terminal": "^6.1.1", 42 | "@types/node": "22.9.0", 43 | "@types/prompts": "^2.4.9", 44 | "@types/update-notifier": "^6.0.8", 45 | "colorette": "^2.0.20", 46 | "tsup": "^8.0.2", 47 | "typescript": "5.6.3", 48 | "zod-to-json-schema": "3.23.5" 49 | }, 50 | "license": "MIT", 51 | "packageManager": "pnpm@9.5.0+sha256.dbdf5961c32909fb030595a9daa1dae720162e658609a8f92f2fa99835510ca5" 52 | } 53 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@ai-sdk/anthropic': 12 | specifier: 1.0.2 13 | version: 1.0.2(zod@3.23.8) 14 | '@ai-sdk/google': 15 | specifier: 1.0.3 16 | version: 1.0.3(zod@3.23.8) 17 | '@ai-sdk/openai': 18 | specifier: 1.0.4 19 | version: 1.0.4(zod@3.23.8) 20 | ai: 21 | specifier: 4.0.3 22 | version: 4.0.3(react@18.3.1)(zod@3.23.8) 23 | cac: 24 | specifier: ^6.7.14 25 | version: 6.7.14 26 | fast-glob: 27 | specifier: ^3.3.2 28 | version: 3.3.2 29 | joycon: 30 | specifier: ^3.1.1 31 | version: 3.1.1 32 | log-update: 33 | specifier: ^6.0.0 34 | version: 6.0.0 35 | marked: 36 | specifier: 15.0.1 37 | version: 15.0.1 38 | marked-terminal: 39 | specifier: 7.2.1 40 | version: 7.2.1(marked@15.0.1) 41 | ollama-ai-provider: 42 | specifier: 0.16.1 43 | version: 0.16.1(zod@3.23.8) 44 | prompts: 45 | specifier: 2.4.2 46 | version: 2.4.2 47 | smol-toml: 48 | specifier: ^1.3.1 49 | version: 1.3.1 50 | update-notifier: 51 | specifier: 7.3.1 52 | version: 7.3.1 53 | zod: 54 | specifier: ^3.23.8 55 | version: 3.23.8 56 | devDependencies: 57 | '@types/marked-terminal': 58 | specifier: ^6.1.1 59 | version: 6.1.1 60 | '@types/node': 61 | specifier: 22.9.0 62 | version: 22.9.0 63 | '@types/prompts': 64 | specifier: ^2.4.9 65 | version: 2.4.9 66 | '@types/update-notifier': 67 | specifier: ^6.0.8 68 | version: 6.0.8 69 | colorette: 70 | specifier: ^2.0.20 71 | version: 2.0.20 72 | tsup: 73 | specifier: ^8.0.2 74 | version: 8.0.2(postcss@8.4.38)(typescript@5.6.3) 75 | typescript: 76 | specifier: 5.6.3 77 | version: 5.6.3 78 | zod-to-json-schema: 79 | specifier: 3.23.5 80 | version: 3.23.5(zod@3.23.8) 81 | 82 | packages: 83 | 84 | '@ai-sdk/anthropic@1.0.2': 85 | resolution: {integrity: sha512-f3Z356AgUe6vcaUJuVY1+UWdUdhx/JzIADaQgybHSBRQ+OXOYs7AveKist01I6fBXGl3DPPbJJr/i0P888Izfg==} 86 | engines: {node: '>=18'} 87 | peerDependencies: 88 | zod: ^3.0.0 89 | 90 | '@ai-sdk/google@1.0.3': 91 | resolution: {integrity: sha512-vxHQw2ogNUMgiVtflDUh+8izc1H0DUo0GusT+YHG/2qdcoY4M1GxCD6pB1osNDeIxfjzToA5HfqdatjaRiYR9g==} 92 | engines: {node: '>=18'} 93 | peerDependencies: 94 | zod: ^3.0.0 95 | 96 | '@ai-sdk/openai@1.0.4': 97 | resolution: {integrity: sha512-3QpgKmkCeJvUdeu3sVRL/ZKWzg8biO0tN2owQW/lFV95o8qskE3bN95R9H136Mmu0124/C28aY6ScxO93nUrtg==} 98 | engines: {node: '>=18'} 99 | peerDependencies: 100 | zod: ^3.0.0 101 | 102 | '@ai-sdk/provider-utils@1.0.22': 103 | resolution: {integrity: sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==} 104 | engines: {node: '>=18'} 105 | peerDependencies: 106 | zod: ^3.0.0 107 | peerDependenciesMeta: 108 | zod: 109 | optional: true 110 | 111 | '@ai-sdk/provider-utils@2.0.2': 112 | resolution: {integrity: sha512-IAvhKhdlXqiSmvx/D4uNlFYCl8dWT+M9K+IuEcSgnE2Aj27GWu8sDIpAf4r4Voc+wOUkOECVKQhFo8g9pozdjA==} 113 | engines: {node: '>=18'} 114 | peerDependencies: 115 | zod: ^3.0.0 116 | peerDependenciesMeta: 117 | zod: 118 | optional: true 119 | 120 | '@ai-sdk/provider@0.0.26': 121 | resolution: {integrity: sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==} 122 | engines: {node: '>=18'} 123 | 124 | '@ai-sdk/provider@1.0.1': 125 | resolution: {integrity: sha512-mV+3iNDkzUsZ0pR2jG0sVzU6xtQY5DtSCBy3JFycLp6PwjyLw/iodfL3MwdmMCRJWgs3dadcHejRnMvF9nGTBg==} 126 | engines: {node: '>=18'} 127 | 128 | '@ai-sdk/react@1.0.2': 129 | resolution: {integrity: sha512-VQfQ6PMiUz4hDquAfjih0DIw4gsQvRFk91SFg2xWirDO4swMZByJzqGGcILPQKbww5ndCo48iZj9S1mLKZo5Dg==} 130 | engines: {node: '>=18'} 131 | peerDependencies: 132 | react: ^18 || ^19 || ^19.0.0-rc 133 | zod: ^3.0.0 134 | peerDependenciesMeta: 135 | react: 136 | optional: true 137 | zod: 138 | optional: true 139 | 140 | '@ai-sdk/ui-utils@1.0.2': 141 | resolution: {integrity: sha512-hHrUdeThGHu/rsGZBWQ9PjrAU9Htxgbo9MFyR5B/aWoNbBeXn1HLMY1+uMEnXL5pRPlmyVRjgIavWg7UgeNDOw==} 142 | engines: {node: '>=18'} 143 | peerDependencies: 144 | zod: ^3.0.0 145 | peerDependenciesMeta: 146 | zod: 147 | optional: true 148 | 149 | '@colors/colors@1.5.0': 150 | resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} 151 | engines: {node: '>=0.1.90'} 152 | 153 | '@esbuild/aix-ppc64@0.19.12': 154 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} 155 | engines: {node: '>=12'} 156 | cpu: [ppc64] 157 | os: [aix] 158 | 159 | '@esbuild/android-arm64@0.19.12': 160 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} 161 | engines: {node: '>=12'} 162 | cpu: [arm64] 163 | os: [android] 164 | 165 | '@esbuild/android-arm@0.19.12': 166 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} 167 | engines: {node: '>=12'} 168 | cpu: [arm] 169 | os: [android] 170 | 171 | '@esbuild/android-x64@0.19.12': 172 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} 173 | engines: {node: '>=12'} 174 | cpu: [x64] 175 | os: [android] 176 | 177 | '@esbuild/darwin-arm64@0.19.12': 178 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} 179 | engines: {node: '>=12'} 180 | cpu: [arm64] 181 | os: [darwin] 182 | 183 | '@esbuild/darwin-x64@0.19.12': 184 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 185 | engines: {node: '>=12'} 186 | cpu: [x64] 187 | os: [darwin] 188 | 189 | '@esbuild/freebsd-arm64@0.19.12': 190 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} 191 | engines: {node: '>=12'} 192 | cpu: [arm64] 193 | os: [freebsd] 194 | 195 | '@esbuild/freebsd-x64@0.19.12': 196 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} 197 | engines: {node: '>=12'} 198 | cpu: [x64] 199 | os: [freebsd] 200 | 201 | '@esbuild/linux-arm64@0.19.12': 202 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 203 | engines: {node: '>=12'} 204 | cpu: [arm64] 205 | os: [linux] 206 | 207 | '@esbuild/linux-arm@0.19.12': 208 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} 209 | engines: {node: '>=12'} 210 | cpu: [arm] 211 | os: [linux] 212 | 213 | '@esbuild/linux-ia32@0.19.12': 214 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} 215 | engines: {node: '>=12'} 216 | cpu: [ia32] 217 | os: [linux] 218 | 219 | '@esbuild/linux-loong64@0.19.12': 220 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} 221 | engines: {node: '>=12'} 222 | cpu: [loong64] 223 | os: [linux] 224 | 225 | '@esbuild/linux-mips64el@0.19.12': 226 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} 227 | engines: {node: '>=12'} 228 | cpu: [mips64el] 229 | os: [linux] 230 | 231 | '@esbuild/linux-ppc64@0.19.12': 232 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} 233 | engines: {node: '>=12'} 234 | cpu: [ppc64] 235 | os: [linux] 236 | 237 | '@esbuild/linux-riscv64@0.19.12': 238 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} 239 | engines: {node: '>=12'} 240 | cpu: [riscv64] 241 | os: [linux] 242 | 243 | '@esbuild/linux-s390x@0.19.12': 244 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} 245 | engines: {node: '>=12'} 246 | cpu: [s390x] 247 | os: [linux] 248 | 249 | '@esbuild/linux-x64@0.19.12': 250 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 251 | engines: {node: '>=12'} 252 | cpu: [x64] 253 | os: [linux] 254 | 255 | '@esbuild/netbsd-x64@0.19.12': 256 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} 257 | engines: {node: '>=12'} 258 | cpu: [x64] 259 | os: [netbsd] 260 | 261 | '@esbuild/openbsd-x64@0.19.12': 262 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} 263 | engines: {node: '>=12'} 264 | cpu: [x64] 265 | os: [openbsd] 266 | 267 | '@esbuild/sunos-x64@0.19.12': 268 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} 269 | engines: {node: '>=12'} 270 | cpu: [x64] 271 | os: [sunos] 272 | 273 | '@esbuild/win32-arm64@0.19.12': 274 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 275 | engines: {node: '>=12'} 276 | cpu: [arm64] 277 | os: [win32] 278 | 279 | '@esbuild/win32-ia32@0.19.12': 280 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} 281 | engines: {node: '>=12'} 282 | cpu: [ia32] 283 | os: [win32] 284 | 285 | '@esbuild/win32-x64@0.19.12': 286 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} 287 | engines: {node: '>=12'} 288 | cpu: [x64] 289 | os: [win32] 290 | 291 | '@isaacs/cliui@8.0.2': 292 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 293 | engines: {node: '>=12'} 294 | 295 | '@jridgewell/gen-mapping@0.3.5': 296 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 297 | engines: {node: '>=6.0.0'} 298 | 299 | '@jridgewell/resolve-uri@3.1.2': 300 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 301 | engines: {node: '>=6.0.0'} 302 | 303 | '@jridgewell/set-array@1.2.1': 304 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 305 | engines: {node: '>=6.0.0'} 306 | 307 | '@jridgewell/sourcemap-codec@1.4.15': 308 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 309 | 310 | '@jridgewell/trace-mapping@0.3.25': 311 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 312 | 313 | '@nodelib/fs.scandir@2.1.5': 314 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 315 | engines: {node: '>= 8'} 316 | 317 | '@nodelib/fs.stat@2.0.5': 318 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 319 | engines: {node: '>= 8'} 320 | 321 | '@nodelib/fs.walk@1.2.8': 322 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 323 | engines: {node: '>= 8'} 324 | 325 | '@opentelemetry/api@1.9.0': 326 | resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} 327 | engines: {node: '>=8.0.0'} 328 | 329 | '@pkgjs/parseargs@0.11.0': 330 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 331 | engines: {node: '>=14'} 332 | 333 | '@pnpm/config.env-replace@1.1.0': 334 | resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} 335 | engines: {node: '>=12.22.0'} 336 | 337 | '@pnpm/network.ca-file@1.0.2': 338 | resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} 339 | engines: {node: '>=12.22.0'} 340 | 341 | '@pnpm/npm-conf@2.2.2': 342 | resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} 343 | engines: {node: '>=12'} 344 | 345 | '@rollup/rollup-android-arm-eabi@4.17.2': 346 | resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} 347 | cpu: [arm] 348 | os: [android] 349 | 350 | '@rollup/rollup-android-arm64@4.17.2': 351 | resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} 352 | cpu: [arm64] 353 | os: [android] 354 | 355 | '@rollup/rollup-darwin-arm64@4.17.2': 356 | resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} 357 | cpu: [arm64] 358 | os: [darwin] 359 | 360 | '@rollup/rollup-darwin-x64@4.17.2': 361 | resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} 362 | cpu: [x64] 363 | os: [darwin] 364 | 365 | '@rollup/rollup-linux-arm-gnueabihf@4.17.2': 366 | resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} 367 | cpu: [arm] 368 | os: [linux] 369 | 370 | '@rollup/rollup-linux-arm-musleabihf@4.17.2': 371 | resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} 372 | cpu: [arm] 373 | os: [linux] 374 | 375 | '@rollup/rollup-linux-arm64-gnu@4.17.2': 376 | resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} 377 | cpu: [arm64] 378 | os: [linux] 379 | 380 | '@rollup/rollup-linux-arm64-musl@4.17.2': 381 | resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} 382 | cpu: [arm64] 383 | os: [linux] 384 | 385 | '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': 386 | resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} 387 | cpu: [ppc64] 388 | os: [linux] 389 | 390 | '@rollup/rollup-linux-riscv64-gnu@4.17.2': 391 | resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} 392 | cpu: [riscv64] 393 | os: [linux] 394 | 395 | '@rollup/rollup-linux-s390x-gnu@4.17.2': 396 | resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} 397 | cpu: [s390x] 398 | os: [linux] 399 | 400 | '@rollup/rollup-linux-x64-gnu@4.17.2': 401 | resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} 402 | cpu: [x64] 403 | os: [linux] 404 | 405 | '@rollup/rollup-linux-x64-musl@4.17.2': 406 | resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} 407 | cpu: [x64] 408 | os: [linux] 409 | 410 | '@rollup/rollup-win32-arm64-msvc@4.17.2': 411 | resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} 412 | cpu: [arm64] 413 | os: [win32] 414 | 415 | '@rollup/rollup-win32-ia32-msvc@4.17.2': 416 | resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} 417 | cpu: [ia32] 418 | os: [win32] 419 | 420 | '@rollup/rollup-win32-x64-msvc@4.17.2': 421 | resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} 422 | cpu: [x64] 423 | os: [win32] 424 | 425 | '@sindresorhus/is@4.6.0': 426 | resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} 427 | engines: {node: '>=10'} 428 | 429 | '@types/cardinal@2.1.1': 430 | resolution: {integrity: sha512-/xCVwg8lWvahHsV2wXZt4i64H1sdL+sN1Uoq7fAc8/FA6uYHjuIveDwPwvGUYp4VZiv85dVl6J/Bum3NDAOm8g==} 431 | 432 | '@types/configstore@6.0.2': 433 | resolution: {integrity: sha512-OS//b51j9uyR3zvwD04Kfs5kHpve2qalQ18JhY/ho3voGYUTPLEG90/ocfKPI48hyHH8T04f7KEEbK6Ue60oZQ==} 434 | 435 | '@types/diff-match-patch@1.0.36': 436 | resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} 437 | 438 | '@types/estree@1.0.5': 439 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 440 | 441 | '@types/marked-terminal@6.1.1': 442 | resolution: {integrity: sha512-DfoUqkmFDCED7eBY9vFUhJ9fW8oZcMAK5EwRDQ9drjTbpQa+DnBTQQCwWhTFVf4WsZ6yYcJTI8D91wxTWXRZZQ==} 443 | 444 | '@types/node@22.9.0': 445 | resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} 446 | 447 | '@types/prompts@2.4.9': 448 | resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} 449 | 450 | '@types/update-notifier@6.0.8': 451 | resolution: {integrity: sha512-IlDFnfSVfYQD+cKIg63DEXn3RFmd7W1iYtKQsJodcHK9R1yr8aKbKaPKfBxzPpcHCq2DU8zUq4PIPmy19Thjfg==} 452 | 453 | ai@4.0.3: 454 | resolution: {integrity: sha512-nx5cNMldOQ72hwxL60NLtRnsmQd5Bo887Wznvxt8F5xnmjdeXRpz4ixp+0xGA88X7wiCn6c+xrhGEb9fesi/Tw==} 455 | engines: {node: '>=18'} 456 | peerDependencies: 457 | react: ^18 || ^19 || ^19.0.0-rc 458 | zod: ^3.0.0 459 | peerDependenciesMeta: 460 | react: 461 | optional: true 462 | zod: 463 | optional: true 464 | 465 | ansi-align@3.0.1: 466 | resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} 467 | 468 | ansi-escapes@6.2.1: 469 | resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} 470 | engines: {node: '>=14.16'} 471 | 472 | ansi-escapes@7.0.0: 473 | resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} 474 | engines: {node: '>=18'} 475 | 476 | ansi-regex@5.0.1: 477 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 478 | engines: {node: '>=8'} 479 | 480 | ansi-regex@6.0.1: 481 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 482 | engines: {node: '>=12'} 483 | 484 | ansi-regex@6.1.0: 485 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 486 | engines: {node: '>=12'} 487 | 488 | ansi-styles@4.3.0: 489 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 490 | engines: {node: '>=8'} 491 | 492 | ansi-styles@6.2.1: 493 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 494 | engines: {node: '>=12'} 495 | 496 | any-promise@1.3.0: 497 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 498 | 499 | anymatch@3.1.3: 500 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 501 | engines: {node: '>= 8'} 502 | 503 | array-union@2.1.0: 504 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 505 | engines: {node: '>=8'} 506 | 507 | atomically@2.0.3: 508 | resolution: {integrity: sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==} 509 | 510 | balanced-match@1.0.2: 511 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 512 | 513 | binary-extensions@2.3.0: 514 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 515 | engines: {node: '>=8'} 516 | 517 | boxen@7.1.1: 518 | resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} 519 | engines: {node: '>=14.16'} 520 | 521 | boxen@8.0.1: 522 | resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} 523 | engines: {node: '>=18'} 524 | 525 | brace-expansion@2.0.1: 526 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 527 | 528 | braces@3.0.2: 529 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 530 | engines: {node: '>=8'} 531 | 532 | bundle-require@4.1.0: 533 | resolution: {integrity: sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==} 534 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 535 | peerDependencies: 536 | esbuild: '>=0.17' 537 | 538 | cac@6.7.14: 539 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 540 | engines: {node: '>=8'} 541 | 542 | camelcase@7.0.1: 543 | resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} 544 | engines: {node: '>=14.16'} 545 | 546 | camelcase@8.0.0: 547 | resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} 548 | engines: {node: '>=16'} 549 | 550 | chalk@4.1.2: 551 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 552 | engines: {node: '>=10'} 553 | 554 | chalk@5.3.0: 555 | resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} 556 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 557 | 558 | char-regex@1.0.2: 559 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 560 | engines: {node: '>=10'} 561 | 562 | chokidar@3.6.0: 563 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 564 | engines: {node: '>= 8.10.0'} 565 | 566 | cli-boxes@3.0.0: 567 | resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} 568 | engines: {node: '>=10'} 569 | 570 | cli-cursor@4.0.0: 571 | resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} 572 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 573 | 574 | cli-highlight@2.1.11: 575 | resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} 576 | engines: {node: '>=8.0.0', npm: '>=5.0.0'} 577 | hasBin: true 578 | 579 | cli-table3@0.6.5: 580 | resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} 581 | engines: {node: 10.* || >= 12.*} 582 | 583 | client-only@0.0.1: 584 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 585 | 586 | cliui@7.0.4: 587 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 588 | 589 | color-convert@2.0.1: 590 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 591 | engines: {node: '>=7.0.0'} 592 | 593 | color-name@1.1.4: 594 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 595 | 596 | colorette@2.0.20: 597 | resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} 598 | 599 | commander@4.1.1: 600 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 601 | engines: {node: '>= 6'} 602 | 603 | config-chain@1.1.13: 604 | resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} 605 | 606 | configstore@7.0.0: 607 | resolution: {integrity: sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==} 608 | engines: {node: '>=18'} 609 | 610 | cross-spawn@7.0.3: 611 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 612 | engines: {node: '>= 8'} 613 | 614 | debug@4.3.4: 615 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 616 | engines: {node: '>=6.0'} 617 | peerDependencies: 618 | supports-color: '*' 619 | peerDependenciesMeta: 620 | supports-color: 621 | optional: true 622 | 623 | deep-extend@0.6.0: 624 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 625 | engines: {node: '>=4.0.0'} 626 | 627 | diff-match-patch@1.0.5: 628 | resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} 629 | 630 | dir-glob@3.0.1: 631 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 632 | engines: {node: '>=8'} 633 | 634 | dot-prop@9.0.0: 635 | resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} 636 | engines: {node: '>=18'} 637 | 638 | eastasianwidth@0.2.0: 639 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 640 | 641 | emoji-regex@10.3.0: 642 | resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} 643 | 644 | emoji-regex@8.0.0: 645 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 646 | 647 | emoji-regex@9.2.2: 648 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 649 | 650 | emojilib@2.4.0: 651 | resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} 652 | 653 | environment@1.1.0: 654 | resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} 655 | engines: {node: '>=18'} 656 | 657 | esbuild@0.19.12: 658 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} 659 | engines: {node: '>=12'} 660 | hasBin: true 661 | 662 | escalade@3.1.2: 663 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 664 | engines: {node: '>=6'} 665 | 666 | escape-goat@4.0.0: 667 | resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} 668 | engines: {node: '>=12'} 669 | 670 | eventsource-parser@1.1.2: 671 | resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==} 672 | engines: {node: '>=14.18'} 673 | 674 | eventsource-parser@3.0.0: 675 | resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} 676 | engines: {node: '>=18.0.0'} 677 | 678 | execa@5.1.1: 679 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 680 | engines: {node: '>=10'} 681 | 682 | fast-glob@3.3.2: 683 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 684 | engines: {node: '>=8.6.0'} 685 | 686 | fastq@1.17.1: 687 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 688 | 689 | fill-range@7.0.1: 690 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 691 | engines: {node: '>=8'} 692 | 693 | foreground-child@3.1.1: 694 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 695 | engines: {node: '>=14'} 696 | 697 | fsevents@2.3.3: 698 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 699 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 700 | os: [darwin] 701 | 702 | get-caller-file@2.0.5: 703 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 704 | engines: {node: 6.* || 8.* || >= 10.*} 705 | 706 | get-east-asian-width@1.2.0: 707 | resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} 708 | engines: {node: '>=18'} 709 | 710 | get-stream@6.0.1: 711 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 712 | engines: {node: '>=10'} 713 | 714 | glob-parent@5.1.2: 715 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 716 | engines: {node: '>= 6'} 717 | 718 | glob@10.3.15: 719 | resolution: {integrity: sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==} 720 | engines: {node: '>=16 || 14 >=14.18'} 721 | hasBin: true 722 | 723 | global-directory@4.0.1: 724 | resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} 725 | engines: {node: '>=18'} 726 | 727 | globby@11.1.0: 728 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 729 | engines: {node: '>=10'} 730 | 731 | graceful-fs@4.2.10: 732 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 733 | 734 | graceful-fs@4.2.11: 735 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 736 | 737 | has-flag@4.0.0: 738 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 739 | engines: {node: '>=8'} 740 | 741 | highlight.js@10.7.3: 742 | resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} 743 | 744 | human-signals@2.1.0: 745 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 746 | engines: {node: '>=10.17.0'} 747 | 748 | ignore@5.3.1: 749 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 750 | engines: {node: '>= 4'} 751 | 752 | ini@1.3.8: 753 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 754 | 755 | ini@4.1.1: 756 | resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} 757 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 758 | 759 | is-binary-path@2.1.0: 760 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 761 | engines: {node: '>=8'} 762 | 763 | is-extglob@2.1.1: 764 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 765 | engines: {node: '>=0.10.0'} 766 | 767 | is-fullwidth-code-point@3.0.0: 768 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 769 | engines: {node: '>=8'} 770 | 771 | is-fullwidth-code-point@5.0.0: 772 | resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} 773 | engines: {node: '>=18'} 774 | 775 | is-glob@4.0.3: 776 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 777 | engines: {node: '>=0.10.0'} 778 | 779 | is-in-ci@1.0.0: 780 | resolution: {integrity: sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==} 781 | engines: {node: '>=18'} 782 | hasBin: true 783 | 784 | is-installed-globally@1.0.0: 785 | resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} 786 | engines: {node: '>=18'} 787 | 788 | is-npm@6.0.0: 789 | resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} 790 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 791 | 792 | is-number@7.0.0: 793 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 794 | engines: {node: '>=0.12.0'} 795 | 796 | is-path-inside@4.0.0: 797 | resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} 798 | engines: {node: '>=12'} 799 | 800 | is-stream@2.0.1: 801 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 802 | engines: {node: '>=8'} 803 | 804 | isexe@2.0.0: 805 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 806 | 807 | jackspeak@2.3.6: 808 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 809 | engines: {node: '>=14'} 810 | 811 | joycon@3.1.1: 812 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 813 | engines: {node: '>=10'} 814 | 815 | js-tokens@4.0.0: 816 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 817 | 818 | json-schema@0.4.0: 819 | resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} 820 | 821 | jsondiffpatch@0.6.0: 822 | resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} 823 | engines: {node: ^18.0.0 || >=20.0.0} 824 | hasBin: true 825 | 826 | kleur@3.0.3: 827 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 828 | engines: {node: '>=6'} 829 | 830 | ky@1.7.2: 831 | resolution: {integrity: sha512-OzIvbHKKDpi60TnF9t7UUVAF1B4mcqc02z5PIvrm08Wyb+yOcz63GRvEuVxNT18a9E1SrNouhB4W2NNLeD7Ykg==} 832 | engines: {node: '>=18'} 833 | 834 | latest-version@9.0.0: 835 | resolution: {integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==} 836 | engines: {node: '>=18'} 837 | 838 | lilconfig@3.1.1: 839 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} 840 | engines: {node: '>=14'} 841 | 842 | lines-and-columns@1.2.4: 843 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 844 | 845 | load-tsconfig@0.2.5: 846 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 847 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 848 | 849 | lodash.sortby@4.7.0: 850 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 851 | 852 | log-update@6.0.0: 853 | resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} 854 | engines: {node: '>=18'} 855 | 856 | loose-envify@1.4.0: 857 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 858 | hasBin: true 859 | 860 | lru-cache@10.2.2: 861 | resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} 862 | engines: {node: 14 || >=16.14} 863 | 864 | marked-terminal@7.2.1: 865 | resolution: {integrity: sha512-rQ1MoMFXZICWNsKMiiHwP/Z+92PLKskTPXj+e7uwXmuMPkNn7iTqC+IvDekVm1MPeC9wYQeLxeFaOvudRR/XbQ==} 866 | engines: {node: '>=16.0.0'} 867 | peerDependencies: 868 | marked: '>=1 <15' 869 | 870 | marked@11.2.0: 871 | resolution: {integrity: sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==} 872 | engines: {node: '>= 18'} 873 | hasBin: true 874 | 875 | marked@15.0.1: 876 | resolution: {integrity: sha512-VnnE19XO2Vb2oZeH8quAepfrb6Aaz4OoY8yZQACfuy/5KVJ0GxYC0Qxzz/iuc+g5UF7H0HJ+QROfvH26XeBdDA==} 877 | engines: {node: '>= 18'} 878 | hasBin: true 879 | 880 | merge-stream@2.0.0: 881 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 882 | 883 | merge2@1.4.1: 884 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 885 | engines: {node: '>= 8'} 886 | 887 | micromatch@4.0.5: 888 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 889 | engines: {node: '>=8.6'} 890 | 891 | mimic-fn@2.1.0: 892 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 893 | engines: {node: '>=6'} 894 | 895 | minimatch@9.0.4: 896 | resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} 897 | engines: {node: '>=16 || 14 >=14.17'} 898 | 899 | minimist@1.2.8: 900 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 901 | 902 | minipass@7.1.1: 903 | resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} 904 | engines: {node: '>=16 || 14 >=14.17'} 905 | 906 | ms@2.1.2: 907 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 908 | 909 | mz@2.7.0: 910 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 911 | 912 | nanoid@3.3.7: 913 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 914 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 915 | hasBin: true 916 | 917 | node-emoji@2.1.3: 918 | resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} 919 | engines: {node: '>=18'} 920 | 921 | normalize-path@3.0.0: 922 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 923 | engines: {node: '>=0.10.0'} 924 | 925 | npm-run-path@4.0.1: 926 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 927 | engines: {node: '>=8'} 928 | 929 | object-assign@4.1.1: 930 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 931 | engines: {node: '>=0.10.0'} 932 | 933 | ollama-ai-provider@0.16.1: 934 | resolution: {integrity: sha512-0vSQVz5Y/LguyzfO4bi1JrrVGF/k2JvO8/uFR0wYmqDFp8KPp4+AhdENSynGBr1oRhMWOM4F1l6cv7UNDgRMjw==} 935 | engines: {node: '>=18'} 936 | peerDependencies: 937 | zod: ^3.0.0 938 | peerDependenciesMeta: 939 | zod: 940 | optional: true 941 | 942 | onetime@5.1.2: 943 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 944 | engines: {node: '>=6'} 945 | 946 | package-json@10.0.1: 947 | resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==} 948 | engines: {node: '>=18'} 949 | 950 | parse5-htmlparser2-tree-adapter@6.0.1: 951 | resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} 952 | 953 | parse5@5.1.1: 954 | resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} 955 | 956 | parse5@6.0.1: 957 | resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} 958 | 959 | partial-json@0.1.7: 960 | resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==} 961 | 962 | path-key@3.1.1: 963 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 964 | engines: {node: '>=8'} 965 | 966 | path-scurry@1.11.1: 967 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 968 | engines: {node: '>=16 || 14 >=14.18'} 969 | 970 | path-type@4.0.0: 971 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 972 | engines: {node: '>=8'} 973 | 974 | picocolors@1.0.1: 975 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 976 | 977 | picomatch@2.3.1: 978 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 979 | engines: {node: '>=8.6'} 980 | 981 | pirates@4.0.6: 982 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 983 | engines: {node: '>= 6'} 984 | 985 | postcss-load-config@4.0.2: 986 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 987 | engines: {node: '>= 14'} 988 | peerDependencies: 989 | postcss: '>=8.0.9' 990 | ts-node: '>=9.0.0' 991 | peerDependenciesMeta: 992 | postcss: 993 | optional: true 994 | ts-node: 995 | optional: true 996 | 997 | postcss@8.4.38: 998 | resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} 999 | engines: {node: ^10 || ^12 || >=14} 1000 | 1001 | prompts@2.4.2: 1002 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 1003 | engines: {node: '>= 6'} 1004 | 1005 | proto-list@1.2.4: 1006 | resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} 1007 | 1008 | punycode@2.3.1: 1009 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1010 | engines: {node: '>=6'} 1011 | 1012 | pupa@3.1.0: 1013 | resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} 1014 | engines: {node: '>=12.20'} 1015 | 1016 | queue-microtask@1.2.3: 1017 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1018 | 1019 | rc@1.2.8: 1020 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 1021 | hasBin: true 1022 | 1023 | react@18.3.1: 1024 | resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} 1025 | engines: {node: '>=0.10.0'} 1026 | 1027 | readdirp@3.6.0: 1028 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1029 | engines: {node: '>=8.10.0'} 1030 | 1031 | registry-auth-token@5.0.2: 1032 | resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} 1033 | engines: {node: '>=14'} 1034 | 1035 | registry-url@6.0.1: 1036 | resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} 1037 | engines: {node: '>=12'} 1038 | 1039 | require-directory@2.1.1: 1040 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1041 | engines: {node: '>=0.10.0'} 1042 | 1043 | resolve-from@5.0.0: 1044 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1045 | engines: {node: '>=8'} 1046 | 1047 | restore-cursor@4.0.0: 1048 | resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} 1049 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1050 | 1051 | reusify@1.0.4: 1052 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1053 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1054 | 1055 | rollup@4.17.2: 1056 | resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} 1057 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1058 | hasBin: true 1059 | 1060 | run-parallel@1.2.0: 1061 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1062 | 1063 | secure-json-parse@2.7.0: 1064 | resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} 1065 | 1066 | semver@7.6.3: 1067 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1068 | engines: {node: '>=10'} 1069 | hasBin: true 1070 | 1071 | shebang-command@2.0.0: 1072 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1073 | engines: {node: '>=8'} 1074 | 1075 | shebang-regex@3.0.0: 1076 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1077 | engines: {node: '>=8'} 1078 | 1079 | signal-exit@3.0.7: 1080 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1081 | 1082 | signal-exit@4.1.0: 1083 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1084 | engines: {node: '>=14'} 1085 | 1086 | sisteransi@1.0.5: 1087 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 1088 | 1089 | skin-tone@2.0.0: 1090 | resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} 1091 | engines: {node: '>=8'} 1092 | 1093 | slash@3.0.0: 1094 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1095 | engines: {node: '>=8'} 1096 | 1097 | slice-ansi@7.1.0: 1098 | resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} 1099 | engines: {node: '>=18'} 1100 | 1101 | smol-toml@1.3.1: 1102 | resolution: {integrity: sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==} 1103 | engines: {node: '>= 18'} 1104 | 1105 | source-map-js@1.2.0: 1106 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 1107 | engines: {node: '>=0.10.0'} 1108 | 1109 | source-map@0.8.0-beta.0: 1110 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1111 | engines: {node: '>= 8'} 1112 | 1113 | string-width@4.2.3: 1114 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1115 | engines: {node: '>=8'} 1116 | 1117 | string-width@5.1.2: 1118 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1119 | engines: {node: '>=12'} 1120 | 1121 | string-width@7.1.0: 1122 | resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} 1123 | engines: {node: '>=18'} 1124 | 1125 | string-width@7.2.0: 1126 | resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} 1127 | engines: {node: '>=18'} 1128 | 1129 | strip-ansi@6.0.1: 1130 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1131 | engines: {node: '>=8'} 1132 | 1133 | strip-ansi@7.1.0: 1134 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1135 | engines: {node: '>=12'} 1136 | 1137 | strip-final-newline@2.0.0: 1138 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1139 | engines: {node: '>=6'} 1140 | 1141 | strip-json-comments@2.0.1: 1142 | resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 1143 | engines: {node: '>=0.10.0'} 1144 | 1145 | stubborn-fs@1.2.5: 1146 | resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} 1147 | 1148 | sucrase@3.35.0: 1149 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1150 | engines: {node: '>=16 || 14 >=14.17'} 1151 | hasBin: true 1152 | 1153 | supports-color@7.2.0: 1154 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1155 | engines: {node: '>=8'} 1156 | 1157 | supports-hyperlinks@3.1.0: 1158 | resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} 1159 | engines: {node: '>=14.18'} 1160 | 1161 | swr@2.2.5: 1162 | resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==} 1163 | peerDependencies: 1164 | react: ^16.11.0 || ^17.0.0 || ^18.0.0 1165 | 1166 | thenify-all@1.6.0: 1167 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1168 | engines: {node: '>=0.8'} 1169 | 1170 | thenify@3.3.1: 1171 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1172 | 1173 | throttleit@2.1.0: 1174 | resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} 1175 | engines: {node: '>=18'} 1176 | 1177 | to-regex-range@5.0.1: 1178 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1179 | engines: {node: '>=8.0'} 1180 | 1181 | tr46@1.0.1: 1182 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1183 | 1184 | tree-kill@1.2.2: 1185 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1186 | hasBin: true 1187 | 1188 | ts-interface-checker@0.1.13: 1189 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1190 | 1191 | tsup@8.0.2: 1192 | resolution: {integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==} 1193 | engines: {node: '>=18'} 1194 | hasBin: true 1195 | peerDependencies: 1196 | '@microsoft/api-extractor': ^7.36.0 1197 | '@swc/core': ^1 1198 | postcss: ^8.4.12 1199 | typescript: '>=4.5.0' 1200 | peerDependenciesMeta: 1201 | '@microsoft/api-extractor': 1202 | optional: true 1203 | '@swc/core': 1204 | optional: true 1205 | postcss: 1206 | optional: true 1207 | typescript: 1208 | optional: true 1209 | 1210 | type-fest@2.19.0: 1211 | resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} 1212 | engines: {node: '>=12.20'} 1213 | 1214 | type-fest@4.27.0: 1215 | resolution: {integrity: sha512-3IMSWgP7C5KSQqmo1wjhKrwsvXAtF33jO3QY+Uy++ia7hqvgSK6iXbbg5PbDBc1P2ZbNEDgejOrN4YooXvhwCw==} 1216 | engines: {node: '>=16'} 1217 | 1218 | typescript@5.6.3: 1219 | resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} 1220 | engines: {node: '>=14.17'} 1221 | hasBin: true 1222 | 1223 | undici-types@6.19.8: 1224 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 1225 | 1226 | unicode-emoji-modifier-base@1.0.0: 1227 | resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} 1228 | engines: {node: '>=4'} 1229 | 1230 | update-notifier@7.3.1: 1231 | resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==} 1232 | engines: {node: '>=18'} 1233 | 1234 | use-sync-external-store@1.2.2: 1235 | resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} 1236 | peerDependencies: 1237 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1238 | 1239 | webidl-conversions@4.0.2: 1240 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 1241 | 1242 | whatwg-url@7.1.0: 1243 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 1244 | 1245 | when-exit@2.1.3: 1246 | resolution: {integrity: sha512-uVieSTccFIr/SFQdFWN/fFaQYmV37OKtuaGphMAzi4DmmUlrvRBJW5WSLkHyjNQY/ePJMz3LoiX9R3yy1Su6Hw==} 1247 | 1248 | which@2.0.2: 1249 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1250 | engines: {node: '>= 8'} 1251 | hasBin: true 1252 | 1253 | widest-line@4.0.1: 1254 | resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} 1255 | engines: {node: '>=12'} 1256 | 1257 | widest-line@5.0.0: 1258 | resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} 1259 | engines: {node: '>=18'} 1260 | 1261 | wrap-ansi@7.0.0: 1262 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1263 | engines: {node: '>=10'} 1264 | 1265 | wrap-ansi@8.1.0: 1266 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1267 | engines: {node: '>=12'} 1268 | 1269 | wrap-ansi@9.0.0: 1270 | resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} 1271 | engines: {node: '>=18'} 1272 | 1273 | xdg-basedir@5.1.0: 1274 | resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} 1275 | engines: {node: '>=12'} 1276 | 1277 | y18n@5.0.8: 1278 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1279 | engines: {node: '>=10'} 1280 | 1281 | yaml@2.4.2: 1282 | resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} 1283 | engines: {node: '>= 14'} 1284 | hasBin: true 1285 | 1286 | yargs-parser@20.2.9: 1287 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 1288 | engines: {node: '>=10'} 1289 | 1290 | yargs@16.2.0: 1291 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 1292 | engines: {node: '>=10'} 1293 | 1294 | zod-to-json-schema@3.23.5: 1295 | resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==} 1296 | peerDependencies: 1297 | zod: ^3.23.3 1298 | 1299 | zod@3.23.8: 1300 | resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} 1301 | 1302 | snapshots: 1303 | 1304 | '@ai-sdk/anthropic@1.0.2(zod@3.23.8)': 1305 | dependencies: 1306 | '@ai-sdk/provider': 1.0.1 1307 | '@ai-sdk/provider-utils': 2.0.2(zod@3.23.8) 1308 | zod: 3.23.8 1309 | 1310 | '@ai-sdk/google@1.0.3(zod@3.23.8)': 1311 | dependencies: 1312 | '@ai-sdk/provider': 1.0.1 1313 | '@ai-sdk/provider-utils': 2.0.2(zod@3.23.8) 1314 | zod: 3.23.8 1315 | 1316 | '@ai-sdk/openai@1.0.4(zod@3.23.8)': 1317 | dependencies: 1318 | '@ai-sdk/provider': 1.0.1 1319 | '@ai-sdk/provider-utils': 2.0.2(zod@3.23.8) 1320 | zod: 3.23.8 1321 | 1322 | '@ai-sdk/provider-utils@1.0.22(zod@3.23.8)': 1323 | dependencies: 1324 | '@ai-sdk/provider': 0.0.26 1325 | eventsource-parser: 1.1.2 1326 | nanoid: 3.3.7 1327 | secure-json-parse: 2.7.0 1328 | optionalDependencies: 1329 | zod: 3.23.8 1330 | 1331 | '@ai-sdk/provider-utils@2.0.2(zod@3.23.8)': 1332 | dependencies: 1333 | '@ai-sdk/provider': 1.0.1 1334 | eventsource-parser: 3.0.0 1335 | nanoid: 3.3.7 1336 | secure-json-parse: 2.7.0 1337 | optionalDependencies: 1338 | zod: 3.23.8 1339 | 1340 | '@ai-sdk/provider@0.0.26': 1341 | dependencies: 1342 | json-schema: 0.4.0 1343 | 1344 | '@ai-sdk/provider@1.0.1': 1345 | dependencies: 1346 | json-schema: 0.4.0 1347 | 1348 | '@ai-sdk/react@1.0.2(react@18.3.1)(zod@3.23.8)': 1349 | dependencies: 1350 | '@ai-sdk/provider-utils': 2.0.2(zod@3.23.8) 1351 | '@ai-sdk/ui-utils': 1.0.2(zod@3.23.8) 1352 | swr: 2.2.5(react@18.3.1) 1353 | throttleit: 2.1.0 1354 | optionalDependencies: 1355 | react: 18.3.1 1356 | zod: 3.23.8 1357 | 1358 | '@ai-sdk/ui-utils@1.0.2(zod@3.23.8)': 1359 | dependencies: 1360 | '@ai-sdk/provider': 1.0.1 1361 | '@ai-sdk/provider-utils': 2.0.2(zod@3.23.8) 1362 | zod-to-json-schema: 3.23.5(zod@3.23.8) 1363 | optionalDependencies: 1364 | zod: 3.23.8 1365 | 1366 | '@colors/colors@1.5.0': 1367 | optional: true 1368 | 1369 | '@esbuild/aix-ppc64@0.19.12': 1370 | optional: true 1371 | 1372 | '@esbuild/android-arm64@0.19.12': 1373 | optional: true 1374 | 1375 | '@esbuild/android-arm@0.19.12': 1376 | optional: true 1377 | 1378 | '@esbuild/android-x64@0.19.12': 1379 | optional: true 1380 | 1381 | '@esbuild/darwin-arm64@0.19.12': 1382 | optional: true 1383 | 1384 | '@esbuild/darwin-x64@0.19.12': 1385 | optional: true 1386 | 1387 | '@esbuild/freebsd-arm64@0.19.12': 1388 | optional: true 1389 | 1390 | '@esbuild/freebsd-x64@0.19.12': 1391 | optional: true 1392 | 1393 | '@esbuild/linux-arm64@0.19.12': 1394 | optional: true 1395 | 1396 | '@esbuild/linux-arm@0.19.12': 1397 | optional: true 1398 | 1399 | '@esbuild/linux-ia32@0.19.12': 1400 | optional: true 1401 | 1402 | '@esbuild/linux-loong64@0.19.12': 1403 | optional: true 1404 | 1405 | '@esbuild/linux-mips64el@0.19.12': 1406 | optional: true 1407 | 1408 | '@esbuild/linux-ppc64@0.19.12': 1409 | optional: true 1410 | 1411 | '@esbuild/linux-riscv64@0.19.12': 1412 | optional: true 1413 | 1414 | '@esbuild/linux-s390x@0.19.12': 1415 | optional: true 1416 | 1417 | '@esbuild/linux-x64@0.19.12': 1418 | optional: true 1419 | 1420 | '@esbuild/netbsd-x64@0.19.12': 1421 | optional: true 1422 | 1423 | '@esbuild/openbsd-x64@0.19.12': 1424 | optional: true 1425 | 1426 | '@esbuild/sunos-x64@0.19.12': 1427 | optional: true 1428 | 1429 | '@esbuild/win32-arm64@0.19.12': 1430 | optional: true 1431 | 1432 | '@esbuild/win32-ia32@0.19.12': 1433 | optional: true 1434 | 1435 | '@esbuild/win32-x64@0.19.12': 1436 | optional: true 1437 | 1438 | '@isaacs/cliui@8.0.2': 1439 | dependencies: 1440 | string-width: 5.1.2 1441 | string-width-cjs: string-width@4.2.3 1442 | strip-ansi: 7.1.0 1443 | strip-ansi-cjs: strip-ansi@6.0.1 1444 | wrap-ansi: 8.1.0 1445 | wrap-ansi-cjs: wrap-ansi@7.0.0 1446 | 1447 | '@jridgewell/gen-mapping@0.3.5': 1448 | dependencies: 1449 | '@jridgewell/set-array': 1.2.1 1450 | '@jridgewell/sourcemap-codec': 1.4.15 1451 | '@jridgewell/trace-mapping': 0.3.25 1452 | 1453 | '@jridgewell/resolve-uri@3.1.2': {} 1454 | 1455 | '@jridgewell/set-array@1.2.1': {} 1456 | 1457 | '@jridgewell/sourcemap-codec@1.4.15': {} 1458 | 1459 | '@jridgewell/trace-mapping@0.3.25': 1460 | dependencies: 1461 | '@jridgewell/resolve-uri': 3.1.2 1462 | '@jridgewell/sourcemap-codec': 1.4.15 1463 | 1464 | '@nodelib/fs.scandir@2.1.5': 1465 | dependencies: 1466 | '@nodelib/fs.stat': 2.0.5 1467 | run-parallel: 1.2.0 1468 | 1469 | '@nodelib/fs.stat@2.0.5': {} 1470 | 1471 | '@nodelib/fs.walk@1.2.8': 1472 | dependencies: 1473 | '@nodelib/fs.scandir': 2.1.5 1474 | fastq: 1.17.1 1475 | 1476 | '@opentelemetry/api@1.9.0': {} 1477 | 1478 | '@pkgjs/parseargs@0.11.0': 1479 | optional: true 1480 | 1481 | '@pnpm/config.env-replace@1.1.0': {} 1482 | 1483 | '@pnpm/network.ca-file@1.0.2': 1484 | dependencies: 1485 | graceful-fs: 4.2.10 1486 | 1487 | '@pnpm/npm-conf@2.2.2': 1488 | dependencies: 1489 | '@pnpm/config.env-replace': 1.1.0 1490 | '@pnpm/network.ca-file': 1.0.2 1491 | config-chain: 1.1.13 1492 | 1493 | '@rollup/rollup-android-arm-eabi@4.17.2': 1494 | optional: true 1495 | 1496 | '@rollup/rollup-android-arm64@4.17.2': 1497 | optional: true 1498 | 1499 | '@rollup/rollup-darwin-arm64@4.17.2': 1500 | optional: true 1501 | 1502 | '@rollup/rollup-darwin-x64@4.17.2': 1503 | optional: true 1504 | 1505 | '@rollup/rollup-linux-arm-gnueabihf@4.17.2': 1506 | optional: true 1507 | 1508 | '@rollup/rollup-linux-arm-musleabihf@4.17.2': 1509 | optional: true 1510 | 1511 | '@rollup/rollup-linux-arm64-gnu@4.17.2': 1512 | optional: true 1513 | 1514 | '@rollup/rollup-linux-arm64-musl@4.17.2': 1515 | optional: true 1516 | 1517 | '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': 1518 | optional: true 1519 | 1520 | '@rollup/rollup-linux-riscv64-gnu@4.17.2': 1521 | optional: true 1522 | 1523 | '@rollup/rollup-linux-s390x-gnu@4.17.2': 1524 | optional: true 1525 | 1526 | '@rollup/rollup-linux-x64-gnu@4.17.2': 1527 | optional: true 1528 | 1529 | '@rollup/rollup-linux-x64-musl@4.17.2': 1530 | optional: true 1531 | 1532 | '@rollup/rollup-win32-arm64-msvc@4.17.2': 1533 | optional: true 1534 | 1535 | '@rollup/rollup-win32-ia32-msvc@4.17.2': 1536 | optional: true 1537 | 1538 | '@rollup/rollup-win32-x64-msvc@4.17.2': 1539 | optional: true 1540 | 1541 | '@sindresorhus/is@4.6.0': {} 1542 | 1543 | '@types/cardinal@2.1.1': {} 1544 | 1545 | '@types/configstore@6.0.2': {} 1546 | 1547 | '@types/diff-match-patch@1.0.36': {} 1548 | 1549 | '@types/estree@1.0.5': {} 1550 | 1551 | '@types/marked-terminal@6.1.1': 1552 | dependencies: 1553 | '@types/cardinal': 2.1.1 1554 | '@types/node': 22.9.0 1555 | chalk: 5.3.0 1556 | marked: 11.2.0 1557 | 1558 | '@types/node@22.9.0': 1559 | dependencies: 1560 | undici-types: 6.19.8 1561 | 1562 | '@types/prompts@2.4.9': 1563 | dependencies: 1564 | '@types/node': 22.9.0 1565 | kleur: 3.0.3 1566 | 1567 | '@types/update-notifier@6.0.8': 1568 | dependencies: 1569 | '@types/configstore': 6.0.2 1570 | boxen: 7.1.1 1571 | 1572 | ai@4.0.3(react@18.3.1)(zod@3.23.8): 1573 | dependencies: 1574 | '@ai-sdk/provider': 1.0.1 1575 | '@ai-sdk/provider-utils': 2.0.2(zod@3.23.8) 1576 | '@ai-sdk/react': 1.0.2(react@18.3.1)(zod@3.23.8) 1577 | '@ai-sdk/ui-utils': 1.0.2(zod@3.23.8) 1578 | '@opentelemetry/api': 1.9.0 1579 | jsondiffpatch: 0.6.0 1580 | zod-to-json-schema: 3.23.5(zod@3.23.8) 1581 | optionalDependencies: 1582 | react: 18.3.1 1583 | zod: 3.23.8 1584 | 1585 | ansi-align@3.0.1: 1586 | dependencies: 1587 | string-width: 4.2.3 1588 | 1589 | ansi-escapes@6.2.1: {} 1590 | 1591 | ansi-escapes@7.0.0: 1592 | dependencies: 1593 | environment: 1.1.0 1594 | 1595 | ansi-regex@5.0.1: {} 1596 | 1597 | ansi-regex@6.0.1: {} 1598 | 1599 | ansi-regex@6.1.0: {} 1600 | 1601 | ansi-styles@4.3.0: 1602 | dependencies: 1603 | color-convert: 2.0.1 1604 | 1605 | ansi-styles@6.2.1: {} 1606 | 1607 | any-promise@1.3.0: {} 1608 | 1609 | anymatch@3.1.3: 1610 | dependencies: 1611 | normalize-path: 3.0.0 1612 | picomatch: 2.3.1 1613 | 1614 | array-union@2.1.0: {} 1615 | 1616 | atomically@2.0.3: 1617 | dependencies: 1618 | stubborn-fs: 1.2.5 1619 | when-exit: 2.1.3 1620 | 1621 | balanced-match@1.0.2: {} 1622 | 1623 | binary-extensions@2.3.0: {} 1624 | 1625 | boxen@7.1.1: 1626 | dependencies: 1627 | ansi-align: 3.0.1 1628 | camelcase: 7.0.1 1629 | chalk: 5.3.0 1630 | cli-boxes: 3.0.0 1631 | string-width: 5.1.2 1632 | type-fest: 2.19.0 1633 | widest-line: 4.0.1 1634 | wrap-ansi: 8.1.0 1635 | 1636 | boxen@8.0.1: 1637 | dependencies: 1638 | ansi-align: 3.0.1 1639 | camelcase: 8.0.0 1640 | chalk: 5.3.0 1641 | cli-boxes: 3.0.0 1642 | string-width: 7.2.0 1643 | type-fest: 4.27.0 1644 | widest-line: 5.0.0 1645 | wrap-ansi: 9.0.0 1646 | 1647 | brace-expansion@2.0.1: 1648 | dependencies: 1649 | balanced-match: 1.0.2 1650 | 1651 | braces@3.0.2: 1652 | dependencies: 1653 | fill-range: 7.0.1 1654 | 1655 | bundle-require@4.1.0(esbuild@0.19.12): 1656 | dependencies: 1657 | esbuild: 0.19.12 1658 | load-tsconfig: 0.2.5 1659 | 1660 | cac@6.7.14: {} 1661 | 1662 | camelcase@7.0.1: {} 1663 | 1664 | camelcase@8.0.0: {} 1665 | 1666 | chalk@4.1.2: 1667 | dependencies: 1668 | ansi-styles: 4.3.0 1669 | supports-color: 7.2.0 1670 | 1671 | chalk@5.3.0: {} 1672 | 1673 | char-regex@1.0.2: {} 1674 | 1675 | chokidar@3.6.0: 1676 | dependencies: 1677 | anymatch: 3.1.3 1678 | braces: 3.0.2 1679 | glob-parent: 5.1.2 1680 | is-binary-path: 2.1.0 1681 | is-glob: 4.0.3 1682 | normalize-path: 3.0.0 1683 | readdirp: 3.6.0 1684 | optionalDependencies: 1685 | fsevents: 2.3.3 1686 | 1687 | cli-boxes@3.0.0: {} 1688 | 1689 | cli-cursor@4.0.0: 1690 | dependencies: 1691 | restore-cursor: 4.0.0 1692 | 1693 | cli-highlight@2.1.11: 1694 | dependencies: 1695 | chalk: 4.1.2 1696 | highlight.js: 10.7.3 1697 | mz: 2.7.0 1698 | parse5: 5.1.1 1699 | parse5-htmlparser2-tree-adapter: 6.0.1 1700 | yargs: 16.2.0 1701 | 1702 | cli-table3@0.6.5: 1703 | dependencies: 1704 | string-width: 4.2.3 1705 | optionalDependencies: 1706 | '@colors/colors': 1.5.0 1707 | 1708 | client-only@0.0.1: {} 1709 | 1710 | cliui@7.0.4: 1711 | dependencies: 1712 | string-width: 4.2.3 1713 | strip-ansi: 6.0.1 1714 | wrap-ansi: 7.0.0 1715 | 1716 | color-convert@2.0.1: 1717 | dependencies: 1718 | color-name: 1.1.4 1719 | 1720 | color-name@1.1.4: {} 1721 | 1722 | colorette@2.0.20: {} 1723 | 1724 | commander@4.1.1: {} 1725 | 1726 | config-chain@1.1.13: 1727 | dependencies: 1728 | ini: 1.3.8 1729 | proto-list: 1.2.4 1730 | 1731 | configstore@7.0.0: 1732 | dependencies: 1733 | atomically: 2.0.3 1734 | dot-prop: 9.0.0 1735 | graceful-fs: 4.2.11 1736 | xdg-basedir: 5.1.0 1737 | 1738 | cross-spawn@7.0.3: 1739 | dependencies: 1740 | path-key: 3.1.1 1741 | shebang-command: 2.0.0 1742 | which: 2.0.2 1743 | 1744 | debug@4.3.4: 1745 | dependencies: 1746 | ms: 2.1.2 1747 | 1748 | deep-extend@0.6.0: {} 1749 | 1750 | diff-match-patch@1.0.5: {} 1751 | 1752 | dir-glob@3.0.1: 1753 | dependencies: 1754 | path-type: 4.0.0 1755 | 1756 | dot-prop@9.0.0: 1757 | dependencies: 1758 | type-fest: 4.27.0 1759 | 1760 | eastasianwidth@0.2.0: {} 1761 | 1762 | emoji-regex@10.3.0: {} 1763 | 1764 | emoji-regex@8.0.0: {} 1765 | 1766 | emoji-regex@9.2.2: {} 1767 | 1768 | emojilib@2.4.0: {} 1769 | 1770 | environment@1.1.0: {} 1771 | 1772 | esbuild@0.19.12: 1773 | optionalDependencies: 1774 | '@esbuild/aix-ppc64': 0.19.12 1775 | '@esbuild/android-arm': 0.19.12 1776 | '@esbuild/android-arm64': 0.19.12 1777 | '@esbuild/android-x64': 0.19.12 1778 | '@esbuild/darwin-arm64': 0.19.12 1779 | '@esbuild/darwin-x64': 0.19.12 1780 | '@esbuild/freebsd-arm64': 0.19.12 1781 | '@esbuild/freebsd-x64': 0.19.12 1782 | '@esbuild/linux-arm': 0.19.12 1783 | '@esbuild/linux-arm64': 0.19.12 1784 | '@esbuild/linux-ia32': 0.19.12 1785 | '@esbuild/linux-loong64': 0.19.12 1786 | '@esbuild/linux-mips64el': 0.19.12 1787 | '@esbuild/linux-ppc64': 0.19.12 1788 | '@esbuild/linux-riscv64': 0.19.12 1789 | '@esbuild/linux-s390x': 0.19.12 1790 | '@esbuild/linux-x64': 0.19.12 1791 | '@esbuild/netbsd-x64': 0.19.12 1792 | '@esbuild/openbsd-x64': 0.19.12 1793 | '@esbuild/sunos-x64': 0.19.12 1794 | '@esbuild/win32-arm64': 0.19.12 1795 | '@esbuild/win32-ia32': 0.19.12 1796 | '@esbuild/win32-x64': 0.19.12 1797 | 1798 | escalade@3.1.2: {} 1799 | 1800 | escape-goat@4.0.0: {} 1801 | 1802 | eventsource-parser@1.1.2: {} 1803 | 1804 | eventsource-parser@3.0.0: {} 1805 | 1806 | execa@5.1.1: 1807 | dependencies: 1808 | cross-spawn: 7.0.3 1809 | get-stream: 6.0.1 1810 | human-signals: 2.1.0 1811 | is-stream: 2.0.1 1812 | merge-stream: 2.0.0 1813 | npm-run-path: 4.0.1 1814 | onetime: 5.1.2 1815 | signal-exit: 3.0.7 1816 | strip-final-newline: 2.0.0 1817 | 1818 | fast-glob@3.3.2: 1819 | dependencies: 1820 | '@nodelib/fs.stat': 2.0.5 1821 | '@nodelib/fs.walk': 1.2.8 1822 | glob-parent: 5.1.2 1823 | merge2: 1.4.1 1824 | micromatch: 4.0.5 1825 | 1826 | fastq@1.17.1: 1827 | dependencies: 1828 | reusify: 1.0.4 1829 | 1830 | fill-range@7.0.1: 1831 | dependencies: 1832 | to-regex-range: 5.0.1 1833 | 1834 | foreground-child@3.1.1: 1835 | dependencies: 1836 | cross-spawn: 7.0.3 1837 | signal-exit: 4.1.0 1838 | 1839 | fsevents@2.3.3: 1840 | optional: true 1841 | 1842 | get-caller-file@2.0.5: {} 1843 | 1844 | get-east-asian-width@1.2.0: {} 1845 | 1846 | get-stream@6.0.1: {} 1847 | 1848 | glob-parent@5.1.2: 1849 | dependencies: 1850 | is-glob: 4.0.3 1851 | 1852 | glob@10.3.15: 1853 | dependencies: 1854 | foreground-child: 3.1.1 1855 | jackspeak: 2.3.6 1856 | minimatch: 9.0.4 1857 | minipass: 7.1.1 1858 | path-scurry: 1.11.1 1859 | 1860 | global-directory@4.0.1: 1861 | dependencies: 1862 | ini: 4.1.1 1863 | 1864 | globby@11.1.0: 1865 | dependencies: 1866 | array-union: 2.1.0 1867 | dir-glob: 3.0.1 1868 | fast-glob: 3.3.2 1869 | ignore: 5.3.1 1870 | merge2: 1.4.1 1871 | slash: 3.0.0 1872 | 1873 | graceful-fs@4.2.10: {} 1874 | 1875 | graceful-fs@4.2.11: {} 1876 | 1877 | has-flag@4.0.0: {} 1878 | 1879 | highlight.js@10.7.3: {} 1880 | 1881 | human-signals@2.1.0: {} 1882 | 1883 | ignore@5.3.1: {} 1884 | 1885 | ini@1.3.8: {} 1886 | 1887 | ini@4.1.1: {} 1888 | 1889 | is-binary-path@2.1.0: 1890 | dependencies: 1891 | binary-extensions: 2.3.0 1892 | 1893 | is-extglob@2.1.1: {} 1894 | 1895 | is-fullwidth-code-point@3.0.0: {} 1896 | 1897 | is-fullwidth-code-point@5.0.0: 1898 | dependencies: 1899 | get-east-asian-width: 1.2.0 1900 | 1901 | is-glob@4.0.3: 1902 | dependencies: 1903 | is-extglob: 2.1.1 1904 | 1905 | is-in-ci@1.0.0: {} 1906 | 1907 | is-installed-globally@1.0.0: 1908 | dependencies: 1909 | global-directory: 4.0.1 1910 | is-path-inside: 4.0.0 1911 | 1912 | is-npm@6.0.0: {} 1913 | 1914 | is-number@7.0.0: {} 1915 | 1916 | is-path-inside@4.0.0: {} 1917 | 1918 | is-stream@2.0.1: {} 1919 | 1920 | isexe@2.0.0: {} 1921 | 1922 | jackspeak@2.3.6: 1923 | dependencies: 1924 | '@isaacs/cliui': 8.0.2 1925 | optionalDependencies: 1926 | '@pkgjs/parseargs': 0.11.0 1927 | 1928 | joycon@3.1.1: {} 1929 | 1930 | js-tokens@4.0.0: {} 1931 | 1932 | json-schema@0.4.0: {} 1933 | 1934 | jsondiffpatch@0.6.0: 1935 | dependencies: 1936 | '@types/diff-match-patch': 1.0.36 1937 | chalk: 5.3.0 1938 | diff-match-patch: 1.0.5 1939 | 1940 | kleur@3.0.3: {} 1941 | 1942 | ky@1.7.2: {} 1943 | 1944 | latest-version@9.0.0: 1945 | dependencies: 1946 | package-json: 10.0.1 1947 | 1948 | lilconfig@3.1.1: {} 1949 | 1950 | lines-and-columns@1.2.4: {} 1951 | 1952 | load-tsconfig@0.2.5: {} 1953 | 1954 | lodash.sortby@4.7.0: {} 1955 | 1956 | log-update@6.0.0: 1957 | dependencies: 1958 | ansi-escapes: 6.2.1 1959 | cli-cursor: 4.0.0 1960 | slice-ansi: 7.1.0 1961 | strip-ansi: 7.1.0 1962 | wrap-ansi: 9.0.0 1963 | 1964 | loose-envify@1.4.0: 1965 | dependencies: 1966 | js-tokens: 4.0.0 1967 | 1968 | lru-cache@10.2.2: {} 1969 | 1970 | marked-terminal@7.2.1(marked@15.0.1): 1971 | dependencies: 1972 | ansi-escapes: 7.0.0 1973 | ansi-regex: 6.1.0 1974 | chalk: 5.3.0 1975 | cli-highlight: 2.1.11 1976 | cli-table3: 0.6.5 1977 | marked: 15.0.1 1978 | node-emoji: 2.1.3 1979 | supports-hyperlinks: 3.1.0 1980 | 1981 | marked@11.2.0: {} 1982 | 1983 | marked@15.0.1: {} 1984 | 1985 | merge-stream@2.0.0: {} 1986 | 1987 | merge2@1.4.1: {} 1988 | 1989 | micromatch@4.0.5: 1990 | dependencies: 1991 | braces: 3.0.2 1992 | picomatch: 2.3.1 1993 | 1994 | mimic-fn@2.1.0: {} 1995 | 1996 | minimatch@9.0.4: 1997 | dependencies: 1998 | brace-expansion: 2.0.1 1999 | 2000 | minimist@1.2.8: {} 2001 | 2002 | minipass@7.1.1: {} 2003 | 2004 | ms@2.1.2: {} 2005 | 2006 | mz@2.7.0: 2007 | dependencies: 2008 | any-promise: 1.3.0 2009 | object-assign: 4.1.1 2010 | thenify-all: 1.6.0 2011 | 2012 | nanoid@3.3.7: {} 2013 | 2014 | node-emoji@2.1.3: 2015 | dependencies: 2016 | '@sindresorhus/is': 4.6.0 2017 | char-regex: 1.0.2 2018 | emojilib: 2.4.0 2019 | skin-tone: 2.0.0 2020 | 2021 | normalize-path@3.0.0: {} 2022 | 2023 | npm-run-path@4.0.1: 2024 | dependencies: 2025 | path-key: 3.1.1 2026 | 2027 | object-assign@4.1.1: {} 2028 | 2029 | ollama-ai-provider@0.16.1(zod@3.23.8): 2030 | dependencies: 2031 | '@ai-sdk/provider': 0.0.26 2032 | '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) 2033 | partial-json: 0.1.7 2034 | optionalDependencies: 2035 | zod: 3.23.8 2036 | 2037 | onetime@5.1.2: 2038 | dependencies: 2039 | mimic-fn: 2.1.0 2040 | 2041 | package-json@10.0.1: 2042 | dependencies: 2043 | ky: 1.7.2 2044 | registry-auth-token: 5.0.2 2045 | registry-url: 6.0.1 2046 | semver: 7.6.3 2047 | 2048 | parse5-htmlparser2-tree-adapter@6.0.1: 2049 | dependencies: 2050 | parse5: 6.0.1 2051 | 2052 | parse5@5.1.1: {} 2053 | 2054 | parse5@6.0.1: {} 2055 | 2056 | partial-json@0.1.7: {} 2057 | 2058 | path-key@3.1.1: {} 2059 | 2060 | path-scurry@1.11.1: 2061 | dependencies: 2062 | lru-cache: 10.2.2 2063 | minipass: 7.1.1 2064 | 2065 | path-type@4.0.0: {} 2066 | 2067 | picocolors@1.0.1: 2068 | optional: true 2069 | 2070 | picomatch@2.3.1: {} 2071 | 2072 | pirates@4.0.6: {} 2073 | 2074 | postcss-load-config@4.0.2(postcss@8.4.38): 2075 | dependencies: 2076 | lilconfig: 3.1.1 2077 | yaml: 2.4.2 2078 | optionalDependencies: 2079 | postcss: 8.4.38 2080 | 2081 | postcss@8.4.38: 2082 | dependencies: 2083 | nanoid: 3.3.7 2084 | picocolors: 1.0.1 2085 | source-map-js: 1.2.0 2086 | optional: true 2087 | 2088 | prompts@2.4.2: 2089 | dependencies: 2090 | kleur: 3.0.3 2091 | sisteransi: 1.0.5 2092 | 2093 | proto-list@1.2.4: {} 2094 | 2095 | punycode@2.3.1: {} 2096 | 2097 | pupa@3.1.0: 2098 | dependencies: 2099 | escape-goat: 4.0.0 2100 | 2101 | queue-microtask@1.2.3: {} 2102 | 2103 | rc@1.2.8: 2104 | dependencies: 2105 | deep-extend: 0.6.0 2106 | ini: 1.3.8 2107 | minimist: 1.2.8 2108 | strip-json-comments: 2.0.1 2109 | 2110 | react@18.3.1: 2111 | dependencies: 2112 | loose-envify: 1.4.0 2113 | 2114 | readdirp@3.6.0: 2115 | dependencies: 2116 | picomatch: 2.3.1 2117 | 2118 | registry-auth-token@5.0.2: 2119 | dependencies: 2120 | '@pnpm/npm-conf': 2.2.2 2121 | 2122 | registry-url@6.0.1: 2123 | dependencies: 2124 | rc: 1.2.8 2125 | 2126 | require-directory@2.1.1: {} 2127 | 2128 | resolve-from@5.0.0: {} 2129 | 2130 | restore-cursor@4.0.0: 2131 | dependencies: 2132 | onetime: 5.1.2 2133 | signal-exit: 3.0.7 2134 | 2135 | reusify@1.0.4: {} 2136 | 2137 | rollup@4.17.2: 2138 | dependencies: 2139 | '@types/estree': 1.0.5 2140 | optionalDependencies: 2141 | '@rollup/rollup-android-arm-eabi': 4.17.2 2142 | '@rollup/rollup-android-arm64': 4.17.2 2143 | '@rollup/rollup-darwin-arm64': 4.17.2 2144 | '@rollup/rollup-darwin-x64': 4.17.2 2145 | '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 2146 | '@rollup/rollup-linux-arm-musleabihf': 4.17.2 2147 | '@rollup/rollup-linux-arm64-gnu': 4.17.2 2148 | '@rollup/rollup-linux-arm64-musl': 4.17.2 2149 | '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 2150 | '@rollup/rollup-linux-riscv64-gnu': 4.17.2 2151 | '@rollup/rollup-linux-s390x-gnu': 4.17.2 2152 | '@rollup/rollup-linux-x64-gnu': 4.17.2 2153 | '@rollup/rollup-linux-x64-musl': 4.17.2 2154 | '@rollup/rollup-win32-arm64-msvc': 4.17.2 2155 | '@rollup/rollup-win32-ia32-msvc': 4.17.2 2156 | '@rollup/rollup-win32-x64-msvc': 4.17.2 2157 | fsevents: 2.3.3 2158 | 2159 | run-parallel@1.2.0: 2160 | dependencies: 2161 | queue-microtask: 1.2.3 2162 | 2163 | secure-json-parse@2.7.0: {} 2164 | 2165 | semver@7.6.3: {} 2166 | 2167 | shebang-command@2.0.0: 2168 | dependencies: 2169 | shebang-regex: 3.0.0 2170 | 2171 | shebang-regex@3.0.0: {} 2172 | 2173 | signal-exit@3.0.7: {} 2174 | 2175 | signal-exit@4.1.0: {} 2176 | 2177 | sisteransi@1.0.5: {} 2178 | 2179 | skin-tone@2.0.0: 2180 | dependencies: 2181 | unicode-emoji-modifier-base: 1.0.0 2182 | 2183 | slash@3.0.0: {} 2184 | 2185 | slice-ansi@7.1.0: 2186 | dependencies: 2187 | ansi-styles: 6.2.1 2188 | is-fullwidth-code-point: 5.0.0 2189 | 2190 | smol-toml@1.3.1: {} 2191 | 2192 | source-map-js@1.2.0: 2193 | optional: true 2194 | 2195 | source-map@0.8.0-beta.0: 2196 | dependencies: 2197 | whatwg-url: 7.1.0 2198 | 2199 | string-width@4.2.3: 2200 | dependencies: 2201 | emoji-regex: 8.0.0 2202 | is-fullwidth-code-point: 3.0.0 2203 | strip-ansi: 6.0.1 2204 | 2205 | string-width@5.1.2: 2206 | dependencies: 2207 | eastasianwidth: 0.2.0 2208 | emoji-regex: 9.2.2 2209 | strip-ansi: 7.1.0 2210 | 2211 | string-width@7.1.0: 2212 | dependencies: 2213 | emoji-regex: 10.3.0 2214 | get-east-asian-width: 1.2.0 2215 | strip-ansi: 7.1.0 2216 | 2217 | string-width@7.2.0: 2218 | dependencies: 2219 | emoji-regex: 10.3.0 2220 | get-east-asian-width: 1.2.0 2221 | strip-ansi: 7.1.0 2222 | 2223 | strip-ansi@6.0.1: 2224 | dependencies: 2225 | ansi-regex: 5.0.1 2226 | 2227 | strip-ansi@7.1.0: 2228 | dependencies: 2229 | ansi-regex: 6.0.1 2230 | 2231 | strip-final-newline@2.0.0: {} 2232 | 2233 | strip-json-comments@2.0.1: {} 2234 | 2235 | stubborn-fs@1.2.5: {} 2236 | 2237 | sucrase@3.35.0: 2238 | dependencies: 2239 | '@jridgewell/gen-mapping': 0.3.5 2240 | commander: 4.1.1 2241 | glob: 10.3.15 2242 | lines-and-columns: 1.2.4 2243 | mz: 2.7.0 2244 | pirates: 4.0.6 2245 | ts-interface-checker: 0.1.13 2246 | 2247 | supports-color@7.2.0: 2248 | dependencies: 2249 | has-flag: 4.0.0 2250 | 2251 | supports-hyperlinks@3.1.0: 2252 | dependencies: 2253 | has-flag: 4.0.0 2254 | supports-color: 7.2.0 2255 | 2256 | swr@2.2.5(react@18.3.1): 2257 | dependencies: 2258 | client-only: 0.0.1 2259 | react: 18.3.1 2260 | use-sync-external-store: 1.2.2(react@18.3.1) 2261 | 2262 | thenify-all@1.6.0: 2263 | dependencies: 2264 | thenify: 3.3.1 2265 | 2266 | thenify@3.3.1: 2267 | dependencies: 2268 | any-promise: 1.3.0 2269 | 2270 | throttleit@2.1.0: {} 2271 | 2272 | to-regex-range@5.0.1: 2273 | dependencies: 2274 | is-number: 7.0.0 2275 | 2276 | tr46@1.0.1: 2277 | dependencies: 2278 | punycode: 2.3.1 2279 | 2280 | tree-kill@1.2.2: {} 2281 | 2282 | ts-interface-checker@0.1.13: {} 2283 | 2284 | tsup@8.0.2(postcss@8.4.38)(typescript@5.6.3): 2285 | dependencies: 2286 | bundle-require: 4.1.0(esbuild@0.19.12) 2287 | cac: 6.7.14 2288 | chokidar: 3.6.0 2289 | debug: 4.3.4 2290 | esbuild: 0.19.12 2291 | execa: 5.1.1 2292 | globby: 11.1.0 2293 | joycon: 3.1.1 2294 | postcss-load-config: 4.0.2(postcss@8.4.38) 2295 | resolve-from: 5.0.0 2296 | rollup: 4.17.2 2297 | source-map: 0.8.0-beta.0 2298 | sucrase: 3.35.0 2299 | tree-kill: 1.2.2 2300 | optionalDependencies: 2301 | postcss: 8.4.38 2302 | typescript: 5.6.3 2303 | transitivePeerDependencies: 2304 | - supports-color 2305 | - ts-node 2306 | 2307 | type-fest@2.19.0: {} 2308 | 2309 | type-fest@4.27.0: {} 2310 | 2311 | typescript@5.6.3: {} 2312 | 2313 | undici-types@6.19.8: {} 2314 | 2315 | unicode-emoji-modifier-base@1.0.0: {} 2316 | 2317 | update-notifier@7.3.1: 2318 | dependencies: 2319 | boxen: 8.0.1 2320 | chalk: 5.3.0 2321 | configstore: 7.0.0 2322 | is-in-ci: 1.0.0 2323 | is-installed-globally: 1.0.0 2324 | is-npm: 6.0.0 2325 | latest-version: 9.0.0 2326 | pupa: 3.1.0 2327 | semver: 7.6.3 2328 | xdg-basedir: 5.1.0 2329 | 2330 | use-sync-external-store@1.2.2(react@18.3.1): 2331 | dependencies: 2332 | react: 18.3.1 2333 | 2334 | webidl-conversions@4.0.2: {} 2335 | 2336 | whatwg-url@7.1.0: 2337 | dependencies: 2338 | lodash.sortby: 4.7.0 2339 | tr46: 1.0.1 2340 | webidl-conversions: 4.0.2 2341 | 2342 | when-exit@2.1.3: {} 2343 | 2344 | which@2.0.2: 2345 | dependencies: 2346 | isexe: 2.0.0 2347 | 2348 | widest-line@4.0.1: 2349 | dependencies: 2350 | string-width: 5.1.2 2351 | 2352 | widest-line@5.0.0: 2353 | dependencies: 2354 | string-width: 7.2.0 2355 | 2356 | wrap-ansi@7.0.0: 2357 | dependencies: 2358 | ansi-styles: 4.3.0 2359 | string-width: 4.2.3 2360 | strip-ansi: 6.0.1 2361 | 2362 | wrap-ansi@8.1.0: 2363 | dependencies: 2364 | ansi-styles: 6.2.1 2365 | string-width: 5.1.2 2366 | strip-ansi: 7.1.0 2367 | 2368 | wrap-ansi@9.0.0: 2369 | dependencies: 2370 | ansi-styles: 6.2.1 2371 | string-width: 7.1.0 2372 | strip-ansi: 7.1.0 2373 | 2374 | xdg-basedir@5.1.0: {} 2375 | 2376 | y18n@5.0.8: {} 2377 | 2378 | yaml@2.4.2: {} 2379 | 2380 | yargs-parser@20.2.9: {} 2381 | 2382 | yargs@16.2.0: 2383 | dependencies: 2384 | cliui: 7.0.4 2385 | escalade: 3.1.2 2386 | get-caller-file: 2.0.5 2387 | require-directory: 2.1.1 2388 | string-width: 4.2.3 2389 | y18n: 5.0.8 2390 | yargs-parser: 20.2.9 2391 | 2392 | zod-to-json-schema@3.23.5(zod@3.23.8): 2393 | dependencies: 2394 | zod: 3.23.8 2395 | 2396 | zod@3.23.8: {} 2397 | -------------------------------------------------------------------------------- /scripts/gen-config-schema.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs" 2 | import { ConfigSchema } from "../src/config" 3 | import { zodToJsonSchema } from "zod-to-json-schema" 4 | 5 | const jsonSchema = zodToJsonSchema(ConfigSchema, "Config") 6 | 7 | fs.writeFileSync("schema.json", JSON.stringify(jsonSchema, null, 2)) 8 | -------------------------------------------------------------------------------- /shell-ask.toml: -------------------------------------------------------------------------------- 1 | #:schema ./schema.json 2 | 3 | default_model = "gpt-4o-mini" 4 | 5 | [[commands]] 6 | command = "gen-config-md" 7 | description = "Generate config.md docs from Config type" 8 | prompt = "Given code:\n```ts\n{{code}}\n```\nUpdate the documentation for the Config type in the code if changes are required, return the markdown only if changes are made, or NONE if unchanged, existing documentation:\n{{config}}" 9 | [commands.variables] 10 | code = "cat src/config.ts" 11 | config = "cat docs/config.md" 12 | -------------------------------------------------------------------------------- /src/ai-command.ts: -------------------------------------------------------------------------------- 1 | import { AICommand, AICommandVariable, Config } from "./config" 2 | import { stdin } from "./tty" 3 | import prompts from "prompts" 4 | import { builtinCommands } from "./builtin-commands" 5 | import { runCommand } from "./utils" 6 | 7 | export function getAllCommands(config: Config) { 8 | const commands: Record = {} 9 | 10 | for (const command of builtinCommands) { 11 | commands[command.command] = command 12 | } 13 | 14 | if (config.commands) { 15 | for (const command of config.commands) { 16 | commands[command.command] = command 17 | } 18 | } 19 | 20 | return [...Object.values(commands)] 21 | } 22 | 23 | export async function getPrompt( 24 | prompt: string, 25 | variables: Record | undefined, 26 | flags: Record 27 | ) { 28 | const data: Record = {} 29 | 30 | if (variables) { 31 | for (const key in variables) { 32 | const command = variables[key] 33 | if (typeof command === "string") { 34 | const result = await runCommand(command) 35 | data[key] = result 36 | } else if (command.type === "input" || command.type === "select") { 37 | if (typeof flags[key] === "string") { 38 | data[key] = flags[key] 39 | continue 40 | } 41 | 42 | const result = await prompts([ 43 | command.type === "select" 44 | ? { 45 | name: "answer", 46 | message: command.message, 47 | type: "select", 48 | choices: command.choices, 49 | stdin, 50 | } 51 | : { 52 | name: "answer", 53 | message: command.message, 54 | type: "text", 55 | stdin, 56 | }, 57 | ]) 58 | 59 | if (typeof result.answer !== "string") { 60 | throw new Error("must be a string") 61 | } 62 | 63 | data[key] = result.answer 64 | } 65 | } 66 | } 67 | 68 | return prompt.replace(/{{(.*?)}}/g, (_, key) => data[key]) 69 | } 70 | -------------------------------------------------------------------------------- /src/ai-sdk.ts: -------------------------------------------------------------------------------- 1 | import process from "node:process" 2 | import { createOpenAI } from "@ai-sdk/openai" 3 | import { createOllama } from "ollama-ai-provider" 4 | import { Config } from "./config" 5 | import { createAnthropic } from "@ai-sdk/anthropic" 6 | import { createGoogleGenerativeAI } from "@ai-sdk/google" 7 | import { CliError } from "./error" 8 | import { copilot } from "./copilot" 9 | import { getOllamaBaseURL } from "./ollama" 10 | 11 | const missingConfigError = ( 12 | type: "openai" | "anthropic" | "gemini" | "groq" 13 | ) => { 14 | return new CliError( 15 | `missing ${type} api key, check out the config docs for more: https://github.com/egoist/shell-ask/blob/main/docs/config.md` 16 | ) 17 | } 18 | 19 | export const getSDKModel = async (modelId: string, config: Config) => { 20 | if (modelId.startsWith("ollama-")) { 21 | return createOllama({ 22 | baseURL: getOllamaBaseURL(config), 23 | }) 24 | } 25 | 26 | if (modelId.startsWith("claude-")) { 27 | const apiKey = config.anthropic_api_key || process.env.ANTHROPIC_API_KEY 28 | if (!apiKey) { 29 | throw missingConfigError("anthropic") 30 | } 31 | 32 | return createAnthropic({ 33 | apiKey, 34 | }) 35 | } 36 | 37 | if (modelId.startsWith("gemini-")) { 38 | const apiKey = config.gemini_api_key || process.env.GEMINI_API_KEY 39 | if (!apiKey) { 40 | throw missingConfigError("gemini") 41 | } 42 | const apiUrl = 43 | config.gemini_api_url || 44 | process.env.GEMINI_API_URL || 45 | "https://generativelanguage.googleapis.com/v1beta/" 46 | return createGoogleGenerativeAI({ 47 | apiKey, 48 | baseURL: apiUrl, 49 | }) 50 | } 51 | 52 | if (modelId.startsWith("groq-")) { 53 | const apiKey = config.groq_api_key || process.env.GROQ_API_KEY 54 | if (!apiKey) { 55 | throw missingConfigError("groq") 56 | } 57 | 58 | const apiUrl = 59 | config.groq_api_url || 60 | process.env.GROQ_API_URL || 61 | "https://api.groq.com/openai/v1" 62 | 63 | return createOpenAI({ 64 | apiKey, 65 | baseURL: apiUrl, 66 | }) 67 | } 68 | 69 | if (modelId.startsWith("copilot-")) { 70 | const apiKey = await getCopilotApiKey() 71 | return createOpenAI({ 72 | apiKey, 73 | baseURL: `https://api.githubcopilot.com`, 74 | headers: { 75 | "editor-version": "vscode/0.1.0", 76 | "copilot-integration-id": "vscode-chat", 77 | }, 78 | }) 79 | } 80 | 81 | const apiKey = config.openai_api_key || process.env.OPENAI_API_KEY 82 | if (!apiKey) { 83 | throw missingConfigError("openai") 84 | } 85 | 86 | const apiUrl = config.openai_api_url || process.env.OPENAI_API_URL 87 | 88 | return createOpenAI({ 89 | apiKey, 90 | baseURL: apiUrl, 91 | }) 92 | } 93 | 94 | export const getCopilotApiKey = async () => { 95 | const authToken = process.env.COPILOT_AUTH_TOKEN || copilot.loadAuthToken() 96 | 97 | if (!authToken) { 98 | throw new CliError( 99 | `failed to get auth token, please login with 'ask copilot-login' first` 100 | ) 101 | } 102 | 103 | const result = await copilot.getCopilotToken(authToken) 104 | return result.token 105 | } 106 | -------------------------------------------------------------------------------- /src/ask.ts: -------------------------------------------------------------------------------- 1 | import process from "node:process" 2 | import { CoreMessage, generateText, streamText } from "ai" 3 | import { loadFiles, notEmpty } from "./utils" 4 | import { loadConfig } from "./config" 5 | import { 6 | MODEL_PREFIXES, 7 | getAllModels, 8 | getCheapModelId, 9 | toProviderModelId, 10 | } from "./models" 11 | import cliPrompts from "prompts" 12 | import { isOutputTTY, stdin } from "./tty" 13 | import { CliError } from "./error" 14 | import { getSDKModel } from "./ai-sdk" 15 | import { debug } from "./debug" 16 | import { fetchUrl } from "./fetch-url" 17 | import { getSearchResult } from "./search" 18 | import logUpdate from "log-update" 19 | import { renderMarkdown } from "./markdown" 20 | import { loadChat, saveChat } from "./chat" 21 | 22 | export async function ask( 23 | prompt: string | undefined, 24 | options: { 25 | model?: string | boolean 26 | command?: boolean 27 | pipeInput?: string 28 | files?: string | string[] 29 | type?: string 30 | url?: string | string[] 31 | search?: boolean 32 | stream?: boolean 33 | reply?: boolean 34 | breakdown?: boolean 35 | } 36 | ) { 37 | if (!prompt) { 38 | throw new CliError("please provide a prompt") 39 | } 40 | 41 | const chat = options.reply ? loadChat() : null 42 | const config = loadConfig() 43 | let modelId = 44 | options.model === true 45 | ? "select" 46 | : options.model || 47 | chat?.options.realModelId || 48 | config.default_model || 49 | "gpt-4o-mini" 50 | 51 | const models = await getAllModels( 52 | modelId === "select" 53 | ? true 54 | : modelId === "ollama" || modelId.startsWith("ollama-") 55 | ? "required" 56 | : false 57 | ) 58 | 59 | if ( 60 | modelId === "select" || 61 | modelId === "ollama" || 62 | (typeof modelId === "string" && MODEL_PREFIXES.includes(modelId)) 63 | ) { 64 | if (process.platform === "win32" && !process.stdin.isTTY) { 65 | throw new CliError( 66 | "Interactively selecting a model is not supported on Windows when using piped input. Consider directly specifying the model id instead, for example: `-m gpt-4o`" 67 | ) 68 | } 69 | 70 | const result = await cliPrompts([ 71 | { 72 | stdin, 73 | 74 | type: "autocomplete", 75 | 76 | message: "Select a model", 77 | 78 | name: "modelId", 79 | 80 | async suggest(input, choices) { 81 | return choices.filter((choice) => { 82 | return choice.title.toLowerCase().includes(input) 83 | }) 84 | }, 85 | 86 | choices: models 87 | .filter( 88 | (item) => modelId === "select" || item.id.startsWith(`${modelId}-`) 89 | ) 90 | .map((item) => { 91 | return { 92 | value: item.id, 93 | title: item.id, 94 | } 95 | }), 96 | }, 97 | ]) 98 | 99 | if (typeof result.modelId !== "string" || !result.modelId) { 100 | throw new CliError("no model selected") 101 | } 102 | 103 | modelId = result.modelId 104 | } 105 | 106 | debug(`Selected modelID: ${modelId}`) 107 | 108 | const matchedModel = models.find( 109 | (m) => m.id === modelId || m.realId === modelId 110 | ) 111 | if (!matchedModel) { 112 | throw new CliError( 113 | `model not found: ${modelId}\n\navailable models: ${models 114 | .map((m) => m.id) 115 | .join(", ")}` 116 | ) 117 | } 118 | const realModelId = matchedModel.realId || modelId 119 | const model = await getSDKModel(modelId, config) 120 | 121 | debug("model", realModelId) 122 | 123 | const isOpenAIReasoning = /-o\d+/.test(matchedModel.id) 124 | const isCopilotOpenAIReasoning = /copilot-o\d+/.test(matchedModel.id) 125 | const isCopilotOpenAIO1 = /copilot-o1/.test(matchedModel.id) 126 | 127 | const files = await loadFiles(options.files || []) 128 | const remoteContents = await fetchUrl(options.url || []) 129 | const context = [ 130 | // inhert prev chat 131 | !chat && 132 | isOpenAIReasoning && 133 | (isCopilotOpenAIReasoning 134 | ? // copilot openai doesn't support the special syntax, so this is a workaround 135 | `Using markdown formatting if necessary` 136 | : // special syntax to re-enable markdown formatting 137 | `Formatting re-enabled`), 138 | !chat && `Context:`, 139 | !chat && 140 | `platform: ${process.platform}\nshell: ${process.env.SHELL || "unknown"}`, 141 | 142 | options.pipeInput && [`stdin:`, "```", options.pipeInput, "```"].join("\n"), 143 | 144 | files.length > 0 && "files:", 145 | ...files.map((file) => `${file.name}:\n"""\n${file.content}\n"""`), 146 | 147 | remoteContents.length > 0 && "remote contents:", 148 | ...remoteContents.map( 149 | (content) => `${content.url}:\n"""\n${content.content}\n"""` 150 | ), 151 | ] 152 | .filter(notEmpty) 153 | .join("\n") 154 | 155 | let searchResult: string | undefined 156 | 157 | if (options.search) { 158 | const searchModel = model(getCheapModelId(realModelId)) 159 | searchResult = await getSearchResult(searchModel, { context, prompt }) 160 | } 161 | 162 | const messages: CoreMessage[] = [] 163 | 164 | const prevSystemMessage = chat?.messages[0] 165 | 166 | messages.push({ 167 | // using system message with copilot openai reasoning models results in Bad Request 168 | role: isCopilotOpenAIReasoning ? "user" : "system", 169 | content: 170 | (prevSystemMessage?.content ? `${prevSystemMessage.content}\n` : "") + 171 | [context, searchResult && "search result:", searchResult] 172 | .filter(notEmpty) 173 | .join("\n"), 174 | }) 175 | 176 | if (chat) { 177 | messages.push(...chat.messages.slice(1)) 178 | } 179 | 180 | messages.push({ 181 | role: "user", 182 | content: [ 183 | prompt, 184 | options.command 185 | ? `Return the command only without any other text or markdown code fences.` 186 | : ``, 187 | options.breakdown 188 | ? `You must return in the following format:\n...command\n\n...command breakdown` 189 | : ``, 190 | options.type 191 | ? [ 192 | `The result must match the following type definition:`, 193 | "```typescript", 194 | options.type, 195 | "```", 196 | "Return the result only without any other text or markdown code fences.", 197 | ].join("\n") 198 | : ``, 199 | ] 200 | .filter(notEmpty) 201 | .join("\n"), 202 | }) 203 | 204 | debug("messages", messages) 205 | 206 | if (isOutputTTY) { 207 | logUpdate(`Waiting for ${realModelId} to respond...`) 208 | } 209 | 210 | const temperature = 0 211 | const providerModelId = toProviderModelId(realModelId) 212 | 213 | // Copilot O1 doesn't support streaming yet 214 | if (options.stream === false || isCopilotOpenAIO1) { 215 | const result = await generateText({ 216 | model: model(providerModelId), 217 | messages, 218 | temperature, 219 | }) 220 | 221 | logUpdate.clear() 222 | logUpdate(renderMarkdown(result.text).trim()) 223 | logUpdate.done() 224 | process.exit() 225 | } 226 | 227 | const { textStream } = streamText({ 228 | model: model(providerModelId), 229 | messages, 230 | temperature, 231 | }) 232 | 233 | logUpdate.clear() 234 | 235 | let output = "" 236 | for await (const textPart of textStream) { 237 | output += textPart 238 | process.stdout.write(textPart) 239 | } 240 | process.stdout.write("\n") 241 | 242 | saveChat({ 243 | messages: [...messages, { role: "assistant", content: output }], 244 | options: { realModelId, temperature }, 245 | }) 246 | 247 | logUpdate.done() 248 | process.exit() 249 | } 250 | -------------------------------------------------------------------------------- /src/builtin-commands.ts: -------------------------------------------------------------------------------- 1 | import { AICommand } from "./config" 2 | 3 | export const builtinCommands: AICommand[] = [ 4 | { 5 | command: "cm", 6 | description: "Generate git commit message based on git diff output", 7 | require_stdin: true, 8 | prompt: 9 | "Generate git commit message following Conventional Commits specification based on the git diff output in stdin\nYou must return a commit message only. Try to capture the key changes in the title in under 72 characters. For changes that are not captured in the title and are important for the developer to know, add the details in the body as a list. Do not add details if the title is already clear. Do not output any other text or quotes.", 10 | }, 11 | ] 12 | -------------------------------------------------------------------------------- /src/chat.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs" 2 | import { CoreMessage } from "ai" 3 | import os from "os" 4 | import path from "path" 5 | 6 | const chatFilePath = path.join(os.tmpdir(), "shell-ask-chat.json") 7 | 8 | type Chat = { 9 | messages: CoreMessage[] 10 | options: { temperature?: number; realModelId: string } 11 | } 12 | 13 | export function saveChat(chat: Chat) { 14 | fs.writeFileSync(chatFilePath, JSON.stringify(chat)) 15 | } 16 | 17 | export function loadChat() { 18 | if (!fs.existsSync(chatFilePath)) return null 19 | 20 | const chat = JSON.parse(fs.readFileSync(chatFilePath, "utf-8")) as Chat 21 | return chat 22 | } 23 | -------------------------------------------------------------------------------- /src/cli.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import process from "node:process" 3 | import { cac, Command as CliCommand } from "cac" 4 | import { bold, green, underline } from "colorette" 5 | import { getAllModels } from "./models" 6 | import updateNotifier from "update-notifier" 7 | import { ask } from "./ask" 8 | import { getAllCommands, getPrompt } from "./ai-command" 9 | import { readPipeInput } from "./tty" 10 | import { CliError } from "./error" 11 | import { loadConfig } from "./config" 12 | import { copilot } from "./copilot" 13 | import { APICallError } from "ai" 14 | 15 | if (typeof PKG_NAME === "string" && typeof PKG_VERSION === "string") { 16 | updateNotifier({ 17 | pkg: { name: PKG_NAME, version: PKG_VERSION }, 18 | shouldNotifyInNpmScript: false, 19 | }).notify({ 20 | isGlobal: true, 21 | }) 22 | } 23 | 24 | function applyCommonFlags(command: CliCommand) { 25 | command.option("-c, --command", "Ask LLM to return a command only") 26 | command.option( 27 | "-b, --breakdown", 28 | "Ask LLM to return a command and the breakdown of this command" 29 | ) 30 | command.option( 31 | "-m, --model [model]", 32 | "Choose the LLM to use, omit value to select interactively" 33 | ) 34 | command.option("--files ", "Adding files to model context") 35 | command.option( 36 | "-t, --type ", 37 | "Define the shape of the response in TypeScript" 38 | ) 39 | command.option("-u,--url ", "Fetch URL content as context") 40 | command.option("-s, --search", "Enable web search") 41 | command.option("--no-stream", "Disable streaming output") 42 | command.option("-r, --reply", "Reply to previous conversation") 43 | return command 44 | } 45 | 46 | async function main() { 47 | const cli = cac("ask") 48 | const config = loadConfig() 49 | 50 | const root = cli.command("[...prompt]", "Run the prompt") 51 | 52 | applyCommonFlags(root) 53 | 54 | root.action(async (prompt, flags) => { 55 | const pipeInput = await readPipeInput() 56 | 57 | await ask(prompt.join(" "), { ...flags, pipeInput }) 58 | }) 59 | 60 | cli 61 | .command("list", "List available models") 62 | .alias("ls") 63 | .action(async () => { 64 | const models = await getAllModels(true) 65 | 66 | for (const model of models) { 67 | console.log(model.id) 68 | } 69 | }) 70 | 71 | cli.command("copilot-login").action(async () => { 72 | const deviceCodeResult = await copilot.requestDeviceCode() 73 | 74 | console.log("First copy your one-time code:\n") 75 | console.log(bold(green(deviceCodeResult.user_code))) 76 | console.log() 77 | console.log( 78 | "Then visit this GitHub URL to authorize:", 79 | underline(deviceCodeResult.verification_uri) 80 | ) 81 | 82 | console.log() 83 | console.log("Waiting for authentication...") 84 | console.log(`Press ${bold("Enter")} to check the authentication status...`) 85 | 86 | const checkAuth = async () => { 87 | const authResult = await copilot 88 | .verifyAuth(deviceCodeResult) 89 | .catch(() => null) 90 | if (authResult) { 91 | console.log("Authentication successful!") 92 | copilot.saveAuthToken(authResult.access_token) 93 | process.exit(0) 94 | } else { 95 | console.log("Authentication failed. Please try again.") 96 | } 97 | } 98 | 99 | // press Enter key to check auth 100 | process.stdin.on("data", (data) => { 101 | const str = data.toString() 102 | if (str === "\n" || str === "\r\n") { 103 | checkAuth() 104 | } 105 | }) 106 | }) 107 | 108 | cli.command("copilot-logout").action(() => { 109 | copilot.removeAuthToken() 110 | console.log("Copilot auth token removed") 111 | }) 112 | 113 | const allCommands = getAllCommands(config) 114 | for (const command of allCommands) { 115 | const c = cli.command(command.command, command.description) 116 | 117 | applyCommonFlags(c) 118 | 119 | if (command.example) { 120 | c.example(command.example) 121 | } 122 | 123 | if (command.variables) { 124 | for (const variableName in command.variables) { 125 | const value = command.variables[variableName] 126 | if (typeof value === "string") continue 127 | 128 | c.option(`--${variableName} <${variableName}>`, value.message) 129 | } 130 | } 131 | 132 | c.action(async (flags) => { 133 | const { 134 | model, 135 | files, 136 | type, 137 | url, 138 | search, 139 | stream, 140 | reply, 141 | breakdown, 142 | ...localFlags 143 | } = flags 144 | const pipeInput = await readPipeInput() 145 | 146 | if (command.require_stdin && !pipeInput) { 147 | throw new CliError( 148 | `this command requires piping input from another program to Shell Ask, e.g. \`echo 'input' | ask ${command.command}\`` 149 | ) 150 | } 151 | 152 | const prompt = await getPrompt( 153 | command.prompt, 154 | command.variables, 155 | localFlags 156 | ) 157 | await ask(prompt, { 158 | model, 159 | pipeInput, 160 | files, 161 | type, 162 | url, 163 | search, 164 | stream, 165 | reply, 166 | breakdown, 167 | }) 168 | }) 169 | } 170 | 171 | cli.version(typeof PKG_VERSION === "string" ? PKG_VERSION : "0.0.0") 172 | cli.help() 173 | 174 | try { 175 | cli.parse(process.argv, { run: false }) 176 | await cli.runMatchedCommand() 177 | } catch (error) { 178 | process.exitCode = 1 179 | if (error instanceof CliError) { 180 | console.error(error.message) 181 | } else if (error instanceof APICallError) { 182 | console.log(error.responseBody) 183 | } else { 184 | throw error 185 | } 186 | } 187 | } 188 | 189 | main() 190 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import JoyCon from "joycon" 2 | import fs from "node:fs" 3 | import os from "node:os" 4 | import path from "node:path" 5 | import toml from "smol-toml" 6 | import { z } from "zod" 7 | 8 | export const configDirPath = path.join(os.homedir(), ".config", "shell-ask") 9 | 10 | const AICommandVariableSchema = z.union([ 11 | z.string().describe("a shell command to run"), 12 | z 13 | .object({ 14 | type: z.literal("input"), 15 | message: z.string(), 16 | }) 17 | .describe("get text input from the user"), 18 | z 19 | .object({ 20 | type: z.literal("select"), 21 | message: z.string(), 22 | choices: z.array( 23 | z.object({ 24 | value: z.string(), 25 | title: z.string(), 26 | }) 27 | ), 28 | }) 29 | .describe("get a choice from the user"), 30 | ]) 31 | 32 | export type AICommandVariable = z.infer 33 | 34 | const AICommandSchema = z.object({ 35 | command: z.string().describe("the cli command"), 36 | example: z.string().optional().describe("example to show in cli help"), 37 | description: z 38 | .string() 39 | .optional() 40 | .describe("description to show in cli help"), 41 | variables: z.record(AICommandVariableSchema).optional(), 42 | prompt: z.string().describe("the prompt to send to the model"), 43 | require_stdin: z 44 | .boolean() 45 | .optional() 46 | .describe("Require piping output from another program to Shell Ask"), 47 | }) 48 | 49 | export type AICommand = z.infer 50 | 51 | export const ConfigSchema = z.object({ 52 | default_model: z.string().optional(), 53 | openai_api_key: z 54 | .string() 55 | .optional() 56 | .describe('Default to the "OPENAI_API_KEY" environment variable'), 57 | openai_api_url: z 58 | .string() 59 | .optional() 60 | .describe('Default to the "OPENAI_API_URL" environment variable'), 61 | gemini_api_key: z 62 | .string() 63 | .optional() 64 | .describe('Default to the "GEMINI_API_KEY" environment variable'), 65 | gemini_api_url: z 66 | .string() 67 | .optional() 68 | .describe('Default to the "GEMINI_API_URL" environment variable'), 69 | anthropic_api_key: z 70 | .string() 71 | .optional() 72 | .describe('Default to the "ANTHROPIC_API_KEY" environment variable'), 73 | groq_api_key: z 74 | .string() 75 | .optional() 76 | .describe('Default to the "GROQ_API_KEY" environment variable'), 77 | groq_api_url: z 78 | .string() 79 | .optional() 80 | .describe('Default to the "GROQ_API_URL" environment variable'), 81 | ollama_host: z 82 | .string() 83 | .optional() 84 | .describe('Default to the "OLLAMA_HOST" environment variable'), 85 | commands: z.array(AICommandSchema).optional(), 86 | }) 87 | 88 | export type Config = z.infer 89 | 90 | export function loadConfig(): Config { 91 | const joycon = new JoyCon() 92 | 93 | joycon.addLoader({ 94 | test: /\.toml$/, 95 | loadSync: (filepath) => { 96 | const content = fs.readFileSync(filepath, "utf-8") 97 | return toml.parse(content) 98 | }, 99 | }) 100 | 101 | const globalConfig = joycon.loadSync( 102 | ["config.json", "config.toml"], 103 | configDirPath, 104 | path.dirname(configDirPath) 105 | ).data as Config | undefined 106 | 107 | const localConfig = joycon.loadSync( 108 | ["shell-ask.json", "shell-ask.toml"], 109 | process.cwd(), 110 | path.dirname(process.cwd()) 111 | ).data as Config | undefined 112 | 113 | return { 114 | ...globalConfig, 115 | ...localConfig, 116 | commands: [ 117 | ...(globalConfig?.commands || []), 118 | ...(localConfig?.commands || []), 119 | ], 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /src/configure.ts: -------------------------------------------------------------------------------- 1 | import prompts from "prompts" 2 | import { loadConfig } from "./config" 3 | 4 | export async function configure() { 5 | const config = loadConfig() 6 | 7 | const result = await prompts([ 8 | { 9 | type: "text", 10 | name: "default_model", 11 | message: "Default model (e.g. gpt-4o-mini)", 12 | }, 13 | { 14 | type: "password", 15 | name: "openai_api_key", 16 | message: "OpenAI API Key", 17 | }, 18 | { 19 | type: "text", 20 | name: "openai_api_url", 21 | message: "OpenAI API URL", 22 | }, 23 | { 24 | type: "password", 25 | name: "anthropic_api_key", 26 | message: "Anthropic API Key", 27 | }, 28 | { 29 | type: "password", 30 | name: "gemini_api_key", 31 | message: "Gemini API Key", 32 | }, 33 | ]) 34 | 35 | const newConfig = { ...config } 36 | 37 | if (typeof result.default_model === "string" && result.default_model) { 38 | newConfig.default_model = result.default_model 39 | } 40 | 41 | if (typeof result.openai_api_key === "string" && result.openai_api_key) { 42 | newConfig.openai_api_key = result.openai_api_key 43 | } 44 | 45 | if (typeof result.openai_api_url === "string" && result.openai_api_url) { 46 | newConfig.openai_api_url = result.openai_api_url 47 | } 48 | 49 | if ( 50 | typeof result.anthropic_api_key === "string" && 51 | result.anthropic_api_key 52 | ) { 53 | newConfig.anthropic_api_key = result.anthropic_api_key 54 | } 55 | 56 | if (typeof result.gemini_api_key === "string" && result.gemini_api_key) { 57 | newConfig.gemini_api_key = result.gemini_api_key 58 | } 59 | 60 | saveConfig(newConfig) 61 | } 62 | -------------------------------------------------------------------------------- /src/copilot.ts: -------------------------------------------------------------------------------- 1 | import fs from "node:fs" 2 | import path from "node:path" 3 | import { z } from "zod" 4 | import { configDirPath } from "./config" 5 | 6 | const DeviceCodeResponseSchema = z.object({ 7 | device_code: z.string(), 8 | user_code: z.string(), 9 | verification_uri: z.string(), 10 | interval: z.number(), 11 | }) 12 | 13 | type DeviceCodeResponse = z.infer 14 | 15 | const CopilotTokenResponseSchema = z.object({ 16 | token: z.string(), 17 | expires_at: z.number(), 18 | }) 19 | 20 | type CopilotTokenResponse = z.infer 21 | 22 | const clientId = "Iv1.b507a08c87ecfe98" 23 | 24 | class Copilot { 25 | copilotTokenResponseCache?: CopilotTokenResponse 26 | 27 | async requestDeviceCode() { 28 | const res = await fetch( 29 | `https://github.com/login/device/code?${new URLSearchParams({ 30 | client_id: clientId, 31 | })}`, 32 | { 33 | method: "POST", 34 | headers: { 35 | accept: "application/json", 36 | }, 37 | } 38 | ) 39 | 40 | if (!res.ok) { 41 | throw new Error(`Failed to request device code: ${await res.text()}`) 42 | } 43 | 44 | const json = await res.json() 45 | return DeviceCodeResponseSchema.parse(json) 46 | } 47 | 48 | async verifyAuth({ device_code }: DeviceCodeResponse) { 49 | const res = await fetch( 50 | `https://github.com/login/oauth/access_token?${new URLSearchParams({ 51 | client_id: clientId, 52 | device_code, 53 | grant_type: "urn:ietf:params:oauth:grant-type:device_code", 54 | })}`, 55 | { 56 | method: "POST", 57 | headers: { 58 | accept: "application/json", 59 | }, 60 | } 61 | ) 62 | 63 | if (!res.ok) return null 64 | 65 | const json = await res.json() 66 | return z.object({ access_token: z.string() }).parse(json) 67 | } 68 | 69 | async getCopilotToken(authToken: string) { 70 | if ( 71 | this.copilotTokenResponseCache && 72 | Date.now() < this.copilotTokenResponseCache.expires_at * 1000 73 | ) { 74 | return this.copilotTokenResponseCache 75 | } 76 | 77 | const res = await fetch( 78 | `https://api.github.com/copilot_internal/v2/token`, 79 | { 80 | headers: { 81 | authorization: `Bearer ${authToken}`, 82 | accept: "application/json", 83 | }, 84 | } 85 | ) 86 | 87 | if (!res.ok) { 88 | throw new Error(`Failed to get token for chat: ${await res.text()}`) 89 | } 90 | 91 | const json = await res.json() 92 | const result = CopilotTokenResponseSchema.parse(json) 93 | 94 | this.copilotTokenResponseCache = result 95 | return result 96 | } 97 | 98 | saveAuthToken(token: string) { 99 | fs.mkdirSync(configDirPath, { recursive: true }) 100 | fs.writeFileSync(path.join(configDirPath, ".copilot-auth-token"), token) 101 | } 102 | 103 | loadAuthToken() { 104 | try { 105 | return fs.readFileSync( 106 | path.join(configDirPath, ".copilot-auth-token"), 107 | "utf-8" 108 | ) 109 | } catch { 110 | return null 111 | } 112 | } 113 | 114 | removeAuthToken() { 115 | try { 116 | fs.unlinkSync(path.join(configDirPath, ".copilot-auth-token")) 117 | } catch {} 118 | } 119 | } 120 | 121 | export const copilot = new Copilot() 122 | -------------------------------------------------------------------------------- /src/debug.ts: -------------------------------------------------------------------------------- 1 | import process from "node:process" 2 | 3 | export const debug = (...args: any[]) => { 4 | if (process.env.DEBUG !== "shell-ask" && process.env.DEBUG !== "*") return 5 | console.log(...args) 6 | } 7 | -------------------------------------------------------------------------------- /src/error.ts: -------------------------------------------------------------------------------- 1 | export class CliError extends Error {} 2 | -------------------------------------------------------------------------------- /src/fetch-url.ts: -------------------------------------------------------------------------------- 1 | export const fetchUrl = async (url: string | string[]) => { 2 | const results = await Promise.all( 3 | (Array.isArray(url) ? url : [url]).map(async (u) => { 4 | const response = await fetch(u) 5 | 6 | if (response.ok) return { url: u, content: await response.text() } 7 | 8 | return { 9 | url: u, 10 | content: `Failed to fetch, status code: ${response.status}`, 11 | } 12 | }) 13 | ) 14 | 15 | return results 16 | } 17 | -------------------------------------------------------------------------------- /src/markdown.ts: -------------------------------------------------------------------------------- 1 | import { marked } from "marked" 2 | import { markedTerminal } from "marked-terminal" 3 | 4 | // @ts-expect-error 5 | marked.use(markedTerminal()) 6 | 7 | export function renderMarkdown(input: string) { 8 | return marked.parse(input) as string 9 | } 10 | -------------------------------------------------------------------------------- /src/models.ts: -------------------------------------------------------------------------------- 1 | import { CliError } from "./error" 2 | import { getOllamaModels } from "./ollama" 3 | 4 | export type ModelInfo = { id: string; realId?: string } 5 | 6 | export const MODEL_MAP: { 7 | [prefix: string]: ModelInfo[] 8 | } = { 9 | gpt: [ 10 | { 11 | id: "gpt-3.5-turbo", 12 | }, 13 | { 14 | id: "gpt-4-turbo", 15 | }, 16 | { 17 | id: "gpt-4o", 18 | }, 19 | { 20 | id: "gpt-4o-mini", 21 | }, 22 | ], 23 | openai: [ 24 | { 25 | id: "openai-o1", 26 | }, 27 | { 28 | id: "openai-o1-mini", 29 | }, 30 | { 31 | id: "openai-o1-preview", 32 | }, 33 | { 34 | id: "openai-o3-mini", 35 | }, 36 | ], 37 | claude: [ 38 | { 39 | id: "claude-3-haiku", 40 | realId: "claude-3-haiku-20240307", 41 | }, 42 | { 43 | id: "claude-3-sonnet", 44 | realId: "claude-3-sonnet-20240229", 45 | }, 46 | { 47 | id: "claude-3-opus", 48 | realId: "claude-3-opus-20240229", 49 | }, 50 | { 51 | id: "claude-3.5-haiku", 52 | realId: "claude-3-5-haiku-latest", 53 | }, 54 | { 55 | id: "claude-3.5-sonnet", 56 | realId: "claude-3-5-sonnet-latest", 57 | }, 58 | ], 59 | gemini: [ 60 | { 61 | id: "gemini-2.0-flash", 62 | realId: "gemini-2.0-flash-exp", 63 | }, 64 | { 65 | id: "gemini-2.0-flash-thinking", 66 | realId: "gemini-2.0-flash-thinking-exp", 67 | }, 68 | { 69 | id: "gemini-1.5-pro", 70 | realId: "gemini-1.5-pro-latest", 71 | }, 72 | { 73 | id: "gemini-1.5-flash", 74 | realId: "gemini-1.5-flash-latest", 75 | }, 76 | { 77 | id: "gemini-pro", 78 | }, 79 | ], 80 | groq: [ 81 | { 82 | id: "groq-llama-3.3-70b", 83 | realId: "groq-llama-3.3-70b-versatile", 84 | }, 85 | { 86 | id: "groq-llama-3.1-8b", 87 | realId: "groq-llama-3.1-8b-instant", 88 | }, 89 | { 90 | id: "groq-llama3", 91 | realId: "groq-llama3-70b-8192", 92 | }, 93 | { 94 | id: "groq-llama3-8b", 95 | realId: "groq-llama3-8b-8192", 96 | }, 97 | { 98 | id: "groq-llama3-70b", 99 | realId: "groq-llama3-70b-8192", 100 | }, 101 | { 102 | id: "groq-mixtral-8x7b", 103 | realId: "groq-mixtral-8x7b-32768", 104 | }, 105 | { 106 | id: "groq-gemma", 107 | realId: "groq-gemma-7b-it", 108 | }, 109 | { 110 | id: "groq-gemma-7b", 111 | realId: "groq-gemma-7b-it", 112 | }, 113 | ], 114 | copilot: [ 115 | { 116 | id: "copilot-gpt-4", 117 | realId: "gpt-4", 118 | }, 119 | { 120 | id: "copilot-gpt-4o", 121 | realId: "gpt-4o", 122 | }, 123 | { 124 | id: "copilot-o1-mini", 125 | realId: "o1-mini", 126 | }, 127 | { 128 | id: "copilot-o1-preview", 129 | realId: "o1-preview", 130 | }, 131 | { 132 | id: "copilot-o3-mini", 133 | realId: "o3-mini", 134 | }, 135 | { 136 | id: "copilot-claude-3.5-sonnet", 137 | realId: "claude-3.5-sonnet", 138 | }, 139 | ], 140 | } 141 | 142 | export const MODELS = Object.values(MODEL_MAP).flat() 143 | 144 | export const MODEL_PREFIXES = Object.keys(MODEL_MAP) 145 | 146 | export async function getAllModels(includeOllama?: boolean | "required") { 147 | let models = [...MODELS] 148 | 149 | if (includeOllama) { 150 | const ollamaModels = await getOllamaModels() 151 | if (ollamaModels.length === 0 && includeOllama === "required") { 152 | throw new CliError("no Ollama models available") 153 | } 154 | models = [...models, ...ollamaModels] 155 | } 156 | 157 | return models 158 | } 159 | 160 | export function getCheapModelId(modelId: string) { 161 | if (modelId.startsWith("gpt-")) return "gpt-4o-mini" 162 | 163 | if (modelId.startsWith("claude-")) return "claude-3-haiku-20240307" 164 | 165 | if (modelId.startsWith("gemini-")) return "gemini-pro" 166 | 167 | if (modelId.startsWith("groq-")) return "groq-llama3-8b-8192" 168 | 169 | if (modelId.startsWith("copilot-")) return "copilot-gpt-4o" 170 | 171 | if (modelId.startsWith("openai-")) return "gpt-4o-mini" 172 | 173 | return modelId 174 | } 175 | 176 | export function toProviderModelId(modelId: string) { 177 | if (modelId.startsWith("groq-")) { 178 | return modelId.replace("groq-", "") 179 | } 180 | return modelId 181 | } 182 | -------------------------------------------------------------------------------- /src/ollama.ts: -------------------------------------------------------------------------------- 1 | import { ModelInfo } from "./models" 2 | import { Config, loadConfig } from "./config" 3 | 4 | export function getOllamaBaseURL(config: Config) { 5 | const baseUrl = 6 | config.ollama_host || process.env.OLLAMA_HOST || "http://127.0.0.1:11434" 7 | return `${baseUrl}/api` 8 | } 9 | 10 | export async function getOllamaModels() { 11 | const config = loadConfig() 12 | const baseUrl = getOllamaBaseURL(config) 13 | const models: ModelInfo[] = await fetch(`${baseUrl}/tags`) 14 | .then((res) => { 15 | if (!res.ok) return [] 16 | 17 | return res.json().then((json) => { 18 | return json.models.map((m: { model: string }) => { 19 | return { 20 | id: `ollama-${m.model}`, 21 | realId: m.model.replace(":latest", ""), 22 | } 23 | }) 24 | }) 25 | }) 26 | .catch(() => { 27 | return [] 28 | }) 29 | 30 | return models 31 | } 32 | -------------------------------------------------------------------------------- /src/search.ts: -------------------------------------------------------------------------------- 1 | import { LanguageModel, generateText, tool } from "ai" 2 | import { z } from "zod" 3 | import logUpdate from "log-update" 4 | 5 | const searchTool = tool({ 6 | description: 7 | "Useful for search the web to retrive real-time and accurate information", 8 | parameters: z.object({ 9 | keywords: z 10 | .string() 11 | .describe("the keywords used for search engine to search the web"), 12 | }), 13 | execute: async (input) => { 14 | logUpdate(`Searching the web for "${input.keywords}"...`) 15 | const response = await fetch(`https://s.jina.ai/${input.keywords}`) 16 | return response.text() 17 | }, 18 | }) 19 | 20 | export const getSearchResult = async ( 21 | model: LanguageModel, 22 | { context, prompt }: { context: string; prompt: string } 23 | ) => { 24 | logUpdate("Starting search...") 25 | const result = await generateText({ 26 | model, 27 | messages: [ 28 | { 29 | role: "system", 30 | content: context, 31 | }, 32 | { 33 | role: "user", 34 | content: prompt, 35 | }, 36 | ], 37 | tools: { search: searchTool }, 38 | }) 39 | 40 | logUpdate.clear() 41 | return result.toolResults.find((r) => r.toolName === "search")?.result 42 | } 43 | -------------------------------------------------------------------------------- /src/tty.ts: -------------------------------------------------------------------------------- 1 | import process from "node:process" 2 | import tty from "node:tty" 3 | import fs from "node:fs" 4 | 5 | export const stdin = 6 | process.stdin.isTTY || process.platform === "win32" 7 | ? process.stdin 8 | : new tty.ReadStream(fs.openSync("/dev/tty", "r")) 9 | 10 | export const isOutputTTY = process.stdout.isTTY 11 | 12 | // ifconfig | ask "what is my ip" 13 | export const readPipeInput = async () => { 14 | // not piped input 15 | if (process.stdin.isTTY) return "" 16 | 17 | return new Promise((resolve, reject) => { 18 | let data = "" 19 | 20 | process.stdin.on("data", (chunk) => { 21 | data += chunk 22 | }) 23 | 24 | process.stdin.on("end", () => { 25 | resolve(data) 26 | }) 27 | 28 | process.stdin.on("error", (err) => { 29 | reject(err) 30 | }) 31 | }) 32 | } 33 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import fs from "node:fs" 2 | import glob from "fast-glob" 3 | import { exec } from "node:child_process" 4 | 5 | export function notEmpty( 6 | value: TValue | null | undefined | "" | false 7 | ): value is TValue { 8 | return ( 9 | value !== null && value !== undefined && value !== "" && value !== false 10 | ) 11 | } 12 | 13 | export async function loadFiles( 14 | files: string | string[] 15 | ): Promise<{ name: string; content: string }[]> { 16 | if (!files || files.length === 0) return [] 17 | 18 | const filenames = await glob(files, { onlyFiles: true }) 19 | 20 | return await Promise.all( 21 | filenames.map(async (name) => { 22 | const content = await fs.promises.readFile(name, "utf8") 23 | return { name, content } 24 | }) 25 | ) 26 | } 27 | 28 | export async function runCommand(command: string) { 29 | return new Promise((resolve, reject) => { 30 | const cmd = exec(command) 31 | let output = "" 32 | cmd.stdout?.on("data", (data) => { 33 | output += data 34 | }) 35 | cmd.stderr?.on("data", (data) => { 36 | output += data 37 | }) 38 | cmd.on("close", () => { 39 | resolve(output) 40 | }) 41 | cmd.on("error", (error) => { 42 | reject(error) 43 | }) 44 | }) 45 | } 46 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "esnext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | 27 | /* Modules */ 28 | "module": "commonjs" /* Specify what module code is generated. */, 29 | // "rootDir": "./", /* Specify the root folder within your source files. */ 30 | "moduleResolution": "node10" /* Specify how TypeScript looks up a file from a given module specifier. */, 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ 39 | // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ 40 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ 41 | // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ 42 | // "resolveJsonModule": true, /* Enable importing .json files. */ 43 | // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ 44 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 45 | 46 | /* JavaScript Support */ 47 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 48 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 49 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 50 | 51 | /* Emit */ 52 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 53 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 54 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 55 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 56 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 57 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 58 | // "outDir": "./", /* Specify an output folder for all emitted files. */ 59 | // "removeComments": true, /* Disable emitting comments. */ 60 | // "noEmit": true, /* Disable emitting files from a compilation. */ 61 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 62 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 63 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 64 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 65 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 66 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 67 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 68 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 69 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 70 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 71 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 72 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 73 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 74 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 75 | 76 | /* Interop Constraints */ 77 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 78 | // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ 79 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 80 | "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, 81 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 82 | "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, 83 | 84 | /* Type Checking */ 85 | "strict": true /* Enable all strict type-checking options. */, 86 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 87 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 88 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 89 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 90 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 91 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 92 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 93 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 94 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 95 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 96 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 97 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 98 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 99 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 100 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 101 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 102 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 103 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 104 | 105 | /* Completeness */ 106 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 107 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup" 2 | import fs from "fs" 3 | 4 | const pkg = JSON.parse(fs.readFileSync("./package.json", "utf-8")) 5 | 6 | export default defineConfig({ 7 | entry: ["./src/cli.ts"], 8 | format: "esm", 9 | define: { 10 | PKG_VERSION: JSON.stringify(pkg.version), 11 | PKG_NAME: JSON.stringify(pkg.name), 12 | }, 13 | }) 14 | -------------------------------------------------------------------------------- /types.d.ts: -------------------------------------------------------------------------------- 1 | declare const PKG_NAME: string 2 | declare const PKG_VERSION: string 3 | --------------------------------------------------------------------------------