├── .gitignore ├── lib ├── saveToFile.mjs ├── readFromPipe.mjs ├── parseArgs.mjs ├── parseUserMessage.mjs └── OpenAIChat.mjs ├── test.mjs ├── package.json ├── license ├── readme.md ├── bin └── ai.mjs └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /lib/saveToFile.mjs: -------------------------------------------------------------------------------- 1 | import fs from "fs/promises"; 2 | import path from "path"; 3 | 4 | export async function saveToFile(conversation, chatId) { 5 | const fileName = `conversation-${chatId}.txt`; 6 | return fs 7 | .writeFile( 8 | path.join(process.cwd(), fileName), 9 | JSON.stringify(conversation, null, 2) 10 | ) 11 | .then(() => fileName); 12 | } 13 | -------------------------------------------------------------------------------- /lib/readFromPipe.mjs: -------------------------------------------------------------------------------- 1 | export function readFromPipe() { 2 | return new Promise((resolve) => { 3 | if (process.stdin.isTTY) { 4 | resolve(""); 5 | return; 6 | } 7 | 8 | process.stdin.resume(); 9 | process.stdin.setEncoding("utf8"); 10 | let inputString = ""; 11 | process.stdin.on("data", (chunk) => { 12 | inputString += chunk; 13 | }); 14 | process.stdin.on("end", () => { 15 | resolve(inputString.trim()); 16 | }); 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /test.mjs: -------------------------------------------------------------------------------- 1 | import test from "ava"; 2 | import process from "node:process"; 3 | import { OpenAIChat } from "./lib/OpenAIChat.mjs"; 4 | 5 | test.beforeEach((t) => { 6 | process.env.OPENAI_API_BASE = "1"; 7 | process.env.OPENAI_API_KEY = "2"; 8 | process.env.OPENAI_API_MODEL_NAME = "3"; 9 | }); 10 | 11 | test("api key and url are set correctly", (t) => { 12 | const chat = new OpenAIChat(); 13 | t.is(chat._apiKey, "2"); 14 | t.is( 15 | chat._url, 16 | `1/openai/deployments/3/chat/completions?api-version=2023-03-15-preview` 17 | ); 18 | }); 19 | 20 | test("initial prompt is set correctly", (t) => { 21 | const chat = new OpenAIChat("hello"); 22 | t.is(chat._initialContext.content, "hello"); 23 | }); 24 | 25 | test("response should match", async (t) => { 26 | const chat = new OpenAIChat("hello"); 27 | chat.chat("hi"); 28 | const res = await chat.sendMessage(); 29 | t.is(res.role, "assistant"); 30 | t.is(res.content, "Test response"); 31 | }); 32 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@cyyyu/ai", 3 | "version": "1.3.7", 4 | "description": "A command line program designed to interact with Azure OpenAI API.", 5 | "main": "index.js", 6 | "bin": { 7 | "ai": "./bin/ai.mjs" 8 | }, 9 | "scripts": { 10 | "test": "ava" 11 | }, 12 | "keywords": [ 13 | "ai", 14 | "openai", 15 | "azure", 16 | "gpt", 17 | "chatgpt", 18 | "api", 19 | "command-line", 20 | "cli" 21 | ], 22 | "author": "Chuang Yu (https://github.com/cyyyu)", 23 | "license": "MIT", 24 | "dependencies": { 25 | "@dqbd/tiktoken": "^1.0.7", 26 | "ansi-escapes": "^6.2.0", 27 | "blessed": "^0.1.81", 28 | "chalk": "^5.2.0", 29 | "clipboardy": "^3.0.0", 30 | "command-line-args": "^5.2.1", 31 | "marked": "^4.3.0", 32 | "marked-terminal": "^5.1.1", 33 | "node-fetch": "^3.3.1", 34 | "ora": "^6.3.0" 35 | }, 36 | "engines": { 37 | "node": ">=18.0.0" 38 | }, 39 | "devDependencies": { 40 | "ava": "^5.2.0" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Chuang Yu 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. -------------------------------------------------------------------------------- /lib/parseArgs.mjs: -------------------------------------------------------------------------------- 1 | import commandLineArgs from "command-line-args"; 2 | import fs from "fs/promises"; 3 | 4 | export function parseArgs() { 5 | const optionDefinitions = [ 6 | { name: "help", alias: "h", type: Boolean }, 7 | { name: "message", alias: "m", type: String, defaultOption: true }, 8 | { name: "interactive", alias: "i", type: Boolean }, 9 | { name: "rolePrompt", alias: "p", type: String }, 10 | { name: "commandPrompt", alias: "c", type: String }, 11 | { name: "usage", alias: "u", type: Boolean }, 12 | { name: "version", alias: "v", type: Boolean }, 13 | ]; 14 | const options = commandLineArgs(optionDefinitions); 15 | return options; 16 | } 17 | 18 | export function printHelp() { 19 | const log = console.log; 20 | log("Usage: ai [options] [message]"); 21 | log("Options:"); 22 | log(" -h, --help Show this help message."); 23 | log(" -m, --message Message to send to the assistant."); 24 | log(" -i, --interactive Start an interactive chat session."); 25 | log(" -p, --rolePrompt Prompt to use for the assistant."); 26 | log(" -c, --commandPrompt Command prompt to use for the assistant."); 27 | log(" -u, --usage Show usage statistics."); 28 | log(" -v, --version Show the version number."); 29 | } 30 | 31 | export async function printVersion() { 32 | const data = await fs.readFile("./package.json", "utf8"); 33 | const pkg = JSON.parse(data); 34 | console.log(pkg.version); 35 | } 36 | -------------------------------------------------------------------------------- /lib/parseUserMessage.mjs: -------------------------------------------------------------------------------- 1 | /** 2 | * Parse the user message to determine the intent. 3 | * A message can be: 4 | * A command to edit a previous message 5 | * - /e 6 | * 7 | * A command to copy a previous message 8 | * - /c 9 | * 10 | * A command to save the whole conversation to a file 11 | * - /s 12 | * 13 | * A command to load the whole conversation from a file. This will overwrite the current conversation 14 | * - /l 15 | * 16 | * Retry 17 | * - /r 18 | * 19 | * A message 20 | * - 21 | * 22 | * Example: 23 | * - /e1 Hello, world! 24 | * - intent: edit 25 | * - index: 1 26 | * - message: Hello, world! 27 | * - return: { intent: "edit", index: 1, message: "Hello, world!" } 28 | * - Hello, world! 29 | * - intent: message 30 | * - index: null 31 | * - message: Hello, world! 32 | * @param {string} message 33 | * @returns {object} { intent: string, index: number, message: string } 34 | */ 35 | export function parseUserMessage(message = "") { 36 | const commandRegex = /^\/([ecslr])(\d+)?(.*)$/; 37 | const commandMatch = message.match(commandRegex); 38 | if (commandMatch) { 39 | const index = commandMatch[2] ? parseInt(commandMatch[2]) : null; 40 | const message = commandMatch[3] ? commandMatch[3].trim() : ""; 41 | if (commandMatch[1] === "e") { 42 | return { intent: "edit", index, message }; 43 | } else if (commandMatch[1] === "c") { 44 | return { intent: "copy", index, message }; 45 | } else if (commandMatch[1] === "s") { 46 | return { intent: "save", index, message }; 47 | } else if (commandMatch[1] === "l") { 48 | return { intent: "load", index, message }; 49 | } else if (commandMatch[1] === "r") { 50 | return { intent: "retry" }; 51 | } 52 | } else { 53 | return { intent: "message", index: null, message }; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # 🤖 AI 2 | 3 | A command-line tool for interacting with Azure OpenAI chat completion api. 4 | 5 | Example 6 | 7 | ## 📥 Installation 8 | 9 | `$ npm install -g @cyyyu/ai` 10 | 11 | ## 🚀 Usage 12 | 13 | Create a resource and deploy a model using Azure OpenAI if you haven't done so already. You can follow [this doc](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/how-to/create-resource?pivots=web-portal). 14 | 15 | Once you have a resource and a model deployed, retrieve the ENDPOINT and API_KEY from Azure portal. Follow [this instruction](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/chatgpt-quickstart?tabs=bash&pivots=rest-api#retrieve-key-and-endpoint). 16 | 17 | ```bash 18 | export OPENAI_API_KEY= 19 | export OPENAI_API_BASE= 20 | export OPENAI_API_MODEL_NAME= 21 | export AZURE_API_VERSION= // optional defaults to 2024-02-01 22 | ``` 23 | 24 | Then you can use the tool to interact with the AI assistant. 25 | 26 | ```bash 27 | $ ai [options] [message] 28 | ``` 29 | 30 | Options: 31 | 32 | -h, --help: Display a help message that explains how to use the tool. 33 | 34 | -m, --message: Send a message to the AI assistant. 35 | 36 | -i, --interactive: Start an interactive chat session with the AI assistant. 37 | 38 | -p, --prompt: The prompt to use for the AI assistant. Default is "Assistant is a large language model trained by OpenAI.". 39 | 40 | -u, --usage: Show usage statistics. 41 | 42 | -v, --version: Display the version of the tool. 43 | 44 | If you use the -i or --interactive option, the tool will start an interactive chat session. You can type messages to the AI assistant and it will respond to you. 45 | 46 | ## 💡 Examples 47 | 48 | Here are some examples of how to use the tool: 49 | 50 | ### Send a message to the AI assistant 51 | 52 | `ai "How to find the biggest folder in a bash shell?"` 53 | 54 | ai 'How to find the biggest folder in a bash shell?' 55 | 56 | ### Start an interactive chat session 57 | 58 | `ai -i` or with a message `ai -i "Why is the ocean blue?"` 59 | 60 | ai -i 'Why is the ocean blue?' 61 | 62 | ### Use a different prompt 63 | 64 | 1. Act as a smart commit message generator: 65 | 66 | ```bash 67 | alias aicommit="ai -p 'I want you to act as a commit message generator. I will provide you with information about the task and the prefix for the task code, and I would like you to generate an appropriate commit message using the conventional commit format. Do not write any explanations or other words, just reply with the commit message.'" 68 | ``` 69 | 70 | You can pipe to it. 71 | 72 | ![demo3](https://user-images.githubusercontent.com/15100664/234441674-d2c305e8-1c00-40d6-9de4-e6be4dcefc5e.png) 73 | 74 | 2. Act as a fancy title generator: 75 | 76 | ```bash 77 | alias ai-fancy-title-generator="ai -p 'I want you to act as a fancy title generator. I will type keywords via comma and you will reply with fancy titles.'" 78 | ``` 79 | 80 | ![demo4](https://user-images.githubusercontent.com/15100664/234442008-d30d8e6c-eaaa-4115-a71c-9b07886da393.png) 81 | 82 | 3. Act as an english translator: 83 | 84 | ```bash 85 | alias ai-english-translator="ai -p 'I want you to act as an English translator, spelling corrector and improver. I will speak to you in any language and you will detect the language, translate it and answer in the corrected and improved version of my text, in English. I want you to replace my simplified A0-level words and sentences with more beautiful and elegant, upper level English words and sentences. Keep the meaning same, but make them more literary. I want you to only reply the correction, the improvements and nothing else, do not write explanations.'" 86 | ``` 87 | 88 | ![demo5](https://user-images.githubusercontent.com/15100664/234441399-6ee81496-7e77-4745-9d60-7b81e5199977.png) 89 | 90 | ### Explorer more wonderful prompts 91 | 92 | * [https://github.com/f/awesome-chatgpt-prompts](https://github.com/f/awesome-chatgpt-prompts) 93 | * [https://github.com/PlexPt/awesome-chatgpt-prompts-zh](https://github.com/PlexPt/awesome-chatgpt-prompts-zh)(中文) 94 | 95 | ## 📝 License 96 | 97 | MIT 98 | -------------------------------------------------------------------------------- /lib/OpenAIChat.mjs: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import fetch from "node-fetch"; 3 | import ora from "ora"; 4 | import process from "node:process"; 5 | 6 | const DEFAULT_SYSTEM_CONTEXT = 7 | "Assistant is a large language model trained by OpenAI."; 8 | 9 | export class OpenAIChat { 10 | constructor(isInteractiveMode, rolePrompt, commandPrompt) { 11 | const OPENAI_API_BASE = process.env.OPENAI_API_BASE; 12 | const OPENAI_API_KEY = process.env.OPENAI_API_KEY; 13 | const OPENAI_API_MODEL_NAME = process.env.OPENAI_API_MODEL_NAME; 14 | const AZURE_API_VERSION = process.env.AZURE_API_VERSION || "2024-02-01"; 15 | 16 | // Make sure OPENAI_API_BASE and OPENAI_API_KEY are set 17 | if (!OPENAI_API_BASE || !OPENAI_API_KEY || !OPENAI_API_MODEL_NAME) { 18 | console.error( 19 | chalk.red( 20 | "Please set OPENAI_API_BASE, OPENAI_API_KEY and OPENAI_API_MODEL_NAME.", 21 | ), 22 | ); 23 | process.exit(1); 24 | } 25 | 26 | this._apiKey = OPENAI_API_KEY; 27 | this._url = `${OPENAI_API_BASE}/openai/deployments/${OPENAI_API_MODEL_NAME}/chat/completions?api-version=${AZURE_API_VERSION}`; 28 | this._initialContext = { 29 | role: "system", 30 | content: rolePrompt || DEFAULT_SYSTEM_CONTEXT, 31 | }; 32 | this._spinner = 33 | !isInteractiveMode && 34 | ora({ 35 | text: "...", 36 | discardStdin: false, 37 | }); 38 | this.chatId = ""; 39 | this.currentConversation = [this._initialContext]; 40 | if (commandPrompt) { 41 | this._hasCommandPrompt = Boolean(commandPrompt); 42 | this.currentConversation.push({ 43 | role: "user", 44 | content: commandPrompt, 45 | }); 46 | } 47 | 48 | // Error handling 49 | this.error = ""; 50 | } 51 | 52 | chat = async (userMessage) => { 53 | this.currentConversation.push({ role: "user", content: userMessage }); 54 | return this; 55 | }; 56 | 57 | edit = async (idx, newMessage) => { 58 | // idx is the index of the user's message, not the assistant's 59 | const skipCount = this._hasCommandPrompt ? 2 : 1; 60 | let i = skipCount; 61 | for (; i < this.currentConversation.length; i++) { 62 | if (this.currentConversation[i].role === "user") { 63 | if (idx === 0) { 64 | this.currentConversation[i].content = newMessage; 65 | break; 66 | } 67 | idx--; 68 | } 69 | } 70 | 71 | // Clear message after idx 72 | this.currentConversation = this.currentConversation.slice(0, i + 1); 73 | 74 | return this; 75 | }; 76 | 77 | sendMessage = async () => { 78 | const response = await this._sendCompletionRequest(); 79 | this.chatId = response.id; 80 | return this.currentConversation[this.currentConversation.length - 1]; 81 | }; 82 | 83 | getConversation() { 84 | // Skip the prompts 85 | return this.currentConversation.slice(this._hasCommandPrompt ? 2 : 1); 86 | } 87 | 88 | // Send a chat completion request to the OpenAI API 89 | // Sample response: 90 | // { 91 | // "id": "chatcmpl-6v7mkQj980V1yBec6ETrKPRqFjNw9", 92 | // "object": "chat.completion", 93 | // "created": 1679072642, 94 | // "model": "gpt-35-turbo", 95 | // "usage": { 96 | // "prompt_tokens": 58, 97 | // "completion_tokens": 68, 98 | // "total_tokens": 126 99 | // }, 100 | // "choices": [ 101 | // { 102 | // "message": { 103 | // "role": "assistant", 104 | // "content": "Yes, other Azure Cognitive Services also support customer managed keys. Azure Cognitive Services offer multiple options for customers to manage keys, such as using Azure Key Vault, customer-managed keys in Azure Key Vault or customer-managed keys through Azure Storage service. This helps customers ensure that their data is secure and access to their services is controlled." 105 | // }, 106 | // "finish_reason": "stop", 107 | // "index": 0 108 | // } 109 | // ] 110 | // } 111 | async _sendCompletionRequest() { 112 | if (process.env.NODE_ENV === "test") { 113 | this.currentConversation.push({ 114 | role: "assistant", 115 | content: "Test response", 116 | usage: { 117 | prompt_tokens: 58, 118 | completion_tokens: 68, 119 | total_tokens: 126, 120 | }, 121 | }); 122 | 123 | this._spinner && this._spinner.start(); 124 | 125 | await new Promise((resolve) => { 126 | setTimeout(resolve, 1000); 127 | }); 128 | 129 | this._spinner && this._spinner.stop(); 130 | 131 | return Promise.resolve({ 132 | id: "chatcmpl-6v7mkQj980V1yBec6ETrKPRqFjNw9", 133 | }); 134 | } 135 | 136 | const headers = { 137 | "Content-Type": "application/json", 138 | Authorization: `Bearer ${this._apiKey}`, 139 | }; 140 | // Remove 'usage' from the request body before sending 141 | const conversation = this.currentConversation.map((message) => { 142 | const { usage, ...rest } = message; 143 | return rest; 144 | }); 145 | 146 | const body = { 147 | messages: conversation, 148 | model: process.env.OPENAI_API_MODEL_NAME, 149 | }; 150 | 151 | const controller = new AbortController(); 152 | const { signal } = controller; 153 | const timer = setTimeout(() => { 154 | controller.abort(); 155 | }, 30 * 1000); // 30s 156 | 157 | this._spinner && this._spinner.start(); 158 | try { 159 | const response = await fetch(this._url, { 160 | method: "POST", 161 | headers, 162 | body: JSON.stringify(body), 163 | signal, 164 | }); 165 | if (!response.ok) { 166 | this.currentConversation.push({ 167 | role: "error", 168 | content: "Something went wrong. Please try again.", 169 | }); 170 | 171 | throw new Error( 172 | "Failed to send completion request." + response.statusText, 173 | ); 174 | } 175 | 176 | const json = await response.json(); 177 | 178 | this.currentConversation.push({ 179 | ...json.choices[0].message, 180 | usage: json.usage, 181 | }); 182 | this._spinner && this._spinner.stop(); 183 | this.error = ""; 184 | clearTimeout(timer); 185 | return json; 186 | } catch (err) { 187 | if (err.name === "AbortError") { 188 | this.error = "Timed out. Type '/r' to retry."; 189 | } else if (err instanceof Error) { 190 | this.error = err.message; 191 | } 192 | this._spinner && this._spinner.stop(); 193 | return err; 194 | } 195 | } 196 | } 197 | -------------------------------------------------------------------------------- /bin/ai.mjs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import chalk from "chalk"; 4 | import { OpenAIChat } from "../lib/OpenAIChat.mjs"; 5 | import { parseArgs, printHelp, printVersion } from "../lib/parseArgs.mjs"; 6 | import { readFromPipe } from "../lib/readFromPipe.mjs"; 7 | import { marked } from "marked"; 8 | import TerminalRenderer from "marked-terminal"; 9 | import { parseUserMessage } from "../lib/parseUserMessage.mjs"; 10 | import blessed from "blessed"; 11 | import clipboard from "clipboardy"; 12 | import { saveToFile } from "../lib/saveToFile.mjs"; 13 | 14 | marked.setOptions({ 15 | renderer: new TerminalRenderer(), 16 | }); 17 | 18 | const log = console.log; 19 | 20 | async function main() { 21 | const args = parseArgs(); 22 | 23 | if (args.version) { 24 | await printVersion(); 25 | return; 26 | } 27 | 28 | args.message = args.message || (await readFromPipe()); 29 | 30 | if (args.help || (!args.message && !args.interactive)) { 31 | printHelp(); 32 | return; 33 | } 34 | 35 | const chat = new OpenAIChat( 36 | args.interactive, 37 | args.rolePrompt, 38 | args.commandPrompt, 39 | ); 40 | 41 | /* Non-interactive mode */ 42 | if (!args.interactive) { 43 | const assistantMessage = await chat 44 | .chat(args.message) 45 | .then(chat.sendMessage); 46 | 47 | if (chat.error) { 48 | log(chat.error); 49 | return; 50 | } 51 | 52 | log(marked(assistantMessage.content).trim()); 53 | if (args.usage) { 54 | const usage = assistantMessage.usage; 55 | log( 56 | chalk.bold( 57 | `\n${chalk.underline("Prompt tokens")}: ${ 58 | usage.prompt_tokens 59 | }\n${chalk.underline("Completion tokens")}: ${ 60 | usage.completion_tokens 61 | }\n${chalk.underline("Total tokens")}: ${usage.total_tokens}`, 62 | ), 63 | ); 64 | } 65 | return; 66 | } 67 | 68 | /* Interactive mode */ 69 | 70 | // Build UI 71 | const screen = blessed.screen({ 72 | smartCSR: true, 73 | fullUnicode: true, 74 | }); 75 | screen.title = "AI - interactive mode"; 76 | screen.key(["C-c", "C-d"], exit(screen)); 77 | 78 | const box = blessed.box({ 79 | parent: screen, 80 | top: 0, 81 | left: 0, 82 | width: "100%", 83 | height: "100%-3", 84 | scrollable: true, 85 | alwaysScroll: true, 86 | mouse: true, 87 | content: args.message || "", 88 | tags: true, 89 | }); 90 | 91 | const inputContainer = blessed.box({ 92 | parent: screen, 93 | width: "100%", 94 | height: 3, 95 | bottom: 0, 96 | left: 0, 97 | scrollable: false, 98 | alwaysScroll: false, 99 | mouse: false, 100 | border: { 101 | type: "line", 102 | style: { 103 | fg: "gray", 104 | }, 105 | }, 106 | }); 107 | 108 | const message = blessed.message({ 109 | parent: screen, 110 | atop: 0, 111 | aleft: 0, 112 | width: "100%", 113 | height: 1, 114 | scrollable: false, 115 | bg: "white", 116 | fg: "black", 117 | hidden: true, 118 | }); 119 | 120 | const loading = blessed.loading({ 121 | parent: screen, 122 | bottom: 3, 123 | left: 2, 124 | width: 1, 125 | height: 1, 126 | hidden: true, 127 | }); 128 | 129 | blessed.box({ 130 | parent: inputContainer, 131 | width: 1, 132 | height: 1, 133 | content: ">", 134 | bottom: 0, 135 | left: 0, 136 | }); 137 | 138 | const input = blessed.textarea({ 139 | parent: inputContainer, 140 | focusable: true, 141 | focused: true, 142 | inputOnFocus: true, 143 | width: "100%-4", 144 | height: 1, 145 | bottom: 0, 146 | left: 2, 147 | tags: true, 148 | style: { 149 | fg: "white", 150 | }, 151 | }); 152 | 153 | function render() { 154 | if (chat.error) { 155 | message.error(chat.error); 156 | } else { 157 | const conversation = chat.getConversation(); 158 | box.setContent( 159 | conversation 160 | .map(({ role, content, usage }, idx) => { 161 | if (role === "user") { 162 | return buildUserContent(content, idx).trim(); 163 | } else if (role === "assistant") { 164 | return buildAssistantContent( 165 | content, 166 | args.usage && usage, 167 | idx, 168 | ).trim(); 169 | } else { 170 | // Error 171 | return `{red-fg}${content}{red-fg}`; 172 | } 173 | }) 174 | .join("\n"), 175 | ); 176 | // Scroll to bottom 177 | box.setScrollPerc(100); 178 | } 179 | screen.render(); 180 | } 181 | 182 | input.key("enter", async () => { 183 | const val = input.value.trim(); 184 | 185 | const userIntent = parseUserMessage(val); 186 | 187 | let chatAction, 188 | send = 189 | userIntent.intent === "message" || 190 | userIntent.intent === "edit" || 191 | (userIntent.intent === "retry" && 192 | chat.getConversation()[chat.getConversation().length - 1].role === 193 | "user"); 194 | if (userIntent.intent === "edit") { 195 | chatAction = chat.edit(userIntent.index, userIntent.message); 196 | } else if (userIntent.intent === "copy") { 197 | // Copy the message to the clipboard 198 | const textToCopy = chat 199 | .getConversation() 200 | [userIntent.index].content.trim(); 201 | chatAction = clipboard.write(textToCopy); 202 | } else if (userIntent.intent === "save") { 203 | chatAction = saveToFile(chat.getConversation(), chat.chatId).then( 204 | (fileName) => message.display(`Saved to ${fileName}!`), 205 | ); 206 | } else if (userIntent.intent === "load") { 207 | chatAction = chat.chat( 208 | "load: " + userIntent.intent + userIntent.index + userIntent.message, 209 | ); 210 | } else if (userIntent.intent === "retry") { 211 | chatAction = Promise.resolve(); 212 | } else { 213 | chatAction = chat.chat(val); 214 | } 215 | 216 | input.setValue(""); 217 | input.hide(); 218 | loading.load(); 219 | 220 | chatAction 221 | .then(render) 222 | .then(() => send && chat.sendMessage()) 223 | .finally(() => { 224 | render(); 225 | input.show(); 226 | input.focus(); 227 | loading.stop(); 228 | }); 229 | }); 230 | 231 | input.key("C-c", exit(screen)); 232 | input.key("C-d", exit(screen)); 233 | 234 | screen.key("e", function () { 235 | input.readInput(); 236 | }); 237 | 238 | if (args.message) { 239 | input.hide(); 240 | loading.load(); 241 | chat 242 | .chat(args.message.trim()) 243 | .then(render) 244 | .then(chat.sendMessage) 245 | .finally(() => { 246 | render(); 247 | input.show(); 248 | input.focus(); 249 | loading.stop(); 250 | }); 251 | } else { 252 | render(); 253 | input.focus(); 254 | } 255 | } 256 | 257 | main(); 258 | 259 | function buildUserContent(content, idx) { 260 | return `{right}{#00ff7f-fg}You{/#00ff7f-fg}{gray-fg}(#${idx}){/gray-fg}: 261 | {white-fg}${content.trim()}{/white-fg}{/right}`; 262 | } 263 | 264 | function buildAssistantContent(content, usage, idx) { 265 | const usageInfo = usage 266 | ? `{gray-fg}(Prompt tokens: ${usage.prompt_tokens}, Completion tokens: ${usage.completion_tokens}, Total tokens: ${usage.total_tokens}){/gray-fg} 267 | ` 268 | : ""; 269 | return ( 270 | usageInfo + 271 | `{#00bfff-fg}Assistant{/#00ff7f-fg}{gray-fg}(#${idx}){/gray-fg}: 272 | ${marked(content.trim())}` 273 | ); 274 | } 275 | 276 | function exit(screen) { 277 | return function () { 278 | screen.destroy(); 279 | return process.exit(0); 280 | }; 281 | } 282 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | dependencies: 4 | '@dqbd/tiktoken': 5 | specifier: ^1.0.7 6 | version: 1.0.7 7 | ansi-escapes: 8 | specifier: ^6.2.0 9 | version: 6.2.0 10 | blessed: 11 | specifier: ^0.1.81 12 | version: 0.1.81 13 | chalk: 14 | specifier: ^5.2.0 15 | version: 5.2.0 16 | clipboardy: 17 | specifier: ^3.0.0 18 | version: 3.0.0 19 | command-line-args: 20 | specifier: ^5.2.1 21 | version: 5.2.1 22 | marked: 23 | specifier: ^4.3.0 24 | version: 4.3.0 25 | marked-terminal: 26 | specifier: ^5.1.1 27 | version: 5.1.1(marked@4.3.0) 28 | node-fetch: 29 | specifier: ^3.3.1 30 | version: 3.3.1 31 | ora: 32 | specifier: ^6.3.0 33 | version: 6.3.0 34 | 35 | devDependencies: 36 | ava: 37 | specifier: ^5.2.0 38 | version: 5.2.0 39 | 40 | packages: 41 | 42 | /@colors/colors@1.5.0: 43 | resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} 44 | engines: {node: '>=0.1.90'} 45 | requiresBuild: true 46 | dev: false 47 | optional: true 48 | 49 | /@dqbd/tiktoken@1.0.7: 50 | resolution: {integrity: sha512-bhR5k5W+8GLzysjk8zTMVygQZsgvf7W1F0IlL4ZQ5ugjo5rCyiwGM5d8DYriXspytfu98tv59niang3/T+FoDw==} 51 | dev: false 52 | 53 | /@nodelib/fs.scandir@2.1.5: 54 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 55 | engines: {node: '>= 8'} 56 | dependencies: 57 | '@nodelib/fs.stat': 2.0.5 58 | run-parallel: 1.2.0 59 | dev: true 60 | 61 | /@nodelib/fs.stat@2.0.5: 62 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 63 | engines: {node: '>= 8'} 64 | dev: true 65 | 66 | /@nodelib/fs.walk@1.2.8: 67 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 68 | engines: {node: '>= 8'} 69 | dependencies: 70 | '@nodelib/fs.scandir': 2.1.5 71 | fastq: 1.15.0 72 | dev: true 73 | 74 | /acorn-walk@8.2.0: 75 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 76 | engines: {node: '>=0.4.0'} 77 | dev: true 78 | 79 | /acorn@8.8.2: 80 | resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} 81 | engines: {node: '>=0.4.0'} 82 | hasBin: true 83 | dev: true 84 | 85 | /aggregate-error@4.0.1: 86 | resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} 87 | engines: {node: '>=12'} 88 | dependencies: 89 | clean-stack: 4.2.0 90 | indent-string: 5.0.0 91 | dev: true 92 | 93 | /ansi-escapes@5.0.0: 94 | resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} 95 | engines: {node: '>=12'} 96 | dependencies: 97 | type-fest: 1.4.0 98 | dev: false 99 | 100 | /ansi-escapes@6.2.0: 101 | resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} 102 | engines: {node: '>=14.16'} 103 | dependencies: 104 | type-fest: 3.9.0 105 | dev: false 106 | 107 | /ansi-regex@5.0.1: 108 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 109 | engines: {node: '>=8'} 110 | 111 | /ansi-regex@6.0.1: 112 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 113 | engines: {node: '>=12'} 114 | 115 | /ansi-styles@4.3.0: 116 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 117 | engines: {node: '>=8'} 118 | dependencies: 119 | color-convert: 2.0.1 120 | dev: true 121 | 122 | /ansi-styles@6.2.1: 123 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 124 | engines: {node: '>=12'} 125 | dev: true 126 | 127 | /ansicolors@0.3.2: 128 | resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} 129 | dev: false 130 | 131 | /anymatch@3.1.3: 132 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 133 | engines: {node: '>= 8'} 134 | dependencies: 135 | normalize-path: 3.0.0 136 | picomatch: 2.3.1 137 | dev: true 138 | 139 | /arch@2.2.0: 140 | resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} 141 | dev: false 142 | 143 | /argparse@1.0.10: 144 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 145 | dependencies: 146 | sprintf-js: 1.0.3 147 | dev: true 148 | 149 | /array-back@3.1.0: 150 | resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} 151 | engines: {node: '>=6'} 152 | dev: false 153 | 154 | /array-find-index@1.0.2: 155 | resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} 156 | engines: {node: '>=0.10.0'} 157 | dev: true 158 | 159 | /arrgv@1.0.2: 160 | resolution: {integrity: sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==} 161 | engines: {node: '>=8.0.0'} 162 | dev: true 163 | 164 | /arrify@3.0.0: 165 | resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} 166 | engines: {node: '>=12'} 167 | dev: true 168 | 169 | /ava@5.2.0: 170 | resolution: {integrity: sha512-W8yxFXJr/P68JP55eMpQIa6AiXhCX3VeuajM8nolyWNExcMDD6rnIWKTjw0B/+GkFHBIaN6Jd0LtcMThcoqVfg==} 171 | engines: {node: '>=14.19 <15 || >=16.15 <17 || >=18'} 172 | hasBin: true 173 | peerDependencies: 174 | '@ava/typescript': '*' 175 | peerDependenciesMeta: 176 | '@ava/typescript': 177 | optional: true 178 | dependencies: 179 | acorn: 8.8.2 180 | acorn-walk: 8.2.0 181 | ansi-styles: 6.2.1 182 | arrgv: 1.0.2 183 | arrify: 3.0.0 184 | callsites: 4.0.0 185 | cbor: 8.1.0 186 | chalk: 5.2.0 187 | chokidar: 3.5.3 188 | chunkd: 2.0.1 189 | ci-info: 3.8.0 190 | ci-parallel-vars: 1.0.1 191 | clean-yaml-object: 0.1.0 192 | cli-truncate: 3.1.0 193 | code-excerpt: 4.0.0 194 | common-path-prefix: 3.0.0 195 | concordance: 5.0.4 196 | currently-unhandled: 0.4.1 197 | debug: 4.3.4 198 | del: 7.0.0 199 | emittery: 1.0.1 200 | figures: 5.0.0 201 | globby: 13.1.4 202 | ignore-by-default: 2.1.0 203 | indent-string: 5.0.0 204 | is-error: 2.2.2 205 | is-plain-object: 5.0.0 206 | is-promise: 4.0.0 207 | matcher: 5.0.0 208 | mem: 9.0.2 209 | ms: 2.1.3 210 | p-event: 5.0.1 211 | p-map: 5.5.0 212 | picomatch: 2.3.1 213 | pkg-conf: 4.0.0 214 | plur: 5.1.0 215 | pretty-ms: 8.0.0 216 | resolve-cwd: 3.0.0 217 | slash: 3.0.0 218 | stack-utils: 2.0.6 219 | strip-ansi: 7.0.1 220 | supertap: 3.0.1 221 | temp-dir: 3.0.0 222 | write-file-atomic: 5.0.1 223 | yargs: 17.7.2 224 | transitivePeerDependencies: 225 | - supports-color 226 | dev: true 227 | 228 | /balanced-match@1.0.2: 229 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 230 | dev: true 231 | 232 | /base64-js@1.5.1: 233 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 234 | dev: false 235 | 236 | /binary-extensions@2.2.0: 237 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 238 | engines: {node: '>=8'} 239 | dev: true 240 | 241 | /bl@5.1.0: 242 | resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} 243 | dependencies: 244 | buffer: 6.0.3 245 | inherits: 2.0.4 246 | readable-stream: 3.6.2 247 | dev: false 248 | 249 | /blessed@0.1.81: 250 | resolution: {integrity: sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==} 251 | engines: {node: '>= 0.8.0'} 252 | hasBin: true 253 | dev: false 254 | 255 | /blueimp-md5@2.19.0: 256 | resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} 257 | dev: true 258 | 259 | /brace-expansion@1.1.11: 260 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 261 | dependencies: 262 | balanced-match: 1.0.2 263 | concat-map: 0.0.1 264 | dev: true 265 | 266 | /braces@3.0.2: 267 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 268 | engines: {node: '>=8'} 269 | dependencies: 270 | fill-range: 7.0.1 271 | dev: true 272 | 273 | /buffer@6.0.3: 274 | resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 275 | dependencies: 276 | base64-js: 1.5.1 277 | ieee754: 1.2.1 278 | dev: false 279 | 280 | /callsites@4.0.0: 281 | resolution: {integrity: sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ==} 282 | engines: {node: '>=12.20'} 283 | dev: true 284 | 285 | /cardinal@2.1.1: 286 | resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} 287 | hasBin: true 288 | dependencies: 289 | ansicolors: 0.3.2 290 | redeyed: 2.1.1 291 | dev: false 292 | 293 | /cbor@8.1.0: 294 | resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} 295 | engines: {node: '>=12.19'} 296 | dependencies: 297 | nofilter: 3.1.0 298 | dev: true 299 | 300 | /chalk@5.2.0: 301 | resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} 302 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 303 | 304 | /chokidar@3.5.3: 305 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 306 | engines: {node: '>= 8.10.0'} 307 | dependencies: 308 | anymatch: 3.1.3 309 | braces: 3.0.2 310 | glob-parent: 5.1.2 311 | is-binary-path: 2.1.0 312 | is-glob: 4.0.3 313 | normalize-path: 3.0.0 314 | readdirp: 3.6.0 315 | optionalDependencies: 316 | fsevents: 2.3.2 317 | dev: true 318 | 319 | /chunkd@2.0.1: 320 | resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} 321 | dev: true 322 | 323 | /ci-info@3.8.0: 324 | resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} 325 | engines: {node: '>=8'} 326 | dev: true 327 | 328 | /ci-parallel-vars@1.0.1: 329 | resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==} 330 | dev: true 331 | 332 | /clean-stack@4.2.0: 333 | resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} 334 | engines: {node: '>=12'} 335 | dependencies: 336 | escape-string-regexp: 5.0.0 337 | dev: true 338 | 339 | /clean-yaml-object@0.1.0: 340 | resolution: {integrity: sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==} 341 | engines: {node: '>=0.10.0'} 342 | dev: true 343 | 344 | /cli-cursor@4.0.0: 345 | resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} 346 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 347 | dependencies: 348 | restore-cursor: 4.0.0 349 | dev: false 350 | 351 | /cli-spinners@2.8.0: 352 | resolution: {integrity: sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==} 353 | engines: {node: '>=6'} 354 | dev: false 355 | 356 | /cli-table3@0.6.3: 357 | resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} 358 | engines: {node: 10.* || >= 12.*} 359 | dependencies: 360 | string-width: 4.2.3 361 | optionalDependencies: 362 | '@colors/colors': 1.5.0 363 | dev: false 364 | 365 | /cli-truncate@3.1.0: 366 | resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} 367 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 368 | dependencies: 369 | slice-ansi: 5.0.0 370 | string-width: 5.1.2 371 | dev: true 372 | 373 | /clipboardy@3.0.0: 374 | resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} 375 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 376 | dependencies: 377 | arch: 2.2.0 378 | execa: 5.1.1 379 | is-wsl: 2.2.0 380 | dev: false 381 | 382 | /cliui@8.0.1: 383 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 384 | engines: {node: '>=12'} 385 | dependencies: 386 | string-width: 4.2.3 387 | strip-ansi: 6.0.1 388 | wrap-ansi: 7.0.0 389 | dev: true 390 | 391 | /clone@1.0.4: 392 | resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} 393 | engines: {node: '>=0.8'} 394 | dev: false 395 | 396 | /code-excerpt@4.0.0: 397 | resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} 398 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 399 | dependencies: 400 | convert-to-spaces: 2.0.1 401 | dev: true 402 | 403 | /color-convert@2.0.1: 404 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 405 | engines: {node: '>=7.0.0'} 406 | dependencies: 407 | color-name: 1.1.4 408 | dev: true 409 | 410 | /color-name@1.1.4: 411 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 412 | dev: true 413 | 414 | /command-line-args@5.2.1: 415 | resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} 416 | engines: {node: '>=4.0.0'} 417 | dependencies: 418 | array-back: 3.1.0 419 | find-replace: 3.0.0 420 | lodash.camelcase: 4.3.0 421 | typical: 4.0.0 422 | dev: false 423 | 424 | /common-path-prefix@3.0.0: 425 | resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} 426 | dev: true 427 | 428 | /concat-map@0.0.1: 429 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 430 | dev: true 431 | 432 | /concordance@5.0.4: 433 | resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} 434 | engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} 435 | dependencies: 436 | date-time: 3.1.0 437 | esutils: 2.0.3 438 | fast-diff: 1.2.0 439 | js-string-escape: 1.0.1 440 | lodash: 4.17.21 441 | md5-hex: 3.0.1 442 | semver: 7.5.0 443 | well-known-symbols: 2.0.0 444 | dev: true 445 | 446 | /convert-to-spaces@2.0.1: 447 | resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} 448 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 449 | dev: true 450 | 451 | /cross-spawn@7.0.3: 452 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 453 | engines: {node: '>= 8'} 454 | dependencies: 455 | path-key: 3.1.1 456 | shebang-command: 2.0.0 457 | which: 2.0.2 458 | dev: false 459 | 460 | /currently-unhandled@0.4.1: 461 | resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} 462 | engines: {node: '>=0.10.0'} 463 | dependencies: 464 | array-find-index: 1.0.2 465 | dev: true 466 | 467 | /data-uri-to-buffer@4.0.1: 468 | resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 469 | engines: {node: '>= 12'} 470 | dev: false 471 | 472 | /date-time@3.1.0: 473 | resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} 474 | engines: {node: '>=6'} 475 | dependencies: 476 | time-zone: 1.0.0 477 | dev: true 478 | 479 | /debug@4.3.4: 480 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 481 | engines: {node: '>=6.0'} 482 | peerDependencies: 483 | supports-color: '*' 484 | peerDependenciesMeta: 485 | supports-color: 486 | optional: true 487 | dependencies: 488 | ms: 2.1.2 489 | dev: true 490 | 491 | /defaults@1.0.4: 492 | resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} 493 | dependencies: 494 | clone: 1.0.4 495 | dev: false 496 | 497 | /del@7.0.0: 498 | resolution: {integrity: sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q==} 499 | engines: {node: '>=14.16'} 500 | dependencies: 501 | globby: 13.1.4 502 | graceful-fs: 4.2.11 503 | is-glob: 4.0.3 504 | is-path-cwd: 3.0.0 505 | is-path-inside: 4.0.0 506 | p-map: 5.5.0 507 | rimraf: 3.0.2 508 | slash: 4.0.0 509 | dev: true 510 | 511 | /dir-glob@3.0.1: 512 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 513 | engines: {node: '>=8'} 514 | dependencies: 515 | path-type: 4.0.0 516 | dev: true 517 | 518 | /eastasianwidth@0.2.0: 519 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 520 | dev: true 521 | 522 | /emittery@1.0.1: 523 | resolution: {integrity: sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ==} 524 | engines: {node: '>=14.16'} 525 | dev: true 526 | 527 | /emoji-regex@8.0.0: 528 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 529 | 530 | /emoji-regex@9.2.2: 531 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 532 | dev: true 533 | 534 | /escalade@3.1.1: 535 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 536 | engines: {node: '>=6'} 537 | dev: true 538 | 539 | /escape-string-regexp@2.0.0: 540 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 541 | engines: {node: '>=8'} 542 | dev: true 543 | 544 | /escape-string-regexp@5.0.0: 545 | resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 546 | engines: {node: '>=12'} 547 | dev: true 548 | 549 | /esprima@4.0.1: 550 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 551 | engines: {node: '>=4'} 552 | hasBin: true 553 | 554 | /esutils@2.0.3: 555 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 556 | engines: {node: '>=0.10.0'} 557 | dev: true 558 | 559 | /execa@5.1.1: 560 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 561 | engines: {node: '>=10'} 562 | dependencies: 563 | cross-spawn: 7.0.3 564 | get-stream: 6.0.1 565 | human-signals: 2.1.0 566 | is-stream: 2.0.1 567 | merge-stream: 2.0.0 568 | npm-run-path: 4.0.1 569 | onetime: 5.1.2 570 | signal-exit: 3.0.7 571 | strip-final-newline: 2.0.0 572 | dev: false 573 | 574 | /fast-diff@1.2.0: 575 | resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} 576 | dev: true 577 | 578 | /fast-glob@3.2.12: 579 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 580 | engines: {node: '>=8.6.0'} 581 | dependencies: 582 | '@nodelib/fs.stat': 2.0.5 583 | '@nodelib/fs.walk': 1.2.8 584 | glob-parent: 5.1.2 585 | merge2: 1.4.1 586 | micromatch: 4.0.5 587 | dev: true 588 | 589 | /fastq@1.15.0: 590 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 591 | dependencies: 592 | reusify: 1.0.4 593 | dev: true 594 | 595 | /fetch-blob@3.2.0: 596 | resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} 597 | engines: {node: ^12.20 || >= 14.13} 598 | dependencies: 599 | node-domexception: 1.0.0 600 | web-streams-polyfill: 3.2.1 601 | dev: false 602 | 603 | /figures@5.0.0: 604 | resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} 605 | engines: {node: '>=14'} 606 | dependencies: 607 | escape-string-regexp: 5.0.0 608 | is-unicode-supported: 1.3.0 609 | dev: true 610 | 611 | /fill-range@7.0.1: 612 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 613 | engines: {node: '>=8'} 614 | dependencies: 615 | to-regex-range: 5.0.1 616 | dev: true 617 | 618 | /find-replace@3.0.0: 619 | resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} 620 | engines: {node: '>=4.0.0'} 621 | dependencies: 622 | array-back: 3.1.0 623 | dev: false 624 | 625 | /find-up@6.3.0: 626 | resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} 627 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 628 | dependencies: 629 | locate-path: 7.2.0 630 | path-exists: 5.0.0 631 | dev: true 632 | 633 | /formdata-polyfill@4.0.10: 634 | resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} 635 | engines: {node: '>=12.20.0'} 636 | dependencies: 637 | fetch-blob: 3.2.0 638 | dev: false 639 | 640 | /fs.realpath@1.0.0: 641 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 642 | dev: true 643 | 644 | /fsevents@2.3.2: 645 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 646 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 647 | os: [darwin] 648 | requiresBuild: true 649 | dev: true 650 | optional: true 651 | 652 | /get-caller-file@2.0.5: 653 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 654 | engines: {node: 6.* || 8.* || >= 10.*} 655 | dev: true 656 | 657 | /get-stream@6.0.1: 658 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 659 | engines: {node: '>=10'} 660 | dev: false 661 | 662 | /glob-parent@5.1.2: 663 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 664 | engines: {node: '>= 6'} 665 | dependencies: 666 | is-glob: 4.0.3 667 | dev: true 668 | 669 | /glob@7.2.3: 670 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 671 | dependencies: 672 | fs.realpath: 1.0.0 673 | inflight: 1.0.6 674 | inherits: 2.0.4 675 | minimatch: 3.1.2 676 | once: 1.4.0 677 | path-is-absolute: 1.0.1 678 | dev: true 679 | 680 | /globby@13.1.4: 681 | resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} 682 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 683 | dependencies: 684 | dir-glob: 3.0.1 685 | fast-glob: 3.2.12 686 | ignore: 5.2.4 687 | merge2: 1.4.1 688 | slash: 4.0.0 689 | dev: true 690 | 691 | /graceful-fs@4.2.11: 692 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 693 | dev: true 694 | 695 | /has-flag@4.0.0: 696 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 697 | engines: {node: '>=8'} 698 | dev: false 699 | 700 | /human-signals@2.1.0: 701 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 702 | engines: {node: '>=10.17.0'} 703 | dev: false 704 | 705 | /ieee754@1.2.1: 706 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 707 | dev: false 708 | 709 | /ignore-by-default@2.1.0: 710 | resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} 711 | engines: {node: '>=10 <11 || >=12 <13 || >=14'} 712 | dev: true 713 | 714 | /ignore@5.2.4: 715 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 716 | engines: {node: '>= 4'} 717 | dev: true 718 | 719 | /imurmurhash@0.1.4: 720 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 721 | engines: {node: '>=0.8.19'} 722 | dev: true 723 | 724 | /indent-string@5.0.0: 725 | resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} 726 | engines: {node: '>=12'} 727 | dev: true 728 | 729 | /inflight@1.0.6: 730 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 731 | dependencies: 732 | once: 1.4.0 733 | wrappy: 1.0.2 734 | dev: true 735 | 736 | /inherits@2.0.4: 737 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 738 | 739 | /irregular-plurals@3.5.0: 740 | resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} 741 | engines: {node: '>=8'} 742 | dev: true 743 | 744 | /is-binary-path@2.1.0: 745 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 746 | engines: {node: '>=8'} 747 | dependencies: 748 | binary-extensions: 2.2.0 749 | dev: true 750 | 751 | /is-docker@2.2.1: 752 | resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} 753 | engines: {node: '>=8'} 754 | hasBin: true 755 | dev: false 756 | 757 | /is-error@2.2.2: 758 | resolution: {integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==} 759 | dev: true 760 | 761 | /is-extglob@2.1.1: 762 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 763 | engines: {node: '>=0.10.0'} 764 | dev: true 765 | 766 | /is-fullwidth-code-point@3.0.0: 767 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 768 | engines: {node: '>=8'} 769 | 770 | /is-fullwidth-code-point@4.0.0: 771 | resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} 772 | engines: {node: '>=12'} 773 | dev: true 774 | 775 | /is-glob@4.0.3: 776 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 777 | engines: {node: '>=0.10.0'} 778 | dependencies: 779 | is-extglob: 2.1.1 780 | dev: true 781 | 782 | /is-interactive@2.0.0: 783 | resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} 784 | engines: {node: '>=12'} 785 | dev: false 786 | 787 | /is-number@7.0.0: 788 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 789 | engines: {node: '>=0.12.0'} 790 | dev: true 791 | 792 | /is-path-cwd@3.0.0: 793 | resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} 794 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 795 | dev: true 796 | 797 | /is-path-inside@4.0.0: 798 | resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} 799 | engines: {node: '>=12'} 800 | dev: true 801 | 802 | /is-plain-object@5.0.0: 803 | resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} 804 | engines: {node: '>=0.10.0'} 805 | dev: true 806 | 807 | /is-promise@4.0.0: 808 | resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} 809 | dev: true 810 | 811 | /is-stream@2.0.1: 812 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 813 | engines: {node: '>=8'} 814 | dev: false 815 | 816 | /is-unicode-supported@1.3.0: 817 | resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} 818 | engines: {node: '>=12'} 819 | 820 | /is-wsl@2.2.0: 821 | resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} 822 | engines: {node: '>=8'} 823 | dependencies: 824 | is-docker: 2.2.1 825 | dev: false 826 | 827 | /isexe@2.0.0: 828 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 829 | dev: false 830 | 831 | /js-string-escape@1.0.1: 832 | resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} 833 | engines: {node: '>= 0.8'} 834 | dev: true 835 | 836 | /js-yaml@3.14.1: 837 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 838 | hasBin: true 839 | dependencies: 840 | argparse: 1.0.10 841 | esprima: 4.0.1 842 | dev: true 843 | 844 | /load-json-file@7.0.1: 845 | resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} 846 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 847 | dev: true 848 | 849 | /locate-path@7.2.0: 850 | resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} 851 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 852 | dependencies: 853 | p-locate: 6.0.0 854 | dev: true 855 | 856 | /lodash.camelcase@4.3.0: 857 | resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} 858 | dev: false 859 | 860 | /lodash@4.17.21: 861 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 862 | 863 | /log-symbols@5.1.0: 864 | resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} 865 | engines: {node: '>=12'} 866 | dependencies: 867 | chalk: 5.2.0 868 | is-unicode-supported: 1.3.0 869 | dev: false 870 | 871 | /lru-cache@6.0.0: 872 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 873 | engines: {node: '>=10'} 874 | dependencies: 875 | yallist: 4.0.0 876 | dev: true 877 | 878 | /map-age-cleaner@0.1.3: 879 | resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} 880 | engines: {node: '>=6'} 881 | dependencies: 882 | p-defer: 1.0.0 883 | dev: true 884 | 885 | /marked-terminal@5.1.1(marked@4.3.0): 886 | resolution: {integrity: sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==} 887 | engines: {node: '>=14.13.1 || >=16.0.0'} 888 | peerDependencies: 889 | marked: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 890 | dependencies: 891 | ansi-escapes: 5.0.0 892 | cardinal: 2.1.1 893 | chalk: 5.2.0 894 | cli-table3: 0.6.3 895 | marked: 4.3.0 896 | node-emoji: 1.11.0 897 | supports-hyperlinks: 2.3.0 898 | dev: false 899 | 900 | /marked@4.3.0: 901 | resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} 902 | engines: {node: '>= 12'} 903 | hasBin: true 904 | dev: false 905 | 906 | /matcher@5.0.0: 907 | resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} 908 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 909 | dependencies: 910 | escape-string-regexp: 5.0.0 911 | dev: true 912 | 913 | /md5-hex@3.0.1: 914 | resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} 915 | engines: {node: '>=8'} 916 | dependencies: 917 | blueimp-md5: 2.19.0 918 | dev: true 919 | 920 | /mem@9.0.2: 921 | resolution: {integrity: sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==} 922 | engines: {node: '>=12.20'} 923 | dependencies: 924 | map-age-cleaner: 0.1.3 925 | mimic-fn: 4.0.0 926 | dev: true 927 | 928 | /merge-stream@2.0.0: 929 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 930 | dev: false 931 | 932 | /merge2@1.4.1: 933 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 934 | engines: {node: '>= 8'} 935 | dev: true 936 | 937 | /micromatch@4.0.5: 938 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 939 | engines: {node: '>=8.6'} 940 | dependencies: 941 | braces: 3.0.2 942 | picomatch: 2.3.1 943 | dev: true 944 | 945 | /mimic-fn@2.1.0: 946 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 947 | engines: {node: '>=6'} 948 | dev: false 949 | 950 | /mimic-fn@4.0.0: 951 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 952 | engines: {node: '>=12'} 953 | dev: true 954 | 955 | /minimatch@3.1.2: 956 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 957 | dependencies: 958 | brace-expansion: 1.1.11 959 | dev: true 960 | 961 | /ms@2.1.2: 962 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 963 | dev: true 964 | 965 | /ms@2.1.3: 966 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 967 | dev: true 968 | 969 | /node-domexception@1.0.0: 970 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 971 | engines: {node: '>=10.5.0'} 972 | dev: false 973 | 974 | /node-emoji@1.11.0: 975 | resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} 976 | dependencies: 977 | lodash: 4.17.21 978 | dev: false 979 | 980 | /node-fetch@3.3.1: 981 | resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} 982 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 983 | dependencies: 984 | data-uri-to-buffer: 4.0.1 985 | fetch-blob: 3.2.0 986 | formdata-polyfill: 4.0.10 987 | dev: false 988 | 989 | /nofilter@3.1.0: 990 | resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} 991 | engines: {node: '>=12.19'} 992 | dev: true 993 | 994 | /normalize-path@3.0.0: 995 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 996 | engines: {node: '>=0.10.0'} 997 | dev: true 998 | 999 | /npm-run-path@4.0.1: 1000 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1001 | engines: {node: '>=8'} 1002 | dependencies: 1003 | path-key: 3.1.1 1004 | dev: false 1005 | 1006 | /once@1.4.0: 1007 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1008 | dependencies: 1009 | wrappy: 1.0.2 1010 | dev: true 1011 | 1012 | /onetime@5.1.2: 1013 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1014 | engines: {node: '>=6'} 1015 | dependencies: 1016 | mimic-fn: 2.1.0 1017 | dev: false 1018 | 1019 | /ora@6.3.0: 1020 | resolution: {integrity: sha512-1/D8uRFY0ay2kgBpmAwmSA404w4OoPVhHMqRqtjvrcK/dnzcEZxMJ+V4DUbyICu8IIVRclHcOf5wlD1tMY4GUQ==} 1021 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1022 | dependencies: 1023 | chalk: 5.2.0 1024 | cli-cursor: 4.0.0 1025 | cli-spinners: 2.8.0 1026 | is-interactive: 2.0.0 1027 | is-unicode-supported: 1.3.0 1028 | log-symbols: 5.1.0 1029 | stdin-discarder: 0.1.0 1030 | strip-ansi: 7.0.1 1031 | wcwidth: 1.0.1 1032 | dev: false 1033 | 1034 | /p-defer@1.0.0: 1035 | resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} 1036 | engines: {node: '>=4'} 1037 | dev: true 1038 | 1039 | /p-event@5.0.1: 1040 | resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} 1041 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1042 | dependencies: 1043 | p-timeout: 5.1.0 1044 | dev: true 1045 | 1046 | /p-limit@4.0.0: 1047 | resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} 1048 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1049 | dependencies: 1050 | yocto-queue: 1.0.0 1051 | dev: true 1052 | 1053 | /p-locate@6.0.0: 1054 | resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} 1055 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1056 | dependencies: 1057 | p-limit: 4.0.0 1058 | dev: true 1059 | 1060 | /p-map@5.5.0: 1061 | resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} 1062 | engines: {node: '>=12'} 1063 | dependencies: 1064 | aggregate-error: 4.0.1 1065 | dev: true 1066 | 1067 | /p-timeout@5.1.0: 1068 | resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} 1069 | engines: {node: '>=12'} 1070 | dev: true 1071 | 1072 | /parse-ms@3.0.0: 1073 | resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} 1074 | engines: {node: '>=12'} 1075 | dev: true 1076 | 1077 | /path-exists@5.0.0: 1078 | resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} 1079 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1080 | dev: true 1081 | 1082 | /path-is-absolute@1.0.1: 1083 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1084 | engines: {node: '>=0.10.0'} 1085 | dev: true 1086 | 1087 | /path-key@3.1.1: 1088 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1089 | engines: {node: '>=8'} 1090 | dev: false 1091 | 1092 | /path-type@4.0.0: 1093 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1094 | engines: {node: '>=8'} 1095 | dev: true 1096 | 1097 | /picomatch@2.3.1: 1098 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1099 | engines: {node: '>=8.6'} 1100 | dev: true 1101 | 1102 | /pkg-conf@4.0.0: 1103 | resolution: {integrity: sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==} 1104 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1105 | dependencies: 1106 | find-up: 6.3.0 1107 | load-json-file: 7.0.1 1108 | dev: true 1109 | 1110 | /plur@5.1.0: 1111 | resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} 1112 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1113 | dependencies: 1114 | irregular-plurals: 3.5.0 1115 | dev: true 1116 | 1117 | /pretty-ms@8.0.0: 1118 | resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} 1119 | engines: {node: '>=14.16'} 1120 | dependencies: 1121 | parse-ms: 3.0.0 1122 | dev: true 1123 | 1124 | /queue-microtask@1.2.3: 1125 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1126 | dev: true 1127 | 1128 | /readable-stream@3.6.2: 1129 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 1130 | engines: {node: '>= 6'} 1131 | dependencies: 1132 | inherits: 2.0.4 1133 | string_decoder: 1.3.0 1134 | util-deprecate: 1.0.2 1135 | dev: false 1136 | 1137 | /readdirp@3.6.0: 1138 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1139 | engines: {node: '>=8.10.0'} 1140 | dependencies: 1141 | picomatch: 2.3.1 1142 | dev: true 1143 | 1144 | /redeyed@2.1.1: 1145 | resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} 1146 | dependencies: 1147 | esprima: 4.0.1 1148 | dev: false 1149 | 1150 | /require-directory@2.1.1: 1151 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1152 | engines: {node: '>=0.10.0'} 1153 | dev: true 1154 | 1155 | /resolve-cwd@3.0.0: 1156 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 1157 | engines: {node: '>=8'} 1158 | dependencies: 1159 | resolve-from: 5.0.0 1160 | dev: true 1161 | 1162 | /resolve-from@5.0.0: 1163 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1164 | engines: {node: '>=8'} 1165 | dev: true 1166 | 1167 | /restore-cursor@4.0.0: 1168 | resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} 1169 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1170 | dependencies: 1171 | onetime: 5.1.2 1172 | signal-exit: 3.0.7 1173 | dev: false 1174 | 1175 | /reusify@1.0.4: 1176 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1177 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1178 | dev: true 1179 | 1180 | /rimraf@3.0.2: 1181 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1182 | hasBin: true 1183 | dependencies: 1184 | glob: 7.2.3 1185 | dev: true 1186 | 1187 | /run-parallel@1.2.0: 1188 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1189 | dependencies: 1190 | queue-microtask: 1.2.3 1191 | dev: true 1192 | 1193 | /safe-buffer@5.2.1: 1194 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1195 | dev: false 1196 | 1197 | /semver@7.5.0: 1198 | resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} 1199 | engines: {node: '>=10'} 1200 | hasBin: true 1201 | dependencies: 1202 | lru-cache: 6.0.0 1203 | dev: true 1204 | 1205 | /serialize-error@7.0.1: 1206 | resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} 1207 | engines: {node: '>=10'} 1208 | dependencies: 1209 | type-fest: 0.13.1 1210 | dev: true 1211 | 1212 | /shebang-command@2.0.0: 1213 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1214 | engines: {node: '>=8'} 1215 | dependencies: 1216 | shebang-regex: 3.0.0 1217 | dev: false 1218 | 1219 | /shebang-regex@3.0.0: 1220 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1221 | engines: {node: '>=8'} 1222 | dev: false 1223 | 1224 | /signal-exit@3.0.7: 1225 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1226 | dev: false 1227 | 1228 | /signal-exit@4.0.1: 1229 | resolution: {integrity: sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==} 1230 | engines: {node: '>=14'} 1231 | dev: true 1232 | 1233 | /slash@3.0.0: 1234 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1235 | engines: {node: '>=8'} 1236 | dev: true 1237 | 1238 | /slash@4.0.0: 1239 | resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} 1240 | engines: {node: '>=12'} 1241 | dev: true 1242 | 1243 | /slice-ansi@5.0.0: 1244 | resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} 1245 | engines: {node: '>=12'} 1246 | dependencies: 1247 | ansi-styles: 6.2.1 1248 | is-fullwidth-code-point: 4.0.0 1249 | dev: true 1250 | 1251 | /sprintf-js@1.0.3: 1252 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1253 | dev: true 1254 | 1255 | /stack-utils@2.0.6: 1256 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 1257 | engines: {node: '>=10'} 1258 | dependencies: 1259 | escape-string-regexp: 2.0.0 1260 | dev: true 1261 | 1262 | /stdin-discarder@0.1.0: 1263 | resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} 1264 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1265 | dependencies: 1266 | bl: 5.1.0 1267 | dev: false 1268 | 1269 | /string-width@4.2.3: 1270 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1271 | engines: {node: '>=8'} 1272 | dependencies: 1273 | emoji-regex: 8.0.0 1274 | is-fullwidth-code-point: 3.0.0 1275 | strip-ansi: 6.0.1 1276 | 1277 | /string-width@5.1.2: 1278 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1279 | engines: {node: '>=12'} 1280 | dependencies: 1281 | eastasianwidth: 0.2.0 1282 | emoji-regex: 9.2.2 1283 | strip-ansi: 7.0.1 1284 | dev: true 1285 | 1286 | /string_decoder@1.3.0: 1287 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1288 | dependencies: 1289 | safe-buffer: 5.2.1 1290 | dev: false 1291 | 1292 | /strip-ansi@6.0.1: 1293 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1294 | engines: {node: '>=8'} 1295 | dependencies: 1296 | ansi-regex: 5.0.1 1297 | 1298 | /strip-ansi@7.0.1: 1299 | resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} 1300 | engines: {node: '>=12'} 1301 | dependencies: 1302 | ansi-regex: 6.0.1 1303 | 1304 | /strip-final-newline@2.0.0: 1305 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1306 | engines: {node: '>=6'} 1307 | dev: false 1308 | 1309 | /supertap@3.0.1: 1310 | resolution: {integrity: sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==} 1311 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1312 | dependencies: 1313 | indent-string: 5.0.0 1314 | js-yaml: 3.14.1 1315 | serialize-error: 7.0.1 1316 | strip-ansi: 7.0.1 1317 | dev: true 1318 | 1319 | /supports-color@7.2.0: 1320 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1321 | engines: {node: '>=8'} 1322 | dependencies: 1323 | has-flag: 4.0.0 1324 | dev: false 1325 | 1326 | /supports-hyperlinks@2.3.0: 1327 | resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} 1328 | engines: {node: '>=8'} 1329 | dependencies: 1330 | has-flag: 4.0.0 1331 | supports-color: 7.2.0 1332 | dev: false 1333 | 1334 | /temp-dir@3.0.0: 1335 | resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} 1336 | engines: {node: '>=14.16'} 1337 | dev: true 1338 | 1339 | /time-zone@1.0.0: 1340 | resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} 1341 | engines: {node: '>=4'} 1342 | dev: true 1343 | 1344 | /to-regex-range@5.0.1: 1345 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1346 | engines: {node: '>=8.0'} 1347 | dependencies: 1348 | is-number: 7.0.0 1349 | dev: true 1350 | 1351 | /type-fest@0.13.1: 1352 | resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} 1353 | engines: {node: '>=10'} 1354 | dev: true 1355 | 1356 | /type-fest@1.4.0: 1357 | resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} 1358 | engines: {node: '>=10'} 1359 | dev: false 1360 | 1361 | /type-fest@3.9.0: 1362 | resolution: {integrity: sha512-hR8JP2e8UiH7SME5JZjsobBlEiatFoxpzCP+R3ZeCo7kAaG1jXQE5X/buLzogM6GJu8le9Y4OcfNuIQX0rZskA==} 1363 | engines: {node: '>=14.16'} 1364 | dev: false 1365 | 1366 | /typical@4.0.0: 1367 | resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} 1368 | engines: {node: '>=8'} 1369 | dev: false 1370 | 1371 | /util-deprecate@1.0.2: 1372 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1373 | dev: false 1374 | 1375 | /wcwidth@1.0.1: 1376 | resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} 1377 | dependencies: 1378 | defaults: 1.0.4 1379 | dev: false 1380 | 1381 | /web-streams-polyfill@3.2.1: 1382 | resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} 1383 | engines: {node: '>= 8'} 1384 | dev: false 1385 | 1386 | /well-known-symbols@2.0.0: 1387 | resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} 1388 | engines: {node: '>=6'} 1389 | dev: true 1390 | 1391 | /which@2.0.2: 1392 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1393 | engines: {node: '>= 8'} 1394 | hasBin: true 1395 | dependencies: 1396 | isexe: 2.0.0 1397 | dev: false 1398 | 1399 | /wrap-ansi@7.0.0: 1400 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1401 | engines: {node: '>=10'} 1402 | dependencies: 1403 | ansi-styles: 4.3.0 1404 | string-width: 4.2.3 1405 | strip-ansi: 6.0.1 1406 | dev: true 1407 | 1408 | /wrappy@1.0.2: 1409 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1410 | dev: true 1411 | 1412 | /write-file-atomic@5.0.1: 1413 | resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} 1414 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 1415 | dependencies: 1416 | imurmurhash: 0.1.4 1417 | signal-exit: 4.0.1 1418 | dev: true 1419 | 1420 | /y18n@5.0.8: 1421 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1422 | engines: {node: '>=10'} 1423 | dev: true 1424 | 1425 | /yallist@4.0.0: 1426 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1427 | dev: true 1428 | 1429 | /yargs-parser@21.1.1: 1430 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1431 | engines: {node: '>=12'} 1432 | dev: true 1433 | 1434 | /yargs@17.7.2: 1435 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1436 | engines: {node: '>=12'} 1437 | dependencies: 1438 | cliui: 8.0.1 1439 | escalade: 3.1.1 1440 | get-caller-file: 2.0.5 1441 | require-directory: 2.1.1 1442 | string-width: 4.2.3 1443 | y18n: 5.0.8 1444 | yargs-parser: 21.1.1 1445 | dev: true 1446 | 1447 | /yocto-queue@1.0.0: 1448 | resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} 1449 | engines: {node: '>=12.20'} 1450 | dev: true 1451 | --------------------------------------------------------------------------------