├── .gitignore ├── README.md ├── data └── memory.db ├── package-lock.json ├── package.json ├── src └── index.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | build/ 3 | *.log 4 | .env* -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MemGPT MCP Server 2 | 3 | A TypeScript-based MCP server that implements a memory system for LLMs. It provides tools for chatting with different LLM providers while maintaining conversation history. 4 | 5 | ## Features 6 | 7 | ### Tools 8 | - `chat` - Send a message to the current LLM provider 9 | - Takes a message parameter 10 | - Supports multiple providers (OpenAI, Anthropic, OpenRouter, Ollama) 11 | 12 | - `get_memory` - Retrieve conversation history 13 | - Optional `limit` parameter to specify number of memories to retrieve 14 | - Pass `limit: null` for unlimited memory retrieval 15 | - Returns memories in chronological order with timestamps 16 | 17 | - `clear_memory` - Clear conversation history 18 | - Removes all stored memories 19 | 20 | - `use_provider` - Switch between different LLM providers 21 | - Supports OpenAI, Anthropic, OpenRouter, and Ollama 22 | - Persists provider selection 23 | 24 | - `use_model` - Switch to a different model for the current provider 25 | - Supports provider-specific models: 26 | - Anthropic Claude Models: 27 | - Claude 3 Series: 28 | - `claude-3-haiku`: Fastest response times, ideal for tasks like customer support and content moderation 29 | - `claude-3-sonnet`: Balanced performance for general-purpose use 30 | - `claude-3-opus`: Advanced model for complex reasoning and high-performance tasks 31 | - Claude 3.5 Series: 32 | - `claude-3.5-haiku`: Enhanced speed and cost-effectiveness 33 | - `claude-3.5-sonnet`: Superior performance with computer interaction capabilities 34 | - OpenAI: 'gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo' 35 | - OpenRouter: Any model in 'provider/model' format (e.g., 'openai/gpt-4', 'anthropic/claude-2') 36 | - Ollama: Any locally available model (e.g., 'llama2', 'codellama') 37 | - Persists model selection 38 | 39 | ## Development 40 | 41 | Install dependencies: 42 | ```bash 43 | npm install 44 | ``` 45 | 46 | Build the server: 47 | ```bash 48 | npm run build 49 | ``` 50 | 51 | For development with auto-rebuild: 52 | ```bash 53 | npm run watch 54 | ``` 55 | 56 | ## Installation 57 | 58 | To use with Claude Desktop, add the server config: 59 | 60 | On MacOS: `~/Library/Application Support/Claude/claude_desktop_config.json` 61 | On Windows: `%APPDATA%/Claude/claude_desktop_config.json` 62 | 63 | ```json 64 | { 65 | "mcpServers": { 66 | "letta-memgpt": { 67 | "command": "/path/to/memgpt-server/build/index.js", 68 | "env": { 69 | "OPENAI_API_KEY": "your-openai-key", 70 | "ANTHROPIC_API_KEY": "your-anthropic-key", 71 | "OPENROUTER_API_KEY": "your-openrouter-key" 72 | } 73 | } 74 | } 75 | } 76 | ``` 77 | 78 | ### Environment Variables 79 | - `OPENAI_API_KEY` - Your OpenAI API key 80 | - `ANTHROPIC_API_KEY` - Your Anthropic API key 81 | - `OPENROUTER_API_KEY` - Your OpenRouter API key 82 | 83 | ### Debugging 84 | 85 | Since MCP servers communicate over stdio, debugging can be challenging. We recommend using the [MCP Inspector](https://github.com/modelcontextprotocol/inspector): 86 | 87 | ```bash 88 | npm run inspector 89 | ``` 90 | 91 | The Inspector will provide a URL to access debugging tools in your browser. 92 | 93 | ## Recent Updates 94 | 95 | ### Claude 3 and 3.5 Series Support (March 2024) 96 | - Added support for latest Claude models: 97 | - Claude 3 Series (Haiku, Sonnet, Opus) 98 | - Claude 3.5 Series (Haiku, Sonnet) 99 | 100 | ### Unlimited Memory Retrieval 101 | - Added support for retrieving unlimited conversation history 102 | - Use `{ "limit": null }` with the `get_memory` tool to retrieve all stored memories 103 | - Use `{ "limit": n }` to retrieve the n most recent memories 104 | - Default limit is 10 if not specified 105 | -------------------------------------------------------------------------------- /data/memory.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Vic563/Memgpt-MCP-Server/5b36577580f40b6c40e4dc484192343de61442aa/data/memory.db -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Letta(MemGPT)", 3 | "version": "0.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "Letta(MemGPT)", 9 | "version": "0.1.0", 10 | "dependencies": { 11 | "@modelcontextprotocol/sdk": "0.6.0", 12 | "@types/sqlite3": "^3.1.11", 13 | "axios": "^1.7.9", 14 | "dotenv": "^16.4.7", 15 | "sqlite3": "^5.1.7" 16 | }, 17 | "bin": { 18 | "Letta(MemGPT)": "build/index.js" 19 | }, 20 | "devDependencies": { 21 | "@types/node": "^20.17.11", 22 | "typescript": "^5.3.3" 23 | } 24 | }, 25 | "node_modules/@gar/promisify": { 26 | "version": "1.1.3", 27 | "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", 28 | "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", 29 | "license": "MIT", 30 | "optional": true 31 | }, 32 | "node_modules/@modelcontextprotocol/sdk": { 33 | "version": "0.6.0", 34 | "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-0.6.0.tgz", 35 | "integrity": "sha512-9rsDudGhDtMbvxohPoMMyAUOmEzQsOK+XFchh6gZGqo8sx9sBuZQs+CUttXqa8RZXKDaJRCN2tUtgGof7jRkkw==", 36 | "license": "MIT", 37 | "dependencies": { 38 | "content-type": "^1.0.5", 39 | "raw-body": "^3.0.0", 40 | "zod": "^3.23.8" 41 | } 42 | }, 43 | "node_modules/@npmcli/fs": { 44 | "version": "1.1.1", 45 | "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", 46 | "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", 47 | "license": "ISC", 48 | "optional": true, 49 | "dependencies": { 50 | "@gar/promisify": "^1.0.1", 51 | "semver": "^7.3.5" 52 | } 53 | }, 54 | "node_modules/@npmcli/move-file": { 55 | "version": "1.1.2", 56 | "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", 57 | "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", 58 | "deprecated": "This functionality has been moved to @npmcli/fs", 59 | "license": "MIT", 60 | "optional": true, 61 | "dependencies": { 62 | "mkdirp": "^1.0.4", 63 | "rimraf": "^3.0.2" 64 | }, 65 | "engines": { 66 | "node": ">=10" 67 | } 68 | }, 69 | "node_modules/@tootallnate/once": { 70 | "version": "1.1.2", 71 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 72 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 73 | "license": "MIT", 74 | "optional": true, 75 | "engines": { 76 | "node": ">= 6" 77 | } 78 | }, 79 | "node_modules/@types/node": { 80 | "version": "20.17.11", 81 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.11.tgz", 82 | "integrity": "sha512-Ept5glCK35R8yeyIeYlRIZtX6SLRyqMhOFTgj5SOkMpLTdw3SEHI9fHx60xaUZ+V1aJxQJODE+7/j5ocZydYTg==", 83 | "license": "MIT", 84 | "dependencies": { 85 | "undici-types": "~6.19.2" 86 | } 87 | }, 88 | "node_modules/@types/sqlite3": { 89 | "version": "3.1.11", 90 | "resolved": "https://registry.npmjs.org/@types/sqlite3/-/sqlite3-3.1.11.tgz", 91 | "integrity": "sha512-KYF+QgxAnnAh7DWPdNDroxkDI3/MspH1NMx6m/N/6fT1G6+jvsw4/ZePt8R8cr7ta58aboeTfYFBDxTJ5yv15w==", 92 | "license": "MIT", 93 | "dependencies": { 94 | "@types/node": "*" 95 | } 96 | }, 97 | "node_modules/abbrev": { 98 | "version": "1.1.1", 99 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 100 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 101 | "license": "ISC", 102 | "optional": true 103 | }, 104 | "node_modules/agent-base": { 105 | "version": "6.0.2", 106 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 107 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 108 | "license": "MIT", 109 | "optional": true, 110 | "dependencies": { 111 | "debug": "4" 112 | }, 113 | "engines": { 114 | "node": ">= 6.0.0" 115 | } 116 | }, 117 | "node_modules/agentkeepalive": { 118 | "version": "4.6.0", 119 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", 120 | "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", 121 | "license": "MIT", 122 | "optional": true, 123 | "dependencies": { 124 | "humanize-ms": "^1.2.1" 125 | }, 126 | "engines": { 127 | "node": ">= 8.0.0" 128 | } 129 | }, 130 | "node_modules/aggregate-error": { 131 | "version": "3.1.0", 132 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", 133 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", 134 | "license": "MIT", 135 | "optional": true, 136 | "dependencies": { 137 | "clean-stack": "^2.0.0", 138 | "indent-string": "^4.0.0" 139 | }, 140 | "engines": { 141 | "node": ">=8" 142 | } 143 | }, 144 | "node_modules/ansi-regex": { 145 | "version": "5.0.1", 146 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 147 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 148 | "license": "MIT", 149 | "optional": true, 150 | "engines": { 151 | "node": ">=8" 152 | } 153 | }, 154 | "node_modules/aproba": { 155 | "version": "2.0.0", 156 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", 157 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", 158 | "license": "ISC", 159 | "optional": true 160 | }, 161 | "node_modules/are-we-there-yet": { 162 | "version": "3.0.1", 163 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", 164 | "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", 165 | "deprecated": "This package is no longer supported.", 166 | "license": "ISC", 167 | "optional": true, 168 | "dependencies": { 169 | "delegates": "^1.0.0", 170 | "readable-stream": "^3.6.0" 171 | }, 172 | "engines": { 173 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 174 | } 175 | }, 176 | "node_modules/asynckit": { 177 | "version": "0.4.0", 178 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 179 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 180 | "license": "MIT" 181 | }, 182 | "node_modules/axios": { 183 | "version": "1.7.9", 184 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", 185 | "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", 186 | "license": "MIT", 187 | "dependencies": { 188 | "follow-redirects": "^1.15.6", 189 | "form-data": "^4.0.0", 190 | "proxy-from-env": "^1.1.0" 191 | } 192 | }, 193 | "node_modules/balanced-match": { 194 | "version": "1.0.2", 195 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 196 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 197 | "license": "MIT", 198 | "optional": true 199 | }, 200 | "node_modules/base64-js": { 201 | "version": "1.5.1", 202 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 203 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 204 | "funding": [ 205 | { 206 | "type": "github", 207 | "url": "https://github.com/sponsors/feross" 208 | }, 209 | { 210 | "type": "patreon", 211 | "url": "https://www.patreon.com/feross" 212 | }, 213 | { 214 | "type": "consulting", 215 | "url": "https://feross.org/support" 216 | } 217 | ], 218 | "license": "MIT" 219 | }, 220 | "node_modules/bindings": { 221 | "version": "1.5.0", 222 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 223 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 224 | "license": "MIT", 225 | "dependencies": { 226 | "file-uri-to-path": "1.0.0" 227 | } 228 | }, 229 | "node_modules/bl": { 230 | "version": "4.1.0", 231 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 232 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 233 | "license": "MIT", 234 | "dependencies": { 235 | "buffer": "^5.5.0", 236 | "inherits": "^2.0.4", 237 | "readable-stream": "^3.4.0" 238 | } 239 | }, 240 | "node_modules/brace-expansion": { 241 | "version": "1.1.11", 242 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 243 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 244 | "license": "MIT", 245 | "optional": true, 246 | "dependencies": { 247 | "balanced-match": "^1.0.0", 248 | "concat-map": "0.0.1" 249 | } 250 | }, 251 | "node_modules/buffer": { 252 | "version": "5.7.1", 253 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 254 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 255 | "funding": [ 256 | { 257 | "type": "github", 258 | "url": "https://github.com/sponsors/feross" 259 | }, 260 | { 261 | "type": "patreon", 262 | "url": "https://www.patreon.com/feross" 263 | }, 264 | { 265 | "type": "consulting", 266 | "url": "https://feross.org/support" 267 | } 268 | ], 269 | "license": "MIT", 270 | "dependencies": { 271 | "base64-js": "^1.3.1", 272 | "ieee754": "^1.1.13" 273 | } 274 | }, 275 | "node_modules/bytes": { 276 | "version": "3.1.2", 277 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 278 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 279 | "license": "MIT", 280 | "engines": { 281 | "node": ">= 0.8" 282 | } 283 | }, 284 | "node_modules/cacache": { 285 | "version": "15.3.0", 286 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", 287 | "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", 288 | "license": "ISC", 289 | "optional": true, 290 | "dependencies": { 291 | "@npmcli/fs": "^1.0.0", 292 | "@npmcli/move-file": "^1.0.1", 293 | "chownr": "^2.0.0", 294 | "fs-minipass": "^2.0.0", 295 | "glob": "^7.1.4", 296 | "infer-owner": "^1.0.4", 297 | "lru-cache": "^6.0.0", 298 | "minipass": "^3.1.1", 299 | "minipass-collect": "^1.0.2", 300 | "minipass-flush": "^1.0.5", 301 | "minipass-pipeline": "^1.2.2", 302 | "mkdirp": "^1.0.3", 303 | "p-map": "^4.0.0", 304 | "promise-inflight": "^1.0.1", 305 | "rimraf": "^3.0.2", 306 | "ssri": "^8.0.1", 307 | "tar": "^6.0.2", 308 | "unique-filename": "^1.1.1" 309 | }, 310 | "engines": { 311 | "node": ">= 10" 312 | } 313 | }, 314 | "node_modules/chownr": { 315 | "version": "2.0.0", 316 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 317 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 318 | "license": "ISC", 319 | "engines": { 320 | "node": ">=10" 321 | } 322 | }, 323 | "node_modules/clean-stack": { 324 | "version": "2.2.0", 325 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 326 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", 327 | "license": "MIT", 328 | "optional": true, 329 | "engines": { 330 | "node": ">=6" 331 | } 332 | }, 333 | "node_modules/color-support": { 334 | "version": "1.1.3", 335 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 336 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 337 | "license": "ISC", 338 | "optional": true, 339 | "bin": { 340 | "color-support": "bin.js" 341 | } 342 | }, 343 | "node_modules/combined-stream": { 344 | "version": "1.0.8", 345 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 346 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 347 | "license": "MIT", 348 | "dependencies": { 349 | "delayed-stream": "~1.0.0" 350 | }, 351 | "engines": { 352 | "node": ">= 0.8" 353 | } 354 | }, 355 | "node_modules/concat-map": { 356 | "version": "0.0.1", 357 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 358 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 359 | "license": "MIT", 360 | "optional": true 361 | }, 362 | "node_modules/console-control-strings": { 363 | "version": "1.1.0", 364 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 365 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", 366 | "license": "ISC", 367 | "optional": true 368 | }, 369 | "node_modules/content-type": { 370 | "version": "1.0.5", 371 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 372 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 373 | "license": "MIT", 374 | "engines": { 375 | "node": ">= 0.6" 376 | } 377 | }, 378 | "node_modules/debug": { 379 | "version": "4.4.0", 380 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 381 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 382 | "license": "MIT", 383 | "optional": true, 384 | "dependencies": { 385 | "ms": "^2.1.3" 386 | }, 387 | "engines": { 388 | "node": ">=6.0" 389 | }, 390 | "peerDependenciesMeta": { 391 | "supports-color": { 392 | "optional": true 393 | } 394 | } 395 | }, 396 | "node_modules/decompress-response": { 397 | "version": "6.0.0", 398 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 399 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 400 | "license": "MIT", 401 | "dependencies": { 402 | "mimic-response": "^3.1.0" 403 | }, 404 | "engines": { 405 | "node": ">=10" 406 | }, 407 | "funding": { 408 | "url": "https://github.com/sponsors/sindresorhus" 409 | } 410 | }, 411 | "node_modules/deep-extend": { 412 | "version": "0.6.0", 413 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 414 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 415 | "license": "MIT", 416 | "engines": { 417 | "node": ">=4.0.0" 418 | } 419 | }, 420 | "node_modules/delayed-stream": { 421 | "version": "1.0.0", 422 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 423 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 424 | "license": "MIT", 425 | "engines": { 426 | "node": ">=0.4.0" 427 | } 428 | }, 429 | "node_modules/delegates": { 430 | "version": "1.0.0", 431 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 432 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", 433 | "license": "MIT", 434 | "optional": true 435 | }, 436 | "node_modules/depd": { 437 | "version": "2.0.0", 438 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 439 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 440 | "license": "MIT", 441 | "engines": { 442 | "node": ">= 0.8" 443 | } 444 | }, 445 | "node_modules/detect-libc": { 446 | "version": "2.0.3", 447 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 448 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 449 | "license": "Apache-2.0", 450 | "engines": { 451 | "node": ">=8" 452 | } 453 | }, 454 | "node_modules/dotenv": { 455 | "version": "16.4.7", 456 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", 457 | "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", 458 | "license": "BSD-2-Clause", 459 | "engines": { 460 | "node": ">=12" 461 | }, 462 | "funding": { 463 | "url": "https://dotenvx.com" 464 | } 465 | }, 466 | "node_modules/emoji-regex": { 467 | "version": "8.0.0", 468 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 469 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 470 | "license": "MIT", 471 | "optional": true 472 | }, 473 | "node_modules/encoding": { 474 | "version": "0.1.13", 475 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 476 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 477 | "license": "MIT", 478 | "optional": true, 479 | "dependencies": { 480 | "iconv-lite": "^0.6.2" 481 | } 482 | }, 483 | "node_modules/end-of-stream": { 484 | "version": "1.4.4", 485 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 486 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 487 | "license": "MIT", 488 | "dependencies": { 489 | "once": "^1.4.0" 490 | } 491 | }, 492 | "node_modules/env-paths": { 493 | "version": "2.2.1", 494 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 495 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 496 | "license": "MIT", 497 | "optional": true, 498 | "engines": { 499 | "node": ">=6" 500 | } 501 | }, 502 | "node_modules/err-code": { 503 | "version": "2.0.3", 504 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", 505 | "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", 506 | "license": "MIT", 507 | "optional": true 508 | }, 509 | "node_modules/expand-template": { 510 | "version": "2.0.3", 511 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 512 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 513 | "license": "(MIT OR WTFPL)", 514 | "engines": { 515 | "node": ">=6" 516 | } 517 | }, 518 | "node_modules/file-uri-to-path": { 519 | "version": "1.0.0", 520 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 521 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", 522 | "license": "MIT" 523 | }, 524 | "node_modules/follow-redirects": { 525 | "version": "1.15.9", 526 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 527 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 528 | "funding": [ 529 | { 530 | "type": "individual", 531 | "url": "https://github.com/sponsors/RubenVerborgh" 532 | } 533 | ], 534 | "license": "MIT", 535 | "engines": { 536 | "node": ">=4.0" 537 | }, 538 | "peerDependenciesMeta": { 539 | "debug": { 540 | "optional": true 541 | } 542 | } 543 | }, 544 | "node_modules/form-data": { 545 | "version": "4.0.1", 546 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", 547 | "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", 548 | "license": "MIT", 549 | "dependencies": { 550 | "asynckit": "^0.4.0", 551 | "combined-stream": "^1.0.8", 552 | "mime-types": "^2.1.12" 553 | }, 554 | "engines": { 555 | "node": ">= 6" 556 | } 557 | }, 558 | "node_modules/fs-constants": { 559 | "version": "1.0.0", 560 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 561 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 562 | "license": "MIT" 563 | }, 564 | "node_modules/fs-minipass": { 565 | "version": "2.1.0", 566 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 567 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 568 | "license": "ISC", 569 | "dependencies": { 570 | "minipass": "^3.0.0" 571 | }, 572 | "engines": { 573 | "node": ">= 8" 574 | } 575 | }, 576 | "node_modules/fs.realpath": { 577 | "version": "1.0.0", 578 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 579 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 580 | "license": "ISC", 581 | "optional": true 582 | }, 583 | "node_modules/gauge": { 584 | "version": "4.0.4", 585 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", 586 | "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", 587 | "deprecated": "This package is no longer supported.", 588 | "license": "ISC", 589 | "optional": true, 590 | "dependencies": { 591 | "aproba": "^1.0.3 || ^2.0.0", 592 | "color-support": "^1.1.3", 593 | "console-control-strings": "^1.1.0", 594 | "has-unicode": "^2.0.1", 595 | "signal-exit": "^3.0.7", 596 | "string-width": "^4.2.3", 597 | "strip-ansi": "^6.0.1", 598 | "wide-align": "^1.1.5" 599 | }, 600 | "engines": { 601 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 602 | } 603 | }, 604 | "node_modules/github-from-package": { 605 | "version": "0.0.0", 606 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 607 | "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", 608 | "license": "MIT" 609 | }, 610 | "node_modules/glob": { 611 | "version": "7.2.3", 612 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 613 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 614 | "deprecated": "Glob versions prior to v9 are no longer supported", 615 | "license": "ISC", 616 | "optional": true, 617 | "dependencies": { 618 | "fs.realpath": "^1.0.0", 619 | "inflight": "^1.0.4", 620 | "inherits": "2", 621 | "minimatch": "^3.1.1", 622 | "once": "^1.3.0", 623 | "path-is-absolute": "^1.0.0" 624 | }, 625 | "engines": { 626 | "node": "*" 627 | }, 628 | "funding": { 629 | "url": "https://github.com/sponsors/isaacs" 630 | } 631 | }, 632 | "node_modules/graceful-fs": { 633 | "version": "4.2.11", 634 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 635 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 636 | "license": "ISC", 637 | "optional": true 638 | }, 639 | "node_modules/has-unicode": { 640 | "version": "2.0.1", 641 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 642 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", 643 | "license": "ISC", 644 | "optional": true 645 | }, 646 | "node_modules/http-cache-semantics": { 647 | "version": "4.1.1", 648 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 649 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", 650 | "license": "BSD-2-Clause", 651 | "optional": true 652 | }, 653 | "node_modules/http-errors": { 654 | "version": "2.0.0", 655 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 656 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 657 | "license": "MIT", 658 | "dependencies": { 659 | "depd": "2.0.0", 660 | "inherits": "2.0.4", 661 | "setprototypeof": "1.2.0", 662 | "statuses": "2.0.1", 663 | "toidentifier": "1.0.1" 664 | }, 665 | "engines": { 666 | "node": ">= 0.8" 667 | } 668 | }, 669 | "node_modules/http-proxy-agent": { 670 | "version": "4.0.1", 671 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 672 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 673 | "license": "MIT", 674 | "optional": true, 675 | "dependencies": { 676 | "@tootallnate/once": "1", 677 | "agent-base": "6", 678 | "debug": "4" 679 | }, 680 | "engines": { 681 | "node": ">= 6" 682 | } 683 | }, 684 | "node_modules/https-proxy-agent": { 685 | "version": "5.0.1", 686 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 687 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 688 | "license": "MIT", 689 | "optional": true, 690 | "dependencies": { 691 | "agent-base": "6", 692 | "debug": "4" 693 | }, 694 | "engines": { 695 | "node": ">= 6" 696 | } 697 | }, 698 | "node_modules/humanize-ms": { 699 | "version": "1.2.1", 700 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 701 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 702 | "license": "MIT", 703 | "optional": true, 704 | "dependencies": { 705 | "ms": "^2.0.0" 706 | } 707 | }, 708 | "node_modules/iconv-lite": { 709 | "version": "0.6.3", 710 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 711 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 712 | "license": "MIT", 713 | "dependencies": { 714 | "safer-buffer": ">= 2.1.2 < 3.0.0" 715 | }, 716 | "engines": { 717 | "node": ">=0.10.0" 718 | } 719 | }, 720 | "node_modules/ieee754": { 721 | "version": "1.2.1", 722 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 723 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 724 | "funding": [ 725 | { 726 | "type": "github", 727 | "url": "https://github.com/sponsors/feross" 728 | }, 729 | { 730 | "type": "patreon", 731 | "url": "https://www.patreon.com/feross" 732 | }, 733 | { 734 | "type": "consulting", 735 | "url": "https://feross.org/support" 736 | } 737 | ], 738 | "license": "BSD-3-Clause" 739 | }, 740 | "node_modules/imurmurhash": { 741 | "version": "0.1.4", 742 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 743 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 744 | "license": "MIT", 745 | "optional": true, 746 | "engines": { 747 | "node": ">=0.8.19" 748 | } 749 | }, 750 | "node_modules/indent-string": { 751 | "version": "4.0.0", 752 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 753 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 754 | "license": "MIT", 755 | "optional": true, 756 | "engines": { 757 | "node": ">=8" 758 | } 759 | }, 760 | "node_modules/infer-owner": { 761 | "version": "1.0.4", 762 | "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", 763 | "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", 764 | "license": "ISC", 765 | "optional": true 766 | }, 767 | "node_modules/inflight": { 768 | "version": "1.0.6", 769 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 770 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 771 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 772 | "license": "ISC", 773 | "optional": true, 774 | "dependencies": { 775 | "once": "^1.3.0", 776 | "wrappy": "1" 777 | } 778 | }, 779 | "node_modules/inherits": { 780 | "version": "2.0.4", 781 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 782 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 783 | "license": "ISC" 784 | }, 785 | "node_modules/ini": { 786 | "version": "1.3.8", 787 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 788 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 789 | "license": "ISC" 790 | }, 791 | "node_modules/ip-address": { 792 | "version": "9.0.5", 793 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 794 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 795 | "license": "MIT", 796 | "optional": true, 797 | "dependencies": { 798 | "jsbn": "1.1.0", 799 | "sprintf-js": "^1.1.3" 800 | }, 801 | "engines": { 802 | "node": ">= 12" 803 | } 804 | }, 805 | "node_modules/is-fullwidth-code-point": { 806 | "version": "3.0.0", 807 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 808 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 809 | "license": "MIT", 810 | "optional": true, 811 | "engines": { 812 | "node": ">=8" 813 | } 814 | }, 815 | "node_modules/is-lambda": { 816 | "version": "1.0.1", 817 | "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", 818 | "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", 819 | "license": "MIT", 820 | "optional": true 821 | }, 822 | "node_modules/isexe": { 823 | "version": "2.0.0", 824 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 825 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 826 | "license": "ISC", 827 | "optional": true 828 | }, 829 | "node_modules/jsbn": { 830 | "version": "1.1.0", 831 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 832 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", 833 | "license": "MIT", 834 | "optional": true 835 | }, 836 | "node_modules/lru-cache": { 837 | "version": "6.0.0", 838 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 839 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 840 | "license": "ISC", 841 | "optional": true, 842 | "dependencies": { 843 | "yallist": "^4.0.0" 844 | }, 845 | "engines": { 846 | "node": ">=10" 847 | } 848 | }, 849 | "node_modules/make-fetch-happen": { 850 | "version": "9.1.0", 851 | "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", 852 | "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", 853 | "license": "ISC", 854 | "optional": true, 855 | "dependencies": { 856 | "agentkeepalive": "^4.1.3", 857 | "cacache": "^15.2.0", 858 | "http-cache-semantics": "^4.1.0", 859 | "http-proxy-agent": "^4.0.1", 860 | "https-proxy-agent": "^5.0.0", 861 | "is-lambda": "^1.0.1", 862 | "lru-cache": "^6.0.0", 863 | "minipass": "^3.1.3", 864 | "minipass-collect": "^1.0.2", 865 | "minipass-fetch": "^1.3.2", 866 | "minipass-flush": "^1.0.5", 867 | "minipass-pipeline": "^1.2.4", 868 | "negotiator": "^0.6.2", 869 | "promise-retry": "^2.0.1", 870 | "socks-proxy-agent": "^6.0.0", 871 | "ssri": "^8.0.0" 872 | }, 873 | "engines": { 874 | "node": ">= 10" 875 | } 876 | }, 877 | "node_modules/mime-db": { 878 | "version": "1.52.0", 879 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 880 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 881 | "license": "MIT", 882 | "engines": { 883 | "node": ">= 0.6" 884 | } 885 | }, 886 | "node_modules/mime-types": { 887 | "version": "2.1.35", 888 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 889 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 890 | "license": "MIT", 891 | "dependencies": { 892 | "mime-db": "1.52.0" 893 | }, 894 | "engines": { 895 | "node": ">= 0.6" 896 | } 897 | }, 898 | "node_modules/mimic-response": { 899 | "version": "3.1.0", 900 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 901 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 902 | "license": "MIT", 903 | "engines": { 904 | "node": ">=10" 905 | }, 906 | "funding": { 907 | "url": "https://github.com/sponsors/sindresorhus" 908 | } 909 | }, 910 | "node_modules/minimatch": { 911 | "version": "3.1.2", 912 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 913 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 914 | "license": "ISC", 915 | "optional": true, 916 | "dependencies": { 917 | "brace-expansion": "^1.1.7" 918 | }, 919 | "engines": { 920 | "node": "*" 921 | } 922 | }, 923 | "node_modules/minimist": { 924 | "version": "1.2.8", 925 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 926 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 927 | "license": "MIT", 928 | "funding": { 929 | "url": "https://github.com/sponsors/ljharb" 930 | } 931 | }, 932 | "node_modules/minipass": { 933 | "version": "3.3.6", 934 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 935 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 936 | "license": "ISC", 937 | "dependencies": { 938 | "yallist": "^4.0.0" 939 | }, 940 | "engines": { 941 | "node": ">=8" 942 | } 943 | }, 944 | "node_modules/minipass-collect": { 945 | "version": "1.0.2", 946 | "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", 947 | "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", 948 | "license": "ISC", 949 | "optional": true, 950 | "dependencies": { 951 | "minipass": "^3.0.0" 952 | }, 953 | "engines": { 954 | "node": ">= 8" 955 | } 956 | }, 957 | "node_modules/minipass-fetch": { 958 | "version": "1.4.1", 959 | "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", 960 | "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", 961 | "license": "MIT", 962 | "optional": true, 963 | "dependencies": { 964 | "minipass": "^3.1.0", 965 | "minipass-sized": "^1.0.3", 966 | "minizlib": "^2.0.0" 967 | }, 968 | "engines": { 969 | "node": ">=8" 970 | }, 971 | "optionalDependencies": { 972 | "encoding": "^0.1.12" 973 | } 974 | }, 975 | "node_modules/minipass-flush": { 976 | "version": "1.0.5", 977 | "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", 978 | "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", 979 | "license": "ISC", 980 | "optional": true, 981 | "dependencies": { 982 | "minipass": "^3.0.0" 983 | }, 984 | "engines": { 985 | "node": ">= 8" 986 | } 987 | }, 988 | "node_modules/minipass-pipeline": { 989 | "version": "1.2.4", 990 | "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", 991 | "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", 992 | "license": "ISC", 993 | "optional": true, 994 | "dependencies": { 995 | "minipass": "^3.0.0" 996 | }, 997 | "engines": { 998 | "node": ">=8" 999 | } 1000 | }, 1001 | "node_modules/minipass-sized": { 1002 | "version": "1.0.3", 1003 | "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", 1004 | "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", 1005 | "license": "ISC", 1006 | "optional": true, 1007 | "dependencies": { 1008 | "minipass": "^3.0.0" 1009 | }, 1010 | "engines": { 1011 | "node": ">=8" 1012 | } 1013 | }, 1014 | "node_modules/minizlib": { 1015 | "version": "2.1.2", 1016 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 1017 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 1018 | "license": "MIT", 1019 | "dependencies": { 1020 | "minipass": "^3.0.0", 1021 | "yallist": "^4.0.0" 1022 | }, 1023 | "engines": { 1024 | "node": ">= 8" 1025 | } 1026 | }, 1027 | "node_modules/mkdirp": { 1028 | "version": "1.0.4", 1029 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1030 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1031 | "license": "MIT", 1032 | "bin": { 1033 | "mkdirp": "bin/cmd.js" 1034 | }, 1035 | "engines": { 1036 | "node": ">=10" 1037 | } 1038 | }, 1039 | "node_modules/mkdirp-classic": { 1040 | "version": "0.5.3", 1041 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1042 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", 1043 | "license": "MIT" 1044 | }, 1045 | "node_modules/ms": { 1046 | "version": "2.1.3", 1047 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1048 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1049 | "license": "MIT", 1050 | "optional": true 1051 | }, 1052 | "node_modules/napi-build-utils": { 1053 | "version": "1.0.2", 1054 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 1055 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", 1056 | "license": "MIT" 1057 | }, 1058 | "node_modules/negotiator": { 1059 | "version": "0.6.4", 1060 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", 1061 | "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", 1062 | "license": "MIT", 1063 | "optional": true, 1064 | "engines": { 1065 | "node": ">= 0.6" 1066 | } 1067 | }, 1068 | "node_modules/node-abi": { 1069 | "version": "3.71.0", 1070 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", 1071 | "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", 1072 | "license": "MIT", 1073 | "dependencies": { 1074 | "semver": "^7.3.5" 1075 | }, 1076 | "engines": { 1077 | "node": ">=10" 1078 | } 1079 | }, 1080 | "node_modules/node-addon-api": { 1081 | "version": "7.1.1", 1082 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", 1083 | "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", 1084 | "license": "MIT" 1085 | }, 1086 | "node_modules/node-gyp": { 1087 | "version": "8.4.1", 1088 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", 1089 | "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", 1090 | "license": "MIT", 1091 | "optional": true, 1092 | "dependencies": { 1093 | "env-paths": "^2.2.0", 1094 | "glob": "^7.1.4", 1095 | "graceful-fs": "^4.2.6", 1096 | "make-fetch-happen": "^9.1.0", 1097 | "nopt": "^5.0.0", 1098 | "npmlog": "^6.0.0", 1099 | "rimraf": "^3.0.2", 1100 | "semver": "^7.3.5", 1101 | "tar": "^6.1.2", 1102 | "which": "^2.0.2" 1103 | }, 1104 | "bin": { 1105 | "node-gyp": "bin/node-gyp.js" 1106 | }, 1107 | "engines": { 1108 | "node": ">= 10.12.0" 1109 | } 1110 | }, 1111 | "node_modules/nopt": { 1112 | "version": "5.0.0", 1113 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", 1114 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 1115 | "license": "ISC", 1116 | "optional": true, 1117 | "dependencies": { 1118 | "abbrev": "1" 1119 | }, 1120 | "bin": { 1121 | "nopt": "bin/nopt.js" 1122 | }, 1123 | "engines": { 1124 | "node": ">=6" 1125 | } 1126 | }, 1127 | "node_modules/npmlog": { 1128 | "version": "6.0.2", 1129 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", 1130 | "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", 1131 | "deprecated": "This package is no longer supported.", 1132 | "license": "ISC", 1133 | "optional": true, 1134 | "dependencies": { 1135 | "are-we-there-yet": "^3.0.0", 1136 | "console-control-strings": "^1.1.0", 1137 | "gauge": "^4.0.3", 1138 | "set-blocking": "^2.0.0" 1139 | }, 1140 | "engines": { 1141 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1142 | } 1143 | }, 1144 | "node_modules/once": { 1145 | "version": "1.4.0", 1146 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1147 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1148 | "license": "ISC", 1149 | "dependencies": { 1150 | "wrappy": "1" 1151 | } 1152 | }, 1153 | "node_modules/p-map": { 1154 | "version": "4.0.0", 1155 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 1156 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 1157 | "license": "MIT", 1158 | "optional": true, 1159 | "dependencies": { 1160 | "aggregate-error": "^3.0.0" 1161 | }, 1162 | "engines": { 1163 | "node": ">=10" 1164 | }, 1165 | "funding": { 1166 | "url": "https://github.com/sponsors/sindresorhus" 1167 | } 1168 | }, 1169 | "node_modules/path-is-absolute": { 1170 | "version": "1.0.1", 1171 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1172 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1173 | "license": "MIT", 1174 | "optional": true, 1175 | "engines": { 1176 | "node": ">=0.10.0" 1177 | } 1178 | }, 1179 | "node_modules/prebuild-install": { 1180 | "version": "7.1.2", 1181 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", 1182 | "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", 1183 | "license": "MIT", 1184 | "dependencies": { 1185 | "detect-libc": "^2.0.0", 1186 | "expand-template": "^2.0.3", 1187 | "github-from-package": "0.0.0", 1188 | "minimist": "^1.2.3", 1189 | "mkdirp-classic": "^0.5.3", 1190 | "napi-build-utils": "^1.0.1", 1191 | "node-abi": "^3.3.0", 1192 | "pump": "^3.0.0", 1193 | "rc": "^1.2.7", 1194 | "simple-get": "^4.0.0", 1195 | "tar-fs": "^2.0.0", 1196 | "tunnel-agent": "^0.6.0" 1197 | }, 1198 | "bin": { 1199 | "prebuild-install": "bin.js" 1200 | }, 1201 | "engines": { 1202 | "node": ">=10" 1203 | } 1204 | }, 1205 | "node_modules/promise-inflight": { 1206 | "version": "1.0.1", 1207 | "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", 1208 | "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", 1209 | "license": "ISC", 1210 | "optional": true 1211 | }, 1212 | "node_modules/promise-retry": { 1213 | "version": "2.0.1", 1214 | "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", 1215 | "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", 1216 | "license": "MIT", 1217 | "optional": true, 1218 | "dependencies": { 1219 | "err-code": "^2.0.2", 1220 | "retry": "^0.12.0" 1221 | }, 1222 | "engines": { 1223 | "node": ">=10" 1224 | } 1225 | }, 1226 | "node_modules/proxy-from-env": { 1227 | "version": "1.1.0", 1228 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1229 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 1230 | "license": "MIT" 1231 | }, 1232 | "node_modules/pump": { 1233 | "version": "3.0.2", 1234 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", 1235 | "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", 1236 | "license": "MIT", 1237 | "dependencies": { 1238 | "end-of-stream": "^1.1.0", 1239 | "once": "^1.3.1" 1240 | } 1241 | }, 1242 | "node_modules/raw-body": { 1243 | "version": "3.0.0", 1244 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", 1245 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", 1246 | "license": "MIT", 1247 | "dependencies": { 1248 | "bytes": "3.1.2", 1249 | "http-errors": "2.0.0", 1250 | "iconv-lite": "0.6.3", 1251 | "unpipe": "1.0.0" 1252 | }, 1253 | "engines": { 1254 | "node": ">= 0.8" 1255 | } 1256 | }, 1257 | "node_modules/rc": { 1258 | "version": "1.2.8", 1259 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1260 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1261 | "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", 1262 | "dependencies": { 1263 | "deep-extend": "^0.6.0", 1264 | "ini": "~1.3.0", 1265 | "minimist": "^1.2.0", 1266 | "strip-json-comments": "~2.0.1" 1267 | }, 1268 | "bin": { 1269 | "rc": "cli.js" 1270 | } 1271 | }, 1272 | "node_modules/readable-stream": { 1273 | "version": "3.6.2", 1274 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1275 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1276 | "license": "MIT", 1277 | "dependencies": { 1278 | "inherits": "^2.0.3", 1279 | "string_decoder": "^1.1.1", 1280 | "util-deprecate": "^1.0.1" 1281 | }, 1282 | "engines": { 1283 | "node": ">= 6" 1284 | } 1285 | }, 1286 | "node_modules/retry": { 1287 | "version": "0.12.0", 1288 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 1289 | "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", 1290 | "license": "MIT", 1291 | "optional": true, 1292 | "engines": { 1293 | "node": ">= 4" 1294 | } 1295 | }, 1296 | "node_modules/rimraf": { 1297 | "version": "3.0.2", 1298 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1299 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1300 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 1301 | "license": "ISC", 1302 | "optional": true, 1303 | "dependencies": { 1304 | "glob": "^7.1.3" 1305 | }, 1306 | "bin": { 1307 | "rimraf": "bin.js" 1308 | }, 1309 | "funding": { 1310 | "url": "https://github.com/sponsors/isaacs" 1311 | } 1312 | }, 1313 | "node_modules/safe-buffer": { 1314 | "version": "5.2.1", 1315 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1316 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1317 | "funding": [ 1318 | { 1319 | "type": "github", 1320 | "url": "https://github.com/sponsors/feross" 1321 | }, 1322 | { 1323 | "type": "patreon", 1324 | "url": "https://www.patreon.com/feross" 1325 | }, 1326 | { 1327 | "type": "consulting", 1328 | "url": "https://feross.org/support" 1329 | } 1330 | ], 1331 | "license": "MIT" 1332 | }, 1333 | "node_modules/safer-buffer": { 1334 | "version": "2.1.2", 1335 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1336 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1337 | "license": "MIT" 1338 | }, 1339 | "node_modules/semver": { 1340 | "version": "7.6.3", 1341 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 1342 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 1343 | "license": "ISC", 1344 | "bin": { 1345 | "semver": "bin/semver.js" 1346 | }, 1347 | "engines": { 1348 | "node": ">=10" 1349 | } 1350 | }, 1351 | "node_modules/set-blocking": { 1352 | "version": "2.0.0", 1353 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1354 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", 1355 | "license": "ISC", 1356 | "optional": true 1357 | }, 1358 | "node_modules/setprototypeof": { 1359 | "version": "1.2.0", 1360 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1361 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1362 | "license": "ISC" 1363 | }, 1364 | "node_modules/signal-exit": { 1365 | "version": "3.0.7", 1366 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1367 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1368 | "license": "ISC", 1369 | "optional": true 1370 | }, 1371 | "node_modules/simple-concat": { 1372 | "version": "1.0.1", 1373 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 1374 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 1375 | "funding": [ 1376 | { 1377 | "type": "github", 1378 | "url": "https://github.com/sponsors/feross" 1379 | }, 1380 | { 1381 | "type": "patreon", 1382 | "url": "https://www.patreon.com/feross" 1383 | }, 1384 | { 1385 | "type": "consulting", 1386 | "url": "https://feross.org/support" 1387 | } 1388 | ], 1389 | "license": "MIT" 1390 | }, 1391 | "node_modules/simple-get": { 1392 | "version": "4.0.1", 1393 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 1394 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 1395 | "funding": [ 1396 | { 1397 | "type": "github", 1398 | "url": "https://github.com/sponsors/feross" 1399 | }, 1400 | { 1401 | "type": "patreon", 1402 | "url": "https://www.patreon.com/feross" 1403 | }, 1404 | { 1405 | "type": "consulting", 1406 | "url": "https://feross.org/support" 1407 | } 1408 | ], 1409 | "license": "MIT", 1410 | "dependencies": { 1411 | "decompress-response": "^6.0.0", 1412 | "once": "^1.3.1", 1413 | "simple-concat": "^1.0.0" 1414 | } 1415 | }, 1416 | "node_modules/smart-buffer": { 1417 | "version": "4.2.0", 1418 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 1419 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 1420 | "license": "MIT", 1421 | "optional": true, 1422 | "engines": { 1423 | "node": ">= 6.0.0", 1424 | "npm": ">= 3.0.0" 1425 | } 1426 | }, 1427 | "node_modules/socks": { 1428 | "version": "2.8.3", 1429 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", 1430 | "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", 1431 | "license": "MIT", 1432 | "optional": true, 1433 | "dependencies": { 1434 | "ip-address": "^9.0.5", 1435 | "smart-buffer": "^4.2.0" 1436 | }, 1437 | "engines": { 1438 | "node": ">= 10.0.0", 1439 | "npm": ">= 3.0.0" 1440 | } 1441 | }, 1442 | "node_modules/socks-proxy-agent": { 1443 | "version": "6.2.1", 1444 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", 1445 | "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", 1446 | "license": "MIT", 1447 | "optional": true, 1448 | "dependencies": { 1449 | "agent-base": "^6.0.2", 1450 | "debug": "^4.3.3", 1451 | "socks": "^2.6.2" 1452 | }, 1453 | "engines": { 1454 | "node": ">= 10" 1455 | } 1456 | }, 1457 | "node_modules/sprintf-js": { 1458 | "version": "1.1.3", 1459 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 1460 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", 1461 | "license": "BSD-3-Clause", 1462 | "optional": true 1463 | }, 1464 | "node_modules/sqlite3": { 1465 | "version": "5.1.7", 1466 | "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", 1467 | "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", 1468 | "hasInstallScript": true, 1469 | "license": "BSD-3-Clause", 1470 | "dependencies": { 1471 | "bindings": "^1.5.0", 1472 | "node-addon-api": "^7.0.0", 1473 | "prebuild-install": "^7.1.1", 1474 | "tar": "^6.1.11" 1475 | }, 1476 | "optionalDependencies": { 1477 | "node-gyp": "8.x" 1478 | }, 1479 | "peerDependencies": { 1480 | "node-gyp": "8.x" 1481 | }, 1482 | "peerDependenciesMeta": { 1483 | "node-gyp": { 1484 | "optional": true 1485 | } 1486 | } 1487 | }, 1488 | "node_modules/ssri": { 1489 | "version": "8.0.1", 1490 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", 1491 | "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", 1492 | "license": "ISC", 1493 | "optional": true, 1494 | "dependencies": { 1495 | "minipass": "^3.1.1" 1496 | }, 1497 | "engines": { 1498 | "node": ">= 8" 1499 | } 1500 | }, 1501 | "node_modules/statuses": { 1502 | "version": "2.0.1", 1503 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1504 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1505 | "license": "MIT", 1506 | "engines": { 1507 | "node": ">= 0.8" 1508 | } 1509 | }, 1510 | "node_modules/string_decoder": { 1511 | "version": "1.3.0", 1512 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1513 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1514 | "license": "MIT", 1515 | "dependencies": { 1516 | "safe-buffer": "~5.2.0" 1517 | } 1518 | }, 1519 | "node_modules/string-width": { 1520 | "version": "4.2.3", 1521 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1522 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1523 | "license": "MIT", 1524 | "optional": true, 1525 | "dependencies": { 1526 | "emoji-regex": "^8.0.0", 1527 | "is-fullwidth-code-point": "^3.0.0", 1528 | "strip-ansi": "^6.0.1" 1529 | }, 1530 | "engines": { 1531 | "node": ">=8" 1532 | } 1533 | }, 1534 | "node_modules/strip-ansi": { 1535 | "version": "6.0.1", 1536 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1537 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1538 | "license": "MIT", 1539 | "optional": true, 1540 | "dependencies": { 1541 | "ansi-regex": "^5.0.1" 1542 | }, 1543 | "engines": { 1544 | "node": ">=8" 1545 | } 1546 | }, 1547 | "node_modules/strip-json-comments": { 1548 | "version": "2.0.1", 1549 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1550 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 1551 | "license": "MIT", 1552 | "engines": { 1553 | "node": ">=0.10.0" 1554 | } 1555 | }, 1556 | "node_modules/tar": { 1557 | "version": "6.2.1", 1558 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", 1559 | "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", 1560 | "license": "ISC", 1561 | "dependencies": { 1562 | "chownr": "^2.0.0", 1563 | "fs-minipass": "^2.0.0", 1564 | "minipass": "^5.0.0", 1565 | "minizlib": "^2.1.1", 1566 | "mkdirp": "^1.0.3", 1567 | "yallist": "^4.0.0" 1568 | }, 1569 | "engines": { 1570 | "node": ">=10" 1571 | } 1572 | }, 1573 | "node_modules/tar-fs": { 1574 | "version": "2.1.1", 1575 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 1576 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 1577 | "license": "MIT", 1578 | "dependencies": { 1579 | "chownr": "^1.1.1", 1580 | "mkdirp-classic": "^0.5.2", 1581 | "pump": "^3.0.0", 1582 | "tar-stream": "^2.1.4" 1583 | } 1584 | }, 1585 | "node_modules/tar-fs/node_modules/chownr": { 1586 | "version": "1.1.4", 1587 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 1588 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 1589 | "license": "ISC" 1590 | }, 1591 | "node_modules/tar-stream": { 1592 | "version": "2.2.0", 1593 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 1594 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 1595 | "license": "MIT", 1596 | "dependencies": { 1597 | "bl": "^4.0.3", 1598 | "end-of-stream": "^1.4.1", 1599 | "fs-constants": "^1.0.0", 1600 | "inherits": "^2.0.3", 1601 | "readable-stream": "^3.1.1" 1602 | }, 1603 | "engines": { 1604 | "node": ">=6" 1605 | } 1606 | }, 1607 | "node_modules/tar/node_modules/minipass": { 1608 | "version": "5.0.0", 1609 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 1610 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 1611 | "license": "ISC", 1612 | "engines": { 1613 | "node": ">=8" 1614 | } 1615 | }, 1616 | "node_modules/toidentifier": { 1617 | "version": "1.0.1", 1618 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1619 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1620 | "license": "MIT", 1621 | "engines": { 1622 | "node": ">=0.6" 1623 | } 1624 | }, 1625 | "node_modules/tunnel-agent": { 1626 | "version": "0.6.0", 1627 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1628 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 1629 | "license": "Apache-2.0", 1630 | "dependencies": { 1631 | "safe-buffer": "^5.0.1" 1632 | }, 1633 | "engines": { 1634 | "node": "*" 1635 | } 1636 | }, 1637 | "node_modules/typescript": { 1638 | "version": "5.7.2", 1639 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", 1640 | "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", 1641 | "dev": true, 1642 | "license": "Apache-2.0", 1643 | "bin": { 1644 | "tsc": "bin/tsc", 1645 | "tsserver": "bin/tsserver" 1646 | }, 1647 | "engines": { 1648 | "node": ">=14.17" 1649 | } 1650 | }, 1651 | "node_modules/undici-types": { 1652 | "version": "6.19.8", 1653 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 1654 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 1655 | "license": "MIT" 1656 | }, 1657 | "node_modules/unique-filename": { 1658 | "version": "1.1.1", 1659 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", 1660 | "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", 1661 | "license": "ISC", 1662 | "optional": true, 1663 | "dependencies": { 1664 | "unique-slug": "^2.0.0" 1665 | } 1666 | }, 1667 | "node_modules/unique-slug": { 1668 | "version": "2.0.2", 1669 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", 1670 | "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", 1671 | "license": "ISC", 1672 | "optional": true, 1673 | "dependencies": { 1674 | "imurmurhash": "^0.1.4" 1675 | } 1676 | }, 1677 | "node_modules/unpipe": { 1678 | "version": "1.0.0", 1679 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1680 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1681 | "license": "MIT", 1682 | "engines": { 1683 | "node": ">= 0.8" 1684 | } 1685 | }, 1686 | "node_modules/util-deprecate": { 1687 | "version": "1.0.2", 1688 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1689 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1690 | "license": "MIT" 1691 | }, 1692 | "node_modules/which": { 1693 | "version": "2.0.2", 1694 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1695 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1696 | "license": "ISC", 1697 | "optional": true, 1698 | "dependencies": { 1699 | "isexe": "^2.0.0" 1700 | }, 1701 | "bin": { 1702 | "node-which": "bin/node-which" 1703 | }, 1704 | "engines": { 1705 | "node": ">= 8" 1706 | } 1707 | }, 1708 | "node_modules/wide-align": { 1709 | "version": "1.1.5", 1710 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", 1711 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 1712 | "license": "ISC", 1713 | "optional": true, 1714 | "dependencies": { 1715 | "string-width": "^1.0.2 || 2 || 3 || 4" 1716 | } 1717 | }, 1718 | "node_modules/wrappy": { 1719 | "version": "1.0.2", 1720 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1721 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1722 | "license": "ISC" 1723 | }, 1724 | "node_modules/yallist": { 1725 | "version": "4.0.0", 1726 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1727 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1728 | "license": "ISC" 1729 | }, 1730 | "node_modules/zod": { 1731 | "version": "3.24.1", 1732 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", 1733 | "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", 1734 | "license": "MIT", 1735 | "funding": { 1736 | "url": "https://github.com/sponsors/colinhacks" 1737 | } 1738 | } 1739 | } 1740 | } 1741 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Letta(MemGPT)", 3 | "version": "0.1.0", 4 | "description": "LLM Memory", 5 | "private": true, 6 | "type": "module", 7 | "bin": { 8 | "Letta(MemGPT)": "./build/index.js" 9 | }, 10 | "files": [ 11 | "build" 12 | ], 13 | "scripts": { 14 | "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"", 15 | "prepare": "npm run build", 16 | "watch": "tsc --watch", 17 | "inspector": "npx @modelcontextprotocol/inspector build/index.js" 18 | }, 19 | "dependencies": { 20 | "@modelcontextprotocol/sdk": "0.6.0", 21 | "@types/sqlite3": "^3.1.11", 22 | "axios": "^1.7.9", 23 | "dotenv": "^16.4.7", 24 | "sqlite3": "^5.1.7" 25 | }, 26 | "devDependencies": { 27 | "@types/node": "^20.17.11", 28 | "typescript": "^5.3.3" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import { Server } from '@modelcontextprotocol/sdk/server/index.js'; 3 | import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; 4 | import { 5 | CallToolRequestSchema, 6 | ErrorCode, 7 | ListToolsRequestSchema, 8 | McpError, 9 | } from '@modelcontextprotocol/sdk/types.js'; 10 | import sqlite3 from 'sqlite3'; 11 | import { Database } from 'sqlite3'; 12 | import axios from 'axios'; 13 | import * as dotenv from 'dotenv'; 14 | import { promisify } from 'util'; 15 | 16 | dotenv.config(); 17 | 18 | interface Memory { 19 | id: number; 20 | userId: string; 21 | prompt: string; 22 | response: string; 23 | timestamp: string; 24 | provider: string; 25 | } 26 | 27 | class LettaMemGPTServer { 28 | private server: Server; 29 | private db!: Database; 30 | private openaiKey: string; 31 | private anthropicKey: string; 32 | private openrouterKey: string; 33 | 34 | private async initialize() { 35 | const dbPath = '/Users/victor/Documents/Cline/MCP/letta-server/data/memory.db'; 36 | try { 37 | const fs = await import('fs/promises'); 38 | await fs.mkdir('/Users/victor/Documents/Cline/MCP/letta-server/data', { recursive: true }); 39 | } catch (error) { 40 | // Ignore if directory already exists 41 | } 42 | this.db = new sqlite3.Database(dbPath); 43 | await this.initializeDatabase(); 44 | } 45 | 46 | constructor() { 47 | this.server = new Server( 48 | { 49 | name: 'letta-memgpt', 50 | version: '0.1.0', 51 | }, 52 | { 53 | capabilities: { 54 | tools: {}, 55 | }, 56 | } 57 | ); 58 | 59 | // Initialize API keys from environment variables 60 | this.openaiKey = process.env.OPENAI_API_KEY || ''; 61 | this.anthropicKey = process.env.ANTHROPIC_API_KEY || ''; 62 | this.openrouterKey = process.env.OPENROUTER_API_KEY || ''; 63 | 64 | this.setupToolHandlers(); 65 | 66 | // Error handling 67 | this.server.onerror = (error) => console.error('[MCP Error]', error); 68 | process.on('SIGINT', async () => { 69 | await this.cleanup(); 70 | process.exit(0); 71 | }); 72 | } 73 | 74 | private DEFAULT_USER = 'default_user'; 75 | private currentProvider = 'openai'; 76 | private currentModel = { 77 | openai: 'gpt-3.5-turbo', 78 | openrouter: 'openai/gpt-3.5-turbo', 79 | anthropic: 'claude-2', 80 | ollama: 'llama3.3:latest' 81 | }; 82 | private settingsPath = '/Users/victor/Library/Application Support/Cursor/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json'; 83 | 84 | private async updateSettingsFile(provider: string) { 85 | try { 86 | const fs = await import('fs/promises'); 87 | const settingsContent = await fs.readFile(this.settingsPath, 'utf-8'); 88 | const settings = JSON.parse(settingsContent); 89 | 90 | if (settings.mcpServers['letta-memgpt']) { 91 | settings.mcpServers['letta-memgpt'].defaultProvider = provider; 92 | await fs.writeFile(this.settingsPath, JSON.stringify(settings, null, 2)); 93 | } 94 | } catch (error: any) { 95 | console.error('Failed to update settings file:', error?.message); 96 | } 97 | } 98 | 99 | private async readSettingsFile() { 100 | try { 101 | const fs = await import('fs/promises'); 102 | const settingsContent = await fs.readFile(this.settingsPath, 'utf-8'); 103 | const settings = JSON.parse(settingsContent); 104 | 105 | if (settings.mcpServers['letta-memgpt']?.defaultProvider) { 106 | this.currentProvider = settings.mcpServers['letta-memgpt'].defaultProvider; 107 | } 108 | } catch (error: any) { 109 | console.error('Failed to read settings file:', error?.message); 110 | } 111 | } 112 | 113 | private async initializeDatabase() { 114 | await this.readSettingsFile(); 115 | await new Promise((resolve, reject) => { 116 | this.db.serialize(() => { 117 | // Create memory table 118 | this.db.run(` 119 | CREATE TABLE IF NOT EXISTS memory ( 120 | id INTEGER PRIMARY KEY AUTOINCREMENT, 121 | userId TEXT DEFAULT 'default_user', 122 | prompt TEXT NOT NULL, 123 | response TEXT NOT NULL, 124 | timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, 125 | provider TEXT NOT NULL 126 | ) 127 | `); 128 | 129 | // Create settings table 130 | this.db.run(` 131 | CREATE TABLE IF NOT EXISTS settings ( 132 | key TEXT PRIMARY KEY, 133 | value TEXT NOT NULL, 134 | lastUpdated DATETIME DEFAULT CURRENT_TIMESTAMP 135 | ) 136 | `, (err) => { 137 | if (err) reject(err); 138 | else resolve(); 139 | }); 140 | }); 141 | }); 142 | 143 | // Initialize or get current provider 144 | await new Promise((resolve, reject) => { 145 | this.db.get( 146 | 'SELECT value FROM settings WHERE key = ?', 147 | ['current_provider'], 148 | (err, row: any) => { 149 | if (err) { 150 | reject(err); 151 | } else if (row) { 152 | this.currentProvider = row.value; 153 | resolve(); 154 | } else { 155 | this.db.run( 156 | 'INSERT INTO settings (key, value) VALUES (?, ?)', 157 | ['current_provider', this.currentProvider], 158 | (err) => { 159 | if (err) reject(err); 160 | else resolve(); 161 | } 162 | ); 163 | } 164 | } 165 | ); 166 | }); 167 | } 168 | 169 | private async cleanup() { 170 | await promisify(this.db.close.bind(this.db))(); 171 | await this.server.close(); 172 | } 173 | 174 | private setupToolHandlers() { 175 | this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ 176 | tools: [ 177 | { 178 | name: 'chat', 179 | description: 'Send a message to the current LLM provider', 180 | inputSchema: { 181 | type: 'object', 182 | properties: { 183 | message: { 184 | type: 'string', 185 | description: 'The message to send to the LLM', 186 | } 187 | }, 188 | required: ['message'], 189 | }, 190 | }, 191 | { 192 | name: 'get_memory', 193 | description: 'Retrieve conversation history', 194 | inputSchema: { 195 | type: 'object', 196 | properties: { 197 | limit: { 198 | type: 'number', 199 | description: 'Maximum number of memories to retrieve', 200 | }, 201 | }, 202 | }, 203 | }, 204 | { 205 | name: 'clear_memory', 206 | description: 'Clear conversation history', 207 | inputSchema: { 208 | type: 'object', 209 | properties: {}, 210 | }, 211 | }, 212 | { 213 | name: 'use_provider', 214 | description: 'Switch to a different LLM provider', 215 | inputSchema: { 216 | type: 'object', 217 | properties: { 218 | provider: { 219 | type: 'string', 220 | description: 'The LLM provider to use (openai, anthropic, openrouter, or ollama)', 221 | }, 222 | }, 223 | required: ['provider'], 224 | }, 225 | }, 226 | { 227 | name: 'use_model', 228 | description: 'Switch to a different model for the current provider', 229 | inputSchema: { 230 | type: 'object', 231 | properties: { 232 | model: { 233 | type: 'string', 234 | description: 'The model to use. For OpenAI: gpt-4o, gpt-4o-mini, gpt-4-turbo. For OpenRouter: openai/gpt-4, anthropic/claude-2, etc. For Ollama: llama2, codellama, etc.', 235 | }, 236 | }, 237 | required: ['model'], 238 | }, 239 | }, 240 | ], 241 | })); 242 | 243 | this.server.setRequestHandler(CallToolRequestSchema, async (request) => { 244 | switch (request.params.name) { 245 | case 'chat': 246 | return this.handleChat(request.params.arguments); 247 | case 'get_memory': 248 | return this.handleGetMemory(request.params.arguments); 249 | case 'clear_memory': 250 | return this.handleClearMemory(); 251 | case 'use_provider': 252 | return this.handleUseProvider(request.params.arguments); 253 | case 'use_model': 254 | return this.handleUseModel(request.params.arguments); 255 | default: 256 | throw new McpError( 257 | ErrorCode.MethodNotFound, 258 | `Unknown tool: ${request.params.name}` 259 | ); 260 | } 261 | }); 262 | } 263 | 264 | private async handleUseProvider(args: any) { 265 | if (!args.provider) { 266 | throw new McpError( 267 | ErrorCode.InvalidParams, 268 | 'Missing required parameter: provider' 269 | ); 270 | } 271 | 272 | const validProviders = ['openai', 'anthropic', 'openrouter', 'ollama']; 273 | if (!validProviders.includes(args.provider)) { 274 | throw new McpError( 275 | ErrorCode.InvalidParams, 276 | `Invalid provider. Must be one of: ${validProviders.join(', ')}` 277 | ); 278 | } 279 | 280 | // Update provider in memory, database, and settings file 281 | this.currentProvider = args.provider; 282 | 283 | // Update database 284 | await new Promise((resolve, reject) => { 285 | this.db.run( 286 | 'UPDATE settings SET value = ?, lastUpdated = CURRENT_TIMESTAMP WHERE key = ?', 287 | [args.provider, 'current_provider'], 288 | (err) => { 289 | if (err) reject(err); 290 | else resolve(); 291 | } 292 | ); 293 | }); 294 | 295 | // Update settings file 296 | await this.updateSettingsFile(args.provider); 297 | 298 | return { 299 | content: [ 300 | { 301 | type: 'text', 302 | text: `Now using ${args.provider} as the LLM provider (saved to settings)`, 303 | }, 304 | ], 305 | }; 306 | } 307 | 308 | private async handleChat(args: any) { 309 | if (!args.message) { 310 | throw new McpError( 311 | ErrorCode.InvalidParams, 312 | 'Missing required parameter: message' 313 | ); 314 | } 315 | 316 | let response: string; 317 | try { 318 | switch (this.currentProvider) { 319 | case 'openai': 320 | response = await this.queryOpenAI(args.message); 321 | break; 322 | case 'anthropic': 323 | response = await this.queryAnthropic(args.message); 324 | break; 325 | case 'openrouter': 326 | response = await this.queryOpenRouter(args.message); 327 | break; 328 | case 'ollama': 329 | response = await this.queryOllama(args.message); 330 | break; 331 | default: 332 | throw new McpError( 333 | ErrorCode.InvalidParams, 334 | `Unsupported provider: ${args.provider}` 335 | ); 336 | } 337 | 338 | // Store the interaction in memory 339 | await this.storeMemory(args.message, response, this.currentProvider); 340 | 341 | return { 342 | content: [ 343 | { 344 | type: 'text', 345 | text: response, 346 | }, 347 | ], 348 | }; 349 | } catch (error: any) { 350 | throw new McpError( 351 | ErrorCode.InternalError, 352 | `Error querying ${args.provider}: ${error?.message || 'Unknown error'}` 353 | ); 354 | } 355 | } 356 | 357 | private async handleGetMemory(args: any) { 358 | const memories: Memory[] = await new Promise((resolve, reject) => { 359 | const query = args.limit === null 360 | ? 'SELECT * FROM memory ORDER BY timestamp DESC' 361 | : 'SELECT * FROM memory ORDER BY timestamp DESC LIMIT ?'; 362 | const params = args.limit === null ? [] : [args.limit || 10]; 363 | this.db.all( 364 | query, 365 | params, 366 | (err, rows) => { 367 | if (err) reject(err); 368 | else resolve(rows as Memory[]); 369 | } 370 | ); 371 | }); 372 | 373 | return { 374 | content: [ 375 | { 376 | type: 'text', 377 | text: JSON.stringify(memories, null, 2), 378 | }, 379 | ], 380 | }; 381 | } 382 | 383 | private async handleClearMemory() { 384 | await new Promise((resolve, reject) => { 385 | this.db.run('DELETE FROM memory', [], (err) => { 386 | if (err) reject(err); 387 | else resolve(); 388 | }); 389 | }); 390 | 391 | return { 392 | content: [ 393 | { 394 | type: 'text', 395 | text: 'Memory cleared', 396 | }, 397 | ], 398 | }; 399 | } 400 | 401 | private async handleUseModel(args: any) { 402 | if (!args.model) { 403 | throw new McpError( 404 | ErrorCode.InvalidParams, 405 | 'Missing required parameter: model' 406 | ); 407 | } 408 | 409 | try { 410 | // Validate model based on current provider 411 | switch (this.currentProvider) { 412 | case 'openai': 413 | const openaiModels = ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo']; 414 | if (!openaiModels.includes(args.model)) { 415 | throw new Error(`Invalid OpenAI model. Available models: ${openaiModels.join(', ')}`); 416 | } 417 | break; 418 | 419 | case 'openrouter': 420 | // OpenRouter supports various models from different providers 421 | if (!args.model.includes('/')) { 422 | throw new Error('OpenRouter model must be in format: provider/model (e.g., openai/gpt-4, anthropic/claude-2)'); 423 | } 424 | break; 425 | 426 | case 'ollama': 427 | try { 428 | const modelResponse = await axios.get('http://localhost:11434/api/tags'); 429 | const availableModels = modelResponse.data.models || []; 430 | if (!availableModels.some((m: any) => m.name === args.model)) { 431 | throw new Error(`Model ${args.model} not found. Available models: ${availableModels.map((m: any) => m.name).join(', ')}`); 432 | } 433 | } catch (error: any) { 434 | if (error.code === 'ECONNREFUSED') { 435 | throw new Error('Ollama is not running. Please start Ollama first (https://ollama.ai)'); 436 | } 437 | throw error; 438 | } 439 | break; 440 | 441 | case 'anthropic': 442 | const anthropicModels = [ 443 | 'claude-3-haiku', 444 | 'claude-3-sonnet', 445 | 'claude-3-opus', 446 | 'claude-3.5-haiku', 447 | 'claude-3.5-sonnet' 448 | ]; 449 | if (!anthropicModels.includes(args.model)) { 450 | throw new Error(`Invalid Anthropic model. Available models: ${anthropicModels.join(', ')}`); 451 | } 452 | break; 453 | 454 | default: 455 | throw new Error(`Cannot set model for provider: ${this.currentProvider}`); 456 | } 457 | 458 | // Update current model 459 | this.currentModel[this.currentProvider] = args.model; 460 | 461 | // Update settings file 462 | const fs = await import('fs/promises'); 463 | const settingsContent = await fs.readFile(this.settingsPath, 'utf-8'); 464 | const settings = JSON.parse(settingsContent); 465 | 466 | if (settings.mcpServers['letta-memgpt']) { 467 | if (!settings.mcpServers['letta-memgpt'].models) { 468 | settings.mcpServers['letta-memgpt'].models = {}; 469 | } 470 | settings.mcpServers['letta-memgpt'].models[this.currentProvider] = args.model; 471 | await fs.writeFile(this.settingsPath, JSON.stringify(settings, null, 2)); 472 | } 473 | 474 | return { 475 | content: [ 476 | { 477 | type: 'text', 478 | text: `Now using ${args.model} with ${this.currentProvider}`, 479 | }, 480 | ], 481 | }; 482 | } catch (error: any) { 483 | throw new McpError( 484 | ErrorCode.InternalError, 485 | error.message || 'Failed to set model' 486 | ); 487 | } 488 | } 489 | 490 | private async storeMemory( 491 | prompt: string, 492 | response: string, 493 | provider: string 494 | ) { 495 | await new Promise((resolve, reject) => { 496 | this.db.run( 497 | 'INSERT INTO memory (userId, prompt, response, provider) VALUES (?, ?, ?, ?)', 498 | [this.DEFAULT_USER, prompt, response, provider], 499 | (err) => { 500 | if (err) reject(err); 501 | else resolve(); 502 | } 503 | ); 504 | }); 505 | } 506 | 507 | private async queryOpenAI(message: string): Promise { 508 | if (!this.openaiKey) { 509 | throw new Error('OpenAI API key not configured'); 510 | } 511 | 512 | const response = await axios.post( 513 | 'https://api.openai.com/v1/chat/completions', 514 | { 515 | model: this.currentModel.openai, 516 | messages: [{ role: 'user', content: message }], 517 | }, 518 | { 519 | headers: { 520 | 'Authorization': `Bearer ${this.openaiKey}`, 521 | 'Content-Type': 'application/json', 522 | }, 523 | } 524 | ); 525 | 526 | return response.data.choices[0].message.content; 527 | } 528 | 529 | private async queryAnthropic(message: string): Promise { 530 | if (!this.anthropicKey) { 531 | throw new Error('Anthropic API key not configured'); 532 | } 533 | 534 | const response = await axios.post( 535 | 'https://api.anthropic.com/v1/messages', 536 | { 537 | model: this.currentModel.anthropic, 538 | messages: [{ role: 'user', content: message }], 539 | }, 540 | { 541 | headers: { 542 | 'x-api-key': this.anthropicKey, 543 | 'Content-Type': 'application/json', 544 | }, 545 | } 546 | ); 547 | 548 | return response.data.content[0].text; 549 | } 550 | 551 | private async queryOpenRouter(message: string): Promise { 552 | if (!this.openrouterKey) { 553 | throw new Error('OpenRouter API key not configured'); 554 | } 555 | 556 | const response = await axios.post( 557 | 'https://openrouter.ai/api/v1/chat/completions', 558 | { 559 | model: this.currentModel.openrouter, 560 | messages: [{ role: 'user', content: message }], 561 | }, 562 | { 563 | headers: { 564 | 'Authorization': `Bearer ${this.openrouterKey}`, 565 | 'Content-Type': 'application/json', 566 | }, 567 | } 568 | ); 569 | 570 | return response.data.choices[0].message.content; 571 | } 572 | 573 | private async queryOllama(message: string): Promise { 574 | try { 575 | // Check if Ollama is running and model exists 576 | try { 577 | const modelResponse = await axios.get('http://localhost:11434/api/tags'); 578 | const availableModels = modelResponse.data.models || []; 579 | if (!availableModels.some((m: any) => m.name === this.currentModel.ollama)) { 580 | throw new Error(`Model ${this.currentModel.ollama} not found. Available models: ${availableModels.map((m: any) => m.name).join(', ')}`); 581 | } 582 | } catch (error: any) { 583 | if (error.code === 'ECONNREFUSED') { 584 | throw new Error('Ollama is not running. Please start Ollama first (https://ollama.ai)'); 585 | } 586 | throw error; 587 | } 588 | 589 | // Use axios to get the streaming response 590 | const response = await axios.post('http://localhost:11434/api/generate', { 591 | model: this.currentModel.ollama, 592 | prompt: message, 593 | stream: false // Disable streaming to get complete response 594 | }); 595 | 596 | // Extract the response text 597 | if (response.data && response.data.response) { 598 | return response.data.response; 599 | } 600 | 601 | throw new Error('No response received from Ollama'); 602 | } catch (error: any) { 603 | throw new Error(`Ollama error: ${error?.message || 'Unknown error'}`); 604 | } 605 | } 606 | 607 | async run() { 608 | await this.initialize(); 609 | const transport = new StdioServerTransport(); 610 | await this.server.connect(transport); 611 | console.error('Letta MemGPT MCP server running on stdio'); 612 | } 613 | } 614 | 615 | const server = new LettaMemGPTServer(); 616 | server.run().catch(console.error); 617 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "Node16", 5 | "moduleResolution": "Node16", 6 | "outDir": "./build", 7 | "rootDir": "./src", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "skipLibCheck": true, 11 | "forceConsistentCasingInFileNames": true 12 | }, 13 | "include": ["src/**/*"], 14 | "exclude": ["node_modules"] 15 | } 16 | --------------------------------------------------------------------------------